pstream is dead; long live pstream taciturnaxolotl.github.io/pstream-ng/
at main 85 lines 2.6 kB view raw
1import { useCallback, useEffect, useMemo, useState } from "react"; 2 3import { updateSettings } from "@/backend/accounts/settings"; 4import { useBackendUrl } from "@/hooks/auth/useBackendUrl"; 5import { useAuthStore } from "@/stores/auth"; 6import { usePreferencesStore } from "@/stores/preferences"; 7 8export function useEmbedOrderState() { 9 const account = useAuthStore((s) => s.account); 10 const backendUrl = useBackendUrl(); 11 12 // Get current values from store 13 const embedOrder = usePreferencesStore((s) => s.embedOrder); 14 const enableEmbedOrder = usePreferencesStore((s) => s.enableEmbedOrder); 15 16 // Local state for tracking changes 17 const [localEmbedOrder, setLocalEmbedOrder] = useState(embedOrder); 18 const [localEnableEmbedOrder, setLocalEnableEmbedOrder] = 19 useState(enableEmbedOrder); 20 21 // Store setters 22 const setEmbedOrder = usePreferencesStore((s) => s.setEmbedOrder); 23 const setEnableEmbedOrder = usePreferencesStore((s) => s.setEnableEmbedOrder); 24 25 // Check if any changes have been made 26 const hasChanges = useMemo(() => { 27 return ( 28 JSON.stringify(localEmbedOrder) !== JSON.stringify(embedOrder) || 29 localEnableEmbedOrder !== enableEmbedOrder 30 ); 31 }, [localEmbedOrder, embedOrder, localEnableEmbedOrder, enableEmbedOrder]); 32 33 // Reset local state to match store 34 const reset = useCallback(() => { 35 setLocalEmbedOrder(embedOrder); 36 setLocalEnableEmbedOrder(enableEmbedOrder); 37 }, [embedOrder, enableEmbedOrder]); 38 39 // Save changes to backend and update store 40 const saveChanges = useCallback(async () => { 41 if (!account || !backendUrl) return; 42 43 try { 44 await updateSettings(backendUrl, account, { 45 embedOrder: localEmbedOrder, 46 enableEmbedOrder: localEnableEmbedOrder, 47 }); 48 49 // Update the store with the new values 50 setEmbedOrder(localEmbedOrder); 51 setEnableEmbedOrder(localEnableEmbedOrder); 52 } catch (error) { 53 console.error("Failed to save embed order settings:", error); 54 throw error; 55 } 56 }, [ 57 account, 58 backendUrl, 59 localEmbedOrder, 60 localEnableEmbedOrder, 61 setEmbedOrder, 62 setEnableEmbedOrder, 63 ]); 64 65 // Update local state when store changes 66 useEffect(() => { 67 setLocalEmbedOrder(embedOrder); 68 setLocalEnableEmbedOrder(enableEmbedOrder); 69 }, [embedOrder, enableEmbedOrder]); 70 71 return { 72 // Current values 73 embedOrder: localEmbedOrder, 74 enableEmbedOrder: localEnableEmbedOrder, 75 76 // Setters 77 setEmbedOrder: setLocalEmbedOrder, 78 setEnableEmbedOrder: setLocalEnableEmbedOrder, 79 80 // State management 81 hasChanges, 82 reset, 83 saveChanges, 84 }; 85}