From 65554ed4cefd2acc1b391fecb9cf43fb42be8520 Mon Sep 17 00:00:00 2001 From: Talal Sharabi Date: Sat, 14 Mar 2026 17:00:27 +0400 Subject: [PATCH] Remove all @firebase/util imports, replace uuidv4 with crypto.randomUUID - Create src/utils/uuid.ts utility using crypto.randomUUID() - Replace all uuidv4 imports from @firebase/util across 11 component files - Replace base64 import in paypal.ts with Buffer-based implementation Made-with: Cursor --- src/components/ExamEditor/Exercises/Blanks/Letters/index.tsx | 2 +- .../ExamEditor/Exercises/Blanks/MultipleChoice/index.tsx | 2 +- src/components/ExamEditor/Exercises/MatchSentences/index.tsx | 2 +- .../ExamEditor/Exercises/MultipleChoice/Underline/index.tsx | 2 +- .../ExamEditor/Exercises/MultipleChoice/Vanilla/index.tsx | 2 +- src/components/ExamEditor/Exercises/TrueFalse/index.tsx | 2 +- src/components/ExamEditor/Exercises/WriteBlanks/index.tsx | 2 +- src/components/ExamEditor/Exercises/WriteBlanksForm/index.tsx | 2 +- src/components/Medium/StatGridItem.tsx | 2 +- src/pages/record.tsx | 2 +- src/pages/training/index.tsx | 2 +- src/utils/paypal.ts | 2 +- src/utils/uuid.ts | 3 +++ 13 files changed, 15 insertions(+), 12 deletions(-) create mode 100644 src/utils/uuid.ts diff --git a/src/components/ExamEditor/Exercises/Blanks/Letters/index.tsx b/src/components/ExamEditor/Exercises/Blanks/Letters/index.tsx index 84deb369..0b4d95b0 100644 --- a/src/components/ExamEditor/Exercises/Blanks/Letters/index.tsx +++ b/src/components/ExamEditor/Exercises/Blanks/Letters/index.tsx @@ -13,7 +13,7 @@ import validateBlanks from "../validateBlanks"; import { toast } from "react-toastify"; import setEditingAlert from "../../Shared/setEditingAlert"; import PromptEdit from "../../Shared/PromptEdit"; -import { uuidv4 } from "@firebase/util"; +import { uuidv4 } from "@/utils/uuid"; interface Word { letter: string; diff --git a/src/components/ExamEditor/Exercises/Blanks/MultipleChoice/index.tsx b/src/components/ExamEditor/Exercises/Blanks/MultipleChoice/index.tsx index f954ddb2..394c62e5 100644 --- a/src/components/ExamEditor/Exercises/Blanks/MultipleChoice/index.tsx +++ b/src/components/ExamEditor/Exercises/Blanks/MultipleChoice/index.tsx @@ -11,7 +11,7 @@ import { toast } from "react-toastify"; import setEditingAlert from "../../Shared/setEditingAlert"; import { MdEdit, MdEditOff } from "react-icons/md"; import MCOption from "./MCOption"; -import { uuidv4 } from "@firebase/util"; +import { uuidv4 } from "@/utils/uuid"; const FillBlanksMC: React.FC<{ exercise: FillBlanksExercise; sectionId: number }> = ({ exercise, sectionId }) => { diff --git a/src/components/ExamEditor/Exercises/MatchSentences/index.tsx b/src/components/ExamEditor/Exercises/MatchSentences/index.tsx index a84f4655..cd2e7cb5 100644 --- a/src/components/ExamEditor/Exercises/MatchSentences/index.tsx +++ b/src/components/ExamEditor/Exercises/MatchSentences/index.tsx @@ -18,7 +18,7 @@ import { toast } from 'react-toastify'; import { DragEndEvent } from '@dnd-kit/core'; import { handleMatchSentencesReorder } from '@/stores/examEditor/reorder/local'; import PromptEdit from '../Shared/PromptEdit'; -import { uuidv4 } from '@firebase/util'; +import { uuidv4 } from '@/utils/uuid'; const MatchSentences: React.FC<{ exercise: MatchSentencesExercise, sectionId: number }> = ({ exercise, sectionId }) => { const { currentModule, dispatch } = useExamEditorStore(); diff --git a/src/components/ExamEditor/Exercises/MultipleChoice/Underline/index.tsx b/src/components/ExamEditor/Exercises/MultipleChoice/Underline/index.tsx index e483efba..391958e3 100644 --- a/src/components/ExamEditor/Exercises/MultipleChoice/Underline/index.tsx +++ b/src/components/ExamEditor/Exercises/MultipleChoice/Underline/index.tsx @@ -11,7 +11,7 @@ import { useCallback, useEffect, useState } from "react"; import { MdAdd } from "react-icons/md"; import Alert, { AlertItem } from "../../Shared/Alert"; import PromptEdit from "../../Shared/PromptEdit"; -import { uuidv4 } from "@firebase/util"; +import { uuidv4 } from "@/utils/uuid"; const UnderlineMultipleChoice: React.FC<{exercise: MultipleChoiceExercise, sectionId: number}> = ({ diff --git a/src/components/ExamEditor/Exercises/MultipleChoice/Vanilla/index.tsx b/src/components/ExamEditor/Exercises/MultipleChoice/Vanilla/index.tsx index 418f14c9..32f939e1 100644 --- a/src/components/ExamEditor/Exercises/MultipleChoice/Vanilla/index.tsx +++ b/src/components/ExamEditor/Exercises/MultipleChoice/Vanilla/index.tsx @@ -18,7 +18,7 @@ import SortableQuestion from '../../Shared/SortableQuestion'; import setEditingAlert from '../../Shared/setEditingAlert'; import { handleMultipleChoiceReorder } from '@/stores/examEditor/reorder/local'; import PromptEdit from '../../Shared/PromptEdit'; -import { uuidv4 } from '@firebase/util'; +import { uuidv4 } from '@/utils/uuid'; interface MultipleChoiceProps { exercise: MultipleChoiceExercise; diff --git a/src/components/ExamEditor/Exercises/TrueFalse/index.tsx b/src/components/ExamEditor/Exercises/TrueFalse/index.tsx index 02be1f5c..e666392f 100644 --- a/src/components/ExamEditor/Exercises/TrueFalse/index.tsx +++ b/src/components/ExamEditor/Exercises/TrueFalse/index.tsx @@ -16,7 +16,7 @@ import setEditingAlert from '../Shared/setEditingAlert'; import { DragEndEvent } from '@dnd-kit/core'; import { handleTrueFalseReorder } from '@/stores/examEditor/reorder/local'; import PromptEdit from '../Shared/PromptEdit'; -import { uuidv4 } from '@firebase/util'; +import { uuidv4 } from '@/utils/uuid'; const TrueFalse: React.FC<{ exercise: TrueFalseExercise, sectionId: number }> = ({ exercise, sectionId }) => { const { currentModule, dispatch } = useExamEditorStore(); diff --git a/src/components/ExamEditor/Exercises/WriteBlanks/index.tsx b/src/components/ExamEditor/Exercises/WriteBlanks/index.tsx index efe20346..813b6187 100644 --- a/src/components/ExamEditor/Exercises/WriteBlanks/index.tsx +++ b/src/components/ExamEditor/Exercises/WriteBlanks/index.tsx @@ -22,7 +22,7 @@ import { validateEmptySolutions, validateQuestionText, validateWordCount } from import { handleWriteBlanksReorder } from '@/stores/examEditor/reorder/local'; import { ParsedQuestion, parseText, reconstructText } from './parsing'; import PromptEdit from '../Shared/PromptEdit'; -import { uuidv4 } from '@firebase/util'; +import { uuidv4 } from '@/utils/uuid'; const WriteBlanks: React.FC<{ sectionId: number; exercise: WriteBlanksExercise; }> = ({ sectionId, exercise }) => { diff --git a/src/components/ExamEditor/Exercises/WriteBlanksForm/index.tsx b/src/components/ExamEditor/Exercises/WriteBlanksForm/index.tsx index eb884fbf..60d8eace 100644 --- a/src/components/ExamEditor/Exercises/WriteBlanksForm/index.tsx +++ b/src/components/ExamEditor/Exercises/WriteBlanksForm/index.tsx @@ -17,7 +17,7 @@ import { validateQuestions, validateEmptySolutions, validateWordCount } from "./ import Header from "../../Shared/Header"; import BlanksFormEditor from "./BlanksFormEditor"; import PromptEdit from "../Shared/PromptEdit"; -import { uuidv4 } from "@firebase/util"; +import { uuidv4 } from "@/utils/uuid"; const WriteBlanksForm: React.FC<{ sectionId: number; exercise: WriteBlanksExercise }> = ({ sectionId, exercise }) => { diff --git a/src/components/Medium/StatGridItem.tsx b/src/components/Medium/StatGridItem.tsx index fc89ae24..b93a7b79 100644 --- a/src/components/Medium/StatGridItem.tsx +++ b/src/components/Medium/StatGridItem.tsx @@ -7,7 +7,7 @@ import ai_usage from "@/utils/ai.detection"; import { calculateBandScore, getGradingLabel } from "@/utils/score"; import moment from "moment"; import { Assignment } from "@/interfaces/results"; -import { uuidv4 } from "@firebase/util"; +import { uuidv4 } from "@/utils/uuid"; import { useRouter } from "next/router"; import { uniqBy } from "lodash"; import { sortByModule } from "@/utils/moduleUtils"; diff --git a/src/pages/record.tsx b/src/pages/record.tsx index 90393abb..b8140db0 100644 --- a/src/pages/record.tsx +++ b/src/pages/record.tsx @@ -10,7 +10,7 @@ import moment from "moment"; import { ToastContainer } from "react-toastify"; import clsx from "clsx"; import { shouldRedirectHome } from "@/utils/navigation.disabled"; -import { uuidv4 } from "@firebase/util"; +import { uuidv4 } from "@/utils/uuid"; import { usePDFDownload } from "@/hooks/usePDFDownload"; import useRecordStore from "@/stores/recordStore"; import StatsGridItem from "@/components/Medium/StatGridItem"; diff --git a/src/pages/training/index.tsx b/src/pages/training/index.tsx index de03c539..6504a01b 100644 --- a/src/pages/training/index.tsx +++ b/src/pages/training/index.tsx @@ -14,7 +14,7 @@ import useTrainingContentStore from "@/stores/trainingContentStore"; import axios from "axios"; import { ITrainingContent } from "@/training/TrainingInterfaces"; import moment from "moment"; -import { uuidv4 } from "@firebase/util"; +import { uuidv4 } from "@/utils/uuid"; import TrainingScore from "@/training/TrainingScore"; import ModuleBadge from "@/components/ModuleBadge"; import RecordFilter from "@/components/Medium/RecordFilter"; diff --git a/src/utils/paypal.ts b/src/utils/paypal.ts index 8d47f302..666ecfc5 100644 --- a/src/utils/paypal.ts +++ b/src/utils/paypal.ts @@ -1,5 +1,5 @@ import {TokenError, TokenSuccess} from "@/interfaces/paypal"; -import {base64} from "@firebase/util"; +const base64 = { encodeString: (s: string) => Buffer.from(s).toString("base64") }; import axios from "axios"; export const getAccessToken = async () => { diff --git a/src/utils/uuid.ts b/src/utils/uuid.ts new file mode 100644 index 00000000..109f35f5 --- /dev/null +++ b/src/utils/uuid.ts @@ -0,0 +1,3 @@ +export function uuidv4(): string { + return crypto.randomUUID(); +}