@speakableio/core 0.1.105 → 0.1.106
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/analytics.js +25 -329
- package/dist/analytics.js.map +1 -1
- package/dist/chunk-233VJDUF.js +149 -0
- package/dist/chunk-233VJDUF.js.map +1 -0
- package/dist/chunk-2CRI5MJP.js +225 -0
- package/dist/chunk-2CRI5MJP.js.map +1 -0
- package/dist/chunk-AWVUNWML.js +141 -0
- package/dist/chunk-AWVUNWML.js.map +1 -0
- package/dist/chunk-CJ5JXKII.js +129 -0
- package/dist/chunk-CJ5JXKII.js.map +1 -0
- package/dist/chunk-EEBMPASA.js +21 -0
- package/dist/chunk-EEBMPASA.js.map +1 -0
- package/dist/chunk-H5XNOXRC.js +11 -0
- package/dist/chunk-H5XNOXRC.js.map +1 -0
- package/dist/{models.cjs → chunk-LZG3MTSH.js} +10 -32
- package/dist/chunk-LZG3MTSH.js.map +1 -0
- package/dist/chunk-OLSTHM2U.js +154 -0
- package/dist/chunk-OLSTHM2U.js.map +1 -0
- package/dist/chunk-TQGDTKTE.js +13 -0
- package/dist/chunk-TQGDTKTE.js.map +1 -0
- package/dist/chunk-YKUMIPSO.js +212 -0
- package/dist/chunk-YKUMIPSO.js.map +1 -0
- package/dist/chunk-YMJRCINF.js +68 -0
- package/dist/chunk-YMJRCINF.js.map +1 -0
- package/dist/chunk-YO34TZYN.js +28 -0
- package/dist/chunk-YO34TZYN.js.map +1 -0
- package/dist/const.js +45 -355
- package/dist/const.js.map +1 -1
- package/dist/hooks.js +35 -591
- package/dist/hooks.js.map +1 -1
- package/dist/index.native.js +52 -64
- package/dist/index.native.js.map +1 -1
- package/dist/index.web.js +12 -427
- package/dist/index.web.js.map +1 -1
- package/dist/models.js +8 -43
- package/dist/models.js.map +1 -1
- package/dist/repos.js +13 -440
- package/dist/repos.js.map +1 -1
- package/dist/utils.js +14 -174
- package/dist/utils.js.map +1 -1
- package/package.json +6 -11
- package/dist/analytics.cjs +0 -376
- package/dist/analytics.cjs.map +0 -1
- package/dist/analytics.d.mts +0 -88
- package/dist/assignment.constants-BIKM6fYi.d.mts +0 -32
- package/dist/assignment.model-Bcbxx8oI.d.mts +0 -299
- package/dist/assignment.model-Lu21tZCh.d.mts +0 -301
- package/dist/card.constants-DhKFipX3.d.mts +0 -54
- package/dist/const.cjs +0 -526
- package/dist/const.cjs.map +0 -1
- package/dist/const.d.mts +0 -331
- package/dist/hooks.cjs +0 -1604
- package/dist/hooks.cjs.map +0 -1
- package/dist/hooks.d.mts +0 -294
- package/dist/index.native.d.mts +0 -591
- package/dist/index.native.mjs +0 -505
- package/dist/index.native.mjs.map +0 -1
- package/dist/index.web.cjs +0 -517
- package/dist/index.web.cjs.map +0 -1
- package/dist/index.web.d.mts +0 -405
- package/dist/models.cjs.map +0 -1
- package/dist/models.d.mts +0 -56
- package/dist/notification.constants-B72fb734.d.mts +0 -21
- package/dist/notification.constants-Da4-_0kX.d.mts +0 -21
- package/dist/repos.cjs +0 -486
- package/dist/repos.cjs.map +0 -1
- package/dist/repos.d.mts +0 -209
- package/dist/utils.cjs +0 -373
- package/dist/utils.cjs.map +0 -1
- package/dist/utils.d.mts +0 -39
package/dist/analytics.js
CHANGED
|
@@ -1,332 +1,28 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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
|
-
};
|
|
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";
|
|
330
26
|
export {
|
|
331
27
|
logCreateAssignment,
|
|
332
28
|
logFreePlanRespond,
|
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"],"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":[]}
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import {
|
|
2
|
+
refsCardsFiresotre
|
|
3
|
+
} from "./chunk-AWVUNWML.js";
|
|
4
|
+
import {
|
|
5
|
+
api
|
|
6
|
+
} from "./chunk-CJ5JXKII.js";
|
|
7
|
+
|
|
8
|
+
// src/domains/cards/services/create-card.service.ts
|
|
9
|
+
import { v4 } from "uuid";
|
|
10
|
+
|
|
11
|
+
// src/utils/error-handler.ts
|
|
12
|
+
var ServiceError = class extends Error {
|
|
13
|
+
constructor(message, originalError, code) {
|
|
14
|
+
super(message);
|
|
15
|
+
this.originalError = originalError;
|
|
16
|
+
this.code = code;
|
|
17
|
+
this.name = "ServiceError";
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
function withErrorHandler(fn, serviceName) {
|
|
21
|
+
return async (...args) => {
|
|
22
|
+
try {
|
|
23
|
+
return await fn(...args);
|
|
24
|
+
} catch (error) {
|
|
25
|
+
if (error instanceof Error && "code" in error) {
|
|
26
|
+
const firebaseError = error;
|
|
27
|
+
throw new ServiceError(
|
|
28
|
+
`Error in ${serviceName}: ${firebaseError.message}`,
|
|
29
|
+
error,
|
|
30
|
+
firebaseError.code
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
if (error instanceof Error) {
|
|
34
|
+
throw new ServiceError(`Error in ${serviceName}: ${error.message}`, error);
|
|
35
|
+
}
|
|
36
|
+
throw new ServiceError(`Unknown error in ${serviceName}`, error);
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// src/utils/text-utils.ts
|
|
42
|
+
import sha1 from "js-sha1";
|
|
43
|
+
var purify = (word) => {
|
|
44
|
+
return word.normalize("NFD").replace(/\/([^" "]*)/g, "").replace(/\([^()]*\)/g, "").replace(/([^()]*)/g, "").replace(/[\u0300-\u036f]/g, "").replace(/[-]/g, " ").replace(/[.,/#!¡¿?؟。,.?$%^&*;:{}=\-_`~()’'…\s]/g, "").replace(/\s\s+/g, " ").toLowerCase().trim();
|
|
45
|
+
};
|
|
46
|
+
var cleanString = (words) => {
|
|
47
|
+
const splitWords = words == null ? void 0 : words.split("+");
|
|
48
|
+
if (splitWords && splitWords.length === 1) {
|
|
49
|
+
const newWord = purify(words);
|
|
50
|
+
return newWord;
|
|
51
|
+
} else if (splitWords && splitWords.length > 1) {
|
|
52
|
+
const split = splitWords.map((w) => purify(w));
|
|
53
|
+
return split;
|
|
54
|
+
} else {
|
|
55
|
+
return "";
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
var getWordHash = (word, language) => {
|
|
59
|
+
const cleanedWord = cleanString(word);
|
|
60
|
+
const wordHash = sha1(`${language}-${cleanedWord}`);
|
|
61
|
+
console.log("wordHash core library", wordHash);
|
|
62
|
+
return wordHash;
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
// src/domains/cards/services/get-card-verification-status.service.ts
|
|
66
|
+
var charactarLanguages = ["zh", "ja", "ko"];
|
|
67
|
+
var getVerificationStatus = async (target_text, language) => {
|
|
68
|
+
if ((target_text == null ? void 0 : target_text.length) < 3 && !charactarLanguages.includes(language)) {
|
|
69
|
+
return "NOT_RECOMMENDED" /* NOT_RECOMMENDED */;
|
|
70
|
+
}
|
|
71
|
+
const hash = getWordHash(target_text, language);
|
|
72
|
+
const response = await api.getDoc(`checked-pronunciations/${hash}`);
|
|
73
|
+
try {
|
|
74
|
+
if (response.data) {
|
|
75
|
+
return processRecord(response.data);
|
|
76
|
+
} else {
|
|
77
|
+
return "NOT_CHECKED" /* NOT_CHECKED */;
|
|
78
|
+
}
|
|
79
|
+
} catch (e) {
|
|
80
|
+
return "NOT_CHECKED" /* NOT_CHECKED */;
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
var processRecord = (data) => {
|
|
84
|
+
const { pronunciations = 0, fails = 0 } = data;
|
|
85
|
+
const attempts = pronunciations + fails;
|
|
86
|
+
const successRate = attempts > 0 ? pronunciations / attempts * 100 : 0;
|
|
87
|
+
let newStatus = null;
|
|
88
|
+
if (attempts < 6) {
|
|
89
|
+
return "NOT_CHECKED" /* NOT_CHECKED */;
|
|
90
|
+
}
|
|
91
|
+
if (successRate > 25) {
|
|
92
|
+
newStatus = "VERIFIED" /* VERIFIED */;
|
|
93
|
+
} else if (successRate > 10) {
|
|
94
|
+
newStatus = "WARNING" /* WARNING */;
|
|
95
|
+
} else if (fails > 20 && successRate < 10 && pronunciations > 1) {
|
|
96
|
+
newStatus = "NOT_RECOMMENDED" /* NOT_RECOMMENDED */;
|
|
97
|
+
} else if (pronunciations === 0 && fails > 20) {
|
|
98
|
+
newStatus = "NOT_WORKING" /* NOT_WORKING */;
|
|
99
|
+
} else {
|
|
100
|
+
newStatus = "NOT_CHECKED" /* NOT_CHECKED */;
|
|
101
|
+
}
|
|
102
|
+
return newStatus;
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
// src/domains/cards/services/create-card.service.ts
|
|
106
|
+
async function _createCard({ data }) {
|
|
107
|
+
const response = await api.addDoc(refsCardsFiresotre.allCards, data);
|
|
108
|
+
return response;
|
|
109
|
+
}
|
|
110
|
+
var createCard = withErrorHandler(_createCard, "createCard");
|
|
111
|
+
async function _createCards({ cards }) {
|
|
112
|
+
const { writeBatch, doc } = api.accessHelpers();
|
|
113
|
+
const batch = writeBatch();
|
|
114
|
+
const cardsWithId = [];
|
|
115
|
+
for (const card of cards) {
|
|
116
|
+
const cardId = v4();
|
|
117
|
+
const ref = doc(refsCardsFiresotre.card(cardId));
|
|
118
|
+
const newCardObject = {
|
|
119
|
+
...card,
|
|
120
|
+
id: cardId
|
|
121
|
+
};
|
|
122
|
+
if (card.type === "READ_REPEAT" /* READ_REPEAT */ && card.target_text && card.language) {
|
|
123
|
+
const verificationStatus = await getVerificationStatus(card.target_text, card.language);
|
|
124
|
+
newCardObject.verificationStatus = verificationStatus || null;
|
|
125
|
+
}
|
|
126
|
+
cardsWithId.push(newCardObject);
|
|
127
|
+
batch.set(ref, newCardObject);
|
|
128
|
+
}
|
|
129
|
+
await batch.commit();
|
|
130
|
+
return cardsWithId;
|
|
131
|
+
}
|
|
132
|
+
var createCards = withErrorHandler(_createCards, "createCards");
|
|
133
|
+
|
|
134
|
+
// src/domains/cards/services/get-card.service.ts
|
|
135
|
+
async function _getCard(params) {
|
|
136
|
+
const ref = refsCardsFiresotre.card(params.cardId);
|
|
137
|
+
const response = await api.getDoc(ref);
|
|
138
|
+
if (!response.data) return null;
|
|
139
|
+
return response.data;
|
|
140
|
+
}
|
|
141
|
+
var getCard = withErrorHandler(_getCard, "getCard");
|
|
142
|
+
|
|
143
|
+
export {
|
|
144
|
+
withErrorHandler,
|
|
145
|
+
createCard,
|
|
146
|
+
createCards,
|
|
147
|
+
getCard
|
|
148
|
+
};
|
|
149
|
+
//# sourceMappingURL=chunk-233VJDUF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/domains/cards/services/create-card.service.ts","../src/utils/error-handler.ts","../src/utils/text-utils.ts","../src/domains/cards/services/get-card-verification-status.service.ts","../src/domains/cards/services/get-card.service.ts"],"sourcesContent":["import { v4 } from 'uuid'\nimport { api } from '@core/lib/firebase/api'\nimport { withErrorHandler } from '@core/utils/error-handler'\n\nimport { ActivityPageType, type PageActivityWithId, type PageActivity } from '../card.model'\nimport { refsCardsFiresotre } from '../card.constants'\n\nimport { getVerificationStatus } from './get-card-verification-status.service'\n\nasync function _createCard({ data }: { data: Partial<PageActivity> }) {\n const response = await api.addDoc(refsCardsFiresotre.allCards, data)\n\n return response\n}\n\nexport const createCard = withErrorHandler(_createCard, 'createCard')\n\nasync function _createCards({ cards }: { cards: PageActivity[] }) {\n const { writeBatch, doc } = api.accessHelpers()\n\n const batch = writeBatch()\n\n const cardsWithId = []\n\n for (const card of cards) {\n const cardId = v4()\n\n const ref = doc(refsCardsFiresotre.card(cardId))\n\n const newCardObject = {\n ...card,\n id: cardId,\n }\n\n if (card.type === ActivityPageType.READ_REPEAT && card.target_text && card.language) {\n const verificationStatus = await getVerificationStatus(card.target_text, card.language)\n\n newCardObject.verificationStatus = verificationStatus || null\n }\n cardsWithId.push(newCardObject)\n batch.set(ref, newCardObject)\n }\n\n await batch.commit()\n\n return cardsWithId satisfies PageActivityWithId[]\n}\n\nexport const createCards = withErrorHandler(_createCards, 'createCards')\n","// error-handler.ts\nimport { type FirebaseError } from 'firebase/app'\n\nexport class ServiceError extends Error {\n constructor(\n message: string,\n public readonly originalError?: unknown,\n public readonly code?: string,\n ) {\n super(message)\n this.name = 'ServiceError'\n }\n}\n\n// Preservamos los tipos de los parámetros\ntype AsyncFunction<T, P extends any[] = any[]> = (...args: P) => Promise<T>\n\nexport function withErrorHandler<T, P extends any[]>(\n fn: AsyncFunction<T, P>,\n serviceName: string,\n): AsyncFunction<T, P> {\n return async (...args: P): Promise<T> => {\n try {\n return await fn(...args)\n } catch (error) {\n if (error instanceof Error && 'code' in error) {\n const firebaseError = error as FirebaseError\n\n throw new ServiceError(\n `Error in ${serviceName}: ${firebaseError.message}`,\n error,\n firebaseError.code,\n )\n }\n\n if (error instanceof Error) {\n throw new ServiceError(`Error in ${serviceName}: ${error.message}`, error)\n }\n\n throw new ServiceError(`Unknown error in ${serviceName}`, error)\n }\n }\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-unsafe-call */\nimport sha1 from 'js-sha1'\n\nexport const purify = (word: string) => {\n return word\n .normalize('NFD')\n .replace(/\\/([^\" \"]*)/g, '') // removes word after slash to space el/la --> el\n .replace(/\\([^()]*\\)/g, '') // removes word parenthesis\n .replace(/([^()]*)/g, '') //removes chinese parenthesis\n .replace(/[\\u0300-\\u036f]/g, '') // removes diacritics\n .replace(/[-]/g, ' ') // removes hyphens\n .replace(/[.,/#!¡¿?؟。,.?$%^&*;:{}=\\-_`~()’'…\\s]/g, '') // removes punctuation\n .replace(/\\s\\s+/g, ' ') //Removes all whitespace\n .toLowerCase()\n .trim()\n}\n\nexport const cleanString = (words: string) => {\n const splitWords = words?.split('+')\n\n if (splitWords && splitWords.length === 1) {\n const newWord = purify(words)\n\n return newWord\n } else if (splitWords && splitWords.length > 1) {\n const split = splitWords.map(w => purify(w))\n\n return split\n } else {\n return ''\n }\n}\n\nexport const getWordHash = (word: string, language: string) => {\n const cleanedWord = cleanString(word)\n const wordHash = sha1(`${language}-${cleanedWord as string}`)\n\n console.log('wordHash core library', wordHash)\n\n return wordHash\n}\n\nexport function getPhraseLength(phrase: string, input?: string) {\n if (Array.isArray(phrase) && phrase.includes(input)) {\n return phrase[phrase.indexOf(input)].split(' ').length as number\n } else {\n return phrase ? phrase.split(' ').length : (0 as number)\n }\n}\n","/* eslint-disable @typescript-eslint/restrict-plus-operands */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\nimport { getWordHash } from '@core/utils/text-utils'\nimport { api } from '@core/lib/firebase/api'\n\nimport { VerificationCardStatus } from '../card.constants'\n\nconst charactarLanguages = ['zh', 'ja', 'ko']\n\nexport const getVerificationStatus = async (target_text: string, language: string) => {\n if (target_text?.length < 3 && !charactarLanguages.includes(language)) {\n return VerificationCardStatus.NOT_RECOMMENDED\n }\n const hash = getWordHash(target_text, language)\n const response = await api.getDoc<any>(`checked-pronunciations/${hash}`)\n\n try {\n if (response.data) {\n return processRecord(response.data)\n } else {\n return VerificationCardStatus.NOT_CHECKED\n }\n } catch (e) {\n return VerificationCardStatus.NOT_CHECKED\n }\n}\n\nconst processRecord = (data: any) => {\n const { pronunciations = 0, fails = 0 } = data\n const attempts = pronunciations + fails\n const successRate = attempts > 0 ? (pronunciations / attempts) * 100 : 0\n let newStatus = null\n\n if (attempts < 6) {\n return VerificationCardStatus.NOT_CHECKED\n }\n if (successRate > 25) {\n // console.log('Verified')\n newStatus = VerificationCardStatus.VERIFIED\n } else if (successRate > 10) {\n // console.log('Warning')\n newStatus = VerificationCardStatus.WARNING\n } else if (fails > 20 && successRate < 10 && pronunciations > 1) {\n // console.log('Not recommended for use')\n newStatus = VerificationCardStatus.NOT_RECOMMENDED\n } else if (pronunciations === 0 && fails > 20) {\n // console.log('does not work')\n newStatus = VerificationCardStatus.NOT_WORKING\n } else {\n // console.log('no data - must be checked')\n newStatus = VerificationCardStatus.NOT_CHECKED\n }\n\n return newStatus\n}\n","import { api } from '@core/lib/firebase/api'\nimport { withErrorHandler } from '@core/utils/error-handler'\n\nimport { type PageActivityWithId } from '../card.model'\nimport { refsCardsFiresotre } from '../card.constants'\n\nasync function _getCard(params: { cardId: string }) {\n const ref = refsCardsFiresotre.card(params.cardId)\n\n const response = await api.getDoc<PageActivityWithId>(ref)\n\n if (!response.data) return null\n\n return response.data\n}\n\nexport const getCard = withErrorHandler(_getCard, 'getCard')\n"],"mappings":"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","names":[]}
|