Skip to content

Commit b09e72c

Browse files
committed
fix circular dep betwen db/common-ui...
and use a generic decorator to pass type safety of ViewComponents
1 parent 3a079d3 commit b09e72c

File tree

2 files changed

+10
-10
lines changed

2 files changed

+10
-10
lines changed

packages/common-ui/src/components/StudySession.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ export default defineComponent({
165165
card_elo: 1000,
166166
courseNames: {} as { [courseID: string]: string },
167167
cardCount: 1,
168-
sessionController: null as SessionController | null,
168+
sessionController: null as SessionController<ViewComponent> | null,
169169
sessionPrepared: false,
170170
sessionFinished: false,
171171
sessionRecord: [] as StudySessionRecord[],
@@ -301,7 +301,7 @@ export default defineComponent({
301301
});
302302
303303
this.sessionController = markRaw(
304-
new SessionController(
304+
new SessionController<ViewComponent>(
305305
this.sessionContentSources,
306306
60 * this.sessionTimeLimit,
307307
this.dataLayer,

packages/db/src/study/SessionController.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@ export interface StudySessionRecord {
2626
records: CardRecord[];
2727
}
2828

29-
export interface HydratedCard {
29+
export interface HydratedCard<TView = unknown> {
3030
item: StudySessionItem;
31-
view: any; // Vue component - avoid circular dependency with common-ui
31+
view: TView;
3232
data: ViewData[];
3333
}
3434

@@ -87,11 +87,11 @@ class ItemQueue<T> {
8787

8888
import { DataLayerProvider } from '@db/core';
8989

90-
export class SessionController extends Loggable {
90+
export class SessionController<TView = unknown> extends Loggable {
9191
_className = 'SessionController';
9292
private sources: StudyContentSource[];
9393
private dataLayer: DataLayerProvider;
94-
private getViewComponent: (viewId: string) => any;
94+
private getViewComponent: (viewId: string) => TView;
9595
private _sessionRecord: StudySessionRecord[] = [];
9696
public set sessionRecord(r: StudySessionRecord[]) {
9797
this._sessionRecord = r;
@@ -100,7 +100,7 @@ export class SessionController extends Loggable {
100100
private reviewQ: ItemQueue<StudySessionReviewItem> = new ItemQueue<StudySessionReviewItem>();
101101
private newQ: ItemQueue<StudySessionNewItem> = new ItemQueue<StudySessionNewItem>();
102102
private failedQ: ItemQueue<StudySessionFailedItem> = new ItemQueue<StudySessionFailedItem>();
103-
private hydratedQ: ItemQueue<HydratedCard> = new ItemQueue<HydratedCard>();
103+
private hydratedQ: ItemQueue<HydratedCard<TView>> = new ItemQueue<HydratedCard<TView>>();
104104
private _currentCard: StudySessionItem | null = null;
105105
private hydration_in_progress: boolean = false;
106106

@@ -126,7 +126,7 @@ export class SessionController extends Loggable {
126126
sources: StudyContentSource[],
127127
time: number,
128128
dataLayer: DataLayerProvider,
129-
getViewComponent: (viewId: string) => any // Vue component
129+
getViewComponent: (viewId: string) => TView
130130
) {
131131
super();
132132

@@ -356,7 +356,7 @@ export class SessionController extends Loggable {
356356
| 'dismiss-failed'
357357
| 'marked-failed'
358358
| 'dismiss-error' = 'dismiss-success'
359-
): Promise<HydratedCard | null> {
359+
): Promise<HydratedCard<TView> | null> {
360360
// dismiss (or sort to failedQ) the current card
361361
this.dismissCurrentCard(action);
362362

@@ -431,7 +431,7 @@ export class SessionController extends Loggable {
431431
return this.reviewQ.length > 0 || this.newQ.length > 0 || this.failedQ.length > 0;
432432
}
433433

434-
private async nextHydratedCard(): Promise<HydratedCard | null> {
434+
private async nextHydratedCard(): Promise<HydratedCard<TView> | null> {
435435
// Wait for a card to become available in hydratedQ
436436
while (this.hydratedQ.length === 0 && this.hasAvailableCards()) {
437437
await new Promise((resolve) => setTimeout(resolve, 25)); // Short polling interval

0 commit comments

Comments
 (0)