@speakableio/core 1.0.59 → 1.0.61

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.
@@ -0,0 +1,125 @@
1
+ import { FieldValue } from 'firebase/firestore';
2
+
3
+ interface GradingStandard {
4
+ type: 'actfl' | 'wida' | 'custom';
5
+ customStandardId?: string | undefined;
6
+ dateMade: FieldValue;
7
+ courseId?: string;
8
+ assignmentId?: string;
9
+ teacherId?: string;
10
+ cardId: string;
11
+ setId: string;
12
+ level: string;
13
+ justification: string;
14
+ prompt: string;
15
+ transcript: string;
16
+ audioUrl?: string;
17
+ responseType: 'spoken' | 'written';
18
+ language: string;
19
+ }
20
+
21
+ declare const logGradingStandardLog: (data: {
22
+ type: GradingStandard["type"];
23
+ level?: GradingStandard["level"];
24
+ courseId?: GradingStandard["courseId"];
25
+ }) => void;
26
+
27
+ declare const logOpenAssignment: (data?: {}) => void;
28
+ declare const logOpenActivityPreview: (data?: {}) => void;
29
+ declare const logSubmitAssignment: (data?: {}) => void;
30
+ declare const logCreateAssignment: (data?: {}) => void;
31
+ declare const logStartAssignment: (data?: {}) => void;
32
+ declare const logViewScoresModal: (data?: {}) => void;
33
+ declare const logViewMedia: (data?: {}) => void;
34
+ declare const logViewScores: (data?: {}) => void;
35
+ declare const logViewGradingMethod: (data?: {}) => void;
36
+ declare const logViewFeedback: (data?: {}) => void;
37
+
38
+ declare const logRepeatSuccess: (data?: {
39
+ courseId?: string;
40
+ [key: string]: any;
41
+ }) => void;
42
+ declare const logRepeatFail: (data?: {
43
+ courseId?: string;
44
+ [key: string]: any;
45
+ }) => void;
46
+ declare const logRespondSuccess: (data: {
47
+ courseId?: string;
48
+ [key: string]: any;
49
+ }) => void;
50
+ declare const logRespondFail: (data: {
51
+ courseId?: string;
52
+ [key: string]: any;
53
+ }) => void;
54
+ declare const logRespondSubmitted: (data: {
55
+ courseId?: string;
56
+ [key: string]: any;
57
+ }) => void;
58
+ declare const logRespondError: (errorDetails: {
59
+ courseId?: string;
60
+ [key: string]: any;
61
+ }) => void;
62
+ declare const logWrittenResponseSuccess: (data: {
63
+ courseId?: string;
64
+ [key: string]: any;
65
+ }) => void;
66
+ declare const logWrittenResponseFail: (data: {
67
+ courseId?: string;
68
+ [key: string]: any;
69
+ }) => void;
70
+ declare const logWrittenResponseSubmitted: (data?: {}) => void;
71
+ declare const logWrittenResponseError: (errorDetails: Record<string, unknown>) => void;
72
+ declare const logFreePlanRespond: (data: {
73
+ courseId?: string;
74
+ [key: string]: any;
75
+ }) => void;
76
+ declare const logFreePlanWrittenResponse: (data: {
77
+ courseId?: string;
78
+ [key: string]: any;
79
+ }) => void;
80
+ declare const logMultipleChoiceSuccess: (data: {
81
+ courseId?: string;
82
+ [key: string]: any;
83
+ }) => void;
84
+ declare const logMultipleChoiceFail: (data: {
85
+ courseId?: string;
86
+ [key: string]: any;
87
+ }) => void;
88
+ declare const logMultipleChoiceError: (errorDetails: {
89
+ courseId?: string;
90
+ [key: string]: any;
91
+ }) => void;
92
+ declare const logShortAnswerSuccess: (data: {
93
+ courseId?: string;
94
+ [key: string]: any;
95
+ }) => void;
96
+ declare const logShortAnswerFail: (data: {
97
+ courseId?: string;
98
+ [key: string]: any;
99
+ }) => void;
100
+ declare const logShortAnswerError: (errorDetails: {
101
+ courseId?: string;
102
+ [key: string]: any;
103
+ }) => void;
104
+ declare const logRetry: (data: {
105
+ courseId?: string;
106
+ [key: string]: any;
107
+ }) => void;
108
+ declare const logViewDetailsClick: (data?: {}) => void;
109
+
110
+ declare const logMessageSent: (data?: {
111
+ courseId?: string;
112
+ [key: string]: any;
113
+ }) => void;
114
+ declare const logMessageError: (errorDetails?: {
115
+ courseId?: string;
116
+ [key: string]: any;
117
+ }) => void;
118
+
119
+ declare const logTabsClick: (data?: {
120
+ courseId?: string;
121
+ tabName?: string;
122
+ [key: string]: any;
123
+ }) => void;
124
+
125
+ export { logCreateAssignment, logFreePlanRespond, logFreePlanWrittenResponse, logGradingStandardLog, logMessageError, logMessageSent, logMultipleChoiceError, logMultipleChoiceFail, logMultipleChoiceSuccess, logOpenActivityPreview, logOpenAssignment, logRepeatFail, logRepeatSuccess, logRespondError, logRespondFail, logRespondSubmitted, logRespondSuccess, logRetry, logShortAnswerError, logShortAnswerFail, logShortAnswerSuccess, logStartAssignment, logSubmitAssignment, logTabsClick, logViewDetailsClick, logViewFeedback, logViewGradingMethod, logViewMedia, logViewScores, logViewScoresModal, logWrittenResponseError, logWrittenResponseFail, logWrittenResponseSubmitted, logWrittenResponseSuccess };
@@ -0,0 +1,471 @@
1
+ // src/lib/firebase/api.ts
2
+ var FirebaseAPI = class _FirebaseAPI {
3
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
4
+ constructor() {
5
+ this.config = null;
6
+ }
7
+ static getInstance() {
8
+ if (!_FirebaseAPI.instance) {
9
+ _FirebaseAPI.instance = new _FirebaseAPI();
10
+ }
11
+ return _FirebaseAPI.instance;
12
+ }
13
+ initialize(config) {
14
+ this.config = config;
15
+ }
16
+ get db() {
17
+ if (!this.config) throw new Error("Firebase API not initialized");
18
+ return this.config.db;
19
+ }
20
+ get helpers() {
21
+ if (!this.config) throw new Error("Firebase API not initialized");
22
+ return this.config.helpers;
23
+ }
24
+ get httpsCallable() {
25
+ var _a;
26
+ return (_a = this.config) == null ? void 0 : _a.httpsCallable;
27
+ }
28
+ logEvent(name, data) {
29
+ var _a;
30
+ (_a = this.config) == null ? void 0 : _a.logEvent(name, data);
31
+ }
32
+ accessQueryConstraints() {
33
+ const { query, orderBy, limit, startAt, startAfter, endAt, endBefore, where, increment } = this.helpers;
34
+ return {
35
+ query,
36
+ orderBy,
37
+ limit,
38
+ startAt,
39
+ startAfter,
40
+ endAt,
41
+ endBefore,
42
+ where,
43
+ increment
44
+ };
45
+ }
46
+ accessHelpers() {
47
+ const { doc, collection, writeBatch, serverTimestamp, setDoc } = this.helpers;
48
+ return {
49
+ doc: (path) => doc(this.db, path),
50
+ collection: (path) => collection(this.db, path),
51
+ writeBatch: () => writeBatch(this.db),
52
+ serverTimestamp,
53
+ setDoc
54
+ };
55
+ }
56
+ async getDoc(path) {
57
+ const { getDoc, doc } = this.helpers;
58
+ const docRef = doc(this.db, path);
59
+ const docSnap = await getDoc(docRef);
60
+ const data = docSnap.exists() ? {
61
+ ...docSnap.data(),
62
+ id: docSnap.id
63
+ } : null;
64
+ return {
65
+ id: docSnap.id,
66
+ data
67
+ };
68
+ }
69
+ async getDocs(path, ...queryConstraints) {
70
+ const { getDocs, query, collection } = this.helpers;
71
+ const collectionRef = collection(this.db, path);
72
+ const q = queryConstraints.length > 0 ? query(collectionRef, ...queryConstraints) : collectionRef;
73
+ const querySnapshot = await getDocs(q);
74
+ const data = querySnapshot.docs.map((doc) => ({
75
+ data: doc.data(),
76
+ id: doc.id
77
+ }));
78
+ return {
79
+ data,
80
+ querySnapshot,
81
+ empty: querySnapshot.empty
82
+ };
83
+ }
84
+ async addDoc(path, data) {
85
+ const { addDoc, collection } = this.helpers;
86
+ const collectionRef = collection(this.db, path);
87
+ const docRef = await addDoc(collectionRef, data);
88
+ return {
89
+ ...data,
90
+ id: docRef.id
91
+ };
92
+ }
93
+ async setDoc(path, data, options = {}) {
94
+ const { setDoc, doc } = this.helpers;
95
+ const docRef = doc(this.db, path);
96
+ await setDoc(docRef, data, options);
97
+ }
98
+ async updateDoc(path, data) {
99
+ const { updateDoc, doc } = this.helpers;
100
+ const docRef = doc(this.db, path);
101
+ await updateDoc(docRef, data);
102
+ }
103
+ async deleteDoc(path) {
104
+ const { deleteDoc, doc } = this.helpers;
105
+ const docRef = doc(this.db, path);
106
+ await deleteDoc(docRef);
107
+ }
108
+ async runTransaction(updateFunction) {
109
+ const { runTransaction } = this.helpers;
110
+ return runTransaction(this.db, updateFunction);
111
+ }
112
+ async runBatch(operations) {
113
+ const { writeBatch } = this.helpers;
114
+ const batch = writeBatch(this.db);
115
+ await Promise.all(operations.map((op) => op()));
116
+ await batch.commit();
117
+ }
118
+ writeBatch() {
119
+ const { writeBatch } = this.helpers;
120
+ const batch = writeBatch(this.db);
121
+ return batch;
122
+ }
123
+ };
124
+ var api = FirebaseAPI.getInstance();
125
+
126
+ // src/lib/firebase/firebase-analytics/grading-standard.ts
127
+ var logGradingStandardLog = (data) => {
128
+ var _a, _b, _c;
129
+ if (data.courseId && data.type && data.level) {
130
+ (_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, "handleCouresAnalyticsEvent")) == null ? void 0 : _c({
131
+ eventType: data.type || "custom",
132
+ level: data.level,
133
+ courseId: data.courseId
134
+ });
135
+ }
136
+ api.logEvent("logGradingStandard", data);
137
+ };
138
+
139
+ // src/constants/analytics.constants.ts
140
+ var SPEAKABLE_ANALYTICS = {
141
+ VOICE_SUCCESS: "voice_success",
142
+ VOICE_FALLBACK_SUCCESS: "voice_fallback_success",
143
+ VOICE_FALLBACK_FAIL: "voice_fallback_fail",
144
+ VOICE_FAIL: "voice_fail",
145
+ RESPOND_CARD_SUCCESS: "respond_card_success",
146
+ RESPOND_CARD_FAIL: "respond_card_fail",
147
+ RESPOND_WRITE_CARD_SUCCESS: "respond_write_card_success",
148
+ RESPOND_WRITE_CARD_FAIL: "respond_write_card_fail",
149
+ RESPOND_WRITE_CARD_SUBMITTED: "respond_write_card_submitted",
150
+ RESPOND_WRITE_CARD_ERROR: "respond_write_card_error",
151
+ RESPOND_CARD_ERROR: "respond_card_error",
152
+ RESPOND_CARD_SUBMITTED: "respond_card_submitted",
153
+ RESPOND_FREE_PLAN: "respond_free_plan",
154
+ RESPOND_WRITE_FREE_PLAN: "respond_write_free_plan",
155
+ SUBMISSION: "assignment_submitted",
156
+ ASSIGNMENT_STARTED: "assignment_started",
157
+ CREATE_ASSIGNMENT: "create_assignment",
158
+ MC_SUCCESS: "multiple_choice_success",
159
+ MC_FAIL: "multiple_choice_fail",
160
+ MC_ERROR: "multiple_choice_error",
161
+ ACTFL_LEVEL: "actfl_level",
162
+ WIDA_LEVEL: "wida_level",
163
+ // New events
164
+ VIEW_SCORES_MODAL: "view_scores_modal",
165
+ SHORT_ANSWER_SUCCESS: "short_answer_success",
166
+ SHORT_ANSWER_FAIL: "short_answer_fail",
167
+ SHORT_ANSWER_ERROR: "short_answer_error",
168
+ RETRY: "retry",
169
+ MESSAGE_SENT: "message_sent",
170
+ MESSAGE_ERROR: "message_error",
171
+ VIEW_DETAILS_CLICK: "view_details_click",
172
+ TABS_CLICK: "tabs_click",
173
+ VIEW_MEDIA: "view_media",
174
+ VIEW_SCORES: "view_scores",
175
+ VIEW_GRADING_METHOD: "view_grading_method",
176
+ VIEW_FEEDBACK: "view_feedback"
177
+ };
178
+
179
+ // src/lib/firebase/firebase-analytics/assignment.ts
180
+ var logOpenAssignment = (data = {}) => {
181
+ api.logEvent("open_assignment", data);
182
+ };
183
+ var logOpenActivityPreview = (data = {}) => {
184
+ api.logEvent("open_activity_preview", data);
185
+ };
186
+ var logSubmitAssignment = (data = {}) => {
187
+ var _a, _b, _c;
188
+ (_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, "handleCouresAnalyticsEvent")) == null ? void 0 : _c({
189
+ eventType: SPEAKABLE_ANALYTICS.SUBMISSION,
190
+ ...data
191
+ });
192
+ api.logEvent(SPEAKABLE_ANALYTICS.SUBMISSION, data);
193
+ };
194
+ var logCreateAssignment = (data = {}) => {
195
+ var _a, _b, _c;
196
+ if (data.courseId) {
197
+ (_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, "handleCouresAnalyticsEvent")) == null ? void 0 : _c({
198
+ eventType: SPEAKABLE_ANALYTICS.CREATE_ASSIGNMENT,
199
+ ...data
200
+ });
201
+ }
202
+ api.logEvent(SPEAKABLE_ANALYTICS.CREATE_ASSIGNMENT, data);
203
+ };
204
+ var logStartAssignment = (data = {}) => {
205
+ var _a, _b, _c;
206
+ if (data.courseId) {
207
+ (_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, "handleCouresAnalyticsEvent")) == null ? void 0 : _c({
208
+ eventType: SPEAKABLE_ANALYTICS.ASSIGNMENT_STARTED,
209
+ ...data
210
+ });
211
+ }
212
+ api.logEvent(SPEAKABLE_ANALYTICS.ASSIGNMENT_STARTED, data);
213
+ };
214
+ var logViewScoresModal = (data = {}) => {
215
+ api.logEvent(SPEAKABLE_ANALYTICS.VIEW_SCORES_MODAL, data);
216
+ };
217
+ var logViewMedia = (data = {}) => {
218
+ api.logEvent(SPEAKABLE_ANALYTICS.VIEW_MEDIA, data);
219
+ };
220
+ var logViewScores = (data = {}) => {
221
+ api.logEvent(SPEAKABLE_ANALYTICS.VIEW_SCORES, data);
222
+ };
223
+ var logViewGradingMethod = (data = {}) => {
224
+ api.logEvent(SPEAKABLE_ANALYTICS.VIEW_GRADING_METHOD, data);
225
+ };
226
+ var logViewFeedback = (data = {}) => {
227
+ api.logEvent(SPEAKABLE_ANALYTICS.VIEW_FEEDBACK, data);
228
+ };
229
+
230
+ // src/lib/firebase/firebase-analytics/page-analytics.ts
231
+ var HANDLE_COURSE_ANALYTICS_EVENT = "handleCouresAnalyticsEvent";
232
+ var logRepeatSuccess = (data = {}) => {
233
+ var _a, _b, _c;
234
+ if (data.courseId) {
235
+ (_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, HANDLE_COURSE_ANALYTICS_EVENT)) == null ? void 0 : _c({
236
+ eventType: SPEAKABLE_ANALYTICS.VOICE_SUCCESS,
237
+ ...data,
238
+ courseId: data.courseId
239
+ });
240
+ }
241
+ api.logEvent(SPEAKABLE_ANALYTICS.VOICE_SUCCESS, data);
242
+ };
243
+ var logRepeatFail = (data = {}) => {
244
+ var _a, _b, _c;
245
+ if (data.courseId) {
246
+ (_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, HANDLE_COURSE_ANALYTICS_EVENT)) == null ? void 0 : _c({
247
+ eventType: SPEAKABLE_ANALYTICS.VOICE_FAIL,
248
+ ...data,
249
+ courseId: data.courseId
250
+ });
251
+ }
252
+ api.logEvent(SPEAKABLE_ANALYTICS.VOICE_FAIL, data);
253
+ };
254
+ var logRespondSuccess = (data) => {
255
+ var _a, _b, _c;
256
+ if (data.courseId) {
257
+ (_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, HANDLE_COURSE_ANALYTICS_EVENT)) == null ? void 0 : _c({
258
+ eventType: SPEAKABLE_ANALYTICS.RESPOND_CARD_SUCCESS,
259
+ ...data,
260
+ courseId: data.courseId
261
+ });
262
+ }
263
+ api.logEvent(SPEAKABLE_ANALYTICS.RESPOND_CARD_SUCCESS, data);
264
+ };
265
+ var logRespondFail = (data) => {
266
+ var _a, _b, _c;
267
+ if (data.courseId) {
268
+ (_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, HANDLE_COURSE_ANALYTICS_EVENT)) == null ? void 0 : _c({
269
+ eventType: SPEAKABLE_ANALYTICS.RESPOND_CARD_FAIL,
270
+ ...data,
271
+ courseId: data.courseId
272
+ });
273
+ }
274
+ api.logEvent(SPEAKABLE_ANALYTICS.RESPOND_CARD_FAIL, data);
275
+ };
276
+ var logRespondSubmitted = (data) => {
277
+ api.logEvent(SPEAKABLE_ANALYTICS.RESPOND_CARD_SUBMITTED, data);
278
+ };
279
+ var logRespondError = (errorDetails) => {
280
+ api.logEvent(SPEAKABLE_ANALYTICS.RESPOND_CARD_ERROR, {
281
+ errorDetails
282
+ });
283
+ };
284
+ var logWrittenResponseSuccess = (data) => {
285
+ var _a, _b, _c;
286
+ if (data.courseId) {
287
+ (_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, HANDLE_COURSE_ANALYTICS_EVENT)) == null ? void 0 : _c({
288
+ eventType: SPEAKABLE_ANALYTICS.RESPOND_WRITE_CARD_SUCCESS,
289
+ ...data,
290
+ courseId: data.courseId
291
+ });
292
+ }
293
+ api.logEvent(SPEAKABLE_ANALYTICS.RESPOND_WRITE_CARD_SUCCESS, data);
294
+ };
295
+ var logWrittenResponseFail = (data) => {
296
+ var _a, _b, _c;
297
+ if (data.courseId) {
298
+ (_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, HANDLE_COURSE_ANALYTICS_EVENT)) == null ? void 0 : _c({
299
+ eventType: SPEAKABLE_ANALYTICS.RESPOND_WRITE_CARD_FAIL,
300
+ ...data,
301
+ courseId: data.courseId
302
+ });
303
+ }
304
+ api.logEvent(SPEAKABLE_ANALYTICS.RESPOND_WRITE_CARD_FAIL, data);
305
+ };
306
+ var logWrittenResponseSubmitted = (data = {}) => {
307
+ api.logEvent(SPEAKABLE_ANALYTICS.RESPOND_WRITE_CARD_SUBMITTED, data);
308
+ };
309
+ var logWrittenResponseError = (errorDetails) => {
310
+ api.logEvent(SPEAKABLE_ANALYTICS.RESPOND_WRITE_CARD_ERROR, {
311
+ errorDetails
312
+ });
313
+ };
314
+ var logFreePlanRespond = (data) => {
315
+ var _a, _b, _c;
316
+ if (data.courseId) {
317
+ (_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, HANDLE_COURSE_ANALYTICS_EVENT)) == null ? void 0 : _c({
318
+ eventType: SPEAKABLE_ANALYTICS.RESPOND_FREE_PLAN,
319
+ ...data,
320
+ courseId: data.courseId
321
+ });
322
+ }
323
+ api.logEvent(SPEAKABLE_ANALYTICS.RESPOND_FREE_PLAN, data);
324
+ };
325
+ var logFreePlanWrittenResponse = (data) => {
326
+ var _a, _b, _c;
327
+ if (data.courseId) {
328
+ (_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, HANDLE_COURSE_ANALYTICS_EVENT)) == null ? void 0 : _c({
329
+ eventType: SPEAKABLE_ANALYTICS.RESPOND_WRITE_FREE_PLAN,
330
+ ...data,
331
+ courseId: data.courseId
332
+ });
333
+ }
334
+ api.logEvent(SPEAKABLE_ANALYTICS.RESPOND_WRITE_FREE_PLAN, data);
335
+ };
336
+ var logMultipleChoiceSuccess = (data) => {
337
+ var _a, _b, _c;
338
+ if (data.courseId) {
339
+ (_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, HANDLE_COURSE_ANALYTICS_EVENT)) == null ? void 0 : _c({
340
+ eventType: SPEAKABLE_ANALYTICS.MC_SUCCESS,
341
+ courseId: data.courseId
342
+ });
343
+ }
344
+ api.logEvent(SPEAKABLE_ANALYTICS.MC_SUCCESS, data);
345
+ };
346
+ var logMultipleChoiceFail = (data) => {
347
+ var _a, _b, _c;
348
+ if (data.courseId) {
349
+ (_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, HANDLE_COURSE_ANALYTICS_EVENT)) == null ? void 0 : _c({
350
+ eventType: SPEAKABLE_ANALYTICS.MC_FAIL,
351
+ courseId: data.courseId
352
+ });
353
+ }
354
+ api.logEvent(SPEAKABLE_ANALYTICS.MC_FAIL, data);
355
+ };
356
+ var logMultipleChoiceError = (errorDetails) => {
357
+ api.logEvent(SPEAKABLE_ANALYTICS.MC_ERROR, {
358
+ errorDetails
359
+ });
360
+ };
361
+ var logShortAnswerSuccess = (data) => {
362
+ var _a, _b, _c;
363
+ if (data.courseId) {
364
+ (_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, HANDLE_COURSE_ANALYTICS_EVENT)) == null ? void 0 : _c({
365
+ eventType: SPEAKABLE_ANALYTICS.SHORT_ANSWER_SUCCESS,
366
+ ...data,
367
+ courseId: data.courseId
368
+ });
369
+ }
370
+ api.logEvent(SPEAKABLE_ANALYTICS.SHORT_ANSWER_SUCCESS, data);
371
+ };
372
+ var logShortAnswerFail = (data) => {
373
+ var _a, _b, _c;
374
+ if (data.courseId) {
375
+ (_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, HANDLE_COURSE_ANALYTICS_EVENT)) == null ? void 0 : _c({
376
+ eventType: SPEAKABLE_ANALYTICS.SHORT_ANSWER_FAIL,
377
+ ...data,
378
+ courseId: data.courseId
379
+ });
380
+ }
381
+ api.logEvent(SPEAKABLE_ANALYTICS.SHORT_ANSWER_FAIL, data);
382
+ };
383
+ var logShortAnswerError = (errorDetails) => {
384
+ api.logEvent(SPEAKABLE_ANALYTICS.SHORT_ANSWER_ERROR, {
385
+ errorDetails
386
+ });
387
+ };
388
+ var logRetry = (data) => {
389
+ var _a, _b, _c;
390
+ if (data.courseId) {
391
+ (_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, HANDLE_COURSE_ANALYTICS_EVENT)) == null ? void 0 : _c({
392
+ eventType: SPEAKABLE_ANALYTICS.RETRY,
393
+ ...data,
394
+ courseId: data.courseId
395
+ });
396
+ }
397
+ api.logEvent(SPEAKABLE_ANALYTICS.RETRY, data);
398
+ };
399
+ var logViewDetailsClick = (data = {}) => {
400
+ api.logEvent(SPEAKABLE_ANALYTICS.VIEW_DETAILS_CLICK, data);
401
+ };
402
+
403
+ // src/lib/firebase/firebase-analytics/message.ts
404
+ var HANDLE_COURSE_ANALYTICS_EVENT2 = "handleCouresAnalyticsEvent";
405
+ var logMessageSent = (data = {}) => {
406
+ var _a, _b, _c;
407
+ if (data.courseId) {
408
+ (_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, HANDLE_COURSE_ANALYTICS_EVENT2)) == null ? void 0 : _c({
409
+ eventType: SPEAKABLE_ANALYTICS.MESSAGE_SENT,
410
+ ...data,
411
+ courseId: data.courseId
412
+ });
413
+ }
414
+ api.logEvent(SPEAKABLE_ANALYTICS.MESSAGE_SENT, data);
415
+ };
416
+ var logMessageError = (errorDetails = {}) => {
417
+ api.logEvent(SPEAKABLE_ANALYTICS.MESSAGE_ERROR, {
418
+ errorDetails
419
+ });
420
+ };
421
+
422
+ // src/lib/firebase/firebase-analytics/tabs.ts
423
+ var HANDLE_COURSE_ANALYTICS_EVENT3 = "handleCouresAnalyticsEvent";
424
+ var logTabsClick = (data = {}) => {
425
+ var _a, _b, _c;
426
+ if (data.courseId) {
427
+ (_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, HANDLE_COURSE_ANALYTICS_EVENT3)) == null ? void 0 : _c({
428
+ eventType: SPEAKABLE_ANALYTICS.TABS_CLICK,
429
+ ...data,
430
+ courseId: data.courseId
431
+ });
432
+ }
433
+ api.logEvent(SPEAKABLE_ANALYTICS.TABS_CLICK, data);
434
+ };
435
+ export {
436
+ logCreateAssignment,
437
+ logFreePlanRespond,
438
+ logFreePlanWrittenResponse,
439
+ logGradingStandardLog,
440
+ logMessageError,
441
+ logMessageSent,
442
+ logMultipleChoiceError,
443
+ logMultipleChoiceFail,
444
+ logMultipleChoiceSuccess,
445
+ logOpenActivityPreview,
446
+ logOpenAssignment,
447
+ logRepeatFail,
448
+ logRepeatSuccess,
449
+ logRespondError,
450
+ logRespondFail,
451
+ logRespondSubmitted,
452
+ logRespondSuccess,
453
+ logRetry,
454
+ logShortAnswerError,
455
+ logShortAnswerFail,
456
+ logShortAnswerSuccess,
457
+ logStartAssignment,
458
+ logSubmitAssignment,
459
+ logTabsClick,
460
+ logViewDetailsClick,
461
+ logViewFeedback,
462
+ logViewGradingMethod,
463
+ logViewMedia,
464
+ logViewScores,
465
+ logViewScoresModal,
466
+ logWrittenResponseError,
467
+ logWrittenResponseFail,
468
+ logWrittenResponseSubmitted,
469
+ logWrittenResponseSuccess
470
+ };
471
+ //# sourceMappingURL=analytics.js.map
@@ -0,0 +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 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"]}