import axios from 'axios' /** * Source of truth для access token. {@link TokenSync} обновляет это значение * синхронно при изменении OIDC user state. Interceptor читает из in-memory * holder'а — никаких {@code defaults.headers}, никаких {@code localStorage} poll'ов. * *
Зачем in-memory holder, не localStorage: *
Backend сериализует Spring {@code Page {@code payload} — JSON payload эвента (e.g. RecordDraftApproved).
* {@code payloadPreview} — server-pre-rendered summary string чтобы UI
* не парсил event payload (event_type → user-facing text mapping живёт
* backend'е).
*/
export type NotificationItem = {
id: string
eventType: string
channel: 'EMAIL' | 'EXPRESS' | 'TELEGRAM' | 'IN_APP'
sentAt: string
read: boolean
payloadPreview: string
/** Optional deep-link (e.g. /reviews/{draftId} для draft decision). */
href?: string | null
}
export type NotificationsResponse = {
items: NotificationItem[]
page: number
size: number
totalElements: number
/** Unread count for badge — pre-filtered server-side. */
totalUnread: number
}
/**
* Phase B-2 — per-(eventType, channel) notification opt-in/out для current
* user. Backend endpoint: GET/PUT /api/v1/me/notifications/preferences.
*
* Matrix shape: 4 known event types × 3 channels = 12 toggles. User может
* opt-out 'Submitted via email' (queue noise) keep 'Approved via email'
* (action confirmation).
*
* Defaults (server-side, для missing rows):
* email=true, express=false, telegram=false.
*
* Resolution для каждой ячейки: specific row → wildcard '*' (Phase B
* compat) → default policy.
*
* Express/Telegram channels не wired backend-side — toggles в UI disabled.
*/
export type ChannelToggles = {
email: boolean
express: boolean
telegram: boolean
}
/** Map keyed по event type. Backend сейчас возвращает 4 known events. */
export type NotificationPreferences = Record
*
*/
export type ScheduledRecordsSummary = {
count: number
nearestValidFrom: string | null
/** Top-50 sorted asc upcoming validFrom ISO timestamps — для TimeTravel marks. */
upcomingValidFroms: string[]
}