@speakableio/core 0.1.106 → 1.0.1

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 (57) hide show
  1. package/dist/analytics.js +329 -25
  2. package/dist/analytics.js.map +1 -1
  3. package/dist/index.native.d.mts +2836 -0
  4. package/dist/index.native.d.ts +2272 -27
  5. package/dist/index.native.js +2995 -166
  6. package/dist/index.native.js.map +1 -1
  7. package/dist/index.native.mjs +3322 -0
  8. package/dist/index.native.mjs.map +1 -0
  9. package/dist/index.web.d.mts +2836 -0
  10. package/dist/index.web.js +3244 -12
  11. package/dist/index.web.js.map +1 -1
  12. package/package.json +10 -61
  13. package/dist/assignment.constants-BIKM6fYi.d.ts +0 -32
  14. package/dist/assignment.model-DLMWAp0Y.d.ts +0 -301
  15. package/dist/card.constants-DhKFipX3.d.ts +0 -54
  16. package/dist/chunk-233VJDUF.js +0 -149
  17. package/dist/chunk-233VJDUF.js.map +0 -1
  18. package/dist/chunk-2CRI5MJP.js +0 -225
  19. package/dist/chunk-2CRI5MJP.js.map +0 -1
  20. package/dist/chunk-AWVUNWML.js +0 -141
  21. package/dist/chunk-AWVUNWML.js.map +0 -1
  22. package/dist/chunk-CJ5JXKII.js +0 -129
  23. package/dist/chunk-CJ5JXKII.js.map +0 -1
  24. package/dist/chunk-EEBMPASA.js +0 -21
  25. package/dist/chunk-EEBMPASA.js.map +0 -1
  26. package/dist/chunk-H5XNOXRC.js +0 -11
  27. package/dist/chunk-H5XNOXRC.js.map +0 -1
  28. package/dist/chunk-LZG3MTSH.js +0 -53
  29. package/dist/chunk-LZG3MTSH.js.map +0 -1
  30. package/dist/chunk-OLSTHM2U.js +0 -154
  31. package/dist/chunk-OLSTHM2U.js.map +0 -1
  32. package/dist/chunk-TQGDTKTE.js +0 -13
  33. package/dist/chunk-TQGDTKTE.js.map +0 -1
  34. package/dist/chunk-YKUMIPSO.js +0 -212
  35. package/dist/chunk-YKUMIPSO.js.map +0 -1
  36. package/dist/chunk-YMJRCINF.js +0 -68
  37. package/dist/chunk-YMJRCINF.js.map +0 -1
  38. package/dist/chunk-YO34TZYN.js +0 -28
  39. package/dist/chunk-YO34TZYN.js.map +0 -1
  40. package/dist/const.d.ts +0 -331
  41. package/dist/const.js +0 -193
  42. package/dist/const.js.map +0 -1
  43. package/dist/hooks.d.ts +0 -294
  44. package/dist/hooks.js +0 -1015
  45. package/dist/hooks.js.map +0 -1
  46. package/dist/index.web.d.ts +0 -405
  47. package/dist/models.d.ts +0 -56
  48. package/dist/models.js +0 -17
  49. package/dist/models.js.map +0 -1
  50. package/dist/notification.constants-Da4-_0kX.d.ts +0 -21
  51. package/dist/repos.d.ts +0 -209
  52. package/dist/repos.js +0 -26
  53. package/dist/repos.js.map +0 -1
  54. package/dist/utils.d.ts +0 -39
  55. package/dist/utils.js +0 -180
  56. package/dist/utils.js.map +0 -1
  57. /package/dist/{analytics.d.ts → analytics.d.mts} +0 -0
@@ -1,32 +0,0 @@
1
- declare enum AssignmentAnalyticsType {
2
- Macro = "macro",
3
- Gradebook = "gradebook",
4
- Cards = "cards",
5
- Student = "student",
6
- StudentSummary = "student_summary",
7
- All = "all"
8
- }
9
- declare const ASSIGNMENT_ANALYTICS_TYPES: AssignmentAnalyticsType[];
10
- declare const ASSIGNMENTS_COLLECTION = "assignments";
11
- declare const ANALYTICS_SUBCOLLECTION = "analytics";
12
- declare const SCORES_SUBCOLLECTION = "scores";
13
- type RefsAssignmentFiresotre = `${typeof ASSIGNMENTS_COLLECTION}/${string}${`/${typeof ANALYTICS_SUBCOLLECTION}/${string}` | `/${typeof SCORES_SUBCOLLECTION}/${string}` | ''}`;
14
- declare const refsAssignmentFiresotre: {
15
- allAssignments: () => string;
16
- assignment: (params: {
17
- id: string;
18
- }) => `assignments/${string}`;
19
- assignmentAllAnalytics: (params: {
20
- id: string;
21
- }) => `assignments/${string}/analytics`;
22
- assignmentAnalytics: (params: {
23
- id: string;
24
- type: string;
25
- }) => `assignments/${string}/analytics/${string}`;
26
- assignmentScores: (params: {
27
- id: string;
28
- userId: string;
29
- }) => `assignments/${string}/scores/${string}`;
30
- };
31
-
32
- export { AssignmentAnalyticsType as A, type RefsAssignmentFiresotre as R, ASSIGNMENT_ANALYTICS_TYPES as a, refsAssignmentFiresotre as r };
@@ -1,301 +0,0 @@
1
- import { FirebaseFirestoreTypes, Timestamp } from '@react-native-firebase/firestore';
2
- import { Firestore, getDoc, getDocs, addDoc, setDoc, updateDoc, deleteDoc, runTransaction, writeBatch, doc, collection, query, serverTimestamp, orderBy, limit, startAt, startAfter, endAt, endBefore, where, increment, Timestamp as Timestamp$1 } from 'firebase/firestore';
3
- import { V as VerificationCardStatus } from './card.constants-DhKFipX3.js';
4
-
5
- interface PageActivityWithId extends PageActivity {
6
- id: string;
7
- }
8
- interface PageActivity {
9
- owners: string[];
10
- checked?: boolean;
11
- completed?: boolean;
12
- media_area_id?: string | null;
13
- media_area_layout?: 'left' | 'right' | null;
14
- score?: number;
15
- verificationStatus?: VerificationCardStatus;
16
- native_text?: string;
17
- repeat?: number;
18
- language?: string | null;
19
- image?: {
20
- path?: string | null;
21
- url?: string;
22
- };
23
- audio?: {
24
- path?: string | null;
25
- url?: string;
26
- } | null;
27
- notes?: string;
28
- difficulty?: string;
29
- default_language?: string;
30
- target_text?: string;
31
- type: ActivityPageType;
32
- grading_criteria?: string;
33
- scoring_type?: string;
34
- grading_method?: 'simple' | 'rubric' | 'manual' | 'standards_based';
35
- feedback_types?: string[];
36
- rubricId?: string;
37
- prompt?: string;
38
- title?: string;
39
- passing_score?: number;
40
- maxCharacters?: number;
41
- answer?: string[];
42
- choices?: {
43
- value: string;
44
- option: string;
45
- }[];
46
- MCQType?: string;
47
- multipleAttemptsAllowed?: boolean;
48
- allowRetries?: boolean;
49
- question?: string;
50
- respondTime?: number;
51
- hidePrompt?: boolean;
52
- videoUrl?: string;
53
- link?: string;
54
- text?: string;
55
- isListenAloud?: boolean;
56
- embedCode?: string;
57
- attempt?: number;
58
- correct?: number;
59
- autoGrade?: boolean;
60
- points?: number;
61
- shuffle?: boolean;
62
- translation?: string;
63
- includeAIContext?: boolean;
64
- media_area_context_ref?: string | null;
65
- standardId?: string;
66
- target_proficiency_level?: string;
67
- allowTTS?: boolean;
68
- feedback_language?: string | null;
69
- correct_answer?: string | null;
70
- limit_attempts?: boolean;
71
- max_attempts?: number;
72
- rich_text?: string;
73
- }
74
- declare enum ActivityPageType {
75
- READ_REPEAT = "READ_REPEAT",
76
- VIDEO = "VIDEO",
77
- TEXT = "TEXT",
78
- READ_RESPOND = "READ_RESPOND",
79
- FREE_RESPONSE = "FREE_RESPONSE",
80
- REPEAT = "REPEAT",
81
- RESPOND = "RESPOND",
82
- RESPOND_WRITE = "RESPOND_WRITE",
83
- TEXT_TO_SPEECH = "TEXT_TO_SPEECH",
84
- MULTIPLE_CHOICE = "MULTIPLE_CHOICE",
85
- PODCAST = "PODCAST",
86
- MEDIA_PAGE = "MEDIA_PAGE",
87
- WRITE = "WRITE",
88
- SHORT_ANSWER = "SHORT_ANSWER",
89
- SHORT_STORY = "SHORT_STORY",
90
- SPEAK = "SPEAK",
91
- CONVERSATION = "CONVERSATION",
92
- CONVERSATION_WRITE = "CONVERSATION_WRITE",
93
- DIALOGUE = "DIALOGUE",
94
- INSTRUCTION = "INSTRUCTION",
95
- LISTEN = "LISTEN",
96
- READ = "READ",
97
- ANSWER = "ANSWER"
98
- }
99
- declare const RESPOND_PAGE_ACTIVITY_TYPES: ActivityPageType[];
100
- declare const MULTIPLE_CHOICE_PAGE_ACTIVITY_TYPES: ActivityPageType[];
101
- declare const REPEAT_PAGE_ACTIVITY_TYPES: ActivityPageType[];
102
- declare const RESPOND_WRITE_PAGE_ACTIVITY_TYPES: ActivityPageType[];
103
- declare const RESPOND_AUDIO_PAGE_ACTIVITY_TYPES: ActivityPageType[];
104
-
105
- type FirebaseInstance = FirebaseFirestoreTypes.Module | Firestore;
106
- interface FirestoreHelpers {
107
- getDoc: typeof getDoc;
108
- getDocs: typeof getDocs;
109
- addDoc: typeof addDoc;
110
- setDoc: typeof setDoc;
111
- updateDoc: typeof updateDoc;
112
- deleteDoc: typeof deleteDoc;
113
- runTransaction: typeof runTransaction;
114
- writeBatch: typeof writeBatch;
115
- doc: typeof doc;
116
- collection: typeof collection;
117
- query: typeof query;
118
- serverTimestamp: typeof serverTimestamp;
119
- orderBy: typeof orderBy;
120
- limit: typeof limit;
121
- startAt: typeof startAt;
122
- startAfter: typeof startAfter;
123
- endAt: typeof endAt;
124
- endBefore: typeof endBefore;
125
- where: typeof where;
126
- increment: typeof increment;
127
- }
128
- type CustomTimestamp = Timestamp | Timestamp$1;
129
- type CallableFunction<T = any, R = any> = (data: T) => Promise<R>;
130
-
131
- interface Assignment {
132
- name: string;
133
- description: string;
134
- scheduledTime?: string | null;
135
- dueTime?: {
136
- hours: number;
137
- minutes: number;
138
- nanos: number;
139
- };
140
- speakableio: boolean;
141
- owners: string[];
142
- image: {
143
- path: string | null;
144
- url: string;
145
- };
146
- dueDate: {
147
- day: number;
148
- month: number;
149
- year: number;
150
- };
151
- teacherName: string;
152
- courseWorkId: string | null;
153
- dueDateTimestamp: CustomTimestamp;
154
- scheduledTimeTimestamp: number;
155
- active: boolean;
156
- voice: string | null;
157
- setId: string;
158
- dateMade: {
159
- seconds: number;
160
- nanoseconds: number;
161
- };
162
- maxPoints: number;
163
- courseId: string;
164
- isAssessment: boolean;
165
- isAvailable: boolean;
166
- ltiDeeplink?: string;
167
- content?: string[];
168
- weights?: Record<string, number>;
169
- language?: string;
170
- types?: {
171
- [key in ActivityPageType]?: number;
172
- };
173
- aiEnabled?: boolean;
174
- chat_experience?: boolean;
175
- }
176
- interface AssignmentWithId extends Assignment {
177
- id: string;
178
- isAvailable: boolean;
179
- scores?: unknown;
180
- }
181
- interface Score {
182
- userId: string;
183
- owners: string[];
184
- progress: number;
185
- score: number;
186
- cards?: {
187
- [cardId: string]: PageScore;
188
- };
189
- courseId?: string;
190
- firstLoad?: boolean;
191
- googleClassroomUserId?: string;
192
- skippedCards?: number;
193
- lastPlayed?: CustomTimestamp;
194
- startDate?: CustomTimestamp;
195
- submissionDate?: CustomTimestamp;
196
- status?: 'SUBMITTED' | 'PENDING_REVIEW' | 'IN_PROGRESS' | 'FINALIZED';
197
- submitted?: boolean;
198
- successfulCards?: number;
199
- total_voiceSuccess?: number;
200
- total_voice_attempts?: number;
201
- total_words_spoken?: number;
202
- history?: PageScore[];
203
- attempts?: number;
204
- assignmentId?: string;
205
- setId?: string;
206
- }
207
- interface ScoreWithId extends Score {
208
- id: string;
209
- }
210
- interface PageScore {
211
- voiceSuccess?: number;
212
- voiceAttempts?: number;
213
- voiceFail?: number;
214
- completed?: boolean;
215
- attempts?: number;
216
- correct?: number;
217
- success?: boolean;
218
- aiSuccess?: boolean;
219
- grading_method?: 'simple' | 'rubric' | 'manual' | 'standards_based' | null;
220
- grammar_insights?: {
221
- type?: string;
222
- justification?: string;
223
- error?: boolean;
224
- correction?: string;
225
- }[];
226
- promptSuccess?: boolean;
227
- score?: number;
228
- simple_grading?: {
229
- justification?: string;
230
- success?: boolean;
231
- };
232
- suggested_response?: string;
233
- summary?: string;
234
- transcript?: string | null;
235
- errors?: any;
236
- improvedResponse?: string;
237
- audio?: string | null;
238
- actfl?: {
239
- justification: string;
240
- level: string;
241
- key_indicators?: string[];
242
- };
243
- wida?: {
244
- justification: string;
245
- level: string;
246
- key_indicators?: string[];
247
- };
248
- earned_points?: number;
249
- fileName?: string | null;
250
- max_points?: number;
251
- passing_score?: number;
252
- rubric?: {
253
- description: string;
254
- justification: string;
255
- maxPoints: number;
256
- score: number;
257
- score_title: string;
258
- title: string;
259
- }[] | null;
260
- scoring_type?: string;
261
- history?: PageScore[];
262
- media_area_opened?: boolean;
263
- noFeedbackAvailable?: boolean;
264
- proficiency_level?: {
265
- standardId: string;
266
- level: string;
267
- justification: string;
268
- key_indicators?: string[];
269
- };
270
- status?: string | null;
271
- transcriptError?: boolean;
272
- feedbackError?: boolean;
273
- totalTrys?: {
274
- markedCorrect?: boolean;
275
- selectedOption?: string | string[];
276
- attemptedAt?: CustomTimestamp;
277
- messageAttemptId?: string;
278
- }[];
279
- tryAgain?: boolean;
280
- updatedAt?: CustomTimestamp;
281
- messageAttemptId?: string;
282
- unmetCriteria?: {
283
- criterion: string;
284
- suggestion: string;
285
- explanation: string;
286
- }[];
287
- meetsCriteria?: boolean;
288
- actionableSteps?: string[];
289
- rubric_results?: {
290
- title: string;
291
- score: number;
292
- score_title: string;
293
- justification: string;
294
- maxPoints: number;
295
- description: string;
296
- }[];
297
- target_proficiency_level?: string;
298
- hint?: string[];
299
- }
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 };
@@ -1,54 +0,0 @@
1
- declare enum FeedbackTypesCard {
2
- SuggestedResponse = "suggested_response",
3
- Wida = "wida",
4
- GrammarInsights = "grammar_insights",
5
- Actfl = "actfl",
6
- ProficiencyLevel = "proficiency_level"
7
- }
8
- declare enum LeniencyCard {
9
- CONFIDENCE = "confidence",
10
- EASY = "easy",
11
- NORMAL = "normal",
12
- HARD = "hard"
13
- }
14
- declare const LENIENCY_OPTIONS: {
15
- label: string;
16
- value: LeniencyCard;
17
- }[];
18
- declare const STUDENT_LEVELS_OPTIONS: {
19
- label: string;
20
- description: string;
21
- value: string;
22
- }[];
23
- declare const BASE_RESPOND_FIELD_VALUES: {
24
- title: string;
25
- allowRetries: boolean;
26
- respondTime: number;
27
- maxCharacters: number;
28
- };
29
- declare const BASE_REPEAT_FIELD_VALUES: {
30
- repeat: number;
31
- };
32
- declare const BASE_MULTIPLE_CHOICE_FIELD_VALUES: {
33
- MCQType: string;
34
- answer: string[];
35
- choices: {
36
- option: string;
37
- value: string;
38
- }[];
39
- };
40
- declare enum VerificationCardStatus {
41
- VERIFIED = "VERIFIED",
42
- WARNING = "WARNING",
43
- NOT_RECOMMENDED = "NOT_RECOMMENDED",
44
- NOT_WORKING = "NOT_WORKING",
45
- NOT_CHECKED = "NOT_CHECKED"
46
- }
47
- declare const CARDS_COLLECTION = "flashcards";
48
- type RefsCardsFiresotre = `${typeof CARDS_COLLECTION}/${string}`;
49
- declare const refsCardsFiresotre: {
50
- allCards: string;
51
- card: (id: string) => `flashcards/${string}`;
52
- };
53
-
54
- export { BASE_RESPOND_FIELD_VALUES as B, FeedbackTypesCard as F, LeniencyCard as L, type RefsCardsFiresotre as R, STUDENT_LEVELS_OPTIONS as S, VerificationCardStatus as V, LENIENCY_OPTIONS as a, BASE_REPEAT_FIELD_VALUES as b, BASE_MULTIPLE_CHOICE_FIELD_VALUES as c, refsCardsFiresotre as r };
@@ -1,149 +0,0 @@
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
@@ -1 +0,0 @@
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":";;;;;;;;AAAA,SAAS,UAAU;;;ACGZ,IAAM,eAAN,cAA2B,MAAM;AAAA,EACtC,YACE,SACgB,eACA,MAChB;AACA,UAAM,OAAO;AAHG;AACA;AAGhB,SAAK,OAAO;AAAA,EACd;AACF;AAKO,SAAS,iBACd,IACA,aACqB;AACrB,SAAO,UAAU,SAAwB;AACvC,QAAI;AACF,aAAO,MAAM,GAAG,GAAG,IAAI;AAAA,IACzB,SAAS,OAAO;AACd,UAAI,iBAAiB,SAAS,UAAU,OAAO;AAC7C,cAAM,gBAAgB;AAEtB,cAAM,IAAI;AAAA,UACR,YAAY,WAAW,KAAK,cAAc,OAAO;AAAA,UACjD;AAAA,UACA,cAAc;AAAA,QAChB;AAAA,MACF;AAEA,UAAI,iBAAiB,OAAO;AAC1B,cAAM,IAAI,aAAa,YAAY,WAAW,KAAK,MAAM,OAAO,IAAI,KAAK;AAAA,MAC3E;AAEA,YAAM,IAAI,aAAa,oBAAoB,WAAW,IAAI,KAAK;AAAA,IACjE;AAAA,EACF;AACF;;;ACxCA,OAAO,UAAU;AAEV,IAAM,SAAS,CAAC,SAAiB;AACtC,SAAO,KACJ,UAAU,KAAK,EACf,QAAQ,gBAAgB,EAAE,EAC1B,QAAQ,eAAe,EAAE,EACzB,QAAQ,aAAa,EAAE,EACvB,QAAQ,oBAAoB,EAAE,EAC9B,QAAQ,QAAQ,GAAG,EACnB,QAAQ,0CAA0C,EAAE,EACpD,QAAQ,UAAU,GAAG,EACrB,YAAY,EACZ,KAAK;AACV;AAEO,IAAM,cAAc,CAAC,UAAkB;AAC5C,QAAM,aAAa,+BAAO,MAAM;AAEhC,MAAI,cAAc,WAAW,WAAW,GAAG;AACzC,UAAM,UAAU,OAAO,KAAK;AAE5B,WAAO;AAAA,EACT,WAAW,cAAc,WAAW,SAAS,GAAG;AAC9C,UAAM,QAAQ,WAAW,IAAI,OAAK,OAAO,CAAC,CAAC;AAE3C,WAAO;AAAA,EACT,OAAO;AACL,WAAO;AAAA,EACT;AACF;AAEO,IAAM,cAAc,CAAC,MAAc,aAAqB;AAC7D,QAAM,cAAc,YAAY,IAAI;AACpC,QAAM,WAAW,KAAK,GAAG,QAAQ,IAAI,WAAqB,EAAE;AAE5D,UAAQ,IAAI,yBAAyB,QAAQ;AAE7C,SAAO;AACT;;;AClCA,IAAM,qBAAqB,CAAC,MAAM,MAAM,IAAI;AAErC,IAAM,wBAAwB,OAAO,aAAqB,aAAqB;AACpF,OAAI,2CAAa,UAAS,KAAK,CAAC,mBAAmB,SAAS,QAAQ,GAAG;AACrE;AAAA,EACF;AACA,QAAM,OAAO,YAAY,aAAa,QAAQ;AAC9C,QAAM,WAAW,MAAM,IAAI,OAAY,0BAA0B,IAAI,EAAE;AAEvE,MAAI;AACF,QAAI,SAAS,MAAM;AACjB,aAAO,cAAc,SAAS,IAAI;AAAA,IACpC,OAAO;AACL;AAAA,IACF;AAAA,EACF,SAAS,GAAG;AACV;AAAA,EACF;AACF;AAEA,IAAM,gBAAgB,CAAC,SAAc;AACnC,QAAM,EAAE,iBAAiB,GAAG,QAAQ,EAAE,IAAI;AAC1C,QAAM,WAAW,iBAAiB;AAClC,QAAM,cAAc,WAAW,IAAK,iBAAiB,WAAY,MAAM;AACvE,MAAI,YAAY;AAEhB,MAAI,WAAW,GAAG;AAChB;AAAA,EACF;AACA,MAAI,cAAc,IAAI;AAEpB;AAAA,EACF,WAAW,cAAc,IAAI;AAE3B;AAAA,EACF,WAAW,QAAQ,MAAM,cAAc,MAAM,iBAAiB,GAAG;AAE/D;AAAA,EACF,WAAW,mBAAmB,KAAK,QAAQ,IAAI;AAE7C;AAAA,EACF,OAAO;AAEL;AAAA,EACF;AAEA,SAAO;AACT;;;AH7CA,eAAe,YAAY,EAAE,KAAK,GAAoC;AACpE,QAAM,WAAW,MAAM,IAAI,OAAO,mBAAmB,UAAU,IAAI;AAEnE,SAAO;AACT;AAEO,IAAM,aAAa,iBAAiB,aAAa,YAAY;AAEpE,eAAe,aAAa,EAAE,MAAM,GAA8B;AAChE,QAAM,EAAE,YAAY,IAAI,IAAI,IAAI,cAAc;AAE9C,QAAM,QAAQ,WAAW;AAEzB,QAAM,cAAc,CAAC;AAErB,aAAW,QAAQ,OAAO;AACxB,UAAM,SAAS,GAAG;AAElB,UAAM,MAAM,IAAI,mBAAmB,KAAK,MAAM,CAAC;AAE/C,UAAM,gBAAgB;AAAA,MACpB,GAAG;AAAA,MACH,IAAI;AAAA,IACN;AAEA,QAAI,KAAK,4CAAyC,KAAK,eAAe,KAAK,UAAU;AACnF,YAAM,qBAAqB,MAAM,sBAAsB,KAAK,aAAa,KAAK,QAAQ;AAEtF,oBAAc,qBAAqB,sBAAsB;AAAA,IAC3D;AACA,gBAAY,KAAK,aAAa;AAC9B,UAAM,IAAI,KAAK,aAAa;AAAA,EAC9B;AAEA,QAAM,MAAM,OAAO;AAEnB,SAAO;AACT;AAEO,IAAM,cAAc,iBAAiB,cAAc,aAAa;;;AI1CvE,eAAe,SAAS,QAA4B;AAClD,QAAM,MAAM,mBAAmB,KAAK,OAAO,MAAM;AAEjD,QAAM,WAAW,MAAM,IAAI,OAA2B,GAAG;AAEzD,MAAI,CAAC,SAAS,KAAM,QAAO;AAE3B,SAAO,SAAS;AAClB;AAEO,IAAM,UAAU,iBAAiB,UAAU,SAAS;","names":[]}