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