Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 37 additions & 4 deletions src/components/organization/OrganizationRepos.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -60,13 +60,17 @@ const languageColors: Record<string, string> = {
interface Props {
orgId: string;
canManage: boolean;
/** 外部触发列表刷新的信号,变化时静默重新拉取仓库列表 */
refreshKey?: number;
onChange?: (delta: number) => void;
}

const OrganizationRepos: React.FC<Props> = ({ orgId, canManage, onChange }) => {
const OrganizationRepos: React.FC<Props> = ({ orgId, canManage, refreshKey = 0, onChange }) => {
const { t } = useTranslation("organization");
const [repos, setRepos] = useState<Repo[]>([]);
const [loading, setLoading] = useState(true);
const requestIdRef = useRef(0);
const previousOrgIdRef = useRef(orgId);

// ---- 同步状态文案 ----
const syncStatusText: Record<string, string> = {
Expand All @@ -87,8 +91,16 @@ const OrganizationRepos: React.FC<Props> = ({ orgId, canManage, onChange }) => {

// ---- 获取仓库列表 ----
const fetchRepos = async () => {
if (!orgId) {
return;
}
const requestId = requestIdRef.current + 1;
requestIdRef.current = requestId;
try {
const res = await OrganizationService.getRepos({ org_id: orgId });
if (requestId !== requestIdRef.current) {
return;
}
setRepos(
(res.list || []).map((item: any) => ({
id: String(item.id),
Expand All @@ -108,18 +120,39 @@ const OrganizationRepos: React.FC<Props> = ({ orgId, canManage, onChange }) => {
})),
);
} catch (err: any) {
if (requestId !== requestIdRef.current) {
return;
}
message.error(err?.message || t("repos.fetchFailed"));
}
};

useEffect(() => {
if (!orgId) {
requestIdRef.current += 1;
setRepos([]);
setLoading(false);
return;
}
setLoading(true);
fetchRepos().finally(() => setLoading(false));
}, [orgId]);

const orgChanged = previousOrgIdRef.current !== orgId;
previousOrgIdRef.current = orgId;
if (orgChanged) {
setRepos([]);
setLoading(true);
}

let cancelled = false;
fetchRepos().finally(() => {
if (!cancelled) {
setLoading(false);
}
});
return () => {
cancelled = true;
requestIdRef.current += 1;
};
}, [orgId, refreshKey]);

// ---- 轮询同步状态 ----
useEffect(() => {
Expand Down
3 changes: 3 additions & 0 deletions src/components/organization/OrganizationTabs.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,7 @@ const OrganizationTabs: React.FC<OrganizationTabsProps> = ({
// 仓库添加相关状态
const [repoModalVisible, setRepoModalVisible] = React.useState(false);
const [repoForm, setRepoForm] = React.useState({ name: "", url: "", token: "" });
const [reposRefreshKey, setReposRefreshKey] = React.useState(0);

const handleAddRepo = async () => {
if (!repoForm.name.trim()) {
Expand All @@ -180,6 +181,7 @@ const OrganizationTabs: React.FC<OrganizationTabsProps> = ({
setRepoModalVisible(false);
message.success(t("tabs.message.repoAddSuccess"));
onReposChange?.(1);
setReposRefreshKey((prev) => prev + 1);
} catch {
message.error(t("tabs.message.repoAddFailed"));
}
Expand Down Expand Up @@ -756,6 +758,7 @@ const OrganizationTabs: React.FC<OrganizationTabsProps> = ({
<OrganizationRepos
orgId={org?.id || ""}
canManage={canManageOrg(userRole, currentUser?.role)}
refreshKey={reposRefreshKey}
onChange={onReposChange}
/>
)}
Expand Down
Loading