mirror of
https://github.com/vbalien/voca.git
synced 2025-12-06 11:26:21 +09:00
save state to localstorage
This commit is contained in:
File diff suppressed because one or more lines are too long
@@ -4,8 +4,14 @@ import { downloadVocaQuiz } from "../pdf.ts";
|
||||
export default function DownloadForm() {
|
||||
const [levels, setLevels] = React.useState<number[]>([6, 7]);
|
||||
const [day, setDay] = React.useState<number>(1);
|
||||
const [formEnable, setFormEnable] = React.useState<boolean>(true);
|
||||
|
||||
const handleSubmit: React.FormEventHandler = React.useCallback((ev) => {
|
||||
downloadVocaQuiz(levels.sort(), day);
|
||||
localStorage.setItem("voca-setting", JSON.stringify({ levels, day }));
|
||||
setFormEnable(false);
|
||||
downloadVocaQuiz(levels.sort(), day).then(() => {
|
||||
setFormEnable(true);
|
||||
});
|
||||
ev.preventDefault();
|
||||
}, [levels, day]);
|
||||
|
||||
@@ -25,10 +31,16 @@ export default function DownloadForm() {
|
||||
}
|
||||
};
|
||||
|
||||
React.useEffect(() => {
|
||||
const setting = JSON.parse(localStorage.getItem("voca-setting") ?? "{}");
|
||||
setting.level && setLevels(setting.levels);
|
||||
setting.day && setDay(setting.day);
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<>
|
||||
<form onSubmit={handleSubmit}>
|
||||
<fieldset>
|
||||
<fieldset disabled={!formEnable}>
|
||||
<legend>시험 난이도</legend>
|
||||
<div>
|
||||
<input
|
||||
@@ -84,14 +96,19 @@ export default function DownloadForm() {
|
||||
|
||||
<div>
|
||||
<label htmlFor="day">범위</label>
|
||||
<select id="day" value={day} onChange={handleDayChange}>
|
||||
<select
|
||||
id="day"
|
||||
value={day}
|
||||
onChange={handleDayChange}
|
||||
disabled={!formEnable}
|
||||
>
|
||||
{[...Array(30)].map((_, i) => <option value={i + 1}>{i + 1}
|
||||
</option>)}
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<button type="submit">PDF 다운</button>
|
||||
<button type="submit" disabled={!formEnable}>PDF 다운</button>
|
||||
</div>
|
||||
</form>
|
||||
</>
|
||||
|
||||
@@ -11,6 +11,7 @@ import {
|
||||
import { JSONType, Voca } from "../types.ts";
|
||||
|
||||
function downloadBuffer(buffer: Uint8Array, fileName: string) {
|
||||
return new Promise<void>((resolve) => {
|
||||
const a: HTMLAnchorElement = document.createElement("a");
|
||||
const blob = new Blob([buffer], { type: "application/octet-stream" });
|
||||
|
||||
@@ -20,6 +21,8 @@ function downloadBuffer(buffer: Uint8Array, fileName: string) {
|
||||
a.style.display = "none";
|
||||
a.click();
|
||||
a.remove();
|
||||
resolve();
|
||||
});
|
||||
}
|
||||
|
||||
export async function makePdf(voca_list: Voca[]) {
|
||||
@@ -174,5 +177,8 @@ export async function downloadVocaQuiz(levels: number[], day: number) {
|
||||
levels.includes(chunk.level) && chunk.day === day
|
||||
).flatMap((chunk) => chunk.voca_list);
|
||||
const bufferPdf = await makePdf(shuffle(voca_list));
|
||||
downloadBuffer(bufferPdf, `voca-${day}-${levels.join(",")}.pdf`);
|
||||
await downloadBuffer(
|
||||
bufferPdf,
|
||||
`voca-day${day}-level(${levels.join(",")}).pdf`,
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user