diff --git a/src/components/Hack/HackActions.tsx b/src/components/Hack/HackActions.tsx index a7e3e30..2cf6aff 100644 --- a/src/components/Hack/HackActions.tsx +++ b/src/components/Hack/HackActions.tsx @@ -45,6 +45,7 @@ const HackActions: React.FC = ({ const [patchUrl, setPatchUrl] = React.useState(null); const [termsAgreed, setTermsAgreed] = React.useState(false); const [romErrorModal, setRomErrorModal] = React.useState(null); + const [isVerifyingRom, setIsVerifyingRom] = React.useState(false); const baseRomName = React.useMemo(() => baseRoms.find(r => r.id === baseRomId)?.name || null, [baseRomId]); const effectivePlatform = React.useMemo( () => platform ?? baseRoms.find(r => r.id === baseRomId)?.platform, @@ -142,39 +143,44 @@ const HackActions: React.FC = ({ return; } - const selectedHash = await sha1Hex(f); - const match = baseRoms.find((r) => r.sha1.toLowerCase() === selectedHash.toLowerCase()); - const requiredHash = baseRoms.find((r) => r.id === baseRomId)?.sha1.toLowerCase() ?? ""; + setIsVerifyingRom(true); + try { + const selectedHash = await sha1Hex(f); + const match = baseRoms.find((r) => r.sha1.toLowerCase() === selectedHash.toLowerCase()); + const requiredHash = baseRoms.find((r) => r.id === baseRomId)?.sha1.toLowerCase() ?? ""; - if (!match) { - setRomErrorModal({ - kind: "hash_mismatch", - fileName: f.name, - selectedHash, - requiredHash, - requiredRomName, - }); - resetInput(); - return; - } + if (!match) { + setRomErrorModal({ + kind: "hash_mismatch", + fileName: f.name, + selectedHash, + requiredHash, + requiredRomName, + }); + resetInput(); + return; + } + + if (match.id !== baseRomId) { + await importUploadedBlob(f); + setRomErrorModal({ + kind: "hash_mismatch", + fileName: f.name, + selectedHash, + requiredHash, + requiredRomName, + matchedRomName: match.name, + }); + resetInput(); + return; + } - if (match.id !== baseRomId) { await importUploadedBlob(f); - setRomErrorModal({ - kind: "hash_mismatch", - fileName: f.name, - selectedHash, - requiredHash, - requiredRomName, - matchedRomName: match.name, - }); - resetInput(); - return; + setFile(f); + setStatus("ready"); + } finally { + setIsVerifyingRom(false); } - - await importUploadedBlob(f); - setFile(f); - setStatus("ready"); } async function onAgreeToTerms() { @@ -324,6 +330,7 @@ const HackActions: React.FC = ({ supported={supported} onUploadChange={onSelectFile} termsAgreed={termsAgreed} + isVerifyingRom={isVerifyingRom} /> {romErrorModal && ( ) => void; termsAgreed: boolean; + isVerifyingRom?: boolean; } export default function StickyActionBar({ @@ -39,6 +40,7 @@ export default function StickyActionBar({ supported, onUploadChange, termsAgreed, + isVerifyingRom = false, }: StickyActionBarProps) { const [mounted, setMounted] = React.useState(false); React.useEffect(() => setMounted(true), []); @@ -112,13 +114,23 @@ export default function StickyActionBar({ )} {!romReady && !isLinked && (