@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 +52 -50
- package/dist/analytics.js.map +1 -1
- package/dist/index.native.d.mts +39 -1
- package/dist/index.native.d.ts +39 -1
- package/dist/index.native.js +8 -5
- package/dist/index.native.js.map +1 -1
- package/dist/index.native.mjs +8 -5
- package/dist/index.native.mjs.map +1 -1
- package/dist/index.web.d.mts +39 -1
- package/dist/index.web.js +8 -5
- package/dist/index.web.js.map +1 -1
- package/package.json +1 -1
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
|
|
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:
|
|
189
|
+
eventType: SPEAKABLE_ANALYTICS.SUBMISSION,
|
|
188
190
|
...data
|
|
189
191
|
});
|
|
190
|
-
api.logEvent(
|
|
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:
|
|
198
|
+
eventType: SPEAKABLE_ANALYTICS.CREATE_ASSIGNMENT,
|
|
197
199
|
...data
|
|
198
200
|
});
|
|
199
201
|
}
|
|
200
|
-
api.logEvent(
|
|
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:
|
|
208
|
+
eventType: SPEAKABLE_ANALYTICS.ASSIGNMENT_STARTED,
|
|
207
209
|
...data
|
|
208
210
|
});
|
|
209
211
|
}
|
|
210
|
-
api.logEvent(
|
|
212
|
+
api.logEvent(SPEAKABLE_ANALYTICS.ASSIGNMENT_STARTED, data);
|
|
211
213
|
};
|
|
212
214
|
var logViewScoresModal = (data = {}) => {
|
|
213
|
-
api.logEvent(
|
|
215
|
+
api.logEvent(SPEAKABLE_ANALYTICS.VIEW_SCORES_MODAL, data);
|
|
214
216
|
};
|
|
215
217
|
var logViewMedia = (data = {}) => {
|
|
216
|
-
api.logEvent(
|
|
218
|
+
api.logEvent(SPEAKABLE_ANALYTICS.VIEW_MEDIA, data);
|
|
217
219
|
};
|
|
218
220
|
var logViewScores = (data = {}) => {
|
|
219
|
-
api.logEvent(
|
|
221
|
+
api.logEvent(SPEAKABLE_ANALYTICS.VIEW_SCORES, data);
|
|
220
222
|
};
|
|
221
223
|
var logViewGradingMethod = (data = {}) => {
|
|
222
|
-
api.logEvent(
|
|
224
|
+
api.logEvent(SPEAKABLE_ANALYTICS.VIEW_GRADING_METHOD, data);
|
|
223
225
|
};
|
|
224
226
|
var logViewFeedback = (data = {}) => {
|
|
225
|
-
api.logEvent(
|
|
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:
|
|
236
|
+
eventType: SPEAKABLE_ANALYTICS.VOICE_SUCCESS,
|
|
235
237
|
...data,
|
|
236
238
|
courseId: data.courseId
|
|
237
239
|
});
|
|
238
240
|
}
|
|
239
|
-
api.logEvent(
|
|
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:
|
|
247
|
+
eventType: SPEAKABLE_ANALYTICS.VOICE_FAIL,
|
|
246
248
|
...data,
|
|
247
249
|
courseId: data.courseId
|
|
248
250
|
});
|
|
249
251
|
}
|
|
250
|
-
api.logEvent(
|
|
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:
|
|
258
|
+
eventType: SPEAKABLE_ANALYTICS.RESPOND_CARD_SUCCESS,
|
|
257
259
|
...data,
|
|
258
260
|
courseId: data.courseId
|
|
259
261
|
});
|
|
260
262
|
}
|
|
261
|
-
api.logEvent(
|
|
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:
|
|
269
|
+
eventType: SPEAKABLE_ANALYTICS.RESPOND_CARD_FAIL,
|
|
268
270
|
...data,
|
|
269
271
|
courseId: data.courseId
|
|
270
272
|
});
|
|
271
273
|
}
|
|
272
|
-
api.logEvent(
|
|
274
|
+
api.logEvent(SPEAKABLE_ANALYTICS.RESPOND_CARD_FAIL, data);
|
|
273
275
|
};
|
|
274
276
|
var logRespondSubmitted = (data) => {
|
|
275
|
-
api.logEvent(
|
|
277
|
+
api.logEvent(SPEAKABLE_ANALYTICS.RESPOND_CARD_SUBMITTED, data);
|
|
276
278
|
};
|
|
277
279
|
var logRespondError = (errorDetails) => {
|
|
278
|
-
api.logEvent(
|
|
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:
|
|
288
|
+
eventType: SPEAKABLE_ANALYTICS.RESPOND_WRITE_CARD_SUCCESS,
|
|
287
289
|
...data,
|
|
288
290
|
courseId: data.courseId
|
|
289
291
|
});
|
|
290
292
|
}
|
|
291
|
-
api.logEvent(
|
|
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:
|
|
299
|
+
eventType: SPEAKABLE_ANALYTICS.RESPOND_WRITE_CARD_FAIL,
|
|
298
300
|
...data,
|
|
299
301
|
courseId: data.courseId
|
|
300
302
|
});
|
|
301
303
|
}
|
|
302
|
-
api.logEvent(
|
|
304
|
+
api.logEvent(SPEAKABLE_ANALYTICS.RESPOND_WRITE_CARD_FAIL, data);
|
|
303
305
|
};
|
|
304
306
|
var logWrittenResponseSubmitted = (data = {}) => {
|
|
305
|
-
api.logEvent(
|
|
307
|
+
api.logEvent(SPEAKABLE_ANALYTICS.RESPOND_WRITE_CARD_SUBMITTED, data);
|
|
306
308
|
};
|
|
307
309
|
var logWrittenResponseError = (errorDetails) => {
|
|
308
|
-
api.logEvent(
|
|
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:
|
|
318
|
+
eventType: SPEAKABLE_ANALYTICS.RESPOND_FREE_PLAN,
|
|
317
319
|
...data,
|
|
318
320
|
courseId: data.courseId
|
|
319
321
|
});
|
|
320
322
|
}
|
|
321
|
-
api.logEvent(
|
|
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:
|
|
329
|
+
eventType: SPEAKABLE_ANALYTICS.RESPOND_WRITE_FREE_PLAN,
|
|
328
330
|
...data,
|
|
329
331
|
courseId: data.courseId
|
|
330
332
|
});
|
|
331
333
|
}
|
|
332
|
-
api.logEvent(
|
|
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:
|
|
340
|
+
eventType: SPEAKABLE_ANALYTICS.MC_SUCCESS,
|
|
339
341
|
courseId: data.courseId
|
|
340
342
|
});
|
|
341
343
|
}
|
|
342
|
-
api.logEvent(
|
|
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:
|
|
350
|
+
eventType: SPEAKABLE_ANALYTICS.MC_FAIL,
|
|
349
351
|
courseId: data.courseId
|
|
350
352
|
});
|
|
351
353
|
}
|
|
352
|
-
api.logEvent(
|
|
354
|
+
api.logEvent(SPEAKABLE_ANALYTICS.MC_FAIL, data);
|
|
353
355
|
};
|
|
354
356
|
var logMultipleChoiceError = (errorDetails) => {
|
|
355
|
-
api.logEvent(
|
|
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:
|
|
365
|
+
eventType: SPEAKABLE_ANALYTICS.SHORT_ANSWER_SUCCESS,
|
|
364
366
|
...data,
|
|
365
367
|
courseId: data.courseId
|
|
366
368
|
});
|
|
367
369
|
}
|
|
368
|
-
api.logEvent(
|
|
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:
|
|
376
|
+
eventType: SPEAKABLE_ANALYTICS.SHORT_ANSWER_FAIL,
|
|
375
377
|
...data,
|
|
376
378
|
courseId: data.courseId
|
|
377
379
|
});
|
|
378
380
|
}
|
|
379
|
-
api.logEvent(
|
|
381
|
+
api.logEvent(SPEAKABLE_ANALYTICS.SHORT_ANSWER_FAIL, data);
|
|
380
382
|
};
|
|
381
383
|
var logShortAnswerError = (errorDetails) => {
|
|
382
|
-
api.logEvent(
|
|
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:
|
|
392
|
+
eventType: SPEAKABLE_ANALYTICS.RETRY,
|
|
391
393
|
...data,
|
|
392
394
|
courseId: data.courseId
|
|
393
395
|
});
|
|
394
396
|
}
|
|
395
|
-
api.logEvent(
|
|
397
|
+
api.logEvent(SPEAKABLE_ANALYTICS.RETRY, data);
|
|
396
398
|
};
|
|
397
399
|
var logViewDetailsClick = (data = {}) => {
|
|
398
|
-
api.logEvent(
|
|
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:
|
|
409
|
+
eventType: SPEAKABLE_ANALYTICS.MESSAGE_SENT,
|
|
408
410
|
...data,
|
|
409
411
|
courseId: data.courseId
|
|
410
412
|
});
|
|
411
413
|
}
|
|
412
|
-
api.logEvent(
|
|
414
|
+
api.logEvent(SPEAKABLE_ANALYTICS.MESSAGE_SENT, data);
|
|
413
415
|
};
|
|
414
416
|
var logMessageError = (errorDetails = {}) => {
|
|
415
|
-
api.logEvent(
|
|
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:
|
|
428
|
+
eventType: SPEAKABLE_ANALYTICS.TABS_CLICK,
|
|
427
429
|
...data,
|
|
428
430
|
courseId: data.courseId
|
|
429
431
|
});
|
|
430
432
|
}
|
|
431
|
-
api.logEvent(
|
|
433
|
+
api.logEvent(SPEAKABLE_ANALYTICS.TABS_CLICK, data);
|
|
432
434
|
};
|
|
433
435
|
export {
|
|
434
436
|
logCreateAssignment,
|
package/dist/analytics.js.map
CHANGED
|
@@ -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"]}
|
package/dist/index.native.d.mts
CHANGED
|
@@ -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 };
|
package/dist/index.native.d.ts
CHANGED
|
@@ -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 };
|
package/dist/index.native.js
CHANGED
|
@@ -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
|
|
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:
|
|
996
|
+
eventType: SPEAKABLE_ANALYTICS.SUBMISSION,
|
|
994
997
|
...data
|
|
995
998
|
});
|
|
996
|
-
api.logEvent(
|
|
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:
|
|
1005
|
+
eventType: SPEAKABLE_ANALYTICS.ASSIGNMENT_STARTED,
|
|
1003
1006
|
...data
|
|
1004
1007
|
});
|
|
1005
1008
|
}
|
|
1006
|
-
api.logEvent(
|
|
1009
|
+
api.logEvent(SPEAKABLE_ANALYTICS.ASSIGNMENT_STARTED, data);
|
|
1007
1010
|
};
|
|
1008
1011
|
|
|
1009
1012
|
// src/domains/assignment/utils/create-default-score.ts
|