Skip to content

Commit d19ae67

Browse files
committed
preFetch | manual cache
1 parent 238ee2b commit d19ae67

File tree

3 files changed

+68
-5
lines changed

3 files changed

+68
-5
lines changed

03-issuesApp/src/issues/components/issue-list/IssueCard.vue

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import VueMarkdown from 'vue-markdown-render';
44
55
import { Issue, State } from 'src/issues/interfaces/issue';
66
import { timeSince } from 'src/shared/helpers/time-sync';
7+
import useIssue from 'src/issues/composables/useIssue';
78
89
interface Props {
910
issue: Issue;
@@ -12,10 +13,24 @@ interface Props {
1213
const props = defineProps<Props>();
1314
1415
const issue = toRef(props, 'issue');
16+
17+
const { prefetchIssue, setIssueCacheData } = useIssue(issue.value.number, { autoload: false });
18+
1519
</script>
1620

1721
<template>
18-
<q-card class="text-black col-12 q-mb-md" flat bordered>
22+
<!-- <q-card
23+
@mouseenter="prefetchIssue(issue.number)"
24+
class="text-black col-12 q-mb-md"
25+
flat
26+
bordered
27+
> -->
28+
<q-card
29+
@mouseenter="setIssueCacheData(issue)"
30+
class="text-black col-12 q-mb-md"
31+
flat
32+
bordered
33+
>
1934
<q-item>
2035
<q-item-section avatar>
2136
<q-avatar>

03-issuesApp/src/issues/composables/useIssue.ts

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,48 @@
11
import { githubApi } from 'src/api/githubApi';
22
import { Issue } from '../interfaces/issue';
3-
import { useQuery } from '@tanstack/vue-query';
3+
import { useQuery, useQueryClient } from '@tanstack/vue-query';
44
// import { computed } from 'vue';
55

6+
interface Options {
7+
// Autoload Issue and comments
8+
autoload?: boolean;
9+
}
10+
11+
const sleep = (): Promise<boolean> => {
12+
return new Promise((resolve) => {
13+
setTimeout(() => {
14+
resolve(true);
15+
}, 2000);
16+
});
17+
};
18+
619
const getIssue = async (issueNumber: number): Promise<Issue> => {
20+
await sleep();
21+
722
const { data } = await githubApi.get<Issue>(`/issues/${issueNumber}`);
823
return data;
924
};
1025

1126
const getIssueComments = async (issueNumber: number): Promise<Issue[]> => {
27+
await sleep();
28+
1229
const { data } = await githubApi.get<Issue[]>(
1330
`/issues/${issueNumber}/comments`
1431
);
1532
return data;
1633
};
1734

18-
const useIssue = (issueNumber: number) => {
35+
const useIssue = (issueNumber: number, options?: Options) => {
36+
const { autoload = true } = options || {};
37+
38+
const queryClient = useQueryClient();
39+
1940
const issueQuery = useQuery(
2041
['issue', issueNumber],
2142
() => getIssue(issueNumber),
2243
{
2344
staleTime: 1000 * 60,
45+
enabled: autoload,
2446
}
2547
);
2648

@@ -30,14 +52,40 @@ const useIssue = (issueNumber: number) => {
3052
// () => getIssueComments(issueQuery.data.value?.number || 0),
3153
{
3254
staleTime: 1000 * 60,
55+
enabled: autoload,
3356
// Cambiar cuando exista un valor
3457
// enabled: computed(() => !!issueQuery.data.value),
3558
}
3659
);
3760

61+
const prefetchIssue = (issueNumber: number) => {
62+
queryClient.prefetchQuery(
63+
['issue', issueNumber],
64+
() => getIssue(issueNumber),
65+
{
66+
staleTime: 1000 * 60,
67+
}
68+
);
69+
queryClient.prefetchQuery(
70+
['issue', issueNumber, 'comments'],
71+
() => getIssueComments(issueNumber),
72+
{
73+
staleTime: 1000 * 60,
74+
}
75+
);
76+
};
77+
78+
const setIssueCacheData = (issue: Issue) => {
79+
queryClient.setQueryData(['issue', issue.number], issue);
80+
};
81+
3882
return {
3983
issueQuery,
4084
issueCommentsQuery,
85+
86+
// Methods
87+
prefetchIssue,
88+
setIssueCacheData,
4189
};
4290
};
4391

03-issuesApp/src/issues/pages/IssuePage.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@ const { issueQuery, issueCommentsQuery } = useIssue(+id);
2020
<IssueCard v-else-if="issueQuery.data.value" :issue="issueQuery.data.value" />
2121
<p v-else>Issue #{{ id }} not found</p>
2222
<!-- Comentarios -->
23-
<LoaderSpinner :thickness="1" size="1.5rem" :show-text="false" />
23+
<LoaderSpinner v-if="issueCommentsQuery.isLoading.value" :thickness="1" size="1.5rem" :show-text="false" />
2424

25-
<div class="column" v-if="issueCommentsQuery.data.value">
25+
<div class="column" v-else-if="issueCommentsQuery.data.value">
2626
<span class="text-h5 q-mb-md"
2727
>Comments ({{ issueCommentsQuery.data.value?.length }})</span
2828
>

0 commit comments

Comments
 (0)