Files
supabase/apps/studio/components/grid/hooks/useSaveTableEditorState.ts
T
2025-04-18 18:59:35 +08:00

69 lines
2.6 KiB
TypeScript

import { useCallback } from 'react'
import { useProjectContext } from 'components/layouts/ProjectLayout/ProjectContext'
import { saveTableEditorStateToLocalStorage } from 'components/grid/SupabaseGrid.utils'
import { useSafeTableEditorSnapshot } from './useSafeTableEditorSnapshot' // Import safe wrapper
/**
* Hook for saving state and triggering side effects.
* Relies on useSafeTableEditorSnapshot to provide a stable snapshot object.
*/
export function useSaveTableEditorState() {
const { project } = useProjectContext()
// Use the safe snapshot hook - it returns a guaranteed object (real or default)
const snap = useSafeTableEditorSnapshot()
const saveDataAndTriggerSideEffects = useCallback(
(dataToSave: { filters?: string[]; sorts?: string[] }) => {
const projectRef = project?.ref
// No need for top-level snap check, safeSnap always returns an object.
if (!projectRef) {
console.warn(
'[useSaveTableEditorState] ProjectRef missing, cannot save or trigger side effects.'
)
return
}
// --- Side Effects & Saving ---
// Call methods directly. If snap is the default object, these are safe no-ops.
try {
// These calls are safe because defaultSnapshot provides no-op functions
snap.setPage?.(1)
snap.setEnforceExactCount?.(false)
// Local Storage Save
// Use optional chaining as table/name might be undefined in defaultSnapshot
const tableName = snap.table?.name
const schema = snap.table?.schema
if (tableName) {
saveTableEditorStateToLocalStorage({
projectRef,
tableName,
schema,
...dataToSave,
})
} else {
// Log if saving is skipped because table name is missing (likely due to default snap)
console.warn('[useSaveTableEditorState] Table name missing, skipping localStorage save.')
}
} catch (error) {
// Catch unexpected errors during property access or method calls
console.error('[useSaveTableEditorState] Error during interaction with snapshot:', error)
}
},
[snap, project] // Depend on the safe snap and project
)
const saveFiltersAndTriggerSideEffects = useCallback(
(urlFilters: string[]) => saveDataAndTriggerSideEffects({ filters: urlFilters }),
[saveDataAndTriggerSideEffects]
)
const saveSortsAndTriggerSideEffects = useCallback(
(urlSorts: string[]) => saveDataAndTriggerSideEffects({ sorts: urlSorts }),
[saveDataAndTriggerSideEffects]
)
return { saveFiltersAndTriggerSideEffects, saveSortsAndTriggerSideEffects }
}