From 05f8105d90ae11ca381cf9b52db1eb2ac7c736c6 Mon Sep 17 00:00:00 2001 From: fulltomo <24rb1022@student.gs.chiba-u.jp> Date: Fri, 14 Aug 2026 10:31:07 +0900 Subject: [PATCH 1/4] feat: add resetHour to store settings and dayKey calculation --- src/store.js | 18 +++++++++++++----- tests/test.cjs | 15 +++++++++++++++ 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/store.js b/src/store.js index 9411f1a..71d9713 100644 --- a/src/store.js +++ b/src/store.js @@ -1,7 +1,10 @@ -import { schedule } from './core.js'; +import { schedule, clamp } from './core.js'; const uid = () => Math.random().toString(36).slice(2, 10); -const dayKey = t => { const d = new Date(t); return `${d.getFullYear()}-${d.getMonth() + 1}-${d.getDate()}`; }; +export const dayKey = (t, resetHour = db?.settings?.resetHour ?? 4) => { + const d = new Date(t - resetHour * 3600000); + return `${d.getFullYear()}-${d.getMonth() + 1}-${d.getDate()}`; +}; export const KEY = 'core-recall-v1'; export let db = null; @@ -22,7 +25,12 @@ export function normalizeDB(value) { cards, log, lastBackup: typeof value.lastBackup === 'number' ? value.lastBackup : b.lastBackup, - settings: Object.assign(b.settings, isRecord(value.settings) ? value.settings : {}) + settings: Object.assign(b.settings, isRecord(value.settings) ? { + ...value.settings, + resetHour: typeof value.settings.resetHour === 'number' + ? clamp(Math.floor(value.settings.resetHour), 0, 23) + : b.settings.resetHour + } : {}) }; } @@ -32,7 +40,7 @@ export function setDB(newDB) { export function blank() { return { decks: [], cards: [], log: [], lastBackup: Date.now(), - settings: { new: 20, max: 200, ret: 90, theme: 'light' } }; + settings: { new: 20, max: 200, ret: 90, resetHour: 4, theme: 'light' } }; } export function load() { @@ -64,7 +72,7 @@ export function seed() { export const deckOf = id => db.decks.find(d => d.id === id); export const cardsOf = id => db.cards.filter(c => c.deck === id); -export const todayLog = () => { const k = dayKey(Date.now()); return db.log.filter(l => dayKey(l.t) === k); }; +export const todayLog = () => { const k = dayKey(Date.now(), db.settings.resetHour); return db.log.filter(l => dayKey(l.t, db.settings.resetHour) === k); }; export function counts(deckId) { const now = Date.now(), c = { n: 0, l: 0, d: 0 }; diff --git a/tests/test.cjs b/tests/test.cjs index cc48d93..ecd6c9e 100644 --- a/tests/test.cjs +++ b/tests/test.cjs @@ -12,6 +12,15 @@ const assert = require('assert'); assert.deepStrictEqual(blankState.decks, [], 'null DB should produce empty decks'); assert.strictEqual(blankState.settings.theme, 'light', 'default theme should be light'); + // --- resetHour default & normalization + assert.strictEqual(blankState.settings.resetHour, 4, 'default resetHour should be 4'); + + const resetDB = normalizeDB({ settings: { resetHour: 25 } }); + assert.strictEqual(resetDB.settings.resetHour, 23, 'resetHour > 23 must clamp to 23'); + + const negResetDB = normalizeDB({ settings: { resetHour: -5 } }); + assert.strictEqual(negResetDB.settings.resetHour, 0, 'resetHour < 0 must clamp to 0'); + const dirtyDB = { decks: [{ id: 'd1' }, null, 42, 'str', [], { id: 'd2' }], cards: [null, { id: 'c1' }, 0], @@ -192,6 +201,12 @@ const assert = require('assert'); const store = await import('../src/store.js'); + // --- dayKey boundary test with resetHour = 4 + const ts4am = new Date(2026, 0, 15, 4, 0, 0).getTime(); + const ts359am = new Date(2026, 0, 15, 3, 59, 59).getTime(); + assert.strictEqual(store.dayKey(ts4am, 4), '2026-1-15', '4:00 AM belongs to current day'); + assert.strictEqual(store.dayKey(ts359am, 4), '2026-1-14', '3:59 AM belongs to previous day'); + const seeded = store.seed(); assert.strictEqual(seeded.decks[0].name, '英単語(サンプル)', 'seed deck name must be 英単語(サンプル)'); From 87f08a32859704b8bc1e4ce711169fdbe18a6fbf Mon Sep 17 00:00:00 2001 From: fulltomo <24rb1022@student.gs.chiba-u.jp> Date: Fri, 14 Aug 2026 10:32:23 +0900 Subject: [PATCH 2/4] feat: integrate resetHour settings UI and calculations in app --- index.html | 26 ++++++++++++++++++++++++++ src/app.js | 21 +++++++++++++++------ tests/test.cjs | 2 ++ 3 files changed, 43 insertions(+), 6 deletions(-) diff --git a/index.html b/index.html index 68a71c3..fdafdd7 100644 --- a/index.html +++ b/index.html @@ -105,6 +105,32 @@

外観

学習設定