From 3132c6a8be9e35dd617ae05d584eda8b13e2288b Mon Sep 17 00:00:00 2001 From: sheng <49238630+zsh-eng@users.noreply.github.com> Date: Sat, 13 Apr 2024 09:47:46 +0800 Subject: [PATCH] fix: fix card due date --- src/hooks/card/use-grade-mutation.ts | 18 ++++++++++++++---- src/utils/fsrs.ts | 16 ++++++++++++++++ 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/src/hooks/card/use-grade-mutation.ts b/src/hooks/card/use-grade-mutation.ts index 2b42c46..0546540 100644 --- a/src/hooks/card/use-grade-mutation.ts +++ b/src/hooks/card/use-grade-mutation.ts @@ -1,6 +1,10 @@ -import { getReviewDateForEachRating } from '@/utils/fsrs'; +import { + getReviewDateForEachRating, + gradeCard, + parseCardDate, + stringifyCardDate, +} from '@/utils/fsrs'; import { ReactQueryOptions, trpc } from '@/utils/trpc'; -import { TRPCClientError } from '@trpc/client'; import { endOfDay, isBefore } from 'date-fns'; import { produce } from 'immer'; import { toast } from 'sonner'; @@ -41,8 +45,14 @@ export function useGradeMutation( if (cardNotFound) return; if (cardToBeReviewedToday) { - // We update the due date of the card - draft[cardIndex].cards.due = day.toISOString(); + const nextCard = stringifyCardDate( + gradeCard(parseCardDate(card.cards), grade) + ); + draft[cardIndex].cards = { + ...draft[cardIndex].cards, + ...nextCard, + }; + draft.sort((a, b) => (isBefore(a.cards.due, b.cards.due) ? -1 : 1)); return; } diff --git a/src/utils/fsrs.ts b/src/utils/fsrs.ts index 2a91545..21de5ab 100644 --- a/src/utils/fsrs.ts +++ b/src/utils/fsrs.ts @@ -83,6 +83,22 @@ export function getReviewDateForEachRating( return schemaRatingtoReviewDate; } +export function stringifyCardDate(card: Card): StringifyDate { + return { + ...card, + due: card.due.toISOString(), + last_review: card.last_review?.toISOString() ?? null, + }; +} + +export function parseCardDate(card: AllowDateString): Card { + return { + ...card, + due: new Date(card.due), + last_review: card.last_review ? new Date(card.last_review) : null, + }; +} + export function gradeCard(card: Card, schemaRating: Rating): Card { const now = new Date(); const recordLog = f.repeat(card, now);