From 8b6d9542c3003941ffa25c784a9f0f1ca6839037 Mon Sep 17 00:00:00 2001 From: Tangent Chang Date: Thu, 23 May 2024 00:41:45 +0800 Subject: [PATCH] feat: batch store key records --- src/app/services/key-record.service.spec.ts | 16 ++++++++++++++ src/app/services/key-record.service.ts | 24 +++++++++++++++++++++ src/app/stores/lesson.store.ts | 10 ++++----- 3 files changed, 45 insertions(+), 5 deletions(-) create mode 100644 src/app/services/key-record.service.spec.ts create mode 100644 src/app/services/key-record.service.ts diff --git a/src/app/services/key-record.service.spec.ts b/src/app/services/key-record.service.spec.ts new file mode 100644 index 0000000..6f0d947 --- /dev/null +++ b/src/app/services/key-record.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { KeyRecordService } from './key-record.service'; + +describe('KeyRecordService', () => { + let service: KeyRecordService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(KeyRecordService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/src/app/services/key-record.service.ts b/src/app/services/key-record.service.ts new file mode 100644 index 0000000..3c09c7d --- /dev/null +++ b/src/app/services/key-record.service.ts @@ -0,0 +1,24 @@ +import { Injectable } from '@angular/core'; +import { Subject, bufferTime } from 'rxjs'; +import { db } from '../db'; +import { KeyRecord } from '../models/key-record.models'; + +@Injectable({ + providedIn: 'root', +}) +export class KeyRecordService { + private queueSubject = new Subject(); + + constructor() { + this.queueSubject + .asObservable() + .pipe(bufferTime(2000)) + .subscribe((keyRecords) => { + db.keyRecords.bulkAdd(keyRecords); + }); + } + + public pushIntoQueue(keyRecord: KeyRecord) { + this.queueSubject.next(keyRecord); + } +} diff --git a/src/app/stores/lesson.store.ts b/src/app/stores/lesson.store.ts index 5cad91f..7b5a440 100644 --- a/src/app/stores/lesson.store.ts +++ b/src/app/stores/lesson.store.ts @@ -1,5 +1,5 @@ import { withDevtools } from '@angular-architects/ngrx-toolkit'; -import { computed } from '@angular/core'; +import { computed, inject } from '@angular/core'; import { patchState, signalStore, @@ -7,8 +7,8 @@ import { withMethods, withState, } from '@ngrx/signals'; -import { db } from '../db'; import { Lesson } from '../models/topic.models'; +import { KeyRecordService } from '../services/key-record.service'; import { pickRandomItem, pickRandomItemNTimes } from '../utils/random.utils'; const QUEUE_SIZE = 20; @@ -40,7 +40,7 @@ const initialState: LessonState = { export const LessonStore = signalStore( withDevtools('lesson'), withState(initialState), - withMethods((store) => ({ + withMethods((store, keyRecordService = inject(KeyRecordService)) => ({ setLesson(lesson: Lesson) { patchState(store, () => ({ topicId: lesson.topic.id, @@ -72,7 +72,7 @@ export const LessonStore = signalStore( inputKey: component, }; if (component !== state.queue[0]) { - db.keyRecords.add({ + keyRecordService.pushIntoQueue({ ...commonKeyRecord, isCorrect: false, intervalToPreviousCorrectKey: keyInterval, @@ -81,7 +81,7 @@ export const LessonStore = signalStore( }); return { error: true, combo: 0 }; } - db.keyRecords.add({ + keyRecordService.pushIntoQueue({ ...commonKeyRecord, isCorrect: true, intervalToPreviousCorrectKey: keyInterval,