# Code coverage report for src/hooks/useStorageMigration.ts

# All files / src/hooks useStorageMigration.ts

100% Statements 84/84
100% Branches 18/18
100% Functions 1/1
100% Lines 84/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
    851x
    1x
    1x
    1x
    1x
    1x
    1x
    1x
    1x
    16x
    7x
    1x
    1x
    1x
    6x
    6x
    6x
    6x
    6x
    7x
    1x
    1x
    1x
    5x
    5x
    5x
    7x
    1x
    1x
    1x
    4x
    4x
    3x
    3x
    3x
    3x
    3x
    3x
    3x
    3x
    7x
    1x
    1x
    7x
    1x
    1x
    1x
    16x
    16x
    16x
    6x
    1x
    1x
    1x
    5x
    5x
    5x
    5x
    4x
    6x
    1x
    1x
    1x
    3x
    3x
    3x
    3x
    3x
    3x
    3x
    3x
    3x
    3x
    6x
    1x
    1x
    1x
    16x
    16x
    16x
    16x
    16x
    16x
    16x
     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,
      }
    }