相关修复

This commit is contained in:
zhx 2026-07-05 01:56:01 +08:00
parent 08872009e1
commit feefcba3c8

View File

@ -400,6 +400,8 @@ export function useResourceListPage() {
const [form, setForm] = useState(emptyResourceForm); const [form, setForm] = useState(emptyResourceForm);
const [selectedResource, setSelectedResource] = useState(null); const [selectedResource, setSelectedResource] = useState(null);
const [loadingAction, setLoadingAction] = useState(""); const [loadingAction, setLoadingAction] = useState("");
const [resourceRowPatches, setResourceRowPatches] = useState({});
const [hiddenResourceIds, setHiddenResourceIds] = useState([]);
const filters = useMemo( const filters = useMemo(
() => ({ () => ({
keyword: query, keyword: query,
@ -416,6 +418,53 @@ export function useResourceListPage() {
pageSize, pageSize,
queryKey: ["resources", filters, page], queryKey: ["resources", filters, page],
}); });
const hiddenResourceIdSet = useMemo(() => new Set(hiddenResourceIds), [hiddenResourceIds]);
const resourceData = useMemo(() => {
const source = result.data || emptyData;
const sourceItems = Array.isArray(source.items) ? source.items : [];
const patchedItems = sourceItems
.map((item) => ({
...item,
...(resourceRowPatches[item.resourceId] || {}),
}))
.filter((item) => !hiddenResourceIdSet.has(item.resourceId));
return {
...source,
items: patchedItems,
};
}, [hiddenResourceIdSet, resourceRowPatches, result.data]);
useEffect(() => {
setResourceRowPatches({});
setHiddenResourceIds([]);
}, [filters]);
const patchResourceRow = (resourceId, patch) => {
if (!resourceId) {
return;
}
setHiddenResourceIds((current) => current.filter((hiddenId) => hiddenId !== resourceId));
setResourceRowPatches((current) => ({
...current,
[resourceId]: {
...(current[resourceId] || {}),
...patch,
},
}));
};
const hideResourceRow = (resourceId) => {
if (!resourceId) {
return;
}
setHiddenResourceIds((current) => (current.includes(resourceId) ? current : [...current, resourceId]));
};
const reloadResources = async () => {
setResourceRowPatches({});
setHiddenResourceIds([]);
return result.reload();
};
const openCreateResource = () => { const openCreateResource = () => {
setForm(emptyResourceForm()); setForm(emptyResourceForm());
@ -469,12 +518,21 @@ export function useResourceListPage() {
`resource-status-${resource.resourceId}`, `resource-status-${resource.resourceId}`,
nextEnabled ? "资源已启用" : "资源已禁用", nextEnabled ? "资源已启用" : "资源已禁用",
async () => { async () => {
let updatedResource;
if (nextStatus === "active") { if (nextStatus === "active") {
await enableResource(resource.resourceId); updatedResource = await enableResource(resource.resourceId);
} else { } else {
await disableResource(resource.resourceId); updatedResource = await disableResource(resource.resourceId);
}
if (status && nextStatus !== status) {
hideResourceRow(resource.resourceId);
} else {
patchResourceRow(resource.resourceId, {
...(updatedResource || {}),
status: updatedResource?.status || nextStatus,
updatedAtMs: updatedResource?.updatedAtMs ?? Date.now(),
});
} }
await result.reload();
}, },
); );
}; };
@ -494,8 +552,12 @@ export function useResourceListPage() {
...emptyResourceForm(resource), ...emptyResourceForm(resource),
managerGrantEnabled: nextEnabled, managerGrantEnabled: nextEnabled,
}); });
await updateResource(resource.resourceId, buildResourcePayload(formValue)); const updatedResource = await updateResource(resource.resourceId, buildResourcePayload(formValue));
await result.reload(); patchResourceRow(resource.resourceId, {
...(updatedResource || {}),
managerGrantEnabled: updatedResource?.managerGrantEnabled ?? nextEnabled,
updatedAtMs: updatedResource?.updatedAtMs ?? Date.now(),
});
}, },
); );
}; };
@ -520,7 +582,7 @@ export function useResourceListPage() {
}; };
return { return {
...sharedPageState({ page, query, result, setPage, setQuery }), ...sharedPageState({ data: resourceData, page, query, reload: reloadResources, result, setPage, setQuery }),
abilities, abilities,
activeAction, activeAction,
changeResourceType: resetSetter(setResourceType, setPage), changeResourceType: resetSetter(setResourceType, setPage),
@ -1883,14 +1945,14 @@ export function useResourceGrantListPage() {
}; };
} }
function sharedPageState({ page, query, result, setPage, setQuery }) { function sharedPageState({ data, page, query, reload, result, setPage, setQuery }) {
return { return {
data: result.data || emptyData, data: data || result.data || emptyData,
error: result.error, error: result.error,
loading: result.loading, loading: result.loading,
page, page,
query, query,
reload: result.reload, reload: reload || result.reload,
setPage, setPage,
changeQuery: resetSetter(setQuery, setPage), changeQuery: resetSetter(setQuery, setPage),
}; };