diff --git a/src/entities/routine/domain/Routine.ts b/src/entities/routine/domain/Routine.ts index 469cb0e..357025c 100644 --- a/src/entities/routine/domain/Routine.ts +++ b/src/entities/routine/domain/Routine.ts @@ -91,16 +91,26 @@ const validateRoutineProperties = (p: any): Result => return propsErr('daysOfMonth', p.daysOfMonth); } + if( + 'finished' in p && + typeof p.finished === 'boolean' + ){ + // + } else { + return propsErr('finished', p.finished); + } + return ok(p as RoutineProperties); } /** - * NOTE: daysOfWeek와 daysOfMonth를 기준으로 루틴을 수행할지 말지를 결정한다. - * - daysOfMonth가 0인 경우는 매월의 마지막 날을 의미한다. + * routine의 여러 properties들을 분석하여, day에 루틴을 수행해야하는지의 여부를 반환한다. */ const isDueTo = (routine: Routine, day: Day): boolean => { const p = routine.properties; + if(p.finished) return false; + if(p.activeCriteria === "month"){ const days = Array.from(p.daysOfMonth); // 0이 존재하는 경우, 0을 매개받은 day의 달의 마지막 날짜로 치환한다. diff --git a/src/entities/routine/domain/routine.type.ts b/src/entities/routine/domain/routine.type.ts index dce7f6d..14541c1 100644 --- a/src/entities/routine/domain/routine.type.ts +++ b/src/entities/routine/domain/routine.type.ts @@ -30,6 +30,7 @@ export type RoutineProperties = { activeCriteria: "week" | "month"; daysOfWeek: DayOfWeek[]; daysOfMonth: number[]; + finished: boolean; }; export type RoutineGroup = RoutineElement & { diff --git a/src/entities/routine/repository/routine-repository.ts b/src/entities/routine/repository/routine-repository.ts index c920a06..2bf5fb4 100644 --- a/src/entities/routine/repository/routine-repository.ts +++ b/src/entities/routine/repository/routine-repository.ts @@ -32,7 +32,7 @@ export interface RoutineQuery { } export interface RoutineRepository extends RoutineQuery { persist(entity: Routine): Promise; - delete(routineName: string): Promise; + finish(routineName: string): Promise; changeName(originalName: string, newName: string): Promise; update(routine: Routine): Promise; updateAll(routines: Routine[]): Promise; @@ -67,13 +67,10 @@ export const routineRepository: RoutineRepository = { } }, - async delete(routineName: string){ - const composed = compose( - fileAccessor.deleteFile, - fileAccessor.loadFile, - ROUTINE_PATH - ); - await composed(routineName); + async finish(routineName: string){ + const routine = await routineRepository.load(routineName); + routine.properties.finished = true; + await routineRepository.update(routine); }, async changeName(originalName: string, newName: string){ diff --git a/src/widgets/routine/create-routine.ts b/src/widgets/routine/create-routine.ts index b647925..a8f0c93 100644 --- a/src/widgets/routine/create-routine.ts +++ b/src/widgets/routine/create-routine.ts @@ -13,6 +13,7 @@ export const createNewRoutine = (): Routine => { activeCriteria: "week", daysOfWeek: Day.getDaysOfWeek(), daysOfMonth: [Day.now().date], + finished: false } } } \ No newline at end of file diff --git a/src/widgets/routine/ui/RoutineTaskWidget.tsx b/src/widgets/routine/ui/RoutineTaskWidget.tsx index e65d789..685ea34 100644 --- a/src/widgets/routine/ui/RoutineTaskWidget.tsx +++ b/src/widgets/routine/ui/RoutineTaskWidget.tsx @@ -19,18 +19,18 @@ export const RoutineTaskWidget = React.memo(({ task, parent }: RoutineTaskProps) const { mergeNotes } = useRoutineMutationMerge(); const { note, setNote } = useRoutineNote(); - const deleteRoutine = useCallback(async () => { - const deleteConfirm = await doConfirm({ - title: "Delete Routine", - confirmText: "Delete", - description: `Are you sure you want to delete '${task.name}'?`, - confirmBtnVariant: "destructive" + const finishRoutine = useCallback(async () => { + const finishConfirm = await doConfirm({ + title: "Finish Routine", + confirmText: "Finish", + description: `Are you sure you want to finish the routine ${task.name}?`, + confirmBtnVariant: "accent" }) - if(!deleteConfirm) return; + if(!finishConfirm) return; - await routineRepository.delete(task.name); + await routineRepository.finish(task.name); mergeNotes(); - new Notice(`Routine ${task.name} deleted.`); + new Notice(`Routine ${task.name} has been finished 🪄`); }, [mergeNotes, task.name]) const onOptionMenu = useCallback((m: Menu) => { @@ -51,11 +51,11 @@ export const RoutineTaskWidget = React.memo(({ task, parent }: RoutineTaskProps) }); }) m.addItem(i => { - i.setTitle("Delete"); - i.setIcon("trash"); - i.onClick(deleteRoutine); + i.setTitle("Finish"); + i.setIcon("alarm-clock-off"); + i.onClick(finishRoutine); }) - }, [RoutineOptionModal, deleteRoutine, note, setNote, task.name]) + }, [RoutineOptionModal, finishRoutine, note, setNote, task.name]) return ( <> diff --git a/src/widgets/task-group/delete-group.ts b/src/widgets/task-group/delete-group.ts index 2918284..0459d67 100644 --- a/src/widgets/task-group/delete-group.ts +++ b/src/widgets/task-group/delete-group.ts @@ -11,7 +11,7 @@ export const deleteGroup = async (note: RoutineNote, groupName: string, deleteSu if(deleteSubTasks){ const deleteTargets = routines.filter(routine => routine.properties.group === groupName); for(const target of deleteTargets){ - await routineRepository.delete(target.name); + await routineRepository.finish(target.name); } } else { const ungroupTarget = routines.filter(routine => routine.properties.group === groupName);