@orjok/commons 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/hooks.cjs CHANGED
@@ -6,7 +6,10 @@
6
6
 
7
7
 
8
8
 
9
- var _chunkDB3CMKPPcjs = require('./chunk-DB3CMKPP.cjs');
9
+
10
+
11
+
12
+ var _chunkODXD2WJNcjs = require('./chunk-ODXD2WJN.cjs');
10
13
 
11
14
  // src/hooks/useOrjokClient.ts
12
15
  var _react = require('react');
@@ -24,12 +27,12 @@ function useOrjokClient() {
24
27
  var _reactquery = require('@tanstack/react-query');
25
28
  function useMediaUrl(key) {
26
29
  const client = useOrjokClient();
27
- const isResolvable = Boolean(key && _chunkDB3CMKPPcjs.isStorageKey.call(void 0, key));
30
+ const isResolvable = Boolean(key && _chunkODXD2WJNcjs.isStorageKey.call(void 0, key));
28
31
  const query = _reactquery.useQuery.call(void 0, {
29
32
  queryKey: ["media-url", key],
30
33
  queryFn: async () => {
31
34
  if (!key) return null;
32
- return _chunkDB3CMKPPcjs.resolveMediaUrl.call(void 0, key, client.storage);
35
+ return _chunkODXD2WJNcjs.resolveMediaUrl.call(void 0, key, client.storage);
33
36
  },
34
37
  enabled: isResolvable,
35
38
  staleTime: 50 * 60 * 1e3
@@ -38,7 +41,7 @@ function useMediaUrl(key) {
38
41
  if (!key) {
39
42
  return { url: null, isLoading: false };
40
43
  }
41
- if (!_chunkDB3CMKPPcjs.isStorageKey.call(void 0, key)) {
44
+ if (!_chunkODXD2WJNcjs.isStorageKey.call(void 0, key)) {
42
45
  return { url: key, isLoading: false };
43
46
  }
44
47
  return {
@@ -285,7 +288,7 @@ function useProgress(userId) {
285
288
  const subjectsProgress = _nullishCoalesce(subjectsQuery.data, () => ( []));
286
289
  const chaptersProgress = _nullishCoalesce(chaptersQuery.data, () => ( []));
287
290
  const topicsProgress = _nullishCoalesce(topicsQuery.data, () => ( []));
288
- const metrics = _chunkDB3CMKPPcjs.aggregateSubjectMetrics.call(void 0, subjectsProgress);
291
+ const metrics = _chunkODXD2WJNcjs.aggregateSubjectMetrics.call(void 0, subjectsProgress);
289
292
  return {
290
293
  subjectsProgress,
291
294
  chaptersProgress,
@@ -358,8 +361,8 @@ function usePractice({
358
361
  });
359
362
  });
360
363
  let list = Array.from(uniqueMap.values()).filter((q) => {
361
- if (!_chunkDB3CMKPPcjs.isLanguageMatch.call(void 0, q.language, language)) return false;
362
- if (!_chunkDB3CMKPPcjs.isDifficultyMatch.call(void 0, q.difficulty, difficulty)) return false;
364
+ if (!_chunkODXD2WJNcjs.isLanguageMatch.call(void 0, q.language, language)) return false;
365
+ if (!_chunkODXD2WJNcjs.isDifficultyMatch.call(void 0, q.difficulty, difficulty)) return false;
363
366
  return true;
364
367
  });
365
368
  if (list.length < 5 && subjectId && bounds.some((b) => b.type !== "subject")) {
@@ -367,7 +370,7 @@ function usePractice({
367
370
  const subRes = await client.questions.listBySubject({ id: subjectId, limit: 50 });
368
371
  (subRes.items || []).forEach((q) => {
369
372
  if (q && q.id && !uniqueMap.has(q.id)) {
370
- if (_chunkDB3CMKPPcjs.isLanguageMatch.call(void 0, q.language, language) && _chunkDB3CMKPPcjs.isDifficultyMatch.call(void 0, q.difficulty, difficulty)) {
373
+ if (_chunkODXD2WJNcjs.isLanguageMatch.call(void 0, q.language, language) && _chunkODXD2WJNcjs.isDifficultyMatch.call(void 0, q.difficulty, difficulty)) {
371
374
  list.push(q);
372
375
  uniqueMap.set(q.id, q);
373
376
  }
@@ -377,7 +380,7 @@ function usePractice({
377
380
  console.error("Error fetching subject fallback in practice:", e);
378
381
  }
379
382
  }
380
- return list.filter(_chunkDB3CMKPPcjs.isValidMCQ);
383
+ return list.filter(_chunkODXD2WJNcjs.isValidMCQ);
381
384
  }, [client, subjectId, chapterIds, topicIds, language, difficulty]);
382
385
  const startPractice = _react.useCallback.call(void 0, async () => {
383
386
  setIsLoading(true);
@@ -390,7 +393,7 @@ function usePractice({
390
393
  setIsCorrect(null);
391
394
  try {
392
395
  const fetched = await fetchQuestionsPool();
393
- setQuestions(_chunkDB3CMKPPcjs.shuffle.call(void 0, fetched));
396
+ setQuestions(_chunkODXD2WJNcjs.shuffle.call(void 0, fetched));
394
397
  } catch (e) {
395
398
  console.error("Error starting practice:", e);
396
399
  setQuestions([]);
@@ -446,7 +449,7 @@ function usePractice({
446
449
  setIsAnswered(false);
447
450
  setIsCorrect(null);
448
451
  } else {
449
- setQuestions((prev) => _chunkDB3CMKPPcjs.shuffle.call(void 0, prev));
452
+ setQuestions((prev) => _chunkODXD2WJNcjs.shuffle.call(void 0, prev));
450
453
  setCurrentIdx(0);
451
454
  setSelectedOption(null);
452
455
  setIsAnswered(false);
@@ -488,6 +491,150 @@ function usePractice({
488
491
  };
489
492
  }
490
493
 
494
+ // src/hooks/useAvailablePublicExams.ts
495
+
496
+
497
+ function useAvailablePublicExams({
498
+ level,
499
+ exploreType = "Question",
500
+ enabled = true,
501
+ client: directClient
502
+ } = {}) {
503
+ let contextClient = null;
504
+ try {
505
+ contextClient = useOrjokClient();
506
+ } catch (e2) {
507
+ }
508
+ const client = _nullishCoalesce(directClient, () => ( contextClient));
509
+ const candidateExams = _react.useMemo.call(void 0, () => _chunkODXD2WJNcjs.getPublicExamsByLevel.call(void 0, level), [level]);
510
+ const query = _reactquery.useQuery.call(void 0, {
511
+ queryKey: ["availablePublicExams", level, exploreType],
512
+ queryFn: async () => {
513
+ if (!client || !level || candidateExams.length === 0) return candidateExams;
514
+ const results = await Promise.all(
515
+ candidateExams.map(async (exam) => {
516
+ try {
517
+ if (exploreType === "Pack") {
518
+ const res = await client.packs.listByPublicExam({
519
+ publicExam: exam.value,
520
+ limit: 1
521
+ });
522
+ return (_nullishCoalesce(_optionalChain([res, 'access', _20 => _20.items, 'optionalAccess', _21 => _21.length]), () => ( 0))) > 0 ? exam : null;
523
+ } else {
524
+ const res = await client.questions.listByPublicExam({
525
+ publicExam: exam.value,
526
+ limit: 1
527
+ });
528
+ return (_nullishCoalesce(_optionalChain([res, 'access', _22 => _22.items, 'optionalAccess', _23 => _23.length]), () => ( 0))) > 0 ? exam : null;
529
+ }
530
+ } catch (e3) {
531
+ return null;
532
+ }
533
+ })
534
+ );
535
+ return results.filter((e) => e !== null);
536
+ },
537
+ enabled: Boolean(level) && enabled,
538
+ staleTime: 10 * 60 * 1e3,
539
+ gcTime: 30 * 60 * 1e3
540
+ });
541
+ if (!enabled || !level) {
542
+ return {
543
+ availableExams: candidateExams,
544
+ isLoading: false,
545
+ isSuccess: true,
546
+ refetch: async () => candidateExams
547
+ };
548
+ }
549
+ return {
550
+ availableExams: _nullishCoalesce(query.data, () => ( [])),
551
+ isLoading: query.isLoading,
552
+ isSuccess: query.isSuccess,
553
+ refetch: query.refetch
554
+ };
555
+ }
556
+
557
+ // src/hooks/useNotifications.ts
558
+
559
+ function useNotifications(userId, lastReadAnnouncementAt) {
560
+ const client = useOrjokClient();
561
+ const queryClient = _reactquery.useQueryClient.call(void 0, );
562
+ const announcementsQuery = _reactquery.useQuery.call(void 0, {
563
+ queryKey: ["notifications-announcements"],
564
+ queryFn: async () => {
565
+ const result = await client.notifications.listAnnouncements(50);
566
+ return result.items || [];
567
+ },
568
+ enabled: Boolean(userId),
569
+ refetchInterval: 3e4
570
+ // Poll every 30s
571
+ });
572
+ const userNotificationsQuery = _reactquery.useQuery.call(void 0, {
573
+ queryKey: ["notifications-user", userId],
574
+ queryFn: async () => {
575
+ if (!userId) return [];
576
+ const result = await client.notifications.listUserNotifications(userId, 50);
577
+ return result.items || [];
578
+ },
579
+ enabled: Boolean(userId),
580
+ refetchInterval: 3e4
581
+ });
582
+ const announcements = _nullishCoalesce(announcementsQuery.data, () => ( []));
583
+ const userNotifications = _nullishCoalesce(userNotificationsQuery.data, () => ( []));
584
+ const timeline = _chunkODXD2WJNcjs.mergeNotificationTimeline.call(void 0, {
585
+ announcements,
586
+ userNotifications,
587
+ lastReadAnnouncementAt
588
+ });
589
+ const unreadCount = _chunkODXD2WJNcjs.calculateUnreadCount.call(void 0, {
590
+ announcements,
591
+ userNotifications,
592
+ lastReadAnnouncementAt
593
+ });
594
+ const markAsReadMutation = _reactquery.useMutation.call(void 0, {
595
+ mutationFn: (id) => client.notifications.markNotificationAsRead(id),
596
+ onSuccess: () => {
597
+ queryClient.invalidateQueries({ queryKey: ["notifications-user", userId] });
598
+ }
599
+ });
600
+ const deleteAnnouncementMutation = _reactquery.useMutation.call(void 0, {
601
+ mutationFn: (id) => client.notifications.deleteAnnouncement(id),
602
+ onSuccess: () => {
603
+ queryClient.invalidateQueries({ queryKey: ["notifications-announcements"] });
604
+ }
605
+ });
606
+ const deleteUserNotificationMutation = _reactquery.useMutation.call(void 0, {
607
+ mutationFn: (id) => client.notifications.deleteUserNotification(id),
608
+ onSuccess: () => {
609
+ queryClient.invalidateQueries({ queryKey: ["notifications-user", userId] });
610
+ }
611
+ });
612
+ return {
613
+ announcements,
614
+ userNotifications,
615
+ timeline,
616
+ unreadCount,
617
+ isLoading: announcementsQuery.isLoading || Boolean(userId) && userNotificationsQuery.isLoading,
618
+ refetch: async () => {
619
+ await Promise.all([
620
+ announcementsQuery.refetch(),
621
+ userId ? userNotificationsQuery.refetch() : Promise.resolve()
622
+ ]);
623
+ },
624
+ markNotificationAsRead: async (id) => {
625
+ return markAsReadMutation.mutateAsync(id);
626
+ },
627
+ deleteAnnouncement: async (id) => {
628
+ return deleteAnnouncementMutation.mutateAsync(id);
629
+ },
630
+ deleteUserNotification: async (id) => {
631
+ return deleteUserNotificationMutation.mutateAsync(id);
632
+ }
633
+ };
634
+ }
635
+
636
+
637
+
491
638
 
492
639
 
493
640
 
@@ -502,5 +649,5 @@ function usePractice({
502
649
 
503
650
 
504
651
 
505
- exports.OrjokProvider = OrjokProvider; exports.useContest = useContest; exports.useContestsList = useContestsList; exports.useCourse = useCourse; exports.useCourseItems = useCourseItems; exports.useCourseLiveExams = useCourseLiveExams; exports.useCurriculum = useCurriculum; exports.useMediaUrl = useMediaUrl; exports.useOrjokClient = useOrjokClient; exports.usePackDetail = usePackDetail; exports.usePacks = usePacks; exports.usePractice = usePractice; exports.useProgress = useProgress; exports.useQuestions = useQuestions;
652
+ exports.OrjokProvider = OrjokProvider; exports.useAvailablePublicExams = useAvailablePublicExams; exports.useContest = useContest; exports.useContestsList = useContestsList; exports.useCourse = useCourse; exports.useCourseItems = useCourseItems; exports.useCourseLiveExams = useCourseLiveExams; exports.useCurriculum = useCurriculum; exports.useMediaUrl = useMediaUrl; exports.useNotifications = useNotifications; exports.useOrjokClient = useOrjokClient; exports.usePackDetail = usePackDetail; exports.usePacks = usePacks; exports.usePractice = usePractice; exports.useProgress = useProgress; exports.useQuestions = useQuestions;
506
653
  //# sourceMappingURL=hooks.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/orjok/orjok/packages/commons/dist/hooks.cjs","../src/hooks/useOrjokClient.ts","../src/hooks/useMediaUrl.ts","../src/hooks/useCurriculum.ts","../src/hooks/useQuestions.ts","../src/hooks/usePacks.ts","../src/hooks/useContest.ts","../src/hooks/useCourse.ts","../src/hooks/useProgress.ts","../src/hooks/usePractice.ts"],"names":["useQuery"],"mappings":"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","file":"/home/runner/work/orjok/orjok/packages/commons/dist/hooks.cjs","sourcesContent":[null,"import { createContext, useContext } from \"react\";\nimport type { OrjokClient } from \"../client\";\n\nconst OrjokContext = createContext<OrjokClient | null>(null);\n\nexport const OrjokProvider = OrjokContext.Provider;\n\nexport function useOrjokClient(): OrjokClient {\n const client = useContext(OrjokContext);\n if (!client) {\n throw new Error(\"useOrjokClient must be used within an OrjokProvider\");\n }\n return client;\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useOrjokClient } from \"./useOrjokClient\";\nimport { isStorageKey, resolveMediaUrl } from \"../logic/media-url\";\n\nexport function useMediaUrl(key: string | null | undefined): {\n url: string | null;\n isLoading: boolean;\n} {\n const client = useOrjokClient();\n\n const isResolvable = Boolean(key && isStorageKey(key));\n\n const query = useQuery({\n queryKey: [\"media-url\", key],\n queryFn: async () => {\n if (!key) return null;\n return resolveMediaUrl(key, client.storage);\n },\n enabled: isResolvable,\n staleTime: 50 * 60 * 1000, // 50 mins\n });\n\n if (!key) {\n return { url: null, isLoading: false };\n }\n\n if (!isStorageKey(key)) {\n return { url: key, isLoading: false };\n }\n\n return {\n url: query.data ?? null,\n isLoading: query.isLoading,\n };\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useOrjokClient } from \"./useOrjokClient\";\nimport type { Subject, Chapter, Topic } from \"../types/models\";\n\nexport interface UseCurriculumParams {\n level?: string;\n subjectId?: string;\n chapterId?: string;\n}\n\nexport function useCurriculum({ level, subjectId, chapterId }: UseCurriculumParams = {}): {\n subjects: Subject[];\n chapters: Chapter[];\n topics: Topic[];\n isLoadingSubjects: boolean;\n isLoadingChapters: boolean;\n isLoadingTopics: boolean;\n} {\n const client = useOrjokClient();\n\n const subjectsQuery = useQuery({\n queryKey: [\"curriculum-subjects\", level],\n queryFn: () => (level ? client.curriculum.getSubjects(level) : Promise.resolve([])),\n enabled: Boolean(level),\n });\n\n const chaptersQuery = useQuery({\n queryKey: [\"curriculum-chapters\", subjectId],\n queryFn: () => (subjectId ? client.curriculum.getChapters(subjectId) : Promise.resolve([])),\n enabled: Boolean(subjectId),\n });\n\n const topicsQuery = useQuery({\n queryKey: [\"curriculum-topics\", chapterId],\n queryFn: () => (chapterId ? client.curriculum.getTopics(chapterId) : Promise.resolve([])),\n enabled: Boolean(chapterId),\n });\n\n return {\n subjects: subjectsQuery.data ?? [],\n chapters: chaptersQuery.data ?? [],\n topics: topicsQuery.data ?? [],\n isLoadingSubjects: subjectsQuery.isLoading,\n isLoadingChapters: chaptersQuery.isLoading,\n isLoadingTopics: topicsQuery.isLoading,\n };\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useOrjokClient } from \"./useOrjokClient\";\nimport type { QuestionObject } from \"../types/models\";\nimport type { Difficulty, Language } from \"../types/enums\";\n\nexport interface UseQuestionsParams {\n subjectId?: string;\n chapterId?: string;\n topicId?: string;\n language?: Language | \"All\";\n difficulty?: Difficulty | \"All\";\n limit?: number;\n nextToken?: string | null;\n}\n\nexport function useQuestions({\n subjectId,\n chapterId,\n topicId,\n language,\n difficulty,\n limit = 20,\n nextToken,\n}: UseQuestionsParams = {}): {\n questions: QuestionObject[];\n nextToken: string | null;\n isLoading: boolean;\n refetch: () => Promise<unknown>;\n} {\n const client = useOrjokClient();\n\n const lang = language === \"All\" ? undefined : language;\n const diff = difficulty === \"All\" ? undefined : difficulty;\n\n const query = useQuery({\n queryKey: [\"questions\", { subjectId, chapterId, topicId, language, difficulty, limit, nextToken }],\n queryFn: async () => {\n if (topicId) {\n return client.questions.listByTopic({ id: topicId, language: lang, difficulty: diff, limit, nextToken: nextToken || undefined });\n }\n if (chapterId) {\n return client.questions.listByChapter({ id: chapterId, language: lang, difficulty: diff, limit, nextToken: nextToken || undefined });\n }\n if (subjectId) {\n return client.questions.listBySubject({ id: subjectId, language: lang, difficulty: diff, limit, nextToken: nextToken || undefined });\n }\n return { items: [], nextToken: null };\n },\n enabled: Boolean(subjectId || chapterId || topicId),\n });\n\n return {\n questions: query.data?.items ?? [],\n nextToken: query.data?.nextToken ?? null,\n isLoading: query.isLoading,\n refetch: query.refetch,\n };\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useOrjokClient } from \"./useOrjokClient\";\nimport type { Pack, QuestionObject } from \"../types/models\";\nimport type { Difficulty, Language } from \"../types/enums\";\n\nexport interface UsePacksParams {\n subjectId?: string;\n chapterId?: string;\n topicId?: string;\n language?: Language | \"All\";\n difficulty?: Difficulty | \"All\";\n limit?: number;\n nextToken?: string | null;\n}\n\nexport function usePacks({\n subjectId,\n chapterId,\n topicId,\n language,\n difficulty,\n limit = 20,\n nextToken,\n}: UsePacksParams = {}): {\n packs: Pack[];\n nextToken: string | null;\n isLoading: boolean;\n refetch: () => Promise<unknown>;\n} {\n const client = useOrjokClient();\n\n const lang = language === \"All\" ? undefined : language;\n const diff = difficulty === \"All\" ? undefined : difficulty;\n\n const query = useQuery({\n queryKey: [\"packs\", { subjectId, chapterId, topicId, language, difficulty, limit, nextToken }],\n queryFn: async () => {\n if (topicId) {\n return client.packs.listByTopic({ id: topicId, language: lang, difficulty: diff, limit, nextToken: nextToken || undefined });\n }\n if (chapterId) {\n return client.packs.listByChapter({ id: chapterId, language: lang, difficulty: diff, limit, nextToken: nextToken || undefined });\n }\n if (subjectId) {\n return client.packs.listBySubject({ id: subjectId, language: lang, difficulty: diff, limit, nextToken: nextToken || undefined });\n }\n return { items: [], nextToken: null };\n },\n enabled: Boolean(subjectId || chapterId || topicId),\n });\n\n return {\n packs: query.data?.items ?? [],\n nextToken: query.data?.nextToken ?? null,\n isLoading: query.isLoading,\n refetch: query.refetch,\n };\n}\n\nexport function usePackDetail(packId: string | undefined): {\n pack: Pack | null;\n questions: QuestionObject[];\n isLoading: boolean;\n refetch: () => Promise<unknown>;\n} {\n const client = useOrjokClient();\n\n const query = useQuery({\n queryKey: [\"pack-detail\", packId],\n queryFn: async () => {\n if (!packId) return null;\n return client.packs.getFull(packId);\n },\n enabled: Boolean(packId),\n });\n\n return {\n pack: query.data ?? null,\n questions: query.data?.questions?.items ?? [],\n isLoading: query.isLoading,\n refetch: query.refetch,\n };\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useOrjokClient } from \"./useOrjokClient\";\nimport type { Contest } from \"../types/models\";\nimport type { CheckParticipationResponse } from \"../types/responses\";\n\nexport function useContest(contestId: string | undefined, checkParticipation: boolean = false): {\n contest: Contest | null;\n participation: CheckParticipationResponse | null;\n isLoading: boolean;\n refetch: () => Promise<unknown>;\n} {\n const client = useOrjokClient();\n\n const contestQuery = useQuery({\n queryKey: [\"contest\", contestId],\n queryFn: async () => {\n if (!contestId) return null;\n return client.contests.get(contestId);\n },\n enabled: Boolean(contestId),\n });\n\n const partQuery = useQuery({\n queryKey: [\"contest-participation\", contestId],\n queryFn: async () => {\n if (!contestId || !checkParticipation) return null;\n return client.contests.checkParticipation(contestId);\n },\n enabled: Boolean(contestId && checkParticipation),\n });\n\n return {\n contest: contestQuery.data ?? null,\n participation: partQuery.data ?? null,\n isLoading: contestQuery.isLoading || (checkParticipation && partQuery.isLoading),\n refetch: async () => {\n await Promise.all([contestQuery.refetch(), partQuery.refetch()]);\n },\n };\n}\n\nexport function useContestsList({ level, nextToken }: { level?: string; nextToken?: string } = {}): {\n contests: Contest[];\n nextToken: string | null;\n isLoading: boolean;\n refetch: () => Promise<unknown>;\n} {\n const client = useOrjokClient();\n\n const query = useQuery({\n queryKey: [\"contests-list\", level, nextToken],\n queryFn: () => client.contests.list(nextToken, level),\n });\n\n return {\n contests: query.data?.items ?? [],\n nextToken: query.data?.nextToken ?? null,\n isLoading: query.isLoading,\n refetch: query.refetch,\n };\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useOrjokClient } from \"./useOrjokClient\";\nimport type { Course, CourseItem, CourseLiveExam } from \"../types/models\";\n\nexport function useCourse(courseId: string | undefined): {\n course: Course | null;\n isLoading: boolean;\n refetch: () => Promise<unknown>;\n} {\n const client = useOrjokClient();\n\n const query = useQuery({\n queryKey: [\"course\", courseId],\n queryFn: async () => {\n if (!courseId) return null;\n return client.courses.get(courseId);\n },\n enabled: Boolean(courseId),\n });\n\n return {\n course: query.data ?? null,\n isLoading: query.isLoading,\n refetch: query.refetch,\n };\n}\n\nexport function useCourseItems(courseId: string | undefined): {\n items: CourseItem[];\n isLoading: boolean;\n refetch: () => Promise<unknown>;\n} {\n const client = useOrjokClient();\n\n const query = useQuery({\n queryKey: [\"course-items\", courseId],\n queryFn: async () => {\n if (!courseId) return [];\n return client.courses.getItems(courseId);\n },\n enabled: Boolean(courseId),\n });\n\n return {\n items: query.data ?? [],\n isLoading: query.isLoading,\n refetch: query.refetch,\n };\n}\n\nexport function useCourseLiveExams(courseId: string | undefined): {\n exams: CourseLiveExam[];\n isLoading: boolean;\n refetch: () => Promise<unknown>;\n} {\n const client = useOrjokClient();\n\n const query = useQuery({\n queryKey: [\"course-live-exams\", courseId],\n queryFn: async () => {\n if (!courseId) return { items: [], nextToken: null };\n return client.courses.getLiveExams(courseId);\n },\n enabled: Boolean(courseId),\n });\n\n return {\n exams: query.data?.items ?? [],\n isLoading: query.isLoading,\n refetch: query.refetch,\n };\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useOrjokClient } from \"./useOrjokClient\";\nimport type { UserSubjectProgress, UserChapterProgress, UserTopicProgress } from \"../types/models\";\nimport { aggregateSubjectMetrics, type PracticeMetrics } from \"../logic/practice\";\n\nexport function useProgress(userId: string | undefined): {\n subjectsProgress: UserSubjectProgress[];\n chaptersProgress: UserChapterProgress[];\n topicsProgress: UserTopicProgress[];\n metrics: PracticeMetrics;\n isLoading: boolean;\n refetch: () => Promise<unknown>;\n} {\n const client = useOrjokClient();\n\n const subjectsQuery = useQuery({\n queryKey: [\"user-subject-progress\", userId],\n queryFn: () => (userId ? client.progress.getSubjectProgress(userId) : Promise.resolve([])),\n enabled: Boolean(userId),\n });\n\n const chaptersQuery = useQuery({\n queryKey: [\"user-chapter-progress\", userId],\n queryFn: () => (userId ? client.progress.getChapterProgress(userId) : Promise.resolve([])),\n enabled: Boolean(userId),\n });\n\n const topicsQuery = useQuery({\n queryKey: [\"user-topic-progress\", userId],\n queryFn: () => (userId ? client.progress.getTopicProgress(userId) : Promise.resolve([])),\n enabled: Boolean(userId),\n });\n\n const subjectsProgress = subjectsQuery.data ?? [];\n const chaptersProgress = chaptersQuery.data ?? [];\n const topicsProgress = topicsQuery.data ?? [];\n\n const metrics = aggregateSubjectMetrics(subjectsProgress);\n\n return {\n subjectsProgress,\n chaptersProgress,\n topicsProgress,\n metrics,\n isLoading: subjectsQuery.isLoading || chaptersQuery.isLoading || topicsQuery.isLoading,\n refetch: async () => {\n await Promise.all([\n subjectsQuery.refetch(),\n chaptersQuery.refetch(),\n topicsQuery.refetch(),\n ]);\n },\n };\n}\n","import { useState, useCallback } from \"react\";\nimport { useOrjokClient } from \"./useOrjokClient\";\nimport type { QuestionObject } from \"../types/models\";\nimport { isLanguageMatch, isDifficultyMatch, isValidMCQ } from \"../logic/practice\";\nimport { shuffle } from \"../utils/shuffle\";\n\nexport type PracticeMode = \"setup\" | \"practice\" | \"summary\";\n\nexport interface ItemBounds {\n id: string;\n type: \"topic\" | \"chapter\" | \"subject\";\n}\n\nexport interface UsePracticeProps {\n subjectId?: string;\n chapterIds?: string[];\n topicIds?: string[];\n language?: string;\n difficulty?: string;\n userId?: string;\n isCreator?: boolean;\n}\n\nexport function usePractice({\n subjectId,\n chapterIds = [],\n topicIds = [],\n language = \"Bangla\",\n difficulty = \"All\",\n userId,\n isCreator,\n}: UsePracticeProps = {}) {\n const client = useOrjokClient();\n\n const [mode, setMode] = useState<PracticeMode>(\"setup\");\n const [questions, setQuestions] = useState<QuestionObject[]>([]);\n const [currentIdx, setCurrentIdx] = useState<number>(0);\n const [selectedOption, setSelectedOption] = useState<string | null>(null);\n const [isAnswered, setIsAnswered] = useState<boolean>(false);\n const [isCorrect, setIsCorrect] = useState<boolean | null>(null);\n const [score, setScore] = useState<number>(0);\n const [totalPracticed, setTotalPracticed] = useState<number>(0);\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [isValidating, setIsValidating] = useState<boolean>(false);\n\n const fetchQuestionsPool = useCallback(async (): Promise<QuestionObject[]> => {\n const bounds: ItemBounds[] = [];\n if (topicIds.length > 0) {\n topicIds.forEach((tId) => bounds.push({ id: tId, type: \"topic\" }));\n } else if (chapterIds.length > 0) {\n chapterIds.forEach((cId) => bounds.push({ id: cId, type: \"chapter\" }));\n } else if (subjectId) {\n bounds.push({ id: subjectId, type: \"subject\" });\n }\n\n if (bounds.length === 0) return [];\n\n const queries = bounds.map(async (b) => {\n try {\n if (b.type === \"topic\") {\n return await client.questions.listByTopic({ id: b.id, limit: 50 });\n } else if (b.type === \"chapter\") {\n return await client.questions.listByChapter({ id: b.id, limit: 50 });\n } else {\n return await client.questions.listBySubject({ id: b.id, limit: 50 });\n }\n } catch (e) {\n console.error(\"Error fetching bounds query in practice:\", b, e);\n return { items: [] };\n }\n });\n\n const results = await Promise.all(queries);\n const uniqueMap = new Map<string, QuestionObject>();\n\n results.forEach((r) => {\n (r.items || []).forEach((q) => {\n if (q && q.id && !uniqueMap.has(q.id)) {\n uniqueMap.set(q.id, q);\n }\n });\n });\n\n let list = Array.from(uniqueMap.values()).filter((q) => {\n if (!isLanguageMatch(q.language, language)) return false;\n if (!isDifficultyMatch(q.difficulty, difficulty)) return false;\n return true;\n });\n\n // Fallback to parent subject if fewer than 5 matching questions\n if (list.length < 5 && subjectId && bounds.some((b) => b.type !== \"subject\")) {\n try {\n const subRes = await client.questions.listBySubject({ id: subjectId, limit: 50 });\n (subRes.items || []).forEach((q) => {\n if (q && q.id && !uniqueMap.has(q.id)) {\n if (isLanguageMatch(q.language, language) && isDifficultyMatch(q.difficulty, difficulty)) {\n list.push(q);\n uniqueMap.set(q.id, q);\n }\n }\n });\n } catch (e) {\n console.error(\"Error fetching subject fallback in practice:\", e);\n }\n }\n\n return list.filter(isValidMCQ);\n }, [client, subjectId, chapterIds, topicIds, language, difficulty]);\n\n const startPractice = useCallback(async () => {\n setIsLoading(true);\n setMode(\"practice\");\n setCurrentIdx(0);\n setScore(0);\n setTotalPracticed(0);\n setSelectedOption(null);\n setIsAnswered(false);\n setIsCorrect(null);\n\n try {\n const fetched = await fetchQuestionsPool();\n setQuestions(shuffle(fetched));\n } catch (e) {\n console.error(\"Error starting practice:\", e);\n setQuestions([]);\n } finally {\n setIsLoading(false);\n }\n }, [fetchQuestionsPool]);\n\n const selectOption = useCallback(\n async (optionId: string) => {\n if (isAnswered || isValidating || questions.length === 0) return;\n setSelectedOption(optionId);\n setIsValidating(true);\n const currentQ = questions[currentIdx];\n if (!currentQ) {\n setIsValidating(false);\n return;\n }\n\n try {\n const fullQ = await client.questions.get(currentQ.id);\n const ansVal = fullQ?.answer;\n const rawOpts = currentQ.options as unknown;\n const optsList = Array.isArray(rawOpts)\n ? rawOpts\n : (rawOpts && typeof rawOpts === \"object\" && Array.isArray((rawOpts as { items?: unknown[] }).items))\n ? (rawOpts as { items: Array<{ id?: string; content?: string }> }).items\n : [];\n\n const chosenOpt = optsList.find((o) => o?.id === optionId);\n const correct = Boolean(\n ansVal && (ansVal === optionId || (chosenOpt && ansVal === chosenOpt.content))\n );\n\n setIsCorrect(correct);\n setIsAnswered(true);\n setTotalPracticed((prev) => prev + 1);\n if (correct) setScore((prev) => prev + 1);\n\n if (userId && isCreator) {\n void client.progress\n .track({\n questionId: currentQ.id,\n isCorrect: correct,\n subjectId: currentQ.subjectId || subjectId,\n chapterId: currentQ.chapterId || (chapterIds.length === 1 ? chapterIds[0] : undefined),\n topicId: currentQ.topicId || (topicIds.length === 1 ? topicIds[0] : undefined),\n })\n .catch((e) => console.error(\"Tracking practice progress error:\", e));\n }\n } catch (err) {\n console.error(\"Error validating option in practice:\", err);\n } finally {\n setIsValidating(false);\n }\n },\n [client, isAnswered, isValidating, questions, currentIdx, userId, isCreator, subjectId, chapterIds, topicIds]\n );\n\n const nextQuestion = useCallback(() => {\n if (questions.length === 0) return;\n if (currentIdx + 1 < questions.length) {\n setCurrentIdx((prev) => prev + 1);\n setSelectedOption(null);\n setIsAnswered(false);\n setIsCorrect(null);\n } else {\n // Seamless reshuffle and continue\n setQuestions((prev) => shuffle(prev));\n setCurrentIdx(0);\n setSelectedOption(null);\n setIsAnswered(false);\n setIsCorrect(null);\n }\n }, [questions.length, currentIdx]);\n\n const finishPractice = useCallback(() => {\n setMode(\"summary\");\n }, []);\n\n const resetPractice = useCallback(() => {\n setMode(\"setup\");\n setQuestions([]);\n setCurrentIdx(0);\n setScore(0);\n setTotalPracticed(0);\n setSelectedOption(null);\n setIsAnswered(false);\n setIsCorrect(null);\n }, []);\n\n const accuracy = totalPracticed > 0 ? Math.round((score / totalPracticed) * 100) : 0;\n\n return {\n mode,\n questions,\n currentIdx,\n currentQuestion: questions[currentIdx] ?? null,\n selectedOption,\n isAnswered,\n isCorrect,\n score,\n totalPracticed,\n accuracy,\n isLoading,\n isValidating,\n startPractice,\n selectOption,\n nextQuestion,\n finishPractice,\n resetPractice,\n };\n}\n"]}
1
+ {"version":3,"sources":["/home/runner/work/orjok/orjok/packages/commons/dist/hooks.cjs","../src/hooks/useOrjokClient.ts","../src/hooks/useMediaUrl.ts","../src/hooks/useCurriculum.ts","../src/hooks/useQuestions.ts","../src/hooks/usePacks.ts","../src/hooks/useContest.ts","../src/hooks/useCourse.ts","../src/hooks/useProgress.ts","../src/hooks/usePractice.ts","../src/hooks/useAvailablePublicExams.ts","../src/hooks/useNotifications.ts"],"names":["useQuery"],"mappings":"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","file":"/home/runner/work/orjok/orjok/packages/commons/dist/hooks.cjs","sourcesContent":[null,"import { createContext, useContext } from \"react\";\nimport type { OrjokClient } from \"../client\";\n\nconst OrjokContext = createContext<OrjokClient | null>(null);\n\nexport const OrjokProvider = OrjokContext.Provider;\n\nexport function useOrjokClient(): OrjokClient {\n const client = useContext(OrjokContext);\n if (!client) {\n throw new Error(\"useOrjokClient must be used within an OrjokProvider\");\n }\n return client;\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useOrjokClient } from \"./useOrjokClient\";\nimport { isStorageKey, resolveMediaUrl } from \"../logic/media-url\";\n\nexport function useMediaUrl(key: string | null | undefined): {\n url: string | null;\n isLoading: boolean;\n} {\n const client = useOrjokClient();\n\n const isResolvable = Boolean(key && isStorageKey(key));\n\n const query = useQuery({\n queryKey: [\"media-url\", key],\n queryFn: async () => {\n if (!key) return null;\n return resolveMediaUrl(key, client.storage);\n },\n enabled: isResolvable,\n staleTime: 50 * 60 * 1000, // 50 mins\n });\n\n if (!key) {\n return { url: null, isLoading: false };\n }\n\n if (!isStorageKey(key)) {\n return { url: key, isLoading: false };\n }\n\n return {\n url: query.data ?? null,\n isLoading: query.isLoading,\n };\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useOrjokClient } from \"./useOrjokClient\";\nimport type { Subject, Chapter, Topic } from \"../types/models\";\n\nexport interface UseCurriculumParams {\n level?: string;\n subjectId?: string;\n chapterId?: string;\n}\n\nexport function useCurriculum({ level, subjectId, chapterId }: UseCurriculumParams = {}): {\n subjects: Subject[];\n chapters: Chapter[];\n topics: Topic[];\n isLoadingSubjects: boolean;\n isLoadingChapters: boolean;\n isLoadingTopics: boolean;\n} {\n const client = useOrjokClient();\n\n const subjectsQuery = useQuery({\n queryKey: [\"curriculum-subjects\", level],\n queryFn: () => (level ? client.curriculum.getSubjects(level) : Promise.resolve([])),\n enabled: Boolean(level),\n });\n\n const chaptersQuery = useQuery({\n queryKey: [\"curriculum-chapters\", subjectId],\n queryFn: () => (subjectId ? client.curriculum.getChapters(subjectId) : Promise.resolve([])),\n enabled: Boolean(subjectId),\n });\n\n const topicsQuery = useQuery({\n queryKey: [\"curriculum-topics\", chapterId],\n queryFn: () => (chapterId ? client.curriculum.getTopics(chapterId) : Promise.resolve([])),\n enabled: Boolean(chapterId),\n });\n\n return {\n subjects: subjectsQuery.data ?? [],\n chapters: chaptersQuery.data ?? [],\n topics: topicsQuery.data ?? [],\n isLoadingSubjects: subjectsQuery.isLoading,\n isLoadingChapters: chaptersQuery.isLoading,\n isLoadingTopics: topicsQuery.isLoading,\n };\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useOrjokClient } from \"./useOrjokClient\";\nimport type { QuestionObject } from \"../types/models\";\nimport type { Difficulty, Language } from \"../types/enums\";\n\nexport interface UseQuestionsParams {\n subjectId?: string;\n chapterId?: string;\n topicId?: string;\n language?: Language | \"All\";\n difficulty?: Difficulty | \"All\";\n limit?: number;\n nextToken?: string | null;\n}\n\nexport function useQuestions({\n subjectId,\n chapterId,\n topicId,\n language,\n difficulty,\n limit = 20,\n nextToken,\n}: UseQuestionsParams = {}): {\n questions: QuestionObject[];\n nextToken: string | null;\n isLoading: boolean;\n refetch: () => Promise<unknown>;\n} {\n const client = useOrjokClient();\n\n const lang = language === \"All\" ? undefined : language;\n const diff = difficulty === \"All\" ? undefined : difficulty;\n\n const query = useQuery({\n queryKey: [\"questions\", { subjectId, chapterId, topicId, language, difficulty, limit, nextToken }],\n queryFn: async () => {\n if (topicId) {\n return client.questions.listByTopic({ id: topicId, language: lang, difficulty: diff, limit, nextToken: nextToken || undefined });\n }\n if (chapterId) {\n return client.questions.listByChapter({ id: chapterId, language: lang, difficulty: diff, limit, nextToken: nextToken || undefined });\n }\n if (subjectId) {\n return client.questions.listBySubject({ id: subjectId, language: lang, difficulty: diff, limit, nextToken: nextToken || undefined });\n }\n return { items: [], nextToken: null };\n },\n enabled: Boolean(subjectId || chapterId || topicId),\n });\n\n return {\n questions: query.data?.items ?? [],\n nextToken: query.data?.nextToken ?? null,\n isLoading: query.isLoading,\n refetch: query.refetch,\n };\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useOrjokClient } from \"./useOrjokClient\";\nimport type { Pack, QuestionObject } from \"../types/models\";\nimport type { Difficulty, Language } from \"../types/enums\";\n\nexport interface UsePacksParams {\n subjectId?: string;\n chapterId?: string;\n topicId?: string;\n language?: Language | \"All\";\n difficulty?: Difficulty | \"All\";\n limit?: number;\n nextToken?: string | null;\n}\n\nexport function usePacks({\n subjectId,\n chapterId,\n topicId,\n language,\n difficulty,\n limit = 20,\n nextToken,\n}: UsePacksParams = {}): {\n packs: Pack[];\n nextToken: string | null;\n isLoading: boolean;\n refetch: () => Promise<unknown>;\n} {\n const client = useOrjokClient();\n\n const lang = language === \"All\" ? undefined : language;\n const diff = difficulty === \"All\" ? undefined : difficulty;\n\n const query = useQuery({\n queryKey: [\"packs\", { subjectId, chapterId, topicId, language, difficulty, limit, nextToken }],\n queryFn: async () => {\n if (topicId) {\n return client.packs.listByTopic({ id: topicId, language: lang, difficulty: diff, limit, nextToken: nextToken || undefined });\n }\n if (chapterId) {\n return client.packs.listByChapter({ id: chapterId, language: lang, difficulty: diff, limit, nextToken: nextToken || undefined });\n }\n if (subjectId) {\n return client.packs.listBySubject({ id: subjectId, language: lang, difficulty: diff, limit, nextToken: nextToken || undefined });\n }\n return { items: [], nextToken: null };\n },\n enabled: Boolean(subjectId || chapterId || topicId),\n });\n\n return {\n packs: query.data?.items ?? [],\n nextToken: query.data?.nextToken ?? null,\n isLoading: query.isLoading,\n refetch: query.refetch,\n };\n}\n\nexport function usePackDetail(packId: string | undefined): {\n pack: Pack | null;\n questions: QuestionObject[];\n isLoading: boolean;\n refetch: () => Promise<unknown>;\n} {\n const client = useOrjokClient();\n\n const query = useQuery({\n queryKey: [\"pack-detail\", packId],\n queryFn: async () => {\n if (!packId) return null;\n return client.packs.getFull(packId);\n },\n enabled: Boolean(packId),\n });\n\n return {\n pack: query.data ?? null,\n questions: query.data?.questions?.items ?? [],\n isLoading: query.isLoading,\n refetch: query.refetch,\n };\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useOrjokClient } from \"./useOrjokClient\";\nimport type { Contest } from \"../types/models\";\nimport type { CheckParticipationResponse } from \"../types/responses\";\n\nexport function useContest(contestId: string | undefined, checkParticipation: boolean = false): {\n contest: Contest | null;\n participation: CheckParticipationResponse | null;\n isLoading: boolean;\n refetch: () => Promise<unknown>;\n} {\n const client = useOrjokClient();\n\n const contestQuery = useQuery({\n queryKey: [\"contest\", contestId],\n queryFn: async () => {\n if (!contestId) return null;\n return client.contests.get(contestId);\n },\n enabled: Boolean(contestId),\n });\n\n const partQuery = useQuery({\n queryKey: [\"contest-participation\", contestId],\n queryFn: async () => {\n if (!contestId || !checkParticipation) return null;\n return client.contests.checkParticipation(contestId);\n },\n enabled: Boolean(contestId && checkParticipation),\n });\n\n return {\n contest: contestQuery.data ?? null,\n participation: partQuery.data ?? null,\n isLoading: contestQuery.isLoading || (checkParticipation && partQuery.isLoading),\n refetch: async () => {\n await Promise.all([contestQuery.refetch(), partQuery.refetch()]);\n },\n };\n}\n\nexport function useContestsList({ level, nextToken }: { level?: string; nextToken?: string } = {}): {\n contests: Contest[];\n nextToken: string | null;\n isLoading: boolean;\n refetch: () => Promise<unknown>;\n} {\n const client = useOrjokClient();\n\n const query = useQuery({\n queryKey: [\"contests-list\", level, nextToken],\n queryFn: () => client.contests.list(nextToken, level),\n });\n\n return {\n contests: query.data?.items ?? [],\n nextToken: query.data?.nextToken ?? null,\n isLoading: query.isLoading,\n refetch: query.refetch,\n };\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useOrjokClient } from \"./useOrjokClient\";\nimport type { Course, CourseItem, CourseLiveExam } from \"../types/models\";\n\nexport function useCourse(courseId: string | undefined): {\n course: Course | null;\n isLoading: boolean;\n refetch: () => Promise<unknown>;\n} {\n const client = useOrjokClient();\n\n const query = useQuery({\n queryKey: [\"course\", courseId],\n queryFn: async () => {\n if (!courseId) return null;\n return client.courses.get(courseId);\n },\n enabled: Boolean(courseId),\n });\n\n return {\n course: query.data ?? null,\n isLoading: query.isLoading,\n refetch: query.refetch,\n };\n}\n\nexport function useCourseItems(courseId: string | undefined): {\n items: CourseItem[];\n isLoading: boolean;\n refetch: () => Promise<unknown>;\n} {\n const client = useOrjokClient();\n\n const query = useQuery({\n queryKey: [\"course-items\", courseId],\n queryFn: async () => {\n if (!courseId) return [];\n return client.courses.getItems(courseId);\n },\n enabled: Boolean(courseId),\n });\n\n return {\n items: query.data ?? [],\n isLoading: query.isLoading,\n refetch: query.refetch,\n };\n}\n\nexport function useCourseLiveExams(courseId: string | undefined): {\n exams: CourseLiveExam[];\n isLoading: boolean;\n refetch: () => Promise<unknown>;\n} {\n const client = useOrjokClient();\n\n const query = useQuery({\n queryKey: [\"course-live-exams\", courseId],\n queryFn: async () => {\n if (!courseId) return { items: [], nextToken: null };\n return client.courses.getLiveExams(courseId);\n },\n enabled: Boolean(courseId),\n });\n\n return {\n exams: query.data?.items ?? [],\n isLoading: query.isLoading,\n refetch: query.refetch,\n };\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useOrjokClient } from \"./useOrjokClient\";\nimport type { UserSubjectProgress, UserChapterProgress, UserTopicProgress } from \"../types/models\";\nimport { aggregateSubjectMetrics, type PracticeMetrics } from \"../logic/practice\";\n\nexport function useProgress(userId: string | undefined): {\n subjectsProgress: UserSubjectProgress[];\n chaptersProgress: UserChapterProgress[];\n topicsProgress: UserTopicProgress[];\n metrics: PracticeMetrics;\n isLoading: boolean;\n refetch: () => Promise<unknown>;\n} {\n const client = useOrjokClient();\n\n const subjectsQuery = useQuery({\n queryKey: [\"user-subject-progress\", userId],\n queryFn: () => (userId ? client.progress.getSubjectProgress(userId) : Promise.resolve([])),\n enabled: Boolean(userId),\n });\n\n const chaptersQuery = useQuery({\n queryKey: [\"user-chapter-progress\", userId],\n queryFn: () => (userId ? client.progress.getChapterProgress(userId) : Promise.resolve([])),\n enabled: Boolean(userId),\n });\n\n const topicsQuery = useQuery({\n queryKey: [\"user-topic-progress\", userId],\n queryFn: () => (userId ? client.progress.getTopicProgress(userId) : Promise.resolve([])),\n enabled: Boolean(userId),\n });\n\n const subjectsProgress = subjectsQuery.data ?? [];\n const chaptersProgress = chaptersQuery.data ?? [];\n const topicsProgress = topicsQuery.data ?? [];\n\n const metrics = aggregateSubjectMetrics(subjectsProgress);\n\n return {\n subjectsProgress,\n chaptersProgress,\n topicsProgress,\n metrics,\n isLoading: subjectsQuery.isLoading || chaptersQuery.isLoading || topicsQuery.isLoading,\n refetch: async () => {\n await Promise.all([\n subjectsQuery.refetch(),\n chaptersQuery.refetch(),\n topicsQuery.refetch(),\n ]);\n },\n };\n}\n","import { useState, useCallback } from \"react\";\nimport { useOrjokClient } from \"./useOrjokClient\";\nimport type { QuestionObject } from \"../types/models\";\nimport { isLanguageMatch, isDifficultyMatch, isValidMCQ } from \"../logic/practice\";\nimport { shuffle } from \"../utils/shuffle\";\n\nexport type PracticeMode = \"setup\" | \"practice\" | \"summary\";\n\nexport interface ItemBounds {\n id: string;\n type: \"topic\" | \"chapter\" | \"subject\";\n}\n\nexport interface UsePracticeProps {\n subjectId?: string;\n chapterIds?: string[];\n topicIds?: string[];\n language?: string;\n difficulty?: string;\n userId?: string;\n isCreator?: boolean;\n}\n\nexport function usePractice({\n subjectId,\n chapterIds = [],\n topicIds = [],\n language = \"Bangla\",\n difficulty = \"All\",\n userId,\n isCreator,\n}: UsePracticeProps = {}) {\n const client = useOrjokClient();\n\n const [mode, setMode] = useState<PracticeMode>(\"setup\");\n const [questions, setQuestions] = useState<QuestionObject[]>([]);\n const [currentIdx, setCurrentIdx] = useState<number>(0);\n const [selectedOption, setSelectedOption] = useState<string | null>(null);\n const [isAnswered, setIsAnswered] = useState<boolean>(false);\n const [isCorrect, setIsCorrect] = useState<boolean | null>(null);\n const [score, setScore] = useState<number>(0);\n const [totalPracticed, setTotalPracticed] = useState<number>(0);\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [isValidating, setIsValidating] = useState<boolean>(false);\n\n const fetchQuestionsPool = useCallback(async (): Promise<QuestionObject[]> => {\n const bounds: ItemBounds[] = [];\n if (topicIds.length > 0) {\n topicIds.forEach((tId) => bounds.push({ id: tId, type: \"topic\" }));\n } else if (chapterIds.length > 0) {\n chapterIds.forEach((cId) => bounds.push({ id: cId, type: \"chapter\" }));\n } else if (subjectId) {\n bounds.push({ id: subjectId, type: \"subject\" });\n }\n\n if (bounds.length === 0) return [];\n\n const queries = bounds.map(async (b) => {\n try {\n if (b.type === \"topic\") {\n return await client.questions.listByTopic({ id: b.id, limit: 50 });\n } else if (b.type === \"chapter\") {\n return await client.questions.listByChapter({ id: b.id, limit: 50 });\n } else {\n return await client.questions.listBySubject({ id: b.id, limit: 50 });\n }\n } catch (e) {\n console.error(\"Error fetching bounds query in practice:\", b, e);\n return { items: [] };\n }\n });\n\n const results = await Promise.all(queries);\n const uniqueMap = new Map<string, QuestionObject>();\n\n results.forEach((r) => {\n (r.items || []).forEach((q) => {\n if (q && q.id && !uniqueMap.has(q.id)) {\n uniqueMap.set(q.id, q);\n }\n });\n });\n\n let list = Array.from(uniqueMap.values()).filter((q) => {\n if (!isLanguageMatch(q.language, language)) return false;\n if (!isDifficultyMatch(q.difficulty, difficulty)) return false;\n return true;\n });\n\n // Fallback to parent subject if fewer than 5 matching questions\n if (list.length < 5 && subjectId && bounds.some((b) => b.type !== \"subject\")) {\n try {\n const subRes = await client.questions.listBySubject({ id: subjectId, limit: 50 });\n (subRes.items || []).forEach((q) => {\n if (q && q.id && !uniqueMap.has(q.id)) {\n if (isLanguageMatch(q.language, language) && isDifficultyMatch(q.difficulty, difficulty)) {\n list.push(q);\n uniqueMap.set(q.id, q);\n }\n }\n });\n } catch (e) {\n console.error(\"Error fetching subject fallback in practice:\", e);\n }\n }\n\n return list.filter(isValidMCQ);\n }, [client, subjectId, chapterIds, topicIds, language, difficulty]);\n\n const startPractice = useCallback(async () => {\n setIsLoading(true);\n setMode(\"practice\");\n setCurrentIdx(0);\n setScore(0);\n setTotalPracticed(0);\n setSelectedOption(null);\n setIsAnswered(false);\n setIsCorrect(null);\n\n try {\n const fetched = await fetchQuestionsPool();\n setQuestions(shuffle(fetched));\n } catch (e) {\n console.error(\"Error starting practice:\", e);\n setQuestions([]);\n } finally {\n setIsLoading(false);\n }\n }, [fetchQuestionsPool]);\n\n const selectOption = useCallback(\n async (optionId: string) => {\n if (isAnswered || isValidating || questions.length === 0) return;\n setSelectedOption(optionId);\n setIsValidating(true);\n const currentQ = questions[currentIdx];\n if (!currentQ) {\n setIsValidating(false);\n return;\n }\n\n try {\n const fullQ = await client.questions.get(currentQ.id);\n const ansVal = fullQ?.answer;\n const rawOpts = currentQ.options as unknown;\n const optsList = Array.isArray(rawOpts)\n ? rawOpts\n : (rawOpts && typeof rawOpts === \"object\" && Array.isArray((rawOpts as { items?: unknown[] }).items))\n ? (rawOpts as { items: Array<{ id?: string; content?: string }> }).items\n : [];\n\n const chosenOpt = optsList.find((o) => o?.id === optionId);\n const correct = Boolean(\n ansVal && (ansVal === optionId || (chosenOpt && ansVal === chosenOpt.content))\n );\n\n setIsCorrect(correct);\n setIsAnswered(true);\n setTotalPracticed((prev) => prev + 1);\n if (correct) setScore((prev) => prev + 1);\n\n if (userId && isCreator) {\n void client.progress\n .track({\n questionId: currentQ.id,\n isCorrect: correct,\n subjectId: currentQ.subjectId || subjectId,\n chapterId: currentQ.chapterId || (chapterIds.length === 1 ? chapterIds[0] : undefined),\n topicId: currentQ.topicId || (topicIds.length === 1 ? topicIds[0] : undefined),\n })\n .catch((e) => console.error(\"Tracking practice progress error:\", e));\n }\n } catch (err) {\n console.error(\"Error validating option in practice:\", err);\n } finally {\n setIsValidating(false);\n }\n },\n [client, isAnswered, isValidating, questions, currentIdx, userId, isCreator, subjectId, chapterIds, topicIds]\n );\n\n const nextQuestion = useCallback(() => {\n if (questions.length === 0) return;\n if (currentIdx + 1 < questions.length) {\n setCurrentIdx((prev) => prev + 1);\n setSelectedOption(null);\n setIsAnswered(false);\n setIsCorrect(null);\n } else {\n // Seamless reshuffle and continue\n setQuestions((prev) => shuffle(prev));\n setCurrentIdx(0);\n setSelectedOption(null);\n setIsAnswered(false);\n setIsCorrect(null);\n }\n }, [questions.length, currentIdx]);\n\n const finishPractice = useCallback(() => {\n setMode(\"summary\");\n }, []);\n\n const resetPractice = useCallback(() => {\n setMode(\"setup\");\n setQuestions([]);\n setCurrentIdx(0);\n setScore(0);\n setTotalPracticed(0);\n setSelectedOption(null);\n setIsAnswered(false);\n setIsCorrect(null);\n }, []);\n\n const accuracy = totalPracticed > 0 ? Math.round((score / totalPracticed) * 100) : 0;\n\n return {\n mode,\n questions,\n currentIdx,\n currentQuestion: questions[currentIdx] ?? null,\n selectedOption,\n isAnswered,\n isCorrect,\n score,\n totalPracticed,\n accuracy,\n isLoading,\n isValidating,\n startPractice,\n selectOption,\n nextQuestion,\n finishPractice,\n resetPractice,\n };\n}\n","import { useMemo } from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useOrjokClient } from \"./useOrjokClient\";\nimport { getPublicExamsByLevel, type PublicExamOption } from \"../types/select-options\";\n\nimport type { OrjokClient } from \"../client\";\n\nexport interface UseAvailablePublicExamsParams {\n level?: string | null;\n exploreType?: \"Question\" | \"Pack\";\n enabled?: boolean;\n client?: OrjokClient;\n}\n\n/**\n * Hook to dynamically filter public exams by querying the GSI for existing questions or packs.\n * Caches results via React Query to keep DynamoDB RCU negligible (< 9 RCUs per cold session, 0 RCU cached).\n * Can be disabled at any time by setting `enabled: false`.\n */\nexport function useAvailablePublicExams({\n level,\n exploreType = \"Question\",\n enabled = true,\n client: directClient,\n}: UseAvailablePublicExamsParams = {}): {\n availableExams: PublicExamOption[];\n isLoading: boolean;\n isSuccess: boolean;\n refetch: () => Promise<unknown>;\n} {\n let contextClient: OrjokClient | null = null;\n try {\n contextClient = useOrjokClient();\n } catch {\n // optional fallback if outside provider\n }\n const client = directClient ?? contextClient;\n\n const candidateExams = useMemo(() => getPublicExamsByLevel(level), [level]);\n\n const query = useQuery({\n queryKey: [\"availablePublicExams\", level, exploreType],\n queryFn: async (): Promise<PublicExamOption[]> => {\n if (!client || !level || candidateExams.length === 0) return candidateExams;\n\n const results = await Promise.all(\n candidateExams.map(async (exam) => {\n try {\n if (exploreType === \"Pack\") {\n const res = await client.packs.listByPublicExam({\n publicExam: exam.value,\n limit: 1,\n });\n return (res.items?.length ?? 0) > 0 ? exam : null;\n } else {\n const res = await client.questions.listByPublicExam({\n publicExam: exam.value,\n limit: 1,\n });\n return (res.items?.length ?? 0) > 0 ? exam : null;\n }\n } catch {\n return null;\n }\n })\n );\n\n return results.filter((e): e is PublicExamOption => e !== null);\n },\n enabled: Boolean(level) && enabled,\n staleTime: 10 * 60 * 1000,\n gcTime: 30 * 60 * 1000,\n });\n\n if (!enabled || !level) {\n return {\n availableExams: candidateExams,\n isLoading: false,\n isSuccess: true,\n refetch: async () => candidateExams,\n };\n }\n\n return {\n availableExams: query.data ?? [],\n isLoading: query.isLoading,\n isSuccess: query.isSuccess,\n refetch: query.refetch,\n };\n}\n","import { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { useOrjokClient } from \"./useOrjokClient\";\nimport type { Announcement, UserNotification } from \"../types/models\";\nimport {\n mergeNotificationTimeline,\n calculateUnreadCount,\n type NotificationTimelineItem,\n} from \"../logic/notification\";\n\nexport type { NotificationTimelineItem };\n\nexport interface UseNotificationsResult {\n announcements: Announcement[];\n userNotifications: UserNotification[];\n timeline: NotificationTimelineItem[];\n unreadCount: number;\n isLoading: boolean;\n refetch: () => Promise<unknown>;\n markNotificationAsRead: (id: string) => Promise<unknown>;\n deleteAnnouncement: (id: string) => Promise<unknown>;\n deleteUserNotification: (id: string) => Promise<unknown>;\n}\n\nexport function useNotifications(\n userId: string | null | undefined,\n lastReadAnnouncementAt?: string | null\n): UseNotificationsResult {\n const client = useOrjokClient();\n const queryClient = useQueryClient();\n\n const announcementsQuery = useQuery({\n queryKey: [\"notifications-announcements\"],\n queryFn: async () => {\n const result = await client.notifications.listAnnouncements(50);\n return result.items || [];\n },\n enabled: Boolean(userId),\n refetchInterval: 30000, // Poll every 30s\n });\n\n const userNotificationsQuery = useQuery({\n queryKey: [\"notifications-user\", userId],\n queryFn: async () => {\n if (!userId) return [];\n const result = await client.notifications.listUserNotifications(userId, 50);\n return result.items || [];\n },\n enabled: Boolean(userId),\n refetchInterval: 30000,\n });\n\n const announcements = announcementsQuery.data ?? [];\n const userNotifications = userNotificationsQuery.data ?? [];\n\n const timeline = mergeNotificationTimeline({\n announcements,\n userNotifications,\n lastReadAnnouncementAt,\n });\n\n const unreadCount = calculateUnreadCount({\n announcements,\n userNotifications,\n lastReadAnnouncementAt,\n });\n\n const markAsReadMutation = useMutation({\n mutationFn: (id: string) => client.notifications.markNotificationAsRead(id),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"notifications-user\", userId] });\n },\n });\n\n const deleteAnnouncementMutation = useMutation({\n mutationFn: (id: string) => client.notifications.deleteAnnouncement(id),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"notifications-announcements\"] });\n },\n });\n\n const deleteUserNotificationMutation = useMutation({\n mutationFn: (id: string) => client.notifications.deleteUserNotification(id),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"notifications-user\", userId] });\n },\n });\n\n return {\n announcements,\n userNotifications,\n timeline,\n unreadCount,\n isLoading: announcementsQuery.isLoading || (Boolean(userId) && userNotificationsQuery.isLoading),\n refetch: async () => {\n await Promise.all([\n announcementsQuery.refetch(),\n userId ? userNotificationsQuery.refetch() : Promise.resolve(),\n ]);\n },\n markNotificationAsRead: async (id: string) => {\n return markAsReadMutation.mutateAsync(id);\n },\n deleteAnnouncement: async (id: string) => {\n return deleteAnnouncementMutation.mutateAsync(id);\n },\n deleteUserNotification: async (id: string) => {\n return deleteUserNotificationMutation.mutateAsync(id);\n },\n };\n}\n"]}
package/dist/hooks.d.cts CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as react from 'react';
2
- import { O as OrjokClient, S as Subject, C as Chapter, T as Topic, L as Language, D as Difficulty, Q as QuestionObject, P as Pack, a as Contest, b as CheckParticipationResponse, c as Course, d as CourseItem, e as CourseLiveExam, U as UserSubjectProgress, f as UserChapterProgress, g as UserTopicProgress, h as PracticeMetrics } from './practice-QnWtC5A7.cjs';
3
- import './storage-DLqdJgQt.cjs';
2
+ import { O as OrjokClient, S as Subject, C as Chapter, T as Topic, L as Language, D as Difficulty, Q as QuestionObject, P as Pack, a as Contest, b as CheckParticipationResponse, c as Course, d as CourseItem, e as CourseLiveExam, U as UserSubjectProgress, f as UserChapterProgress, g as UserTopicProgress, h as PracticeMetrics, i as PublicExamOption, A as Announcement, j as UserNotification, N as NotificationTimelineItem } from './notification-Ctfy0m05.cjs';
3
+ import './storage-9pK8KwIM.cjs';
4
4
 
5
5
  declare const OrjokProvider: react.Provider<OrjokClient | null>;
6
6
  declare function useOrjokClient(): OrjokClient;
@@ -133,4 +133,35 @@ declare function usePractice({ subjectId, chapterIds, topicIds, language, diffic
133
133
  resetPractice: () => void;
134
134
  };
135
135
 
136
- export { OrjokProvider, useContest, useContestsList, useCourse, useCourseItems, useCourseLiveExams, useCurriculum, useMediaUrl, useOrjokClient, usePackDetail, usePacks, usePractice, useProgress, useQuestions };
136
+ interface UseAvailablePublicExamsParams {
137
+ level?: string | null;
138
+ exploreType?: "Question" | "Pack";
139
+ enabled?: boolean;
140
+ client?: OrjokClient;
141
+ }
142
+ /**
143
+ * Hook to dynamically filter public exams by querying the GSI for existing questions or packs.
144
+ * Caches results via React Query to keep DynamoDB RCU negligible (< 9 RCUs per cold session, 0 RCU cached).
145
+ * Can be disabled at any time by setting `enabled: false`.
146
+ */
147
+ declare function useAvailablePublicExams({ level, exploreType, enabled, client: directClient, }?: UseAvailablePublicExamsParams): {
148
+ availableExams: PublicExamOption[];
149
+ isLoading: boolean;
150
+ isSuccess: boolean;
151
+ refetch: () => Promise<unknown>;
152
+ };
153
+
154
+ interface UseNotificationsResult {
155
+ announcements: Announcement[];
156
+ userNotifications: UserNotification[];
157
+ timeline: NotificationTimelineItem[];
158
+ unreadCount: number;
159
+ isLoading: boolean;
160
+ refetch: () => Promise<unknown>;
161
+ markNotificationAsRead: (id: string) => Promise<unknown>;
162
+ deleteAnnouncement: (id: string) => Promise<unknown>;
163
+ deleteUserNotification: (id: string) => Promise<unknown>;
164
+ }
165
+ declare function useNotifications(userId: string | null | undefined, lastReadAnnouncementAt?: string | null): UseNotificationsResult;
166
+
167
+ export { NotificationTimelineItem, OrjokProvider, type UseNotificationsResult, useAvailablePublicExams, useContest, useContestsList, useCourse, useCourseItems, useCourseLiveExams, useCurriculum, useMediaUrl, useNotifications, useOrjokClient, usePackDetail, usePacks, usePractice, useProgress, useQuestions };
package/dist/hooks.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as react from 'react';
2
- import { O as OrjokClient, S as Subject, C as Chapter, T as Topic, L as Language, D as Difficulty, Q as QuestionObject, P as Pack, a as Contest, b as CheckParticipationResponse, c as Course, d as CourseItem, e as CourseLiveExam, U as UserSubjectProgress, f as UserChapterProgress, g as UserTopicProgress, h as PracticeMetrics } from './practice-Dh2Tv80G.js';
3
- import './storage-DLqdJgQt.js';
2
+ import { O as OrjokClient, S as Subject, C as Chapter, T as Topic, L as Language, D as Difficulty, Q as QuestionObject, P as Pack, a as Contest, b as CheckParticipationResponse, c as Course, d as CourseItem, e as CourseLiveExam, U as UserSubjectProgress, f as UserChapterProgress, g as UserTopicProgress, h as PracticeMetrics, i as PublicExamOption, A as Announcement, j as UserNotification, N as NotificationTimelineItem } from './notification-BoqtkNrc.js';
3
+ import './storage-9pK8KwIM.js';
4
4
 
5
5
  declare const OrjokProvider: react.Provider<OrjokClient | null>;
6
6
  declare function useOrjokClient(): OrjokClient;
@@ -133,4 +133,35 @@ declare function usePractice({ subjectId, chapterIds, topicIds, language, diffic
133
133
  resetPractice: () => void;
134
134
  };
135
135
 
136
- export { OrjokProvider, useContest, useContestsList, useCourse, useCourseItems, useCourseLiveExams, useCurriculum, useMediaUrl, useOrjokClient, usePackDetail, usePacks, usePractice, useProgress, useQuestions };
136
+ interface UseAvailablePublicExamsParams {
137
+ level?: string | null;
138
+ exploreType?: "Question" | "Pack";
139
+ enabled?: boolean;
140
+ client?: OrjokClient;
141
+ }
142
+ /**
143
+ * Hook to dynamically filter public exams by querying the GSI for existing questions or packs.
144
+ * Caches results via React Query to keep DynamoDB RCU negligible (< 9 RCUs per cold session, 0 RCU cached).
145
+ * Can be disabled at any time by setting `enabled: false`.
146
+ */
147
+ declare function useAvailablePublicExams({ level, exploreType, enabled, client: directClient, }?: UseAvailablePublicExamsParams): {
148
+ availableExams: PublicExamOption[];
149
+ isLoading: boolean;
150
+ isSuccess: boolean;
151
+ refetch: () => Promise<unknown>;
152
+ };
153
+
154
+ interface UseNotificationsResult {
155
+ announcements: Announcement[];
156
+ userNotifications: UserNotification[];
157
+ timeline: NotificationTimelineItem[];
158
+ unreadCount: number;
159
+ isLoading: boolean;
160
+ refetch: () => Promise<unknown>;
161
+ markNotificationAsRead: (id: string) => Promise<unknown>;
162
+ deleteAnnouncement: (id: string) => Promise<unknown>;
163
+ deleteUserNotification: (id: string) => Promise<unknown>;
164
+ }
165
+ declare function useNotifications(userId: string | null | undefined, lastReadAnnouncementAt?: string | null): UseNotificationsResult;
166
+
167
+ export { NotificationTimelineItem, OrjokProvider, type UseNotificationsResult, useAvailablePublicExams, useContest, useContestsList, useCourse, useCourseItems, useCourseLiveExams, useCurriculum, useMediaUrl, useNotifications, useOrjokClient, usePackDetail, usePacks, usePractice, useProgress, useQuestions };