UNPKG

react-native-tx-modern-datetimepicker

Version:

Fix bugs and improve for lib: HosseinShabani/react-native-modern-datepicker. A customizable calendar, time & month picker for React Native

110 lines (102 loc) 2.6 kB
import React, { useState, useMemo } from 'react' import { View, Text, StyleSheet, TouchableOpacity } from 'react-native' import { useCalendar } from '../DatePicker' const Days = () => { const { options, state, utils, onDateChange } = useCalendar() const [mainState, setMainState] = state const [itemSize, setItemSize] = useState(0) const style = styles(options) const days = useMemo(() => utils.getMonthDays(mainState.activeDate)) const onSelectDay = (date) => { let arr = (mainState.selectedDate ?? '').split(' ') arr[0] = (date ?? '').split(' ')[0] let newDate = arr.join(' ') setMainState({ type: 'set', selectedDate: newDate, }) onDateChange(utils.getFormated(utils.getDate(date), 'dateFormat')) } const changeItemHeight = ({ nativeEvent }) => { const { width } = nativeEvent.layout !itemSize && setItemSize((width / 7).toFixed(2) * 1 - 0.5) } return ( <View style={[style.container, utils.flexDirection]} onLayout={changeItemHeight}> {days.map((day, n) => ( <View key={n} style={{ width: itemSize, height: itemSize, }} > {day && ( <TouchableOpacity style={[ style.dayItem, { borderRadius: itemSize / 2, }, utils.compareDate(mainState.selectedDate, day.date) && style.dayItemSelected, ]} onPress={() => !day.disabled && onSelectDay(day.date)} activeOpacity={0.8} > <Text style={[ style.dayText, day.isToday && style.dayToday, utils.compareDate(mainState.selectedDate, day.date) && style.dayTextSelected, day.disabled && style.dayTextDisabled, ]} > {day.dayString} </Text> </TouchableOpacity> )} </View> ))} </View> ) } const styles = (theme) => StyleSheet.create({ container: { width: '100%', height: '100%', flexWrap: 'wrap', }, dayItem: { flex: 1, justifyContent: 'center', alignItems: 'center', margin: 3, ...theme.viewDayItemStyle, }, dayItemSelected: { backgroundColor: theme.mainColor, ...theme.viewDayItemSelectedStyle, }, dayText: { fontFamily: theme.defaultFont, fontSize: theme.textFontSize, color: theme.textDefaultColor, textAlign: 'center', width: '100%', ...theme.textDayStyle, }, dayTextSelected: { color: theme.selectedTextColor, fontFamily: theme.headerFont, ...theme.textDaySelectedStyle, }, dayToday: { color: theme.mainColor, ...theme.textTodayStyle, }, dayTextDisabled: { opacity: 0.2, }, }) export { Days }