@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
package/dist/hooks.js.map DELETED
@@ -1 +0,0 @@
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/hooks/usePermissions.ts","../src/hooks/useGoogleClassroom.ts","../src/domains/notification/services/create-notification.service.ts","../src/domains/notification/services/send-notification.service.ts","../src/domains/notification/hooks/notification.hooks.ts","../src/domains/assignment/services/create-score.service.ts","../src/domains/assignment/services/get-score.service.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/sets/set.hooks.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","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","/* 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","/* 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","/* 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","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","// 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","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"],"mappings":"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","names":["useQuery","dayjs","dayjs","dayjs","dayjs","useQuery","createNotification","useMutation","useQuery","useMutation","useQuery","useQuery","useQuery"]}
@@ -1,405 +0,0 @@
1
- import { V as VerificationCardStatus } from './card.constants-DhKFipX3.js';
2
- import { F as FirebaseInstance, a as FirestoreHelpers, C as CallableFunction, A as AssignmentWithId, b as CustomTimestamp, c as ActivityPageType, P as PageActivity, d as PageActivityWithId } from './assignment.model-DLMWAp0Y.js';
3
- import { A as AssignmentAnalyticsType } from './assignment.constants-BIKM6fYi.js';
4
- import '@react-native-firebase/firestore';
5
- import 'firebase/firestore';
6
-
7
- type FsClientParams = Omit<Parameters<typeof createFsClientBase>[0], 'helpers'>;
8
- declare function createFsClientBase({ db, helpers, httpsCallable, logEvent, }: {
9
- db: FirebaseInstance;
10
- helpers: FirestoreHelpers;
11
- httpsCallable: (name: string) => CallableFunction;
12
- logEvent: (name: string, data: any) => void;
13
- }): {
14
- assignmentRepo: {
15
- getAssignment: (params: {
16
- assignmentId: string;
17
- currentUserId: string;
18
- analyticType?: AssignmentAnalyticsType;
19
- studentId?: string;
20
- }) => Promise<AssignmentWithId | {
21
- scores: any;
22
- id: string;
23
- isAvailable: boolean;
24
- name: string;
25
- description: string;
26
- scheduledTime?: string | null;
27
- dueTime?: {
28
- hours: number;
29
- minutes: number;
30
- nanos: number;
31
- };
32
- speakableio: boolean;
33
- owners: string[];
34
- image: {
35
- path: string | null;
36
- url: string;
37
- };
38
- dueDate: {
39
- day: number;
40
- month: number;
41
- year: number;
42
- };
43
- teacherName: string;
44
- courseWorkId: string | null;
45
- dueDateTimestamp: CustomTimestamp;
46
- scheduledTimeTimestamp: number;
47
- active: boolean;
48
- voice: string | null;
49
- setId: string;
50
- dateMade: {
51
- seconds: number;
52
- nanoseconds: number;
53
- };
54
- maxPoints: number;
55
- courseId: string;
56
- isAssessment: boolean;
57
- ltiDeeplink?: string;
58
- content?: string[];
59
- weights?: Record<string, number>;
60
- language?: string;
61
- types?: { [key in ActivityPageType]?: number; };
62
- aiEnabled?: boolean;
63
- chat_experience?: boolean;
64
- } | null>;
65
- attachScoresAssignment: (args_0: {
66
- assignments: AssignmentWithId[];
67
- analyticType: AssignmentAnalyticsType;
68
- studentId?: string;
69
- currentUserId: string;
70
- }) => Promise<{
71
- scores: any;
72
- id: string;
73
- isAvailable: boolean;
74
- name: string;
75
- description: string;
76
- scheduledTime?: string | null;
77
- dueTime?: {
78
- hours: number;
79
- minutes: number;
80
- nanos: number;
81
- };
82
- speakableio: boolean;
83
- owners: string[];
84
- image: {
85
- path: string | null;
86
- url: string;
87
- };
88
- dueDate: {
89
- day: number;
90
- month: number;
91
- year: number;
92
- };
93
- teacherName: string;
94
- courseWorkId: string | null;
95
- dueDateTimestamp: CustomTimestamp;
96
- scheduledTimeTimestamp: number;
97
- active: boolean;
98
- voice: string | null;
99
- setId: string;
100
- dateMade: {
101
- seconds: number;
102
- nanoseconds: number;
103
- };
104
- maxPoints: number;
105
- courseId: string;
106
- isAssessment: boolean;
107
- ltiDeeplink?: string;
108
- content?: string[];
109
- weights?: Record<string, number>;
110
- language?: string;
111
- types?: { [key in ActivityPageType]?: number; };
112
- aiEnabled?: boolean;
113
- chat_experience?: boolean;
114
- }[]>;
115
- getAssignmentScores: (args_0: {
116
- assignmentId: string;
117
- currentUserId: string;
118
- analyticType?: AssignmentAnalyticsType;
119
- studentId?: string;
120
- }) => Promise<{
121
- scores: unknown;
122
- id: string;
123
- } | undefined>;
124
- getAllAssignments: () => Promise<(AssignmentWithId & {
125
- id: string;
126
- })[]>;
127
- };
128
- cardRepo: {
129
- createCard: (args_0: {
130
- data: Partial<PageActivity>;
131
- }) => Promise<{
132
- id: string;
133
- } & Partial<PageActivity>>;
134
- createCards: (args_0: {
135
- cards: PageActivity[];
136
- }) => Promise<{
137
- id: string;
138
- owners: string[];
139
- checked?: boolean;
140
- completed?: boolean;
141
- media_area_id?: string | null;
142
- media_area_layout?: "left" | "right" | null;
143
- score?: number;
144
- verificationStatus?: VerificationCardStatus;
145
- native_text?: string;
146
- repeat?: number;
147
- language?: string | null;
148
- image?: {
149
- path?: string | null;
150
- url?: string;
151
- };
152
- audio?: {
153
- path?: string | null;
154
- url?: string;
155
- } | null;
156
- notes?: string;
157
- difficulty?: string;
158
- default_language?: string;
159
- target_text?: string;
160
- type: ActivityPageType;
161
- grading_criteria?: string;
162
- scoring_type?: string;
163
- grading_method?: "simple" | "rubric" | "manual" | "standards_based";
164
- feedback_types?: string[];
165
- rubricId?: string;
166
- prompt?: string;
167
- title?: string;
168
- passing_score?: number;
169
- maxCharacters?: number;
170
- answer?: string[];
171
- choices?: {
172
- value: string;
173
- option: string;
174
- }[];
175
- MCQType?: string;
176
- multipleAttemptsAllowed?: boolean;
177
- allowRetries?: boolean;
178
- question?: string;
179
- respondTime?: number;
180
- hidePrompt?: boolean;
181
- videoUrl?: string;
182
- link?: string;
183
- text?: string;
184
- isListenAloud?: boolean;
185
- embedCode?: string;
186
- attempt?: number;
187
- correct?: number;
188
- autoGrade?: boolean;
189
- points?: number;
190
- shuffle?: boolean;
191
- translation?: string;
192
- includeAIContext?: boolean;
193
- media_area_context_ref?: string | null;
194
- standardId?: string;
195
- target_proficiency_level?: string;
196
- allowTTS?: boolean;
197
- feedback_language?: string | null;
198
- correct_answer?: string | null;
199
- limit_attempts?: boolean;
200
- max_attempts?: number;
201
- rich_text?: string;
202
- }[]>;
203
- getCard: (params: {
204
- cardId: string;
205
- }) => Promise<PageActivityWithId | null>;
206
- };
207
- };
208
-
209
- declare const createFsClientWeb: ({ db, httpsCallable, logEvent }: FsClientParams) => {
210
- assignmentRepo: {
211
- getAssignment: (params: {
212
- assignmentId: string;
213
- currentUserId: string;
214
- analyticType?: AssignmentAnalyticsType;
215
- studentId?: string;
216
- }) => Promise<AssignmentWithId | {
217
- scores: any;
218
- id: string;
219
- isAvailable: boolean;
220
- name: string;
221
- description: string;
222
- scheduledTime?: string | null;
223
- dueTime?: {
224
- hours: number;
225
- minutes: number;
226
- nanos: number;
227
- };
228
- speakableio: boolean;
229
- owners: string[];
230
- image: {
231
- path: string | null;
232
- url: string;
233
- };
234
- dueDate: {
235
- day: number;
236
- month: number;
237
- year: number;
238
- };
239
- teacherName: string;
240
- courseWorkId: string | null;
241
- dueDateTimestamp: CustomTimestamp;
242
- scheduledTimeTimestamp: number;
243
- active: boolean;
244
- voice: string | null;
245
- setId: string;
246
- dateMade: {
247
- seconds: number;
248
- nanoseconds: number;
249
- };
250
- maxPoints: number;
251
- courseId: string;
252
- isAssessment: boolean;
253
- ltiDeeplink?: string;
254
- content?: string[];
255
- weights?: Record<string, number>;
256
- language?: string;
257
- types?: { [key in ActivityPageType]?: number; };
258
- aiEnabled?: boolean;
259
- chat_experience?: boolean;
260
- } | null>;
261
- attachScoresAssignment: (args_0: {
262
- assignments: AssignmentWithId[];
263
- analyticType: AssignmentAnalyticsType;
264
- studentId?: string;
265
- currentUserId: string;
266
- }) => Promise<{
267
- scores: any;
268
- id: string;
269
- isAvailable: boolean;
270
- name: string;
271
- description: string;
272
- scheduledTime?: string | null;
273
- dueTime?: {
274
- hours: number;
275
- minutes: number;
276
- nanos: number;
277
- };
278
- speakableio: boolean;
279
- owners: string[];
280
- image: {
281
- path: string | null;
282
- url: string;
283
- };
284
- dueDate: {
285
- day: number;
286
- month: number;
287
- year: number;
288
- };
289
- teacherName: string;
290
- courseWorkId: string | null;
291
- dueDateTimestamp: CustomTimestamp;
292
- scheduledTimeTimestamp: number;
293
- active: boolean;
294
- voice: string | null;
295
- setId: string;
296
- dateMade: {
297
- seconds: number;
298
- nanoseconds: number;
299
- };
300
- maxPoints: number;
301
- courseId: string;
302
- isAssessment: boolean;
303
- ltiDeeplink?: string;
304
- content?: string[];
305
- weights?: Record<string, number>;
306
- language?: string;
307
- types?: { [key in ActivityPageType]?: number; };
308
- aiEnabled?: boolean;
309
- chat_experience?: boolean;
310
- }[]>;
311
- getAssignmentScores: (args_0: {
312
- assignmentId: string;
313
- currentUserId: string;
314
- analyticType?: AssignmentAnalyticsType;
315
- studentId?: string;
316
- }) => Promise<{
317
- scores: unknown;
318
- id: string;
319
- } | undefined>;
320
- getAllAssignments: () => Promise<(AssignmentWithId & {
321
- id: string;
322
- })[]>;
323
- };
324
- cardRepo: {
325
- createCard: (args_0: {
326
- data: Partial<PageActivity>;
327
- }) => Promise<{
328
- id: string;
329
- } & Partial<PageActivity>>;
330
- createCards: (args_0: {
331
- cards: PageActivity[];
332
- }) => Promise<{
333
- id: string;
334
- owners: string[];
335
- checked?: boolean;
336
- completed?: boolean;
337
- media_area_id?: string | null;
338
- media_area_layout?: "left" | "right" | null;
339
- score?: number;
340
- verificationStatus?: VerificationCardStatus;
341
- native_text?: string;
342
- repeat?: number;
343
- language?: string | null;
344
- image?: {
345
- path?: string | null;
346
- url?: string;
347
- };
348
- audio?: {
349
- path?: string | null;
350
- url?: string;
351
- } | null;
352
- notes?: string;
353
- difficulty?: string;
354
- default_language?: string;
355
- target_text?: string;
356
- type: ActivityPageType;
357
- grading_criteria?: string;
358
- scoring_type?: string;
359
- grading_method?: "simple" | "rubric" | "manual" | "standards_based";
360
- feedback_types?: string[];
361
- rubricId?: string;
362
- prompt?: string;
363
- title?: string;
364
- passing_score?: number;
365
- maxCharacters?: number;
366
- answer?: string[];
367
- choices?: {
368
- value: string;
369
- option: string;
370
- }[];
371
- MCQType?: string;
372
- multipleAttemptsAllowed?: boolean;
373
- allowRetries?: boolean;
374
- question?: string;
375
- respondTime?: number;
376
- hidePrompt?: boolean;
377
- videoUrl?: string;
378
- link?: string;
379
- text?: string;
380
- isListenAloud?: boolean;
381
- embedCode?: string;
382
- attempt?: number;
383
- correct?: number;
384
- autoGrade?: boolean;
385
- points?: number;
386
- shuffle?: boolean;
387
- translation?: string;
388
- includeAIContext?: boolean;
389
- media_area_context_ref?: string | null;
390
- standardId?: string;
391
- target_proficiency_level?: string;
392
- allowTTS?: boolean;
393
- feedback_language?: string | null;
394
- correct_answer?: string | null;
395
- limit_attempts?: boolean;
396
- max_attempts?: number;
397
- rich_text?: string;
398
- }[]>;
399
- getCard: (params: {
400
- cardId: string;
401
- }) => Promise<PageActivityWithId | null>;
402
- };
403
- };
404
-
405
- export { createFsClientWeb as createFsClient };
package/dist/models.d.ts DELETED
@@ -1,56 +0,0 @@
1
- import { c as ActivityPageType } from './assignment.model-DLMWAp0Y.js';
2
- export { g as Assignment, A as AssignmentWithId, M as MULTIPLE_CHOICE_PAGE_ACTIVITY_TYPES, P as PageActivity, d as PageActivityWithId, f as PageScore, h as REPEAT_PAGE_ACTIVITY_TYPES, j as RESPOND_AUDIO_PAGE_ACTIVITY_TYPES, R as RESPOND_PAGE_ACTIVITY_TYPES, i as RESPOND_WRITE_PAGE_ACTIVITY_TYPES, e as Score, S as ScoreWithId } from './assignment.model-DLMWAp0Y.js';
3
- import { FieldValue } from 'firebase/firestore';
4
- import '@react-native-firebase/firestore';
5
- import './card.constants-DhKFipX3.js';
6
-
7
- interface SetWithId extends Set {
8
- id: string;
9
- }
10
- interface Set {
11
- id: string;
12
- language: string;
13
- ownerName: string;
14
- weights: Record<string, number>;
15
- repeat?: number;
16
- voice?: string;
17
- averagePhraseLength?: number;
18
- passing_score?: number;
19
- organizations?: string[];
20
- description: string;
21
- image: {
22
- url: string;
23
- path: null | string;
24
- };
25
- additionalLanguages?: string[];
26
- owners: string[];
27
- name: string;
28
- content: string[];
29
- types: {
30
- [key in ActivityPageType]?: number;
31
- };
32
- defaultLanguage: string;
33
- createdAt: FieldValue;
34
- public: boolean;
35
- defaultRubricId?: string;
36
- difficulty?: string;
37
- end_screen?: {
38
- variant: 0 | 1 | 2;
39
- title: string;
40
- description: string;
41
- };
42
- mcAllowRetries?: boolean;
43
- welcome_screen?: {
44
- variant: 'colored' | 'blank';
45
- };
46
- poorFunctionalityWarning?: boolean;
47
- status?: 'draft' | 'published';
48
- subjects?: any[];
49
- respondAllowRetries?: boolean;
50
- respondAllowTTS?: boolean;
51
- feedbackLanguage?: string;
52
- respondMaxCharacters?: number;
53
- respondMaxTime?: number;
54
- }
55
-
56
- export { ActivityPageType, type Set, type SetWithId };
package/dist/models.js DELETED
@@ -1,17 +0,0 @@
1
- import {
2
- ActivityPageType,
3
- MULTIPLE_CHOICE_PAGE_ACTIVITY_TYPES,
4
- REPEAT_PAGE_ACTIVITY_TYPES,
5
- RESPOND_AUDIO_PAGE_ACTIVITY_TYPES,
6
- RESPOND_PAGE_ACTIVITY_TYPES,
7
- RESPOND_WRITE_PAGE_ACTIVITY_TYPES
8
- } from "./chunk-LZG3MTSH.js";
9
- export {
10
- ActivityPageType,
11
- MULTIPLE_CHOICE_PAGE_ACTIVITY_TYPES,
12
- REPEAT_PAGE_ACTIVITY_TYPES,
13
- RESPOND_AUDIO_PAGE_ACTIVITY_TYPES,
14
- RESPOND_PAGE_ACTIVITY_TYPES,
15
- RESPOND_WRITE_PAGE_ACTIVITY_TYPES
16
- };
17
- //# sourceMappingURL=models.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1,21 +0,0 @@
1
- declare const SPEAKABLE_NOTIFICATIONS: {
2
- readonly NEW_ASSIGNMENT: "new_assignment";
3
- readonly ASSESSMENT_SUBMITTED: "assessment_submitted";
4
- readonly ASSESSMENT_SCORED: "assessment_scored";
5
- readonly NEW_COMMENT: "NEW_COMMENT";
6
- };
7
- type SpeakableNotificationType = (typeof SPEAKABLE_NOTIFICATIONS)[keyof typeof SPEAKABLE_NOTIFICATIONS];
8
- declare const SpeakableNotificationTypes: {
9
- NEW_ASSIGNMENT: string;
10
- FEEDBACK_FROM_TEACHER: string;
11
- MESSAGE_FROM_STUDENT: string;
12
- PHRASE_MARKED_CORRECT: string;
13
- STUDENT_PROGRESS: string;
14
- PLAYLIST_FOLLOWERS: string;
15
- PLAYLIST_PLAYS: string;
16
- ASSESSMENT_SUBMITTED: string;
17
- ASSESSMENT_SCORED: string;
18
- NEW_COMMENT: string;
19
- };
20
-
21
- export { type SpeakableNotificationType as S, SPEAKABLE_NOTIFICATIONS as a, SpeakableNotificationTypes as b };