"use client" import React, { createContext, Suspense, useContext, useEffect, useMemo, useRef, useState, type ComponentProps, type ReactNode, } from "react" import classes from "./CommandPalette.module.css" import type { ICommandPaletteContainerProps, ICommandPaletteItemProps } from "./types" const noop = () => {} const SearchTermContext = createContext<{ searchTerm: string | null setSearchTerm: React.Dispatch> }>({ searchTerm: null, setSearchTerm: noop }) const SliceContext = createContext<{ slice: string setSlice: React.Dispatch> }>({ slice: "", setSlice: noop, }) const Root = ({ children, defaultSlice }: { children?: ReactNode; defaultSlice: string }) => { const [searchTerm, setSearchTerm] = useState(null) const [slice, setSlice] = useState(defaultSlice) const searchTermProviderValue = useMemo( () => ({ searchTerm, setSearchTerm, }), [searchTerm], ) const sliceProviderValue = useMemo(() => ({ slice, setSlice }), [slice]) return ( {children} ) } const variantMap = { sm: classes["container-sm"], md: classes["container-md"], lg: classes["container-lg"], } as const const Container = ({ children, variant = "md", ...rest }: ICommandPaletteContainerProps) => { return (
{children}
) } const TabsContainer = (props: ComponentProps<"ul">) => { return
    } const Tab = ({ children, tabName, ...rest }: ComponentProps<"button"> & { tabName: string }) => { const { setSlice, slice } = useContext(SliceContext) return (
  • ) } const Search = (props: ComponentProps<"input">) => { const { searchTerm, setSearchTerm } = useContext(SearchTermContext) const ref = useRef(null) const userAgent = navigator.userAgent useEffect(() => { const listener = (evt: KeyboardEvent) => { evt.stopPropagation() if (evt.metaKey && evt.code === "KeyK") { ref.current?.focus() } } window.addEventListener("keyup", listener) return () => window.removeEventListener("keyup", listener) }, []) const modifierKey = userAgent.includes("Mac") ? "⌘" : "⊞" return (
    setSearchTerm(evt.target.value)} ref={ref} className={`${classes["w-full"]} ${classes.font}`} {...props} />
    {modifierKey} + K
    ) } const LoadingSpinner = () => { return (
    ) } const ItemGroup = ({ children, slice }: { children: ReactNode; slice: string }) => { const { slice: contextSlice } = useContext(SliceContext) return contextSlice === slice ? ( }>
      {children}
    ) : null } const Item = ({ children, searchTerm, className, withFilter = false, ...rest }: ICommandPaletteItemProps) => { const { searchTerm: contextSearchTerm } = useContext(SearchTermContext) if (withFilter) { return (contextSearchTerm && searchTerm?.includes(contextSearchTerm)) || !contextSearchTerm ? (
  • {children}
  • ) : null } return (
  • {children}
  • ) } const Header = ({ children }: { children: ReactNode }) => { return (
    {children}
    ) } export default { Container, Root, Search, ItemGroup, Item, TabsContainer, Tab, Header }