pstream is dead; long live pstream
taciturnaxolotl.github.io/pstream-ng/
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}