Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 45 additions & 1 deletion config/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ export type BookConfig = {
hashedFileName?: string; // currently just for HTML books
audio: BookCollectionAudioConfig[];
features: any;
quizFeatures?: any;
quizFeatures?: Record<string, string | boolean | number>;
footer?: HTML;
style?: StyleConfig;
styles?: {
Expand Down Expand Up @@ -335,3 +335,47 @@ export type DictionaryConfig = AppConfig & {
};
}[];
};

export type QuizExplanation = {
text?: string;
audio?: string;
};

export type QuizAnswer = {
//\aw or \ar
correct: boolean;
text?: string;
image?: string;
audio?: string;
explanation?: QuizExplanation;
// field is used extensively in UI, adding here for type-safety
clicked?: boolean;
};

export type QuizQuestion = {
//\qu
text: string;
image?: string;
audio?: string;
columns?: number; //\ac
explanation?: QuizExplanation;
answers: QuizAnswer[];
};

export type Quiz = {
id: string; //\id
name?: string; //\qn
shortName?: string; //\qs
rightAnswerAudio?: string[]; //\ra
wrongAnswerAudio?: string[]; //\wa
questions: QuizQuestion[];
scoreMessageBefore?: string; //\sb
scoreMessageAfter?: string; //\sa
commentary?: {
//\sc
rangeMin: number;
rangeMax?: number;
message: string;
}[];
passScore?: number; //\pm
};
52 changes: 9 additions & 43 deletions convert/convertBooks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,15 @@

import * as fs from 'fs';
import path, { basename, extname, join } from 'path';
import type { BookConfig, BookTabConfig, ScriptureConfig } from '$config';
import type {
BookConfig,
BookTabConfig,
Quiz,
QuizAnswer,
QuizExplanation,
QuizQuestion,
ScriptureConfig
} from '$config';
import { freeze, postQueries, queries } from '../sab-proskomma-tools';
import { SABProskomma } from '../src/lib/sab-proskomma';
import type { ConfigTaskOutput } from './convertConfig';
Expand Down Expand Up @@ -599,48 +607,6 @@ export async function convertBooks(
};
}

export type QuizExplanation = {
text?: string;
audio?: string;
};

export type QuizAnswer = {
//\aw or \ar
correct: boolean;
text?: string;
image?: string;
audio?: string;
explanation?: QuizExplanation;
};

export type QuizQuestion = {
//\qu
text: string;
image?: string;
audio?: string;
columns?: number; //\ac
explanation?: QuizExplanation;
answers: QuizAnswer[];
};

export type Quiz = {
id: string; //\id
name?: string; //\qn
shortName?: string; //\qs
rightAnswerAudio?: string[]; //\ra
wrongAnswerAudio?: string[]; //\wa
questions: QuizQuestion[];
scoreMessageBefore?: string; //\sb
scoreMessageAfter?: string; //\sa
commentary?: {
//\sc
rangeMin: number;
rangeMax?: number;
message: string;
}[];
passScore?: number; //\pm
};

function convertHtmlBook(context: ConvertBookContext, book: BookConfig, files: any[]) {
const srcFile = path.join(context.dataDir, 'books', context.bcId, book.file);

Expand Down
28 changes: 16 additions & 12 deletions src/lib/data/quiz.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import type { ScriptureConfig } from '$config';
import config from '$lib/data/config';
import { openDB, type DBSchema } from 'idb';

Expand All @@ -16,13 +17,13 @@ interface Quiz extends DBSchema {
key: number;
value: QuizScore;
indexes: {
'collection, book': string;
'collection, book': [string, string];
date: number;
};
};
}

let quizDB = null;
let quizDB: Awaited<ReturnType<typeof openDB<Quiz>>> | null = null;
async function openQuiz() {
if (!quizDB) {
quizDB = await openDB<Quiz>('quiz', 1, {
Expand Down Expand Up @@ -53,15 +54,18 @@ export async function addQuiz(item: {
return;
}
const date = new Date()[Symbol.toPrimitive]('number');
const bookCollection = config.bookCollections.find((x) => x.id === item.collection);
const bookIndex = bookCollection.books.findIndex((x) => x.id === item.book);
const scriptConfig = config as ScriptureConfig;
const bookCollection = scriptConfig.bookCollections?.find((x) => x.id === item.collection);
const bookIndex = bookCollection?.books.findIndex((x) => x.id === item.book);

const nextItem = {
...item,
date: date,
bookIndex: bookIndex
};
await quiz.add('quiz', nextItem);
if (bookIndex !== undefined && bookIndex >= 0) {
const nextItem = {
...item,
date: date,
bookIndex: bookIndex
};
await quiz.add('quiz', nextItem);
}
Comment thread
FyreByrd marked this conversation as resolved.
} catch (error) {
console.error('Error adding quiz result:', error);
}
Expand All @@ -81,8 +85,8 @@ export async function findQuiz(item: { collection: string; book: string }) {
return result;
}

export async function checkQuizAccess(quizId) {
export async function checkQuizAccess(quizId: string) {
const quiz = await openQuiz();
const result = await quiz.getAllFromIndex('quiz', 'collection, book');
const result: QuizScore[] = await quiz.getAllFromIndex('quiz', 'collection, book');
return result.some((item) => item.book === quizId && item.pass);
}
Loading
Loading