reafactor: decouple SidePeek from URL params

This commit is contained in:
Arvid Norlin
2024-08-12 14:30:31 +02:00
parent 68694ef914
commit da36036379
8 changed files with 961 additions and 915 deletions

View File

@@ -1,8 +1,7 @@
"use client"
import { useIsSSR } from "@react-aria/ssr"
import { usePathname, useRouter, useSearchParams } from "next/navigation"
import React, { Children, cloneElement, useEffect, useState } from "react"
import React, { Children, cloneElement } from "react"
import {
Dialog,
DialogTrigger,
@@ -14,39 +13,13 @@ import { SidePeekContentKey } from "@/components/TempDesignSystem/SidePeek/types
import styles from "./sidePeek.module.css"
function SidePeek({ children }: React.PropsWithChildren) {
// TODO: to make this more reusable,
// should the param logic be moved up/out so this component can be
// controlled by e.g. URL segments
const router = useRouter()
const pathname = usePathname()
const searchParams = useSearchParams()
const [activeSidePeek, setActiveSidePeek] =
useState<SidePeekContentKey | null>(() => {
const sidePeekParam = searchParams.get(
"open"
) as SidePeekContentKey | null
return sidePeekParam || null
})
useEffect(() => {
const sidePeekParam = searchParams.get("open") as SidePeekContentKey | null
if (sidePeekParam !== activeSidePeek) {
setActiveSidePeek(sidePeekParam)
}
}, [searchParams, activeSidePeek])
function handleClose(isOpen: boolean) {
if (!isOpen) {
setActiveSidePeek(null)
const nextSearchParams = new URLSearchParams(searchParams.toString())
nextSearchParams.delete("open")
router.push(`${pathname}?${nextSearchParams}`, { scroll: false })
}
}
import type { SidePeekProps } from "./sidePeek"
function SidePeek({
children,
handleClose,
activeSidePeek,
}: React.PropsWithChildren<SidePeekProps>) {
const sidePeekChildren = Children.map(children, (child) => {
if (!React.isValidElement(child)) {
return child
@@ -77,4 +50,4 @@ function SidePeek({ children }: React.PropsWithChildren) {
)
}
export default SidePeek
export default SidePeek