@speakableio/core 1.0.54 → 1.0.55

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.
package/dist/analytics.js CHANGED
@@ -137,8 +137,10 @@ var logGradingStandardLog = (data) => {
137
137
  };
138
138
 
139
139
  // src/constants/analytics.constants.ts
140
- var ANALYTICS_EVENT_TYPES = {
140
+ var SPEAKABLE_ANALYTICS = {
141
141
  VOICE_SUCCESS: "voice_success",
142
+ VOICE_FALLBACK_SUCCESS: "voice_fallback_success",
143
+ VOICE_FALLBACK_FAIL: "voice_fallback_fail",
142
144
  VOICE_FAIL: "voice_fail",
143
145
  RESPOND_CARD_SUCCESS: "respond_card_success",
144
146
  RESPOND_CARD_FAIL: "respond_card_fail",
@@ -184,45 +186,45 @@ var logOpenActivityPreview = (data = {}) => {
184
186
  var logSubmitAssignment = (data = {}) => {
185
187
  var _a, _b, _c;
186
188
  (_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, "handleCouresAnalyticsEvent")) == null ? void 0 : _c({
187
- eventType: ANALYTICS_EVENT_TYPES.SUBMISSION,
189
+ eventType: SPEAKABLE_ANALYTICS.SUBMISSION,
188
190
  ...data
189
191
  });
190
- api.logEvent(ANALYTICS_EVENT_TYPES.SUBMISSION, data);
192
+ api.logEvent(SPEAKABLE_ANALYTICS.SUBMISSION, data);
191
193
  };
192
194
  var logCreateAssignment = (data = {}) => {
193
195
  var _a, _b, _c;
194
196
  if (data.courseId) {
195
197
  (_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, "handleCouresAnalyticsEvent")) == null ? void 0 : _c({
196
- eventType: ANALYTICS_EVENT_TYPES.CREATE_ASSIGNMENT,
198
+ eventType: SPEAKABLE_ANALYTICS.CREATE_ASSIGNMENT,
197
199
  ...data
198
200
  });
199
201
  }
200
- api.logEvent(ANALYTICS_EVENT_TYPES.CREATE_ASSIGNMENT, data);
202
+ api.logEvent(SPEAKABLE_ANALYTICS.CREATE_ASSIGNMENT, data);
201
203
  };
202
204
  var logStartAssignment = (data = {}) => {
203
205
  var _a, _b, _c;
204
206
  if (data.courseId) {
205
207
  (_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, "handleCouresAnalyticsEvent")) == null ? void 0 : _c({
206
- eventType: ANALYTICS_EVENT_TYPES.ASSIGNMENT_STARTED,
208
+ eventType: SPEAKABLE_ANALYTICS.ASSIGNMENT_STARTED,
207
209
  ...data
208
210
  });
209
211
  }
210
- api.logEvent(ANALYTICS_EVENT_TYPES.ASSIGNMENT_STARTED, data);
212
+ api.logEvent(SPEAKABLE_ANALYTICS.ASSIGNMENT_STARTED, data);
211
213
  };
212
214
  var logViewScoresModal = (data = {}) => {
213
- api.logEvent(ANALYTICS_EVENT_TYPES.VIEW_SCORES_MODAL, data);
215
+ api.logEvent(SPEAKABLE_ANALYTICS.VIEW_SCORES_MODAL, data);
214
216
  };
215
217
  var logViewMedia = (data = {}) => {
216
- api.logEvent(ANALYTICS_EVENT_TYPES.VIEW_MEDIA, data);
218
+ api.logEvent(SPEAKABLE_ANALYTICS.VIEW_MEDIA, data);
217
219
  };
218
220
  var logViewScores = (data = {}) => {
219
- api.logEvent(ANALYTICS_EVENT_TYPES.VIEW_SCORES, data);
221
+ api.logEvent(SPEAKABLE_ANALYTICS.VIEW_SCORES, data);
220
222
  };
221
223
  var logViewGradingMethod = (data = {}) => {
222
- api.logEvent(ANALYTICS_EVENT_TYPES.VIEW_GRADING_METHOD, data);
224
+ api.logEvent(SPEAKABLE_ANALYTICS.VIEW_GRADING_METHOD, data);
223
225
  };
224
226
  var logViewFeedback = (data = {}) => {
225
- api.logEvent(ANALYTICS_EVENT_TYPES.VIEW_FEEDBACK, data);
227
+ api.logEvent(SPEAKABLE_ANALYTICS.VIEW_FEEDBACK, data);
226
228
  };
227
229
 
228
230
  // src/lib/firebase/firebase-analytics/page-analytics.ts
@@ -231,51 +233,51 @@ var logRepeatSuccess = (data = {}) => {
231
233
  var _a, _b, _c;
232
234
  if (data.courseId) {
233
235
  (_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, HANDLE_COURSE_ANALYTICS_EVENT)) == null ? void 0 : _c({
234
- eventType: ANALYTICS_EVENT_TYPES.VOICE_SUCCESS,
236
+ eventType: SPEAKABLE_ANALYTICS.VOICE_SUCCESS,
235
237
  ...data,
236
238
  courseId: data.courseId
237
239
  });
238
240
  }
239
- api.logEvent(ANALYTICS_EVENT_TYPES.VOICE_SUCCESS, data);
241
+ api.logEvent(SPEAKABLE_ANALYTICS.VOICE_SUCCESS, data);
240
242
  };
241
243
  var logRepeatFail = (data = {}) => {
242
244
  var _a, _b, _c;
243
245
  if (data.courseId) {
244
246
  (_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, HANDLE_COURSE_ANALYTICS_EVENT)) == null ? void 0 : _c({
245
- eventType: ANALYTICS_EVENT_TYPES.VOICE_FAIL,
247
+ eventType: SPEAKABLE_ANALYTICS.VOICE_FAIL,
246
248
  ...data,
247
249
  courseId: data.courseId
248
250
  });
249
251
  }
250
- api.logEvent(ANALYTICS_EVENT_TYPES.VOICE_FAIL, data);
252
+ api.logEvent(SPEAKABLE_ANALYTICS.VOICE_FAIL, data);
251
253
  };
252
254
  var logRespondSuccess = (data) => {
253
255
  var _a, _b, _c;
254
256
  if (data.courseId) {
255
257
  (_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, HANDLE_COURSE_ANALYTICS_EVENT)) == null ? void 0 : _c({
256
- eventType: ANALYTICS_EVENT_TYPES.RESPOND_CARD_SUCCESS,
258
+ eventType: SPEAKABLE_ANALYTICS.RESPOND_CARD_SUCCESS,
257
259
  ...data,
258
260
  courseId: data.courseId
259
261
  });
260
262
  }
261
- api.logEvent(ANALYTICS_EVENT_TYPES.RESPOND_CARD_SUCCESS, data);
263
+ api.logEvent(SPEAKABLE_ANALYTICS.RESPOND_CARD_SUCCESS, data);
262
264
  };
263
265
  var logRespondFail = (data) => {
264
266
  var _a, _b, _c;
265
267
  if (data.courseId) {
266
268
  (_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, HANDLE_COURSE_ANALYTICS_EVENT)) == null ? void 0 : _c({
267
- eventType: ANALYTICS_EVENT_TYPES.RESPOND_CARD_FAIL,
269
+ eventType: SPEAKABLE_ANALYTICS.RESPOND_CARD_FAIL,
268
270
  ...data,
269
271
  courseId: data.courseId
270
272
  });
271
273
  }
272
- api.logEvent(ANALYTICS_EVENT_TYPES.RESPOND_CARD_FAIL, data);
274
+ api.logEvent(SPEAKABLE_ANALYTICS.RESPOND_CARD_FAIL, data);
273
275
  };
274
276
  var logRespondSubmitted = (data) => {
275
- api.logEvent(ANALYTICS_EVENT_TYPES.RESPOND_CARD_SUBMITTED, data);
277
+ api.logEvent(SPEAKABLE_ANALYTICS.RESPOND_CARD_SUBMITTED, data);
276
278
  };
277
279
  var logRespondError = (errorDetails) => {
278
- api.logEvent(ANALYTICS_EVENT_TYPES.RESPOND_CARD_ERROR, {
280
+ api.logEvent(SPEAKABLE_ANALYTICS.RESPOND_CARD_ERROR, {
279
281
  errorDetails
280
282
  });
281
283
  };
@@ -283,29 +285,29 @@ var logWrittenResponseSuccess = (data) => {
283
285
  var _a, _b, _c;
284
286
  if (data.courseId) {
285
287
  (_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, HANDLE_COURSE_ANALYTICS_EVENT)) == null ? void 0 : _c({
286
- eventType: ANALYTICS_EVENT_TYPES.RESPOND_WRITE_CARD_SUCCESS,
288
+ eventType: SPEAKABLE_ANALYTICS.RESPOND_WRITE_CARD_SUCCESS,
287
289
  ...data,
288
290
  courseId: data.courseId
289
291
  });
290
292
  }
291
- api.logEvent(ANALYTICS_EVENT_TYPES.RESPOND_WRITE_CARD_SUCCESS, data);
293
+ api.logEvent(SPEAKABLE_ANALYTICS.RESPOND_WRITE_CARD_SUCCESS, data);
292
294
  };
293
295
  var logWrittenResponseFail = (data) => {
294
296
  var _a, _b, _c;
295
297
  if (data.courseId) {
296
298
  (_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, HANDLE_COURSE_ANALYTICS_EVENT)) == null ? void 0 : _c({
297
- eventType: ANALYTICS_EVENT_TYPES.RESPOND_WRITE_CARD_FAIL,
299
+ eventType: SPEAKABLE_ANALYTICS.RESPOND_WRITE_CARD_FAIL,
298
300
  ...data,
299
301
  courseId: data.courseId
300
302
  });
301
303
  }
302
- api.logEvent(ANALYTICS_EVENT_TYPES.RESPOND_WRITE_CARD_FAIL, data);
304
+ api.logEvent(SPEAKABLE_ANALYTICS.RESPOND_WRITE_CARD_FAIL, data);
303
305
  };
304
306
  var logWrittenResponseSubmitted = (data = {}) => {
305
- api.logEvent(ANALYTICS_EVENT_TYPES.RESPOND_WRITE_CARD_SUBMITTED, data);
307
+ api.logEvent(SPEAKABLE_ANALYTICS.RESPOND_WRITE_CARD_SUBMITTED, data);
306
308
  };
307
309
  var logWrittenResponseError = (errorDetails) => {
308
- api.logEvent(ANALYTICS_EVENT_TYPES.RESPOND_WRITE_CARD_ERROR, {
310
+ api.logEvent(SPEAKABLE_ANALYTICS.RESPOND_WRITE_CARD_ERROR, {
309
311
  errorDetails
310
312
  });
311
313
  };
@@ -313,46 +315,46 @@ var logFreePlanRespond = (data) => {
313
315
  var _a, _b, _c;
314
316
  if (data.courseId) {
315
317
  (_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, HANDLE_COURSE_ANALYTICS_EVENT)) == null ? void 0 : _c({
316
- eventType: ANALYTICS_EVENT_TYPES.RESPOND_FREE_PLAN,
318
+ eventType: SPEAKABLE_ANALYTICS.RESPOND_FREE_PLAN,
317
319
  ...data,
318
320
  courseId: data.courseId
319
321
  });
320
322
  }
321
- api.logEvent(ANALYTICS_EVENT_TYPES.RESPOND_FREE_PLAN, data);
323
+ api.logEvent(SPEAKABLE_ANALYTICS.RESPOND_FREE_PLAN, data);
322
324
  };
323
325
  var logFreePlanWrittenResponse = (data) => {
324
326
  var _a, _b, _c;
325
327
  if (data.courseId) {
326
328
  (_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, HANDLE_COURSE_ANALYTICS_EVENT)) == null ? void 0 : _c({
327
- eventType: ANALYTICS_EVENT_TYPES.RESPOND_WRITE_FREE_PLAN,
329
+ eventType: SPEAKABLE_ANALYTICS.RESPOND_WRITE_FREE_PLAN,
328
330
  ...data,
329
331
  courseId: data.courseId
330
332
  });
331
333
  }
332
- api.logEvent(ANALYTICS_EVENT_TYPES.RESPOND_WRITE_FREE_PLAN, data);
334
+ api.logEvent(SPEAKABLE_ANALYTICS.RESPOND_WRITE_FREE_PLAN, data);
333
335
  };
334
336
  var logMultipleChoiceSuccess = (data) => {
335
337
  var _a, _b, _c;
336
338
  if (data.courseId) {
337
339
  (_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, HANDLE_COURSE_ANALYTICS_EVENT)) == null ? void 0 : _c({
338
- eventType: ANALYTICS_EVENT_TYPES.MC_SUCCESS,
340
+ eventType: SPEAKABLE_ANALYTICS.MC_SUCCESS,
339
341
  courseId: data.courseId
340
342
  });
341
343
  }
342
- api.logEvent(ANALYTICS_EVENT_TYPES.MC_SUCCESS, data);
344
+ api.logEvent(SPEAKABLE_ANALYTICS.MC_SUCCESS, data);
343
345
  };
344
346
  var logMultipleChoiceFail = (data) => {
345
347
  var _a, _b, _c;
346
348
  if (data.courseId) {
347
349
  (_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, HANDLE_COURSE_ANALYTICS_EVENT)) == null ? void 0 : _c({
348
- eventType: ANALYTICS_EVENT_TYPES.MC_FAIL,
350
+ eventType: SPEAKABLE_ANALYTICS.MC_FAIL,
349
351
  courseId: data.courseId
350
352
  });
351
353
  }
352
- api.logEvent(ANALYTICS_EVENT_TYPES.MC_FAIL, data);
354
+ api.logEvent(SPEAKABLE_ANALYTICS.MC_FAIL, data);
353
355
  };
354
356
  var logMultipleChoiceError = (errorDetails) => {
355
- api.logEvent(ANALYTICS_EVENT_TYPES.MC_ERROR, {
357
+ api.logEvent(SPEAKABLE_ANALYTICS.MC_ERROR, {
356
358
  errorDetails
357
359
  });
358
360
  };
@@ -360,26 +362,26 @@ var logShortAnswerSuccess = (data) => {
360
362
  var _a, _b, _c;
361
363
  if (data.courseId) {
362
364
  (_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, HANDLE_COURSE_ANALYTICS_EVENT)) == null ? void 0 : _c({
363
- eventType: ANALYTICS_EVENT_TYPES.SHORT_ANSWER_SUCCESS,
365
+ eventType: SPEAKABLE_ANALYTICS.SHORT_ANSWER_SUCCESS,
364
366
  ...data,
365
367
  courseId: data.courseId
366
368
  });
367
369
  }
368
- api.logEvent(ANALYTICS_EVENT_TYPES.SHORT_ANSWER_SUCCESS, data);
370
+ api.logEvent(SPEAKABLE_ANALYTICS.SHORT_ANSWER_SUCCESS, data);
369
371
  };
370
372
  var logShortAnswerFail = (data) => {
371
373
  var _a, _b, _c;
372
374
  if (data.courseId) {
373
375
  (_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, HANDLE_COURSE_ANALYTICS_EVENT)) == null ? void 0 : _c({
374
- eventType: ANALYTICS_EVENT_TYPES.SHORT_ANSWER_FAIL,
376
+ eventType: SPEAKABLE_ANALYTICS.SHORT_ANSWER_FAIL,
375
377
  ...data,
376
378
  courseId: data.courseId
377
379
  });
378
380
  }
379
- api.logEvent(ANALYTICS_EVENT_TYPES.SHORT_ANSWER_FAIL, data);
381
+ api.logEvent(SPEAKABLE_ANALYTICS.SHORT_ANSWER_FAIL, data);
380
382
  };
381
383
  var logShortAnswerError = (errorDetails) => {
382
- api.logEvent(ANALYTICS_EVENT_TYPES.SHORT_ANSWER_ERROR, {
384
+ api.logEvent(SPEAKABLE_ANALYTICS.SHORT_ANSWER_ERROR, {
383
385
  errorDetails
384
386
  });
385
387
  };
@@ -387,15 +389,15 @@ var logRetry = (data) => {
387
389
  var _a, _b, _c;
388
390
  if (data.courseId) {
389
391
  (_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, HANDLE_COURSE_ANALYTICS_EVENT)) == null ? void 0 : _c({
390
- eventType: ANALYTICS_EVENT_TYPES.RETRY,
392
+ eventType: SPEAKABLE_ANALYTICS.RETRY,
391
393
  ...data,
392
394
  courseId: data.courseId
393
395
  });
394
396
  }
395
- api.logEvent(ANALYTICS_EVENT_TYPES.RETRY, data);
397
+ api.logEvent(SPEAKABLE_ANALYTICS.RETRY, data);
396
398
  };
397
399
  var logViewDetailsClick = (data = {}) => {
398
- api.logEvent(ANALYTICS_EVENT_TYPES.VIEW_DETAILS_CLICK, data);
400
+ api.logEvent(SPEAKABLE_ANALYTICS.VIEW_DETAILS_CLICK, data);
399
401
  };
400
402
 
401
403
  // src/lib/firebase/firebase-analytics/message.ts
@@ -404,15 +406,15 @@ var logMessageSent = (data = {}) => {
404
406
  var _a, _b, _c;
405
407
  if (data.courseId) {
406
408
  (_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, HANDLE_COURSE_ANALYTICS_EVENT2)) == null ? void 0 : _c({
407
- eventType: ANALYTICS_EVENT_TYPES.MESSAGE_SENT,
409
+ eventType: SPEAKABLE_ANALYTICS.MESSAGE_SENT,
408
410
  ...data,
409
411
  courseId: data.courseId
410
412
  });
411
413
  }
412
- api.logEvent(ANALYTICS_EVENT_TYPES.MESSAGE_SENT, data);
414
+ api.logEvent(SPEAKABLE_ANALYTICS.MESSAGE_SENT, data);
413
415
  };
414
416
  var logMessageError = (errorDetails = {}) => {
415
- api.logEvent(ANALYTICS_EVENT_TYPES.MESSAGE_ERROR, {
417
+ api.logEvent(SPEAKABLE_ANALYTICS.MESSAGE_ERROR, {
416
418
  errorDetails
417
419
  });
418
420
  };
@@ -423,12 +425,12 @@ var logTabsClick = (data = {}) => {
423
425
  var _a, _b, _c;
424
426
  if (data.courseId) {
425
427
  (_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, HANDLE_COURSE_ANALYTICS_EVENT3)) == null ? void 0 : _c({
426
- eventType: ANALYTICS_EVENT_TYPES.TABS_CLICK,
428
+ eventType: SPEAKABLE_ANALYTICS.TABS_CLICK,
427
429
  ...data,
428
430
  courseId: data.courseId
429
431
  });
430
432
  }
431
- api.logEvent(ANALYTICS_EVENT_TYPES.TABS_CLICK, data);
433
+ api.logEvent(SPEAKABLE_ANALYTICS.TABS_CLICK, data);
432
434
  };
433
435
  export {
434
436
  logCreateAssignment,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/firebase/api.ts","../src/lib/firebase/firebase-analytics/grading-standard.ts","../src/constants/analytics.constants.ts","../src/lib/firebase/firebase-analytics/assignment.ts","../src/lib/firebase/firebase-analytics/page-analytics.ts","../src/lib/firebase/firebase-analytics/message.ts","../src/lib/firebase/firebase-analytics/tabs.ts"],"sourcesContent":["import { type CallableFunction, type FirestoreHelpers } from '@core/types/firebase.types'\nimport {\n type SetOptions,\n type DocumentData,\n type QueryConstraint,\n type WithFieldValue,\n type Firestore,\n} from 'firebase/firestore'\n\ninterface FirebaseConfig {\n db: Firestore\n helpers: FirestoreHelpers\n httpsCallable: (name: string) => CallableFunction\n logEvent: (name: string, data: any) => void\n}\n\ntype FirebasePath = string\n\nexport class FirebaseAPI {\n private static instance: FirebaseAPI\n private config: FirebaseConfig | null = null\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n private constructor() {\n // Private constructor for singleton pattern\n }\n\n static getInstance(): FirebaseAPI {\n if (!FirebaseAPI.instance) {\n FirebaseAPI.instance = new FirebaseAPI()\n }\n\n return FirebaseAPI.instance\n }\n\n initialize(config: FirebaseConfig) {\n this.config = config\n }\n\n get db() {\n if (!this.config) throw new Error('Firebase API not initialized')\n\n return this.config.db\n }\n\n get helpers() {\n if (!this.config) throw new Error('Firebase API not initialized')\n\n return this.config.helpers\n }\n\n get httpsCallable() {\n return this.config?.httpsCallable\n }\n\n logEvent(name: string, data: any) {\n this.config?.logEvent(name, data)\n }\n\n accessQueryConstraints() {\n const { query, orderBy, limit, startAt, startAfter, endAt, endBefore, where, increment } =\n this.helpers\n\n return {\n query,\n orderBy,\n limit,\n startAt,\n startAfter,\n endAt,\n endBefore,\n where,\n increment,\n }\n }\n\n accessHelpers() {\n const { doc, collection, writeBatch, serverTimestamp, setDoc } = this.helpers\n\n return {\n doc: (path: FirebasePath) => doc(this.db, path),\n collection: (path: FirebasePath) => collection(this.db, path),\n writeBatch: () => writeBatch(this.db),\n serverTimestamp: serverTimestamp,\n setDoc: setDoc,\n }\n }\n\n async getDoc<T>(path: FirebasePath) {\n const { getDoc, doc } = this.helpers\n\n const docRef = doc(this.db, path)\n const docSnap = await getDoc(docRef)\n\n const data = docSnap.exists()\n ? ({\n ...docSnap.data(),\n id: docSnap.id,\n } as T)\n : null\n\n return {\n id: docSnap.id,\n data,\n }\n }\n\n async getDocs<T>(path: FirebasePath, ...queryConstraints: QueryConstraint[]) {\n const { getDocs, query, collection } = this.helpers\n const collectionRef = collection(this.db, path)\n const q =\n queryConstraints.length > 0 ? query(collectionRef, ...queryConstraints) : collectionRef\n\n const querySnapshot = await getDocs(q)\n\n const data = querySnapshot.docs.map(doc => ({\n data: doc.data() as T,\n id: doc.id,\n }))\n\n return {\n data: data as unknown as (T & {\n id: string\n })[],\n querySnapshot,\n empty: querySnapshot.empty,\n }\n }\n\n async addDoc<T extends WithFieldValue<DocumentData>>(\n path: FirebasePath,\n data: T,\n ): Promise<{ id: string } & T> {\n const { addDoc, collection } = this.helpers\n const collectionRef = collection(this.db, path)\n const docRef = await addDoc(collectionRef, data)\n\n return {\n ...data,\n id: docRef.id,\n }\n }\n\n async setDoc<T extends WithFieldValue<DocumentData>>(\n path: FirebasePath,\n data: T,\n options: SetOptions = {},\n ): Promise<void> {\n const { setDoc, doc } = this.helpers\n const docRef = doc(this.db, path)\n\n await setDoc(docRef, data, options)\n }\n\n async updateDoc(path: FirebasePath, data: any): Promise<void> {\n const { updateDoc, doc } = this.helpers\n\n const docRef = doc(this.db, path)\n\n await updateDoc(docRef, data)\n }\n\n async deleteDoc(path: FirebasePath): Promise<void> {\n const { deleteDoc, doc } = this.helpers\n const docRef = doc(this.db, path)\n\n await deleteDoc(docRef)\n }\n\n async runTransaction<T>(updateFunction: (transaction: any) => Promise<T>): Promise<T> {\n const { runTransaction } = this.helpers\n\n return runTransaction(this.db, updateFunction)\n }\n\n async runBatch(operations: (() => Promise<void>)[]): Promise<void> {\n const { writeBatch } = this.helpers\n const batch = writeBatch(this.db)\n\n await Promise.all(operations.map(op => op()))\n await batch.commit()\n }\n\n writeBatch() {\n const { writeBatch } = this.helpers\n\n const batch = writeBatch(this.db)\n\n return batch\n }\n}\n\nexport const api = FirebaseAPI.getInstance()\n","import { type GradingStandard } from '@core/services/add-grading-standard'\n\nimport { api } from '../api'\n\nexport const logGradingStandardLog = (data: {\n type: GradingStandard['type']\n level?: GradingStandard['level']\n courseId?: GradingStandard['courseId']\n}) => {\n if (data.courseId && data.type && data.level) {\n api.httpsCallable?.('handleCouresAnalyticsEvent')?.({\n eventType: data.type || 'custom',\n level: data.level,\n courseId: data.courseId,\n })\n }\n api.logEvent('logGradingStandard', data)\n}\n","// Event constants\nexport const ANALYTICS_EVENT_TYPES = {\n VOICE_SUCCESS: 'voice_success',\n VOICE_FAIL: 'voice_fail',\n RESPOND_CARD_SUCCESS: 'respond_card_success',\n RESPOND_CARD_FAIL: 'respond_card_fail',\n RESPOND_WRITE_CARD_SUCCESS: 'respond_write_card_success',\n RESPOND_WRITE_CARD_FAIL: 'respond_write_card_fail',\n RESPOND_WRITE_CARD_SUBMITTED: 'respond_write_card_submitted',\n RESPOND_WRITE_CARD_ERROR: 'respond_write_card_error',\n RESPOND_CARD_ERROR: 'respond_card_error',\n RESPOND_CARD_SUBMITTED: 'respond_card_submitted',\n RESPOND_FREE_PLAN: 'respond_free_plan',\n RESPOND_WRITE_FREE_PLAN: 'respond_write_free_plan',\n SUBMISSION: 'assignment_submitted',\n ASSIGNMENT_STARTED: 'assignment_started',\n CREATE_ASSIGNMENT: 'create_assignment',\n MC_SUCCESS: 'multiple_choice_success',\n MC_FAIL: 'multiple_choice_fail',\n MC_ERROR: 'multiple_choice_error',\n ACTFL_LEVEL: 'actfl_level',\n WIDA_LEVEL: 'wida_level',\n // New events\n VIEW_SCORES_MODAL: 'view_scores_modal',\n SHORT_ANSWER_SUCCESS: 'short_answer_success',\n SHORT_ANSWER_FAIL: 'short_answer_fail',\n SHORT_ANSWER_ERROR: 'short_answer_error',\n RETRY: 'retry',\n MESSAGE_SENT: 'message_sent',\n MESSAGE_ERROR: 'message_error',\n VIEW_DETAILS_CLICK: 'view_details_click',\n TABS_CLICK: 'tabs_click',\n VIEW_MEDIA: 'view_media',\n VIEW_SCORES: 'view_scores',\n VIEW_GRADING_METHOD: 'view_grading_method',\n VIEW_FEEDBACK: 'view_feedback',\n} as const\n","import { ANALYTICS_EVENT_TYPES } from '@core/constants/analytics.constants'\n\nimport { api } from '../api'\n\nexport const logOpenAssignment = (data = {}) => {\n api.logEvent('open_assignment', data)\n}\n\nexport const logOpenActivityPreview = (data = {}) => {\n api.logEvent('open_activity_preview', data)\n}\n\nexport const logSubmitAssignment = (data = {}) => {\n api.httpsCallable?.('handleCouresAnalyticsEvent')?.({\n eventType: ANALYTICS_EVENT_TYPES.SUBMISSION,\n ...data,\n })\n api.logEvent(ANALYTICS_EVENT_TYPES.SUBMISSION, data)\n}\n\nexport const logCreateAssignment = (data = {}) => {\n // @ts-ignore\n if (data.courseId) {\n api.httpsCallable?.('handleCouresAnalyticsEvent')?.({\n eventType: ANALYTICS_EVENT_TYPES.CREATE_ASSIGNMENT,\n ...data,\n })\n }\n api.logEvent(ANALYTICS_EVENT_TYPES.CREATE_ASSIGNMENT, data)\n}\n\nexport const logStartAssignment = (data = {}) => {\n // @ts-ignore\n if (data.courseId) {\n api.httpsCallable?.('handleCouresAnalyticsEvent')?.({\n eventType: ANALYTICS_EVENT_TYPES.ASSIGNMENT_STARTED,\n ...data,\n })\n }\n api.logEvent(ANALYTICS_EVENT_TYPES.ASSIGNMENT_STARTED, data)\n}\n\nexport const logViewScoresModal = (data = {}) => {\n api.logEvent(ANALYTICS_EVENT_TYPES.VIEW_SCORES_MODAL, data)\n}\n\nexport const logViewMedia = (data = {}) => {\n api.logEvent(ANALYTICS_EVENT_TYPES.VIEW_MEDIA, data)\n}\n\nexport const logViewScores = (data = {}) => {\n api.logEvent(ANALYTICS_EVENT_TYPES.VIEW_SCORES, data)\n}\n\nexport const logViewGradingMethod = (data = {}) => {\n api.logEvent(ANALYTICS_EVENT_TYPES.VIEW_GRADING_METHOD, data)\n}\n\nexport const logViewFeedback = (data = {}) => {\n api.logEvent(ANALYTICS_EVENT_TYPES.VIEW_FEEDBACK, data)\n}\n","import { ANALYTICS_EVENT_TYPES } from '@core/constants/analytics.constants'\n\nimport { api } from '../api'\n\nconst HANDLE_COURSE_ANALYTICS_EVENT = 'handleCouresAnalyticsEvent'\n\nexport const logRepeatSuccess = (\n data: {\n courseId?: string\n [key: string]: any\n } = {},\n) => {\n if (data.courseId) {\n api.httpsCallable?.(HANDLE_COURSE_ANALYTICS_EVENT)?.({\n eventType: ANALYTICS_EVENT_TYPES.VOICE_SUCCESS,\n ...data,\n courseId: data.courseId,\n })\n }\n\n api.logEvent(ANALYTICS_EVENT_TYPES.VOICE_SUCCESS, data)\n}\n\nexport const logRepeatFail = (\n data: {\n courseId?: string\n [key: string]: any\n } = {},\n) => {\n if (data.courseId) {\n api.httpsCallable?.(HANDLE_COURSE_ANALYTICS_EVENT)?.({\n eventType: ANALYTICS_EVENT_TYPES.VOICE_FAIL,\n ...data,\n courseId: data.courseId,\n })\n }\n\n api.logEvent(ANALYTICS_EVENT_TYPES.VOICE_FAIL, data)\n}\n\nexport const logRespondSuccess = (data: { courseId?: string; [key: string]: any }) => {\n if (data.courseId) {\n api.httpsCallable?.(HANDLE_COURSE_ANALYTICS_EVENT)?.({\n eventType: ANALYTICS_EVENT_TYPES.RESPOND_CARD_SUCCESS,\n ...data,\n courseId: data.courseId,\n })\n }\n api.logEvent(ANALYTICS_EVENT_TYPES.RESPOND_CARD_SUCCESS, data)\n}\n\nexport const logRespondFail = (data: { courseId?: string; [key: string]: any }) => {\n if (data.courseId) {\n api.httpsCallable?.(HANDLE_COURSE_ANALYTICS_EVENT)?.({\n eventType: ANALYTICS_EVENT_TYPES.RESPOND_CARD_FAIL,\n ...data,\n courseId: data.courseId,\n })\n }\n api.logEvent(ANALYTICS_EVENT_TYPES.RESPOND_CARD_FAIL, data)\n}\n\nexport const logRespondSubmitted = (data: { courseId?: string; [key: string]: any }) => {\n api.logEvent(ANALYTICS_EVENT_TYPES.RESPOND_CARD_SUBMITTED, data)\n}\n\nexport const logRespondError = (errorDetails: { courseId?: string; [key: string]: any }) => {\n api.logEvent(ANALYTICS_EVENT_TYPES.RESPOND_CARD_ERROR, {\n errorDetails,\n })\n}\n\nexport const logWrittenResponseSuccess = (data: { courseId?: string; [key: string]: any }) => {\n if (data.courseId) {\n api.httpsCallable?.(HANDLE_COURSE_ANALYTICS_EVENT)?.({\n eventType: ANALYTICS_EVENT_TYPES.RESPOND_WRITE_CARD_SUCCESS,\n ...data,\n courseId: data.courseId,\n })\n }\n api.logEvent(ANALYTICS_EVENT_TYPES.RESPOND_WRITE_CARD_SUCCESS, data)\n}\n\nexport const logWrittenResponseFail = (data: { courseId?: string; [key: string]: any }) => {\n if (data.courseId) {\n api.httpsCallable?.(HANDLE_COURSE_ANALYTICS_EVENT)?.({\n eventType: ANALYTICS_EVENT_TYPES.RESPOND_WRITE_CARD_FAIL,\n ...data,\n courseId: data.courseId,\n })\n }\n api.logEvent(ANALYTICS_EVENT_TYPES.RESPOND_WRITE_CARD_FAIL, data)\n}\n\nexport const logWrittenResponseSubmitted = (data = {}) => {\n api.logEvent(ANALYTICS_EVENT_TYPES.RESPOND_WRITE_CARD_SUBMITTED, data)\n}\n\nexport const logWrittenResponseError = (errorDetails: Record<string, unknown>) => {\n api.logEvent(ANALYTICS_EVENT_TYPES.RESPOND_WRITE_CARD_ERROR, {\n errorDetails,\n })\n}\n\nexport const logFreePlanRespond = (data: { courseId?: string; [key: string]: any }) => {\n if (data.courseId) {\n api.httpsCallable?.(HANDLE_COURSE_ANALYTICS_EVENT)?.({\n eventType: ANALYTICS_EVENT_TYPES.RESPOND_FREE_PLAN,\n ...data,\n courseId: data.courseId,\n })\n }\n\n api.logEvent(ANALYTICS_EVENT_TYPES.RESPOND_FREE_PLAN, data)\n}\n\nexport const logFreePlanWrittenResponse = (data: { courseId?: string; [key: string]: any }) => {\n if (data.courseId) {\n api.httpsCallable?.(HANDLE_COURSE_ANALYTICS_EVENT)?.({\n eventType: ANALYTICS_EVENT_TYPES.RESPOND_WRITE_FREE_PLAN,\n ...data,\n courseId: data.courseId,\n })\n }\n api.logEvent(ANALYTICS_EVENT_TYPES.RESPOND_WRITE_FREE_PLAN, data)\n}\n\nexport const logMultipleChoiceSuccess = (data: { courseId?: string; [key: string]: any }) => {\n if (data.courseId) {\n api.httpsCallable?.(HANDLE_COURSE_ANALYTICS_EVENT)?.({\n eventType: ANALYTICS_EVENT_TYPES.MC_SUCCESS,\n courseId: data.courseId,\n })\n }\n api.logEvent(ANALYTICS_EVENT_TYPES.MC_SUCCESS, data)\n}\n\nexport const logMultipleChoiceFail = (data: { courseId?: string; [key: string]: any }) => {\n if (data.courseId) {\n api.httpsCallable?.(HANDLE_COURSE_ANALYTICS_EVENT)?.({\n eventType: ANALYTICS_EVENT_TYPES.MC_FAIL,\n courseId: data.courseId,\n })\n }\n api.logEvent(ANALYTICS_EVENT_TYPES.MC_FAIL, data)\n}\n\nexport const logMultipleChoiceError = (errorDetails: { courseId?: string; [key: string]: any }) => {\n api.logEvent(ANALYTICS_EVENT_TYPES.MC_ERROR, {\n errorDetails,\n })\n}\n\nexport const logShortAnswerSuccess = (data: { courseId?: string; [key: string]: any }) => {\n if (data.courseId) {\n api.httpsCallable?.(HANDLE_COURSE_ANALYTICS_EVENT)?.({\n eventType: ANALYTICS_EVENT_TYPES.SHORT_ANSWER_SUCCESS,\n ...data,\n courseId: data.courseId,\n })\n }\n api.logEvent(ANALYTICS_EVENT_TYPES.SHORT_ANSWER_SUCCESS, data)\n}\n\nexport const logShortAnswerFail = (data: { courseId?: string; [key: string]: any }) => {\n if (data.courseId) {\n api.httpsCallable?.(HANDLE_COURSE_ANALYTICS_EVENT)?.({\n eventType: ANALYTICS_EVENT_TYPES.SHORT_ANSWER_FAIL,\n ...data,\n courseId: data.courseId,\n })\n }\n api.logEvent(ANALYTICS_EVENT_TYPES.SHORT_ANSWER_FAIL, data)\n}\n\nexport const logShortAnswerError = (errorDetails: { courseId?: string; [key: string]: any }) => {\n api.logEvent(ANALYTICS_EVENT_TYPES.SHORT_ANSWER_ERROR, {\n errorDetails,\n })\n}\n\nexport const logRetry = (data: { courseId?: string; [key: string]: any }) => {\n if (data.courseId) {\n api.httpsCallable?.(HANDLE_COURSE_ANALYTICS_EVENT)?.({\n eventType: ANALYTICS_EVENT_TYPES.RETRY,\n ...data,\n courseId: data.courseId,\n })\n }\n api.logEvent(ANALYTICS_EVENT_TYPES.RETRY, data)\n}\n\nexport const logViewDetailsClick = (data = {}) => {\n api.logEvent(ANALYTICS_EVENT_TYPES.VIEW_DETAILS_CLICK, data)\n}\n","import { ANALYTICS_EVENT_TYPES } from '@core/constants/analytics.constants'\n\nimport { api } from '../api'\n\nconst HANDLE_COURSE_ANALYTICS_EVENT = 'handleCouresAnalyticsEvent'\n\nexport const logMessageSent = (data: { courseId?: string; [key: string]: any } = {}) => {\n if (data.courseId) {\n api.httpsCallable?.(HANDLE_COURSE_ANALYTICS_EVENT)?.({\n eventType: ANALYTICS_EVENT_TYPES.MESSAGE_SENT,\n ...data,\n courseId: data.courseId,\n })\n }\n api.logEvent(ANALYTICS_EVENT_TYPES.MESSAGE_SENT, data)\n}\n\nexport const logMessageError = (errorDetails: { courseId?: string; [key: string]: any } = {}) => {\n api.logEvent(ANALYTICS_EVENT_TYPES.MESSAGE_ERROR, {\n errorDetails,\n })\n}\n","import { ANALYTICS_EVENT_TYPES } from '@core/constants/analytics.constants'\n\nimport { api } from '../api'\n\nconst HANDLE_COURSE_ANALYTICS_EVENT = 'handleCouresAnalyticsEvent'\n\nexport const logTabsClick = (\n data: { courseId?: string; tabName?: string; [key: string]: any } = {},\n) => {\n if (data.courseId) {\n api.httpsCallable?.(HANDLE_COURSE_ANALYTICS_EVENT)?.({\n eventType: ANALYTICS_EVENT_TYPES.TABS_CLICK,\n ...data,\n courseId: data.courseId,\n })\n }\n api.logEvent(ANALYTICS_EVENT_TYPES.TABS_CLICK, data)\n}\n"],"mappings":"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","names":["HANDLE_COURSE_ANALYTICS_EVENT","HANDLE_COURSE_ANALYTICS_EVENT"]}
1
+ {"version":3,"sources":["../src/lib/firebase/api.ts","../src/lib/firebase/firebase-analytics/grading-standard.ts","../src/constants/analytics.constants.ts","../src/lib/firebase/firebase-analytics/assignment.ts","../src/lib/firebase/firebase-analytics/page-analytics.ts","../src/lib/firebase/firebase-analytics/message.ts","../src/lib/firebase/firebase-analytics/tabs.ts"],"sourcesContent":["import { type CallableFunction, type FirestoreHelpers } from '@core/types/firebase.types'\nimport {\n type SetOptions,\n type DocumentData,\n type QueryConstraint,\n type WithFieldValue,\n type Firestore,\n} from 'firebase/firestore'\n\ninterface FirebaseConfig {\n db: Firestore\n helpers: FirestoreHelpers\n httpsCallable: (name: string) => CallableFunction\n logEvent: (name: string, data: any) => void\n}\n\ntype FirebasePath = string\n\nexport class FirebaseAPI {\n private static instance: FirebaseAPI\n private config: FirebaseConfig | null = null\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n private constructor() {\n // Private constructor for singleton pattern\n }\n\n static getInstance(): FirebaseAPI {\n if (!FirebaseAPI.instance) {\n FirebaseAPI.instance = new FirebaseAPI()\n }\n\n return FirebaseAPI.instance\n }\n\n initialize(config: FirebaseConfig) {\n this.config = config\n }\n\n get db() {\n if (!this.config) throw new Error('Firebase API not initialized')\n\n return this.config.db\n }\n\n get helpers() {\n if (!this.config) throw new Error('Firebase API not initialized')\n\n return this.config.helpers\n }\n\n get httpsCallable() {\n return this.config?.httpsCallable\n }\n\n logEvent(name: string, data: any) {\n this.config?.logEvent(name, data)\n }\n\n accessQueryConstraints() {\n const { query, orderBy, limit, startAt, startAfter, endAt, endBefore, where, increment } =\n this.helpers\n\n return {\n query,\n orderBy,\n limit,\n startAt,\n startAfter,\n endAt,\n endBefore,\n where,\n increment,\n }\n }\n\n accessHelpers() {\n const { doc, collection, writeBatch, serverTimestamp, setDoc } = this.helpers\n\n return {\n doc: (path: FirebasePath) => doc(this.db, path),\n collection: (path: FirebasePath) => collection(this.db, path),\n writeBatch: () => writeBatch(this.db),\n serverTimestamp: serverTimestamp,\n setDoc: setDoc,\n }\n }\n\n async getDoc<T>(path: FirebasePath) {\n const { getDoc, doc } = this.helpers\n\n const docRef = doc(this.db, path)\n const docSnap = await getDoc(docRef)\n\n const data = docSnap.exists()\n ? ({\n ...docSnap.data(),\n id: docSnap.id,\n } as T)\n : null\n\n return {\n id: docSnap.id,\n data,\n }\n }\n\n async getDocs<T>(path: FirebasePath, ...queryConstraints: QueryConstraint[]) {\n const { getDocs, query, collection } = this.helpers\n const collectionRef = collection(this.db, path)\n const q =\n queryConstraints.length > 0 ? query(collectionRef, ...queryConstraints) : collectionRef\n\n const querySnapshot = await getDocs(q)\n\n const data = querySnapshot.docs.map(doc => ({\n data: doc.data() as T,\n id: doc.id,\n }))\n\n return {\n data: data as unknown as (T & {\n id: string\n })[],\n querySnapshot,\n empty: querySnapshot.empty,\n }\n }\n\n async addDoc<T extends WithFieldValue<DocumentData>>(\n path: FirebasePath,\n data: T,\n ): Promise<{ id: string } & T> {\n const { addDoc, collection } = this.helpers\n const collectionRef = collection(this.db, path)\n const docRef = await addDoc(collectionRef, data)\n\n return {\n ...data,\n id: docRef.id,\n }\n }\n\n async setDoc<T extends WithFieldValue<DocumentData>>(\n path: FirebasePath,\n data: T,\n options: SetOptions = {},\n ): Promise<void> {\n const { setDoc, doc } = this.helpers\n const docRef = doc(this.db, path)\n\n await setDoc(docRef, data, options)\n }\n\n async updateDoc(path: FirebasePath, data: any): Promise<void> {\n const { updateDoc, doc } = this.helpers\n\n const docRef = doc(this.db, path)\n\n await updateDoc(docRef, data)\n }\n\n async deleteDoc(path: FirebasePath): Promise<void> {\n const { deleteDoc, doc } = this.helpers\n const docRef = doc(this.db, path)\n\n await deleteDoc(docRef)\n }\n\n async runTransaction<T>(updateFunction: (transaction: any) => Promise<T>): Promise<T> {\n const { runTransaction } = this.helpers\n\n return runTransaction(this.db, updateFunction)\n }\n\n async runBatch(operations: (() => Promise<void>)[]): Promise<void> {\n const { writeBatch } = this.helpers\n const batch = writeBatch(this.db)\n\n await Promise.all(operations.map(op => op()))\n await batch.commit()\n }\n\n writeBatch() {\n const { writeBatch } = this.helpers\n\n const batch = writeBatch(this.db)\n\n return batch\n }\n}\n\nexport const api = FirebaseAPI.getInstance()\n","import { type GradingStandard } from '@core/services/add-grading-standard'\n\nimport { api } from '../api'\n\nexport const logGradingStandardLog = (data: {\n type: GradingStandard['type']\n level?: GradingStandard['level']\n courseId?: GradingStandard['courseId']\n}) => {\n if (data.courseId && data.type && data.level) {\n api.httpsCallable?.('handleCouresAnalyticsEvent')?.({\n eventType: data.type || 'custom',\n level: data.level,\n courseId: data.courseId,\n })\n }\n api.logEvent('logGradingStandard', data)\n}\n","// Event constants\nexport const SPEAKABLE_ANALYTICS = {\n VOICE_SUCCESS: 'voice_success',\n VOICE_FALLBACK_SUCCESS: 'voice_fallback_success',\n VOICE_FALLBACK_FAIL: 'voice_fallback_fail',\n VOICE_FAIL: 'voice_fail',\n RESPOND_CARD_SUCCESS: 'respond_card_success',\n RESPOND_CARD_FAIL: 'respond_card_fail',\n RESPOND_WRITE_CARD_SUCCESS: 'respond_write_card_success',\n RESPOND_WRITE_CARD_FAIL: 'respond_write_card_fail',\n RESPOND_WRITE_CARD_SUBMITTED: 'respond_write_card_submitted',\n RESPOND_WRITE_CARD_ERROR: 'respond_write_card_error',\n RESPOND_CARD_ERROR: 'respond_card_error',\n RESPOND_CARD_SUBMITTED: 'respond_card_submitted',\n RESPOND_FREE_PLAN: 'respond_free_plan',\n RESPOND_WRITE_FREE_PLAN: 'respond_write_free_plan',\n SUBMISSION: 'assignment_submitted',\n ASSIGNMENT_STARTED: 'assignment_started',\n CREATE_ASSIGNMENT: 'create_assignment',\n MC_SUCCESS: 'multiple_choice_success',\n MC_FAIL: 'multiple_choice_fail',\n MC_ERROR: 'multiple_choice_error',\n ACTFL_LEVEL: 'actfl_level',\n WIDA_LEVEL: 'wida_level',\n // New events\n VIEW_SCORES_MODAL: 'view_scores_modal',\n SHORT_ANSWER_SUCCESS: 'short_answer_success',\n SHORT_ANSWER_FAIL: 'short_answer_fail',\n SHORT_ANSWER_ERROR: 'short_answer_error',\n RETRY: 'retry',\n MESSAGE_SENT: 'message_sent',\n MESSAGE_ERROR: 'message_error',\n VIEW_DETAILS_CLICK: 'view_details_click',\n TABS_CLICK: 'tabs_click',\n VIEW_MEDIA: 'view_media',\n VIEW_SCORES: 'view_scores',\n VIEW_GRADING_METHOD: 'view_grading_method',\n VIEW_FEEDBACK: 'view_feedback',\n} as const\n","import { SPEAKABLE_ANALYTICS } from '@core/constants/analytics.constants'\n\nimport { api } from '../api'\n\nexport const logOpenAssignment = (data = {}) => {\n api.logEvent('open_assignment', data)\n}\n\nexport const logOpenActivityPreview = (data = {}) => {\n api.logEvent('open_activity_preview', data)\n}\n\nexport const logSubmitAssignment = (data = {}) => {\n api.httpsCallable?.('handleCouresAnalyticsEvent')?.({\n eventType: SPEAKABLE_ANALYTICS.SUBMISSION,\n ...data,\n })\n api.logEvent(SPEAKABLE_ANALYTICS.SUBMISSION, data)\n}\n\nexport const logCreateAssignment = (data = {}) => {\n // @ts-ignore\n if (data.courseId) {\n api.httpsCallable?.('handleCouresAnalyticsEvent')?.({\n eventType: SPEAKABLE_ANALYTICS.CREATE_ASSIGNMENT,\n ...data,\n })\n }\n api.logEvent(SPEAKABLE_ANALYTICS.CREATE_ASSIGNMENT, data)\n}\n\nexport const logStartAssignment = (data = {}) => {\n // @ts-ignore\n if (data.courseId) {\n api.httpsCallable?.('handleCouresAnalyticsEvent')?.({\n eventType: SPEAKABLE_ANALYTICS.ASSIGNMENT_STARTED,\n ...data,\n })\n }\n api.logEvent(SPEAKABLE_ANALYTICS.ASSIGNMENT_STARTED, data)\n}\n\nexport const logViewScoresModal = (data = {}) => {\n api.logEvent(SPEAKABLE_ANALYTICS.VIEW_SCORES_MODAL, data)\n}\n\nexport const logViewMedia = (data = {}) => {\n api.logEvent(SPEAKABLE_ANALYTICS.VIEW_MEDIA, data)\n}\n\nexport const logViewScores = (data = {}) => {\n api.logEvent(SPEAKABLE_ANALYTICS.VIEW_SCORES, data)\n}\n\nexport const logViewGradingMethod = (data = {}) => {\n api.logEvent(SPEAKABLE_ANALYTICS.VIEW_GRADING_METHOD, data)\n}\n\nexport const logViewFeedback = (data = {}) => {\n api.logEvent(SPEAKABLE_ANALYTICS.VIEW_FEEDBACK, data)\n}\n","import { SPEAKABLE_ANALYTICS } from '@core/constants/analytics.constants'\n\nimport { api } from '../api'\n\nconst HANDLE_COURSE_ANALYTICS_EVENT = 'handleCouresAnalyticsEvent'\n\nexport const logRepeatSuccess = (\n data: {\n courseId?: string\n [key: string]: any\n } = {},\n) => {\n if (data.courseId) {\n api.httpsCallable?.(HANDLE_COURSE_ANALYTICS_EVENT)?.({\n eventType: SPEAKABLE_ANALYTICS.VOICE_SUCCESS,\n ...data,\n courseId: data.courseId,\n })\n }\n\n api.logEvent(SPEAKABLE_ANALYTICS.VOICE_SUCCESS, data)\n}\n\nexport const logRepeatFail = (\n data: {\n courseId?: string\n [key: string]: any\n } = {},\n) => {\n if (data.courseId) {\n api.httpsCallable?.(HANDLE_COURSE_ANALYTICS_EVENT)?.({\n eventType: SPEAKABLE_ANALYTICS.VOICE_FAIL,\n ...data,\n courseId: data.courseId,\n })\n }\n\n api.logEvent(SPEAKABLE_ANALYTICS.VOICE_FAIL, data)\n}\n\nexport const logRespondSuccess = (data: { courseId?: string; [key: string]: any }) => {\n if (data.courseId) {\n api.httpsCallable?.(HANDLE_COURSE_ANALYTICS_EVENT)?.({\n eventType: SPEAKABLE_ANALYTICS.RESPOND_CARD_SUCCESS,\n ...data,\n courseId: data.courseId,\n })\n }\n api.logEvent(SPEAKABLE_ANALYTICS.RESPOND_CARD_SUCCESS, data)\n}\n\nexport const logRespondFail = (data: { courseId?: string; [key: string]: any }) => {\n if (data.courseId) {\n api.httpsCallable?.(HANDLE_COURSE_ANALYTICS_EVENT)?.({\n eventType: SPEAKABLE_ANALYTICS.RESPOND_CARD_FAIL,\n ...data,\n courseId: data.courseId,\n })\n }\n api.logEvent(SPEAKABLE_ANALYTICS.RESPOND_CARD_FAIL, data)\n}\n\nexport const logRespondSubmitted = (data: { courseId?: string; [key: string]: any }) => {\n api.logEvent(SPEAKABLE_ANALYTICS.RESPOND_CARD_SUBMITTED, data)\n}\n\nexport const logRespondError = (errorDetails: { courseId?: string; [key: string]: any }) => {\n api.logEvent(SPEAKABLE_ANALYTICS.RESPOND_CARD_ERROR, {\n errorDetails,\n })\n}\n\nexport const logWrittenResponseSuccess = (data: { courseId?: string; [key: string]: any }) => {\n if (data.courseId) {\n api.httpsCallable?.(HANDLE_COURSE_ANALYTICS_EVENT)?.({\n eventType: SPEAKABLE_ANALYTICS.RESPOND_WRITE_CARD_SUCCESS,\n ...data,\n courseId: data.courseId,\n })\n }\n api.logEvent(SPEAKABLE_ANALYTICS.RESPOND_WRITE_CARD_SUCCESS, data)\n}\n\nexport const logWrittenResponseFail = (data: { courseId?: string; [key: string]: any }) => {\n if (data.courseId) {\n api.httpsCallable?.(HANDLE_COURSE_ANALYTICS_EVENT)?.({\n eventType: SPEAKABLE_ANALYTICS.RESPOND_WRITE_CARD_FAIL,\n ...data,\n courseId: data.courseId,\n })\n }\n api.logEvent(SPEAKABLE_ANALYTICS.RESPOND_WRITE_CARD_FAIL, data)\n}\n\nexport const logWrittenResponseSubmitted = (data = {}) => {\n api.logEvent(SPEAKABLE_ANALYTICS.RESPOND_WRITE_CARD_SUBMITTED, data)\n}\n\nexport const logWrittenResponseError = (errorDetails: Record<string, unknown>) => {\n api.logEvent(SPEAKABLE_ANALYTICS.RESPOND_WRITE_CARD_ERROR, {\n errorDetails,\n })\n}\n\nexport const logFreePlanRespond = (data: { courseId?: string; [key: string]: any }) => {\n if (data.courseId) {\n api.httpsCallable?.(HANDLE_COURSE_ANALYTICS_EVENT)?.({\n eventType: SPEAKABLE_ANALYTICS.RESPOND_FREE_PLAN,\n ...data,\n courseId: data.courseId,\n })\n }\n\n api.logEvent(SPEAKABLE_ANALYTICS.RESPOND_FREE_PLAN, data)\n}\n\nexport const logFreePlanWrittenResponse = (data: { courseId?: string; [key: string]: any }) => {\n if (data.courseId) {\n api.httpsCallable?.(HANDLE_COURSE_ANALYTICS_EVENT)?.({\n eventType: SPEAKABLE_ANALYTICS.RESPOND_WRITE_FREE_PLAN,\n ...data,\n courseId: data.courseId,\n })\n }\n api.logEvent(SPEAKABLE_ANALYTICS.RESPOND_WRITE_FREE_PLAN, data)\n}\n\nexport const logMultipleChoiceSuccess = (data: { courseId?: string; [key: string]: any }) => {\n if (data.courseId) {\n api.httpsCallable?.(HANDLE_COURSE_ANALYTICS_EVENT)?.({\n eventType: SPEAKABLE_ANALYTICS.MC_SUCCESS,\n courseId: data.courseId,\n })\n }\n api.logEvent(SPEAKABLE_ANALYTICS.MC_SUCCESS, data)\n}\n\nexport const logMultipleChoiceFail = (data: { courseId?: string; [key: string]: any }) => {\n if (data.courseId) {\n api.httpsCallable?.(HANDLE_COURSE_ANALYTICS_EVENT)?.({\n eventType: SPEAKABLE_ANALYTICS.MC_FAIL,\n courseId: data.courseId,\n })\n }\n api.logEvent(SPEAKABLE_ANALYTICS.MC_FAIL, data)\n}\n\nexport const logMultipleChoiceError = (errorDetails: { courseId?: string; [key: string]: any }) => {\n api.logEvent(SPEAKABLE_ANALYTICS.MC_ERROR, {\n errorDetails,\n })\n}\n\nexport const logShortAnswerSuccess = (data: { courseId?: string; [key: string]: any }) => {\n if (data.courseId) {\n api.httpsCallable?.(HANDLE_COURSE_ANALYTICS_EVENT)?.({\n eventType: SPEAKABLE_ANALYTICS.SHORT_ANSWER_SUCCESS,\n ...data,\n courseId: data.courseId,\n })\n }\n api.logEvent(SPEAKABLE_ANALYTICS.SHORT_ANSWER_SUCCESS, data)\n}\n\nexport const logShortAnswerFail = (data: { courseId?: string; [key: string]: any }) => {\n if (data.courseId) {\n api.httpsCallable?.(HANDLE_COURSE_ANALYTICS_EVENT)?.({\n eventType: SPEAKABLE_ANALYTICS.SHORT_ANSWER_FAIL,\n ...data,\n courseId: data.courseId,\n })\n }\n api.logEvent(SPEAKABLE_ANALYTICS.SHORT_ANSWER_FAIL, data)\n}\n\nexport const logShortAnswerError = (errorDetails: { courseId?: string; [key: string]: any }) => {\n api.logEvent(SPEAKABLE_ANALYTICS.SHORT_ANSWER_ERROR, {\n errorDetails,\n })\n}\n\nexport const logRetry = (data: { courseId?: string; [key: string]: any }) => {\n if (data.courseId) {\n api.httpsCallable?.(HANDLE_COURSE_ANALYTICS_EVENT)?.({\n eventType: SPEAKABLE_ANALYTICS.RETRY,\n ...data,\n courseId: data.courseId,\n })\n }\n api.logEvent(SPEAKABLE_ANALYTICS.RETRY, data)\n}\n\nexport const logViewDetailsClick = (data = {}) => {\n api.logEvent(SPEAKABLE_ANALYTICS.VIEW_DETAILS_CLICK, data)\n}\n","import { SPEAKABLE_ANALYTICS } from '@core/constants/analytics.constants'\n\nimport { api } from '../api'\n\nconst HANDLE_COURSE_ANALYTICS_EVENT = 'handleCouresAnalyticsEvent'\n\nexport const logMessageSent = (data: { courseId?: string; [key: string]: any } = {}) => {\n if (data.courseId) {\n api.httpsCallable?.(HANDLE_COURSE_ANALYTICS_EVENT)?.({\n eventType: SPEAKABLE_ANALYTICS.MESSAGE_SENT,\n ...data,\n courseId: data.courseId,\n })\n }\n api.logEvent(SPEAKABLE_ANALYTICS.MESSAGE_SENT, data)\n}\n\nexport const logMessageError = (errorDetails: { courseId?: string; [key: string]: any } = {}) => {\n api.logEvent(SPEAKABLE_ANALYTICS.MESSAGE_ERROR, {\n errorDetails,\n })\n}\n","import { SPEAKABLE_ANALYTICS } from '@core/constants/analytics.constants'\n\nimport { api } from '../api'\n\nconst HANDLE_COURSE_ANALYTICS_EVENT = 'handleCouresAnalyticsEvent'\n\nexport const logTabsClick = (\n data: { courseId?: string; tabName?: string; [key: string]: any } = {},\n) => {\n if (data.courseId) {\n api.httpsCallable?.(HANDLE_COURSE_ANALYTICS_EVENT)?.({\n eventType: SPEAKABLE_ANALYTICS.TABS_CLICK,\n ...data,\n courseId: data.courseId,\n })\n }\n api.logEvent(SPEAKABLE_ANALYTICS.TABS_CLICK, data)\n}\n"],"mappings":"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","names":["HANDLE_COURSE_ANALYTICS_EVENT","HANDLE_COURSE_ANALYTICS_EVENT"]}
@@ -2992,6 +2992,44 @@ declare const useUpdateStudentVocab: (page: PageActivityWithId | null) => {
2992
2992
  studentVocabMarkVoiceFail: () => Promise<void>;
2993
2993
  };
2994
2994
 
2995
+ declare const SPEAKABLE_ANALYTICS: {
2996
+ readonly VOICE_SUCCESS: "voice_success";
2997
+ readonly VOICE_FALLBACK_SUCCESS: "voice_fallback_success";
2998
+ readonly VOICE_FALLBACK_FAIL: "voice_fallback_fail";
2999
+ readonly VOICE_FAIL: "voice_fail";
3000
+ readonly RESPOND_CARD_SUCCESS: "respond_card_success";
3001
+ readonly RESPOND_CARD_FAIL: "respond_card_fail";
3002
+ readonly RESPOND_WRITE_CARD_SUCCESS: "respond_write_card_success";
3003
+ readonly RESPOND_WRITE_CARD_FAIL: "respond_write_card_fail";
3004
+ readonly RESPOND_WRITE_CARD_SUBMITTED: "respond_write_card_submitted";
3005
+ readonly RESPOND_WRITE_CARD_ERROR: "respond_write_card_error";
3006
+ readonly RESPOND_CARD_ERROR: "respond_card_error";
3007
+ readonly RESPOND_CARD_SUBMITTED: "respond_card_submitted";
3008
+ readonly RESPOND_FREE_PLAN: "respond_free_plan";
3009
+ readonly RESPOND_WRITE_FREE_PLAN: "respond_write_free_plan";
3010
+ readonly SUBMISSION: "assignment_submitted";
3011
+ readonly ASSIGNMENT_STARTED: "assignment_started";
3012
+ readonly CREATE_ASSIGNMENT: "create_assignment";
3013
+ readonly MC_SUCCESS: "multiple_choice_success";
3014
+ readonly MC_FAIL: "multiple_choice_fail";
3015
+ readonly MC_ERROR: "multiple_choice_error";
3016
+ readonly ACTFL_LEVEL: "actfl_level";
3017
+ readonly WIDA_LEVEL: "wida_level";
3018
+ readonly VIEW_SCORES_MODAL: "view_scores_modal";
3019
+ readonly SHORT_ANSWER_SUCCESS: "short_answer_success";
3020
+ readonly SHORT_ANSWER_FAIL: "short_answer_fail";
3021
+ readonly SHORT_ANSWER_ERROR: "short_answer_error";
3022
+ readonly RETRY: "retry";
3023
+ readonly MESSAGE_SENT: "message_sent";
3024
+ readonly MESSAGE_ERROR: "message_error";
3025
+ readonly VIEW_DETAILS_CLICK: "view_details_click";
3026
+ readonly TABS_CLICK: "tabs_click";
3027
+ readonly VIEW_MEDIA: "view_media";
3028
+ readonly VIEW_SCORES: "view_scores";
3029
+ readonly VIEW_GRADING_METHOD: "view_grading_method";
3030
+ readonly VIEW_FEEDBACK: "view_feedback";
3031
+ };
3032
+
2995
3033
  declare const useBaseOpenAI: ({ onTranscriptSuccess, onTranscriptError, onCompletionSuccess, onCompletionError, aiEnabled, submitAudioResponse, uploadAudioAndGetTranscript, onGetAudioUrlAndTranscript, }: {
2996
3034
  onTranscriptSuccess: (transcript: string) => void;
2997
3035
  onTranscriptError: ({ type, message }: {
@@ -3525,4 +3563,4 @@ declare const createFsClientNative: ({ db, httpsCallable, logEvent }: FsClientPa
3525
3563
  };
3526
3564
  };
3527
3565
 
3528
- export { ActivityPageType, type Assignment, type AssignmentAnalyticsType$1 as AssignmentAnalyticsType, type AssignmentWithId, BASE_MULTIPLE_CHOICE_FIELD_VALUES, BASE_REPEAT_FIELD_VALUES, BASE_RESPOND_FIELD_VALUES, CONVERSATION_PAGE_ACTIVITY_TYPES, ConversationPageMode, type CreditContract, FeedbackTypesCard, FsCtx, type InstitutionSubscription, LENIENCY_OPTIONS, LeniencyCard, MULTIPLE_CHOICE_PAGE_ACTIVITY_TYPES, type MediaPageActivity, type Organization, type OrganizationAccess, type PageActivity, type PageActivityWithId, type PageScore, REPEAT_PAGE_ACTIVITY_TYPES, RESPOND_AUDIO_PAGE_ACTIVITY_TYPES, RESPOND_PAGE_ACTIVITY_TYPES, RESPOND_WRITE_PAGE_ACTIVITY_TYPES, type RefsCardsFiresotre, type RefsSetsFirestore, SPEAKABLE_NOTIFICATIONS, STUDENT_LEVELS_OPTIONS, type Score, type ScoreWithId, type Set, type SetWithId, type SpeakableNotificationType, SpeakableNotificationTypes, SpeakableProvider, VerificationCardStatus, assignmentQueryKeys, cardsQueryKeys, checkIsConversationPage, checkIsMCPage, checkIsMediaPage, checkIsRepeatPage, checkIsRespondAudioPage, checkIsRespondPage, checkIsRespondWrittenPage, checkIsShortAnswerPage, checkTypePageActivity, cleanString, createAssignmentRepo, createCardRepo, createFsClientNative as createFsClient, createSetRepo, creditQueryKeys, debounce, getCardFromCache, getLabelPage, getPageMediaData, getPagePrompt, getPhraseLength, getRespondCardTool, getSetFromCache, getSingleMediaPageData, getTotalCompletedCards, getTranscript, getTranscriptCycle, getWordHash, purify, refsCardsFiresotre, refsSetsFirestore, scoreQueryKeys, setsQueryKeys, updateCardInCache, updateSetInCache, useActivity, useActivityFeedbackAccess, useAssignment, useBaseOpenAI, useCards, useClearScore, useClearScoreV2, useCreateCard, useCreateCards, useCreateNotification, useGetCard, useOrganizationAccess, useScore, useSet, useSpeakableApi, useSpeakableTranscript, useSpeakableTranscriptCycle, useSubmitAssignmentScore, useSubmitPracticeScore, useUpdateCardScore, useUpdateScore, useUpdateStudentVocab, useUserCredits };
3566
+ export { ActivityPageType, type Assignment, type AssignmentAnalyticsType$1 as AssignmentAnalyticsType, type AssignmentWithId, BASE_MULTIPLE_CHOICE_FIELD_VALUES, BASE_REPEAT_FIELD_VALUES, BASE_RESPOND_FIELD_VALUES, CONVERSATION_PAGE_ACTIVITY_TYPES, ConversationPageMode, type CreditContract, FeedbackTypesCard, FsCtx, type InstitutionSubscription, LENIENCY_OPTIONS, LeniencyCard, MULTIPLE_CHOICE_PAGE_ACTIVITY_TYPES, type MediaPageActivity, type Organization, type OrganizationAccess, type PageActivity, type PageActivityWithId, type PageScore, REPEAT_PAGE_ACTIVITY_TYPES, RESPOND_AUDIO_PAGE_ACTIVITY_TYPES, RESPOND_PAGE_ACTIVITY_TYPES, RESPOND_WRITE_PAGE_ACTIVITY_TYPES, type RefsCardsFiresotre, type RefsSetsFirestore, SPEAKABLE_ANALYTICS, SPEAKABLE_NOTIFICATIONS, STUDENT_LEVELS_OPTIONS, type Score, type ScoreWithId, type Set, type SetWithId, type SpeakableNotificationType, SpeakableNotificationTypes, SpeakableProvider, VerificationCardStatus, assignmentQueryKeys, cardsQueryKeys, checkIsConversationPage, checkIsMCPage, checkIsMediaPage, checkIsRepeatPage, checkIsRespondAudioPage, checkIsRespondPage, checkIsRespondWrittenPage, checkIsShortAnswerPage, checkTypePageActivity, cleanString, createAssignmentRepo, createCardRepo, createFsClientNative as createFsClient, createSetRepo, creditQueryKeys, debounce, getCardFromCache, getLabelPage, getPageMediaData, getPagePrompt, getPhraseLength, getRespondCardTool, getSetFromCache, getSingleMediaPageData, getTotalCompletedCards, getTranscript, getTranscriptCycle, getWordHash, purify, refsCardsFiresotre, refsSetsFirestore, scoreQueryKeys, setsQueryKeys, updateCardInCache, updateSetInCache, useActivity, useActivityFeedbackAccess, useAssignment, useBaseOpenAI, useCards, useClearScore, useClearScoreV2, useCreateCard, useCreateCards, useCreateNotification, useGetCard, useOrganizationAccess, useScore, useSet, useSpeakableApi, useSpeakableTranscript, useSpeakableTranscriptCycle, useSubmitAssignmentScore, useSubmitPracticeScore, useUpdateCardScore, useUpdateScore, useUpdateStudentVocab, useUserCredits };
@@ -2992,6 +2992,44 @@ declare const useUpdateStudentVocab: (page: PageActivityWithId | null) => {
2992
2992
  studentVocabMarkVoiceFail: () => Promise<void>;
2993
2993
  };
2994
2994
 
2995
+ declare const SPEAKABLE_ANALYTICS: {
2996
+ readonly VOICE_SUCCESS: "voice_success";
2997
+ readonly VOICE_FALLBACK_SUCCESS: "voice_fallback_success";
2998
+ readonly VOICE_FALLBACK_FAIL: "voice_fallback_fail";
2999
+ readonly VOICE_FAIL: "voice_fail";
3000
+ readonly RESPOND_CARD_SUCCESS: "respond_card_success";
3001
+ readonly RESPOND_CARD_FAIL: "respond_card_fail";
3002
+ readonly RESPOND_WRITE_CARD_SUCCESS: "respond_write_card_success";
3003
+ readonly RESPOND_WRITE_CARD_FAIL: "respond_write_card_fail";
3004
+ readonly RESPOND_WRITE_CARD_SUBMITTED: "respond_write_card_submitted";
3005
+ readonly RESPOND_WRITE_CARD_ERROR: "respond_write_card_error";
3006
+ readonly RESPOND_CARD_ERROR: "respond_card_error";
3007
+ readonly RESPOND_CARD_SUBMITTED: "respond_card_submitted";
3008
+ readonly RESPOND_FREE_PLAN: "respond_free_plan";
3009
+ readonly RESPOND_WRITE_FREE_PLAN: "respond_write_free_plan";
3010
+ readonly SUBMISSION: "assignment_submitted";
3011
+ readonly ASSIGNMENT_STARTED: "assignment_started";
3012
+ readonly CREATE_ASSIGNMENT: "create_assignment";
3013
+ readonly MC_SUCCESS: "multiple_choice_success";
3014
+ readonly MC_FAIL: "multiple_choice_fail";
3015
+ readonly MC_ERROR: "multiple_choice_error";
3016
+ readonly ACTFL_LEVEL: "actfl_level";
3017
+ readonly WIDA_LEVEL: "wida_level";
3018
+ readonly VIEW_SCORES_MODAL: "view_scores_modal";
3019
+ readonly SHORT_ANSWER_SUCCESS: "short_answer_success";
3020
+ readonly SHORT_ANSWER_FAIL: "short_answer_fail";
3021
+ readonly SHORT_ANSWER_ERROR: "short_answer_error";
3022
+ readonly RETRY: "retry";
3023
+ readonly MESSAGE_SENT: "message_sent";
3024
+ readonly MESSAGE_ERROR: "message_error";
3025
+ readonly VIEW_DETAILS_CLICK: "view_details_click";
3026
+ readonly TABS_CLICK: "tabs_click";
3027
+ readonly VIEW_MEDIA: "view_media";
3028
+ readonly VIEW_SCORES: "view_scores";
3029
+ readonly VIEW_GRADING_METHOD: "view_grading_method";
3030
+ readonly VIEW_FEEDBACK: "view_feedback";
3031
+ };
3032
+
2995
3033
  declare const useBaseOpenAI: ({ onTranscriptSuccess, onTranscriptError, onCompletionSuccess, onCompletionError, aiEnabled, submitAudioResponse, uploadAudioAndGetTranscript, onGetAudioUrlAndTranscript, }: {
2996
3034
  onTranscriptSuccess: (transcript: string) => void;
2997
3035
  onTranscriptError: ({ type, message }: {
@@ -3525,4 +3563,4 @@ declare const createFsClientNative: ({ db, httpsCallable, logEvent }: FsClientPa
3525
3563
  };
3526
3564
  };
3527
3565
 
3528
- export { ActivityPageType, type Assignment, type AssignmentAnalyticsType$1 as AssignmentAnalyticsType, type AssignmentWithId, BASE_MULTIPLE_CHOICE_FIELD_VALUES, BASE_REPEAT_FIELD_VALUES, BASE_RESPOND_FIELD_VALUES, CONVERSATION_PAGE_ACTIVITY_TYPES, ConversationPageMode, type CreditContract, FeedbackTypesCard, FsCtx, type InstitutionSubscription, LENIENCY_OPTIONS, LeniencyCard, MULTIPLE_CHOICE_PAGE_ACTIVITY_TYPES, type MediaPageActivity, type Organization, type OrganizationAccess, type PageActivity, type PageActivityWithId, type PageScore, REPEAT_PAGE_ACTIVITY_TYPES, RESPOND_AUDIO_PAGE_ACTIVITY_TYPES, RESPOND_PAGE_ACTIVITY_TYPES, RESPOND_WRITE_PAGE_ACTIVITY_TYPES, type RefsCardsFiresotre, type RefsSetsFirestore, SPEAKABLE_NOTIFICATIONS, STUDENT_LEVELS_OPTIONS, type Score, type ScoreWithId, type Set, type SetWithId, type SpeakableNotificationType, SpeakableNotificationTypes, SpeakableProvider, VerificationCardStatus, assignmentQueryKeys, cardsQueryKeys, checkIsConversationPage, checkIsMCPage, checkIsMediaPage, checkIsRepeatPage, checkIsRespondAudioPage, checkIsRespondPage, checkIsRespondWrittenPage, checkIsShortAnswerPage, checkTypePageActivity, cleanString, createAssignmentRepo, createCardRepo, createFsClientNative as createFsClient, createSetRepo, creditQueryKeys, debounce, getCardFromCache, getLabelPage, getPageMediaData, getPagePrompt, getPhraseLength, getRespondCardTool, getSetFromCache, getSingleMediaPageData, getTotalCompletedCards, getTranscript, getTranscriptCycle, getWordHash, purify, refsCardsFiresotre, refsSetsFirestore, scoreQueryKeys, setsQueryKeys, updateCardInCache, updateSetInCache, useActivity, useActivityFeedbackAccess, useAssignment, useBaseOpenAI, useCards, useClearScore, useClearScoreV2, useCreateCard, useCreateCards, useCreateNotification, useGetCard, useOrganizationAccess, useScore, useSet, useSpeakableApi, useSpeakableTranscript, useSpeakableTranscriptCycle, useSubmitAssignmentScore, useSubmitPracticeScore, useUpdateCardScore, useUpdateScore, useUpdateStudentVocab, useUserCredits };
3566
+ export { ActivityPageType, type Assignment, type AssignmentAnalyticsType$1 as AssignmentAnalyticsType, type AssignmentWithId, BASE_MULTIPLE_CHOICE_FIELD_VALUES, BASE_REPEAT_FIELD_VALUES, BASE_RESPOND_FIELD_VALUES, CONVERSATION_PAGE_ACTIVITY_TYPES, ConversationPageMode, type CreditContract, FeedbackTypesCard, FsCtx, type InstitutionSubscription, LENIENCY_OPTIONS, LeniencyCard, MULTIPLE_CHOICE_PAGE_ACTIVITY_TYPES, type MediaPageActivity, type Organization, type OrganizationAccess, type PageActivity, type PageActivityWithId, type PageScore, REPEAT_PAGE_ACTIVITY_TYPES, RESPOND_AUDIO_PAGE_ACTIVITY_TYPES, RESPOND_PAGE_ACTIVITY_TYPES, RESPOND_WRITE_PAGE_ACTIVITY_TYPES, type RefsCardsFiresotre, type RefsSetsFirestore, SPEAKABLE_ANALYTICS, SPEAKABLE_NOTIFICATIONS, STUDENT_LEVELS_OPTIONS, type Score, type ScoreWithId, type Set, type SetWithId, type SpeakableNotificationType, SpeakableNotificationTypes, SpeakableProvider, VerificationCardStatus, assignmentQueryKeys, cardsQueryKeys, checkIsConversationPage, checkIsMCPage, checkIsMediaPage, checkIsRepeatPage, checkIsRespondAudioPage, checkIsRespondPage, checkIsRespondWrittenPage, checkIsShortAnswerPage, checkTypePageActivity, cleanString, createAssignmentRepo, createCardRepo, createFsClientNative as createFsClient, createSetRepo, creditQueryKeys, debounce, getCardFromCache, getLabelPage, getPageMediaData, getPagePrompt, getPhraseLength, getRespondCardTool, getSetFromCache, getSingleMediaPageData, getTotalCompletedCards, getTranscript, getTranscriptCycle, getWordHash, purify, refsCardsFiresotre, refsSetsFirestore, scoreQueryKeys, setsQueryKeys, updateCardInCache, updateSetInCache, useActivity, useActivityFeedbackAccess, useAssignment, useBaseOpenAI, useCards, useClearScore, useClearScoreV2, useCreateCard, useCreateCards, useCreateNotification, useGetCard, useOrganizationAccess, useScore, useSet, useSpeakableApi, useSpeakableTranscript, useSpeakableTranscriptCycle, useSubmitAssignmentScore, useSubmitPracticeScore, useUpdateCardScore, useUpdateScore, useUpdateStudentVocab, useUserCredits };
@@ -45,6 +45,7 @@ __export(index_native_exports, {
45
45
  RESPOND_AUDIO_PAGE_ACTIVITY_TYPES: () => RESPOND_AUDIO_PAGE_ACTIVITY_TYPES,
46
46
  RESPOND_PAGE_ACTIVITY_TYPES: () => RESPOND_PAGE_ACTIVITY_TYPES,
47
47
  RESPOND_WRITE_PAGE_ACTIVITY_TYPES: () => RESPOND_WRITE_PAGE_ACTIVITY_TYPES,
48
+ SPEAKABLE_ANALYTICS: () => SPEAKABLE_ANALYTICS,
48
49
  SPEAKABLE_NOTIFICATIONS: () => SPEAKABLE_NOTIFICATIONS,
49
50
  STUDENT_LEVELS_OPTIONS: () => STUDENT_LEVELS_OPTIONS,
50
51
  SpeakableNotificationTypes: () => SpeakableNotificationTypes,
@@ -943,8 +944,10 @@ var logGradingStandardLog = (data) => {
943
944
  };
944
945
 
945
946
  // src/constants/analytics.constants.ts
946
- var ANALYTICS_EVENT_TYPES = {
947
+ var SPEAKABLE_ANALYTICS = {
947
948
  VOICE_SUCCESS: "voice_success",
949
+ VOICE_FALLBACK_SUCCESS: "voice_fallback_success",
950
+ VOICE_FALLBACK_FAIL: "voice_fallback_fail",
948
951
  VOICE_FAIL: "voice_fail",
949
952
  RESPOND_CARD_SUCCESS: "respond_card_success",
950
953
  RESPOND_CARD_FAIL: "respond_card_fail",
@@ -990,20 +993,20 @@ var logOpenActivityPreview = (data = {}) => {
990
993
  var logSubmitAssignment = (data = {}) => {
991
994
  var _a, _b, _c;
992
995
  (_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, "handleCouresAnalyticsEvent")) == null ? void 0 : _c({
993
- eventType: ANALYTICS_EVENT_TYPES.SUBMISSION,
996
+ eventType: SPEAKABLE_ANALYTICS.SUBMISSION,
994
997
  ...data
995
998
  });
996
- api.logEvent(ANALYTICS_EVENT_TYPES.SUBMISSION, data);
999
+ api.logEvent(SPEAKABLE_ANALYTICS.SUBMISSION, data);
997
1000
  };
998
1001
  var logStartAssignment = (data = {}) => {
999
1002
  var _a, _b, _c;
1000
1003
  if (data.courseId) {
1001
1004
  (_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, "handleCouresAnalyticsEvent")) == null ? void 0 : _c({
1002
- eventType: ANALYTICS_EVENT_TYPES.ASSIGNMENT_STARTED,
1005
+ eventType: SPEAKABLE_ANALYTICS.ASSIGNMENT_STARTED,
1003
1006
  ...data
1004
1007
  });
1005
1008
  }
1006
- api.logEvent(ANALYTICS_EVENT_TYPES.ASSIGNMENT_STARTED, data);
1009
+ api.logEvent(SPEAKABLE_ANALYTICS.ASSIGNMENT_STARTED, data);
1007
1010
  };
1008
1011
 
1009
1012
  // src/domains/assignment/utils/create-default-score.ts