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 (
)
}
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 (
)
}
function LogOutButton() {
const logOutMutation = useLogOut()
const navigate = useNavigate()
function logOut() {
logOutMutation.mutate()
navigate({ to: "/", replace: true })
}
return (
)
}