diff --git a/src/hooks/useServerStorage.ts b/src/hooks/useServerStorage.ts index 41103a7..11113be 100644 --- a/src/hooks/useServerStorage.ts +++ b/src/hooks/useServerStorage.ts @@ -24,7 +24,7 @@ const useServerStorage = () => { const ini = await getIni(signature); if (!ini) { - const msg = `Signature: "${signature}" not supported!`; + const msg = `Signature: "${signature}" not supported`; const error = new Error(msg); Sentry.captureException(error); diff --git a/src/pages/Upload.tsx b/src/pages/Upload.tsx index 4706ea6..3626c7c 100644 --- a/src/pages/Upload.tsx +++ b/src/pages/Upload.tsx @@ -9,7 +9,6 @@ import { Divider, Input, InputNumber, - notification, Row, Select, Space, @@ -48,7 +47,9 @@ import ReactMarkdown from 'react-markdown'; import { nanoid } from 'nanoid'; import { emailNotVerified, + error, restrictedPage, + signatureNotSupportedWarning, usernameNotSet, } from './auth/notifications'; import { useAuth } from '../contexts/AuthContext'; @@ -139,7 +140,7 @@ const UploadPage = () => { const shareSupported = 'share' in navigator; const { currentUser, refreshUser } = useAuth(); const navigate = useNavigate(); - const { fetchTuneFile } = useServerStorage(); + const { fetchTuneFile, fetchINIFile } = useServerStorage(); const { createTune, updateTune, getTune, autocomplete } = useDb(); const [autocompleteOptions, setAutocompleteOptions] = useState<{ [attribute: string]: { value: string }[] }>({}); @@ -298,7 +299,7 @@ const UploadPage = () => { if (!validation.result) { const errorName = 'Validation failed'; const errorMessage = validation.message; - notification.error({ message: errorName, description: errorMessage }); + error(errorName, errorMessage); onError!({ name: errorName, message: errorMessage }); return false; @@ -319,8 +320,16 @@ const UploadPage = () => { return { result, message }; } + const parsed = tuneParser.parse(await file.arrayBuffer()); + + try { + await fetchINIFile(parsed.getTune().details.signature); + } catch (e) { + signatureNotSupportedWarning((e as Error).message); + } + return { - result: tuneParser.parse(await file.arrayBuffer()).isValid(), + result: parsed.isValid(), message: 'Tune file is not valid!', }; }); @@ -391,9 +400,9 @@ const UploadPage = () => { try { const parser = new INI(await file.arrayBuffer()).parse(); valid = parser.getResults().megaTune.signature.length > 0; - } catch (error) { + } catch (e) { valid = false; - validationMessage = (error as Error).message; + validationMessage = (e as Error).message; } return { diff --git a/src/pages/auth/notifications.ts b/src/pages/auth/notifications.ts index e9ee156..117c487 100644 --- a/src/pages/auth/notifications.ts +++ b/src/pages/auth/notifications.ts @@ -7,6 +7,12 @@ const baseOptions = { placement: 'bottomRight' as const, }; +const error = (message: string, description: string) => notification.warning({ + message, + description, + ...baseOptions, +}); + const emailNotVerified = () => notification.warning({ message: 'Check your email', description: 'Your email address has to be verified before you can upload files!', @@ -135,7 +141,14 @@ const copiedToClipboard = () => notification.success({ ...baseOptions, }); +const signatureNotSupportedWarning = (message: string) => notification.warning({ + message, + description: 'You need to upload custom INI file with your tune!', + ...baseOptions, +}); + export { + error, emailNotVerified, usernameNotSet, signUpSuccessful, @@ -158,4 +171,5 @@ export { copiedToClipboard, iniLoadingError, tuneParsingError, + signatureNotSupportedWarning, };