@@ -16,8 +16,8 @@ import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover
16
16
import data from '@emoji-mart/data'
17
17
import Picker from '@emoji-mart/react'
18
18
import { Habit , SafeUser } from '@/lib/types'
19
- import { d2s , d2t , getISODate , getNow , parseNaturalLanguageDate , parseNaturalLanguageRRule , parseRRule , serializeRRule } from '@/lib/utils'
20
- import { INITIAL_DUE , INITIAL_RECURRENCE_RULE , QUICK_DATES } from '@/lib/constants'
19
+ import { d2s , d2t , getFrequencyDisplayText , getISODate , getNow , parseNaturalLanguageDate , parseNaturalLanguageRRule , parseRRule , serializeRRule } from '@/lib/utils'
20
+ import { INITIAL_DUE , INITIAL_RECURRENCE_RULE , QUICK_DATES , RECURRENCE_RULE_MAP } from '@/lib/constants'
21
21
import * as chrono from 'chrono-node' ;
22
22
import { DateTime } from 'luxon'
23
23
import {
@@ -43,15 +43,33 @@ export default function AddEditHabitModal({ onClose, onSave, habit, isTask }: Ad
43
43
const [ coinReward , setCoinReward ] = useState ( habit ?. coinReward || 1 )
44
44
const [ targetCompletions , setTargetCompletions ] = useState ( habit ?. targetCompletions || 1 )
45
45
const isRecurRule = ! isTask
46
- const origRuleText = isRecurRule ? parseRRule ( habit ?. frequency || INITIAL_RECURRENCE_RULE ) . toText ( ) : habit ?. frequency || INITIAL_DUE
46
+ const origRuleText = getFrequencyDisplayText ( habit ?. frequency , isRecurRule , settings . system . timezone )
47
47
const [ ruleText , setRuleText ] = useState < string > ( origRuleText )
48
- const now = getNow ( { timezone : settings . system . timezone } )
49
48
const { currentUser } = useHelpers ( )
50
49
const [ isQuickDatesOpen , setIsQuickDatesOpen ] = useState ( false )
51
50
const [ selectedUserIds , setSelectedUserIds ] = useState < string [ ] > ( ( habit ?. userIds || [ ] ) . filter ( id => id !== currentUser ?. id ) )
52
51
const [ usersData ] = useAtom ( usersAtom )
53
52
const users = usersData . users
54
53
54
+ function getFrequencyUpdate ( ) {
55
+ if ( ruleText === origRuleText && habit ?. frequency ) {
56
+ return habit . frequency
57
+ }
58
+ if ( isRecurRule ) {
59
+ const parsedRule = parseNaturalLanguageRRule ( ruleText )
60
+ return serializeRRule ( parsedRule )
61
+ } else {
62
+ const parsedDate = parseNaturalLanguageDate ( {
63
+ text : ruleText ,
64
+ timezone : settings . system . timezone
65
+ } )
66
+ return d2t ( {
67
+ dateTime : parsedDate ,
68
+ timezone : settings . system . timezone
69
+ } )
70
+ }
71
+ }
72
+
55
73
const handleSubmit = async ( e : React . FormEvent ) => {
56
74
e . preventDefault ( )
57
75
await onSave ( {
@@ -60,8 +78,7 @@ export default function AddEditHabitModal({ onClose, onSave, habit, isTask }: Ad
60
78
coinReward,
61
79
targetCompletions : targetCompletions > 1 ? targetCompletions : undefined ,
62
80
completions : habit ?. completions || [ ] ,
63
- frequency : isRecurRule ? serializeRRule ( parseNaturalLanguageRRule ( ruleText ) ) : d2t ( { dateTime : parseNaturalLanguageDate ( { text : ruleText , timezone : settings . system . timezone } ) } ) ,
64
- isTask : isTask || undefined ,
81
+ frequency : getFrequencyUpdate ( ) ,
65
82
userIds : selectedUserIds . length > 0 ? selectedUserIds . concat ( currentUser ?. id || [ ] ) : ( currentUser && [ currentUser . id ] )
66
83
} )
67
84
}
@@ -276,13 +293,13 @@ export default function AddEditHabitModal({ onClose, onSave, habit, isTask }: Ad
276
293
< Avatar
277
294
key = { user . id }
278
295
className = { `h-8 w-8 border-2 cursor-pointer
279
- ${ selectedUserIds . includes ( user . id )
280
- ? 'border-primary'
296
+ ${ selectedUserIds . includes ( user . id )
297
+ ? 'border-primary'
281
298
: 'border-muted'
282
299
} `}
283
300
title = { user . username }
284
301
onClick = { ( ) => {
285
- setSelectedUserIds ( prev =>
302
+ setSelectedUserIds ( prev =>
286
303
prev . includes ( user . id )
287
304
? prev . filter ( id => id !== user . id )
288
305
: [ ...prev , user . id ]
0 commit comments