ultisuite-client/hooks/use-mail-route.ts
2026-05-20 16:01:08 +02:00

52 lines
1.6 KiB
TypeScript

"use client"
import { useCallback, useMemo } from "react"
import { useRouter, usePathname, useSearchParams } from "next/navigation"
import {
parseMailSegments,
buildMailPath,
type MailRouteState,
} from "@/lib/mail-url"
function segmentsFromPathname(pathname: string | null): string[] | undefined {
if (!pathname?.startsWith("/mail")) return undefined
const rest = pathname.slice("/mail".length).replace(/^\//, "")
if (!rest) return []
return rest.split("/").filter(Boolean)
}
export function useMailRoute() {
const router = useRouter()
const pathname = usePathname()
const currentSearchParams = useSearchParams()
const segments = useMemo(() => segmentsFromPathname(pathname), [pathname])
const route = useMemo(() => parseMailSegments(segments), [segments])
const navigateRoute = useCallback(
(patch: Partial<MailRouteState>) => {
const next: MailRouteState = {
folderId: patch.folderId ?? route.folderId,
inboxTab:
patch.inboxTab !== undefined && patch.inboxTab !== null
? patch.inboxTab
: route.inboxTab,
page: patch.page !== undefined ? patch.page : route.page,
mailId: patch.mailId !== undefined ? patch.mailId : route.mailId,
}
let url = buildMailPath(next)
if (next.folderId === "search" && currentSearchParams.toString()) {
url += `?${currentSearchParams.toString()}`
}
router.push(url, { scroll: false })
},
[router, route, currentSearchParams]
)
return {
route,
navigateRoute,
pathname,
searchParams: currentSearchParams,
}
}