import { ReloadOutlined } from "@ant-design/icons" import { Avatar, Button, Checkbox, Empty, Space, Tag, Tooltip, Typography } from "antd" import type { PlatformAuthItem } from "~sync/extension/engine" const { Text } = Typography export interface PlatformPickerProps { platforms: PlatformAuthItem[] selected: string[] loading: boolean onChange: (selected: string[]) => void onRefresh: () => void } /** * 平台选择面板(按分类分组,展示登录状态) */ export default function PlatformPicker({ platforms, selected, loading, onChange, onRefresh }: PlatformPickerProps) { const selectedSet = new Set(selected) function toggle(id: string, checked: boolean) { const next = new Set(selectedSet) if (checked) { next.add(id) } else { next.delete(id) } onChange(Array.from(next)) } function selectAll(authenticatedOnly: boolean) { const next = platforms .filter((p) => (authenticatedOnly ? p.isAuthenticated : true)) .map((p) => p.id) onChange(next) } // 按分类分组 const groups = new Map() for (const platform of platforms) { const category = platform.category || "其他" if (!groups.has(category)) groups.set(category, []) groups.get(category)!.push(platform) } const authenticatedCount = platforms.filter((p) => p.isAuthenticated).length return (
已选 {selected.length} 个平台 {platforms.length === 0 ? ( ) : ( Array.from(groups.entries()).map(([category, items]) => (
{category}
{items.map((platform) => ( toggle(platform.id, checked)} /> ))}
)) )}
) } function PlatformCard({ platform, checked, onToggle }: { platform: PlatformAuthItem checked: boolean onToggle: (checked: boolean) => void }) { const statusTag = platform.isAuthenticated ? ( {platform.username || "已登录"} ) : ( 未登录 ) return (
onToggle(!checked)} style={{ display: "flex", alignItems: "center", gap: 8, padding: "8px 10px", border: checked ? "1px solid #52c41a" : "1px solid #f0f0f0", borderRadius: 8, cursor: "pointer", background: checked ? "#f6ffed" : "#fff" }}> {/* 阻止冒泡,避免点击勾选框时与外层卡片点击重复触发 */} e.stopPropagation()}> onToggle(e.target.checked)} /> {platform.name?.[0]}
{platform.name} {platform.experimental && ( 实验 )}
{platform.error && !platform.isAuthenticated ? ( {statusTag} ) : ( statusTag )}
) }