/** * 成员卡片的「保存后会怎样」预览。 * * 配置草稿和已保存内容不一致时,卡片区不再显示内核现状,而是显示按草稿保存后组里 * 会有谁:留下的照常、将移除的标出来、新增的追加在后面。放在组件外面是为了让 * bun test 够得着——这是纯集合运算,写进 computed 就没人测了。 */ import type { ProxyInfo } from './api' export interface MemberPreview { name: string info: ProxyInfo | undefined /** 现在是成员,保存后不再是 */ removed: boolean /** 现在不是成员,保存后才加入 */ added: boolean } export function mergeMemberPreview( current: Array<{ name: string; info: ProxyInfo | undefined }>, future: string[], lookup: (name: string) => ProxyInfo | undefined, ): MemberPreview[] { const futureSet = new Set(future) const currentNames = new Set(current.map((item) => item.name)) return [ ...current.map((item) => ({ name: item.name, info: item.info, removed: !futureSet.has(item.name), added: false, })), ...future .filter((name) => !currentNames.has(name)) .map((name) => ({ name, info: lookup(name), removed: false, added: true })), ] }