Skip to content
This repository was archived by the owner on Jan 21, 2024. It is now read-only.

Commit 960e727

Browse files
authored
refactor: use tanstack query to refactor singlePage-related fetching (#886)
#### What type of PR is this? /kind improvement #### What this PR does / why we need it: 使用 [TanStack Query](https://github.com/TanStack/query) 重构页面相关数据请求的相关逻辑。 #### Which issue(s) this PR fixes: Ref halo-dev/halo#3360 #### Special notes for your reviewer: 测试方式: 1. 测试页面管理列表的数据请求 + 条件筛选无异常即可。 #### Does this PR introduce a user-facing change? ```release-note None ```
1 parent dc9c606 commit 960e727

File tree

2 files changed

+260
-317
lines changed

2 files changed

+260
-317
lines changed

src/modules/contents/pages/DeletedSinglePageList.vue

Lines changed: 50 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -17,93 +17,57 @@ import {
1717
VLoading,
1818
Toast,
1919
} from "@halo-dev/components";
20-
import { onMounted, ref, watch } from "vue";
21-
import type { ListedSinglePageList, SinglePage } from "@halo-dev/api-client";
20+
import { ref, watch } from "vue";
21+
import type { ListedSinglePage, SinglePage } from "@halo-dev/api-client";
2222
import { apiClient } from "@/utils/api-client";
2323
import { formatDatetime } from "@/utils/date";
24-
import { onBeforeRouteLeave, RouterLink } from "vue-router";
24+
import { RouterLink } from "vue-router";
2525
import cloneDeep from "lodash.clonedeep";
2626
import { usePermission } from "@/utils/permission";
2727
import { getNode } from "@formkit/core";
2828
import FilterTag from "@/components/filter/FilterTag.vue";
29+
import { useQuery } from "@tanstack/vue-query";
2930
3031
const { currentUserHasPermission } = usePermission();
3132
32-
const singlePages = ref<ListedSinglePageList>({
33-
page: 1,
34-
size: 50,
35-
total: 0,
36-
items: [],
37-
first: true,
38-
last: false,
39-
hasNext: false,
40-
hasPrevious: false,
41-
totalPages: 0,
42-
});
43-
const loading = ref(false);
4433
const selectedPageNames = ref<string[]>([]);
4534
const checkedAll = ref(false);
46-
const refreshInterval = ref();
4735
const keyword = ref("");
4836
49-
const handleFetchSinglePages = async (options?: {
50-
mute?: boolean;
51-
page?: number;
52-
}) => {
53-
try {
54-
clearInterval(refreshInterval.value);
55-
56-
if (!options?.mute) {
57-
loading.value = true;
58-
}
59-
60-
if (options?.page) {
61-
singlePages.value.page = options.page;
62-
}
37+
const page = ref(1);
38+
const size = ref(20);
39+
const total = ref(0);
6340
41+
const {
42+
data: singlePages,
43+
isLoading,
44+
isFetching,
45+
refetch,
46+
} = useQuery<ListedSinglePage[]>({
47+
queryKey: ["deleted-singlePages", page, size, keyword],
48+
queryFn: async () => {
6449
const { data } = await apiClient.singlePage.listSinglePages({
6550
labelSelector: [`content.halo.run/deleted=true`],
66-
page: singlePages.value.page,
67-
size: singlePages.value.size,
51+
page: page.value,
52+
size: size.value,
6853
keyword: keyword.value,
6954
});
7055
71-
singlePages.value = data;
56+
total.value = data.total;
7257
73-
const deletedSinglePages = singlePages.value.items.filter(
58+
return data.items;
59+
},
60+
refetchOnWindowFocus: false,
61+
refetchInterval(data) {
62+
const deletedSinglePages = data?.filter(
7463
(singlePage) =>
7564
!!singlePage.page.metadata.deletionTimestamp ||
7665
!singlePage.page.spec.deleted
7766
);
78-
79-
if (deletedSinglePages.length) {
80-
refreshInterval.value = setInterval(() => {
81-
handleFetchSinglePages({ mute: true });
82-
}, 3000);
83-
}
84-
} catch (error) {
85-
console.error("Failed to fetch deleted single pages", error);
86-
} finally {
87-
loading.value = false;
88-
}
89-
};
90-
91-
onBeforeRouteLeave(() => {
92-
clearInterval(refreshInterval.value);
67+
return deletedSinglePages?.length ? 3000 : false;
68+
},
9369
});
9470
95-
const handlePaginationChange = ({
96-
page,
97-
size,
98-
}: {
99-
page: number;
100-
size: number;
101-
}) => {
102-
singlePages.value.page = page;
103-
singlePages.value.size = size;
104-
handleFetchSinglePages();
105-
};
106-
10771
const checkSelection = (singlePage: SinglePage) => {
10872
return selectedPageNames.value.includes(singlePage.metadata.name);
10973
};
@@ -113,7 +77,7 @@ const handleCheckAllChange = (e: Event) => {
11377
11478
if (checked) {
11579
selectedPageNames.value =
116-
singlePages.value.items.map((singlePage) => {
80+
singlePages.value?.map((singlePage) => {
11781
return singlePage.page.metadata.name;
11882
}) || [];
11983
} else {
@@ -132,7 +96,7 @@ const handleDeletePermanently = async (singlePage: SinglePage) => {
13296
name: singlePage.metadata.name,
13397
}
13498
);
135-
await handleFetchSinglePages();
99+
await refetch();
136100
137101
Toast.success("删除成功");
138102
},
@@ -154,7 +118,7 @@ const handleDeletePermanentlyInBatch = async () => {
154118
);
155119
})
156120
);
157-
await handleFetchSinglePages();
121+
await refetch();
158122
selectedPageNames.value = [];
159123
160124
Toast.success("删除成功");
@@ -175,7 +139,7 @@ const handleRecovery = async (singlePage: SinglePage) => {
175139
singlePage: singlePageToUpdate,
176140
}
177141
);
178-
await handleFetchSinglePages();
142+
await refetch();
179143
180144
Toast.success("恢复成功");
181145
},
@@ -189,24 +153,29 @@ const handleRecoveryInBatch = async () => {
189153
onConfirm: async () => {
190154
await Promise.all(
191155
selectedPageNames.value.map((name) => {
192-
const singlePage = singlePages.value.items.find(
156+
const singlePage = singlePages.value?.find(
193157
(item) => item.page.metadata.name === name
194158
)?.page;
195159
196160
if (!singlePage) {
197161
return Promise.resolve();
198162
}
199163
200-
singlePage.spec.deleted = false;
201164
return apiClient.extension.singlePage.updatecontentHaloRunV1alpha1SinglePage(
202165
{
203166
name: singlePage.metadata.name,
204-
singlePage: singlePage,
167+
singlePage: {
168+
...singlePage,
169+
spec: {
170+
...singlePage.spec,
171+
deleted: false,
172+
},
173+
},
205174
}
206175
);
207176
})
208177
);
209-
await handleFetchSinglePages();
178+
await refetch();
210179
selectedPageNames.value = [];
211180
212181
Toast.success("恢复成功");
@@ -215,23 +184,21 @@ const handleRecoveryInBatch = async () => {
215184
};
216185
217186
watch(selectedPageNames, (newValue) => {
218-
checkedAll.value = newValue.length === singlePages.value.items?.length;
187+
checkedAll.value = newValue.length === singlePages.value?.length;
219188
});
220189
221-
onMounted(handleFetchSinglePages);
222-
223190
// Filters
224191
function handleKeywordChange() {
225192
const keywordNode = getNode("keywordInput");
226193
if (keywordNode) {
227194
keyword.value = keywordNode._value as string;
228195
}
229-
handleFetchSinglePages({ page: 1 });
196+
page.value = 1;
230197
}
231198
232199
function handleClearKeyword() {
233200
keyword.value = "";
234-
handleFetchSinglePages({ page: 1 });
201+
page.value = 1;
235202
}
236203
</script>
237204

@@ -307,10 +274,10 @@ function handleClearKeyword() {
307274
<div class="flex flex-row gap-2">
308275
<div
309276
class="group cursor-pointer rounded p-1 hover:bg-gray-200"
310-
@click="handleFetchSinglePages()"
277+
@click="refetch()"
311278
>
312279
<IconRefreshLine
313-
:class="{ 'animate-spin text-gray-900': loading }"
280+
:class="{ 'animate-spin text-gray-900': isFetching }"
314281
class="h-4 w-4 text-gray-600 group-hover:text-gray-900"
315282
/>
316283
</div>
@@ -320,15 +287,15 @@ function handleClearKeyword() {
320287
</div>
321288
</div>
322289
</template>
323-
<VLoading v-if="loading" />
324-
<Transition v-else-if="!singlePages.items.length" appear name="fade">
290+
<VLoading v-if="isLoading" />
291+
<Transition v-else-if="!singlePages?.length" appear name="fade">
325292
<VEmpty
326293
message="你可以尝试刷新或者返回自定义页面管理"
327294
title="没有自定义页面被放入回收站"
328295
>
329296
<template #actions>
330297
<VSpace>
331-
<VButton @click="handleFetchSinglePages">刷新</VButton>
298+
<VButton @click="refetch">刷新</VButton>
332299
<VButton
333300
v-permission="['system:singlepages:view']"
334301
:route="{ name: 'SinglePages' }"
@@ -345,7 +312,7 @@ function handleClearKeyword() {
345312
class="box-border h-full w-full divide-y divide-gray-100"
346313
role="list"
347314
>
348-
<li v-for="(singlePage, index) in singlePages.items" :key="index">
315+
<li v-for="(singlePage, index) in singlePages" :key="index">
349316
<VEntity :is-selected="checkSelection(singlePage.page)">
350317
<template
351318
v-if="currentUserHasPermission(['system:singlepages:manage'])"
@@ -445,11 +412,10 @@ function handleClearKeyword() {
445412
<template #footer>
446413
<div class="bg-white sm:flex sm:items-center sm:justify-end">
447414
<VPagination
448-
:page="singlePages.page"
449-
:size="singlePages.size"
450-
:total="singlePages.total"
415+
v-model:page="page"
416+
v-model:size="size"
417+
:total="total"
451418
:size-options="[20, 30, 50, 100]"
452-
@change="handlePaginationChange"
453419
/>
454420
</div>
455421
</template>

0 commit comments

Comments
 (0)