/** * 通知频道 tab 内容片:channels 逐项按类型分派(内置两卡 + bark/webhook 实例卡)+ 添加频道按钮 * + 仅提交 channels 键的域保存行。 * * 普通函数返回 JSX 数组(卡片对它做**条件调用**——非 active tab 根本不调用;改成组件会引入 * 挂载/卸载语义)。依赖收在单一 deps 对象里显式传入:本模块零 state、零 ref、零定时器、 * 零模块级可变状态,也不从 SettingsCard 闭包取值。 * * 为什么用 deps 对象而不是位置参数:这里要转发的正是三张卡各自的依赖(builtin 12 / webhook 12 / * bark 15 项,并集 25 项),位置参数会退化成一张无法审阅的长表;对象形态字段名即语义, * 与三张卡显式传参的既有形态同源。 */ import * as React from "react"; import type { ClientDiagnosticsView } from "../../capabilities.js"; import type { Translate } from "../../locale.js"; import type { AudioEngine } from "../../notify/audio.js"; import type { ChannelStatusMap } from "../parts/status.tsx"; import type { HistoryRecordView, RegisteredKindView, SettingsChannelView, SettingsView } from "../types.js"; /** 频道 tab 的依赖面(三张卡的并集 + 本片自用的添加/域保存入口)。 */ interface ChannelsPaneDeps { settings: SettingsView; statusMap: ChannelStatusMap; history: HistoryRecordView[] | null; hostPlatform: string | null; diag: ClientDiagnosticsView; channelLabel: (c: SettingsChannelView) => string; chPatch: (idx: number, part: Record) => void; chRemove: (idx: number) => void; chLevelsSet: (idx: number, kind: string, level: string) => void; chAdd: (kind: string) => void; sendTest: (id?: string) => void; isSecureContext: () => boolean; requestNotificationPermission: () => void; audioEngine: AudioEngine; kindsList: RegisteredKindView[]; delArmedId: string | null; setDelArmedId: (v: string | null) => void; levelsNew: Record; setLevelsNew: (next: Record) => void; revealMap: Record; setRevealMap: (next: Record) => void; secretEdited: Record; markSecretEdited: (key: string) => void; saving: boolean; saveFor: (entry: string, quietIfEmpty?: boolean) => void; /** 频道域是否有脏(测试按钮切文案 + 徽标 + title 的依据,B-S1-3)。 */ testDirty: boolean; t: Translate; } /** * 频道 tab 内容片:分派三张卡 + 添加按钮 + 域保存行。 * 域保存:频道 tab 底部「保存频道」只提交 channels 键——与 foot 全量保存语义不同 * (域 vs 全量),不构成此前移除的「双份全量保存」视觉重复。 */ export declare function channelsPane(deps: ChannelsPaneDeps): (React.ReactNode[] | React.JSX.Element)[]; export {};