Skip to content

Commit 9cb7875

Browse files
authored
Bump ts-fsrs to 4.6.1 (#53)
* bump ts-fsrs to 4.6.1 * Fix/R of DSR is NaN if s equals zero
1 parent c7ccc37 commit 9cb7875

File tree

6 files changed

+66
-27
lines changed

6 files changed

+66
-27
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@
5555
"sharp": "^0.33.4",
5656
"tailwind-merge": "^2.3.0",
5757
"tailwindcss-animate": "^1.0.7",
58-
"ts-fsrs": "^4.1.2",
58+
"ts-fsrs": "^4.6.1",
5959
"vaul": "^0.9.1",
6060
"zod": "^3.23.8"
6161
},

pnpm-lock.yaml

Lines changed: 11 additions & 11 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/app/api/fsrs/reschedule/route.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ export async function GET(request: NextRequest) {
1717
}
1818
const page = Number(searchParams.get("page") ?? "1");
1919
const pageSize = Number(searchParams.get("pageSize") ?? "25");
20-
const cards: Card[] = await _findCardsByUid({ uid, page, pageSize });
20+
const cards = await _findCardsByUid({ uid, page, pageSize });
2121
await _reschedule(params.params, cards);
2222
return NextResponse.json({ success: true });
2323
}

src/components/menu/items/RescheduleCard.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import RescheduledSubmitButton from '../submit/RescheduledSubmit';
44
import { _findCardsByUid, _reschedule } from '@/lib/reschedule';
55
import { getFSRSParamsByUid } from '@/lib/fsrs';
66
import { FSRSParameters } from 'ts-fsrs';
7-
import { Card } from '@prisma/client';
87

98
async function rescheduledCardAction(
109
uid: number,
@@ -13,7 +12,7 @@ async function rescheduledCardAction(
1312
pageSize: number = 300
1413
) {
1514
'use server';
16-
const cards: Card[] = await _findCardsByUid({ uid, page, pageSize });
15+
const cards = await _findCardsByUid({ uid, page, pageSize });
1716
return await _reschedule(params, cards);
1817
}
1918

src/components/record/FSRSMsg.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import React from 'react';
22
import { Card } from '@prisma/client';
3-
import { fsrs } from 'ts-fsrs';
3+
import { fsrs, S_MIN } from 'ts-fsrs';
44
import DateItem from '@/lib/formatDate';
55
import Forget from './Forget';
66
import Suspended from './Suspended';
@@ -10,6 +10,9 @@ type Props = {
1010

1111
export default async function FSRSMsg({ card }: Props) {
1212
const f = fsrs();
13+
// fix: s=0 https://github.com/ishiko732/ts-fsrs-demo/issues/52
14+
card.stability = Math.max(S_MIN, card.stability);
15+
1316
const retrievability = f.get_retrievability(card, new Date());
1417
return (
1518
<>

src/lib/reschedule.ts

Lines changed: 48 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
1-
import { getSessionUserId } from "@/app/(auth)/api/auth/[...nextauth]/session";
2-
import prisma from "./prisma";
3-
import { FSRSParameters, fsrs } from "ts-fsrs";
4-
import { Card, State } from "@prisma/client";
1+
import { getSessionUserId } from '@/app/(auth)/api/auth/[...nextauth]/session';
2+
import prisma from './prisma';
3+
import {
4+
FSRSHistory,
5+
FSRSParameters,
6+
TypeConvert,
7+
fsrs,
8+
Card as FSRSCard,
9+
} from 'ts-fsrs';
10+
import { Card, Revlog, State } from '@prisma/client';
511

612
export async function reschedule(
713
parameters: FSRSParameters,
@@ -12,27 +18,51 @@ export async function reschedule(
1218
}
1319
if (!uid) return false;
1420

15-
// get all card
21+
// get all card and logs
1622
const cards = await prisma.card.findMany({
1723
where: {
1824
note: {
1925
uid: uid,
2026
},
2127
state: State.Review,
2228
},
29+
include: {
30+
logs: true,
31+
},
2332
orderBy: {
24-
last_review: "asc",
33+
last_review: 'asc',
2534
},
2635
});
36+
2737
return _reschedule(parameters, cards);
2838
}
2939

30-
export async function _reschedule(parameters: FSRSParameters, cards: Card[]) {
40+
export async function _reschedule(
41+
parameters: FSRSParameters,
42+
cards: (Card & { logs: Revlog[] })[]
43+
) {
3144
if (cards.length === 0) {
3245
return false;
3346
}
3447
const f = fsrs(parameters);
35-
const rescheduled_cards = f.reschedule(cards);
48+
49+
const rescheduled_cards: (FSRSCard & { cid: number })[] = [];
50+
for (const card of cards) {
51+
const logs: FSRSHistory[] = card.logs.map((log) => {
52+
return {
53+
rating: TypeConvert.rating(log.grade),
54+
review: log.review,
55+
due: log.due,
56+
state: TypeConvert.state(log.state),
57+
};
58+
});
59+
const record = f.reschedule(card, logs);
60+
if (record.reschedule_item) {
61+
rescheduled_cards.push(
62+
record.reschedule_item.card as FSRSCard & { cid: number }
63+
);
64+
}
65+
}
3666
if (rescheduled_cards.length === 0) {
3767
return true;
3868
}
@@ -41,7 +71,11 @@ export async function _reschedule(parameters: FSRSParameters, cards: Card[]) {
4171
rescheduled_cards.map((data) =>
4272
prisma.card.update({
4373
where: { cid: data.cid },
44-
data: data,
74+
data: {
75+
stability: data.stability,
76+
difficulty: data.difficulty,
77+
due: data.due,
78+
},
4579
})
4680
)
4781
);
@@ -57,7 +91,7 @@ type Query = {
5791
due?: Date;
5892
};
5993

60-
export async function _findCardsByUid({ uid, page, pageSize, due }: Query) {
94+
export async function _findCardsByUid({ uid, page, pageSize, due }: Query):Promise<(Card & { logs: Revlog[] })[]> {
6195
return prisma.card.findMany({
6296
where: {
6397
note: {
@@ -72,8 +106,11 @@ export async function _findCardsByUid({ uid, page, pageSize, due }: Query) {
72106
},
73107
take: pageSize,
74108
skip: pageSize * (page - 1),
109+
include: {
110+
logs: true,
111+
},
75112
orderBy: {
76-
last_review: "asc",
113+
last_review: 'asc',
77114
},
78115
});
79116
}

0 commit comments

Comments
 (0)