| 1234567891011121314151617181920212223242526272829303132333435363738394041424344 |
- import { LOCAL_STORAGE_KEYS, useParams } from 'common'
- import { parseAsString, useQueryState } from 'nuqs'
- import { useEffect, useMemo } from 'react'
- /**
- * This hook wraps useQueryState because useQueryState imports app router for some reason which breaks the SSR in
- * the playwright tests. I've localized the issue to "NODE_ENV='test'" in the playwright tests.
- */
- const useIsomorphicUseQueryState = (defaultSchema: string) => {
- if (typeof window === 'undefined') {
- return [defaultSchema, () => {}] as const
- } else {
- // eslint-disable-next-line react-hooks/rules-of-hooks
- return useQueryState(
- 'schema',
- parseAsString.withDefault(defaultSchema).withOptions({
- clearOnDefault: false,
- })
- )
- }
- }
- export const useQuerySchemaState = () => {
- const { ref } = useParams()
- const defaultSchema =
- typeof window !== 'undefined' && !!window.localStorage && ref && ref.length > 0
- ? window.localStorage.getItem(LOCAL_STORAGE_KEYS.LAST_SELECTED_SCHEMA(ref)) || 'public'
- : 'public'
- // cache the original default schema so that it's not changed by another tab and cause issues in the app (saving a
- // table on the wrong schema)
- const originalDefaultSchema = useMemo(() => defaultSchema, [ref])
- const [schema, setSelectedSchema] = useIsomorphicUseQueryState(originalDefaultSchema)
- useEffect(() => {
- // Update the schema in local storage on every change
- if (typeof window !== 'undefined' && !!window.localStorage && ref && ref.length > 0) {
- window.localStorage.setItem(LOCAL_STORAGE_KEYS.LAST_SELECTED_SCHEMA(ref), schema)
- }
- }, [schema, ref])
- return { selectedSchema: schema, setSelectedSchema }
- }
|