import { z } from "zod" import { useAtom } from "jotai" import { useState } from "react" import { useForm } from "react-hook-form" import { usePathname, useRouter } from "next/navigation" import { useAccount } from "@/lib/providers/jazz-provider" import { cn, generateUniqueSlug } from "@/lib/utils" import { atomWithStorage } from "jotai/utils" import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover" import { Form, FormField, FormItem, FormLabel, FormControl, FormMessage } from "@/components/ui/form" import { PersonalPage, PersonalPageLists } from "@/lib/schema/personal-page" import { zodResolver } from "@hookform/resolvers/zod" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { LaIcon } from "../../la-icon" import { toast } from "sonner" import Link from "next/link" import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@/components/ui/dropdown-menu" const pageSortAtom = atomWithStorage("pageSort", "title") const createPageSchema = z.object({ title: z.string({ message: "Please enter a valid title" }).min(1, { message: "Please enter a valid title" }) }) type PageFormValues = z.infer export const PageSection: React.FC = () => { const [pagesSorted, setPagesSorted] = useAtom(pageSortAtom) const { me } = useAccount({ root: { personalPages: [] } }) const pageCount = me?.root.personalPages?.length || 0 const sortedPages = (filter: string) => { setPagesSorted(filter) } return (
{me?.root.personalPages && }
) } const PageList: React.FC<{ personalPages: PersonalPageLists; sortBy: string }> = ({ personalPages, sortBy }) => { const pathname = usePathname() const sortedPages = [...personalPages] .sort((a, b) => { if (sortBy === "title") { return (a?.title || "").localeCompare(b?.title || "") } else if (sortBy === "latest") { return ((b as any)?.createdAt?.getTime?.() ?? 0) - ((a as any)?.createdAt?.getTime?.() ?? 0) } return 0 }) .slice(0, 6) return (
{sortedPages.map( page => page?.id && (

{page.title}

) )}
) } interface ShowAllFormProps { filteredPages: (filter: string) => void } const ShowAllForm: React.FC = ({ filteredPages }) => { const [pagesSorted, setPagesSorted] = useAtom(pageSortAtom) const handleSort = (newSort: string) => { setPagesSorted(newSort.toLowerCase()) filteredPages(newSort.toLowerCase()) } return ( handleSort("title")}> Title {pagesSorted === "title" && } handleSort("manual")}> Manual {pagesSorted === "manual" && } ) } const CreatePageForm: React.FC = () => { const [open, setOpen] = useState(false) const { me } = useAccount() const route = useRouter() const form = useForm({ resolver: zodResolver(createPageSchema), defaultValues: { title: "" } }) const onSubmit = (values: PageFormValues) => { try { const personalPages = me?.root?.personalPages?.toJSON() || [] const slug = generateUniqueSlug(personalPages, values.title) const newPersonalPage = PersonalPage.create( { title: values.title, slug: slug, content: "" }, { owner: me._owner } ) me.root?.personalPages?.push(newPersonalPage) form.reset() setOpen(false) route.push(`/pages/${newPersonalPage.id}`) } catch (error) { console.error(error) toast.error("Failed to create page") } } return (
( New page )} />
) }