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 { Channel, Server } from "@/types/types"; import Cookies from "js-cookie"; import { toast } from "sonner"; import { getProfileById } from "@/actions/get-profile"; import { getServerById } from "@/actions/get-server"; export default function useApp(): App { const node = useRef(null); const [profiles, setProfiles] = useState>({}); const [sidebarOpen, setSidebarOpen] = useState(false); const profile = useUser(); const [clientSettings, setClientSettings] = useClientSettings(); const [dms, setDms] = useState([]); const [servers, setServers] = useState>({}); const [currentChannel, setCurrentChannel] = useState(null); const [server, setServer] = useState(); const privateMessages = useMessages(); useEffect(() => { const stored = Cookies.get("servers"); if (!stored) return; Promise.all( stored .split(",") .map((x) => x.trim()) .filter((id) => id) .map((id) => getServerById(id)) ) .then((o) => setServers(Object.fromEntries(o.map((i) => [i.id, i])))) .catch(toast.error); }, []); return { privateMessages, currentChannel, setCurrentChannel, server, setServer, servers, setServers, dms, setDms, node, clientSettings, setClientSettings, profile, profiles, setProfiles, sidebarOpen, setSidebarOpen, getUserById: async (id: string) => { if (profiles[id] !== undefined) return profiles[id]; try { const user = await getProfileById(id); setProfiles((prev) => { prev[id] = user; return prev; }); return user; } catch { return null; } }, }; }