项目初始化

This commit is contained in:
Ben
2025-04-24 19:13:20 +08:00
parent dd49a93045
commit 33cc46f03e
49 changed files with 6914 additions and 4 deletions

View File

@@ -0,0 +1,155 @@
import type React from "react";
import { useState } from "react";
import {
Card,
Input,
Button,
List,
Space,
Modal,
Checkbox,
message,
Tooltip,
} from "antd";
import { open } from "@tauri-apps/plugin-dialog";
interface GitRepoFormData {
repoPath: string;
name: string;
}
interface GitRepoProps {
onAddRepo: (repo: GitRepoFormData) => void;
repos: GitRepoFormData[];
className?: string;
}
const GitRepo: React.FC<GitRepoProps> = ({ onAddRepo, repos: initialRepos, className }) => {
const [name, setName] = useState("");
const [repoPath, setRepoPath] = useState("");
const [repos, setRepos] = useState<GitRepoFormData[]>(() => {
const savedRepos = localStorage.getItem('gitRepos');
return savedRepos ? JSON.parse(savedRepos) : initialRepos;
});
const handleSubmit = () => {
if (!repoPath) {
message.warning("请选择仓库路径");
return;
}
if (!name) {
message.warning("请输入仓库名称");
return;
}
const newRepo = { name, repoPath };
const updatedRepos = [...repos, newRepo];
localStorage.setItem('gitRepos', JSON.stringify(updatedRepos));
setRepos(updatedRepos);
onAddRepo(newRepo);
setName("");
setRepoPath("");
};
const handleSelectDirectory = async () => {
try {
const selected = await open({
directory: true,
multiple: false,
title: "选择Git仓库目录",
});
console.log("选择的目录:", selected);
if (selected) {
setRepoPath(selected);
}
} catch (error) {
console.error("选择目录失败:", error);
}
};
const [isModalOpen, setIsModalOpen] = useState(false);
const showModal = () => {
setIsModalOpen(true);
};
const handleCancel = () => {
setIsModalOpen(false);
};
const [selectedRepos, setSelectedRepos] = useState<string[]>([]);
const handleCheckboxChange = (checkedValues: string[]) => {
setSelectedRepos(checkedValues);
console.log("选中的仓库:", checkedValues);
};
return (
<div className={className}>
<Card title="Git仓库" className="size-full">
<Modal
title="添加Git仓库"
open={isModalOpen}
onCancel={handleCancel}
footer={
<Button type="primary" onClick={handleSubmit}>
</Button>
}
>
<div className="repo-inputs">
<Space.Compact style={{ width: "100%", marginBottom: 16 }}>
<Input
placeholder="选择Git仓库本地路径"
value={repoPath}
readOnly
/>
<Button onClick={handleSelectDirectory}></Button>
</Space.Compact>
<Input
placeholder="请输入仓库名称"
value={name}
onChange={(e) => setName(e.target.value)}
style={{ marginBottom: 16 }}
/>
</div>
</Modal>
<Checkbox.Group
className="size-full"
value={selectedRepos}
onChange={handleCheckboxChange}
>
<List
className="size-full"
header={
<div className="flex justify-between items-center">
<div></div>
<Button type="primary" onClick={showModal}>
</Button>
</div>
}
bordered
dataSource={repos}
renderItem={(item) => (
<List.Item>
<Tooltip title={item.repoPath}>
<Checkbox value={item.repoPath}>{item.name}</Checkbox>
</Tooltip>
</List.Item>
)}
footer={
selectedRepos.length > 0 && (
<div className="flex justify-end items-center">
<Button type="primary"></Button>
</div>
)
}
/>
</Checkbox.Group>
</Card>
</div>
);
};
export default GitRepo;