@speakableio/core 0.1.99 → 0.1.101

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/providers/SpeakableProvider.tsx","../src/domains/assignment/hooks/assignment.hooks.ts","../src/domains/assignment/hooks/score-hooks.ts","../src/utils/debounce.utils.ts","../src/lib/tanstack/handle-optimistic-update-query.ts","../src/constants/speakable-plans.ts","../src/hooks/usePermissions.ts","../src/lib/firebase/api.ts","../src/hooks/useGoogleClassroom.ts","../src/constants/analytics.constants.ts","../src/lib/firebase/firebase-analytics/assignment.ts","../src/domains/notification/services/create-notification.service.ts","../src/constants/web.constants.ts","../src/domains/notification/notification.constants.ts","../src/utils/error-handler.ts","../src/domains/notification/services/send-notification.service.ts","../src/domains/notification/hooks/notification.hooks.ts","../src/domains/assignment/assignment.constants.ts","../src/domains/assignment/utils/create-default-score.ts","../src/domains/assignment/score-practice.constants.ts","../src/domains/assignment/services/create-score.service.ts","../src/domains/assignment/services/get-score.service.ts","../src/domains/assignment/utils/calculateScoreAndProgress.ts","../src/domains/assignment/services/update-score.service.ts","../src/domains/assignment/services/clear-score.service.ts","../src/domains/assignment/services/submit-assignment-score.service.ts","../src/domains/cards/card.hooks.ts","../src/domains/cards/card.constants.ts","../src/domains/cards/services/get-card.service.ts","../src/domains/cards/services/create-card.service.ts","../src/utils/text-utils.ts","../src/domains/cards/services/get-card-verification-status.service.ts","../src/domains/sets/set.hooks.ts","../src/domains/sets/set.constants.ts","../src/domains/sets/services/get-set.service.ts"],"sourcesContent":["import React, { createContext, useContext, useEffect, useState } from 'react'\nimport { type QueryClient } from '@tanstack/react-query'\nimport { type FsClient } from '@core/lib/create-firebase-client'\nimport { type User } from '@core/types/user.types'\nimport { type Permissions } from '@core/types/permissions.types'\n\ninterface FsContext {\n speakableApi: Awaited<FsClient>\n queryClient: QueryClient\n user: User\n permissions: Permissions\n}\n\nexport const FsCtx = createContext<FsContext | null>(null)\n\nexport function SpeakableProvider({\n user,\n children,\n queryClient,\n permissions,\n fsClient,\n}: {\n children: React.ReactNode\n fsClient: FsClient\n permissions: Permissions\n queryClient: QueryClient\n user: User\n}) {\n const [speakableApi, setSpeakableApi] = useState<null | Awaited<FsClient>>(null)\n\n useEffect(() => {\n setSpeakableApi(fsClient)\n }, [fsClient])\n\n if (!speakableApi) return null\n\n return (\n <FsCtx.Provider\n value={{\n speakableApi,\n queryClient,\n user,\n permissions,\n }}\n >\n {children}\n </FsCtx.Provider>\n )\n}\n\nexport function useSpeakableApi() {\n const ctx = useContext(FsCtx)\n\n if (!ctx) throw new Error('useSpeakableApi must be used within a SpeakableProvider')\n\n return ctx\n}\n","import { useSpeakableApi } from '@core/providers/SpeakableProvider'\nimport { useQuery } from '@tanstack/react-query'\n\nimport { type AssignmentAnalyticsType } from '../assignment.constants'\n\nexport const assignmentQueryKeys = {\n all: ['assignments'] as const,\n byId: (id: string) => [...assignmentQueryKeys.all, id] as const,\n list: () => [...assignmentQueryKeys.all, 'list'] as const,\n}\n\nexport function useAssignment({\n assignmentId,\n enabled = true,\n analyticType,\n userId,\n}: {\n assignmentId: string\n enabled?: boolean\n analyticType?: AssignmentAnalyticsType\n userId: string\n}) {\n const { speakableApi } = useSpeakableApi()\n\n return useQuery({\n queryKey: assignmentQueryKeys.byId(assignmentId),\n queryFn: () =>\n speakableApi.assignmentRepo.getAssignment({\n assignmentId: assignmentId,\n analyticType,\n currentUserId: userId,\n }),\n enabled,\n })\n}\n","import { useMutation, useQuery } from '@tanstack/react-query'\nimport { useSpeakableApi } from '@core/providers/SpeakableProvider'\nimport { debounce } from '@core/utils/debounce.utils'\nimport { handleOptimisticUpdate } from '@core/lib/tanstack/handle-optimistic-update-query'\nimport usePermissions from '@core/hooks/usePermissions'\nimport { useGoogleClassroom } from '@core/hooks/useGoogleClassroom'\nimport { logSubmitAssignment } from '@core/lib/firebase/firebase-analytics'\nimport { type PageActivity } from '@core/domains/cards/card.model'\nimport { useCreateNotification } from '@core/domains/notification/hooks/notification.hooks'\nimport { SpeakableNotificationTypes } from '@core/domains/notification/notification.constants'\n\nimport { getScore } from '../services/get-score.service'\nimport { type Score, type PageScore } from '../assignment.model'\nimport calculateScoreAndProgress from '../utils/calculateScoreAndProgress'\nimport { updateCardScore, updateScore } from '../services/update-score.service'\nimport { clearScore } from '../services/clear-score.service'\nimport {\n submitAssignmentScore,\n submitPracticeScore,\n} from '../services/submit-assignment-score.service'\n\nexport const scoreQueryKeys = {\n all: ['scores'] as const,\n byId: (id: string) => [...scoreQueryKeys.all, id] as const,\n list: () => [...scoreQueryKeys.all, 'list'] as const,\n}\n\nexport function useScore({\n isAssignment,\n activityId,\n userId = '',\n courseId,\n enabled = true,\n googleClassroomUserId,\n}: {\n userId: string\n isAssignment: boolean\n activityId: string\n courseId?: string\n enabled?: boolean\n googleClassroomUserId?: string\n}) {\n return useQuery({\n queryFn: () =>\n getScore({\n userId,\n courseId,\n activityId,\n googleClassroomUserId,\n isAssignment,\n }),\n queryKey: scoreQueryKeys.byId(activityId),\n enabled,\n })\n}\n\nconst debounceUpdateScore = debounce(updateScore, 1000)\n\nexport function useUpdateScore() {\n const { queryClient } = useSpeakableApi()\n\n const mutation = useMutation({\n mutationFn: debounceUpdateScore,\n onMutate: variables => {\n return handleOptimisticUpdate({\n queryClient,\n queryKey: scoreQueryKeys.byId(variables.activityId),\n newData: variables.data,\n })\n },\n onError: (_, variables, context) => {\n if (context?.previousData)\n queryClient.setQueryData(scoreQueryKeys.byId(variables.activityId), context.previousData)\n },\n onSettled: (_, err, variables) => {\n queryClient.invalidateQueries({\n queryKey: scoreQueryKeys.byId(variables.activityId),\n })\n },\n })\n\n return {\n mutationUpdateScore: mutation,\n }\n}\n\nexport function useUpdateCardScore({\n isAssignment,\n activityId,\n userId,\n cardIds,\n weights,\n}: {\n isAssignment: boolean\n userId: string\n activityId: string\n cardIds: string[]\n weights: Record<string, number>\n}) {\n const { queryClient } = useSpeakableApi()\n\n const queryKey = scoreQueryKeys.byId(activityId)\n\n const mutation = useMutation({\n mutationFn: async ({ cardId, cardScore }: { cardId: string; cardScore: PageScore }) => {\n const previousScores = queryClient.getQueryData<Score>(queryKey)\n\n const { progress, score, newScoreUpdated, updatedCardScore } = getScoreUpdated({\n previousScores: previousScores ?? {},\n cardId,\n cardScore,\n cardIds,\n weights,\n })\n\n await updateCardScore({\n userId,\n cardId,\n isAssignment,\n activityId,\n updates: {\n cardScore: updatedCardScore,\n progress,\n score,\n },\n })\n\n return { cardId, scoresUpdated: newScoreUpdated }\n },\n onMutate: ({ cardId, cardScore }) => {\n queryClient.setQueryData(queryKey, (previousScore: Partial<Score> | undefined) => {\n const updates = handleOptimisticScore({\n score: previousScore,\n cardId,\n cardScore,\n cardIds,\n weights,\n })\n\n return {\n ...previousScore,\n ...updates,\n }\n })\n },\n // eslint-disable-next-line no-unused-vars\n onError: error => {\n console.log(error.message)\n\n const previousData = queryClient.getQueryData(queryKey)\n\n if (previousData) {\n queryClient.setQueryData(queryKey, previousData)\n }\n },\n })\n\n return {\n mutationUpdateCardScore: mutation,\n }\n}\n\nconst getScoreUpdated = ({\n cardId,\n cardScore,\n previousScores,\n cardIds,\n weights,\n}: {\n previousScores: Partial<Score>\n cardId: string\n cardScore: PageScore\n cardIds: string[]\n weights: Record<string, number>\n}) => {\n const previousCard = previousScores.cards?.[cardId]\n\n const newCardScore = {\n ...(previousCard ?? {}),\n ...cardScore,\n } as PageActivity\n\n const newScores = {\n ...previousScores,\n cards: {\n ...(previousScores.cards ?? {}),\n [cardId]: newCardScore,\n },\n } as Score\n\n const { score, progress } = calculateScoreAndProgress(newScores, cardIds, weights)\n\n return {\n newScoreUpdated: newScores,\n updatedCardScore: cardScore,\n score,\n progress,\n }\n}\n\nconst handleOptimisticScore = ({\n score,\n cardId,\n cardScore,\n cardIds,\n weights,\n}: {\n score: Partial<Score> | undefined\n cardId: string\n cardScore: PageScore\n cardIds: string[]\n weights: Record<string, number>\n}) => {\n let cards = { ...(score?.cards ?? {}) }\n\n cards = {\n ...cards,\n [cardId]: {\n ...cards[cardId],\n ...cardScore,\n },\n }\n const { score: scoreValue, progress } = calculateScoreAndProgress(\n // @ts-ignore\n {\n ...(score ?? {}),\n cards,\n },\n cardIds,\n weights,\n )\n\n return { cards, score: scoreValue, progress }\n}\n\nexport function useClearScore() {\n const { queryClient } = useSpeakableApi()\n\n const mutation = useMutation({\n mutationFn: clearScore,\n onSettled: result => {\n queryClient.invalidateQueries({\n queryKey: scoreQueryKeys.byId(result?.activityId ?? ''),\n })\n },\n })\n\n return {\n mutationClearScore: mutation,\n }\n}\n\nexport function useSubmitAssignmentScore({\n onAssignmentSubmitted,\n studentName,\n}: {\n onAssignmentSubmitted: (assignmentId: string) => void\n studentName: string\n}) {\n const { queryClient } = useSpeakableApi()\n\n const { hasGoogleClassroomGradePassback } = usePermissions()\n const { submitAssignmentToGoogleClassroom } = useGoogleClassroom()\n const { createNotification } = useCreateNotification()\n\n const mutation = useMutation({\n mutationFn: async ({\n assignment,\n userId,\n cardIds,\n weights,\n scores,\n status,\n }: {\n assignment: {\n id: string\n name: string\n owners: string[]\n courseId: string\n courseWorkId: string\n isAssessment: boolean\n maxPoints: number\n }\n userId: string\n cardIds: string[]\n weights: Record<string, number>\n scores: Score\n status: 'FINALIZED' | 'IN_PROGRESS' | 'PENDING_REVIEW'\n // activeCardId: string\n }) => {\n try {\n const scoreUpdated = await submitAssignmentScore({\n assignment,\n userId,\n cardIds,\n weights,\n status,\n studentName: studentName,\n })\n\n if (\n assignment.courseWorkId != null &&\n !assignment.isAssessment &&\n hasGoogleClassroomGradePassback\n ) {\n await submitAssignmentToGoogleClassroom({\n assignment,\n scores,\n })\n }\n\n if (assignment.isAssessment) {\n // New assessment submitted email\n // const data = assessmentSubmittedEmail({\n // studentName: user?.displayName,\n // studentId: userId,\n // teacherName: '!',\n // assignmentId: assignment.id,\n // assignmentTitle: assignment.name,\n // })\n\n // sendEmail(user?.email, data)\n // @ts-ignore\n createNotification(SpeakableNotificationTypes.ASSESSMENT_SUBMITTED, assignment)\n }\n\n if (assignment?.id) {\n logSubmitAssignment({\n courseId: assignment?.courseId,\n })\n }\n\n onAssignmentSubmitted(assignment.id)\n\n queryClient.setQueryData(scoreQueryKeys.byId(assignment.id), {\n ...scores,\n ...scoreUpdated.fieldsUpdated,\n })\n\n return {\n success: true,\n message: 'Score submitted successfully',\n }\n } catch (error) {\n return {\n success: false,\n error: error,\n }\n }\n },\n })\n\n return {\n submitAssignmentScore: mutation.mutateAsync,\n isLoading: mutation.isPending,\n }\n}\n\nexport function useSubmitPracticeScore() {\n const { queryClient } = useSpeakableApi()\n\n const mutation = useMutation({\n mutationFn: async ({\n setId,\n userId,\n scores,\n }: {\n setId: string\n userId: string\n scores: Score\n }) => {\n try {\n await submitPracticeScore({\n setId,\n userId,\n scores,\n })\n\n queryClient.invalidateQueries({\n queryKey: scoreQueryKeys.byId(setId),\n })\n\n return {\n success: true,\n message: 'Score submitted successfully',\n }\n } catch (error) {\n return {\n success: false,\n error: error,\n }\n }\n },\n })\n\n return {\n submitPracticeScore: mutation.mutateAsync,\n isLoading: mutation.isPending,\n }\n}\n","/* eslint-disable @typescript-eslint/prefer-promise-reject-errors */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-unsafe-argument */\n\nexport function debounce<T extends (...args: any[]) => Promise<any>>(func: T, waitFor: number) {\n let timeoutId: NodeJS.Timeout | null\n\n return (...args: Parameters<T>): Promise<ReturnType<T>> =>\n new Promise((resolve, reject) => {\n if (timeoutId) {\n clearTimeout(timeoutId)\n }\n timeoutId = setTimeout(async () => {\n try {\n const result = await func(...args)\n\n resolve(result)\n } catch (error) {\n reject(error)\n }\n }, waitFor)\n })\n}\n","import { type QueryClient, type QueryKey } from '@tanstack/react-query'\n\nexport const handleOptimisticUpdate = async <T>({\n queryClient,\n queryKey,\n newData,\n}: {\n queryClient: QueryClient\n queryKey: QueryKey\n newData: T\n}) => {\n await queryClient.cancelQueries({\n queryKey,\n })\n\n const previousData = queryClient.getQueryData<T>(queryKey)\n\n if (previousData === undefined) {\n queryClient.setQueryData(queryKey, newData)\n } else {\n queryClient.setQueryData(queryKey, { ...previousData, ...newData })\n }\n\n return { previousData }\n}\n","export const FEEDBACK_PLANS = {\n FEEDBACK_TRANSCRIPT: 'FEEDBACK_TRANSCRIPT', // Transcript from the audio\n FEEDBACK_SUMMARY: 'FEEDBACK_SUMMARY', // Chatty summary (Free plan)\n FEEDBACK_GRAMMAR_INSIGHTS: 'FEEDBACK_GRAMMAR_INSIGHTS', // Grammar insights\n FEEDBACK_SUGGESTED_RESPONSE: 'FEEDBACK_SUGGESTED_RESPONSE', // Suggested Response\n FEEDBACK_RUBRIC: 'FEEDBACK_RUBRIC', // Suggested Response\n FEEDBACK_GRADING_STANDARDS: 'FEEDBACK_GRADING_STANDARDS', // ACTFL / WIDA Estimate\n FEEDBACK_TARGET_LANGUAGE: 'FEEDBACK_TARGET_LANGUAGE', // Ability to set the feedback language to the target language of the student\n FEEDBACK_DISABLE_ALLOW_RETRIES: 'FEEDBACK_DISABLE_ALLOW_RETRIES', // Turn of allow retries\n} as const\n\nexport const AUTO_GRADING_PLANS = {\n AUTO_GRADING_PASS_FAIL: 'AUTO_GRADING_PASS_FAIL', // Pass / fail grading\n AUTO_GRADING_RUBRICS: 'AUTO_GRADING_RUBRICS', // Autograded rubrics\n AUTO_GRADING_STANDARDS_BASED: 'AUTO_GRADING_STANDARDS_BASED', // Standards based grading\n} as const\n\nexport const COMMENTS_PLANS = {\n COMMENTS_SUGGESTIONS: 'COMMENTS_SUGGESTIONS', // Comment suggestions\n} as const\n\nexport const AI_ASSISTANT_PLANS = {\n AI_ASSISTANT_DOCUMENT_UPLOADS: 'AI_ASSISTANT_DOCUMENT_UPLOADS', // Allow document uploading\n AI_ASSISTANT_UNLIMITED_USE: 'AI_ASSISTANT_UNLIMITED_USE', // Allow unlimited use of AI assistant. Otherwise, limits are used.\n} as const\n\nexport const ASSIGNMENT_SETTINGS_PLANS = {\n ASSESSMENTS: 'ASSESSMENTS', // Ability to create assessment assignment types\n GOOGLE_CLASSROOM_GRADE_PASSBACK: 'GOOGLE_CLASSROOM_GRADE_PASSBACK', // Assignment scores can sync with classroom\n} as const\n\nexport const ANALYTICS_PLANS = {\n ANALYTICS_GRADEBOOK: 'ANALYTICS_GRADEBOOK', // Access to the gradebook page\n ANALYTICS_CLASSROOM_ANALYTICS: 'ANALYTICS_CLASSROOM_ANALYTICS', // Access to the classroom analytics page\n ANALYTICS_STUDENT_PROGRESS_REPORTS: 'ANALYTICS_STUDENT_PROGRESS_REPORTS', // Access to the panel that shows an individual student's progress and assignments\n ANALYTICS_ASSIGNMENT_RESULTS: 'ANALYTICS_ASSIGNMENT_RESULTS', // Access to the assigment RESULTS page\n ANALYTICS_ORGANIZATION: 'ANALYTICS_ORGANIZATION', // Access to the organization analytics panel (for permitted admins)\n} as const\n\nexport const SPACES_PLANS = {\n SPACES_CREATE_SPACE: 'SPACES_CREATE_SPACE', // Ability to create spaces\n SPACES_CHECK_POINTS: 'SPACES_CHECK_POINTS', // Feature not available yet. Ability to create checkpoints for spaces for data aggregation\n} as const\n\nexport const DISCOVER_PLANS = {\n DISCOVER_ORGANIZATION_LIBRARY: 'DISCOVER_ORGANIZATION_LIBRARY', // Access to the organizations shared library\n} as const\n\nexport const INTEGRATIONS_PLANS = {\n INTEGRATIONS_LTI: 'INTEGRATIONS_LTI', //Access to all LTI integrations (Canvas, Blackboard, Schoology, etc)\n} as const\n\nexport const MEDIA_AREA_PLANS = {\n MEDIA_AREA_DOCUMENT_UPLOAD: 'MEDIA_AREA_DOCUMENT_UPLOAD',\n MEDIA_AREA_AUDIO_FILES: 'MEDIA_AREA_AUDIO_FILES',\n} as const\n\nexport const FREE_PLAN = []\n\nexport const TEACHER_PRO_PLAN = [\n FEEDBACK_PLANS.FEEDBACK_TRANSCRIPT,\n FEEDBACK_PLANS.FEEDBACK_SUMMARY,\n FEEDBACK_PLANS.FEEDBACK_TARGET_LANGUAGE,\n AUTO_GRADING_PLANS.AUTO_GRADING_PASS_FAIL,\n ANALYTICS_PLANS.ANALYTICS_GRADEBOOK,\n SPACES_PLANS.SPACES_CREATE_SPACE,\n // AUTO_GRADING_PLANS.AUTO_GRADING_STANDARDS_BASED,\n]\n\nexport const SCHOOL_STARTER = [\n FEEDBACK_PLANS.FEEDBACK_TRANSCRIPT,\n FEEDBACK_PLANS.FEEDBACK_SUMMARY,\n FEEDBACK_PLANS.FEEDBACK_GRAMMAR_INSIGHTS,\n FEEDBACK_PLANS.FEEDBACK_SUGGESTED_RESPONSE,\n FEEDBACK_PLANS.FEEDBACK_RUBRIC,\n FEEDBACK_PLANS.FEEDBACK_GRADING_STANDARDS,\n FEEDBACK_PLANS.FEEDBACK_DISABLE_ALLOW_RETRIES,\n FEEDBACK_PLANS.FEEDBACK_TARGET_LANGUAGE,\n AUTO_GRADING_PLANS.AUTO_GRADING_PASS_FAIL,\n AUTO_GRADING_PLANS.AUTO_GRADING_RUBRICS,\n AUTO_GRADING_PLANS.AUTO_GRADING_STANDARDS_BASED,\n AI_ASSISTANT_PLANS.AI_ASSISTANT_DOCUMENT_UPLOADS,\n AI_ASSISTANT_PLANS.AI_ASSISTANT_UNLIMITED_USE,\n // ASSIGNMENT_SETTINGS_PLANS.ASSESSMENTS,\n ASSIGNMENT_SETTINGS_PLANS.GOOGLE_CLASSROOM_GRADE_PASSBACK,\n ANALYTICS_PLANS.ANALYTICS_GRADEBOOK,\n ANALYTICS_PLANS.ANALYTICS_STUDENT_PROGRESS_REPORTS,\n ANALYTICS_PLANS.ANALYTICS_CLASSROOM_ANALYTICS,\n // ANALYTICS_PLANS.ANALYTICS_ORGANIZATION,\n SPACES_PLANS.SPACES_CREATE_SPACE,\n SPACES_PLANS.SPACES_CHECK_POINTS,\n // DISCOVER_PLANS.DISCOVER_ORGANIZATION_LIBRARY,\n MEDIA_AREA_PLANS.MEDIA_AREA_DOCUMENT_UPLOAD,\n MEDIA_AREA_PLANS.MEDIA_AREA_AUDIO_FILES,\n]\n\nexport const ORGANIZATION_PLAN = [\n FEEDBACK_PLANS.FEEDBACK_TRANSCRIPT,\n FEEDBACK_PLANS.FEEDBACK_SUMMARY,\n FEEDBACK_PLANS.FEEDBACK_GRAMMAR_INSIGHTS,\n FEEDBACK_PLANS.FEEDBACK_SUGGESTED_RESPONSE,\n FEEDBACK_PLANS.FEEDBACK_RUBRIC,\n FEEDBACK_PLANS.FEEDBACK_GRADING_STANDARDS,\n FEEDBACK_PLANS.FEEDBACK_DISABLE_ALLOW_RETRIES,\n FEEDBACK_PLANS.FEEDBACK_TARGET_LANGUAGE,\n AUTO_GRADING_PLANS.AUTO_GRADING_PASS_FAIL,\n AUTO_GRADING_PLANS.AUTO_GRADING_RUBRICS,\n AUTO_GRADING_PLANS.AUTO_GRADING_STANDARDS_BASED,\n AI_ASSISTANT_PLANS.AI_ASSISTANT_DOCUMENT_UPLOADS,\n AI_ASSISTANT_PLANS.AI_ASSISTANT_UNLIMITED_USE,\n ASSIGNMENT_SETTINGS_PLANS.ASSESSMENTS,\n ASSIGNMENT_SETTINGS_PLANS.GOOGLE_CLASSROOM_GRADE_PASSBACK,\n ANALYTICS_PLANS.ANALYTICS_GRADEBOOK,\n ANALYTICS_PLANS.ANALYTICS_STUDENT_PROGRESS_REPORTS,\n ANALYTICS_PLANS.ANALYTICS_CLASSROOM_ANALYTICS,\n ANALYTICS_PLANS.ANALYTICS_ORGANIZATION,\n SPACES_PLANS.SPACES_CREATE_SPACE,\n SPACES_PLANS.SPACES_CHECK_POINTS,\n DISCOVER_PLANS.DISCOVER_ORGANIZATION_LIBRARY,\n MEDIA_AREA_PLANS.MEDIA_AREA_DOCUMENT_UPLOAD,\n MEDIA_AREA_PLANS.MEDIA_AREA_AUDIO_FILES,\n]\n\nexport const SpeakablePlanTypes = {\n basic: 'basic',\n teacher_pro: 'teacher_pro',\n school_starter: 'school_starter',\n organization: 'organization',\n // OLD PLANS\n starter: 'starter',\n growth: 'growth',\n professional: 'professional',\n} as const\n\nexport const SpeakablePermissionsMap = {\n [SpeakablePlanTypes.basic]: FREE_PLAN,\n [SpeakablePlanTypes.starter]: TEACHER_PRO_PLAN,\n [SpeakablePlanTypes.teacher_pro]: TEACHER_PRO_PLAN,\n [SpeakablePlanTypes.growth]: ORGANIZATION_PLAN,\n [SpeakablePlanTypes.professional]: ORGANIZATION_PLAN,\n [SpeakablePlanTypes.organization]: ORGANIZATION_PLAN,\n [SpeakablePlanTypes.school_starter]: SCHOOL_STARTER,\n} as const\n\nexport const SpeakablePlanHierarchy = [\n SpeakablePlanTypes.basic,\n SpeakablePlanTypes.starter,\n SpeakablePlanTypes.teacher_pro,\n SpeakablePlanTypes.growth,\n SpeakablePlanTypes.professional,\n SpeakablePlanTypes.school_starter,\n SpeakablePlanTypes.organization,\n] as const\n","import { ANALYTICS_PLANS, ASSIGNMENT_SETTINGS_PLANS } from '@core/constants/speakable-plans'\nimport { useSpeakableApi } from '@core/providers/SpeakableProvider'\n\nconst usePermissions = () => {\n const { permissions } = useSpeakableApi()\n\n const has = (permission: string) => permissions.permissions?.includes(permission)\n\n return {\n plan: permissions.plan,\n permissionsLoaded: permissions.loaded,\n isStripePlan: permissions.isStripePlan,\n refreshDate: permissions.refreshDate,\n isInstitutionPlan: permissions.isInstitutionPlan,\n subscriptionId: permissions.subscriptionId,\n contact: permissions.contact,\n hasGradebook: has(ANALYTICS_PLANS.ANALYTICS_GRADEBOOK),\n hasGoogleClassroomGradePassback: has(ASSIGNMENT_SETTINGS_PLANS.GOOGLE_CLASSROOM_GRADE_PASSBACK),\n hasAssessments: has(ASSIGNMENT_SETTINGS_PLANS.ASSESSMENTS),\n hasSectionAnalytics: has(ANALYTICS_PLANS.ANALYTICS_CLASSROOM_ANALYTICS),\n hasStudentReports: has(ANALYTICS_PLANS.ANALYTICS_STUDENT_PROGRESS_REPORTS),\n permissions: permissions || [],\n hasStudentPortfolios: permissions.hasStudentPortfolios,\n isFreeOrgTrial: permissions.type === 'free_org_trial',\n freeOrgTrialExpired: permissions.freeOrgTrialExpired,\n }\n}\n\nexport default usePermissions\n","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","/* eslint-disable @typescript-eslint/no-unsafe-return */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\nimport { type Score } from '@core/domains/assignment'\nimport { api } from '@core/lib/firebase/api'\n\nexport const useGoogleClassroom = () => {\n const submitAssignmentToGoogleClassroom = async ({\n assignment,\n scores,\n googleUserId = null, // optional to override the user's googleUserId\n }: {\n assignment: {\n id: string\n name: string\n owners: string[]\n courseId: string\n courseWorkId: string\n isAssessment: boolean\n maxPoints: number\n }\n scores: Score\n googleUserId?: string | null\n }) => {\n try {\n const { googleClassroomUserId = null } = scores\n const googleId = googleUserId || googleClassroomUserId\n\n if (!googleId)\n return {\n error: true,\n message: 'No Google Classroom ID found',\n }\n const { courseWorkId, maxPoints, owners, courseId } = assignment\n const draftGrade = scores?.score ? (scores?.score / 100) * maxPoints : 0\n const result = await api.httpsCallable?.('submitAssignmentToGoogleClassroomV2')?.({\n teacherId: owners[0],\n courseId,\n courseWorkId,\n userId: googleId,\n draftGrade,\n })\n\n return result\n } catch (error) {\n return { error: true, message: error.message }\n }\n }\n\n return {\n submitAssignmentToGoogleClassroom,\n }\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","/* eslint-disable @typescript-eslint/no-unsafe-return */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\nimport { type User } from '@core/types/user.types'\nimport { type AssignmentWithId } from '@core/domains/assignment'\nimport dayjs from 'dayjs'\nimport { WEB_BASE_URL } from '@core/constants/web.constants'\nimport { api } from '@core/lib/firebase/api'\n\nimport { SPEAKABLE_NOTIFICATIONS, type SpeakableNotificationType } from '../notification.constants'\n\nimport { sendNotification } from './send-notification.service'\n\nexport const createNotification = async ({\n data,\n type,\n userId,\n profile,\n}: {\n type: SpeakableNotificationType\n data: any\n userId: string\n profile: User['profile']\n}) => {\n let result\n\n switch (type) {\n case SPEAKABLE_NOTIFICATIONS.NEW_ASSIGNMENT:\n result = await handleAssignNotifPromise({ data, profile })\n break\n case SPEAKABLE_NOTIFICATIONS.ASSESSMENT_SUBMITTED:\n result = await createAssessmentSubmissionNotification({\n data,\n profile,\n userId,\n })\n break\n case SPEAKABLE_NOTIFICATIONS.ASSESSMENT_SCORED:\n result = await createAssessmentScoredNotification({\n data,\n profile,\n })\n break\n default:\n result = null\n break\n }\n\n return result\n}\n\nconst handleAssignNotifPromise = async ({\n data: assignments,\n profile,\n}: {\n data: any[]\n profile: User['profile']\n}) => {\n if (!assignments.length) return\n\n try {\n const notifsPromises = assignments.map(async assignment => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const {\n section,\n section: { members },\n ...rest\n } = assignment\n\n if (!section || !members) throw new Error('Invalid assignment data')\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const data = { section, sendTo: members, assignment: { ...rest } }\n\n return createNewAssignmentNotification({ data, profile })\n })\n\n await Promise.all(notifsPromises)\n\n return {\n success: true,\n message: 'Assignment notifications sent successfully',\n }\n } catch (error) {\n console.error('Error in handleAssignNotifPromise:', error)\n throw error\n }\n}\n\nconst createNewAssignmentNotification = async ({\n data,\n profile,\n}: {\n data: {\n sendTo: string[]\n assignment: AssignmentWithId\n }\n profile: User['profile']\n}) => {\n const { assignment, sendTo } = data\n\n const teacherName = profile.displayName || 'Your teacher'\n const dueDate = assignment.dueDateTimestamp\n ? dayjs(assignment.dueDateTimestamp.toDate()).format('MMM Do')\n : null\n\n const results = await sendNotification(sendTo, {\n courseId: assignment.courseId,\n type: SPEAKABLE_NOTIFICATIONS.NEW_ASSIGNMENT,\n senderName: teacherName,\n link: `${WEB_BASE_URL}/assignment/${assignment.id}`,\n messagePreview: `A new assignment \"${assignment.name}\" is now available. ${dueDate ? `Due ${dueDate}` : ''}`,\n title: 'New Assignment Available!',\n imageUrl: profile.image?.url,\n })\n\n return results\n}\n\nconst createAssessmentSubmissionNotification = async ({\n data: assignment,\n profile,\n userId,\n}: {\n data: AssignmentWithId\n profile: User['profile']\n userId: string\n}) => {\n const studentName = profile.displayName || 'Your student'\n\n const results = await sendNotification(assignment.owners, {\n courseId: assignment.courseId,\n type: SPEAKABLE_NOTIFICATIONS.ASSESSMENT_SUBMITTED,\n link: `${WEB_BASE_URL}/a/${assignment.id}?studentId=${userId}`,\n title: `Assessment Submitted!`,\n senderName: studentName,\n messagePreview: `${studentName} has submitted the assessment \"${assignment.name}\"`,\n imageUrl: profile.image?.url,\n })\n\n return results\n}\n\nconst createAssessmentScoredNotification = async ({\n data,\n profile,\n}: {\n data: {\n assignment: AssignmentWithId\n sendTo: string[]\n }\n profile: User['profile']\n}) => {\n const { assignment, sendTo } = data\n\n const teacherName = profile.displayName || 'Your teacher'\n\n const title = `${assignment.isAssessment ? 'Assessment' : 'Assignment'} Reviewed!`\n const messagePreview = `Your ${assignment.isAssessment ? 'assessment' : 'assignment'} has been reviewed by your teacher. Click to view the feedback.`\n const results = await sendNotification(sendTo, {\n courseId: assignment.courseId,\n type: SPEAKABLE_NOTIFICATIONS.ASSESSMENT_SCORED,\n link: `${WEB_BASE_URL}/assignment/${assignment.id}`,\n title: title,\n messagePreview: messagePreview,\n imageUrl: profile.image?.url,\n senderName: teacherName,\n })\n\n await api.httpsCallable?.('sendAssessmentScoredEmail')?.({\n assessmentTitle: assignment.name,\n link: `${WEB_BASE_URL}/assignment/${assignment.id}`,\n senderImage: profile.image?.url || '',\n studentId: sendTo[0],\n teacherName: profile.displayName,\n })\n\n return results\n}\n","export const WEB_BASE_URL = 'https://app.speakable.io'\n","export const SPEAKABLE_NOTIFICATIONS = {\n NEW_ASSIGNMENT: 'new_assignment',\n ASSESSMENT_SUBMITTED: 'assessment_submitted',\n ASSESSMENT_SCORED: 'assessment_scored',\n NEW_COMMENT: 'NEW_COMMENT',\n} as const\n\nexport type SpeakableNotificationType =\n (typeof SPEAKABLE_NOTIFICATIONS)[keyof typeof SPEAKABLE_NOTIFICATIONS]\n\nexport const SpeakableNotificationTypes = {\n NEW_ASSIGNMENT: 'NEW_ASSIGNMENT',\n FEEDBACK_FROM_TEACHER: 'FEEDBACK_FROM_TEACHER',\n MESSAGE_FROM_STUDENT: 'MESSAGE_FROM_STUDENT',\n PHRASE_MARKED_CORRECT: 'PHRASE_MARKED_CORRECT',\n STUDENT_PROGRESS: 'STUDENT_PROGRESS',\n PLAYLIST_FOLLOWERS: 'PLAYLIST_FOLLOWERS',\n PLAYLIST_PLAYS: 'PLAYLIST_PLAYS',\n\n // New notifications\n ASSESSMENT_SUBMITTED: 'ASSESSMENT_SUBMITTED', // Notification FOR TEACHER when student submits assessment\n ASSESSMENT_SCORED: 'ASSESSMENT_SCORED', // Notification FOR STUDENT when teacher scores assessment\n // Comment\n NEW_COMMENT: 'NEW_COMMENT',\n}\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-assignment */\n/* eslint-disable @typescript-eslint/no-unsafe-return */\n\nimport { api } from '@core/lib/firebase/api'\nimport { withErrorHandler } from '@core/utils/error-handler'\n\nconst _sendNotification = async (sendTo: string[], notification: any) => {\n const results = await api.httpsCallable?.('createNotificationV2')?.({\n sendTo,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n notification: notification,\n })\n\n return results\n}\n\nexport const sendNotification = withErrorHandler(_sendNotification, 'sendNotification')\n","/* eslint-disable @typescript-eslint/no-unsafe-return */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n\nimport { useSpeakableApi } from '@core/providers/SpeakableProvider'\n\nimport { createNotification } from '../services/create-notification.service'\nimport { type SpeakableNotificationType } from '../notification.constants'\n\nconst notificationQueryKeys = {\n all: ['notifications'] as const,\n byId: (id: string) => [...notificationQueryKeys.all, id] as const,\n}\n\nexport const useCreateNotification = () => {\n const { user, queryClient } = useSpeakableApi()\n\n const handleCreateNotifications = async (type: SpeakableNotificationType, data: any) => {\n const result = await createNotification({\n type,\n userId: user.auth.uid,\n profile: user?.profile ?? {},\n data,\n })\n\n queryClient.invalidateQueries({\n queryKey: notificationQueryKeys.byId(user?.auth.uid ?? ''),\n })\n\n return result\n }\n\n return {\n createNotification: handleCreateNotifications,\n }\n}\n","export enum AssignmentAnalyticsType {\n Macro = 'macro',\n Gradebook = 'gradebook',\n Cards = 'cards',\n Student = 'student',\n StudentSummary = 'student_summary',\n All = 'all',\n}\n\nexport const ASSIGNMENT_ANALYTICS_TYPES = [\n AssignmentAnalyticsType.Macro,\n AssignmentAnalyticsType.Gradebook,\n AssignmentAnalyticsType.Cards,\n AssignmentAnalyticsType.Student,\n AssignmentAnalyticsType.StudentSummary,\n]\n\nconst ASSIGNMENTS_COLLECTION = 'assignments'\nconst ANALYTICS_SUBCOLLECTION = 'analytics'\nconst SCORES_SUBCOLLECTION = 'scores'\n\nexport type RefsAssignmentFiresotre =\n `${typeof ASSIGNMENTS_COLLECTION}/${string}${`/${typeof ANALYTICS_SUBCOLLECTION}/${string}` | `/${typeof SCORES_SUBCOLLECTION}/${string}` | ''}`\n\nexport const refsAssignmentFiresotre = {\n allAssignments: () => ASSIGNMENTS_COLLECTION,\n assignment: (params: { id: string }) => `${ASSIGNMENTS_COLLECTION}/${params.id}` as const,\n assignmentAllAnalytics: (params: { id: string }) =>\n `${ASSIGNMENTS_COLLECTION}/${params.id}/${ANALYTICS_SUBCOLLECTION}` as const,\n assignmentAnalytics: (params: { id: string; type: string }) =>\n `${ASSIGNMENTS_COLLECTION}/${params.id}/${ANALYTICS_SUBCOLLECTION}/${params.type}` as const,\n assignmentScores: (params: { id: string; userId: string }) =>\n `${ASSIGNMENTS_COLLECTION}/${params.id}/${SCORES_SUBCOLLECTION}/${params.userId}` as const,\n}\n","import { api } from '@core/lib/firebase/api'\n\nimport { type Score } from '../assignment.model'\n\nexport const defaultScore = (props: {\n owners: string[]\n courseId?: string\n userId: string\n googleClassroomUserId?: string\n}): Score => {\n const { serverTimestamp } = api.accessHelpers()\n\n const score = {\n progress: 0,\n score: 0,\n startDate: serverTimestamp(),\n status: 'IN_PROGRESS',\n submitted: false,\n cards: {},\n lastPlayed: serverTimestamp(),\n owners: props.owners,\n userId: props.userId,\n } as Score\n\n if (props.googleClassroomUserId) {\n score.googleClassroomUserId = props.googleClassroomUserId\n }\n\n if (props.courseId) {\n score.courseId = props.courseId\n }\n\n return score\n}\n","export const SCORES_PRACTICE_COLLECTION = 'users'\n\nexport const SCORES_PRACTICE_SUBCOLLECTION = 'practice'\n\nexport const refsScoresPractice = {\n practiceScores: (params: { userId: string; setId: string }) =>\n `${SCORES_PRACTICE_COLLECTION}/${params.userId}/${SCORES_PRACTICE_SUBCOLLECTION}/${params.setId}` as const,\n practiceScoreHistoryRefDoc: (params: { userId: string; setId: string; date: string }) =>\n `${SCORES_PRACTICE_COLLECTION}/${params.userId}/${SCORES_PRACTICE_SUBCOLLECTION}/${params.setId}/attempts/${params.date}` as const,\n}\n","import { withErrorHandler } from '@core/utils/error-handler'\nimport { api } from '@core/lib/firebase/api'\n\nimport { refsAssignmentFiresotre } from '../assignment.constants'\nimport { type Score } from '../assignment.model'\nimport { refsScoresPractice } from '../score-practice.constants'\n\nasync function _createScore(params: {\n isAssignment: boolean\n activityId: string\n userId: string\n scoreData: Score\n}) {\n if (params.isAssignment) {\n const ref = refsAssignmentFiresotre.assignmentScores({\n id: params.activityId,\n userId: params.userId,\n })\n\n await api.httpsCallable?.('updateAssignmentGradebookStatus')?.({\n assignmentId: params.activityId,\n userId: params.userId,\n status: 'IN_PROGRESS',\n score: null,\n })\n\n await api.setDoc(ref, params.scoreData, { merge: true })\n\n return {\n id: params.userId,\n }\n } else {\n const ref = refsScoresPractice.practiceScores({\n userId: params.userId,\n setId: params.activityId,\n })\n\n await api.setDoc(ref, params.scoreData)\n\n return {\n id: params.userId,\n }\n }\n}\n\nexport const createScore = withErrorHandler(_createScore, 'createScore')\n","import { api } from '@core/lib/firebase/api'\nimport { withErrorHandler } from '@core/utils/error-handler'\nimport { logStartAssignment } from '@core/lib/firebase/firebase-analytics'\n\nimport { refsAssignmentFiresotre } from '../assignment.constants'\nimport { type Score, type ScoreWithId } from '../assignment.model'\nimport { defaultScore } from '../utils/create-default-score'\nimport { refsScoresPractice } from '../score-practice.constants'\n\nimport { createScore } from './create-score.service'\n\nexport async function getAssignmentScore({\n userId,\n assignment,\n googleClassroomUserId,\n}: {\n userId: string\n assignment: {\n id: string\n courseId?: string\n }\n googleClassroomUserId?: string\n}) {\n const path = refsAssignmentFiresotre.assignmentScores({\n id: assignment.id,\n userId,\n })\n\n const response = await api.getDoc<ScoreWithId>(path)\n\n if (response.data == null) {\n const newScore: Score = {\n ...defaultScore({\n owners: [userId],\n userId,\n courseId: assignment.courseId,\n googleClassroomUserId,\n }),\n assignmentId: assignment.id,\n }\n\n logStartAssignment({\n courseId: assignment.courseId,\n })\n\n const result = await createScore({\n activityId: assignment.id,\n userId,\n isAssignment: true,\n scoreData: newScore,\n })\n\n return {\n ...newScore,\n id: result.id,\n }\n }\n\n return response.data\n}\n\nexport async function getPracticeScore({ userId, setId }: { userId: string; setId: string }) {\n const path = refsScoresPractice.practiceScores({ userId, setId })\n\n const response = await api.getDoc<ScoreWithId>(path)\n\n if (response.data == null) {\n const newScore: Score = {\n ...defaultScore({\n owners: [userId],\n userId,\n }),\n setId,\n }\n\n const result = await createScore({\n activityId: setId,\n userId,\n isAssignment: false,\n scoreData: newScore,\n })\n\n return {\n ...newScore,\n id: result.id,\n }\n }\n\n return response.data\n}\n\nasync function _getScore(params: {\n userId: string\n activityId: string\n courseId?: string\n googleClassroomUserId?: string\n isAssignment: boolean\n}) {\n if (params.isAssignment) {\n return await getAssignmentScore({\n userId: params.userId,\n assignment: {\n id: params.activityId,\n courseId: params.courseId,\n },\n googleClassroomUserId: params.googleClassroomUserId,\n })\n } else {\n return await getPracticeScore({\n userId: params.userId,\n setId: params.activityId,\n })\n }\n}\n\nexport const getScore = withErrorHandler(_getScore, 'getScore')\n","import { type Score } from '../assignment.model'\n\nconst calculateScoreAndProgress = (\n scores: Score,\n cardsList: string[],\n weights: Record<string, number>,\n) => {\n const totalSetPoints = cardsList.reduce((acc, cardId) => {\n acc += weights?.[cardId] || 1\n\n return acc\n }, 0)\n\n const totalPointsAwarded = Object.keys(scores?.cards || {}).reduce((acc, cardId) => {\n const cardScores = scores?.cards?.[cardId]\n\n if (cardScores?.completed || cardScores?.score || cardScores?.score === 0) {\n const score =\n cardScores?.score || cardScores?.score === 0 ? Number(cardScores?.score ?? 0) : null\n const weight = weights?.[cardId] || 1\n const fraction = (score ?? 0) / 100\n\n if (score || score === 0) {\n acc += weight * fraction\n } else {\n acc += weight\n }\n }\n\n return acc\n }, 0)\n const totalCompletedCards = Object.keys(scores?.cards || {}).reduce((acc, cardId) => {\n const cardScores = scores?.cards?.[cardId]\n\n if (cardScores?.completed || cardScores?.score || cardScores?.score === 0) {\n acc += 1\n }\n\n return acc\n }, 0)\n\n const percent = totalPointsAwarded / totalSetPoints\n\n const score = Math.round(percent * 100)\n\n const progress = Math.round((totalCompletedCards / (cardsList.length || 1)) * 100)\n\n return { score, progress }\n}\n\nexport default calculateScoreAndProgress\n","// export async function updateScore(props: UpdateScore) {\n// const { userId, data, type } = props\n\nimport { api } from '@core/lib/firebase/api'\nimport { withErrorHandler } from '@core/utils/error-handler'\n\nimport { refsAssignmentFiresotre } from '../assignment.constants'\nimport { type Score, type PageScore } from '../assignment.model'\nimport { refsScoresPractice } from '../score-practice.constants'\n\nasync function _updateScore(params: {\n userId: string\n data: Partial<Score>\n isAssignment: boolean\n activityId: string\n}) {\n const path = params.isAssignment\n ? refsAssignmentFiresotre.assignmentScores({\n id: params.activityId,\n userId: params.userId,\n })\n : refsScoresPractice.practiceScores({\n setId: params.activityId,\n userId: params.userId,\n })\n\n await api.updateDoc(path, {\n ...params.data,\n })\n}\n\nexport const updateScore = withErrorHandler(_updateScore, 'updateScore')\n\nasync function _updateCardScore(params: {\n userId: string\n cardId: string\n isAssignment: boolean\n activityId: string\n updates: {\n cardScore: PageScore\n progress: number\n score: number\n }\n}) {\n const path = params.isAssignment\n ? refsAssignmentFiresotre.assignmentScores({\n id: params.activityId,\n userId: params.userId,\n })\n : refsScoresPractice.practiceScores({\n setId: params.activityId,\n userId: params.userId,\n })\n\n const updates = Object.keys(params.updates.cardScore).reduce<Record<string, unknown>>(\n (acc, key) => {\n // @ts-ignore\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n acc[`cards.${params.cardId}.${key}`] = params.updates.cardScore[key]\n\n return acc\n },\n {},\n )\n\n if (params.updates.progress) {\n updates.progress = params.updates.progress\n }\n if (params.updates.score) {\n updates.score = params.updates.score\n }\n\n await api.updateDoc(path, {\n ...updates,\n })\n}\n\nexport const updateCardScore = withErrorHandler(_updateCardScore, 'updateCardScore')\n","import dayjs from 'dayjs'\nimport { api } from '@core/lib/firebase/api'\n\nimport { type PageScore, type Score } from '../assignment.model'\nimport { refsAssignmentFiresotre } from '../assignment.constants'\nimport { refsScoresPractice } from '../score-practice.constants'\n\nexport async function clearScore(params: {\n isAssignment: boolean\n cardId: string\n cardScores: PageScore\n userId: string\n activityId: string\n}) {\n const update: Partial<Score> = {\n [`cards.${params.cardId}`]: {\n attempts: (params.cardScores.attempts ?? 1) + 1,\n correct: params.cardScores.correct ?? 0,\n // save old score history\n history: [\n {\n ...params.cardScores,\n attempts: params.cardScores.attempts ?? 1,\n correct: params.cardScores.correct ?? 0,\n retryTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),\n history: null,\n },\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n ...(params.cardScores.history ?? []),\n ],\n },\n }\n\n const path = params.isAssignment\n ? refsAssignmentFiresotre.assignmentScores({\n id: params.activityId,\n userId: params.userId,\n })\n : refsScoresPractice.practiceScores({\n setId: params.activityId,\n userId: params.userId,\n })\n\n await api.updateDoc(path, update)\n\n return {\n update,\n activityId: params.activityId,\n }\n}\n","import { api } from '@core/lib/firebase/api'\nimport dayjs from 'dayjs'\nimport { withErrorHandler } from '@core/utils/error-handler'\n\nimport { type Score } from '../assignment.model'\nimport { refsAssignmentFiresotre } from '../assignment.constants'\nimport calculateScoreAndProgress from '../utils/calculateScoreAndProgress'\nimport { refsScoresPractice } from '../score-practice.constants'\n\nasync function _submitAssignmentScore({\n cardIds,\n assignment,\n weights,\n userId,\n status,\n studentName,\n}: {\n cardIds: string[]\n assignment: {\n id: string\n name: string\n owners: string[]\n courseId: string\n courseWorkId: string\n isAssessment: boolean\n }\n weights: Record<string, number>\n userId: string\n status: Score['status']\n studentName: string\n}) {\n const { serverTimestamp } = api.accessHelpers()\n\n const path = refsAssignmentFiresotre.assignmentScores({ id: assignment.id, userId })\n\n const fieldsUpdated = {\n submitted: true,\n progress: 100,\n submissionDate: serverTimestamp(),\n status,\n } as Score\n\n if (assignment.isAssessment) {\n const result = await handleAssessment(\n assignment,\n userId,\n cardIds,\n weights,\n fieldsUpdated,\n studentName,\n )\n\n return result\n } else if (assignment.courseId) {\n await handleCourseAssignment(assignment, userId)\n }\n\n await api.updateDoc(path, { ...fieldsUpdated })\n\n return { success: true, fieldsUpdated }\n}\n\nexport const submitAssignmentScore = withErrorHandler(\n _submitAssignmentScore,\n 'submitAssignmentScore',\n)\n\nasync function handleAssessment(\n assignment: { id: string; name: string; owners: string[] },\n userId: string,\n cardIds: string[],\n weights: Record<string, number>,\n fieldsUpdated: Score,\n studentName: string,\n) {\n const path = refsAssignmentFiresotre.assignmentScores({ id: assignment.id, userId })\n\n const response = await api.getDoc<Score>(path)\n\n if (!response.data) {\n throw new Error('Score not found')\n }\n\n const { score: scoreCalculated } = calculateScoreAndProgress(response.data, cardIds, weights)\n\n await api.updateDoc(path, { score: scoreCalculated, status: 'PENDING_REVIEW' })\n\n await api.httpsCallable?.('submitAssessment')?.({\n assignmentId: assignment.id,\n assignmentTitle: assignment.name,\n userId,\n teacherId: assignment.owners[0],\n studentName,\n })\n\n fieldsUpdated.status = 'PENDING_REVIEW'\n\n return { success: true, fieldsUpdated }\n}\n\nasync function handleCourseAssignment(assignment: { id: string }, userId: string) {\n await api.httpsCallable?.('submitAssignmentV2')?.({\n assignmentId: assignment.id,\n userId,\n })\n}\n\nexport async function submitPracticeScore({\n setId,\n userId,\n scores,\n}: {\n userId: string\n setId: string\n scores: Score\n}) {\n const { serverTimestamp } = api.accessHelpers()\n\n // Create new scores object on the practice set subcollection /attempts\n const date = dayjs().format('YYYY-MM-DD-HH-mm')\n\n const ref = refsScoresPractice.practiceScoreHistoryRefDoc({ setId, userId, date })\n\n const fieldsUpdated = {\n ...scores,\n submitted: true,\n progress: 100,\n submissionDate: serverTimestamp(),\n status: 'SUBMITTED',\n } as Score\n\n await api.setDoc(ref, { ...fieldsUpdated })\n\n // clear the existing scores doc\n const refScores = refsScoresPractice.practiceScores({ userId, setId })\n\n await api.deleteDoc(refScores)\n\n return { success: true, fieldsUpdated }\n}\n","import { type QueryClient, useMutation, useQueries, useQuery } from '@tanstack/react-query'\nimport { useMemo } from 'react'\nimport { useSpeakableApi } from '@core/providers/SpeakableProvider'\n\nimport { getCard } from './services/get-card.service'\nimport { type PageActivityWithId } from './card.model'\nimport { createCard, createCards } from './services/create-card.service'\n\nexport const cardsQueryKeys = {\n all: ['cards'],\n one: (params: { cardId: string }) => [...cardsQueryKeys.all, params.cardId],\n}\n\nexport function useCards({\n cardIds,\n enabled = true,\n asObject,\n}: {\n cardIds: string[]\n enabled: boolean\n asObject?: boolean\n}) {\n const queries = useQueries({\n queries: cardIds.map(cardId => ({\n enabled: enabled && cardIds.length > 0,\n queryKey: cardsQueryKeys.one({\n cardId,\n }),\n queryFn: () => getCard({ cardId }),\n })),\n })\n\n const cards = queries.map(query => query.data).filter(Boolean) as PageActivityWithId[]\n\n const cardsObject = useMemo(() => {\n if (!asObject) return null\n\n return cards.reduce<Record<string, PageActivityWithId>>((acc, card) => {\n acc[card.id] = card\n\n return acc\n }, {})\n }, [asObject, cards])\n\n return {\n cards,\n cardsObject,\n cardsQueries: queries,\n }\n}\n\nexport function useCreateCard() {\n const { queryClient } = useSpeakableApi()\n\n const mutationCreateCard = useMutation({\n mutationFn: createCard,\n onSuccess: cardCreated => {\n queryClient.invalidateQueries({ queryKey: cardsQueryKeys.one({ cardId: cardCreated.id }) })\n },\n })\n\n return {\n mutationCreateCard,\n }\n}\n\nexport function useCreateCards() {\n const mutationCreateCards = useMutation({\n mutationFn: createCards,\n })\n\n return {\n mutationCreateCards,\n }\n}\n\nexport function getCardFromCache({\n cardId,\n queryClient,\n}: {\n cardId: string\n queryClient: QueryClient\n}) {\n return queryClient.getQueryData<PageActivityWithId>(cardsQueryKeys.one({ cardId }))\n}\n\nexport function updateCardInCache({\n cardId,\n card,\n queryClient,\n}: {\n cardId: string\n card: PageActivityWithId | null\n queryClient: QueryClient\n}): void {\n queryClient.setQueryData(cardsQueryKeys.one({ cardId }), card)\n}\n\nexport function useGetCard({ cardId, enabled = true }: { cardId: string; enabled?: boolean }) {\n const query = useQuery({\n queryKey: cardsQueryKeys.one({ cardId }),\n queryFn: () => getCard({ cardId }),\n enabled: enabled && !!cardId,\n })\n\n return query\n}\n","/* eslint-disable @typescript-eslint/naming-convention */\n\nexport enum FeedbackTypesCard {\n SuggestedResponse = 'suggested_response',\n Wida = 'wida',\n GrammarInsights = 'grammar_insights',\n Actfl = 'actfl',\n ProficiencyLevel = 'proficiency_level',\n}\n\nexport enum LeniencyCard {\n CONFIDENCE = 'confidence',\n EASY = 'easy',\n NORMAL = 'normal',\n HARD = 'hard',\n}\n\nexport const LENIENCY_OPTIONS = [\n {\n label: 'Build Confidence - most lenient',\n value: LeniencyCard.CONFIDENCE,\n },\n {\n label: 'Very Lenient',\n value: LeniencyCard.EASY,\n },\n {\n label: 'Normal',\n value: LeniencyCard.NORMAL,\n },\n {\n label: 'No leniency - most strict',\n value: LeniencyCard.HARD,\n },\n]\n\nexport const STUDENT_LEVELS_OPTIONS = [\n {\n label: 'Beginner',\n description: 'Beginner Level: Just starting out. Can say a few basic words and phrases.',\n value: 'beginner',\n },\n {\n label: 'Elementary',\n description:\n 'Elementary Level: Can understand simple sentences and have very basic conversations.',\n value: 'elementary',\n },\n {\n label: 'Intermediate',\n description: 'Intermediate Level: Can talk about everyday topics and handle common situations.',\n value: 'intermediate',\n },\n {\n label: 'Advanced',\n description: 'Advanced Level: Can speak and understand with ease, and explain ideas clearly.',\n value: 'advanced',\n },\n {\n label: 'Fluent',\n description:\n 'Fluent Level: Speaks naturally and easily. Can use the language in work or school settings.',\n value: 'fluent',\n },\n {\n label: 'Native-like',\n description:\n 'Native-like Level: Understands and speaks like a native. Can discuss complex ideas accurately.',\n value: 'nativeLike',\n },\n]\n\nexport const BASE_RESPOND_FIELD_VALUES = {\n title: '',\n allowRetries: true,\n respondTime: 180,\n maxCharacters: 1000,\n}\n\nexport const BASE_REPEAT_FIELD_VALUES = {\n repeat: 1,\n}\n\nexport const BASE_MULTIPLE_CHOICE_FIELD_VALUES = {\n MCQType: 'single',\n answer: ['A'],\n choices: [\n { option: 'A', value: 'Option A' },\n { option: 'B', value: 'Option B' },\n { option: 'C', value: 'Option C' },\n ],\n}\n\nexport enum VerificationCardStatus {\n VERIFIED = 'VERIFIED',\n WARNING = 'WARNING',\n NOT_RECOMMENDED = 'NOT_RECOMMENDED',\n NOT_WORKING = 'NOT_WORKING',\n NOT_CHECKED = 'NOT_CHECKED',\n}\n\nconst CARDS_COLLECTION = 'flashcards'\n\nexport type RefsCardsFiresotre = `${typeof CARDS_COLLECTION}/${string}`\n\nexport const refsCardsFiresotre = {\n allCards: CARDS_COLLECTION,\n card: (id: string) => `${CARDS_COLLECTION}/${id}` as const,\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","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","/* 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 { type QueryClient, useQuery } from '@tanstack/react-query'\n\nimport { getSet } from './services/get-set.service'\nimport { type SetWithId } from './set.model'\n\nexport const setsQueryKeys = {\n all: ['sets'],\n one: (params: { setId: string }) => [...setsQueryKeys.all, params.setId],\n}\n\nexport const useSet = ({ setId, enabled }: { setId: string; enabled?: boolean }) => {\n return useQuery({\n queryKey: setsQueryKeys.one({ setId }),\n queryFn: () => getSet({ setId }),\n enabled: setId !== undefined && setId !== '' && enabled,\n })\n}\n\nexport function getSetFromCache({\n setId,\n queryClient,\n}: {\n setId: string | undefined\n queryClient: QueryClient\n}) {\n if (!setId) return null\n\n return queryClient.getQueryData<SetWithId>(setsQueryKeys.one({ setId }))\n}\n\nexport function updateSetInCache({\n set,\n queryClient,\n}: {\n set: SetWithId\n queryClient: QueryClient\n}) {\n const { id, ...setData } = set\n\n queryClient.setQueryData(setsQueryKeys.one({ setId: id }), setData)\n}\n","const SETS_COLLECTION = 'sets'\n\nexport type RefsSetsFirestore = `${typeof SETS_COLLECTION}/${string}`\n\nexport const refsSetsFirestore = {\n allSets: SETS_COLLECTION,\n set: (id: string) => `${SETS_COLLECTION}/${id}` as const,\n}\n","import { api } from '@core/lib/firebase/api'\nimport { withErrorHandler } from '@core/utils/error-handler'\n\nimport { refsSetsFirestore } from '../set.constants'\nimport { type SetWithId } from '../set.model'\n\nasync function _getSet({ setId }: { setId: string }) {\n const response = await api.getDoc<SetWithId>(refsSetsFirestore.set(setId))\n\n return response.data\n}\n\nexport const getSet = withErrorHandler(_getSet, 'getSet')\n"],"mappings":"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","names":["useQuery","score","dayjs","dayjs","dayjs","dayjs","useQuery","createNotification","useMutation","useQuery","useMutation","useQuery","useQuery","useQuery"]}