@speakableio/core 0.1.103 → 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/{assignment.model-Lu21tZCh.d.mts → assignment.model-DLMWAp0Y.d.ts} +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/chunk-LZG3MTSH.js +53 -0
- 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.d.ts +331 -0
- package/dist/const.js +170 -162
- package/dist/const.js.map +1 -1
- package/dist/{hooks.d.mts → hooks.d.ts} +5 -5
- 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.d.mts → index.web.d.ts} +3 -3
- package/dist/index.web.js +12 -427
- package/dist/index.web.js.map +1 -1
- package/dist/{models.d.mts → models.d.ts} +3 -3
- package/dist/models.js +8 -43
- package/dist/models.js.map +1 -1
- package/dist/{notification.constants-B72fb734.d.mts → notification.constants-Da4-_0kX.d.ts} +1 -1
- package/dist/{repos.d.mts → repos.d.ts} +4 -4
- package/dist/repos.js +13 -440
- package/dist/repos.js.map +1 -1
- package/dist/{utils.d.mts → utils.d.ts} +2 -2
- package/dist/utils.js +14 -174
- package/dist/utils.js.map +1 -1
- package/package.json +21 -25
- package/dist/assignment.model-Bcbxx8oI.d.mts +0 -299
- package/dist/const.d.mts +0 -26
- 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/{analytics.d.mts → analytics.d.ts} +0 -0
- /package/dist/{assignment.constants-BIKM6fYi.d.mts → assignment.constants-BIKM6fYi.d.ts} +0 -0
- /package/dist/{card.constants-DhKFipX3.d.mts → card.constants-DhKFipX3.d.ts} +0 -0
package/dist/hooks.js
CHANGED
|
@@ -1,3 +1,38 @@
|
|
|
1
|
+
import {
|
|
2
|
+
logStartAssignment,
|
|
3
|
+
logSubmitAssignment
|
|
4
|
+
} from "./chunk-YKUMIPSO.js";
|
|
5
|
+
import {
|
|
6
|
+
ANALYTICS_PLANS,
|
|
7
|
+
ASSIGNMENT_SETTINGS_PLANS,
|
|
8
|
+
SPEAKABLE_NOTIFICATIONS,
|
|
9
|
+
SpeakableNotificationTypes,
|
|
10
|
+
WEB_BASE_URL,
|
|
11
|
+
refsScoresPractice
|
|
12
|
+
} from "./chunk-2CRI5MJP.js";
|
|
13
|
+
import "./chunk-YO34TZYN.js";
|
|
14
|
+
import {
|
|
15
|
+
getSet
|
|
16
|
+
} from "./chunk-EEBMPASA.js";
|
|
17
|
+
import {
|
|
18
|
+
createCard,
|
|
19
|
+
createCards,
|
|
20
|
+
getCard,
|
|
21
|
+
withErrorHandler
|
|
22
|
+
} from "./chunk-233VJDUF.js";
|
|
23
|
+
import "./chunk-H5XNOXRC.js";
|
|
24
|
+
import {
|
|
25
|
+
refsAssignmentFiresotre
|
|
26
|
+
} from "./chunk-AWVUNWML.js";
|
|
27
|
+
import {
|
|
28
|
+
calculateScoreAndProgress_default,
|
|
29
|
+
defaultScore
|
|
30
|
+
} from "./chunk-YMJRCINF.js";
|
|
31
|
+
import {
|
|
32
|
+
api
|
|
33
|
+
} from "./chunk-CJ5JXKII.js";
|
|
34
|
+
import "./chunk-LZG3MTSH.js";
|
|
35
|
+
|
|
1
36
|
// src/providers/SpeakableProvider.tsx
|
|
2
37
|
import { createContext, useContext, useEffect, useState } from "react";
|
|
3
38
|
import { jsx } from "react/jsx-runtime";
|
|
@@ -72,162 +107,6 @@ var handleOptimisticUpdate = async ({
|
|
|
72
107
|
return { previousData };
|
|
73
108
|
};
|
|
74
109
|
|
|
75
|
-
// src/constants/speakable-plans.ts
|
|
76
|
-
var FEEDBACK_PLANS = {
|
|
77
|
-
FEEDBACK_TRANSCRIPT: "FEEDBACK_TRANSCRIPT",
|
|
78
|
-
// Transcript from the audio
|
|
79
|
-
FEEDBACK_SUMMARY: "FEEDBACK_SUMMARY",
|
|
80
|
-
// Chatty summary (Free plan)
|
|
81
|
-
FEEDBACK_GRAMMAR_INSIGHTS: "FEEDBACK_GRAMMAR_INSIGHTS",
|
|
82
|
-
// Grammar insights
|
|
83
|
-
FEEDBACK_SUGGESTED_RESPONSE: "FEEDBACK_SUGGESTED_RESPONSE",
|
|
84
|
-
// Suggested Response
|
|
85
|
-
FEEDBACK_RUBRIC: "FEEDBACK_RUBRIC",
|
|
86
|
-
// Suggested Response
|
|
87
|
-
FEEDBACK_GRADING_STANDARDS: "FEEDBACK_GRADING_STANDARDS",
|
|
88
|
-
// ACTFL / WIDA Estimate
|
|
89
|
-
FEEDBACK_TARGET_LANGUAGE: "FEEDBACK_TARGET_LANGUAGE",
|
|
90
|
-
// Ability to set the feedback language to the target language of the student
|
|
91
|
-
FEEDBACK_DISABLE_ALLOW_RETRIES: "FEEDBACK_DISABLE_ALLOW_RETRIES"
|
|
92
|
-
// Turn of allow retries
|
|
93
|
-
};
|
|
94
|
-
var AUTO_GRADING_PLANS = {
|
|
95
|
-
AUTO_GRADING_PASS_FAIL: "AUTO_GRADING_PASS_FAIL",
|
|
96
|
-
// Pass / fail grading
|
|
97
|
-
AUTO_GRADING_RUBRICS: "AUTO_GRADING_RUBRICS",
|
|
98
|
-
// Autograded rubrics
|
|
99
|
-
AUTO_GRADING_STANDARDS_BASED: "AUTO_GRADING_STANDARDS_BASED"
|
|
100
|
-
// Standards based grading
|
|
101
|
-
};
|
|
102
|
-
var AI_ASSISTANT_PLANS = {
|
|
103
|
-
AI_ASSISTANT_DOCUMENT_UPLOADS: "AI_ASSISTANT_DOCUMENT_UPLOADS",
|
|
104
|
-
// Allow document uploading
|
|
105
|
-
AI_ASSISTANT_UNLIMITED_USE: "AI_ASSISTANT_UNLIMITED_USE"
|
|
106
|
-
// Allow unlimited use of AI assistant. Otherwise, limits are used.
|
|
107
|
-
};
|
|
108
|
-
var ASSIGNMENT_SETTINGS_PLANS = {
|
|
109
|
-
ASSESSMENTS: "ASSESSMENTS",
|
|
110
|
-
// Ability to create assessment assignment types
|
|
111
|
-
GOOGLE_CLASSROOM_GRADE_PASSBACK: "GOOGLE_CLASSROOM_GRADE_PASSBACK"
|
|
112
|
-
// Assignment scores can sync with classroom
|
|
113
|
-
};
|
|
114
|
-
var ANALYTICS_PLANS = {
|
|
115
|
-
ANALYTICS_GRADEBOOK: "ANALYTICS_GRADEBOOK",
|
|
116
|
-
// Access to the gradebook page
|
|
117
|
-
ANALYTICS_CLASSROOM_ANALYTICS: "ANALYTICS_CLASSROOM_ANALYTICS",
|
|
118
|
-
// Access to the classroom analytics page
|
|
119
|
-
ANALYTICS_STUDENT_PROGRESS_REPORTS: "ANALYTICS_STUDENT_PROGRESS_REPORTS",
|
|
120
|
-
// Access to the panel that shows an individual student's progress and assignments
|
|
121
|
-
ANALYTICS_ASSIGNMENT_RESULTS: "ANALYTICS_ASSIGNMENT_RESULTS",
|
|
122
|
-
// Access to the assigment RESULTS page
|
|
123
|
-
ANALYTICS_ORGANIZATION: "ANALYTICS_ORGANIZATION"
|
|
124
|
-
// Access to the organization analytics panel (for permitted admins)
|
|
125
|
-
};
|
|
126
|
-
var SPACES_PLANS = {
|
|
127
|
-
SPACES_CREATE_SPACE: "SPACES_CREATE_SPACE",
|
|
128
|
-
// Ability to create spaces
|
|
129
|
-
SPACES_CHECK_POINTS: "SPACES_CHECK_POINTS"
|
|
130
|
-
// Feature not available yet. Ability to create checkpoints for spaces for data aggregation
|
|
131
|
-
};
|
|
132
|
-
var DISCOVER_PLANS = {
|
|
133
|
-
DISCOVER_ORGANIZATION_LIBRARY: "DISCOVER_ORGANIZATION_LIBRARY"
|
|
134
|
-
// Access to the organizations shared library
|
|
135
|
-
};
|
|
136
|
-
var MEDIA_AREA_PLANS = {
|
|
137
|
-
MEDIA_AREA_DOCUMENT_UPLOAD: "MEDIA_AREA_DOCUMENT_UPLOAD",
|
|
138
|
-
MEDIA_AREA_AUDIO_FILES: "MEDIA_AREA_AUDIO_FILES"
|
|
139
|
-
};
|
|
140
|
-
var FREE_PLAN = [];
|
|
141
|
-
var TEACHER_PRO_PLAN = [
|
|
142
|
-
FEEDBACK_PLANS.FEEDBACK_TRANSCRIPT,
|
|
143
|
-
FEEDBACK_PLANS.FEEDBACK_SUMMARY,
|
|
144
|
-
FEEDBACK_PLANS.FEEDBACK_TARGET_LANGUAGE,
|
|
145
|
-
AUTO_GRADING_PLANS.AUTO_GRADING_PASS_FAIL,
|
|
146
|
-
ANALYTICS_PLANS.ANALYTICS_GRADEBOOK,
|
|
147
|
-
SPACES_PLANS.SPACES_CREATE_SPACE
|
|
148
|
-
// AUTO_GRADING_PLANS.AUTO_GRADING_STANDARDS_BASED,
|
|
149
|
-
];
|
|
150
|
-
var SCHOOL_STARTER = [
|
|
151
|
-
FEEDBACK_PLANS.FEEDBACK_TRANSCRIPT,
|
|
152
|
-
FEEDBACK_PLANS.FEEDBACK_SUMMARY,
|
|
153
|
-
FEEDBACK_PLANS.FEEDBACK_GRAMMAR_INSIGHTS,
|
|
154
|
-
FEEDBACK_PLANS.FEEDBACK_SUGGESTED_RESPONSE,
|
|
155
|
-
FEEDBACK_PLANS.FEEDBACK_RUBRIC,
|
|
156
|
-
FEEDBACK_PLANS.FEEDBACK_GRADING_STANDARDS,
|
|
157
|
-
FEEDBACK_PLANS.FEEDBACK_DISABLE_ALLOW_RETRIES,
|
|
158
|
-
FEEDBACK_PLANS.FEEDBACK_TARGET_LANGUAGE,
|
|
159
|
-
AUTO_GRADING_PLANS.AUTO_GRADING_PASS_FAIL,
|
|
160
|
-
AUTO_GRADING_PLANS.AUTO_GRADING_RUBRICS,
|
|
161
|
-
AUTO_GRADING_PLANS.AUTO_GRADING_STANDARDS_BASED,
|
|
162
|
-
AI_ASSISTANT_PLANS.AI_ASSISTANT_DOCUMENT_UPLOADS,
|
|
163
|
-
AI_ASSISTANT_PLANS.AI_ASSISTANT_UNLIMITED_USE,
|
|
164
|
-
// ASSIGNMENT_SETTINGS_PLANS.ASSESSMENTS,
|
|
165
|
-
ASSIGNMENT_SETTINGS_PLANS.GOOGLE_CLASSROOM_GRADE_PASSBACK,
|
|
166
|
-
ANALYTICS_PLANS.ANALYTICS_GRADEBOOK,
|
|
167
|
-
ANALYTICS_PLANS.ANALYTICS_STUDENT_PROGRESS_REPORTS,
|
|
168
|
-
ANALYTICS_PLANS.ANALYTICS_CLASSROOM_ANALYTICS,
|
|
169
|
-
// ANALYTICS_PLANS.ANALYTICS_ORGANIZATION,
|
|
170
|
-
SPACES_PLANS.SPACES_CREATE_SPACE,
|
|
171
|
-
SPACES_PLANS.SPACES_CHECK_POINTS,
|
|
172
|
-
// DISCOVER_PLANS.DISCOVER_ORGANIZATION_LIBRARY,
|
|
173
|
-
MEDIA_AREA_PLANS.MEDIA_AREA_DOCUMENT_UPLOAD,
|
|
174
|
-
MEDIA_AREA_PLANS.MEDIA_AREA_AUDIO_FILES
|
|
175
|
-
];
|
|
176
|
-
var ORGANIZATION_PLAN = [
|
|
177
|
-
FEEDBACK_PLANS.FEEDBACK_TRANSCRIPT,
|
|
178
|
-
FEEDBACK_PLANS.FEEDBACK_SUMMARY,
|
|
179
|
-
FEEDBACK_PLANS.FEEDBACK_GRAMMAR_INSIGHTS,
|
|
180
|
-
FEEDBACK_PLANS.FEEDBACK_SUGGESTED_RESPONSE,
|
|
181
|
-
FEEDBACK_PLANS.FEEDBACK_RUBRIC,
|
|
182
|
-
FEEDBACK_PLANS.FEEDBACK_GRADING_STANDARDS,
|
|
183
|
-
FEEDBACK_PLANS.FEEDBACK_DISABLE_ALLOW_RETRIES,
|
|
184
|
-
FEEDBACK_PLANS.FEEDBACK_TARGET_LANGUAGE,
|
|
185
|
-
AUTO_GRADING_PLANS.AUTO_GRADING_PASS_FAIL,
|
|
186
|
-
AUTO_GRADING_PLANS.AUTO_GRADING_RUBRICS,
|
|
187
|
-
AUTO_GRADING_PLANS.AUTO_GRADING_STANDARDS_BASED,
|
|
188
|
-
AI_ASSISTANT_PLANS.AI_ASSISTANT_DOCUMENT_UPLOADS,
|
|
189
|
-
AI_ASSISTANT_PLANS.AI_ASSISTANT_UNLIMITED_USE,
|
|
190
|
-
ASSIGNMENT_SETTINGS_PLANS.ASSESSMENTS,
|
|
191
|
-
ASSIGNMENT_SETTINGS_PLANS.GOOGLE_CLASSROOM_GRADE_PASSBACK,
|
|
192
|
-
ANALYTICS_PLANS.ANALYTICS_GRADEBOOK,
|
|
193
|
-
ANALYTICS_PLANS.ANALYTICS_STUDENT_PROGRESS_REPORTS,
|
|
194
|
-
ANALYTICS_PLANS.ANALYTICS_CLASSROOM_ANALYTICS,
|
|
195
|
-
ANALYTICS_PLANS.ANALYTICS_ORGANIZATION,
|
|
196
|
-
SPACES_PLANS.SPACES_CREATE_SPACE,
|
|
197
|
-
SPACES_PLANS.SPACES_CHECK_POINTS,
|
|
198
|
-
DISCOVER_PLANS.DISCOVER_ORGANIZATION_LIBRARY,
|
|
199
|
-
MEDIA_AREA_PLANS.MEDIA_AREA_DOCUMENT_UPLOAD,
|
|
200
|
-
MEDIA_AREA_PLANS.MEDIA_AREA_AUDIO_FILES
|
|
201
|
-
];
|
|
202
|
-
var SpeakablePlanTypes = {
|
|
203
|
-
basic: "basic",
|
|
204
|
-
teacher_pro: "teacher_pro",
|
|
205
|
-
school_starter: "school_starter",
|
|
206
|
-
organization: "organization",
|
|
207
|
-
// OLD PLANS
|
|
208
|
-
starter: "starter",
|
|
209
|
-
growth: "growth",
|
|
210
|
-
professional: "professional"
|
|
211
|
-
};
|
|
212
|
-
var SpeakablePermissionsMap = {
|
|
213
|
-
[SpeakablePlanTypes.basic]: FREE_PLAN,
|
|
214
|
-
[SpeakablePlanTypes.starter]: TEACHER_PRO_PLAN,
|
|
215
|
-
[SpeakablePlanTypes.teacher_pro]: TEACHER_PRO_PLAN,
|
|
216
|
-
[SpeakablePlanTypes.growth]: ORGANIZATION_PLAN,
|
|
217
|
-
[SpeakablePlanTypes.professional]: ORGANIZATION_PLAN,
|
|
218
|
-
[SpeakablePlanTypes.organization]: ORGANIZATION_PLAN,
|
|
219
|
-
[SpeakablePlanTypes.school_starter]: SCHOOL_STARTER
|
|
220
|
-
};
|
|
221
|
-
var SpeakablePlanHierarchy = [
|
|
222
|
-
SpeakablePlanTypes.basic,
|
|
223
|
-
SpeakablePlanTypes.starter,
|
|
224
|
-
SpeakablePlanTypes.teacher_pro,
|
|
225
|
-
SpeakablePlanTypes.growth,
|
|
226
|
-
SpeakablePlanTypes.professional,
|
|
227
|
-
SpeakablePlanTypes.school_starter,
|
|
228
|
-
SpeakablePlanTypes.organization
|
|
229
|
-
];
|
|
230
|
-
|
|
231
110
|
// src/hooks/usePermissions.ts
|
|
232
111
|
var usePermissions = () => {
|
|
233
112
|
const { permissions } = useSpeakableApi();
|
|
@@ -256,131 +135,6 @@ var usePermissions = () => {
|
|
|
256
135
|
};
|
|
257
136
|
var usePermissions_default = usePermissions;
|
|
258
137
|
|
|
259
|
-
// src/lib/firebase/api.ts
|
|
260
|
-
var FirebaseAPI = class _FirebaseAPI {
|
|
261
|
-
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
262
|
-
constructor() {
|
|
263
|
-
this.config = null;
|
|
264
|
-
}
|
|
265
|
-
static getInstance() {
|
|
266
|
-
if (!_FirebaseAPI.instance) {
|
|
267
|
-
_FirebaseAPI.instance = new _FirebaseAPI();
|
|
268
|
-
}
|
|
269
|
-
return _FirebaseAPI.instance;
|
|
270
|
-
}
|
|
271
|
-
initialize(config) {
|
|
272
|
-
this.config = config;
|
|
273
|
-
}
|
|
274
|
-
get db() {
|
|
275
|
-
if (!this.config) throw new Error("Firebase API not initialized");
|
|
276
|
-
return this.config.db;
|
|
277
|
-
}
|
|
278
|
-
get helpers() {
|
|
279
|
-
if (!this.config) throw new Error("Firebase API not initialized");
|
|
280
|
-
return this.config.helpers;
|
|
281
|
-
}
|
|
282
|
-
get httpsCallable() {
|
|
283
|
-
var _a;
|
|
284
|
-
return (_a = this.config) == null ? void 0 : _a.httpsCallable;
|
|
285
|
-
}
|
|
286
|
-
logEvent(name, data) {
|
|
287
|
-
var _a;
|
|
288
|
-
(_a = this.config) == null ? void 0 : _a.logEvent(name, data);
|
|
289
|
-
}
|
|
290
|
-
accessQueryConstraints() {
|
|
291
|
-
const { query, orderBy, limit, startAt, startAfter, endAt, endBefore, where, increment } = this.helpers;
|
|
292
|
-
return {
|
|
293
|
-
query,
|
|
294
|
-
orderBy,
|
|
295
|
-
limit,
|
|
296
|
-
startAt,
|
|
297
|
-
startAfter,
|
|
298
|
-
endAt,
|
|
299
|
-
endBefore,
|
|
300
|
-
where,
|
|
301
|
-
increment
|
|
302
|
-
};
|
|
303
|
-
}
|
|
304
|
-
accessHelpers() {
|
|
305
|
-
const { doc, collection, writeBatch, serverTimestamp, setDoc } = this.helpers;
|
|
306
|
-
return {
|
|
307
|
-
doc: (path) => doc(this.db, path),
|
|
308
|
-
collection: (path) => collection(this.db, path),
|
|
309
|
-
writeBatch: () => writeBatch(this.db),
|
|
310
|
-
serverTimestamp,
|
|
311
|
-
setDoc
|
|
312
|
-
};
|
|
313
|
-
}
|
|
314
|
-
async getDoc(path) {
|
|
315
|
-
const { getDoc, doc } = this.helpers;
|
|
316
|
-
const docRef = doc(this.db, path);
|
|
317
|
-
const docSnap = await getDoc(docRef);
|
|
318
|
-
const data = docSnap.exists() ? {
|
|
319
|
-
...docSnap.data(),
|
|
320
|
-
id: docSnap.id
|
|
321
|
-
} : null;
|
|
322
|
-
return {
|
|
323
|
-
id: docSnap.id,
|
|
324
|
-
data
|
|
325
|
-
};
|
|
326
|
-
}
|
|
327
|
-
async getDocs(path, ...queryConstraints) {
|
|
328
|
-
const { getDocs, query, collection } = this.helpers;
|
|
329
|
-
const collectionRef = collection(this.db, path);
|
|
330
|
-
const q = queryConstraints.length > 0 ? query(collectionRef, ...queryConstraints) : collectionRef;
|
|
331
|
-
const querySnapshot = await getDocs(q);
|
|
332
|
-
const data = querySnapshot.docs.map((doc) => ({
|
|
333
|
-
data: doc.data(),
|
|
334
|
-
id: doc.id
|
|
335
|
-
}));
|
|
336
|
-
return {
|
|
337
|
-
data,
|
|
338
|
-
querySnapshot,
|
|
339
|
-
empty: querySnapshot.empty
|
|
340
|
-
};
|
|
341
|
-
}
|
|
342
|
-
async addDoc(path, data) {
|
|
343
|
-
const { addDoc, collection } = this.helpers;
|
|
344
|
-
const collectionRef = collection(this.db, path);
|
|
345
|
-
const docRef = await addDoc(collectionRef, data);
|
|
346
|
-
return {
|
|
347
|
-
...data,
|
|
348
|
-
id: docRef.id
|
|
349
|
-
};
|
|
350
|
-
}
|
|
351
|
-
async setDoc(path, data, options = {}) {
|
|
352
|
-
const { setDoc, doc } = this.helpers;
|
|
353
|
-
const docRef = doc(this.db, path);
|
|
354
|
-
await setDoc(docRef, data, options);
|
|
355
|
-
}
|
|
356
|
-
async updateDoc(path, data) {
|
|
357
|
-
const { updateDoc, doc } = this.helpers;
|
|
358
|
-
const docRef = doc(this.db, path);
|
|
359
|
-
await updateDoc(docRef, data);
|
|
360
|
-
}
|
|
361
|
-
async deleteDoc(path) {
|
|
362
|
-
const { deleteDoc, doc } = this.helpers;
|
|
363
|
-
const docRef = doc(this.db, path);
|
|
364
|
-
await deleteDoc(docRef);
|
|
365
|
-
}
|
|
366
|
-
async runTransaction(updateFunction) {
|
|
367
|
-
const { runTransaction } = this.helpers;
|
|
368
|
-
return runTransaction(this.db, updateFunction);
|
|
369
|
-
}
|
|
370
|
-
async runBatch(operations) {
|
|
371
|
-
const { writeBatch } = this.helpers;
|
|
372
|
-
const batch = writeBatch(this.db);
|
|
373
|
-
await Promise.all(operations.map((op) => op()));
|
|
374
|
-
await batch.commit();
|
|
375
|
-
}
|
|
376
|
-
writeBatch() {
|
|
377
|
-
const { writeBatch } = this.helpers;
|
|
378
|
-
const batch = writeBatch(this.db);
|
|
379
|
-
return batch;
|
|
380
|
-
}
|
|
381
|
-
};
|
|
382
|
-
var api = FirebaseAPI.getInstance();
|
|
383
|
-
|
|
384
138
|
// src/hooks/useGoogleClassroom.ts
|
|
385
139
|
var useGoogleClassroom = () => {
|
|
386
140
|
const submitAssignmentToGoogleClassroom = async ({
|
|
@@ -417,110 +171,9 @@ var useGoogleClassroom = () => {
|
|
|
417
171
|
};
|
|
418
172
|
};
|
|
419
173
|
|
|
420
|
-
// src/constants/analytics.constants.ts
|
|
421
|
-
var ANALYTICS_EVENT_TYPES = {
|
|
422
|
-
VOICE_SUCCESS: "voice_success",
|
|
423
|
-
VOICE_FAIL: "voice_fail",
|
|
424
|
-
RESPOND_CARD_SUCCESS: "respond_card_success",
|
|
425
|
-
RESPOND_CARD_FAIL: "respond_card_fail",
|
|
426
|
-
RESPOND_WRITE_CARD_SUCCESS: "respond_write_card_success",
|
|
427
|
-
RESPOND_WRITE_CARD_FAIL: "respond_write_card_fail",
|
|
428
|
-
RESPOND_WRITE_CARD_SUBMITTED: "respond_write_card_submitted",
|
|
429
|
-
RESPOND_WRITE_CARD_ERROR: "respond_write_card_error",
|
|
430
|
-
RESPOND_CARD_ERROR: "respond_card_error",
|
|
431
|
-
RESPOND_CARD_SUBMITTED: "respond_card_submitted",
|
|
432
|
-
RESPOND_FREE_PLAN: "respond_free_plan",
|
|
433
|
-
RESPOND_WRITE_FREE_PLAN: "respond_write_free_plan",
|
|
434
|
-
SUBMISSION: "assignment_submitted",
|
|
435
|
-
ASSIGNMENT_STARTED: "assignment_started",
|
|
436
|
-
CREATE_ASSIGNMENT: "create_assignment",
|
|
437
|
-
MC_SUCCESS: "multiple_choice_success",
|
|
438
|
-
MC_FAIL: "multiple_choice_fail",
|
|
439
|
-
MC_ERROR: "multiple_choice_error",
|
|
440
|
-
ACTFL_LEVEL: "actfl_level",
|
|
441
|
-
WIDA_LEVEL: "wida_level"
|
|
442
|
-
};
|
|
443
|
-
|
|
444
|
-
// src/lib/firebase/firebase-analytics/assignment.ts
|
|
445
|
-
var logSubmitAssignment = (data = {}) => {
|
|
446
|
-
var _a, _b, _c;
|
|
447
|
-
(_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, "handleCouresAnalyticsEvent")) == null ? void 0 : _c({
|
|
448
|
-
eventType: ANALYTICS_EVENT_TYPES.SUBMISSION,
|
|
449
|
-
...data
|
|
450
|
-
});
|
|
451
|
-
api.logEvent(ANALYTICS_EVENT_TYPES.SUBMISSION, data);
|
|
452
|
-
};
|
|
453
|
-
var logStartAssignment = (data = {}) => {
|
|
454
|
-
var _a, _b, _c;
|
|
455
|
-
if (data.courseId) {
|
|
456
|
-
(_c = (_b = (_a = api).httpsCallable) == null ? void 0 : _b.call(_a, "handleCouresAnalyticsEvent")) == null ? void 0 : _c({
|
|
457
|
-
eventType: ANALYTICS_EVENT_TYPES.ASSIGNMENT_STARTED,
|
|
458
|
-
...data
|
|
459
|
-
});
|
|
460
|
-
}
|
|
461
|
-
api.logEvent(ANALYTICS_EVENT_TYPES.ASSIGNMENT_STARTED, data);
|
|
462
|
-
};
|
|
463
|
-
|
|
464
174
|
// src/domains/notification/services/create-notification.service.ts
|
|
465
175
|
import dayjs from "dayjs";
|
|
466
176
|
|
|
467
|
-
// src/constants/web.constants.ts
|
|
468
|
-
var WEB_BASE_URL = "https://app.speakable.io";
|
|
469
|
-
|
|
470
|
-
// src/domains/notification/notification.constants.ts
|
|
471
|
-
var SPEAKABLE_NOTIFICATIONS = {
|
|
472
|
-
NEW_ASSIGNMENT: "new_assignment",
|
|
473
|
-
ASSESSMENT_SUBMITTED: "assessment_submitted",
|
|
474
|
-
ASSESSMENT_SCORED: "assessment_scored",
|
|
475
|
-
NEW_COMMENT: "NEW_COMMENT"
|
|
476
|
-
};
|
|
477
|
-
var SpeakableNotificationTypes = {
|
|
478
|
-
NEW_ASSIGNMENT: "NEW_ASSIGNMENT",
|
|
479
|
-
FEEDBACK_FROM_TEACHER: "FEEDBACK_FROM_TEACHER",
|
|
480
|
-
MESSAGE_FROM_STUDENT: "MESSAGE_FROM_STUDENT",
|
|
481
|
-
PHRASE_MARKED_CORRECT: "PHRASE_MARKED_CORRECT",
|
|
482
|
-
STUDENT_PROGRESS: "STUDENT_PROGRESS",
|
|
483
|
-
PLAYLIST_FOLLOWERS: "PLAYLIST_FOLLOWERS",
|
|
484
|
-
PLAYLIST_PLAYS: "PLAYLIST_PLAYS",
|
|
485
|
-
// New notifications
|
|
486
|
-
ASSESSMENT_SUBMITTED: "ASSESSMENT_SUBMITTED",
|
|
487
|
-
// Notification FOR TEACHER when student submits assessment
|
|
488
|
-
ASSESSMENT_SCORED: "ASSESSMENT_SCORED",
|
|
489
|
-
// Notification FOR STUDENT when teacher scores assessment
|
|
490
|
-
// Comment
|
|
491
|
-
NEW_COMMENT: "NEW_COMMENT"
|
|
492
|
-
};
|
|
493
|
-
|
|
494
|
-
// src/utils/error-handler.ts
|
|
495
|
-
var ServiceError = class extends Error {
|
|
496
|
-
constructor(message, originalError, code) {
|
|
497
|
-
super(message);
|
|
498
|
-
this.originalError = originalError;
|
|
499
|
-
this.code = code;
|
|
500
|
-
this.name = "ServiceError";
|
|
501
|
-
}
|
|
502
|
-
};
|
|
503
|
-
function withErrorHandler(fn, serviceName) {
|
|
504
|
-
return async (...args) => {
|
|
505
|
-
try {
|
|
506
|
-
return await fn(...args);
|
|
507
|
-
} catch (error) {
|
|
508
|
-
if (error instanceof Error && "code" in error) {
|
|
509
|
-
const firebaseError = error;
|
|
510
|
-
throw new ServiceError(
|
|
511
|
-
`Error in ${serviceName}: ${firebaseError.message}`,
|
|
512
|
-
error,
|
|
513
|
-
firebaseError.code
|
|
514
|
-
);
|
|
515
|
-
}
|
|
516
|
-
if (error instanceof Error) {
|
|
517
|
-
throw new ServiceError(`Error in ${serviceName}: ${error.message}`, error);
|
|
518
|
-
}
|
|
519
|
-
throw new ServiceError(`Unknown error in ${serviceName}`, error);
|
|
520
|
-
}
|
|
521
|
-
};
|
|
522
|
-
}
|
|
523
|
-
|
|
524
177
|
// src/domains/notification/services/send-notification.service.ts
|
|
525
178
|
var _sendNotification = async (sendTo, notification) => {
|
|
526
179
|
var _a, _b, _c;
|
|
@@ -680,49 +333,6 @@ var useCreateNotification = () => {
|
|
|
680
333
|
};
|
|
681
334
|
};
|
|
682
335
|
|
|
683
|
-
// src/domains/assignment/assignment.constants.ts
|
|
684
|
-
var ASSIGNMENTS_COLLECTION = "assignments";
|
|
685
|
-
var ANALYTICS_SUBCOLLECTION = "analytics";
|
|
686
|
-
var SCORES_SUBCOLLECTION = "scores";
|
|
687
|
-
var refsAssignmentFiresotre = {
|
|
688
|
-
allAssignments: () => ASSIGNMENTS_COLLECTION,
|
|
689
|
-
assignment: (params) => `${ASSIGNMENTS_COLLECTION}/${params.id}`,
|
|
690
|
-
assignmentAllAnalytics: (params) => `${ASSIGNMENTS_COLLECTION}/${params.id}/${ANALYTICS_SUBCOLLECTION}`,
|
|
691
|
-
assignmentAnalytics: (params) => `${ASSIGNMENTS_COLLECTION}/${params.id}/${ANALYTICS_SUBCOLLECTION}/${params.type}`,
|
|
692
|
-
assignmentScores: (params) => `${ASSIGNMENTS_COLLECTION}/${params.id}/${SCORES_SUBCOLLECTION}/${params.userId}`
|
|
693
|
-
};
|
|
694
|
-
|
|
695
|
-
// src/domains/assignment/utils/create-default-score.ts
|
|
696
|
-
var defaultScore = (props) => {
|
|
697
|
-
const { serverTimestamp } = api.accessHelpers();
|
|
698
|
-
const score = {
|
|
699
|
-
progress: 0,
|
|
700
|
-
score: 0,
|
|
701
|
-
startDate: serverTimestamp(),
|
|
702
|
-
status: "IN_PROGRESS",
|
|
703
|
-
submitted: false,
|
|
704
|
-
cards: {},
|
|
705
|
-
lastPlayed: serverTimestamp(),
|
|
706
|
-
owners: props.owners,
|
|
707
|
-
userId: props.userId
|
|
708
|
-
};
|
|
709
|
-
if (props.googleClassroomUserId) {
|
|
710
|
-
score.googleClassroomUserId = props.googleClassroomUserId;
|
|
711
|
-
}
|
|
712
|
-
if (props.courseId) {
|
|
713
|
-
score.courseId = props.courseId;
|
|
714
|
-
}
|
|
715
|
-
return score;
|
|
716
|
-
};
|
|
717
|
-
|
|
718
|
-
// src/domains/assignment/score-practice.constants.ts
|
|
719
|
-
var SCORES_PRACTICE_COLLECTION = "users";
|
|
720
|
-
var SCORES_PRACTICE_SUBCOLLECTION = "practice";
|
|
721
|
-
var refsScoresPractice = {
|
|
722
|
-
practiceScores: (params) => `${SCORES_PRACTICE_COLLECTION}/${params.userId}/${SCORES_PRACTICE_SUBCOLLECTION}/${params.setId}`,
|
|
723
|
-
practiceScoreHistoryRefDoc: (params) => `${SCORES_PRACTICE_COLLECTION}/${params.userId}/${SCORES_PRACTICE_SUBCOLLECTION}/${params.setId}/attempts/${params.date}`
|
|
724
|
-
};
|
|
725
|
-
|
|
726
336
|
// src/domains/assignment/services/create-score.service.ts
|
|
727
337
|
async function _createScore(params) {
|
|
728
338
|
var _a, _b, _c;
|
|
@@ -834,42 +444,6 @@ async function _getScore(params) {
|
|
|
834
444
|
}
|
|
835
445
|
var getScore = withErrorHandler(_getScore, "getScore");
|
|
836
446
|
|
|
837
|
-
// src/domains/assignment/utils/calculateScoreAndProgress.ts
|
|
838
|
-
var calculateScoreAndProgress = (scores, cardsList, weights) => {
|
|
839
|
-
const totalSetPoints = cardsList.reduce((acc, cardId) => {
|
|
840
|
-
acc += (weights == null ? void 0 : weights[cardId]) || 1;
|
|
841
|
-
return acc;
|
|
842
|
-
}, 0);
|
|
843
|
-
const totalPointsAwarded = Object.keys((scores == null ? void 0 : scores.cards) || {}).reduce((acc, cardId) => {
|
|
844
|
-
var _a, _b;
|
|
845
|
-
const cardScores = (_a = scores == null ? void 0 : scores.cards) == null ? void 0 : _a[cardId];
|
|
846
|
-
if ((cardScores == null ? void 0 : cardScores.completed) || (cardScores == null ? void 0 : cardScores.score) || (cardScores == null ? void 0 : cardScores.score) === 0) {
|
|
847
|
-
const score2 = (cardScores == null ? void 0 : cardScores.score) || (cardScores == null ? void 0 : cardScores.score) === 0 ? Number((_b = cardScores == null ? void 0 : cardScores.score) != null ? _b : 0) : null;
|
|
848
|
-
const weight = (weights == null ? void 0 : weights[cardId]) || 1;
|
|
849
|
-
const fraction = (score2 != null ? score2 : 0) / 100;
|
|
850
|
-
if (score2 || score2 === 0) {
|
|
851
|
-
acc += weight * fraction;
|
|
852
|
-
} else {
|
|
853
|
-
acc += weight;
|
|
854
|
-
}
|
|
855
|
-
}
|
|
856
|
-
return acc;
|
|
857
|
-
}, 0);
|
|
858
|
-
const totalCompletedCards = Object.keys((scores == null ? void 0 : scores.cards) || {}).reduce((acc, cardId) => {
|
|
859
|
-
var _a;
|
|
860
|
-
const cardScores = (_a = scores == null ? void 0 : scores.cards) == null ? void 0 : _a[cardId];
|
|
861
|
-
if ((cardScores == null ? void 0 : cardScores.completed) || (cardScores == null ? void 0 : cardScores.score) || (cardScores == null ? void 0 : cardScores.score) === 0) {
|
|
862
|
-
acc += 1;
|
|
863
|
-
}
|
|
864
|
-
return acc;
|
|
865
|
-
}, 0);
|
|
866
|
-
const percent = totalPointsAwarded / totalSetPoints;
|
|
867
|
-
const score = Math.round(percent * 100);
|
|
868
|
-
const progress = Math.round(totalCompletedCards / (cardsList.length || 1) * 100);
|
|
869
|
-
return { score, progress };
|
|
870
|
-
};
|
|
871
|
-
var calculateScoreAndProgress_default = calculateScoreAndProgress;
|
|
872
|
-
|
|
873
447
|
// src/domains/assignment/services/update-score.service.ts
|
|
874
448
|
async function _updateScore(params) {
|
|
875
449
|
const path = params.isAssignment ? refsAssignmentFiresotre.assignmentScores({
|
|
@@ -1314,120 +888,6 @@ function useSubmitPracticeScore() {
|
|
|
1314
888
|
// src/domains/cards/card.hooks.ts
|
|
1315
889
|
import { useMutation as useMutation2, useQueries, useQuery as useQuery3 } from "@tanstack/react-query";
|
|
1316
890
|
import { useMemo } from "react";
|
|
1317
|
-
|
|
1318
|
-
// src/domains/cards/card.constants.ts
|
|
1319
|
-
var CARDS_COLLECTION = "flashcards";
|
|
1320
|
-
var refsCardsFiresotre = {
|
|
1321
|
-
allCards: CARDS_COLLECTION,
|
|
1322
|
-
card: (id) => `${CARDS_COLLECTION}/${id}`
|
|
1323
|
-
};
|
|
1324
|
-
|
|
1325
|
-
// src/domains/cards/services/get-card.service.ts
|
|
1326
|
-
async function _getCard(params) {
|
|
1327
|
-
const ref = refsCardsFiresotre.card(params.cardId);
|
|
1328
|
-
const response = await api.getDoc(ref);
|
|
1329
|
-
if (!response.data) return null;
|
|
1330
|
-
return response.data;
|
|
1331
|
-
}
|
|
1332
|
-
var getCard = withErrorHandler(_getCard, "getCard");
|
|
1333
|
-
|
|
1334
|
-
// src/domains/cards/services/create-card.service.ts
|
|
1335
|
-
import { v4 } from "uuid";
|
|
1336
|
-
|
|
1337
|
-
// src/utils/text-utils.ts
|
|
1338
|
-
import sha1 from "js-sha1";
|
|
1339
|
-
var purify = (word) => {
|
|
1340
|
-
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();
|
|
1341
|
-
};
|
|
1342
|
-
var cleanString = (words) => {
|
|
1343
|
-
const splitWords = words == null ? void 0 : words.split("+");
|
|
1344
|
-
if (splitWords && splitWords.length === 1) {
|
|
1345
|
-
const newWord = purify(words);
|
|
1346
|
-
return newWord;
|
|
1347
|
-
} else if (splitWords && splitWords.length > 1) {
|
|
1348
|
-
const split = splitWords.map((w) => purify(w));
|
|
1349
|
-
return split;
|
|
1350
|
-
} else {
|
|
1351
|
-
return "";
|
|
1352
|
-
}
|
|
1353
|
-
};
|
|
1354
|
-
var getWordHash = (word, language) => {
|
|
1355
|
-
const cleanedWord = cleanString(word);
|
|
1356
|
-
const wordHash = sha1(`${language}-${cleanedWord}`);
|
|
1357
|
-
console.log("wordHash core library", wordHash);
|
|
1358
|
-
return wordHash;
|
|
1359
|
-
};
|
|
1360
|
-
|
|
1361
|
-
// src/domains/cards/services/get-card-verification-status.service.ts
|
|
1362
|
-
var charactarLanguages = ["zh", "ja", "ko"];
|
|
1363
|
-
var getVerificationStatus = async (target_text, language) => {
|
|
1364
|
-
if ((target_text == null ? void 0 : target_text.length) < 3 && !charactarLanguages.includes(language)) {
|
|
1365
|
-
return "NOT_RECOMMENDED" /* NOT_RECOMMENDED */;
|
|
1366
|
-
}
|
|
1367
|
-
const hash = getWordHash(target_text, language);
|
|
1368
|
-
const response = await api.getDoc(`checked-pronunciations/${hash}`);
|
|
1369
|
-
try {
|
|
1370
|
-
if (response.data) {
|
|
1371
|
-
return processRecord(response.data);
|
|
1372
|
-
} else {
|
|
1373
|
-
return "NOT_CHECKED" /* NOT_CHECKED */;
|
|
1374
|
-
}
|
|
1375
|
-
} catch (e) {
|
|
1376
|
-
return "NOT_CHECKED" /* NOT_CHECKED */;
|
|
1377
|
-
}
|
|
1378
|
-
};
|
|
1379
|
-
var processRecord = (data) => {
|
|
1380
|
-
const { pronunciations = 0, fails = 0 } = data;
|
|
1381
|
-
const attempts = pronunciations + fails;
|
|
1382
|
-
const successRate = attempts > 0 ? pronunciations / attempts * 100 : 0;
|
|
1383
|
-
let newStatus = null;
|
|
1384
|
-
if (attempts < 6) {
|
|
1385
|
-
return "NOT_CHECKED" /* NOT_CHECKED */;
|
|
1386
|
-
}
|
|
1387
|
-
if (successRate > 25) {
|
|
1388
|
-
newStatus = "VERIFIED" /* VERIFIED */;
|
|
1389
|
-
} else if (successRate > 10) {
|
|
1390
|
-
newStatus = "WARNING" /* WARNING */;
|
|
1391
|
-
} else if (fails > 20 && successRate < 10 && pronunciations > 1) {
|
|
1392
|
-
newStatus = "NOT_RECOMMENDED" /* NOT_RECOMMENDED */;
|
|
1393
|
-
} else if (pronunciations === 0 && fails > 20) {
|
|
1394
|
-
newStatus = "NOT_WORKING" /* NOT_WORKING */;
|
|
1395
|
-
} else {
|
|
1396
|
-
newStatus = "NOT_CHECKED" /* NOT_CHECKED */;
|
|
1397
|
-
}
|
|
1398
|
-
return newStatus;
|
|
1399
|
-
};
|
|
1400
|
-
|
|
1401
|
-
// src/domains/cards/services/create-card.service.ts
|
|
1402
|
-
async function _createCard({ data }) {
|
|
1403
|
-
const response = await api.addDoc(refsCardsFiresotre.allCards, data);
|
|
1404
|
-
return response;
|
|
1405
|
-
}
|
|
1406
|
-
var createCard = withErrorHandler(_createCard, "createCard");
|
|
1407
|
-
async function _createCards({ cards }) {
|
|
1408
|
-
const { writeBatch, doc } = api.accessHelpers();
|
|
1409
|
-
const batch = writeBatch();
|
|
1410
|
-
const cardsWithId = [];
|
|
1411
|
-
for (const card of cards) {
|
|
1412
|
-
const cardId = v4();
|
|
1413
|
-
const ref = doc(refsCardsFiresotre.card(cardId));
|
|
1414
|
-
const newCardObject = {
|
|
1415
|
-
...card,
|
|
1416
|
-
id: cardId
|
|
1417
|
-
};
|
|
1418
|
-
if (card.type === "READ_REPEAT" /* READ_REPEAT */ && card.target_text && card.language) {
|
|
1419
|
-
const verificationStatus = await getVerificationStatus(card.target_text, card.language);
|
|
1420
|
-
newCardObject.verificationStatus = verificationStatus || null;
|
|
1421
|
-
}
|
|
1422
|
-
cardsWithId.push(newCardObject);
|
|
1423
|
-
batch.set(ref, newCardObject);
|
|
1424
|
-
}
|
|
1425
|
-
await batch.commit();
|
|
1426
|
-
return cardsWithId;
|
|
1427
|
-
}
|
|
1428
|
-
var createCards = withErrorHandler(_createCards, "createCards");
|
|
1429
|
-
|
|
1430
|
-
// src/domains/cards/card.hooks.ts
|
|
1431
891
|
var cardsQueryKeys = {
|
|
1432
892
|
all: ["cards"],
|
|
1433
893
|
one: (params) => [...cardsQueryKeys.all, params.cardId]
|
|
@@ -1504,22 +964,6 @@ function useGetCard({ cardId, enabled = true }) {
|
|
|
1504
964
|
|
|
1505
965
|
// src/domains/sets/set.hooks.ts
|
|
1506
966
|
import { useQuery as useQuery4 } from "@tanstack/react-query";
|
|
1507
|
-
|
|
1508
|
-
// src/domains/sets/set.constants.ts
|
|
1509
|
-
var SETS_COLLECTION = "sets";
|
|
1510
|
-
var refsSetsFirestore = {
|
|
1511
|
-
allSets: SETS_COLLECTION,
|
|
1512
|
-
set: (id) => `${SETS_COLLECTION}/${id}`
|
|
1513
|
-
};
|
|
1514
|
-
|
|
1515
|
-
// src/domains/sets/services/get-set.service.ts
|
|
1516
|
-
async function _getSet({ setId }) {
|
|
1517
|
-
const response = await api.getDoc(refsSetsFirestore.set(setId));
|
|
1518
|
-
return response.data;
|
|
1519
|
-
}
|
|
1520
|
-
var getSet = withErrorHandler(_getSet, "getSet");
|
|
1521
|
-
|
|
1522
|
-
// src/domains/sets/set.hooks.ts
|
|
1523
967
|
var setsQueryKeys = {
|
|
1524
968
|
all: ["sets"],
|
|
1525
969
|
one: (params) => [...setsQueryKeys.all, params.setId]
|