"use client"; import { Import, LoaderCircle, Search } from "lucide-react"; import { useMemo } from "react"; import { Button } from "@/components/ui/button"; import { Checkbox } from "@/components/ui/checkbox"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Input } from "@/components/ui/input"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { PAGE_SIZE_OPTIONS, useSettingsStore } from "../store"; export function ImportBrowserDialog() { const browserOpen = useSettingsStore((state) => state.browserOpen); const browserPool = useSettingsStore((state) => state.browserPool); const remoteFiles = useSettingsStore((state) => state.remoteFiles); const selectedNames = useSettingsStore((state) => state.selectedNames); const fileQuery = useSettingsStore((state) => state.fileQuery); const filePage = useSettingsStore((state) => state.filePage); const pageSize = useSettingsStore((state) => state.pageSize); const isStartingImport = useSettingsStore((state) => state.isStartingImport); const setBrowserOpen = useSettingsStore((state) => state.setBrowserOpen); const toggleFile = useSettingsStore((state) => state.toggleFile); const replaceSelectedNames = useSettingsStore((state) => state.replaceSelectedNames); const setFileQuery = useSettingsStore((state) => state.setFileQuery); const setFilePage = useSettingsStore((state) => state.setFilePage); const setPageSize = useSettingsStore((state) => state.setPageSize); const startImport = useSettingsStore((state) => state.startImport); const filteredFiles = useMemo(() => { const query = fileQuery.trim().toLowerCase(); if (!query) { return remoteFiles; } return remoteFiles.filter((item) => { return item.email.toLowerCase().includes(query) || item.name.toLowerCase().includes(query); }); }, [fileQuery, remoteFiles]); const currentPageSize = Number(pageSize); const filePageCount = Math.max(1, Math.ceil(filteredFiles.length / currentPageSize)); const safeFilePage = Math.min(filePage, filePageCount); const pagedFiles = filteredFiles.slice((safeFilePage - 1) * currentPageSize, safeFilePage * currentPageSize); const allFilteredSelected = filteredFiles.length > 0 && filteredFiles.every((item) => selectedNames.includes(item.name)); const toggleSelectAllFiltered = (checked: boolean) => { if (checked) { replaceSelectedNames([...selectedNames, ...filteredFiles.map((item) => item.name)]); return; } const filteredSet = new Set(filteredFiles.map((item) => item.name)); replaceSelectedNames(selectedNames.filter((name) => !filteredSet.has(name))); }; return ( 选择要导入的账号 {browserPool ? `来自 ${browserPool.name || browserPool.base_url}` : "读取到的远程账号列表"}
setFileQuery(event.target.value)} placeholder="搜索 email 或文件名" className="h-10 rounded-xl border-stone-200 bg-white pl-10" />
toggleSelectAllFiltered(Boolean(checked))} /> 筛选结果 {filteredFiles.length} 个
已选 {selectedNames.length} 个
{pagedFiles.length === 0 ? (
没有匹配的远程账号
) : (
{pagedFiles.map((item) => ( ))}
)}
第 {filteredFiles.length === 0 ? 0 : (safeFilePage - 1) * currentPageSize + 1} -{" "} {Math.min(safeFilePage * currentPageSize, filteredFiles.length)} 条,共 {filteredFiles.length} 条
{safeFilePage}/{filePageCount}
); }