mirror of
https://github.com/supabase/supabase.git
synced 2026-10-15 22:29:11 +03:00
69 lines
2.6 KiB
TypeScript
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 }
|
|
}
|