import { Box, Card, Checkbox, Chip, FormControl, FormHelperText, Grid, Input, List, ListItem, Option, Radio, RadioGroup, Select, Typography, } from '@mui/joy' import moment from 'moment' import { useContext, useState } from 'react' import { UserContext } from '../../contexts/UserContext' import { isPlusAccount } from '../../utils/Helpers' import ThingTriggerSection from './ThingTriggerSection' const FREQUANCY_TYPES_RADIOS = [ 'daily', 'weekly', 'monthly', 'yearly', 'adaptive', 'custom', ] const FREQUENCY_TYPE_MESSAGE = { adaptive: 'This chore will be scheduled dynamically based on previous completion dates.', custom: 'This chore will be scheduled based on a custom frequency.', } const REPEAT_ON_TYPE = ['interval', 'days_of_the_week', 'day_of_the_month'] const FREQUANCY_TYPES = [ 'once', 'daily', 'weekly', 'monthly', 'yearly', 'adaptive', ...REPEAT_ON_TYPE, ] const MONTH_WITH_NO_31_DAYS = [ // TODO: Handle these months if day is 31 'february', 'april', 'june', 'september', 'november', ] const RepeatOnSections = ({ frequencyType, frequency, onFrequencyUpdate, onFrequencyTypeUpdate, frequencyMetadata, onFrequencyMetadataUpdate, onFrequencyTimeUpdate, things, }) => { const [months, setMonths] = useState({}) // const [dayOftheMonth, setDayOftheMonth] = useState(1) const [daysOfTheWeek, setDaysOfTheWeek] = useState({}) const [monthsOfTheYear, setMonthsOfTheYear] = useState({}) const [intervalUnit, setIntervalUnit] = useState('days') const [frequancyMetadata, setFrequancyMetadata] = useState({}) const [time, setTime] = useState('18:00') const timePickerComponent = ( At: { // create new today date with selected time with Timezone: onFrequencyTimeUpdate( moment( moment(new Date()).format('YYYY-MM-DD') + 'T' + e.target.value, ).format(), ) }} /> ) switch (frequencyType) { case 'interval': return ( <> Every: { if (e.target.value < 1) { e.target.value = 1 } onFrequencyUpdate(e.target.value) }} /> {timePickerComponent} ) case 'days_of_the_week': return ( <> {[ 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday', ].map(item => ( { const newDaysOfTheWeek = frequencyMetadata['days'] || [] if (newDaysOfTheWeek.includes(item)) { newDaysOfTheWeek.splice( newDaysOfTheWeek.indexOf(item), 1, ) } else { newDaysOfTheWeek.push(item) } onFrequencyMetadataUpdate({ ...frequencyMetadata, days: newDaysOfTheWeek.sort(), }) }} overlay disableIcon variant='soft' label={item.charAt(0).toUpperCase() + item.slice(1)} /> ))} {timePickerComponent} ) case 'day_of_the_month': return ( <> {[ 'january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december', ].map(item => ( { // const newMonthsOfTheYear = { // ...monthsOfTheYear, // } // newMonthsOfTheYear[item] = !newMonthsOfTheYear[item] // onFrequencyMetadataUpdate({ // months: newMonthsOfTheYear, // }) // setMonthsOfTheYear(newMonthsOfTheYear) // }} onClick={() => { const newMonthsOfTheYear = frequencyMetadata['months'] || [] if (newMonthsOfTheYear.includes(item)) { newMonthsOfTheYear.splice( newMonthsOfTheYear.indexOf(item), 1, ) } else { newMonthsOfTheYear.push(item) } onFrequencyMetadataUpdate({ ...frequencyMetadata, months: newMonthsOfTheYear.sort(), }) console.log('newMonthsOfTheYear', newMonthsOfTheYear) // setDaysOfTheWeek(newDaysOfTheWeek) }} overlay disableIcon variant='soft' label={item.charAt(0).toUpperCase() + item.slice(1)} /> ))} on the { if (e.target.value < 1) { e.target.value = 1 } else if (e.target.value > 31) { e.target.value = 31 } // setDayOftheMonth(e.target.value) onFrequencyUpdate(e.target.value) }} /> of the above month/s {timePickerComponent} ) default: return <> } } const RepeatSection = ({ frequencyType, frequency, onFrequencyUpdate, onFrequencyTypeUpdate, frequencyMetadata, onFrequencyMetadataUpdate, onFrequencyTimeUpdate, frequencyError, allUserThings, onTriggerUpdate, OnTriggerValidate, isAttemptToSave, selectedThing, }) => { const [repeatOn, setRepeatOn] = useState('interval') const { userProfile, setUserProfile } = useContext(UserContext) return ( Repeat : { onFrequencyTypeUpdate(e.target.checked ? 'daily' : 'once') if (e.target.checked) { onTriggerUpdate(null) } }} defaultChecked={!['once', 'trigger'].includes(frequencyType)} checked={!['once', 'trigger'].includes(frequencyType)} value={!['once', 'trigger'].includes(frequencyType)} overlay label='Repeat this task' /> Is this something needed to be done regularly? {!['once', 'trigger'].includes(frequencyType) && ( <> How often should it be repeated? {FREQUANCY_TYPES_RADIOS.map((item, index) => ( { if (item === 'custom') { onFrequencyTypeUpdate(REPEAT_ON_TYPE[0]) onFrequencyUpdate(1) onFrequencyMetadataUpdate({ unit: 'days', time: frequencyMetadata?.time ? frequencyMetadata?.time : moment( moment(new Date()).format('YYYY-MM-DD') + 'T' + '18:00', ).format(), }) return } onFrequencyTypeUpdate(item) }} overlay disableIcon variant='soft' label={ item.charAt(0).toUpperCase() + item.slice(1).replace('_', ' ') } /> ))} {FREQUENCY_TYPE_MESSAGE[frequencyType]} {frequencyType === 'custom' || (REPEAT_ON_TYPE.includes(frequencyType) && ( <> Repeat on: setJustify(event.target.value)} sx={{ minHeight: 48, padding: '4px', borderRadius: '12px', bgcolor: 'neutral.softBg', '--RadioGroup-gap': '4px', '--Radio-actionRadius': '8px', mb: 1, }} > {REPEAT_ON_TYPE.map(item => ( { if ( item === 'day_of_the_month' || item === 'interval' ) { onFrequencyUpdate(1) } onFrequencyTypeUpdate(item) if (item === 'days_of_the_week') { onFrequencyMetadataUpdate({ ...frequencyMetadata, days: [], }) } else if (item === 'day_of_the_month') { onFrequencyMetadataUpdate({ ...frequencyMetadata, months: [], }) } else if (item === 'interval') { onFrequencyMetadataUpdate({ ...frequencyMetadata, unit: 'days', }) } // setRepeatOn(item) }} value={item} disableIcon label={item .split('_') .map((i, idx) => { // first or last word if ( idx === 0 || idx === item.split('_').length - 1 ) { return ( i.charAt(0).toUpperCase() + i.slice(1) ) } return i }) .join(' ')} variant='plain' sx={{ px: 2, alignItems: 'center', }} slotProps={{ action: ({ checked }) => ({ sx: { ...(checked && { bgcolor: 'background.surface', boxShadow: 'sm', '&:hover': { bgcolor: 'background.surface', }, }), }, }), }} /> ))} ))} {frequencyError} )} { onFrequencyTypeUpdate(e.target.checked ? 'trigger' : 'once') // if unchecked, set selectedThing to null: if (!e.target.checked) { onTriggerUpdate(null) } }} defaultChecked={frequencyType === 'trigger'} checked={frequencyType === 'trigger'} value={frequencyType === 'trigger'} disabled={!isPlusAccount(userProfile)} overlay label='Trigger this task based on a thing state' /> Is this something that should be done when a thing state changes?{' '} {userProfile && !isPlusAccount(userProfile) && ( Not available in Basic Plan )} {frequencyType === 'trigger' && ( )} ) } export default RepeatSection