import App from "@/types/app"; import { useEffect, useRef, useState } from "react"; import { useMessages } from "./use-messages"; import { StringMap } from "@/types/typeUtils"; import useUser, { UserProfile } from "./get-user"; import { useClientSettings } from "./use-settings"; import { get, Response } from "@/lib/request"; import { Server } from "@/types/types"; import Cookies from "js-cookie"; import { toast } from "sonner"; export default function useApp(): App { const node = useRef(null); const [profiles, setProfiles] = useState>({}); const { messages, addMessage } = useMessages(); const [sidebarOpen, setSidebarOpen] = useState(false); const profile = useUser(); const [clientSettings, setClientSettings] = useClientSettings(); const [dms, setDms] = useState([]); const [servers, setServers] = useState>({}); useEffect(() => { const stored = Cookies.get("servers"); if (!stored) return; Promise.all( stored .split(",") .map((x) => x.trim()) .filter((id) => id) .map((id) => get(`/api/server/${id}`)) ) .then((o) => setServers(Object.fromEntries(o.map((i) => [i.data.id, i.data]))) ) .catch(toast.error); }, []); return { servers, setServers, dms, setDms, node, clientSettings, setClientSettings, profile, profiles, setProfiles, messages, addMessage, sidebarOpen, setSidebarOpen, getUserById: async (id: string) => { if (profiles[id] !== undefined) return profiles[id]; const onResponse = (res: Response) => { setProfiles((prev) => { prev[id] = res.data as UserProfile; return prev; }); }; try { const user = await get(`/api/profile/?id=${id}`, onResponse); onResponse(user); return user.data; } catch { return null; } }, }; }