openpencil/src/App.vue
Danila Poyarkov 37912d92a7 feat(app): recover unsaved documents
- Persist debounced FIG snapshots for source-less documents in IndexedDB

- Restore or discard orphaned snapshots from the editor startup dialog

- Clear recovery data after successful saves and explicit tab closure
2026-08-13 17:22:59 +03:00

50 lines
1.4 KiB
Vue

<script setup lang="ts">
import { onMounted } from 'vue'
import { useEventListener } from '@vueuse/core'
import { useHead } from '@unhead/vue'
import { TooltipProvider } from 'reka-ui'
import { provideEditor, useI18n } from '@open-pencil/vue'
import AppShell from '@/components/Shell/AppShell.vue'
import AppToast from '@/components/Shell/AppToast.vue'
import RecoveryDialog from '@/components/recovery/RecoveryDialog.vue'
import SettingsDialog from '@/components/settings/SettingsDialog.vue'
import { useEditorStore } from '@/app/editor/active-store'
import { toast } from '@/app/shell/ui'
import { useAppTheme } from '@/app/shell/theme'
import { scheduleStartupUpdateCheck } from '@/app/shell/updater'
import { kickSyncEngine } from '@/app/storage/sync'
import { prepareForReload } from '@/app/tabs'
const store = useEditorStore()
const { dialogs, locale } = useI18n()
useHead({
titleTemplate: (title) => (title ? `${title} — OpenPencil` : 'OpenPencil'),
htmlAttrs: { lang: locale }
})
provideEditor(store)
useAppTheme()
useEventListener(window, 'pagehide', () => {
void prepareForReload()
})
onMounted(() => {
toast.setupGlobalErrorHandler()
scheduleStartupUpdateCheck(dialogs)
void kickSyncEngine()
})
</script>
<template>
<TooltipProvider :delay-duration="400">
<AppShell>
<RouterView />
</AppShell>
<SettingsDialog />
<RecoveryDialog />
<AppToast />
</TooltipProvider>
</template>