import { autoUpdate, offset, useFloating } from "@floating-ui/react-dom" import { createFileRoute, useNavigate } from "@tanstack/react-router" import { useCallback } from "react" import { ActionBar } from "~/app/bookmarks/-action-bar" import { useLogOut } from "~/auth" import { useCollections } from "~/collection/api" import { Button } from "~/components/button" import { LoadingSpinner } from "~/components/loading-spinner" import { SideNav, SideNavItem } from "~/components/side-nav" import { useMnemonics } from "~/hooks/use-mnemonics" import { CollectionList } from "./-collection-list" import { AddCollectionDialog } from "./-dialogs/add-collection-dialog" import { DeleteCollectionDialog } from "./-dialogs/delete-collection-dialog" import { DialogKind, WindowKind, useCollectionPageStore } from "./-store" export const Route = createFileRoute("/collections/")({ component: CollectionsPage, }) function ActiveDialog() { const dialog = useCollectionPageStore((state) => state.dialog) switch (dialog.kind) { case DialogKind.AddCollection: return case DialogKind.DeleteCollection: return default: return null } } function CollectionsPage() { return (
) } function CollectionsPane() { return (
<_SideNav />
) } function _SideNav() { const navigate = useNavigate() useMnemonics( { b: () => navigate({ to: "/bookmarks" }), c: () => navigate({ to: "/collections" }), }, { ignore: () => { const state = useCollectionPageStore.getState() return state.dialog.kind !== DialogKind.None }, }, ) return ( ) } function CollectionsContainer() { const { data: collections, status } = useCollections() const handleCollectionListAction = useCollectionPageStore((state) => state.handleCollectionListAction) switch (status) { case "success": return collections.length === 0 ? (

You have not created any collections!

) : ( ) case "pending": return (

Loading

) case "error": return

Error loading collections

} } function CollectionsActionBar({ className }: { className?: string }) { const activeWindow = useCollectionPageStore((state) => state.activeWindow) const { refs, floatingStyles } = useFloating({ placement: "top", whileElementsMounted: autoUpdate, middleware: [offset(8)], }) return ( <> {activeWindow === WindowKind.AppMenu && } ) } function ActionButtons() { const setActiveWindow = useCollectionPageStore((state) => state.setActiveWindow) const activeWindow = useCollectionPageStore((state) => state.activeWindow) const setActiveDialog = useCollectionPageStore((state) => state.setActiveDialog) useMnemonics( { a: addCollection, }, { ignore: useCallback(() => useCollectionPageStore.getState().dialog.kind !== DialogKind.None, []) }, ) function addCollection() { setActiveDialog({ kind: DialogKind.AddCollection }) } function toggleAppMenu() { setActiveWindow(activeWindow === WindowKind.AppMenu ? WindowKind.None : WindowKind.AppMenu) } return (
) } function AppMenuWindow({ ref, style }: { ref: React.Ref; style: React.CSSProperties }) { return (

MENU

) } function LogOutButton() { const logOutMutation = useLogOut() const navigate = useNavigate() function logOut() { logOutMutation.mutate() navigate({ to: "/", replace: true }) } return ( ) }