Skip to content

feat(crash): report UX — startup prompt, menu, opener, i18n#695

Merged
fixcik merged 6 commits into
masterfrom
feat/crash-reporting-phase3
Jun 16, 2026
Merged

feat(crash): report UX — startup prompt, menu, opener, i18n#695
fixcik merged 6 commits into
masterfrom
feat/crash-reporting-phase3

Conversation

@fixcik

@fixcik fixcik commented Jun 16, 2026

Copy link
Copy Markdown
Owner

Фаза 3 (финальная) локального crash-reporting (Refs #687). UX отправки. После мержа фича целиком в master.

Что внутри

  • Старт-промпт (CrashPrompt.tsx) — при запуске главного окна проверяет list_pending_crashes; если есть неотправленный сбой, показывает ненавязчивый промпт [Сообщить]/[Позже] (+ «Открыть папку с логами»).
  • Поток отправкиbuild_crash_report → собрать pre-filled GitHub issue URL (lib/crashReport.ts, обрезка под лимит ~8 КБ) → открыть в браузере через tauri-plugin-opener. После отправки — mark_crash_reported; «Позже» — dismiss_crash.
  • Пункт нативного меню «Сообщить о проблеме…» (рядом с «Проверить обновления»), доступен всегда.
  • i18n namespace crash (en/ru); ErrorBoundary переведён на i18n (убраны временные литералы).
  • Все обработчики отправки в try/catch — сбой openUrl (нет браузера) не пишет ложный крэш-рекорд.

Приватность

Тело issue обезличено (домашняя папка → /Users/<user>); reveal папки логов использует сырой путь локально, наружу не уходит.

Проверки

pnpm build (i18n-паритет) · pnpm test 819 · cargo clippy -D warnings · cargo test (27, вкл. commands::crash::*) — всё зелёное.

Ревью

spec ✅ · code-quality (нашло и починило: ложные крэш-рекорды, выбор dismissed-записи, недостижимую кнопку логов, мёртвые ключи) ✅ · финальное независимое ✅.

Закрывает реализацию #687 целиком (Фазы 1–3). Чек-лист «Проверить после слияния» требует живого UI — оставляю на ручную проверку.

Summary by CodeRabbit

Release Notes

  • New Features

    • Добавлен пункт меню "Сообщить о проблеме…" для отправки обратной связи.
    • Добавлен интерфейс восстановления после сбоев с возможностью создания отчётов и доступом к файлам логов.
  • Tests

    • Добавлены тесты для функции формирования ссылок на issue.

@coderabbitai

coderabbitai Bot commented Jun 16, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

Pull request was closed or merged during review

📝 Walkthrough

Walkthrough

Добавлен полный поток crash-репортинга: плагин tauri-plugin-opener подключён на уровне Rust и JS; добавлен нативный пункт меню «Report an Issue», эмитирующий событие на фронтенд; реализован компонент CrashPrompt с баннером для необработанных крашей; добавлена утилита issueUrl с ограничением длины URL; заведён i18n-namespace crash; ErrorBoundary переведён на i18n.

Changes

Crash Reporting UX Integration

Layer / File(s) Summary
tauri-plugin-opener: подключение зависимостей и разрешений
cuprum-ui/src-tauri/Cargo.toml, cuprum-ui/package.json, cuprum-ui/src-tauri/capabilities/default.json, cuprum-ui/src-tauri/src/main.rs
Добавлен tauri-plugin-opener в Cargo.toml и package.json; в capabilities добавлены process:allow-restart, opener:allow-open-url, opener:allow-reveal-item-in-dir; плагин инициализируется через tauri_plugin_opener::init().
Нативный пункт меню и исправление выбора crash-записи
cuprum-ui/src-tauri/src/main.rs, cuprum-ui/src-tauri/src/commands/crash.rs
MenuLabels расширена полем report_issue; в build_app_menu добавлен пункт report-issue; on_menu_event эмитит menu://report-issue; build_crash_report при id: None теперь выбирает последнюю не-reported/не-dismissed запись с резервом.
Утилита issueUrl и тесты
cuprum-ui/src/lib/crashReport.ts, cuprum-ui/src/lib/crashReport.test.ts
Экспортированы REPO_ISSUE_BASE и issueUrl с итеративным усечением тела до ≤7500 символов URL; тесты покрывают формирование URL и механизм усечения.
Фронтенд API-контракт
cuprum-ui/src/lib/api.ts
Интерфейс MenuLabels дополнен reportIssue: string; добавлен метод api.onMenuReportIssue(cb), слушающий menu://report-issue и возвращающий UnlistenFn.
Компонент CrashPrompt
cuprum-ui/src/components/CrashPrompt.tsx
Реализован компонент с типами PendingCrash/PrefetchedReport, монтажным prefetch-ем, обработчиками handleReport/handleLater/handleMenuReport, регистрацией bridge-слушателя и условным рендером баннера с кнопкой открытия логов.
i18n namespace crash и обновление ErrorBoundary
cuprum-ui/src/locales/en/crash.json, cuprum-ui/src/locales/ru/crash.json, cuprum-ui/src/locales/*/menu.json, cuprum-ui/src/i18n/resources.ts, cuprum-ui/src/components/ErrorBoundary.tsx
Добавлены en/ru файлы для namespace crash; namespace зарегистрирован в resources.ts; в menu.json добавлен ключ reportIssue; ErrorBoundary использует i18n.t("crash:boundary.*") вместо захардкоженных строк.
Монтирование CrashPrompt в App.tsx
cuprum-ui/src/App.tsx
Импортирован и отрендерен <CrashPrompt />; в api.setAppMenu передана локализованная метка reportIssue.

Sequence Diagram(s)

sequenceDiagram
  participant User
  participant NativeMenu
  participant Tauri_Backend
  participant CrashPrompt
  participant api_crash
  participant GitHub

  rect rgba(100, 150, 255, 0.5)
    note over CrashPrompt,api_crash: Инициализация при монтировании
    CrashPrompt->>api_crash: listPending()
    api_crash-->>CrashPrompt: [pending crashes]
    CrashPrompt->>api_crash: buildReport(latest.id)
    api_crash-->>CrashPrompt: { report, logDir }
  end

  rect rgba(255, 180, 100, 0.5)
    note over User,GitHub: Пользователь нажимает «Report»
    User->>CrashPrompt: handleReport()
    CrashPrompt->>GitHub: openUrl(issueUrl(title, body))
    CrashPrompt->>api_crash: markReported(id)
  end

  rect rgba(100, 220, 150, 0.5)
    note over User,GitHub: Через нативное меню
    User->>NativeMenu: Report an Issue…
    NativeMenu->>Tauri_Backend: on_menu_event("report-issue")
    Tauri_Backend->>CrashPrompt: emit menu://report-issue
    CrashPrompt->>api_crash: buildReport(null)
    api_crash-->>CrashPrompt: report template
    CrashPrompt->>GitHub: openUrl(issueUrl(title, body))
  end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related issues

  • Local crash reporting (panic hook + report flow) #687 — PR реализует фазу 3 спецификации crash-репортинга: компонент CrashPrompt, интеграцию tauri-plugin-opener, пункт меню «Report an Issue» и i18n namespace crash.

Poem

🐇 Упал сервис — не беда,
Баннер выскочит тогда:
«Сообщить или потом?» —
Откроет GitHub одним кликом,
Логи рядом — всё найдём!
Ушастый правит баги ловко,
Краш — лишь к лучшему подсказка. 🐾

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed Заголовок точно описывает основное изменение: реализация UX для отчётов о крашах с промптом при запуске, пунктом меню и интернационализацией.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@fixcik fixcik enabled auto-merge (squash) June 16, 2026 00:25
@fixcik fixcik merged commit eb285b1 into master Jun 16, 2026
3 of 4 checks passed
@fixcik fixcik deleted the feat/crash-reporting-phase3 branch June 16, 2026 00:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant