UNPKG

rn-modern-datepicker

Version:

A customizable calendar, time & month picker for React Native (including Persian Jalaali calendar & locale)

108 lines (99 loc) 2.82 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 [marks, setMarks] = useState([]); const [itemSize, setItemSize] = useState(0); const style = styles(options); const days = useMemo(() => utils.getMonthDays(mainState.activeDate)); const onSelectDay = date => { setMainState({ type: 'set', selectedDate: date, }); onDateChange(utils.getFormated(utils.getDate(date), 'dateFormat')); }; const changeItemHeight = ({ nativeEvent }) => { const { width } = nativeEvent.layout; !itemSize && setItemSize((width / 7).toFixed(2) * 1 - 0.5); }; const handleMarks = (date) => { if (marks.includes(date)) { const filterMarks = marks.filter(item => item !== date) setMarks(filterMarks) } else { setMarks([...marks, date]) } } 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, }, marks.includes(day.date) && style.dayItemSelected, ]} onPress={() => { !day.disabled && onSelectDay(day.date); !day.disabled && handleMarks(day.date) }} activeOpacity={0.8}> <Text style={[ style.dayText, marks.includes(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, }, dayItemSelected: { backgroundColor: theme.mainColor, }, dayText: { fontFamily: theme.defaultFont, fontSize: theme.textFontSize, color: theme.textDefaultColor, textAlign: 'center', width: '100%', }, dayTextSelected: { color: theme.selectedTextColor, fontFamily: theme.headerFont, }, dayTextDisabled: { opacity: 0.2, }, }); export { Days };