diff --git a/src/assets/sounds/ui/Attention.wav b/src/assets/sounds/ui/Attention.wav new file mode 100644 index 0000000..150341b Binary files /dev/null and b/src/assets/sounds/ui/Attention.wav differ diff --git a/src/assets/sounds/ui/Warning.wav b/src/assets/sounds/ui/Warning.wav index e9b946e..db8a59f 100644 Binary files a/src/assets/sounds/ui/Warning.wav and b/src/assets/sounds/ui/Warning.wav differ diff --git a/src/components/SettingForms/Sound/SoundUpload.tsx b/src/components/SettingForms/Sound/SoundUpload.tsx index c30d389..7d8a612 100644 --- a/src/components/SettingForms/Sound/SoundUpload.tsx +++ b/src/components/SettingForms/Sound/SoundUpload.tsx @@ -4,10 +4,12 @@ import type { SoundUploadValue } from "../../../types/types"; import { useSoundContext } from "../../../context/SoundContext"; import { toast } from "sonner"; import { useCameraBlackboard } from "../../../hooks/useCameraBlackboard"; +import { useFileUpload } from "../../../hooks/useFileUpload"; const SoundUpload = () => { const { state, dispatch } = useSoundContext(); const { mutation } = useCameraBlackboard(); + const { mutation: fileMutation } = useFileUpload(); const initialValues: SoundUploadValue = { name: "", @@ -37,10 +39,10 @@ const SoundUpload = () => { path: "soundSettings", value: updatedValues, }); + const responsee = await fileMutation.mutateAsync(values.soundFile); + console.log(responsee); if (result.reason !== "OK") { toast.error("Cannot update sound settings"); - } else { - toast.success(`${values.name} file added`); } dispatch({ type: "ADD", payload: values }); diff --git a/src/components/SettingForms/System/Upload.ts b/src/components/SettingForms/System/Upload.ts index f5b78ad..1403722 100644 --- a/src/components/SettingForms/System/Upload.ts +++ b/src/components/SettingForms/System/Upload.ts @@ -10,10 +10,7 @@ type BlobFileUpload = { }; }; -export async function sendBlobFileUpload({ - file, - opts, -}: BlobFileUpload): Promise { +export async function sendBlobFileUpload({ file, opts }: BlobFileUpload): Promise { if (!file) throw new Error("No file supplied"); if (!opts?.uploadUrl) throw new Error("No URL supplied"); @@ -42,9 +39,7 @@ export async function sendBlobFileUpload({ const bodyText = await resp.text(); if (!resp.ok) { - throw new Error( - `Upload failed (${resp.status} ${resp.statusText}) from ${opts.uploadUrl} — ${bodyText}` - ); + throw new Error(`Upload failed (${resp.status} ${resp.statusText}) from ${opts.uploadUrl} — ${bodyText}`); } return bodyText; @@ -54,9 +49,7 @@ export async function sendBlobFileUpload({ } // In browsers, fetch throws TypeError on network-level failures if (err instanceof TypeError) { - throw new Error( - `HTTP error uploading to ${opts.uploadUrl}: ${err.message}` - ); + throw new Error(`HTTP error uploading to ${opts.uploadUrl}: ${err.message}`); } // Todo: fix error message response return `Hotlist Load OK`; diff --git a/src/context/reducers/SoundContextReducer.ts b/src/context/reducers/SoundContextReducer.ts index 0145094..0880b6c 100644 --- a/src/context/reducers/SoundContextReducer.ts +++ b/src/context/reducers/SoundContextReducer.ts @@ -13,6 +13,7 @@ export const initialState: SoundState = { { name: "Ding", soundFileName: "ding" }, { name: "Shutter", soundFileName: "shutter" }, { name: "Warning (voice)", soundFileName: "warning" }, + { name: "Attention (voice)", soundFileName: "attention" }, ], sightingVolume: 1, NPEDsoundVolume: 1, diff --git a/src/hooks/useFileUpload.ts b/src/hooks/useFileUpload.ts new file mode 100644 index 0000000..f29d656 --- /dev/null +++ b/src/hooks/useFileUpload.ts @@ -0,0 +1,41 @@ +import { useMutation, useQuery } from "@tanstack/react-query"; +import { CAM_BASE } from "../utils/config"; +import { toast } from "sonner"; +const camBase = import.meta.env.MODE !== "development" ? CAM_BASE : CAM_BASE; + +const uploadFile = async (file: File) => { + const form = new FormData(); + form.append("upload", file, file.name); + const response = await fetch(`${camBase}/upload/file-upload/3`, { + method: "POST", + body: form, + }); + if (!response.ok) { + throw new Error("Cannot reach upload file endpoint"); + } + return response.text(); +}; + +const getUploadFiles = async () => { + const response = await fetch(`${camBase}/upload/file-upload/3`); + if (!response.ok) { + throw new Error("Cannot reach upload file endpoint"); + } + return response.json(); +}; + +export const useFileUpload = () => { + const query = useQuery({ + queryKey: ["getUploadFiles"], + queryFn: getUploadFiles, + }); + + const mutation = useMutation({ + mutationFn: (file: File) => uploadFile(file), + mutationKey: ["uploadFile"], + onError: (err) => console.log(err), + onSuccess: (msg) => toast.success(msg), + }); + + return { query, mutation }; +}; diff --git a/src/utils/utils.ts b/src/utils/utils.ts index dc164e9..a0fa34d 100644 --- a/src/utils/utils.ts +++ b/src/utils/utils.ts @@ -5,6 +5,7 @@ import beep from "../assets/sounds/ui/Beep.wav"; import warning from "../assets/sounds/ui/Warning.wav"; import ding from "../assets/sounds/ui/Ding.wav"; import shutter from "../assets/sounds/ui/shutter.mp3"; +import attention from "../assets/sounds/ui/Attention.wav"; import type { HotlistMatches, SightingType } from "../types/types"; @@ -17,6 +18,7 @@ export function getSoundFileURL(name: string) { warning: warning, ding: ding, shutter: shutter, + attention: attention, }; return sounds[name] ?? null; }