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:
@@ -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())
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user