import { createContext, useContext, type Dispatch, type SetStateAction } from 'react' import type { AdminUser } from '@authportal/shared' export type ChangeKind = 'add' | 'chg' | 'del' export type RowMark = 'new' | 'dirty' | 'deleted' export type PendingChange = { id: string kind: ChangeKind title: string /** Раздел, к которому относятся пометки строк («users», «app-links»). */ resource?: string /** Пометки строк: «Не сохранено» (dirty/new) и «Будет удалено» (deleted). */ marks?: Record /** Выполняется при «Сохранить»: окончательно применяет правку (например, убирает удалённую строку). */ commit?: () => void /** Строки diff: «+ …», «− …», « … ». */ lines: string[] /** Откатывает локальное состояние страницы при «Отменить». */ revert?: () => void } export type Density = 'comfortable' | 'compact' export type Contrast = 'standard' | 'high' export type PreviewStore = { pending: PendingChange[] /** Пометки строк раздела из накопленных правок. */ marksFor: (resource: string) => Record addChange: (change: Omit) => void discardAll: () => void applyAll: () => void paletteOpen: boolean setPaletteOpen: (open: boolean) => void /** Каталог пользователей: общий для списка и профиля. */ users: AdminUser[] setUsers: Dispatch> pins: string[] togglePin: (id: string) => void density: Density setDensity: (v: Density) => void contrast: Contrast setContrast: (v: Contrast) => void } export const PreviewStoreContext = createContext(null) export function usePreviewStore(): PreviewStore { const ctx = useContext(PreviewStoreContext) if (!ctx) throw new Error('PreviewProvider отсутствует') return ctx }