# All files / src/hooks useStorageMigration.ts

0% Statements 0/84
0% Branches 0/1
0% Functions 0/1
0% Lines 0/84

Press n or j to go to the next uncovered block, b, p or k for the previous block.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85

     import { useCallback } from 'react'
    import { toast } from 'sonner'
    import { getAllSnippets } from '@/lib/db'
    import {
      saveStorageConfig,
      FlaskStorageAdapter
    } from '@/lib/storage'

    export function useStorageMigration() {
      const handleMigrateToFlask = useCallback(async (flaskUrl: string, onSuccess?: () => Promise<void>) => {
        if (!flaskUrl) {
          toast.error('Please enter a Flask backend URL')
          return
        }

        try {
          const adapter = new FlaskStorageAdapter(flaskUrl)
          const connected = await adapter.testConnection()

          if (!connected) {
            toast.error('Cannot connect to Flask backend')
            return
          }

          const snippets = await getAllSnippets()

          if (snippets.length === 0) {
            toast.info('No snippets to migrate')
            return
          }

          await adapter.migrateFromIndexedDB(snippets)

          saveStorageConfig({
            backend: 'flask',
            flaskUrl
          })

          toast.success(`Successfully migrated ${snippets.length} snippets to Flask backend`)

          if (onSuccess) {
            await onSuccess()
          }
        } catch (error) {
          console.error('Migration failed:', error)
          toast.error('Failed to migrate data to Flask backend')
        }
      }, [])

      const handleMigrateToIndexedDB = useCallback(async (flaskUrl: string) => {
        if (!flaskUrl) {
          toast.error('Please enter a Flask backend URL')
          return
        }

        try {
          const adapter = new FlaskStorageAdapter(flaskUrl)
          const snippets = await adapter.migrateToIndexedDB()

          if (snippets.length === 0) {
            toast.info('No snippets to migrate')
            return
          }

          saveStorageConfig({
            backend: 'indexeddb'
          })

          // Full page reload is necessary here to reinitialize the database layer
          // with the new backend after migration from Flask to IndexedDB
          window.location.reload()

          toast.success(`Successfully migrated ${snippets.length} snippets to IndexedDB`)
        } catch (error) {
          console.error('Migration failed:', error)
          toast.error('Failed to migrate data from Flask backend')
        }
      }, [])

      return {
        handleMigrateToFlask,
        handleMigrateToIndexedDB,
      }
    }