@speakableio/core 0.1.103 → 0.1.106

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/dist/analytics.js +25 -329
  2. package/dist/analytics.js.map +1 -1
  3. package/dist/{assignment.model-Lu21tZCh.d.mts → assignment.model-DLMWAp0Y.d.ts} +1 -1
  4. package/dist/chunk-233VJDUF.js +149 -0
  5. package/dist/chunk-233VJDUF.js.map +1 -0
  6. package/dist/chunk-2CRI5MJP.js +225 -0
  7. package/dist/chunk-2CRI5MJP.js.map +1 -0
  8. package/dist/chunk-AWVUNWML.js +141 -0
  9. package/dist/chunk-AWVUNWML.js.map +1 -0
  10. package/dist/chunk-CJ5JXKII.js +129 -0
  11. package/dist/chunk-CJ5JXKII.js.map +1 -0
  12. package/dist/chunk-EEBMPASA.js +21 -0
  13. package/dist/chunk-EEBMPASA.js.map +1 -0
  14. package/dist/chunk-H5XNOXRC.js +11 -0
  15. package/dist/chunk-H5XNOXRC.js.map +1 -0
  16. package/dist/chunk-LZG3MTSH.js +53 -0
  17. package/dist/chunk-LZG3MTSH.js.map +1 -0
  18. package/dist/chunk-OLSTHM2U.js +154 -0
  19. package/dist/chunk-OLSTHM2U.js.map +1 -0
  20. package/dist/chunk-TQGDTKTE.js +13 -0
  21. package/dist/chunk-TQGDTKTE.js.map +1 -0
  22. package/dist/chunk-YKUMIPSO.js +212 -0
  23. package/dist/chunk-YKUMIPSO.js.map +1 -0
  24. package/dist/chunk-YMJRCINF.js +68 -0
  25. package/dist/chunk-YMJRCINF.js.map +1 -0
  26. package/dist/chunk-YO34TZYN.js +28 -0
  27. package/dist/chunk-YO34TZYN.js.map +1 -0
  28. package/dist/const.d.ts +331 -0
  29. package/dist/const.js +170 -162
  30. package/dist/const.js.map +1 -1
  31. package/dist/{hooks.d.mts → hooks.d.ts} +5 -5
  32. package/dist/hooks.js +35 -591
  33. package/dist/hooks.js.map +1 -1
  34. package/dist/index.native.js +52 -64
  35. package/dist/index.native.js.map +1 -1
  36. package/dist/{index.web.d.mts → index.web.d.ts} +3 -3
  37. package/dist/index.web.js +12 -427
  38. package/dist/index.web.js.map +1 -1
  39. package/dist/{models.d.mts → models.d.ts} +3 -3
  40. package/dist/models.js +8 -43
  41. package/dist/models.js.map +1 -1
  42. package/dist/{notification.constants-B72fb734.d.mts → notification.constants-Da4-_0kX.d.ts} +1 -1
  43. package/dist/{repos.d.mts → repos.d.ts} +4 -4
  44. package/dist/repos.js +13 -440
  45. package/dist/repos.js.map +1 -1
  46. package/dist/{utils.d.mts → utils.d.ts} +2 -2
  47. package/dist/utils.js +14 -174
  48. package/dist/utils.js.map +1 -1
  49. package/package.json +21 -25
  50. package/dist/assignment.model-Bcbxx8oI.d.mts +0 -299
  51. package/dist/const.d.mts +0 -26
  52. package/dist/index.native.d.mts +0 -591
  53. package/dist/index.native.mjs +0 -505
  54. package/dist/index.native.mjs.map +0 -1
  55. /package/dist/{analytics.d.mts → analytics.d.ts} +0 -0
  56. /package/dist/{assignment.constants-BIKM6fYi.d.mts → assignment.constants-BIKM6fYi.d.ts} +0 -0
  57. /package/dist/{card.constants-DhKFipX3.d.mts → card.constants-DhKFipX3.d.ts} +0 -0
package/dist/hooks.js CHANGED
@@ -1,3 +1,38 @@
1
+ import {
2
+ logStartAssignment,
3
+ logSubmitAssignment
4
+ } from "./chunk-YKUMIPSO.js";
5
+ import {
6
+ ANALYTICS_PLANS,
7
+ ASSIGNMENT_SETTINGS_PLANS,
8
+ SPEAKABLE_NOTIFICATIONS,
9
+ SpeakableNotificationTypes,
10
+ WEB_BASE_URL,
11
+ refsScoresPractice
12
+ } from "./chunk-2CRI5MJP.js";
13
+ import "./chunk-YO34TZYN.js";
14
+ import {
15
+ getSet
16
+ } from "./chunk-EEBMPASA.js";
17
+ import {
18
+ createCard,
19
+ createCards,
20
+ getCard,
21
+ withErrorHandler
22
+ } from "./chunk-233VJDUF.js";
23
+ import "./chunk-H5XNOXRC.js";
24
+ import {
25
+ refsAssignmentFiresotre
26
+ } from "./chunk-AWVUNWML.js";
27
+ import {
28
+ calculateScoreAndProgress_default,
29
+ defaultScore
30
+ } from "./chunk-YMJRCINF.js";
31
+ import {
32
+ api
33
+ } from "./chunk-CJ5JXKII.js";
34
+ import "./chunk-LZG3MTSH.js";
35
+
1
36
  // src/providers/SpeakableProvider.tsx
2
37
  import { createContext, useContext, useEffect, useState } from "react";
3
38
  import { jsx } from "react/jsx-runtime";
@@ -72,162 +107,6 @@ var handleOptimisticUpdate = async ({
72
107
  return { previousData };
73
108
  };
74
109
 
75
- // src/constants/speakable-plans.ts
76
- var FEEDBACK_PLANS = {
77
- FEEDBACK_TRANSCRIPT: "FEEDBACK_TRANSCRIPT",
78
- // Transcript from the audio
79
- FEEDBACK_SUMMARY: "FEEDBACK_SUMMARY",
80
- // Chatty summary (Free plan)
81
- FEEDBACK_GRAMMAR_INSIGHTS: "FEEDBACK_GRAMMAR_INSIGHTS",
82
- // Grammar insights
83
- FEEDBACK_SUGGESTED_RESPONSE: "FEEDBACK_SUGGESTED_RESPONSE",
84
- // Suggested Response
85
- FEEDBACK_RUBRIC: "FEEDBACK_RUBRIC",
86
- // Suggested Response
87
- FEEDBACK_GRADING_STANDARDS: "FEEDBACK_GRADING_STANDARDS",
88
- // ACTFL / WIDA Estimate
89
- FEEDBACK_TARGET_LANGUAGE: "FEEDBACK_TARGET_LANGUAGE",
90
- // Ability to set the feedback language to the target language of the student
91
- FEEDBACK_DISABLE_ALLOW_RETRIES: "FEEDBACK_DISABLE_ALLOW_RETRIES"
92
- // Turn of allow retries
93
- };
94
- var AUTO_GRADING_PLANS = {
95
- AUTO_GRADING_PASS_FAIL: "AUTO_GRADING_PASS_FAIL",
96
- // Pass / fail grading
97
- AUTO_GRADING_RUBRICS: "AUTO_GRADING_RUBRICS",
98
- // Autograded rubrics
99
- AUTO_GRADING_STANDARDS_BASED: "AUTO_GRADING_STANDARDS_BASED"
100
- // Standards based grading
101
- };
102
- var AI_ASSISTANT_PLANS = {
103
- AI_ASSISTANT_DOCUMENT_UPLOADS: "AI_ASSISTANT_DOCUMENT_UPLOADS",
104
- // Allow document uploading
105
- AI_ASSISTANT_UNLIMITED_USE: "AI_ASSISTANT_UNLIMITED_USE"
106
- // Allow unlimited use of AI assistant. Otherwise, limits are used.
107
- };
108
- var ASSIGNMENT_SETTINGS_PLANS = {
109
- ASSESSMENTS: "ASSESSMENTS",
110
- // Ability to create assessment assignment types
111
- GOOGLE_CLASSROOM_GRADE_PASSBACK: "GOOGLE_CLASSROOM_GRADE_PASSBACK"
112
- // Assignment scores can sync with classroom
113
- };
114
- var ANALYTICS_PLANS = {
115
- ANALYTICS_GRADEBOOK: "ANALYTICS_GRADEBOOK",
116
- // Access to the gradebook page
117
- ANALYTICS_CLASSROOM_ANALYTICS: "ANALYTICS_CLASSROOM_ANALYTICS",
118
- // Access to the classroom analytics page
119
- ANALYTICS_STUDENT_PROGRESS_REPORTS: "ANALYTICS_STUDENT_PROGRESS_REPORTS",
120
- // Access to the panel that shows an individual student's progress and assignments
121
- ANALYTICS_ASSIGNMENT_RESULTS: "ANALYTICS_ASSIGNMENT_RESULTS",
122
- // Access to the assigment RESULTS page
123
- ANALYTICS_ORGANIZATION: "ANALYTICS_ORGANIZATION"
124
- // Access to the organization analytics panel (for permitted admins)
125
- };
126
- var SPACES_PLANS = {
127
- SPACES_CREATE_SPACE: "SPACES_CREATE_SPACE",
128
- // Ability to create spaces
129
- SPACES_CHECK_POINTS: "SPACES_CHECK_POINTS"
130
- // Feature not available yet. Ability to create checkpoints for spaces for data aggregation
131
- };
132
- var DISCOVER_PLANS = {
133
- DISCOVER_ORGANIZATION_LIBRARY: "DISCOVER_ORGANIZATION_LIBRARY"
134
- // Access to the organizations shared library
135
- };
136
- var MEDIA_AREA_PLANS = {
137
- MEDIA_AREA_DOCUMENT_UPLOAD: "MEDIA_AREA_DOCUMENT_UPLOAD",
138
- MEDIA_AREA_AUDIO_FILES: "MEDIA_AREA_AUDIO_FILES"
139
- };
140
- var FREE_PLAN = [];
141
- var TEACHER_PRO_PLAN = [
142
- FEEDBACK_PLANS.FEEDBACK_TRANSCRIPT,
143
- FEEDBACK_PLANS.FEEDBACK_SUMMARY,
144
- FEEDBACK_PLANS.FEEDBACK_TARGET_LANGUAGE,
145
- AUTO_GRADING_PLANS.AUTO_GRADING_PASS_FAIL,
146
- ANALYTICS_PLANS.ANALYTICS_GRADEBOOK,
147
- SPACES_PLANS.SPACES_CREATE_SPACE
148
- // AUTO_GRADING_PLANS.AUTO_GRADING_STANDARDS_BASED,
149
- ];
150
- var SCHOOL_STARTER = [
151
- FEEDBACK_PLANS.FEEDBACK_TRANSCRIPT,
152
- FEEDBACK_PLANS.FEEDBACK_SUMMARY,
153
- FEEDBACK_PLANS.FEEDBACK_GRAMMAR_INSIGHTS,
154
- FEEDBACK_PLANS.FEEDBACK_SUGGESTED_RESPONSE,
155
- FEEDBACK_PLANS.FEEDBACK_RUBRIC,
156
- FEEDBACK_PLANS.FEEDBACK_GRADING_STANDARDS,
157
- FEEDBACK_PLANS.FEEDBACK_DISABLE_ALLOW_RETRIES,
158
- FEEDBACK_PLANS.FEEDBACK_TARGET_LANGUAGE,
159
- AUTO_GRADING_PLANS.AUTO_GRADING_PASS_FAIL,
160
- AUTO_GRADING_PLANS.AUTO_GRADING_RUBRICS,
161
- AUTO_GRADING_PLANS.AUTO_GRADING_STANDARDS_BASED,
162
- AI_ASSISTANT_PLANS.AI_ASSISTANT_DOCUMENT_UPLOADS,
163
- AI_ASSISTANT_PLANS.AI_ASSISTANT_UNLIMITED_USE,
164
- // ASSIGNMENT_SETTINGS_PLANS.ASSESSMENTS,
165
- ASSIGNMENT_SETTINGS_PLANS.GOOGLE_CLASSROOM_GRADE_PASSBACK,
166
- ANALYTICS_PLANS.ANALYTICS_GRADEBOOK,
167
- ANALYTICS_PLANS.ANALYTICS_STUDENT_PROGRESS_REPORTS,
168
- ANALYTICS_PLANS.ANALYTICS_CLASSROOM_ANALYTICS,
169
- // ANALYTICS_PLANS.ANALYTICS_ORGANIZATION,
170
- SPACES_PLANS.SPACES_CREATE_SPACE,
171
- SPACES_PLANS.SPACES_CHECK_POINTS,
172
- // DISCOVER_PLANS.DISCOVER_ORGANIZATION_LIBRARY,
173
- MEDIA_AREA_PLANS.MEDIA_AREA_DOCUMENT_UPLOAD,
174
- MEDIA_AREA_PLANS.MEDIA_AREA_AUDIO_FILES
175
- ];
176
- var ORGANIZATION_PLAN = [
177
- FEEDBACK_PLANS.FEEDBACK_TRANSCRIPT,
178
- FEEDBACK_PLANS.FEEDBACK_SUMMARY,
179
- FEEDBACK_PLANS.FEEDBACK_GRAMMAR_INSIGHTS,
180
- FEEDBACK_PLANS.FEEDBACK_SUGGESTED_RESPONSE,
181
- FEEDBACK_PLANS.FEEDBACK_RUBRIC,
182
- FEEDBACK_PLANS.FEEDBACK_GRADING_STANDARDS,
183
- FEEDBACK_PLANS.FEEDBACK_DISABLE_ALLOW_RETRIES,
184
- FEEDBACK_PLANS.FEEDBACK_TARGET_LANGUAGE,
185
- AUTO_GRADING_PLANS.AUTO_GRADING_PASS_FAIL,
186
- AUTO_GRADING_PLANS.AUTO_GRADING_RUBRICS,
187
- AUTO_GRADING_PLANS.AUTO_GRADING_STANDARDS_BASED,
188
- AI_ASSISTANT_PLANS.AI_ASSISTANT_DOCUMENT_UPLOADS,
189
- AI_ASSISTANT_PLANS.AI_ASSISTANT_UNLIMITED_USE,
190
- ASSIGNMENT_SETTINGS_PLANS.ASSESSMENTS,
191
- ASSIGNMENT_SETTINGS_PLANS.GOOGLE_CLASSROOM_GRADE_PASSBACK,
192
- ANALYTICS_PLANS.ANALYTICS_GRADEBOOK,
193
- ANALYTICS_PLANS.ANALYTICS_STUDENT_PROGRESS_REPORTS,
194
- ANALYTICS_PLANS.ANALYTICS_CLASSROOM_ANALYTICS,
195
- ANALYTICS_PLANS.ANALYTICS_ORGANIZATION,
196
- SPACES_PLANS.SPACES_CREATE_SPACE,
197
- SPACES_PLANS.SPACES_CHECK_POINTS,
198
- DISCOVER_PLANS.DISCOVER_ORGANIZATION_LIBRARY,
199
- MEDIA_AREA_PLANS.MEDIA_AREA_DOCUMENT_UPLOAD,
200
- MEDIA_AREA_PLANS.MEDIA_AREA_AUDIO_FILES
201
- ];
202
- var SpeakablePlanTypes = {
203
- basic: "basic",
204
- teacher_pro: "teacher_pro",
205
- school_starter: "school_starter",
206
- organization: "organization",
207
- // OLD PLANS
208
- starter: "starter",
209
- growth: "growth",
210
- professional: "professional"
211
- };
212
- var SpeakablePermissionsMap = {
213
- [SpeakablePlanTypes.basic]: FREE_PLAN,
214
- [SpeakablePlanTypes.starter]: TEACHER_PRO_PLAN,
215
- [SpeakablePlanTypes.teacher_pro]: TEACHER_PRO_PLAN,
216
- [SpeakablePlanTypes.growth]: ORGANIZATION_PLAN,
217
- [SpeakablePlanTypes.professional]: ORGANIZATION_PLAN,
218
- [SpeakablePlanTypes.organization]: ORGANIZATION_PLAN,
219
- [SpeakablePlanTypes.school_starter]: SCHOOL_STARTER
220
- };
221
- var SpeakablePlanHierarchy = [
222
- SpeakablePlanTypes.basic,
223
- SpeakablePlanTypes.starter,
224
- SpeakablePlanTypes.teacher_pro,
225
- SpeakablePlanTypes.growth,
226
- SpeakablePlanTypes.professional,
227
- SpeakablePlanTypes.school_starter,
228
- SpeakablePlanTypes.organization
229
- ];
230
-
231
110
  // src/hooks/usePermissions.ts
232
111
  var usePermissions = () => {
233
112
  const { permissions } = useSpeakableApi();
@@ -256,131 +135,6 @@ var usePermissions = () => {
256
135
  };
257
136
  var usePermissions_default = usePermissions;
258
137
 
259
- // src/lib/firebase/api.ts
260
- var FirebaseAPI = class _FirebaseAPI {
261
- // eslint-disable-next-line @typescript-eslint/no-empty-function
262
- constructor() {
263
- this.config = null;
264
- }
265
- static getInstance() {
266
- if (!_FirebaseAPI.instance) {
267
- _FirebaseAPI.instance = new _FirebaseAPI();
268
- }
269
- return _FirebaseAPI.instance;
270
- }
271
- initialize(config) {
272
- this.config = config;
273
- }
274
- get db() {
275
- if (!this.config) throw new Error("Firebase API not initialized");
276
- return this.config.db;
277
- }
278
- get helpers() {
279
- if (!this.config) throw new Error("Firebase API not initialized");
280
- return this.config.helpers;
281
- }
282
- get httpsCallable() {
283
- var _a;
284
- return (_a = this.config) == null ? void 0 : _a.httpsCallable;
285
- }
286
- logEvent(name, data) {
287
- var _a;
288
- (_a = this.config) == null ? void 0 : _a.logEvent(name, data);
289
- }
290
- accessQueryConstraints() {
291
- const { query, orderBy, limit, startAt, startAfter, endAt, endBefore, where, increment } = this.helpers;
292
- return {
293
- query,
294
- orderBy,
295
- limit,
296
- startAt,
297
- startAfter,
298
- endAt,
299
- endBefore,
300
- where,
301
- increment
302
- };
303
- }
304
- accessHelpers() {
305
- const { doc, collection, writeBatch, serverTimestamp, setDoc } = this.helpers;
306
- return {
307
- doc: (path) => doc(this.db, path),
308
- collection: (path) => collection(this.db, path),
309
- writeBatch: () => writeBatch(this.db),
310
- serverTimestamp,
311
- setDoc
312
- };
313
- }
314
- async getDoc(path) {
315
- const { getDoc, doc } = this.helpers;
316
- const docRef = doc(this.db, path);
317
- const docSnap = await getDoc(docRef);
318
- const data = docSnap.exists() ? {
319
- ...docSnap.data(),
320
- id: docSnap.id
321
- } : null;
322
- return {
323
- id: docSnap.id,
324
- data
325
- };
326
- }
327
- async getDocs(path, ...queryConstraints) {
328
- const { getDocs, query, collection } = this.helpers;
329
- const collectionRef = collection(this.db, path);
330
- const q = queryConstraints.length > 0 ? query(collectionRef, ...queryConstraints) : collectionRef;
331
- const querySnapshot = await getDocs(q);
332
- const data = querySnapshot.docs.map((doc) => ({
333
- data: doc.data(),
334
- id: doc.id
335
- }));
336
- return {
337
- data,
338
- querySnapshot,
339
- empty: querySnapshot.empty
340
- };
341
- }
342
- async addDoc(path, data) {
343
- const { addDoc, collection } = this.helpers;
344
- const collectionRef = collection(this.db, path);
345
- const docRef = await addDoc(collectionRef, data);
346
- return {
347
- ...data,
348
- id: docRef.id
349
- };
350
- }
351
- async setDoc(path, data, options = {}) {
352
- const { setDoc, doc } = this.helpers;
353
- const docRef = doc(this.db, path);
354
- await setDoc(docRef, data, options);
355
- }
356
- async updateDoc(path, data) {
357
- const { updateDoc, doc } = this.helpers;
358
- const docRef = doc(this.db, path);
359
- await updateDoc(docRef, data);
360
- }
361
- async deleteDoc(path) {
362
- const { deleteDoc, doc } = this.helpers;
363
- const docRef = doc(this.db, path);
364
- await deleteDoc(docRef);
365
- }
366
- async runTransaction(updateFunction) {
367
- const { runTransaction } = this.helpers;
368
- return runTransaction(this.db, updateFunction);
369
- }
370
- async runBatch(operations) {
371
- const { writeBatch } = this.helpers;
372
- const batch = writeBatch(this.db);
373
- await Promise.all(operations.map((op) => op()));
374
- await batch.commit();
375
- }
376
- writeBatch() {
377
- const { writeBatch } = this.helpers;
378
- const batch = writeBatch(this.db);
379
- return batch;
380
- }
381
- };
382
- var api = FirebaseAPI.getInstance();
383
-
384
138
  // src/hooks/useGoogleClassroom.ts
385
139
  var useGoogleClassroom = () => {
386
140
  const submitAssignmentToGoogleClassroom = async ({
@@ -417,110 +171,9 @@ var useGoogleClassroom = () => {
417
171
  };
418
172
  };
419
173
 
420
- // src/constants/analytics.constants.ts
421
- var ANALYTICS_EVENT_TYPES = {
422
- VOICE_SUCCESS: "voice_success",
423
- VOICE_FAIL: "voice_fail",
424
- RESPOND_CARD_SUCCESS: "respond_card_success",
425
- RESPOND_CARD_FAIL: "respond_card_fail",
426
- RESPOND_WRITE_CARD_SUCCESS: "respond_write_card_success",
427
- RESPOND_WRITE_CARD_FAIL: "respond_write_card_fail",
428
- RESPOND_WRITE_CARD_SUBMITTED: "respond_write_card_submitted",
429
- RESPOND_WRITE_CARD_ERROR: "respond_write_card_error",
430
- RESPOND_CARD_ERROR: "respond_card_error",
431
- RESPOND_CARD_SUBMITTED: "respond_card_submitted",
432
- RESPOND_FREE_PLAN: "respond_free_plan",
433
- RESPOND_WRITE_FREE_PLAN: "respond_write_free_plan",
434
- SUBMISSION: "assignment_submitted",
435
- ASSIGNMENT_STARTED: "assignment_started",
436
- CREATE_ASSIGNMENT: "create_assignment",
437
- MC_SUCCESS: "multiple_choice_success",
438
- MC_FAIL: "multiple_choice_fail",
439
- MC_ERROR: "multiple_choice_error",
440
- ACTFL_LEVEL: "actfl_level",
441
- WIDA_LEVEL: "wida_level"
442
- };
443
-
444
- // src/lib/firebase/firebase-analytics/assignment.ts
445
- var logSubmitAssignment = (data = {}) => {
446
- var _a, _b, _c;
447
- (_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, "handleCouresAnalyticsEvent")) == null ? void 0 : _c({
448
- eventType: ANALYTICS_EVENT_TYPES.SUBMISSION,
449
- ...data
450
- });
451
- api.logEvent(ANALYTICS_EVENT_TYPES.SUBMISSION, data);
452
- };
453
- var logStartAssignment = (data = {}) => {
454
- var _a, _b, _c;
455
- if (data.courseId) {
456
- (_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, "handleCouresAnalyticsEvent")) == null ? void 0 : _c({
457
- eventType: ANALYTICS_EVENT_TYPES.ASSIGNMENT_STARTED,
458
- ...data
459
- });
460
- }
461
- api.logEvent(ANALYTICS_EVENT_TYPES.ASSIGNMENT_STARTED, data);
462
- };
463
-
464
174
  // src/domains/notification/services/create-notification.service.ts
465
175
  import dayjs from "dayjs";
466
176
 
467
- // src/constants/web.constants.ts
468
- var WEB_BASE_URL = "https://app.speakable.io";
469
-
470
- // src/domains/notification/notification.constants.ts
471
- var SPEAKABLE_NOTIFICATIONS = {
472
- NEW_ASSIGNMENT: "new_assignment",
473
- ASSESSMENT_SUBMITTED: "assessment_submitted",
474
- ASSESSMENT_SCORED: "assessment_scored",
475
- NEW_COMMENT: "NEW_COMMENT"
476
- };
477
- var SpeakableNotificationTypes = {
478
- NEW_ASSIGNMENT: "NEW_ASSIGNMENT",
479
- FEEDBACK_FROM_TEACHER: "FEEDBACK_FROM_TEACHER",
480
- MESSAGE_FROM_STUDENT: "MESSAGE_FROM_STUDENT",
481
- PHRASE_MARKED_CORRECT: "PHRASE_MARKED_CORRECT",
482
- STUDENT_PROGRESS: "STUDENT_PROGRESS",
483
- PLAYLIST_FOLLOWERS: "PLAYLIST_FOLLOWERS",
484
- PLAYLIST_PLAYS: "PLAYLIST_PLAYS",
485
- // New notifications
486
- ASSESSMENT_SUBMITTED: "ASSESSMENT_SUBMITTED",
487
- // Notification FOR TEACHER when student submits assessment
488
- ASSESSMENT_SCORED: "ASSESSMENT_SCORED",
489
- // Notification FOR STUDENT when teacher scores assessment
490
- // Comment
491
- NEW_COMMENT: "NEW_COMMENT"
492
- };
493
-
494
- // src/utils/error-handler.ts
495
- var ServiceError = class extends Error {
496
- constructor(message, originalError, code) {
497
- super(message);
498
- this.originalError = originalError;
499
- this.code = code;
500
- this.name = "ServiceError";
501
- }
502
- };
503
- function withErrorHandler(fn, serviceName) {
504
- return async (...args) => {
505
- try {
506
- return await fn(...args);
507
- } catch (error) {
508
- if (error instanceof Error && "code" in error) {
509
- const firebaseError = error;
510
- throw new ServiceError(
511
- `Error in ${serviceName}: ${firebaseError.message}`,
512
- error,
513
- firebaseError.code
514
- );
515
- }
516
- if (error instanceof Error) {
517
- throw new ServiceError(`Error in ${serviceName}: ${error.message}`, error);
518
- }
519
- throw new ServiceError(`Unknown error in ${serviceName}`, error);
520
- }
521
- };
522
- }
523
-
524
177
  // src/domains/notification/services/send-notification.service.ts
525
178
  var _sendNotification = async (sendTo, notification) => {
526
179
  var _a, _b, _c;
@@ -680,49 +333,6 @@ var useCreateNotification = () => {
680
333
  };
681
334
  };
682
335
 
683
- // src/domains/assignment/assignment.constants.ts
684
- var ASSIGNMENTS_COLLECTION = "assignments";
685
- var ANALYTICS_SUBCOLLECTION = "analytics";
686
- var SCORES_SUBCOLLECTION = "scores";
687
- var refsAssignmentFiresotre = {
688
- allAssignments: () => ASSIGNMENTS_COLLECTION,
689
- assignment: (params) => `${ASSIGNMENTS_COLLECTION}/${params.id}`,
690
- assignmentAllAnalytics: (params) => `${ASSIGNMENTS_COLLECTION}/${params.id}/${ANALYTICS_SUBCOLLECTION}`,
691
- assignmentAnalytics: (params) => `${ASSIGNMENTS_COLLECTION}/${params.id}/${ANALYTICS_SUBCOLLECTION}/${params.type}`,
692
- assignmentScores: (params) => `${ASSIGNMENTS_COLLECTION}/${params.id}/${SCORES_SUBCOLLECTION}/${params.userId}`
693
- };
694
-
695
- // src/domains/assignment/utils/create-default-score.ts
696
- var defaultScore = (props) => {
697
- const { serverTimestamp } = api.accessHelpers();
698
- const score = {
699
- progress: 0,
700
- score: 0,
701
- startDate: serverTimestamp(),
702
- status: "IN_PROGRESS",
703
- submitted: false,
704
- cards: {},
705
- lastPlayed: serverTimestamp(),
706
- owners: props.owners,
707
- userId: props.userId
708
- };
709
- if (props.googleClassroomUserId) {
710
- score.googleClassroomUserId = props.googleClassroomUserId;
711
- }
712
- if (props.courseId) {
713
- score.courseId = props.courseId;
714
- }
715
- return score;
716
- };
717
-
718
- // src/domains/assignment/score-practice.constants.ts
719
- var SCORES_PRACTICE_COLLECTION = "users";
720
- var SCORES_PRACTICE_SUBCOLLECTION = "practice";
721
- var refsScoresPractice = {
722
- practiceScores: (params) => `${SCORES_PRACTICE_COLLECTION}/${params.userId}/${SCORES_PRACTICE_SUBCOLLECTION}/${params.setId}`,
723
- practiceScoreHistoryRefDoc: (params) => `${SCORES_PRACTICE_COLLECTION}/${params.userId}/${SCORES_PRACTICE_SUBCOLLECTION}/${params.setId}/attempts/${params.date}`
724
- };
725
-
726
336
  // src/domains/assignment/services/create-score.service.ts
727
337
  async function _createScore(params) {
728
338
  var _a, _b, _c;
@@ -834,42 +444,6 @@ async function _getScore(params) {
834
444
  }
835
445
  var getScore = withErrorHandler(_getScore, "getScore");
836
446
 
837
- // src/domains/assignment/utils/calculateScoreAndProgress.ts
838
- var calculateScoreAndProgress = (scores, cardsList, weights) => {
839
- const totalSetPoints = cardsList.reduce((acc, cardId) => {
840
- acc += (weights == null ? void 0 : weights[cardId]) || 1;
841
- return acc;
842
- }, 0);
843
- const totalPointsAwarded = Object.keys((scores == null ? void 0 : scores.cards) || {}).reduce((acc, cardId) => {
844
- var _a, _b;
845
- const cardScores = (_a = scores == null ? void 0 : scores.cards) == null ? void 0 : _a[cardId];
846
- if ((cardScores == null ? void 0 : cardScores.completed) || (cardScores == null ? void 0 : cardScores.score) || (cardScores == null ? void 0 : cardScores.score) === 0) {
847
- const score2 = (cardScores == null ? void 0 : cardScores.score) || (cardScores == null ? void 0 : cardScores.score) === 0 ? Number((_b = cardScores == null ? void 0 : cardScores.score) != null ? _b : 0) : null;
848
- const weight = (weights == null ? void 0 : weights[cardId]) || 1;
849
- const fraction = (score2 != null ? score2 : 0) / 100;
850
- if (score2 || score2 === 0) {
851
- acc += weight * fraction;
852
- } else {
853
- acc += weight;
854
- }
855
- }
856
- return acc;
857
- }, 0);
858
- const totalCompletedCards = Object.keys((scores == null ? void 0 : scores.cards) || {}).reduce((acc, cardId) => {
859
- var _a;
860
- const cardScores = (_a = scores == null ? void 0 : scores.cards) == null ? void 0 : _a[cardId];
861
- if ((cardScores == null ? void 0 : cardScores.completed) || (cardScores == null ? void 0 : cardScores.score) || (cardScores == null ? void 0 : cardScores.score) === 0) {
862
- acc += 1;
863
- }
864
- return acc;
865
- }, 0);
866
- const percent = totalPointsAwarded / totalSetPoints;
867
- const score = Math.round(percent * 100);
868
- const progress = Math.round(totalCompletedCards / (cardsList.length || 1) * 100);
869
- return { score, progress };
870
- };
871
- var calculateScoreAndProgress_default = calculateScoreAndProgress;
872
-
873
447
  // src/domains/assignment/services/update-score.service.ts
874
448
  async function _updateScore(params) {
875
449
  const path = params.isAssignment ? refsAssignmentFiresotre.assignmentScores({
@@ -1314,120 +888,6 @@ function useSubmitPracticeScore() {
1314
888
  // src/domains/cards/card.hooks.ts
1315
889
  import { useMutation as useMutation2, useQueries, useQuery as useQuery3 } from "@tanstack/react-query";
1316
890
  import { useMemo } from "react";
1317
-
1318
- // src/domains/cards/card.constants.ts
1319
- var CARDS_COLLECTION = "flashcards";
1320
- var refsCardsFiresotre = {
1321
- allCards: CARDS_COLLECTION,
1322
- card: (id) => `${CARDS_COLLECTION}/${id}`
1323
- };
1324
-
1325
- // src/domains/cards/services/get-card.service.ts
1326
- async function _getCard(params) {
1327
- const ref = refsCardsFiresotre.card(params.cardId);
1328
- const response = await api.getDoc(ref);
1329
- if (!response.data) return null;
1330
- return response.data;
1331
- }
1332
- var getCard = withErrorHandler(_getCard, "getCard");
1333
-
1334
- // src/domains/cards/services/create-card.service.ts
1335
- import { v4 } from "uuid";
1336
-
1337
- // src/utils/text-utils.ts
1338
- import sha1 from "js-sha1";
1339
- var purify = (word) => {
1340
- return word.normalize("NFD").replace(/\/([^" "]*)/g, "").replace(/\([^()]*\)/g, "").replace(/([^()]*)/g, "").replace(/[\u0300-\u036f]/g, "").replace(/[-]/g, " ").replace(/[.,/#!¡¿?؟。,.?$%^&*;:{}=\-_`~()’'…\s]/g, "").replace(/\s\s+/g, " ").toLowerCase().trim();
1341
- };
1342
- var cleanString = (words) => {
1343
- const splitWords = words == null ? void 0 : words.split("+");
1344
- if (splitWords && splitWords.length === 1) {
1345
- const newWord = purify(words);
1346
- return newWord;
1347
- } else if (splitWords && splitWords.length > 1) {
1348
- const split = splitWords.map((w) => purify(w));
1349
- return split;
1350
- } else {
1351
- return "";
1352
- }
1353
- };
1354
- var getWordHash = (word, language) => {
1355
- const cleanedWord = cleanString(word);
1356
- const wordHash = sha1(`${language}-${cleanedWord}`);
1357
- console.log("wordHash core library", wordHash);
1358
- return wordHash;
1359
- };
1360
-
1361
- // src/domains/cards/services/get-card-verification-status.service.ts
1362
- var charactarLanguages = ["zh", "ja", "ko"];
1363
- var getVerificationStatus = async (target_text, language) => {
1364
- if ((target_text == null ? void 0 : target_text.length) < 3 && !charactarLanguages.includes(language)) {
1365
- return "NOT_RECOMMENDED" /* NOT_RECOMMENDED */;
1366
- }
1367
- const hash = getWordHash(target_text, language);
1368
- const response = await api.getDoc(`checked-pronunciations/${hash}`);
1369
- try {
1370
- if (response.data) {
1371
- return processRecord(response.data);
1372
- } else {
1373
- return "NOT_CHECKED" /* NOT_CHECKED */;
1374
- }
1375
- } catch (e) {
1376
- return "NOT_CHECKED" /* NOT_CHECKED */;
1377
- }
1378
- };
1379
- var processRecord = (data) => {
1380
- const { pronunciations = 0, fails = 0 } = data;
1381
- const attempts = pronunciations + fails;
1382
- const successRate = attempts > 0 ? pronunciations / attempts * 100 : 0;
1383
- let newStatus = null;
1384
- if (attempts < 6) {
1385
- return "NOT_CHECKED" /* NOT_CHECKED */;
1386
- }
1387
- if (successRate > 25) {
1388
- newStatus = "VERIFIED" /* VERIFIED */;
1389
- } else if (successRate > 10) {
1390
- newStatus = "WARNING" /* WARNING */;
1391
- } else if (fails > 20 && successRate < 10 && pronunciations > 1) {
1392
- newStatus = "NOT_RECOMMENDED" /* NOT_RECOMMENDED */;
1393
- } else if (pronunciations === 0 && fails > 20) {
1394
- newStatus = "NOT_WORKING" /* NOT_WORKING */;
1395
- } else {
1396
- newStatus = "NOT_CHECKED" /* NOT_CHECKED */;
1397
- }
1398
- return newStatus;
1399
- };
1400
-
1401
- // src/domains/cards/services/create-card.service.ts
1402
- async function _createCard({ data }) {
1403
- const response = await api.addDoc(refsCardsFiresotre.allCards, data);
1404
- return response;
1405
- }
1406
- var createCard = withErrorHandler(_createCard, "createCard");
1407
- async function _createCards({ cards }) {
1408
- const { writeBatch, doc } = api.accessHelpers();
1409
- const batch = writeBatch();
1410
- const cardsWithId = [];
1411
- for (const card of cards) {
1412
- const cardId = v4();
1413
- const ref = doc(refsCardsFiresotre.card(cardId));
1414
- const newCardObject = {
1415
- ...card,
1416
- id: cardId
1417
- };
1418
- if (card.type === "READ_REPEAT" /* READ_REPEAT */ && card.target_text && card.language) {
1419
- const verificationStatus = await getVerificationStatus(card.target_text, card.language);
1420
- newCardObject.verificationStatus = verificationStatus || null;
1421
- }
1422
- cardsWithId.push(newCardObject);
1423
- batch.set(ref, newCardObject);
1424
- }
1425
- await batch.commit();
1426
- return cardsWithId;
1427
- }
1428
- var createCards = withErrorHandler(_createCards, "createCards");
1429
-
1430
- // src/domains/cards/card.hooks.ts
1431
891
  var cardsQueryKeys = {
1432
892
  all: ["cards"],
1433
893
  one: (params) => [...cardsQueryKeys.all, params.cardId]
@@ -1504,22 +964,6 @@ function useGetCard({ cardId, enabled = true }) {
1504
964
 
1505
965
  // src/domains/sets/set.hooks.ts
1506
966
  import { useQuery as useQuery4 } from "@tanstack/react-query";
1507
-
1508
- // src/domains/sets/set.constants.ts
1509
- var SETS_COLLECTION = "sets";
1510
- var refsSetsFirestore = {
1511
- allSets: SETS_COLLECTION,
1512
- set: (id) => `${SETS_COLLECTION}/${id}`
1513
- };
1514
-
1515
- // src/domains/sets/services/get-set.service.ts
1516
- async function _getSet({ setId }) {
1517
- const response = await api.getDoc(refsSetsFirestore.set(setId));
1518
- return response.data;
1519
- }
1520
- var getSet = withErrorHandler(_getSet, "getSet");
1521
-
1522
- // src/domains/sets/set.hooks.ts
1523
967
  var setsQueryKeys = {
1524
968
  all: ["sets"],
1525
969
  one: (params) => [...setsQueryKeys.all, params.setId]