Ariver
2026-06-23 7eb0b4196ce15c8bfbb0514c54b51cf019c78d24
privatevoice.src/frontend/src/components/onboarding/OnboardingView.svelte
@@ -9,11 +9,15 @@
  let detailText = $state('')
  let progress = $state(0)
  let failed = $state(false)
  let downloadActive = $state(false)
  onMount(() => {
    Events.On('model:download-progress', (ev: any) => {
      const data = ev?.data
      if (data?.percent != null) {
        downloadActive = true
        failed = false
        statusText = t('onboarding.syncModel')
        progress = data.percent
        const downloadedMB = Math.floor((data.downloaded || 0) / 1024 / 1024)
        const totalMB = Math.floor((data.total || 0) / 1024 / 1024)
@@ -24,13 +28,19 @@
    Events.On('engine:status', (ev: any) => {
      const data = ev?.data
      if (data?.status === 'ready') {
        downloadActive = false
        failed = false
        statusText = t('onboarding.complete')
        progress = 100
      } else if (data?.status === 'need_model') {
        const error = typeof data?.error === 'string' ? data.error.trim() : ''
        if (error && !downloadActive) {
        statusText = t('onboarding.failed')
        detailText = data?.error || ''
          detailText = error
        failed = true
        }
      } else if (data?.status === 'error') {
        downloadActive = false
        statusText = t('onboarding.failed')
        detailText = data?.error || ''
        failed = true
@@ -42,10 +52,16 @@
  async function triggerDownload() {
    try {
      downloadActive = true
      failed = false
      statusText = t('onboarding.syncModel')
      detailText = ''
      await Call.ByName('voicesnap/services.EngineService.DownloadCurrentModel')
      downloadActive = false
      statusText = t('onboarding.optimizing')
      detailText = t('onboarding.extracting')
    } catch (err: any) {
      downloadActive = false
      statusText = t('onboarding.failed')
      detailText = err?.message || String(err)
      failed = true