Files
metabuilder/hooks/useStorageSwitchHandlers.ts
johndoe6345789 78a54228df feat(hooks): Create centralized hooks npm package
- Added @metabuilder/hooks workspace package at root
- Consolidated 30 React hooks from across codebase into single module
- Implemented conditional exports for tree-shaking support
- Added comprehensive package.json with build/lint/typecheck scripts
- Created README.md documenting hook categories and usage patterns
- Updated root package.json workspaces array to include hooks
- Supports multi-version peer dependencies (React 18/19, Redux 8/9)

Usage:
  import { useDashboardLogic } from '@metabuilder/hooks'
  import { useLoginLogic } from '@metabuilder/hooks/useLoginLogic'

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-01-23 19:17:17 +00:00

86 lines
2.4 KiB
TypeScript

import { useCallback, useState } from 'react'
import { toast } from 'sonner'
import { formatStorageError } from './storageSettingsUtils'
import { storageSettingsCopy, type StorageBackendKey } from './storageSettingsConfig'
type SwitchHandlers = {
backend: StorageBackendKey | null
flaskUrl: string
switchToFlask: (url: string) => Promise<void>
switchToSQLite: () => Promise<void>
switchToIndexedDB: () => Promise<void>
}
export const useStorageSwitchHandlers = ({
backend,
flaskUrl,
switchToFlask,
switchToSQLite,
switchToIndexedDB,
}: SwitchHandlers) => {
const [isSwitching, setIsSwitching] = useState(false)
const handleSwitchToFlask = useCallback(async () => {
if (backend === 'flask') {
toast.info(storageSettingsCopy.toasts.alreadyUsing.flask)
return
}
if (!flaskUrl) {
toast.error(storageSettingsCopy.toasts.errors.missingFlaskUrl)
return
}
setIsSwitching(true)
try {
await switchToFlask(flaskUrl)
toast.success(storageSettingsCopy.toasts.success.switchFlask)
} catch (error) {
toast.error(`${storageSettingsCopy.toasts.failure.switchFlask}: ${formatStorageError(error)}`)
} finally {
setIsSwitching(false)
}
}, [backend, flaskUrl, switchToFlask])
const handleSwitchToSQLite = useCallback(async () => {
if (backend === 'sqlite') {
toast.info(storageSettingsCopy.toasts.alreadyUsing.sqlite)
return
}
setIsSwitching(true)
try {
await switchToSQLite()
toast.success(storageSettingsCopy.toasts.success.switchSQLite)
} catch (error) {
toast.error(`${storageSettingsCopy.toasts.failure.switchSQLite}: ${formatStorageError(error)}`)
} finally {
setIsSwitching(false)
}
}, [backend, switchToSQLite])
const handleSwitchToIndexedDB = useCallback(async () => {
if (backend === 'indexeddb') {
toast.info(storageSettingsCopy.toasts.alreadyUsing.indexeddb)
return
}
setIsSwitching(true)
try {
await switchToIndexedDB()
toast.success(storageSettingsCopy.toasts.success.switchIndexedDB)
} catch (error) {
toast.error(`${storageSettingsCopy.toasts.failure.switchIndexedDB}: ${formatStorageError(error)}`)
} finally {
setIsSwitching(false)
}
}, [backend, switchToIndexedDB])
return {
isSwitching,
handleSwitchToFlask,
handleSwitchToSQLite,
handleSwitchToIndexedDB,
}
}