@speakableio/core 0.1.106 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/dist/analytics-Bj2i88Zk.d.ts +89 -0
  2. package/dist/analytics.d.mts +88 -0
  3. package/dist/analytics.js +329 -25
  4. package/dist/analytics.js.map +1 -1
  5. package/dist/{assignment.model-DLMWAp0Y.d.ts → assignment.model-BRS4h8gX.d.ts} +1 -1
  6. package/dist/assignment.model-Bc61gBHl.d.ts +302 -0
  7. package/dist/assignment.model-Bm9gE2YK.d.ts +301 -0
  8. package/dist/const.d.ts +3 -73
  9. package/dist/const.js +355 -45
  10. package/dist/const.js.map +1 -1
  11. package/dist/everything.d.ts +1348 -0
  12. package/dist/everything.js +3509 -0
  13. package/dist/everything.js.map +1 -0
  14. package/dist/hooks.d.ts +621 -4
  15. package/dist/hooks.js +1745 -61
  16. package/dist/hooks.js.map +1 -1
  17. package/dist/index.native.d.mts +2836 -0
  18. package/dist/index.native.d.ts +2272 -27
  19. package/dist/index.native.js +2995 -166
  20. package/dist/index.native.js.map +1 -1
  21. package/dist/index.native.mjs +3322 -0
  22. package/dist/index.native.mjs.map +1 -0
  23. package/dist/index.web-DNYJV_41.d.ts +469 -0
  24. package/dist/index.web.d.mts +2836 -0
  25. package/dist/index.web.d.ts +68 -2
  26. package/dist/index.web.js +3244 -12
  27. package/dist/index.web.js.map +1 -1
  28. package/dist/models.d.ts +2 -2
  29. package/dist/models.js +43 -8
  30. package/dist/models.js.map +1 -1
  31. package/dist/{notification.constants-Da4-_0kX.d.ts → notification.constants-B72fb734.d.ts} +1 -1
  32. package/dist/repos.d.ts +1 -1
  33. package/dist/repos.js +440 -13
  34. package/dist/repos.js.map +1 -1
  35. package/dist/speakable-plans-BjWWEWrQ.d.ts +72 -0
  36. package/dist/speakable-plans-DR1cQ6IK.d.ts +92 -0
  37. package/dist/speakable-plans-Dq9nRefI.d.ts +72 -0
  38. package/dist/utils.d.ts +84 -2
  39. package/dist/utils.js +481 -15
  40. package/dist/utils.js.map +1 -1
  41. package/dist/web.constants-qmx4rGyO.d.ts +26 -0
  42. package/package.json +11 -62
  43. package/dist/chunk-233VJDUF.js +0 -149
  44. package/dist/chunk-233VJDUF.js.map +0 -1
  45. package/dist/chunk-2CRI5MJP.js +0 -225
  46. package/dist/chunk-2CRI5MJP.js.map +0 -1
  47. package/dist/chunk-AWVUNWML.js +0 -141
  48. package/dist/chunk-AWVUNWML.js.map +0 -1
  49. package/dist/chunk-CJ5JXKII.js +0 -129
  50. package/dist/chunk-CJ5JXKII.js.map +0 -1
  51. package/dist/chunk-EEBMPASA.js +0 -21
  52. package/dist/chunk-EEBMPASA.js.map +0 -1
  53. package/dist/chunk-H5XNOXRC.js +0 -11
  54. package/dist/chunk-H5XNOXRC.js.map +0 -1
  55. package/dist/chunk-LZG3MTSH.js +0 -53
  56. package/dist/chunk-LZG3MTSH.js.map +0 -1
  57. package/dist/chunk-OLSTHM2U.js +0 -154
  58. package/dist/chunk-OLSTHM2U.js.map +0 -1
  59. package/dist/chunk-TQGDTKTE.js +0 -13
  60. package/dist/chunk-TQGDTKTE.js.map +0 -1
  61. package/dist/chunk-YKUMIPSO.js +0 -212
  62. package/dist/chunk-YKUMIPSO.js.map +0 -1
  63. package/dist/chunk-YMJRCINF.js +0 -68
  64. package/dist/chunk-YMJRCINF.js.map +0 -1
  65. package/dist/chunk-YO34TZYN.js +0 -28
  66. package/dist/chunk-YO34TZYN.js.map +0 -1
@@ -0,0 +1,89 @@
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
+ declare const addGradingStandardLog: (gradingStandard: GradingStandard, userId: string) => Promise<void>;
21
+
22
+ declare const logGradingStandardLog: (data: {
23
+ type: GradingStandard["type"];
24
+ level?: GradingStandard["level"];
25
+ courseId?: GradingStandard["courseId"];
26
+ }) => void;
27
+
28
+ declare const logOpenAssignment: (data?: {}) => void;
29
+ declare const logOpenActivityPreview: (data?: {}) => void;
30
+ declare const logSubmitAssignment: (data?: {}) => void;
31
+ declare const logCreateAssignment: (data?: {}) => void;
32
+ declare const logStartAssignment: (data?: {}) => void;
33
+
34
+ declare const logRepeatSuccess: (data?: {
35
+ courseId?: string;
36
+ [key: string]: any;
37
+ }) => void;
38
+ declare const logRepeatFail: (data?: {
39
+ courseId?: string;
40
+ [key: string]: any;
41
+ }) => void;
42
+ declare const logRespondSuccess: (data: {
43
+ courseId?: string;
44
+ [key: string]: any;
45
+ }) => void;
46
+ declare const logRespondFail: (data: {
47
+ courseId?: string;
48
+ [key: string]: any;
49
+ }) => void;
50
+ declare const logRespondSubmitted: (data: {
51
+ courseId?: string;
52
+ [key: string]: any;
53
+ }) => void;
54
+ declare const logRespondError: (errorDetails: {
55
+ courseId?: string;
56
+ [key: string]: any;
57
+ }) => void;
58
+ declare const logWrittenResponseSuccess: (data: {
59
+ courseId?: string;
60
+ [key: string]: any;
61
+ }) => void;
62
+ declare const logWrittenResponseFail: (data: {
63
+ courseId?: string;
64
+ [key: string]: any;
65
+ }) => void;
66
+ declare const logWrittenResponseSubmitted: (data?: {}) => void;
67
+ declare const logWrittenResponseError: (errorDetails: Record<string, unknown>) => void;
68
+ declare const logFreePlanRespond: (data: {
69
+ courseId?: string;
70
+ [key: string]: any;
71
+ }) => void;
72
+ declare const logFreePlanWrittenResponse: (data: {
73
+ courseId?: string;
74
+ [key: string]: any;
75
+ }) => void;
76
+ declare const logMultipleChoiceSuccess: (data: {
77
+ courseId?: string;
78
+ [key: string]: any;
79
+ }) => void;
80
+ declare const logMultipleChoiceFail: (data: {
81
+ courseId?: string;
82
+ [key: string]: any;
83
+ }) => void;
84
+ declare const logMultipleChoiceError: (errorDetails: {
85
+ courseId?: string;
86
+ [key: string]: any;
87
+ }) => void;
88
+
89
+ export { type GradingStandard as G, addGradingStandardLog as a, logOpenAssignment as b, logOpenActivityPreview as c, logSubmitAssignment as d, logCreateAssignment as e, logStartAssignment as f, logRepeatSuccess as g, logRepeatFail as h, logRespondSuccess as i, logRespondFail as j, logRespondSubmitted as k, logGradingStandardLog as l, logRespondError as m, logWrittenResponseSuccess as n, logWrittenResponseFail as o, logWrittenResponseSubmitted as p, logWrittenResponseError as q, logFreePlanRespond as r, logFreePlanWrittenResponse as s, logMultipleChoiceSuccess as t, logMultipleChoiceFail as u, logMultipleChoiceError as v };
@@ -0,0 +1,88 @@
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
+
33
+ declare const logRepeatSuccess: (data?: {
34
+ courseId?: string;
35
+ [key: string]: any;
36
+ }) => void;
37
+ declare const logRepeatFail: (data?: {
38
+ courseId?: string;
39
+ [key: string]: any;
40
+ }) => void;
41
+ declare const logRespondSuccess: (data: {
42
+ courseId?: string;
43
+ [key: string]: any;
44
+ }) => void;
45
+ declare const logRespondFail: (data: {
46
+ courseId?: string;
47
+ [key: string]: any;
48
+ }) => void;
49
+ declare const logRespondSubmitted: (data: {
50
+ courseId?: string;
51
+ [key: string]: any;
52
+ }) => void;
53
+ declare const logRespondError: (errorDetails: {
54
+ courseId?: string;
55
+ [key: string]: any;
56
+ }) => void;
57
+ declare const logWrittenResponseSuccess: (data: {
58
+ courseId?: string;
59
+ [key: string]: any;
60
+ }) => void;
61
+ declare const logWrittenResponseFail: (data: {
62
+ courseId?: string;
63
+ [key: string]: any;
64
+ }) => void;
65
+ declare const logWrittenResponseSubmitted: (data?: {}) => void;
66
+ declare const logWrittenResponseError: (errorDetails: Record<string, unknown>) => void;
67
+ declare const logFreePlanRespond: (data: {
68
+ courseId?: string;
69
+ [key: string]: any;
70
+ }) => void;
71
+ declare const logFreePlanWrittenResponse: (data: {
72
+ courseId?: string;
73
+ [key: string]: any;
74
+ }) => void;
75
+ declare const logMultipleChoiceSuccess: (data: {
76
+ courseId?: string;
77
+ [key: string]: any;
78
+ }) => void;
79
+ declare const logMultipleChoiceFail: (data: {
80
+ courseId?: string;
81
+ [key: string]: any;
82
+ }) => void;
83
+ declare const logMultipleChoiceError: (errorDetails: {
84
+ courseId?: string;
85
+ [key: string]: any;
86
+ }) => void;
87
+
88
+ export { logCreateAssignment, logFreePlanRespond, logFreePlanWrittenResponse, logGradingStandardLog, logMultipleChoiceError, logMultipleChoiceFail, logMultipleChoiceSuccess, logOpenActivityPreview, logOpenAssignment, logRepeatFail, logRepeatSuccess, logRespondError, logRespondFail, logRespondSubmitted, logRespondSuccess, logStartAssignment, logSubmitAssignment, logWrittenResponseError, logWrittenResponseFail, logWrittenResponseSubmitted, logWrittenResponseSuccess };
package/dist/analytics.js CHANGED
@@ -1,28 +1,332 @@
1
- import {
2
- logCreateAssignment,
3
- logFreePlanRespond,
4
- logFreePlanWrittenResponse,
5
- logGradingStandardLog,
6
- logMultipleChoiceError,
7
- logMultipleChoiceFail,
8
- logMultipleChoiceSuccess,
9
- logOpenActivityPreview,
10
- logOpenAssignment,
11
- logRepeatFail,
12
- logRepeatSuccess,
13
- logRespondError,
14
- logRespondFail,
15
- logRespondSubmitted,
16
- logRespondSuccess,
17
- logStartAssignment,
18
- logSubmitAssignment,
19
- logWrittenResponseError,
20
- logWrittenResponseFail,
21
- logWrittenResponseSubmitted,
22
- logWrittenResponseSuccess
23
- } from "./chunk-YKUMIPSO.js";
24
- import "./chunk-YO34TZYN.js";
25
- import "./chunk-CJ5JXKII.js";
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 ANALYTICS_EVENT_TYPES = {
141
+ VOICE_SUCCESS: "voice_success",
142
+ VOICE_FAIL: "voice_fail",
143
+ RESPOND_CARD_SUCCESS: "respond_card_success",
144
+ RESPOND_CARD_FAIL: "respond_card_fail",
145
+ RESPOND_WRITE_CARD_SUCCESS: "respond_write_card_success",
146
+ RESPOND_WRITE_CARD_FAIL: "respond_write_card_fail",
147
+ RESPOND_WRITE_CARD_SUBMITTED: "respond_write_card_submitted",
148
+ RESPOND_WRITE_CARD_ERROR: "respond_write_card_error",
149
+ RESPOND_CARD_ERROR: "respond_card_error",
150
+ RESPOND_CARD_SUBMITTED: "respond_card_submitted",
151
+ RESPOND_FREE_PLAN: "respond_free_plan",
152
+ RESPOND_WRITE_FREE_PLAN: "respond_write_free_plan",
153
+ SUBMISSION: "assignment_submitted",
154
+ ASSIGNMENT_STARTED: "assignment_started",
155
+ CREATE_ASSIGNMENT: "create_assignment",
156
+ MC_SUCCESS: "multiple_choice_success",
157
+ MC_FAIL: "multiple_choice_fail",
158
+ MC_ERROR: "multiple_choice_error",
159
+ ACTFL_LEVEL: "actfl_level",
160
+ WIDA_LEVEL: "wida_level"
161
+ };
162
+
163
+ // src/lib/firebase/firebase-analytics/assignment.ts
164
+ var logOpenAssignment = (data = {}) => {
165
+ api.logEvent("open_assignment", data);
166
+ };
167
+ var logOpenActivityPreview = (data = {}) => {
168
+ api.logEvent("open_activity_preview", data);
169
+ };
170
+ var logSubmitAssignment = (data = {}) => {
171
+ var _a, _b, _c;
172
+ (_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, "handleCouresAnalyticsEvent")) == null ? void 0 : _c({
173
+ eventType: ANALYTICS_EVENT_TYPES.SUBMISSION,
174
+ ...data
175
+ });
176
+ api.logEvent(ANALYTICS_EVENT_TYPES.SUBMISSION, data);
177
+ };
178
+ var logCreateAssignment = (data = {}) => {
179
+ var _a, _b, _c;
180
+ if (data.courseId) {
181
+ (_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, "handleCouresAnalyticsEvent")) == null ? void 0 : _c({
182
+ eventType: ANALYTICS_EVENT_TYPES.CREATE_ASSIGNMENT,
183
+ ...data
184
+ });
185
+ }
186
+ api.logEvent(ANALYTICS_EVENT_TYPES.CREATE_ASSIGNMENT, data);
187
+ };
188
+ var logStartAssignment = (data = {}) => {
189
+ var _a, _b, _c;
190
+ if (data.courseId) {
191
+ (_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, "handleCouresAnalyticsEvent")) == null ? void 0 : _c({
192
+ eventType: ANALYTICS_EVENT_TYPES.ASSIGNMENT_STARTED,
193
+ ...data
194
+ });
195
+ }
196
+ api.logEvent(ANALYTICS_EVENT_TYPES.ASSIGNMENT_STARTED, data);
197
+ };
198
+
199
+ // src/lib/firebase/firebase-analytics/page-analytics.ts
200
+ var HANDLE_COURSE_ANALYTICS_EVENT = "handleCouresAnalyticsEvent";
201
+ var logRepeatSuccess = (data = {}) => {
202
+ var _a, _b, _c;
203
+ if (data.courseId) {
204
+ (_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, HANDLE_COURSE_ANALYTICS_EVENT)) == null ? void 0 : _c({
205
+ eventType: ANALYTICS_EVENT_TYPES.VOICE_SUCCESS,
206
+ ...data,
207
+ courseId: data.courseId
208
+ });
209
+ }
210
+ api.logEvent(ANALYTICS_EVENT_TYPES.VOICE_SUCCESS, data);
211
+ };
212
+ var logRepeatFail = (data = {}) => {
213
+ var _a, _b, _c;
214
+ if (data.courseId) {
215
+ (_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, HANDLE_COURSE_ANALYTICS_EVENT)) == null ? void 0 : _c({
216
+ eventType: ANALYTICS_EVENT_TYPES.VOICE_FAIL,
217
+ ...data,
218
+ courseId: data.courseId
219
+ });
220
+ }
221
+ api.logEvent(ANALYTICS_EVENT_TYPES.VOICE_FAIL, data);
222
+ };
223
+ var logRespondSuccess = (data) => {
224
+ var _a, _b, _c;
225
+ if (data.courseId) {
226
+ (_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, HANDLE_COURSE_ANALYTICS_EVENT)) == null ? void 0 : _c({
227
+ eventType: ANALYTICS_EVENT_TYPES.RESPOND_CARD_SUCCESS,
228
+ ...data,
229
+ courseId: data.courseId
230
+ });
231
+ }
232
+ api.logEvent(ANALYTICS_EVENT_TYPES.RESPOND_CARD_SUCCESS, data);
233
+ };
234
+ var logRespondFail = (data) => {
235
+ var _a, _b, _c;
236
+ if (data.courseId) {
237
+ (_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, HANDLE_COURSE_ANALYTICS_EVENT)) == null ? void 0 : _c({
238
+ eventType: ANALYTICS_EVENT_TYPES.RESPOND_CARD_FAIL,
239
+ ...data,
240
+ courseId: data.courseId
241
+ });
242
+ }
243
+ api.logEvent(ANALYTICS_EVENT_TYPES.RESPOND_CARD_FAIL, data);
244
+ };
245
+ var logRespondSubmitted = (data) => {
246
+ api.logEvent(ANALYTICS_EVENT_TYPES.RESPOND_CARD_SUBMITTED, data);
247
+ };
248
+ var logRespondError = (errorDetails) => {
249
+ api.logEvent(ANALYTICS_EVENT_TYPES.RESPOND_CARD_ERROR, {
250
+ errorDetails
251
+ });
252
+ };
253
+ var logWrittenResponseSuccess = (data) => {
254
+ var _a, _b, _c;
255
+ if (data.courseId) {
256
+ (_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, HANDLE_COURSE_ANALYTICS_EVENT)) == null ? void 0 : _c({
257
+ eventType: ANALYTICS_EVENT_TYPES.RESPOND_WRITE_CARD_SUCCESS,
258
+ ...data,
259
+ courseId: data.courseId
260
+ });
261
+ }
262
+ api.logEvent(ANALYTICS_EVENT_TYPES.RESPOND_WRITE_CARD_SUCCESS, data);
263
+ };
264
+ var logWrittenResponseFail = (data) => {
265
+ var _a, _b, _c;
266
+ if (data.courseId) {
267
+ (_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, HANDLE_COURSE_ANALYTICS_EVENT)) == null ? void 0 : _c({
268
+ eventType: ANALYTICS_EVENT_TYPES.RESPOND_WRITE_CARD_FAIL,
269
+ ...data,
270
+ courseId: data.courseId
271
+ });
272
+ }
273
+ api.logEvent(ANALYTICS_EVENT_TYPES.RESPOND_WRITE_CARD_FAIL, data);
274
+ };
275
+ var logWrittenResponseSubmitted = (data = {}) => {
276
+ api.logEvent(ANALYTICS_EVENT_TYPES.RESPOND_WRITE_CARD_SUBMITTED, data);
277
+ };
278
+ var logWrittenResponseError = (errorDetails) => {
279
+ api.logEvent(ANALYTICS_EVENT_TYPES.RESPOND_WRITE_CARD_ERROR, {
280
+ errorDetails
281
+ });
282
+ };
283
+ var logFreePlanRespond = (data) => {
284
+ var _a, _b, _c;
285
+ if (data.courseId) {
286
+ (_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, HANDLE_COURSE_ANALYTICS_EVENT)) == null ? void 0 : _c({
287
+ eventType: ANALYTICS_EVENT_TYPES.RESPOND_FREE_PLAN,
288
+ ...data,
289
+ courseId: data.courseId
290
+ });
291
+ }
292
+ api.logEvent(ANALYTICS_EVENT_TYPES.RESPOND_FREE_PLAN, data);
293
+ };
294
+ var logFreePlanWrittenResponse = (data) => {
295
+ var _a, _b, _c;
296
+ if (data.courseId) {
297
+ (_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, HANDLE_COURSE_ANALYTICS_EVENT)) == null ? void 0 : _c({
298
+ eventType: ANALYTICS_EVENT_TYPES.RESPOND_WRITE_FREE_PLAN,
299
+ ...data,
300
+ courseId: data.courseId
301
+ });
302
+ }
303
+ api.logEvent(ANALYTICS_EVENT_TYPES.RESPOND_WRITE_FREE_PLAN, data);
304
+ };
305
+ var logMultipleChoiceSuccess = (data) => {
306
+ var _a, _b, _c;
307
+ if (data.courseId) {
308
+ (_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, HANDLE_COURSE_ANALYTICS_EVENT)) == null ? void 0 : _c({
309
+ eventType: ANALYTICS_EVENT_TYPES.MC_SUCCESS,
310
+ courseId: data.courseId
311
+ });
312
+ }
313
+ api.logEvent(ANALYTICS_EVENT_TYPES.MC_SUCCESS, data);
314
+ };
315
+ var logMultipleChoiceFail = (data) => {
316
+ var _a, _b, _c;
317
+ if (data.courseId) {
318
+ (_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, HANDLE_COURSE_ANALYTICS_EVENT)) == null ? void 0 : _c({
319
+ eventType: ANALYTICS_EVENT_TYPES.MC_FAIL,
320
+ courseId: data.courseId
321
+ });
322
+ }
323
+ api.logEvent(ANALYTICS_EVENT_TYPES.MC_FAIL, data);
324
+ };
325
+ var logMultipleChoiceError = (errorDetails) => {
326
+ api.logEvent(ANALYTICS_EVENT_TYPES.MC_ERROR, {
327
+ errorDetails
328
+ });
329
+ };
26
330
  export {
27
331
  logCreateAssignment,
28
332
  logFreePlanRespond,
@@ -1 +1 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
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"],"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} 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","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"],"mappings":"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","names":[]}
@@ -298,4 +298,4 @@ interface PageScore {
298
298
  hint?: string[];
299
299
  }
300
300
 
301
- export { type AssignmentWithId as A, type CallableFunction as C, type FirebaseInstance as F, MULTIPLE_CHOICE_PAGE_ACTIVITY_TYPES as M, type PageActivity as P, RESPOND_PAGE_ACTIVITY_TYPES as R, type ScoreWithId as S, type FirestoreHelpers as a, type CustomTimestamp as b, ActivityPageType as c, type PageActivityWithId as d, type Score as e, type PageScore as f, type Assignment as g, REPEAT_PAGE_ACTIVITY_TYPES as h, RESPOND_WRITE_PAGE_ACTIVITY_TYPES as i, RESPOND_AUDIO_PAGE_ACTIVITY_TYPES as j };
301
+ export { type AssignmentWithId as A, type CallableFunction as C, type FirebaseInstance as F, MULTIPLE_CHOICE_PAGE_ACTIVITY_TYPES as M, type PageActivity as P, RESPOND_PAGE_ACTIVITY_TYPES as R, type Score as S, type FirestoreHelpers as a, type CustomTimestamp as b, ActivityPageType as c, type PageActivityWithId as d, type ScoreWithId as e, type PageScore as f, type Assignment as g, REPEAT_PAGE_ACTIVITY_TYPES as h, RESPOND_WRITE_PAGE_ACTIVITY_TYPES as i, RESPOND_AUDIO_PAGE_ACTIVITY_TYPES as j };