feat(whatsnew): экран «Что нового» — автопоказ после апдейта + кнопка в Settings

- src/shared/release-notes.ts — статический реестр заметок per-version
  (RU + EN), с тегами new/fix/security/perf для tint'а иконок.
- Settings.lastSeenVersion — версия, для которой пользователь видел
  модалку. Валидатор регэксом /^\d+\.\d+\.\d+(-[\w.]+)?$/.
- IPC.getAppVersion → app.getVersion() для renderer'а.
- WhatsNewModal — список пунктов с цветовыми иконками. Footer-кнопка
  «Понятно» / «Got it».
- App.tsx: после hydrate смотрит lastSeenVersion → current. Если
  расходятся и есть пропущенные заметки → автопоказ. На первой
  записи (lastSeenVersion === undefined) — тихо записываем, без
  модалки, чтобы не бить нового пользователя CHANGELOG'ом.
- Settings → раздел «О приложении» → кнопка «Открыть» показывает
  модалку с заметками всех релизов.
This commit is contained in:
AnRil
2026-05-22 13:59:29 +07:00
parent a0b89ddf71
commit 5a9ec04ba8
10 changed files with 479 additions and 0 deletions

View File

@@ -179,6 +179,8 @@ export function registerIpc(): void {
nativeTheme.shouldUseDarkColors ? 'dark' : 'light'
)
ipcMain.handle(IPC.getAppVersion, () => app.getVersion())
ipcMain.handle(IPC.quit, () => app.quit())
ipcMain.handle(IPC.reminderClose, () => hideReminderWindow())

View File

@@ -303,6 +303,17 @@ export function validateSettingsPatch(raw: unknown): Partial<Settings> | null {
if (v === undefined) return null
out.meetingAutoPause = v
}
if ('lastSeenVersion' in raw) {
// Принимаем строку 0.0.0 .. 999.999.999 (semver-light) или null/undefined
// для сброса.
if (raw.lastSeenVersion === null || raw.lastSeenVersion === undefined) {
out.lastSeenVersion = undefined
} else {
const v = safeStr(raw.lastSeenVersion, 32)
if (v === undefined || !/^\d+\.\d+\.\d+(-[\w.]+)?$/.test(v)) return null
out.lastSeenVersion = v
}
}
if ('notificationMode' in raw) {
const v = oneOf(raw.notificationMode, VALID_NOTIFY)
if (v === undefined) return null