|
1 |
| -import { useState } from 'react'; |
| 1 | +import { useEffect, useState } from 'react'; |
2 | 2 | import { Flex, Grid, GridItem, Input, Spinner, Text } from '@chakra-ui/react';
|
3 | 3 | import { Select } from 'chakra-react-select';
|
4 | 4 | import StatsGraph from './StatsGraph';
|
@@ -93,19 +93,38 @@ const StatsView = () => {
|
93 | 93 | const [globalStartDate, setGlobalStartDate] = useState<Date>();
|
94 | 94 | const [personalStartDate, setPersonalStartDate] = useState<Date>();
|
95 | 95 |
|
96 |
| - const { isLoading: isStatsLoading } = trpc.stats.getTicketStats.useQuery(undefined, { |
| 96 | + const { isFetching: isFetchingStats, fetchNextPage: fetchNextStatsPage, hasNextPage: statsHasNextPage } = |
| 97 | + trpc.stats.getInfiniteTicketStats.useInfiniteQuery({ limit: 10000 }, { |
97 | 98 | refetchOnWindowFocus: false,
|
98 | 99 | onSuccess: data => {
|
99 |
| - setTicketStats(data); |
| 100 | + setTicketStats(data.pages.map(p => p.items).reduce((a, b) => a.concat(b))); |
100 | 101 | },
|
| 102 | + getNextPageParam: (lastPage) => lastPage.nextCursor |
101 | 103 | });
|
102 |
| - const { isLoading: isPersonalStatsLoading } = trpc.stats.getTicketStatsHelpedByUser.useQuery(undefined, { |
| 104 | + |
| 105 | + useEffect(() => { |
| 106 | + if (statsHasNextPage) { |
| 107 | + fetchNextStatsPage(); |
| 108 | + } |
| 109 | + }, [ticketStats]) |
| 110 | + |
| 111 | + const { isFetching: isFetchingPersonalStats, fetchNextPage: fetchNextPersonalStatsPage, hasNextPage: personalStatsHasNextPage } = |
| 112 | + trpc.stats.getInfiniteTicketStats.useInfiniteQuery({ limit: 10000 }, { |
103 | 113 | refetchOnWindowFocus: false,
|
104 | 114 | onSuccess: data => {
|
105 |
| - setPersonalTicketStats(data); |
| 115 | + setPersonalTicketStats(data.pages.map(p => p.items).reduce((a, b) => a.concat(b))); |
106 | 116 | },
|
| 117 | + getNextPageParam: (lastPage) => lastPage.nextCursor |
107 | 118 | });
|
108 | 119 |
|
| 120 | + useEffect(() => { |
| 121 | + if (personalStatsHasNextPage) { |
| 122 | + fetchNextPersonalStatsPage(); |
| 123 | + } |
| 124 | + }, [personalTicketStats]) |
| 125 | + |
| 126 | + const isStatsLoading = isFetchingStats || statsHasNextPage || isFetchingPersonalStats || personalStatsHasNextPage; |
| 127 | + |
109 | 128 | const getStartDateFromCurrent = (timeRangeOption: TimeRangeType) => {
|
110 | 129 | let start = new Date();
|
111 | 130 | switch (timeRangeOption.type) {
|
@@ -142,7 +161,6 @@ const StatsView = () => {
|
142 | 161 | switch (timeRangeOption.type) {
|
143 | 162 | case 'day':
|
144 | 163 | end.setDate(start.getDate() + 1);
|
145 |
| - console.log(startDate, start, end); |
146 | 164 | return { type: timeRangeOption, startTime: start, endTime: end };
|
147 | 165 | case 'week':
|
148 | 166 | end.setDate(start.getDate() + 7);
|
@@ -194,7 +212,7 @@ const StatsView = () => {
|
194 | 212 | <StatsGraph timeRange={getTimeRange(globalTimeRangeOption?.value, globalStartDate)} stats={ticketStats} />
|
195 | 213 | </GridItem>
|
196 | 214 | <GridItem mt={4} rowSpan={1} colSpan={2}>
|
197 |
| - {isStatsLoading || isPersonalStatsLoading ? ( |
| 215 | + {isStatsLoading ? ( |
198 | 216 | <Spinner />
|
199 | 217 | ) : (
|
200 | 218 | <StatsPanel timeRange={getTimeRange(globalTimeRangeOption?.value, globalStartDate)} stats={ticketStats} />
|
@@ -234,7 +252,7 @@ const StatsView = () => {
|
234 | 252 | <StatsGraph timeRange={getTimeRange(personalTimeRangeOption?.value, personalStartDate)} stats={personalTicketStats} />
|
235 | 253 | </GridItem>
|
236 | 254 | <GridItem mt={4} rowSpan={1} colSpan={2}>
|
237 |
| - {isStatsLoading || isPersonalStatsLoading ? ( |
| 255 | + {isStatsLoading ? ( |
238 | 256 | <Spinner />
|
239 | 257 | ) : (
|
240 | 258 | <StatsPanel
|
|
0 commit comments