@speakableio/core 1.0.20 → 1.0.22

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.
@@ -1,5 +1,9 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import React from 'react';
3
+ import * as _tanstack_react_query from '@tanstack/react-query';
4
+ import { QueryClient } from '@tanstack/react-query';
1
5
  import { FirebaseFirestoreTypes, Timestamp } from '@react-native-firebase/firestore';
2
- import { Firestore, getDoc, getDocs, addDoc, setDoc, updateDoc, deleteDoc, runTransaction, writeBatch, doc, collection, query, serverTimestamp, orderBy, limit, startAt, startAfter, endAt, endBefore, where, increment, Timestamp as Timestamp$1 } from 'firebase/firestore';
6
+ import { Firestore, getDoc, getDocs, addDoc, setDoc, updateDoc, deleteDoc, runTransaction, writeBatch, doc, collection, query, serverTimestamp, orderBy, limit, startAt, startAfter, endAt, endBefore, where, increment, Timestamp as Timestamp$1, FieldValue } from 'firebase/firestore';
3
7
 
4
8
  type FirebaseInstance = FirebaseFirestoreTypes.Module | Firestore;
5
9
  interface FirestoreHelpers {
@@ -27,6 +31,45 @@ interface FirestoreHelpers {
27
31
  type CustomTimestamp = Timestamp | Timestamp$1;
28
32
  type CallableFunction<T = any, R = any> = (data: T) => Promise<R>;
29
33
 
34
+ declare enum FeedbackTypesCard {
35
+ SuggestedResponse = "suggested_response",
36
+ Wida = "wida",
37
+ GrammarInsights = "grammar_insights",
38
+ Actfl = "actfl",
39
+ ProficiencyLevel = "proficiency_level"
40
+ }
41
+ declare enum LeniencyCard {
42
+ CONFIDENCE = "confidence",
43
+ EASY = "easy",
44
+ NORMAL = "normal",
45
+ HARD = "hard"
46
+ }
47
+ declare const LENIENCY_OPTIONS: {
48
+ label: string;
49
+ value: LeniencyCard;
50
+ }[];
51
+ declare const STUDENT_LEVELS_OPTIONS: {
52
+ label: string;
53
+ description: string;
54
+ value: string;
55
+ }[];
56
+ declare const BASE_RESPOND_FIELD_VALUES: {
57
+ title: string;
58
+ allowRetries: boolean;
59
+ respondTime: number;
60
+ maxCharacters: number;
61
+ };
62
+ declare const BASE_REPEAT_FIELD_VALUES: {
63
+ repeat: number;
64
+ };
65
+ declare const BASE_MULTIPLE_CHOICE_FIELD_VALUES: {
66
+ MCQType: string;
67
+ answer: string[];
68
+ choices: {
69
+ option: string;
70
+ value: string;
71
+ }[];
72
+ };
30
73
  declare enum VerificationCardStatus {
31
74
  VERIFIED = "VERIFIED",
32
75
  WARNING = "WARNING",
@@ -34,7 +77,16 @@ declare enum VerificationCardStatus {
34
77
  NOT_WORKING = "NOT_WORKING",
35
78
  NOT_CHECKED = "NOT_CHECKED"
36
79
  }
80
+ declare const CARDS_COLLECTION = "flashcards";
81
+ type RefsCardsFiresotre = `${typeof CARDS_COLLECTION}/${string}`;
82
+ declare const refsCardsFiresotre: {
83
+ allCards: string;
84
+ card: (id: string) => `flashcards/${string}`;
85
+ };
37
86
 
87
+ interface PageActivityWithId extends PageActivity {
88
+ id: string;
89
+ }
38
90
  interface PageActivity {
39
91
  owners: string[];
40
92
  checked?: boolean;
@@ -112,6 +164,428 @@ declare const enum ActivityPageType {
112
164
  MEDIA_PAGE = "MEDIA_PAGE",
113
165
  SHORT_ANSWER = "SHORT_ANSWER"
114
166
  }
167
+ declare const RESPOND_PAGE_ACTIVITY_TYPES: ActivityPageType[];
168
+ declare const MULTIPLE_CHOICE_PAGE_ACTIVITY_TYPES: ActivityPageType[];
169
+ declare const REPEAT_PAGE_ACTIVITY_TYPES: ActivityPageType[];
170
+ declare const RESPOND_WRITE_PAGE_ACTIVITY_TYPES: ActivityPageType[];
171
+ declare const RESPOND_AUDIO_PAGE_ACTIVITY_TYPES: ActivityPageType[];
172
+
173
+ declare const cardsQueryKeys: {
174
+ all: string[];
175
+ one: (params: {
176
+ cardId: string;
177
+ }) => string[];
178
+ };
179
+ declare function useCards({ cardIds, enabled, asObject, }: {
180
+ cardIds: string[];
181
+ enabled: boolean;
182
+ asObject?: boolean;
183
+ }): {
184
+ cards: PageActivityWithId[];
185
+ cardsObject: Record<string, PageActivityWithId> | null;
186
+ cardsQueries: _tanstack_react_query.UseQueryResult<{
187
+ type: ActivityPageType;
188
+ id: string;
189
+ owners: string[];
190
+ checked?: boolean;
191
+ completed?: boolean;
192
+ media_area_id?: string | null;
193
+ media_area_layout?: "left" | "right" | null;
194
+ score?: number;
195
+ verificationStatus?: VerificationCardStatus;
196
+ native_text?: string;
197
+ repeat?: number;
198
+ language?: string | null;
199
+ image?: {
200
+ path?: string | null;
201
+ url?: string;
202
+ };
203
+ audio?: {
204
+ path?: string | null;
205
+ url?: string;
206
+ } | null;
207
+ notes?: string;
208
+ difficulty?: string;
209
+ default_language?: string;
210
+ target_text?: string;
211
+ grading_criteria?: string;
212
+ scoring_type?: string;
213
+ grading_method?: "simple" | "rubric" | "manual" | "standards_based";
214
+ feedback_types?: string[];
215
+ rubricId?: string;
216
+ prompt?: string;
217
+ title?: string;
218
+ passing_score?: number;
219
+ maxCharacters?: number;
220
+ answer?: string[];
221
+ choices?: {
222
+ value: string;
223
+ option: string;
224
+ }[];
225
+ MCQType?: string;
226
+ multipleAttemptsAllowed?: boolean;
227
+ allowRetries?: boolean;
228
+ question?: string;
229
+ respondTime?: number;
230
+ hidePrompt?: boolean;
231
+ videoUrl?: string;
232
+ link?: string;
233
+ text?: string;
234
+ isListenAloud?: boolean;
235
+ embedCode?: string;
236
+ attempt?: number;
237
+ correct?: number;
238
+ autoGrade?: boolean;
239
+ points?: number;
240
+ shuffle?: boolean;
241
+ translation?: string;
242
+ includeAIContext?: boolean;
243
+ media_area_context_ref?: string | null;
244
+ standardId?: string;
245
+ target_proficiency_level?: string;
246
+ allowTTS?: boolean;
247
+ feedback_language?: string | null;
248
+ correct_answer?: string | null;
249
+ limit_attempts?: boolean;
250
+ max_attempts?: number;
251
+ rich_text?: string;
252
+ } | null, Error>[];
253
+ };
254
+ declare function useCreateCard(): {
255
+ mutationCreateCard: _tanstack_react_query.UseMutationResult<{
256
+ id: string;
257
+ } & Partial<PageActivity>, Error, {
258
+ data: Partial<PageActivity>;
259
+ }, unknown>;
260
+ };
261
+ declare function useCreateCards(): {
262
+ mutationCreateCards: _tanstack_react_query.UseMutationResult<{
263
+ id: string;
264
+ owners: string[];
265
+ checked?: boolean;
266
+ completed?: boolean;
267
+ media_area_id?: string | null;
268
+ media_area_layout?: "left" | "right" | null;
269
+ score?: number;
270
+ verificationStatus?: VerificationCardStatus;
271
+ native_text?: string;
272
+ repeat?: number;
273
+ language?: string | null;
274
+ image?: {
275
+ path?: string | null;
276
+ url?: string;
277
+ };
278
+ audio?: {
279
+ path?: string | null;
280
+ url?: string;
281
+ } | null;
282
+ notes?: string;
283
+ difficulty?: string;
284
+ default_language?: string;
285
+ target_text?: string;
286
+ type: ActivityPageType;
287
+ grading_criteria?: string;
288
+ scoring_type?: string;
289
+ grading_method?: "simple" | "rubric" | "manual" | "standards_based";
290
+ feedback_types?: string[];
291
+ rubricId?: string;
292
+ prompt?: string;
293
+ title?: string;
294
+ passing_score?: number;
295
+ maxCharacters?: number;
296
+ answer?: string[];
297
+ choices?: {
298
+ value: string;
299
+ option: string;
300
+ }[];
301
+ MCQType?: string;
302
+ multipleAttemptsAllowed?: boolean;
303
+ allowRetries?: boolean;
304
+ question?: string;
305
+ respondTime?: number;
306
+ hidePrompt?: boolean;
307
+ videoUrl?: string;
308
+ link?: string;
309
+ text?: string;
310
+ isListenAloud?: boolean;
311
+ embedCode?: string;
312
+ attempt?: number;
313
+ correct?: number;
314
+ autoGrade?: boolean;
315
+ points?: number;
316
+ shuffle?: boolean;
317
+ translation?: string;
318
+ includeAIContext?: boolean;
319
+ media_area_context_ref?: string | null;
320
+ standardId?: string;
321
+ target_proficiency_level?: string;
322
+ allowTTS?: boolean;
323
+ feedback_language?: string | null;
324
+ correct_answer?: string | null;
325
+ limit_attempts?: boolean;
326
+ max_attempts?: number;
327
+ rich_text?: string;
328
+ }[], Error, {
329
+ cards: PageActivity[];
330
+ }, unknown>;
331
+ };
332
+ declare function getCardFromCache({ cardId, queryClient, }: {
333
+ cardId: string;
334
+ queryClient: QueryClient;
335
+ }): PageActivityWithId | undefined;
336
+ declare function updateCardInCache({ cardId, card, queryClient, }: {
337
+ cardId: string;
338
+ card: PageActivityWithId | null;
339
+ queryClient: QueryClient;
340
+ }): void;
341
+ declare function useGetCard({ cardId, enabled }: {
342
+ cardId: string;
343
+ enabled?: boolean;
344
+ }): _tanstack_react_query.UseQueryResult<{
345
+ type: ActivityPageType;
346
+ id: string;
347
+ owners: string[];
348
+ checked?: boolean;
349
+ completed?: boolean;
350
+ media_area_id?: string | null;
351
+ media_area_layout?: "left" | "right" | null;
352
+ score?: number;
353
+ verificationStatus?: VerificationCardStatus;
354
+ native_text?: string;
355
+ repeat?: number;
356
+ language?: string | null;
357
+ image?: {
358
+ path?: string | null;
359
+ url?: string;
360
+ };
361
+ audio?: {
362
+ path?: string | null;
363
+ url?: string;
364
+ } | null;
365
+ notes?: string;
366
+ difficulty?: string;
367
+ default_language?: string;
368
+ target_text?: string;
369
+ grading_criteria?: string;
370
+ scoring_type?: string;
371
+ grading_method?: "simple" | "rubric" | "manual" | "standards_based";
372
+ feedback_types?: string[];
373
+ rubricId?: string;
374
+ prompt?: string;
375
+ title?: string;
376
+ passing_score?: number;
377
+ maxCharacters?: number;
378
+ answer?: string[];
379
+ choices?: {
380
+ value: string;
381
+ option: string;
382
+ }[];
383
+ MCQType?: string;
384
+ multipleAttemptsAllowed?: boolean;
385
+ allowRetries?: boolean;
386
+ question?: string;
387
+ respondTime?: number;
388
+ hidePrompt?: boolean;
389
+ videoUrl?: string;
390
+ link?: string;
391
+ text?: string;
392
+ isListenAloud?: boolean;
393
+ embedCode?: string;
394
+ attempt?: number;
395
+ correct?: number;
396
+ autoGrade?: boolean;
397
+ points?: number;
398
+ shuffle?: boolean;
399
+ translation?: string;
400
+ includeAIContext?: boolean;
401
+ media_area_context_ref?: string | null;
402
+ standardId?: string;
403
+ target_proficiency_level?: string;
404
+ allowTTS?: boolean;
405
+ feedback_language?: string | null;
406
+ correct_answer?: string | null;
407
+ limit_attempts?: boolean;
408
+ max_attempts?: number;
409
+ rich_text?: string;
410
+ } | null, Error>;
411
+
412
+ declare const createCardRepo: () => {
413
+ createCard: (args_0: {
414
+ data: Partial<PageActivity>;
415
+ }) => Promise<{
416
+ id: string;
417
+ } & Partial<PageActivity>>;
418
+ createCards: (args_0: {
419
+ cards: PageActivity[];
420
+ }) => Promise<{
421
+ id: string;
422
+ owners: string[];
423
+ checked?: boolean;
424
+ completed?: boolean;
425
+ media_area_id?: string | null;
426
+ media_area_layout?: "left" | "right" | null;
427
+ score?: number;
428
+ verificationStatus?: VerificationCardStatus;
429
+ native_text?: string;
430
+ repeat?: number;
431
+ language?: string | null;
432
+ image?: {
433
+ path?: string | null;
434
+ url?: string;
435
+ };
436
+ audio?: {
437
+ path?: string | null;
438
+ url?: string;
439
+ } | null;
440
+ notes?: string;
441
+ difficulty?: string;
442
+ default_language?: string;
443
+ target_text?: string;
444
+ type: ActivityPageType;
445
+ grading_criteria?: string;
446
+ scoring_type?: string;
447
+ grading_method?: "simple" | "rubric" | "manual" | "standards_based";
448
+ feedback_types?: string[];
449
+ rubricId?: string;
450
+ prompt?: string;
451
+ title?: string;
452
+ passing_score?: number;
453
+ maxCharacters?: number;
454
+ answer?: string[];
455
+ choices?: {
456
+ value: string;
457
+ option: string;
458
+ }[];
459
+ MCQType?: string;
460
+ multipleAttemptsAllowed?: boolean;
461
+ allowRetries?: boolean;
462
+ question?: string;
463
+ respondTime?: number;
464
+ hidePrompt?: boolean;
465
+ videoUrl?: string;
466
+ link?: string;
467
+ text?: string;
468
+ isListenAloud?: boolean;
469
+ embedCode?: string;
470
+ attempt?: number;
471
+ correct?: number;
472
+ autoGrade?: boolean;
473
+ points?: number;
474
+ shuffle?: boolean;
475
+ translation?: string;
476
+ includeAIContext?: boolean;
477
+ media_area_context_ref?: string | null;
478
+ standardId?: string;
479
+ target_proficiency_level?: string;
480
+ allowTTS?: boolean;
481
+ feedback_language?: string | null;
482
+ correct_answer?: string | null;
483
+ limit_attempts?: boolean;
484
+ max_attempts?: number;
485
+ rich_text?: string;
486
+ }[]>;
487
+ getCard: (params: {
488
+ cardId: string;
489
+ }) => Promise<{
490
+ type: ActivityPageType;
491
+ id: string;
492
+ owners: string[];
493
+ checked?: boolean;
494
+ completed?: boolean;
495
+ media_area_id?: string | null;
496
+ media_area_layout?: "left" | "right" | null;
497
+ score?: number;
498
+ verificationStatus?: VerificationCardStatus;
499
+ native_text?: string;
500
+ repeat?: number;
501
+ language?: string | null;
502
+ image?: {
503
+ path?: string | null;
504
+ url?: string;
505
+ };
506
+ audio?: {
507
+ path?: string | null;
508
+ url?: string;
509
+ } | null;
510
+ notes?: string;
511
+ difficulty?: string;
512
+ default_language?: string;
513
+ target_text?: string;
514
+ grading_criteria?: string;
515
+ scoring_type?: string;
516
+ grading_method?: "simple" | "rubric" | "manual" | "standards_based";
517
+ feedback_types?: string[];
518
+ rubricId?: string;
519
+ prompt?: string;
520
+ title?: string;
521
+ passing_score?: number;
522
+ maxCharacters?: number;
523
+ answer?: string[];
524
+ choices?: {
525
+ value: string;
526
+ option: string;
527
+ }[];
528
+ MCQType?: string;
529
+ multipleAttemptsAllowed?: boolean;
530
+ allowRetries?: boolean;
531
+ question?: string;
532
+ respondTime?: number;
533
+ hidePrompt?: boolean;
534
+ videoUrl?: string;
535
+ link?: string;
536
+ text?: string;
537
+ isListenAloud?: boolean;
538
+ embedCode?: string;
539
+ attempt?: number;
540
+ correct?: number;
541
+ autoGrade?: boolean;
542
+ points?: number;
543
+ shuffle?: boolean;
544
+ translation?: string;
545
+ includeAIContext?: boolean;
546
+ media_area_context_ref?: string | null;
547
+ standardId?: string;
548
+ target_proficiency_level?: string;
549
+ allowTTS?: boolean;
550
+ feedback_language?: string | null;
551
+ correct_answer?: string | null;
552
+ limit_attempts?: boolean;
553
+ max_attempts?: number;
554
+ rich_text?: string;
555
+ } | null>;
556
+ };
557
+
558
+ declare function checkIsRepeatPage(cardType: ActivityPageType | undefined): boolean;
559
+ declare function checkIsMCPage(cardType: ActivityPageType | undefined): boolean;
560
+ declare function checkIsRespondPage(cardType: ActivityPageType | undefined): boolean;
561
+ declare function checkIsRespondWrittenPage(cardType: ActivityPageType | undefined): boolean;
562
+ declare function checkIsRespondAudioPage(cardType: ActivityPageType | undefined): boolean;
563
+ declare const checkIsMediaPage: (cardType: ActivityPageType | undefined) => boolean;
564
+ declare const checkIsShortAnswerPage: (cardType: ActivityPageType | undefined) => boolean;
565
+ declare const checkTypePageActivity: (cardType: ActivityPageType | undefined) => {
566
+ isRespondAudio: boolean;
567
+ isRespondWritten: boolean;
568
+ isRespond: boolean;
569
+ isMC: boolean;
570
+ isRepeat: boolean;
571
+ isMediaPage: boolean;
572
+ isShortAnswer: boolean;
573
+ hasSomeType: boolean;
574
+ };
575
+
576
+ declare function getPagePrompt(card: PageActivityWithId | undefined): {
577
+ has: boolean;
578
+ text: string;
579
+ rich_text: string;
580
+ isTextEqualToRichText: boolean;
581
+ };
582
+
583
+ declare const getTotalCompletedCards: (pageScores: Score["cards"] | undefined) => number;
584
+
585
+ declare const getLabelPage: (pageType: ActivityPageType | undefined) => {
586
+ short: string;
587
+ long: string;
588
+ };
115
589
 
116
590
  interface Assignment {
117
591
  name: string;
@@ -159,11 +633,151 @@ interface Assignment {
159
633
  chat_experience?: boolean;
160
634
  showScores?: boolean;
161
635
  }
636
+ type AssignmentAnalyticsType$1 = 'macro' | 'gradebook' | 'cards' | 'student' | 'student_summary';
162
637
  interface AssignmentWithId extends Assignment {
163
638
  id: string;
164
639
  isAvailable: boolean;
165
640
  scores?: unknown;
166
641
  }
642
+ interface Score {
643
+ userId: string;
644
+ owners: string[];
645
+ progress: number;
646
+ score: number;
647
+ cards?: {
648
+ [cardId: string]: PageScore;
649
+ };
650
+ courseId?: string;
651
+ firstLoad?: boolean;
652
+ googleClassroomUserId?: string;
653
+ skippedCards?: number;
654
+ lastPlayed?: CustomTimestamp;
655
+ startDate?: CustomTimestamp;
656
+ submissionDate?: CustomTimestamp;
657
+ status?: 'SUBMITTED' | 'PENDING_REVIEW' | 'IN_PROGRESS' | 'FINALIZED';
658
+ submitted?: boolean;
659
+ successfulCards?: number;
660
+ total_voiceSuccess?: number;
661
+ total_voice_attempts?: number;
662
+ total_words_spoken?: number;
663
+ history?: PageScore[];
664
+ attempts?: number;
665
+ assignmentId?: string;
666
+ setId?: string;
667
+ score_is_overridden?: boolean;
668
+ reviewed?: boolean;
669
+ triage?: {
670
+ version?: string;
671
+ improvements?: string[];
672
+ reasons?: string[];
673
+ updatedAt?: CustomTimestamp;
674
+ confidence?: number;
675
+ category?: 'excellent' | 'doing_ok' | 'needs_attention' | 'unknown';
676
+ by?: string;
677
+ summary?: string;
678
+ strengths?: string[];
679
+ };
680
+ }
681
+ interface ScoreWithId extends Score {
682
+ id: string;
683
+ }
684
+ interface PageScore {
685
+ voiceSuccess?: number;
686
+ voiceAttempts?: number;
687
+ voiceFail?: number;
688
+ completed?: boolean;
689
+ attempts?: number;
690
+ correct?: number;
691
+ success?: boolean;
692
+ aiSuccess?: boolean;
693
+ grading_method?: 'simple' | 'rubric' | 'manual' | 'standards_based' | null;
694
+ grammar_insights?: {
695
+ type?: string;
696
+ justification?: string;
697
+ error?: boolean;
698
+ correction?: string;
699
+ }[];
700
+ promptSuccess?: boolean;
701
+ score?: number;
702
+ simple_grading?: {
703
+ justification?: string;
704
+ success?: boolean;
705
+ };
706
+ suggested_response?: string;
707
+ summary?: string;
708
+ transcript?: string | null;
709
+ errors?: any;
710
+ improvedResponse?: string;
711
+ audio?: string | null;
712
+ actfl?: {
713
+ justification: string;
714
+ level: string;
715
+ key_indicators?: string[];
716
+ };
717
+ wida?: {
718
+ justification: string;
719
+ level: string;
720
+ key_indicators?: string[];
721
+ };
722
+ earned_points?: number;
723
+ fileName?: string | null;
724
+ max_points?: number;
725
+ passing_score?: number;
726
+ rubric?: {
727
+ description: string;
728
+ justification: string;
729
+ maxPoints: number;
730
+ score: number;
731
+ score_title: string;
732
+ title: string;
733
+ }[] | null;
734
+ scoring_type?: string;
735
+ history?: PageScore[];
736
+ media_area_opened?: boolean;
737
+ noFeedbackAvailable?: boolean;
738
+ proficiency_level?: {
739
+ standardId: string;
740
+ level: string;
741
+ justification: string;
742
+ key_indicators?: string[];
743
+ };
744
+ status?: string | null;
745
+ transcriptError?: boolean;
746
+ feedbackError?: boolean;
747
+ totalTrys?: {
748
+ markedCorrect?: boolean;
749
+ selectedOption?: string | string[];
750
+ attemptedAt?: CustomTimestamp;
751
+ messageAttemptId?: string;
752
+ }[];
753
+ tryAgain?: boolean;
754
+ updatedAt?: CustomTimestamp;
755
+ messageAttemptId?: string;
756
+ unmetCriteria?: {
757
+ criterion: string;
758
+ suggestion: string;
759
+ explanation: string;
760
+ }[];
761
+ meetsCriteria?: boolean;
762
+ actionableSteps?: string[];
763
+ rubric_results?: {
764
+ title: string;
765
+ score: number;
766
+ score_title: string;
767
+ justification: string;
768
+ maxPoints: number;
769
+ description: string;
770
+ }[];
771
+ target_proficiency_level?: string;
772
+ hint?: string[];
773
+ reviewed?: boolean;
774
+ error?: ('feedback_error' | 'transcript_error' | 'summary_error' | 'audio_upload_error' | 'unknown' | null)[];
775
+ stagedResponse?: {
776
+ audio?: string | null;
777
+ fileName?: string | null;
778
+ transcript?: string | null;
779
+ } | null;
780
+ }
167
781
 
168
782
  declare enum AssignmentAnalyticsType {
169
783
  Macro = "macro",
@@ -174,6 +788,397 @@ declare enum AssignmentAnalyticsType {
174
788
  All = "all"
175
789
  }
176
790
 
791
+ declare const createAssignmentRepo: () => {
792
+ getAssignment: (params: {
793
+ assignmentId: string;
794
+ currentUserId: string;
795
+ analyticType?: AssignmentAnalyticsType;
796
+ studentId?: string;
797
+ }) => Promise<AssignmentWithId | {
798
+ scores: any;
799
+ id: string;
800
+ isAvailable: boolean;
801
+ name: string;
802
+ description: string;
803
+ scheduledTime?: string | null;
804
+ dueTime?: {
805
+ hours: number;
806
+ minutes: number;
807
+ nanos: number;
808
+ };
809
+ speakableio: boolean;
810
+ owners: string[];
811
+ image: {
812
+ path: string | null;
813
+ url: string;
814
+ };
815
+ dueDate: {
816
+ day: number;
817
+ month: number;
818
+ year: number;
819
+ };
820
+ teacherName: string;
821
+ courseWorkId: string | null;
822
+ dueDateTimestamp: CustomTimestamp;
823
+ scheduledTimeTimestamp: number;
824
+ active: boolean;
825
+ voice: string | null;
826
+ setId: string;
827
+ dateMade: {
828
+ seconds: number;
829
+ nanoseconds: number;
830
+ };
831
+ maxPoints: number;
832
+ courseId: string;
833
+ isAssessment: boolean;
834
+ ltiDeeplink?: string;
835
+ content?: string[];
836
+ weights?: Record<string, number>;
837
+ language?: string;
838
+ types?: { [key in ActivityPageType]?: number; };
839
+ aiEnabled?: boolean;
840
+ chat_experience?: boolean;
841
+ showScores?: boolean;
842
+ } | null>;
843
+ attachScoresAssignment: (args_0: {
844
+ assignments: AssignmentWithId[];
845
+ analyticType: AssignmentAnalyticsType;
846
+ studentId?: string;
847
+ currentUserId: string;
848
+ }) => Promise<{
849
+ scores: any;
850
+ id: string;
851
+ isAvailable: boolean;
852
+ name: string;
853
+ description: string;
854
+ scheduledTime?: string | null;
855
+ dueTime?: {
856
+ hours: number;
857
+ minutes: number;
858
+ nanos: number;
859
+ };
860
+ speakableio: boolean;
861
+ owners: string[];
862
+ image: {
863
+ path: string | null;
864
+ url: string;
865
+ };
866
+ dueDate: {
867
+ day: number;
868
+ month: number;
869
+ year: number;
870
+ };
871
+ teacherName: string;
872
+ courseWorkId: string | null;
873
+ dueDateTimestamp: CustomTimestamp;
874
+ scheduledTimeTimestamp: number;
875
+ active: boolean;
876
+ voice: string | null;
877
+ setId: string;
878
+ dateMade: {
879
+ seconds: number;
880
+ nanoseconds: number;
881
+ };
882
+ maxPoints: number;
883
+ courseId: string;
884
+ isAssessment: boolean;
885
+ ltiDeeplink?: string;
886
+ content?: string[];
887
+ weights?: Record<string, number>;
888
+ language?: string;
889
+ types?: { [key in ActivityPageType]?: number; };
890
+ aiEnabled?: boolean;
891
+ chat_experience?: boolean;
892
+ showScores?: boolean;
893
+ }[]>;
894
+ getAssignmentScores: (args_0: {
895
+ assignmentId: string;
896
+ currentUserId: string;
897
+ analyticType?: AssignmentAnalyticsType;
898
+ studentId?: string;
899
+ }) => Promise<{
900
+ scores: unknown;
901
+ id: string;
902
+ } | undefined>;
903
+ getAllAssignments: () => Promise<(AssignmentWithId & {
904
+ id: string;
905
+ })[]>;
906
+ };
907
+
908
+ declare const assignmentQueryKeys: {
909
+ all: readonly ["assignments"];
910
+ byId: (id: string) => readonly ["assignments", string];
911
+ list: () => readonly ["assignments", "list"];
912
+ };
913
+ declare function useAssignment({ assignmentId, enabled, analyticType, userId, }: {
914
+ assignmentId: string;
915
+ enabled?: boolean;
916
+ analyticType?: AssignmentAnalyticsType;
917
+ userId: string;
918
+ }): _tanstack_react_query.UseQueryResult<AssignmentWithId | {
919
+ scores: any;
920
+ id: string;
921
+ isAvailable: boolean;
922
+ name: string;
923
+ description: string;
924
+ scheduledTime?: string | null;
925
+ dueTime?: {
926
+ hours: number;
927
+ minutes: number;
928
+ nanos: number;
929
+ };
930
+ speakableio: boolean;
931
+ owners: string[];
932
+ image: {
933
+ path: string | null;
934
+ url: string;
935
+ };
936
+ dueDate: {
937
+ day: number;
938
+ month: number;
939
+ year: number;
940
+ };
941
+ teacherName: string;
942
+ courseWorkId: string | null;
943
+ dueDateTimestamp: CustomTimestamp;
944
+ scheduledTimeTimestamp: number;
945
+ active: boolean;
946
+ voice: string | null;
947
+ setId: string;
948
+ dateMade: {
949
+ seconds: number;
950
+ nanoseconds: number;
951
+ };
952
+ maxPoints: number;
953
+ courseId: string;
954
+ isAssessment: boolean;
955
+ ltiDeeplink?: string;
956
+ content?: string[];
957
+ weights?: Record<string, number>;
958
+ language?: string;
959
+ types?: { [key in ActivityPageType]?: number; };
960
+ aiEnabled?: boolean;
961
+ chat_experience?: boolean;
962
+ showScores?: boolean;
963
+ } | null, Error>;
964
+
965
+ declare const scoreQueryKeys: {
966
+ all: readonly ["scores"];
967
+ byId: (id: string) => readonly ["scores", string];
968
+ list: () => readonly ["scores", "list"];
969
+ };
970
+ declare function useScore({ isAssignment, activityId, userId, courseId, enabled, googleClassroomUserId, }: {
971
+ userId: string;
972
+ isAssignment: boolean;
973
+ activityId: string;
974
+ courseId?: string;
975
+ enabled?: boolean;
976
+ googleClassroomUserId?: string;
977
+ }): _tanstack_react_query.UseQueryResult<ScoreWithId, Error>;
978
+ declare function useUpdateScore(): {
979
+ mutationUpdateScore: _tanstack_react_query.UseMutationResult<Promise<void>, Error, {
980
+ userId: string;
981
+ data: Partial<Score>;
982
+ isAssignment: boolean;
983
+ activityId: string;
984
+ }, {
985
+ previousData: Partial<Score> | undefined;
986
+ }>;
987
+ };
988
+ declare function useUpdateCardScore({ isAssignment, activityId, userId, cardIds, weights, }: {
989
+ isAssignment: boolean;
990
+ userId: string;
991
+ activityId: string;
992
+ cardIds: string[];
993
+ weights: Record<string, number>;
994
+ }): {
995
+ mutationUpdateCardScore: _tanstack_react_query.UseMutationResult<{
996
+ cardId: string;
997
+ scoresUpdated: Score;
998
+ }, Error, {
999
+ cardId: string;
1000
+ cardScore: PageScore;
1001
+ }, {
1002
+ previousData: Score | undefined;
1003
+ }>;
1004
+ };
1005
+ declare function useClearScore(): {
1006
+ mutationClearScore: _tanstack_react_query.UseMutationResult<{
1007
+ update: Partial<Score>;
1008
+ activityId: string;
1009
+ }, Error, {
1010
+ isAssignment: boolean;
1011
+ cardId: string;
1012
+ cardScores: PageScore;
1013
+ userId: string;
1014
+ activityId: string;
1015
+ }, unknown>;
1016
+ };
1017
+ declare function useClearScoreV2(): {
1018
+ mutationClearScore: _tanstack_react_query.UseMutationResult<{
1019
+ update: Partial<Score>;
1020
+ activityId: string;
1021
+ }, Error, {
1022
+ isAssignment: boolean;
1023
+ cardId: string;
1024
+ cardScores: PageScore;
1025
+ userId: string;
1026
+ activityId: string;
1027
+ }, unknown>;
1028
+ };
1029
+ declare function useSubmitAssignmentScore({ onAssignmentSubmitted, studentName, }: {
1030
+ onAssignmentSubmitted: (assignmentId: string) => void;
1031
+ studentName: string;
1032
+ }): {
1033
+ submitAssignmentScore: _tanstack_react_query.UseMutateAsyncFunction<{
1034
+ success: boolean;
1035
+ message: string;
1036
+ error?: undefined;
1037
+ } | {
1038
+ success: boolean;
1039
+ error: unknown;
1040
+ message?: undefined;
1041
+ }, Error, {
1042
+ assignment: {
1043
+ id: string;
1044
+ name: string;
1045
+ owners: string[];
1046
+ courseId: string;
1047
+ courseWorkId: string;
1048
+ isAssessment: boolean;
1049
+ maxPoints: number;
1050
+ };
1051
+ userId: string;
1052
+ cardIds: string[];
1053
+ weights: Record<string, number>;
1054
+ scores: Score;
1055
+ status: Score["status"];
1056
+ }, unknown>;
1057
+ isLoading: boolean;
1058
+ };
1059
+ declare function useSubmitPracticeScore(): {
1060
+ submitPracticeScore: _tanstack_react_query.UseMutateAsyncFunction<{
1061
+ success: boolean;
1062
+ message: string;
1063
+ error?: undefined;
1064
+ } | {
1065
+ success: boolean;
1066
+ error: unknown;
1067
+ message?: undefined;
1068
+ }, Error, {
1069
+ setId: string;
1070
+ userId: string;
1071
+ scores: Score;
1072
+ }, unknown>;
1073
+ isLoading: boolean;
1074
+ };
1075
+
1076
+ interface SetWithId extends Set {
1077
+ id: string;
1078
+ }
1079
+ interface Set {
1080
+ id: string;
1081
+ language: string;
1082
+ ownerName: string;
1083
+ weights: Record<string, number>;
1084
+ repeat?: number;
1085
+ voice?: string;
1086
+ averagePhraseLength?: number;
1087
+ passing_score?: number;
1088
+ organizations?: string[];
1089
+ description: string;
1090
+ image: {
1091
+ url: string;
1092
+ path: null | string;
1093
+ };
1094
+ additionalLanguages?: string[];
1095
+ owners: string[];
1096
+ name: string;
1097
+ content: string[];
1098
+ types: {
1099
+ [key in ActivityPageType]?: number;
1100
+ };
1101
+ defaultLanguage: string;
1102
+ createdAt: FieldValue;
1103
+ public: boolean;
1104
+ defaultRubricId?: string;
1105
+ difficulty?: string;
1106
+ end_screen?: {
1107
+ variant: 0 | 1 | 2;
1108
+ title: string;
1109
+ description: string;
1110
+ };
1111
+ mcAllowRetries?: boolean;
1112
+ welcome_screen?: {
1113
+ variant: 'colored' | 'blank';
1114
+ };
1115
+ poorFunctionalityWarning?: boolean;
1116
+ status?: 'draft' | 'published';
1117
+ subjects?: any[];
1118
+ respondAllowRetries?: boolean;
1119
+ respondAllowTTS?: boolean;
1120
+ feedbackLanguage?: string;
1121
+ respondMaxCharacters?: number;
1122
+ respondMaxTime?: number;
1123
+ }
1124
+
1125
+ declare const setsQueryKeys: {
1126
+ all: string[];
1127
+ one: (params: {
1128
+ setId: string;
1129
+ }) => string[];
1130
+ };
1131
+ declare const useSet: ({ setId, enabled }: {
1132
+ setId: string;
1133
+ enabled?: boolean;
1134
+ }) => _tanstack_react_query.UseQueryResult<SetWithId | null, Error>;
1135
+ declare function getSetFromCache({ setId, queryClient, }: {
1136
+ setId: string | undefined;
1137
+ queryClient: QueryClient;
1138
+ }): SetWithId | null | undefined;
1139
+ declare function updateSetInCache({ set, queryClient, }: {
1140
+ set: SetWithId;
1141
+ queryClient: QueryClient;
1142
+ }): void;
1143
+
1144
+ declare const SETS_COLLECTION = "sets";
1145
+ type RefsSetsFirestore = `${typeof SETS_COLLECTION}/${string}`;
1146
+ declare const refsSetsFirestore: {
1147
+ allSets: string;
1148
+ set: (id: string) => `sets/${string}`;
1149
+ };
1150
+
1151
+ declare const createSetRepo: () => {
1152
+ getSet: (args_0: {
1153
+ setId: string;
1154
+ }) => Promise<SetWithId | null>;
1155
+ };
1156
+
1157
+ declare const SPEAKABLE_NOTIFICATIONS: {
1158
+ readonly NEW_ASSIGNMENT: "new_assignment";
1159
+ readonly ASSESSMENT_SUBMITTED: "assessment_submitted";
1160
+ readonly ASSESSMENT_SCORED: "assessment_scored";
1161
+ readonly NEW_COMMENT: "NEW_COMMENT";
1162
+ };
1163
+ type SpeakableNotificationType = (typeof SPEAKABLE_NOTIFICATIONS)[keyof typeof SPEAKABLE_NOTIFICATIONS];
1164
+ declare const SpeakableNotificationTypes: {
1165
+ NEW_ASSIGNMENT: string;
1166
+ FEEDBACK_FROM_TEACHER: string;
1167
+ MESSAGE_FROM_STUDENT: string;
1168
+ PHRASE_MARKED_CORRECT: string;
1169
+ STUDENT_PROGRESS: string;
1170
+ PLAYLIST_FOLLOWERS: string;
1171
+ PLAYLIST_PLAYS: string;
1172
+ ASSESSMENT_SUBMITTED: string;
1173
+ ASSESSMENT_SCORED: string;
1174
+ NEW_COMMENT: string;
1175
+ };
1176
+
1177
+ declare const useCreateNotification: () => {
1178
+ createNotification: (type: SpeakableNotificationType, data: any) => Promise<any>;
1179
+ };
1180
+
1181
+ type FsClient = ReturnType<typeof createFsClientBase>;
177
1182
  type FsClientParams = Omit<Parameters<typeof createFsClientBase>[0], 'helpers'>;
178
1183
  declare function createFsClientBase({ db, helpers, httpsCallable, logEvent, }: {
179
1184
  db: FirebaseInstance;
@@ -444,6 +1449,1570 @@ declare function createFsClientBase({ db, helpers, httpsCallable, logEvent, }: {
444
1449
  };
445
1450
  };
446
1451
 
1452
+ interface UserProfile {
1453
+ googleClassroomUserId: string;
1454
+ image: {
1455
+ url: string;
1456
+ path: string;
1457
+ };
1458
+ displayName: string;
1459
+ isTeacher?: boolean;
1460
+ isStudent?: boolean;
1461
+ roles?: string[];
1462
+ }
1463
+ interface UserAuth {
1464
+ uid: string;
1465
+ email: string;
1466
+ displayName: string | null;
1467
+ }
1468
+ interface Lti {
1469
+ data: {
1470
+ services: {
1471
+ serviceKey: string;
1472
+ };
1473
+ };
1474
+ }
1475
+ interface User {
1476
+ profile: UserProfile;
1477
+ auth: UserAuth;
1478
+ lti: Lti;
1479
+ roles: string[];
1480
+ }
1481
+
1482
+ declare const SpeakablePlanTypes: {
1483
+ readonly basic: "basic";
1484
+ readonly teacher_pro: "teacher_pro";
1485
+ readonly school_starter: "school_starter";
1486
+ readonly organization: "organization";
1487
+ readonly starter: "starter";
1488
+ readonly growth: "growth";
1489
+ readonly professional: "professional";
1490
+ };
1491
+
1492
+ interface Permissions {
1493
+ loaded: boolean;
1494
+ loading: boolean;
1495
+ permissions: string[];
1496
+ plan: keyof typeof SpeakablePlanTypes;
1497
+ subscriptionId: string;
1498
+ isInstitutionPlan: boolean;
1499
+ type: string;
1500
+ contact: string;
1501
+ hasStudentPortfolios?: boolean;
1502
+ refreshDate: string;
1503
+ isStripePlan: boolean;
1504
+ freeOrgTrialExpired?: boolean;
1505
+ }
1506
+
1507
+ interface FsContext {
1508
+ speakableApi: Awaited<FsClient>;
1509
+ queryClient: QueryClient;
1510
+ user: User;
1511
+ permissions: Permissions;
1512
+ }
1513
+ declare const FsCtx: React.Context<FsContext | null>;
1514
+ declare function SpeakableProvider({ user, children, queryClient, permissions, fsClient, }: {
1515
+ children: React.ReactNode;
1516
+ fsClient: FsClient;
1517
+ permissions: Permissions;
1518
+ queryClient: QueryClient;
1519
+ user: User;
1520
+ }): react_jsx_runtime.JSX.Element | null;
1521
+ declare function useSpeakableApi(): FsContext;
1522
+
1523
+ declare function getTranscript(model: 'gemini' | 'assemblyai', args: {
1524
+ language: string;
1525
+ audioUrl: string;
1526
+ prompt?: string;
1527
+ }): Promise<string | null>;
1528
+
1529
+ declare const getRespondCardTool: ({ language, standard, }: {
1530
+ language: string;
1531
+ standard: string;
1532
+ }) => {
1533
+ tool_choice: {
1534
+ type: string;
1535
+ function: {
1536
+ name: string;
1537
+ };
1538
+ };
1539
+ tools: {
1540
+ type: string;
1541
+ function: {
1542
+ name: string;
1543
+ description: string;
1544
+ parameters: {
1545
+ type: string;
1546
+ required: string[];
1547
+ properties: {
1548
+ success: {
1549
+ type: string;
1550
+ description: string;
1551
+ };
1552
+ errors: {
1553
+ type: string;
1554
+ items: {
1555
+ type: string;
1556
+ required: string[];
1557
+ properties: {
1558
+ error: {
1559
+ type: string;
1560
+ description: string;
1561
+ };
1562
+ correction: {
1563
+ type: string;
1564
+ description: string;
1565
+ };
1566
+ justification: {
1567
+ type: string;
1568
+ description: string;
1569
+ };
1570
+ grammar_error_type: {
1571
+ type: string;
1572
+ enum: string[];
1573
+ description: string;
1574
+ };
1575
+ };
1576
+ };
1577
+ description: string;
1578
+ };
1579
+ compliments: {
1580
+ type: string;
1581
+ items: {
1582
+ type: string;
1583
+ };
1584
+ description: string;
1585
+ };
1586
+ improvedResponse: {
1587
+ type: string;
1588
+ description: string;
1589
+ };
1590
+ score: {
1591
+ type: string;
1592
+ description: string;
1593
+ };
1594
+ score_justification: {
1595
+ type: string;
1596
+ description: string;
1597
+ };
1598
+ };
1599
+ };
1600
+ };
1601
+ }[];
1602
+ };
1603
+
1604
+ declare function debounce<T extends (...args: any[]) => Promise<any>>(func: T, waitFor: number): (...args: Parameters<T>) => Promise<ReturnType<T>>;
1605
+
1606
+ declare const purify: (word: string) => string;
1607
+ declare const cleanString: (words: string) => string | string[];
1608
+ declare const getWordHash: (word: string, language: string) => string;
1609
+ declare function getPhraseLength(phrase: string, input?: string): number;
1610
+
1611
+ declare function useActivity({ id, isAssignment, onAssignmentSubmitted, ltiData, }: {
1612
+ id: string;
1613
+ isAssignment: boolean;
1614
+ onAssignmentSubmitted: (assignmentId: string) => void;
1615
+ ltiData?: {
1616
+ lineItemId?: string;
1617
+ lti_id?: string;
1618
+ serviceKey?: string;
1619
+ };
1620
+ }): {
1621
+ set: {
1622
+ data: SetWithId | null | undefined;
1623
+ query: _tanstack_react_query.UseQueryResult<SetWithId | null, Error>;
1624
+ };
1625
+ cards: {
1626
+ data: Record<string, PageActivityWithId> | null;
1627
+ query: _tanstack_react_query.UseQueryResult<{
1628
+ type: ActivityPageType;
1629
+ id: string;
1630
+ owners: string[];
1631
+ checked?: boolean;
1632
+ completed?: boolean;
1633
+ media_area_id?: string | null;
1634
+ media_area_layout?: "left" | "right" | null;
1635
+ score?: number;
1636
+ verificationStatus?: VerificationCardStatus;
1637
+ native_text?: string;
1638
+ repeat?: number;
1639
+ language?: string | null;
1640
+ image?: {
1641
+ path?: string | null;
1642
+ url?: string;
1643
+ };
1644
+ audio?: {
1645
+ path?: string | null;
1646
+ url?: string;
1647
+ } | null;
1648
+ notes?: string;
1649
+ difficulty?: string;
1650
+ default_language?: string;
1651
+ target_text?: string;
1652
+ grading_criteria?: string;
1653
+ scoring_type?: string;
1654
+ grading_method?: "simple" | "rubric" | "manual" | "standards_based";
1655
+ feedback_types?: string[];
1656
+ rubricId?: string;
1657
+ prompt?: string;
1658
+ title?: string;
1659
+ passing_score?: number;
1660
+ maxCharacters?: number;
1661
+ answer?: string[];
1662
+ choices?: {
1663
+ value: string;
1664
+ option: string;
1665
+ }[];
1666
+ MCQType?: string;
1667
+ multipleAttemptsAllowed?: boolean;
1668
+ allowRetries?: boolean;
1669
+ question?: string;
1670
+ respondTime?: number;
1671
+ hidePrompt?: boolean;
1672
+ videoUrl?: string;
1673
+ link?: string;
1674
+ text?: string;
1675
+ isListenAloud?: boolean;
1676
+ embedCode?: string;
1677
+ attempt?: number;
1678
+ correct?: number;
1679
+ autoGrade?: boolean;
1680
+ points?: number;
1681
+ shuffle?: boolean;
1682
+ translation?: string;
1683
+ includeAIContext?: boolean;
1684
+ media_area_context_ref?: string | null;
1685
+ standardId?: string;
1686
+ target_proficiency_level?: string;
1687
+ allowTTS?: boolean;
1688
+ feedback_language?: string | null;
1689
+ correct_answer?: string | null;
1690
+ limit_attempts?: boolean;
1691
+ max_attempts?: number;
1692
+ rich_text?: string;
1693
+ } | null, Error>[];
1694
+ cardsArray: PageActivityWithId[];
1695
+ };
1696
+ assignment: {
1697
+ data: AssignmentWithId | {
1698
+ scores: any;
1699
+ id: string;
1700
+ isAvailable: boolean;
1701
+ name: string;
1702
+ description: string;
1703
+ scheduledTime?: string | null;
1704
+ dueTime?: {
1705
+ hours: number;
1706
+ minutes: number;
1707
+ nanos: number;
1708
+ };
1709
+ speakableio: boolean;
1710
+ owners: string[];
1711
+ image: {
1712
+ path: string | null;
1713
+ url: string;
1714
+ };
1715
+ dueDate: {
1716
+ day: number;
1717
+ month: number;
1718
+ year: number;
1719
+ };
1720
+ teacherName: string;
1721
+ courseWorkId: string | null;
1722
+ dueDateTimestamp: CustomTimestamp;
1723
+ scheduledTimeTimestamp: number;
1724
+ active: boolean;
1725
+ voice: string | null;
1726
+ setId: string;
1727
+ dateMade: {
1728
+ seconds: number;
1729
+ nanoseconds: number;
1730
+ };
1731
+ maxPoints: number;
1732
+ courseId: string;
1733
+ isAssessment: boolean;
1734
+ ltiDeeplink?: string;
1735
+ content?: string[];
1736
+ weights?: Record<string, number>;
1737
+ language?: string;
1738
+ types?: { [key in ActivityPageType]?: number; };
1739
+ aiEnabled?: boolean;
1740
+ chat_experience?: boolean;
1741
+ showScores?: boolean;
1742
+ } | null | undefined;
1743
+ query: _tanstack_react_query.UseQueryResult<AssignmentWithId | {
1744
+ scores: any;
1745
+ id: string;
1746
+ isAvailable: boolean;
1747
+ name: string;
1748
+ description: string;
1749
+ scheduledTime?: string | null;
1750
+ dueTime?: {
1751
+ hours: number;
1752
+ minutes: number;
1753
+ nanos: number;
1754
+ };
1755
+ speakableio: boolean;
1756
+ owners: string[];
1757
+ image: {
1758
+ path: string | null;
1759
+ url: string;
1760
+ };
1761
+ dueDate: {
1762
+ day: number;
1763
+ month: number;
1764
+ year: number;
1765
+ };
1766
+ teacherName: string;
1767
+ courseWorkId: string | null;
1768
+ dueDateTimestamp: CustomTimestamp;
1769
+ scheduledTimeTimestamp: number;
1770
+ active: boolean;
1771
+ voice: string | null;
1772
+ setId: string;
1773
+ dateMade: {
1774
+ seconds: number;
1775
+ nanoseconds: number;
1776
+ };
1777
+ maxPoints: number;
1778
+ courseId: string;
1779
+ isAssessment: boolean;
1780
+ ltiDeeplink?: string;
1781
+ content?: string[];
1782
+ weights?: Record<string, number>;
1783
+ language?: string;
1784
+ types?: { [key in ActivityPageType]?: number; };
1785
+ aiEnabled?: boolean;
1786
+ chat_experience?: boolean;
1787
+ showScores?: boolean;
1788
+ } | null, Error>;
1789
+ };
1790
+ scores: {
1791
+ data: ScoreWithId | undefined;
1792
+ query: _tanstack_react_query.UseQueryResult<ScoreWithId, Error>;
1793
+ actions: {
1794
+ update: (data: Partial<Score>) => void;
1795
+ clear: ({ cardId, wasCompleted, }: {
1796
+ cardId: string;
1797
+ wasCompleted?: boolean;
1798
+ }) => void;
1799
+ submit: () => Promise<{
1800
+ success: boolean;
1801
+ message: string;
1802
+ error?: undefined;
1803
+ } | {
1804
+ success: boolean;
1805
+ error: unknown;
1806
+ message?: undefined;
1807
+ }>;
1808
+ updateCard: (cardId: string, cardScore: PageScore) => void;
1809
+ logGradingStandardEntry: ({ cardId, gradingStandard, type, }: {
1810
+ cardId: string;
1811
+ gradingStandard: {
1812
+ level: string;
1813
+ justification: string;
1814
+ };
1815
+ type: "actfl" | "wida" | "custom";
1816
+ }) => void;
1817
+ };
1818
+ };
1819
+ };
1820
+
1821
+ interface CreditContract {
1822
+ allocationSource: string;
1823
+ createdAt: string;
1824
+ creditsAllocatedThisPeriod: number;
1825
+ effectivePlanId: string;
1826
+ email: string;
1827
+ isUnlimited: boolean;
1828
+ lastUpdatedAt: string;
1829
+ ownerType: string;
1830
+ periodStart: string;
1831
+ periodEnd: string;
1832
+ planTermEndTimestamp: string | null;
1833
+ sourceDetails: Record<string, unknown>;
1834
+ creditsAvailable?: number;
1835
+ topOffCreditsAvailable?: number;
1836
+ }
1837
+ declare const creditQueryKeys: {
1838
+ userCredits: (uid: string) => readonly ["userCredits", string];
1839
+ };
1840
+ declare const useUserCredits: () => {
1841
+ data: {
1842
+ id: string;
1843
+ userId: string;
1844
+ email: string;
1845
+ effectivePlanId: string;
1846
+ status: string;
1847
+ isUnlimited: boolean;
1848
+ creditsAvailable: number;
1849
+ creditsAllocatedThisPeriod: number;
1850
+ topOffCreditsAvailable: number;
1851
+ topOffCreditsTotal: number;
1852
+ allocationSource: string;
1853
+ sourceDetails: {};
1854
+ periodStart: null;
1855
+ periodEnd: null;
1856
+ planTermEndTimestamp: null;
1857
+ ownerType: string;
1858
+ createdAt: string;
1859
+ lastUpdatedAt: string;
1860
+ } | {
1861
+ totalCreditsAvailable: number;
1862
+ allocationSource: string;
1863
+ createdAt: string;
1864
+ creditsAllocatedThisPeriod: number;
1865
+ effectivePlanId: string;
1866
+ email: string;
1867
+ isUnlimited: boolean;
1868
+ lastUpdatedAt: string;
1869
+ ownerType: string;
1870
+ periodStart: string;
1871
+ periodEnd: string;
1872
+ planTermEndTimestamp: string | null;
1873
+ sourceDetails: Record<string, unknown>;
1874
+ creditsAvailable?: number;
1875
+ topOffCreditsAvailable?: number;
1876
+ id: string;
1877
+ userId?: undefined;
1878
+ status?: undefined;
1879
+ topOffCreditsTotal?: undefined;
1880
+ };
1881
+ error: Error;
1882
+ isError: true;
1883
+ isPending: false;
1884
+ isLoading: false;
1885
+ isLoadingError: false;
1886
+ isRefetchError: true;
1887
+ isSuccess: false;
1888
+ isPlaceholderData: false;
1889
+ status: "error";
1890
+ dataUpdatedAt: number;
1891
+ errorUpdatedAt: number;
1892
+ failureCount: number;
1893
+ failureReason: Error | null;
1894
+ errorUpdateCount: number;
1895
+ isFetched: boolean;
1896
+ isFetchedAfterMount: boolean;
1897
+ isFetching: boolean;
1898
+ isInitialLoading: boolean;
1899
+ isPaused: boolean;
1900
+ isRefetching: boolean;
1901
+ isStale: boolean;
1902
+ refetch: (options?: _tanstack_react_query.RefetchOptions) => Promise<_tanstack_react_query.QueryObserverResult<{
1903
+ id: string;
1904
+ userId: string;
1905
+ email: string;
1906
+ effectivePlanId: string;
1907
+ status: string;
1908
+ isUnlimited: boolean;
1909
+ creditsAvailable: number;
1910
+ creditsAllocatedThisPeriod: number;
1911
+ topOffCreditsAvailable: number;
1912
+ topOffCreditsTotal: number;
1913
+ allocationSource: string;
1914
+ sourceDetails: {};
1915
+ periodStart: null;
1916
+ periodEnd: null;
1917
+ planTermEndTimestamp: null;
1918
+ ownerType: string;
1919
+ createdAt: string;
1920
+ lastUpdatedAt: string;
1921
+ } | {
1922
+ totalCreditsAvailable: number;
1923
+ allocationSource: string;
1924
+ createdAt: string;
1925
+ creditsAllocatedThisPeriod: number;
1926
+ effectivePlanId: string;
1927
+ email: string;
1928
+ isUnlimited: boolean;
1929
+ lastUpdatedAt: string;
1930
+ ownerType: string;
1931
+ periodStart: string;
1932
+ periodEnd: string;
1933
+ planTermEndTimestamp: string | null;
1934
+ sourceDetails: Record<string, unknown>;
1935
+ creditsAvailable?: number;
1936
+ topOffCreditsAvailable?: number;
1937
+ id: string;
1938
+ userId?: undefined;
1939
+ status?: undefined;
1940
+ topOffCreditsTotal?: undefined;
1941
+ }, Error>>;
1942
+ fetchStatus: _tanstack_react_query.FetchStatus;
1943
+ promise: Promise<{
1944
+ id: string;
1945
+ userId: string;
1946
+ email: string;
1947
+ effectivePlanId: string;
1948
+ status: string;
1949
+ isUnlimited: boolean;
1950
+ creditsAvailable: number;
1951
+ creditsAllocatedThisPeriod: number;
1952
+ topOffCreditsAvailable: number;
1953
+ topOffCreditsTotal: number;
1954
+ allocationSource: string;
1955
+ sourceDetails: {};
1956
+ periodStart: null;
1957
+ periodEnd: null;
1958
+ planTermEndTimestamp: null;
1959
+ ownerType: string;
1960
+ createdAt: string;
1961
+ lastUpdatedAt: string;
1962
+ } | {
1963
+ totalCreditsAvailable: number;
1964
+ allocationSource: string;
1965
+ createdAt: string;
1966
+ creditsAllocatedThisPeriod: number;
1967
+ effectivePlanId: string;
1968
+ email: string;
1969
+ isUnlimited: boolean;
1970
+ lastUpdatedAt: string;
1971
+ ownerType: string;
1972
+ periodStart: string;
1973
+ periodEnd: string;
1974
+ planTermEndTimestamp: string | null;
1975
+ sourceDetails: Record<string, unknown>;
1976
+ creditsAvailable?: number;
1977
+ topOffCreditsAvailable?: number;
1978
+ id: string;
1979
+ userId?: undefined;
1980
+ status?: undefined;
1981
+ topOffCreditsTotal?: undefined;
1982
+ }>;
1983
+ } | {
1984
+ data: {
1985
+ id: string;
1986
+ userId: string;
1987
+ email: string;
1988
+ effectivePlanId: string;
1989
+ status: string;
1990
+ isUnlimited: boolean;
1991
+ creditsAvailable: number;
1992
+ creditsAllocatedThisPeriod: number;
1993
+ topOffCreditsAvailable: number;
1994
+ topOffCreditsTotal: number;
1995
+ allocationSource: string;
1996
+ sourceDetails: {};
1997
+ periodStart: null;
1998
+ periodEnd: null;
1999
+ planTermEndTimestamp: null;
2000
+ ownerType: string;
2001
+ createdAt: string;
2002
+ lastUpdatedAt: string;
2003
+ } | {
2004
+ totalCreditsAvailable: number;
2005
+ allocationSource: string;
2006
+ createdAt: string;
2007
+ creditsAllocatedThisPeriod: number;
2008
+ effectivePlanId: string;
2009
+ email: string;
2010
+ isUnlimited: boolean;
2011
+ lastUpdatedAt: string;
2012
+ ownerType: string;
2013
+ periodStart: string;
2014
+ periodEnd: string;
2015
+ planTermEndTimestamp: string | null;
2016
+ sourceDetails: Record<string, unknown>;
2017
+ creditsAvailable?: number;
2018
+ topOffCreditsAvailable?: number;
2019
+ id: string;
2020
+ userId?: undefined;
2021
+ status?: undefined;
2022
+ topOffCreditsTotal?: undefined;
2023
+ };
2024
+ error: null;
2025
+ isError: false;
2026
+ isPending: false;
2027
+ isLoading: false;
2028
+ isLoadingError: false;
2029
+ isRefetchError: false;
2030
+ isSuccess: true;
2031
+ isPlaceholderData: false;
2032
+ status: "success";
2033
+ dataUpdatedAt: number;
2034
+ errorUpdatedAt: number;
2035
+ failureCount: number;
2036
+ failureReason: Error | null;
2037
+ errorUpdateCount: number;
2038
+ isFetched: boolean;
2039
+ isFetchedAfterMount: boolean;
2040
+ isFetching: boolean;
2041
+ isInitialLoading: boolean;
2042
+ isPaused: boolean;
2043
+ isRefetching: boolean;
2044
+ isStale: boolean;
2045
+ refetch: (options?: _tanstack_react_query.RefetchOptions) => Promise<_tanstack_react_query.QueryObserverResult<{
2046
+ id: string;
2047
+ userId: string;
2048
+ email: string;
2049
+ effectivePlanId: string;
2050
+ status: string;
2051
+ isUnlimited: boolean;
2052
+ creditsAvailable: number;
2053
+ creditsAllocatedThisPeriod: number;
2054
+ topOffCreditsAvailable: number;
2055
+ topOffCreditsTotal: number;
2056
+ allocationSource: string;
2057
+ sourceDetails: {};
2058
+ periodStart: null;
2059
+ periodEnd: null;
2060
+ planTermEndTimestamp: null;
2061
+ ownerType: string;
2062
+ createdAt: string;
2063
+ lastUpdatedAt: string;
2064
+ } | {
2065
+ totalCreditsAvailable: number;
2066
+ allocationSource: string;
2067
+ createdAt: string;
2068
+ creditsAllocatedThisPeriod: number;
2069
+ effectivePlanId: string;
2070
+ email: string;
2071
+ isUnlimited: boolean;
2072
+ lastUpdatedAt: string;
2073
+ ownerType: string;
2074
+ periodStart: string;
2075
+ periodEnd: string;
2076
+ planTermEndTimestamp: string | null;
2077
+ sourceDetails: Record<string, unknown>;
2078
+ creditsAvailable?: number;
2079
+ topOffCreditsAvailable?: number;
2080
+ id: string;
2081
+ userId?: undefined;
2082
+ status?: undefined;
2083
+ topOffCreditsTotal?: undefined;
2084
+ }, Error>>;
2085
+ fetchStatus: _tanstack_react_query.FetchStatus;
2086
+ promise: Promise<{
2087
+ id: string;
2088
+ userId: string;
2089
+ email: string;
2090
+ effectivePlanId: string;
2091
+ status: string;
2092
+ isUnlimited: boolean;
2093
+ creditsAvailable: number;
2094
+ creditsAllocatedThisPeriod: number;
2095
+ topOffCreditsAvailable: number;
2096
+ topOffCreditsTotal: number;
2097
+ allocationSource: string;
2098
+ sourceDetails: {};
2099
+ periodStart: null;
2100
+ periodEnd: null;
2101
+ planTermEndTimestamp: null;
2102
+ ownerType: string;
2103
+ createdAt: string;
2104
+ lastUpdatedAt: string;
2105
+ } | {
2106
+ totalCreditsAvailable: number;
2107
+ allocationSource: string;
2108
+ createdAt: string;
2109
+ creditsAllocatedThisPeriod: number;
2110
+ effectivePlanId: string;
2111
+ email: string;
2112
+ isUnlimited: boolean;
2113
+ lastUpdatedAt: string;
2114
+ ownerType: string;
2115
+ periodStart: string;
2116
+ periodEnd: string;
2117
+ planTermEndTimestamp: string | null;
2118
+ sourceDetails: Record<string, unknown>;
2119
+ creditsAvailable?: number;
2120
+ topOffCreditsAvailable?: number;
2121
+ id: string;
2122
+ userId?: undefined;
2123
+ status?: undefined;
2124
+ topOffCreditsTotal?: undefined;
2125
+ }>;
2126
+ } | {
2127
+ data: undefined;
2128
+ error: Error;
2129
+ isError: true;
2130
+ isPending: false;
2131
+ isLoading: false;
2132
+ isLoadingError: true;
2133
+ isRefetchError: false;
2134
+ isSuccess: false;
2135
+ isPlaceholderData: false;
2136
+ status: "error";
2137
+ dataUpdatedAt: number;
2138
+ errorUpdatedAt: number;
2139
+ failureCount: number;
2140
+ failureReason: Error | null;
2141
+ errorUpdateCount: number;
2142
+ isFetched: boolean;
2143
+ isFetchedAfterMount: boolean;
2144
+ isFetching: boolean;
2145
+ isInitialLoading: boolean;
2146
+ isPaused: boolean;
2147
+ isRefetching: boolean;
2148
+ isStale: boolean;
2149
+ refetch: (options?: _tanstack_react_query.RefetchOptions) => Promise<_tanstack_react_query.QueryObserverResult<{
2150
+ id: string;
2151
+ userId: string;
2152
+ email: string;
2153
+ effectivePlanId: string;
2154
+ status: string;
2155
+ isUnlimited: boolean;
2156
+ creditsAvailable: number;
2157
+ creditsAllocatedThisPeriod: number;
2158
+ topOffCreditsAvailable: number;
2159
+ topOffCreditsTotal: number;
2160
+ allocationSource: string;
2161
+ sourceDetails: {};
2162
+ periodStart: null;
2163
+ periodEnd: null;
2164
+ planTermEndTimestamp: null;
2165
+ ownerType: string;
2166
+ createdAt: string;
2167
+ lastUpdatedAt: string;
2168
+ } | {
2169
+ totalCreditsAvailable: number;
2170
+ allocationSource: string;
2171
+ createdAt: string;
2172
+ creditsAllocatedThisPeriod: number;
2173
+ effectivePlanId: string;
2174
+ email: string;
2175
+ isUnlimited: boolean;
2176
+ lastUpdatedAt: string;
2177
+ ownerType: string;
2178
+ periodStart: string;
2179
+ periodEnd: string;
2180
+ planTermEndTimestamp: string | null;
2181
+ sourceDetails: Record<string, unknown>;
2182
+ creditsAvailable?: number;
2183
+ topOffCreditsAvailable?: number;
2184
+ id: string;
2185
+ userId?: undefined;
2186
+ status?: undefined;
2187
+ topOffCreditsTotal?: undefined;
2188
+ }, Error>>;
2189
+ fetchStatus: _tanstack_react_query.FetchStatus;
2190
+ promise: Promise<{
2191
+ id: string;
2192
+ userId: string;
2193
+ email: string;
2194
+ effectivePlanId: string;
2195
+ status: string;
2196
+ isUnlimited: boolean;
2197
+ creditsAvailable: number;
2198
+ creditsAllocatedThisPeriod: number;
2199
+ topOffCreditsAvailable: number;
2200
+ topOffCreditsTotal: number;
2201
+ allocationSource: string;
2202
+ sourceDetails: {};
2203
+ periodStart: null;
2204
+ periodEnd: null;
2205
+ planTermEndTimestamp: null;
2206
+ ownerType: string;
2207
+ createdAt: string;
2208
+ lastUpdatedAt: string;
2209
+ } | {
2210
+ totalCreditsAvailable: number;
2211
+ allocationSource: string;
2212
+ createdAt: string;
2213
+ creditsAllocatedThisPeriod: number;
2214
+ effectivePlanId: string;
2215
+ email: string;
2216
+ isUnlimited: boolean;
2217
+ lastUpdatedAt: string;
2218
+ ownerType: string;
2219
+ periodStart: string;
2220
+ periodEnd: string;
2221
+ planTermEndTimestamp: string | null;
2222
+ sourceDetails: Record<string, unknown>;
2223
+ creditsAvailable?: number;
2224
+ topOffCreditsAvailable?: number;
2225
+ id: string;
2226
+ userId?: undefined;
2227
+ status?: undefined;
2228
+ topOffCreditsTotal?: undefined;
2229
+ }>;
2230
+ } | {
2231
+ data: undefined;
2232
+ error: null;
2233
+ isError: false;
2234
+ isPending: true;
2235
+ isLoading: true;
2236
+ isLoadingError: false;
2237
+ isRefetchError: false;
2238
+ isSuccess: false;
2239
+ isPlaceholderData: false;
2240
+ status: "pending";
2241
+ dataUpdatedAt: number;
2242
+ errorUpdatedAt: number;
2243
+ failureCount: number;
2244
+ failureReason: Error | null;
2245
+ errorUpdateCount: number;
2246
+ isFetched: boolean;
2247
+ isFetchedAfterMount: boolean;
2248
+ isFetching: boolean;
2249
+ isInitialLoading: boolean;
2250
+ isPaused: boolean;
2251
+ isRefetching: boolean;
2252
+ isStale: boolean;
2253
+ refetch: (options?: _tanstack_react_query.RefetchOptions) => Promise<_tanstack_react_query.QueryObserverResult<{
2254
+ id: string;
2255
+ userId: string;
2256
+ email: string;
2257
+ effectivePlanId: string;
2258
+ status: string;
2259
+ isUnlimited: boolean;
2260
+ creditsAvailable: number;
2261
+ creditsAllocatedThisPeriod: number;
2262
+ topOffCreditsAvailable: number;
2263
+ topOffCreditsTotal: number;
2264
+ allocationSource: string;
2265
+ sourceDetails: {};
2266
+ periodStart: null;
2267
+ periodEnd: null;
2268
+ planTermEndTimestamp: null;
2269
+ ownerType: string;
2270
+ createdAt: string;
2271
+ lastUpdatedAt: string;
2272
+ } | {
2273
+ totalCreditsAvailable: number;
2274
+ allocationSource: string;
2275
+ createdAt: string;
2276
+ creditsAllocatedThisPeriod: number;
2277
+ effectivePlanId: string;
2278
+ email: string;
2279
+ isUnlimited: boolean;
2280
+ lastUpdatedAt: string;
2281
+ ownerType: string;
2282
+ periodStart: string;
2283
+ periodEnd: string;
2284
+ planTermEndTimestamp: string | null;
2285
+ sourceDetails: Record<string, unknown>;
2286
+ creditsAvailable?: number;
2287
+ topOffCreditsAvailable?: number;
2288
+ id: string;
2289
+ userId?: undefined;
2290
+ status?: undefined;
2291
+ topOffCreditsTotal?: undefined;
2292
+ }, Error>>;
2293
+ fetchStatus: _tanstack_react_query.FetchStatus;
2294
+ promise: Promise<{
2295
+ id: string;
2296
+ userId: string;
2297
+ email: string;
2298
+ effectivePlanId: string;
2299
+ status: string;
2300
+ isUnlimited: boolean;
2301
+ creditsAvailable: number;
2302
+ creditsAllocatedThisPeriod: number;
2303
+ topOffCreditsAvailable: number;
2304
+ topOffCreditsTotal: number;
2305
+ allocationSource: string;
2306
+ sourceDetails: {};
2307
+ periodStart: null;
2308
+ periodEnd: null;
2309
+ planTermEndTimestamp: null;
2310
+ ownerType: string;
2311
+ createdAt: string;
2312
+ lastUpdatedAt: string;
2313
+ } | {
2314
+ totalCreditsAvailable: number;
2315
+ allocationSource: string;
2316
+ createdAt: string;
2317
+ creditsAllocatedThisPeriod: number;
2318
+ effectivePlanId: string;
2319
+ email: string;
2320
+ isUnlimited: boolean;
2321
+ lastUpdatedAt: string;
2322
+ ownerType: string;
2323
+ periodStart: string;
2324
+ periodEnd: string;
2325
+ planTermEndTimestamp: string | null;
2326
+ sourceDetails: Record<string, unknown>;
2327
+ creditsAvailable?: number;
2328
+ topOffCreditsAvailable?: number;
2329
+ id: string;
2330
+ userId?: undefined;
2331
+ status?: undefined;
2332
+ topOffCreditsTotal?: undefined;
2333
+ }>;
2334
+ } | {
2335
+ data: undefined;
2336
+ error: null;
2337
+ isError: false;
2338
+ isPending: true;
2339
+ isLoadingError: false;
2340
+ isRefetchError: false;
2341
+ isSuccess: false;
2342
+ isPlaceholderData: false;
2343
+ status: "pending";
2344
+ dataUpdatedAt: number;
2345
+ errorUpdatedAt: number;
2346
+ failureCount: number;
2347
+ failureReason: Error | null;
2348
+ errorUpdateCount: number;
2349
+ isFetched: boolean;
2350
+ isFetchedAfterMount: boolean;
2351
+ isFetching: boolean;
2352
+ isLoading: boolean;
2353
+ isInitialLoading: boolean;
2354
+ isPaused: boolean;
2355
+ isRefetching: boolean;
2356
+ isStale: boolean;
2357
+ refetch: (options?: _tanstack_react_query.RefetchOptions) => Promise<_tanstack_react_query.QueryObserverResult<{
2358
+ id: string;
2359
+ userId: string;
2360
+ email: string;
2361
+ effectivePlanId: string;
2362
+ status: string;
2363
+ isUnlimited: boolean;
2364
+ creditsAvailable: number;
2365
+ creditsAllocatedThisPeriod: number;
2366
+ topOffCreditsAvailable: number;
2367
+ topOffCreditsTotal: number;
2368
+ allocationSource: string;
2369
+ sourceDetails: {};
2370
+ periodStart: null;
2371
+ periodEnd: null;
2372
+ planTermEndTimestamp: null;
2373
+ ownerType: string;
2374
+ createdAt: string;
2375
+ lastUpdatedAt: string;
2376
+ } | {
2377
+ totalCreditsAvailable: number;
2378
+ allocationSource: string;
2379
+ createdAt: string;
2380
+ creditsAllocatedThisPeriod: number;
2381
+ effectivePlanId: string;
2382
+ email: string;
2383
+ isUnlimited: boolean;
2384
+ lastUpdatedAt: string;
2385
+ ownerType: string;
2386
+ periodStart: string;
2387
+ periodEnd: string;
2388
+ planTermEndTimestamp: string | null;
2389
+ sourceDetails: Record<string, unknown>;
2390
+ creditsAvailable?: number;
2391
+ topOffCreditsAvailable?: number;
2392
+ id: string;
2393
+ userId?: undefined;
2394
+ status?: undefined;
2395
+ topOffCreditsTotal?: undefined;
2396
+ }, Error>>;
2397
+ fetchStatus: _tanstack_react_query.FetchStatus;
2398
+ promise: Promise<{
2399
+ id: string;
2400
+ userId: string;
2401
+ email: string;
2402
+ effectivePlanId: string;
2403
+ status: string;
2404
+ isUnlimited: boolean;
2405
+ creditsAvailable: number;
2406
+ creditsAllocatedThisPeriod: number;
2407
+ topOffCreditsAvailable: number;
2408
+ topOffCreditsTotal: number;
2409
+ allocationSource: string;
2410
+ sourceDetails: {};
2411
+ periodStart: null;
2412
+ periodEnd: null;
2413
+ planTermEndTimestamp: null;
2414
+ ownerType: string;
2415
+ createdAt: string;
2416
+ lastUpdatedAt: string;
2417
+ } | {
2418
+ totalCreditsAvailable: number;
2419
+ allocationSource: string;
2420
+ createdAt: string;
2421
+ creditsAllocatedThisPeriod: number;
2422
+ effectivePlanId: string;
2423
+ email: string;
2424
+ isUnlimited: boolean;
2425
+ lastUpdatedAt: string;
2426
+ ownerType: string;
2427
+ periodStart: string;
2428
+ periodEnd: string;
2429
+ planTermEndTimestamp: string | null;
2430
+ sourceDetails: Record<string, unknown>;
2431
+ creditsAvailable?: number;
2432
+ topOffCreditsAvailable?: number;
2433
+ id: string;
2434
+ userId?: undefined;
2435
+ status?: undefined;
2436
+ topOffCreditsTotal?: undefined;
2437
+ }>;
2438
+ } | {
2439
+ data: {
2440
+ id: string;
2441
+ userId: string;
2442
+ email: string;
2443
+ effectivePlanId: string;
2444
+ status: string;
2445
+ isUnlimited: boolean;
2446
+ creditsAvailable: number;
2447
+ creditsAllocatedThisPeriod: number;
2448
+ topOffCreditsAvailable: number;
2449
+ topOffCreditsTotal: number;
2450
+ allocationSource: string;
2451
+ sourceDetails: {};
2452
+ periodStart: null;
2453
+ periodEnd: null;
2454
+ planTermEndTimestamp: null;
2455
+ ownerType: string;
2456
+ createdAt: string;
2457
+ lastUpdatedAt: string;
2458
+ } | {
2459
+ totalCreditsAvailable: number;
2460
+ allocationSource: string;
2461
+ createdAt: string;
2462
+ creditsAllocatedThisPeriod: number;
2463
+ effectivePlanId: string;
2464
+ email: string;
2465
+ isUnlimited: boolean;
2466
+ lastUpdatedAt: string;
2467
+ ownerType: string;
2468
+ periodStart: string;
2469
+ periodEnd: string;
2470
+ planTermEndTimestamp: string | null;
2471
+ sourceDetails: Record<string, unknown>;
2472
+ creditsAvailable?: number;
2473
+ topOffCreditsAvailable?: number;
2474
+ id: string;
2475
+ userId?: undefined;
2476
+ status?: undefined;
2477
+ topOffCreditsTotal?: undefined;
2478
+ };
2479
+ isError: false;
2480
+ error: null;
2481
+ isPending: false;
2482
+ isLoading: false;
2483
+ isLoadingError: false;
2484
+ isRefetchError: false;
2485
+ isSuccess: true;
2486
+ isPlaceholderData: true;
2487
+ status: "success";
2488
+ dataUpdatedAt: number;
2489
+ errorUpdatedAt: number;
2490
+ failureCount: number;
2491
+ failureReason: Error | null;
2492
+ errorUpdateCount: number;
2493
+ isFetched: boolean;
2494
+ isFetchedAfterMount: boolean;
2495
+ isFetching: boolean;
2496
+ isInitialLoading: boolean;
2497
+ isPaused: boolean;
2498
+ isRefetching: boolean;
2499
+ isStale: boolean;
2500
+ refetch: (options?: _tanstack_react_query.RefetchOptions) => Promise<_tanstack_react_query.QueryObserverResult<{
2501
+ id: string;
2502
+ userId: string;
2503
+ email: string;
2504
+ effectivePlanId: string;
2505
+ status: string;
2506
+ isUnlimited: boolean;
2507
+ creditsAvailable: number;
2508
+ creditsAllocatedThisPeriod: number;
2509
+ topOffCreditsAvailable: number;
2510
+ topOffCreditsTotal: number;
2511
+ allocationSource: string;
2512
+ sourceDetails: {};
2513
+ periodStart: null;
2514
+ periodEnd: null;
2515
+ planTermEndTimestamp: null;
2516
+ ownerType: string;
2517
+ createdAt: string;
2518
+ lastUpdatedAt: string;
2519
+ } | {
2520
+ totalCreditsAvailable: number;
2521
+ allocationSource: string;
2522
+ createdAt: string;
2523
+ creditsAllocatedThisPeriod: number;
2524
+ effectivePlanId: string;
2525
+ email: string;
2526
+ isUnlimited: boolean;
2527
+ lastUpdatedAt: string;
2528
+ ownerType: string;
2529
+ periodStart: string;
2530
+ periodEnd: string;
2531
+ planTermEndTimestamp: string | null;
2532
+ sourceDetails: Record<string, unknown>;
2533
+ creditsAvailable?: number;
2534
+ topOffCreditsAvailable?: number;
2535
+ id: string;
2536
+ userId?: undefined;
2537
+ status?: undefined;
2538
+ topOffCreditsTotal?: undefined;
2539
+ }, Error>>;
2540
+ fetchStatus: _tanstack_react_query.FetchStatus;
2541
+ promise: Promise<{
2542
+ id: string;
2543
+ userId: string;
2544
+ email: string;
2545
+ effectivePlanId: string;
2546
+ status: string;
2547
+ isUnlimited: boolean;
2548
+ creditsAvailable: number;
2549
+ creditsAllocatedThisPeriod: number;
2550
+ topOffCreditsAvailable: number;
2551
+ topOffCreditsTotal: number;
2552
+ allocationSource: string;
2553
+ sourceDetails: {};
2554
+ periodStart: null;
2555
+ periodEnd: null;
2556
+ planTermEndTimestamp: null;
2557
+ ownerType: string;
2558
+ createdAt: string;
2559
+ lastUpdatedAt: string;
2560
+ } | {
2561
+ totalCreditsAvailable: number;
2562
+ allocationSource: string;
2563
+ createdAt: string;
2564
+ creditsAllocatedThisPeriod: number;
2565
+ effectivePlanId: string;
2566
+ email: string;
2567
+ isUnlimited: boolean;
2568
+ lastUpdatedAt: string;
2569
+ ownerType: string;
2570
+ periodStart: string;
2571
+ periodEnd: string;
2572
+ planTermEndTimestamp: string | null;
2573
+ sourceDetails: Record<string, unknown>;
2574
+ creditsAvailable?: number;
2575
+ topOffCreditsAvailable?: number;
2576
+ id: string;
2577
+ userId?: undefined;
2578
+ status?: undefined;
2579
+ topOffCreditsTotal?: undefined;
2580
+ }>;
2581
+ };
2582
+
2583
+ interface OrganizationAccess {
2584
+ hasUnlimitedAccess: boolean;
2585
+ subscriptionId: string | null;
2586
+ organizationId: string | null;
2587
+ organizationName: string | null;
2588
+ subscriptionEndDate: Date | null;
2589
+ accessType: 'organization' | 'individual' | 'institution_subscriptions';
2590
+ }
2591
+ interface InstitutionSubscription {
2592
+ id: string;
2593
+ institutionId: string;
2594
+ name: string;
2595
+ plan: string;
2596
+ endDate: Date;
2597
+ }
2598
+ interface Organization {
2599
+ id: string;
2600
+ name: string;
2601
+ members: string[];
2602
+ masterSubscriptionStatus: string;
2603
+ masterSubscriptionId: string;
2604
+ masterSubscriptionEndDate: Date;
2605
+ }
2606
+ declare const useOrganizationAccess: () => {
2607
+ data: OrganizationAccess;
2608
+ error: Error;
2609
+ isError: true;
2610
+ isPending: false;
2611
+ isLoading: false;
2612
+ isLoadingError: false;
2613
+ isRefetchError: true;
2614
+ isSuccess: false;
2615
+ isPlaceholderData: false;
2616
+ status: "error";
2617
+ dataUpdatedAt: number;
2618
+ errorUpdatedAt: number;
2619
+ failureCount: number;
2620
+ failureReason: Error | null;
2621
+ errorUpdateCount: number;
2622
+ isFetched: boolean;
2623
+ isFetchedAfterMount: boolean;
2624
+ isFetching: boolean;
2625
+ isInitialLoading: boolean;
2626
+ isPaused: boolean;
2627
+ isRefetching: boolean;
2628
+ isStale: boolean;
2629
+ refetch: (options?: _tanstack_react_query.RefetchOptions) => Promise<_tanstack_react_query.QueryObserverResult<OrganizationAccess, Error>>;
2630
+ fetchStatus: _tanstack_react_query.FetchStatus;
2631
+ promise: Promise<OrganizationAccess>;
2632
+ } | {
2633
+ data: OrganizationAccess;
2634
+ error: null;
2635
+ isError: false;
2636
+ isPending: false;
2637
+ isLoading: false;
2638
+ isLoadingError: false;
2639
+ isRefetchError: false;
2640
+ isSuccess: true;
2641
+ isPlaceholderData: false;
2642
+ status: "success";
2643
+ dataUpdatedAt: number;
2644
+ errorUpdatedAt: number;
2645
+ failureCount: number;
2646
+ failureReason: Error | null;
2647
+ errorUpdateCount: number;
2648
+ isFetched: boolean;
2649
+ isFetchedAfterMount: boolean;
2650
+ isFetching: boolean;
2651
+ isInitialLoading: boolean;
2652
+ isPaused: boolean;
2653
+ isRefetching: boolean;
2654
+ isStale: boolean;
2655
+ refetch: (options?: _tanstack_react_query.RefetchOptions) => Promise<_tanstack_react_query.QueryObserverResult<OrganizationAccess, Error>>;
2656
+ fetchStatus: _tanstack_react_query.FetchStatus;
2657
+ promise: Promise<OrganizationAccess>;
2658
+ } | {
2659
+ data: undefined;
2660
+ error: Error;
2661
+ isError: true;
2662
+ isPending: false;
2663
+ isLoading: false;
2664
+ isLoadingError: true;
2665
+ isRefetchError: false;
2666
+ isSuccess: false;
2667
+ isPlaceholderData: false;
2668
+ status: "error";
2669
+ dataUpdatedAt: number;
2670
+ errorUpdatedAt: number;
2671
+ failureCount: number;
2672
+ failureReason: Error | null;
2673
+ errorUpdateCount: number;
2674
+ isFetched: boolean;
2675
+ isFetchedAfterMount: boolean;
2676
+ isFetching: boolean;
2677
+ isInitialLoading: boolean;
2678
+ isPaused: boolean;
2679
+ isRefetching: boolean;
2680
+ isStale: boolean;
2681
+ refetch: (options?: _tanstack_react_query.RefetchOptions) => Promise<_tanstack_react_query.QueryObserverResult<OrganizationAccess, Error>>;
2682
+ fetchStatus: _tanstack_react_query.FetchStatus;
2683
+ promise: Promise<OrganizationAccess>;
2684
+ } | {
2685
+ data: undefined;
2686
+ error: null;
2687
+ isError: false;
2688
+ isPending: true;
2689
+ isLoading: true;
2690
+ isLoadingError: false;
2691
+ isRefetchError: false;
2692
+ isSuccess: false;
2693
+ isPlaceholderData: false;
2694
+ status: "pending";
2695
+ dataUpdatedAt: number;
2696
+ errorUpdatedAt: number;
2697
+ failureCount: number;
2698
+ failureReason: Error | null;
2699
+ errorUpdateCount: number;
2700
+ isFetched: boolean;
2701
+ isFetchedAfterMount: boolean;
2702
+ isFetching: boolean;
2703
+ isInitialLoading: boolean;
2704
+ isPaused: boolean;
2705
+ isRefetching: boolean;
2706
+ isStale: boolean;
2707
+ refetch: (options?: _tanstack_react_query.RefetchOptions) => Promise<_tanstack_react_query.QueryObserverResult<OrganizationAccess, Error>>;
2708
+ fetchStatus: _tanstack_react_query.FetchStatus;
2709
+ promise: Promise<OrganizationAccess>;
2710
+ } | {
2711
+ data: undefined;
2712
+ error: null;
2713
+ isError: false;
2714
+ isPending: true;
2715
+ isLoadingError: false;
2716
+ isRefetchError: false;
2717
+ isSuccess: false;
2718
+ isPlaceholderData: false;
2719
+ status: "pending";
2720
+ dataUpdatedAt: number;
2721
+ errorUpdatedAt: number;
2722
+ failureCount: number;
2723
+ failureReason: Error | null;
2724
+ errorUpdateCount: number;
2725
+ isFetched: boolean;
2726
+ isFetchedAfterMount: boolean;
2727
+ isFetching: boolean;
2728
+ isLoading: boolean;
2729
+ isInitialLoading: boolean;
2730
+ isPaused: boolean;
2731
+ isRefetching: boolean;
2732
+ isStale: boolean;
2733
+ refetch: (options?: _tanstack_react_query.RefetchOptions) => Promise<_tanstack_react_query.QueryObserverResult<OrganizationAccess, Error>>;
2734
+ fetchStatus: _tanstack_react_query.FetchStatus;
2735
+ promise: Promise<OrganizationAccess>;
2736
+ } | {
2737
+ data: OrganizationAccess;
2738
+ isError: false;
2739
+ error: null;
2740
+ isPending: false;
2741
+ isLoading: false;
2742
+ isLoadingError: false;
2743
+ isRefetchError: false;
2744
+ isSuccess: true;
2745
+ isPlaceholderData: true;
2746
+ status: "success";
2747
+ dataUpdatedAt: number;
2748
+ errorUpdatedAt: number;
2749
+ failureCount: number;
2750
+ failureReason: Error | null;
2751
+ errorUpdateCount: number;
2752
+ isFetched: boolean;
2753
+ isFetchedAfterMount: boolean;
2754
+ isFetching: boolean;
2755
+ isInitialLoading: boolean;
2756
+ isPaused: boolean;
2757
+ isRefetching: boolean;
2758
+ isStale: boolean;
2759
+ refetch: (options?: _tanstack_react_query.RefetchOptions) => Promise<_tanstack_react_query.QueryObserverResult<OrganizationAccess, Error>>;
2760
+ fetchStatus: _tanstack_react_query.FetchStatus;
2761
+ promise: Promise<OrganizationAccess>;
2762
+ };
2763
+
2764
+ declare function useSpeakableTranscript(): {
2765
+ mutation: _tanstack_react_query.UseMutationResult<string | null, Error, {
2766
+ model: "gemini" | "assemblyai";
2767
+ audioUrl: string;
2768
+ language: string;
2769
+ prompt?: string;
2770
+ }, unknown>;
2771
+ };
2772
+
2773
+ declare const useUpdateStudentVocab: (page: PageActivityWithId | null) => {
2774
+ studentVocabMarkVoiceSuccess: undefined;
2775
+ studentVocabMarkVoiceFail: undefined;
2776
+ } | {
2777
+ studentVocabMarkVoiceSuccess: () => Promise<void>;
2778
+ studentVocabMarkVoiceFail: () => Promise<void>;
2779
+ };
2780
+
2781
+ declare const useBaseOpenAI: ({ onTranscriptSuccess, onTranscriptError, onCompletionSuccess, onCompletionError, aiEnabled, submitAudioResponse, uploadAudioAndGetTranscript, onGetAudioUrlAndTranscript, }: {
2782
+ onTranscriptSuccess: (transcript: string) => void;
2783
+ onTranscriptError: ({ type, message }: {
2784
+ type: string;
2785
+ message: string;
2786
+ }) => void;
2787
+ onCompletionSuccess: (completion: any) => void;
2788
+ onCompletionError: ({ type, message }: {
2789
+ type: string;
2790
+ message: string;
2791
+ }) => void;
2792
+ aiEnabled: boolean;
2793
+ submitAudioResponse: (audio: string) => Promise<{
2794
+ url: string;
2795
+ fileName: string;
2796
+ }>;
2797
+ uploadAudioAndGetTranscript: (audio: string, language: string, pagePrompt: string | null) => Promise<{
2798
+ transcript: string;
2799
+ audioUrl: string;
2800
+ }>;
2801
+ onGetAudioUrlAndTranscript?: (args: {
2802
+ transcript?: string;
2803
+ audioUrl?: string;
2804
+ }) => void;
2805
+ }) => {
2806
+ submitAudioResponse: (audio: string) => Promise<{
2807
+ url: string;
2808
+ fileName: string;
2809
+ }>;
2810
+ uploadAudioAndGetTranscript: (audio: string, language: string, pagePrompt: string | null) => Promise<{
2811
+ transcript: string;
2812
+ audioUrl: string;
2813
+ }>;
2814
+ getTranscript: (audioUrl: string, language: string, prompt?: string) => Promise<any>;
2815
+ getFreeResponseCompletion: (messages: string[], isFreeResponse: boolean, feedbackLanguage: string, gradingStandard?: string) => Promise<any>;
2816
+ getFeedback: ({ cardId, language, writtenResponse, audio, autoGrade, file, pagePrompt, }: {
2817
+ cardId: string;
2818
+ language: string;
2819
+ writtenResponse: string | null;
2820
+ audio: string | null;
2821
+ autoGrade: boolean;
2822
+ file: string | null;
2823
+ pagePrompt: string | null;
2824
+ }) => Promise<{
2825
+ noFeedbackAvailable: boolean;
2826
+ success: boolean;
2827
+ reason: string;
2828
+ accessType: "ai_enabled" | "teacher_preview" | "student_with_teacher_plan" | "none";
2829
+ } | {
2830
+ noFeedbackAvailable: boolean;
2831
+ success: boolean;
2832
+ reason: string;
2833
+ accessType: string;
2834
+ aiSuccess: boolean;
2835
+ }>;
2836
+ };
2837
+
2838
+ interface ActivityFeedbackAccess {
2839
+ canAccessFeedback: boolean;
2840
+ reason?: string;
2841
+ isUnlimited: boolean;
2842
+ accessType: 'ai_enabled' | 'teacher_preview' | 'student_with_teacher_plan' | 'none';
2843
+ }
2844
+ /**
2845
+ * Hook to check feedback permissions for both students and teachers
2846
+ *
2847
+ * Permission Logic:
2848
+ * 1. aiEnabled: true → Allow feedback access always (highest priority)
2849
+ * 2. Teachers on /activity route → Always allowed (ADMIN role)
2850
+ * 3. Students on /activity route → Need teacher with active plan (team/org)
2851
+ *
2852
+ * @param params - Parameters for permission checking
2853
+ * @returns Feedback permissions information
2854
+ */
2855
+ declare const useActivityFeedbackAccess: ({ aiEnabled, isActivityRoute, }: {
2856
+ aiEnabled?: boolean;
2857
+ isActivityRoute?: boolean;
2858
+ }) => {
2859
+ data: ActivityFeedbackAccess;
2860
+ error: Error;
2861
+ isError: true;
2862
+ isPending: false;
2863
+ isLoading: false;
2864
+ isLoadingError: false;
2865
+ isRefetchError: true;
2866
+ isSuccess: false;
2867
+ isPlaceholderData: false;
2868
+ status: "error";
2869
+ dataUpdatedAt: number;
2870
+ errorUpdatedAt: number;
2871
+ failureCount: number;
2872
+ failureReason: Error | null;
2873
+ errorUpdateCount: number;
2874
+ isFetched: boolean;
2875
+ isFetchedAfterMount: boolean;
2876
+ isFetching: boolean;
2877
+ isInitialLoading: boolean;
2878
+ isPaused: boolean;
2879
+ isRefetching: boolean;
2880
+ isStale: boolean;
2881
+ refetch: (options?: _tanstack_react_query.RefetchOptions) => Promise<_tanstack_react_query.QueryObserverResult<ActivityFeedbackAccess, Error>>;
2882
+ fetchStatus: _tanstack_react_query.FetchStatus;
2883
+ promise: Promise<ActivityFeedbackAccess>;
2884
+ } | {
2885
+ data: ActivityFeedbackAccess;
2886
+ error: null;
2887
+ isError: false;
2888
+ isPending: false;
2889
+ isLoading: false;
2890
+ isLoadingError: false;
2891
+ isRefetchError: false;
2892
+ isSuccess: true;
2893
+ isPlaceholderData: false;
2894
+ status: "success";
2895
+ dataUpdatedAt: number;
2896
+ errorUpdatedAt: number;
2897
+ failureCount: number;
2898
+ failureReason: Error | null;
2899
+ errorUpdateCount: number;
2900
+ isFetched: boolean;
2901
+ isFetchedAfterMount: boolean;
2902
+ isFetching: boolean;
2903
+ isInitialLoading: boolean;
2904
+ isPaused: boolean;
2905
+ isRefetching: boolean;
2906
+ isStale: boolean;
2907
+ refetch: (options?: _tanstack_react_query.RefetchOptions) => Promise<_tanstack_react_query.QueryObserverResult<ActivityFeedbackAccess, Error>>;
2908
+ fetchStatus: _tanstack_react_query.FetchStatus;
2909
+ promise: Promise<ActivityFeedbackAccess>;
2910
+ } | {
2911
+ data: undefined;
2912
+ error: Error;
2913
+ isError: true;
2914
+ isPending: false;
2915
+ isLoading: false;
2916
+ isLoadingError: true;
2917
+ isRefetchError: false;
2918
+ isSuccess: false;
2919
+ isPlaceholderData: false;
2920
+ status: "error";
2921
+ dataUpdatedAt: number;
2922
+ errorUpdatedAt: number;
2923
+ failureCount: number;
2924
+ failureReason: Error | null;
2925
+ errorUpdateCount: number;
2926
+ isFetched: boolean;
2927
+ isFetchedAfterMount: boolean;
2928
+ isFetching: boolean;
2929
+ isInitialLoading: boolean;
2930
+ isPaused: boolean;
2931
+ isRefetching: boolean;
2932
+ isStale: boolean;
2933
+ refetch: (options?: _tanstack_react_query.RefetchOptions) => Promise<_tanstack_react_query.QueryObserverResult<ActivityFeedbackAccess, Error>>;
2934
+ fetchStatus: _tanstack_react_query.FetchStatus;
2935
+ promise: Promise<ActivityFeedbackAccess>;
2936
+ } | {
2937
+ data: undefined;
2938
+ error: null;
2939
+ isError: false;
2940
+ isPending: true;
2941
+ isLoading: true;
2942
+ isLoadingError: false;
2943
+ isRefetchError: false;
2944
+ isSuccess: false;
2945
+ isPlaceholderData: false;
2946
+ status: "pending";
2947
+ dataUpdatedAt: number;
2948
+ errorUpdatedAt: number;
2949
+ failureCount: number;
2950
+ failureReason: Error | null;
2951
+ errorUpdateCount: number;
2952
+ isFetched: boolean;
2953
+ isFetchedAfterMount: boolean;
2954
+ isFetching: boolean;
2955
+ isInitialLoading: boolean;
2956
+ isPaused: boolean;
2957
+ isRefetching: boolean;
2958
+ isStale: boolean;
2959
+ refetch: (options?: _tanstack_react_query.RefetchOptions) => Promise<_tanstack_react_query.QueryObserverResult<ActivityFeedbackAccess, Error>>;
2960
+ fetchStatus: _tanstack_react_query.FetchStatus;
2961
+ promise: Promise<ActivityFeedbackAccess>;
2962
+ } | {
2963
+ data: undefined;
2964
+ error: null;
2965
+ isError: false;
2966
+ isPending: true;
2967
+ isLoadingError: false;
2968
+ isRefetchError: false;
2969
+ isSuccess: false;
2970
+ isPlaceholderData: false;
2971
+ status: "pending";
2972
+ dataUpdatedAt: number;
2973
+ errorUpdatedAt: number;
2974
+ failureCount: number;
2975
+ failureReason: Error | null;
2976
+ errorUpdateCount: number;
2977
+ isFetched: boolean;
2978
+ isFetchedAfterMount: boolean;
2979
+ isFetching: boolean;
2980
+ isLoading: boolean;
2981
+ isInitialLoading: boolean;
2982
+ isPaused: boolean;
2983
+ isRefetching: boolean;
2984
+ isStale: boolean;
2985
+ refetch: (options?: _tanstack_react_query.RefetchOptions) => Promise<_tanstack_react_query.QueryObserverResult<ActivityFeedbackAccess, Error>>;
2986
+ fetchStatus: _tanstack_react_query.FetchStatus;
2987
+ promise: Promise<ActivityFeedbackAccess>;
2988
+ } | {
2989
+ data: ActivityFeedbackAccess;
2990
+ isError: false;
2991
+ error: null;
2992
+ isPending: false;
2993
+ isLoading: false;
2994
+ isLoadingError: false;
2995
+ isRefetchError: false;
2996
+ isSuccess: true;
2997
+ isPlaceholderData: true;
2998
+ status: "success";
2999
+ dataUpdatedAt: number;
3000
+ errorUpdatedAt: number;
3001
+ failureCount: number;
3002
+ failureReason: Error | null;
3003
+ errorUpdateCount: number;
3004
+ isFetched: boolean;
3005
+ isFetchedAfterMount: boolean;
3006
+ isFetching: boolean;
3007
+ isInitialLoading: boolean;
3008
+ isPaused: boolean;
3009
+ isRefetching: boolean;
3010
+ isStale: boolean;
3011
+ refetch: (options?: _tanstack_react_query.RefetchOptions) => Promise<_tanstack_react_query.QueryObserverResult<ActivityFeedbackAccess, Error>>;
3012
+ fetchStatus: _tanstack_react_query.FetchStatus;
3013
+ promise: Promise<ActivityFeedbackAccess>;
3014
+ };
3015
+
447
3016
  declare const createFsClientNative: ({ db, httpsCallable, logEvent }: FsClientParams) => {
448
3017
  assignmentRepo: {
449
3018
  getAssignment: (params: {
@@ -708,4 +3277,4 @@ declare const createFsClientNative: ({ db, httpsCallable, logEvent }: FsClientPa
708
3277
  };
709
3278
  };
710
3279
 
711
- export { createFsClientNative as createFsClient };
3280
+ export { ActivityPageType, type Assignment, type AssignmentAnalyticsType$1 as AssignmentAnalyticsType, type AssignmentWithId, BASE_MULTIPLE_CHOICE_FIELD_VALUES, BASE_REPEAT_FIELD_VALUES, BASE_RESPOND_FIELD_VALUES, type CreditContract, FeedbackTypesCard, FsCtx, type InstitutionSubscription, LENIENCY_OPTIONS, LeniencyCard, MULTIPLE_CHOICE_PAGE_ACTIVITY_TYPES, type Organization, type OrganizationAccess, type PageActivity, type PageActivityWithId, type PageScore, REPEAT_PAGE_ACTIVITY_TYPES, RESPOND_AUDIO_PAGE_ACTIVITY_TYPES, RESPOND_PAGE_ACTIVITY_TYPES, RESPOND_WRITE_PAGE_ACTIVITY_TYPES, type RefsCardsFiresotre, type RefsSetsFirestore, SPEAKABLE_NOTIFICATIONS, STUDENT_LEVELS_OPTIONS, type Score, type ScoreWithId, type Set, type SetWithId, type SpeakableNotificationType, SpeakableNotificationTypes, SpeakableProvider, VerificationCardStatus, assignmentQueryKeys, cardsQueryKeys, checkIsMCPage, checkIsMediaPage, checkIsRepeatPage, checkIsRespondAudioPage, checkIsRespondPage, checkIsRespondWrittenPage, checkIsShortAnswerPage, checkTypePageActivity, cleanString, createAssignmentRepo, createCardRepo, createFsClientNative as createFsClient, createSetRepo, creditQueryKeys, debounce, getCardFromCache, getLabelPage, getPagePrompt, getPhraseLength, getRespondCardTool, getSetFromCache, getTotalCompletedCards, getTranscript, getWordHash, purify, refsCardsFiresotre, refsSetsFirestore, scoreQueryKeys, setsQueryKeys, updateCardInCache, updateSetInCache, useActivity, useActivityFeedbackAccess, useAssignment, useBaseOpenAI, useCards, useClearScore, useClearScoreV2, useCreateCard, useCreateCards, useCreateNotification, useGetCard, useOrganizationAccess, useScore, useSet, useSpeakableApi, useSpeakableTranscript, useSubmitAssignmentScore, useSubmitPracticeScore, useUpdateCardScore, useUpdateScore, useUpdateStudentVocab, useUserCredits };