[questions][feat] add load more button for all paginated queries

pull/457/head
Jeff Sieu 3 years ago
parent 3f0c4bdf90
commit 97df92292a

@ -0,0 +1,25 @@
import type { UseInfiniteQueryResult } from 'react-query';
import { Button } from '@tih/ui';
export type PaginationLoadMoreButtonProps = {
query: UseInfiniteQueryResult;
};
export default function PaginationLoadMoreButton(
props: PaginationLoadMoreButtonProps,
) {
const {
query: { hasNextPage, isFetchingNextPage, fetchNextPage },
} = props;
return (
<Button
disabled={!hasNextPage || isFetchingNextPage}
isLoading={isFetchingNextPage}
label={hasNextPage ? 'Load more' : 'Nothing more to load'}
variant="tertiary"
onClick={() => {
fetchNextPage();
}}
/>
);
}

@ -8,6 +8,7 @@ import { Button, TextArea } from '@tih/ui';
import AnswerCommentListItem from '~/components/questions/AnswerCommentListItem'; import AnswerCommentListItem from '~/components/questions/AnswerCommentListItem';
import FullAnswerCard from '~/components/questions/card/FullAnswerCard'; import FullAnswerCard from '~/components/questions/card/FullAnswerCard';
import FullScreenSpinner from '~/components/questions/FullScreenSpinner'; import FullScreenSpinner from '~/components/questions/FullScreenSpinner';
import PaginationLoadMoreButton from '~/components/questions/PaginationLoadMoreButton';
import SortOptionsSelect from '~/components/questions/SortOptionsSelect'; import SortOptionsSelect from '~/components/questions/SortOptionsSelect';
import { APP_TITLE } from '~/utils/questions/constants'; import { APP_TITLE } from '~/utils/questions/constants';
@ -47,11 +48,12 @@ export default function QuestionPage() {
{ answerId: answerId as string }, { answerId: answerId as string },
]); ]);
const { data: answerCommentsData } = trpc.useInfiniteQuery( const answerCommentInfiniteQuery = trpc.useInfiniteQuery(
[ [
'questions.answers.comments.getAnswerComments', 'questions.answers.comments.getAnswerComments',
{ {
answerId: answerId as string, answerId: answerId as string,
limit: 5,
sortOrder: commentSortOrder, sortOrder: commentSortOrder,
sortType: commentSortType, sortType: commentSortType,
}, },
@ -62,6 +64,8 @@ export default function QuestionPage() {
}, },
); );
const { data: answerCommentsData } = answerCommentInfiniteQuery;
const { mutate: addComment } = trpc.useMutation( const { mutate: addComment } = trpc.useMutation(
'questions.answers.comments.user.create', 'questions.answers.comments.user.create',
{ {
@ -168,6 +172,7 @@ export default function QuestionPage() {
/> />
)), )),
)} )}
<PaginationLoadMoreButton query={answerCommentInfiniteQuery} />
</div> </div>
</div> </div>
</div> </div>

@ -9,6 +9,7 @@ import AnswerCommentListItem from '~/components/questions/AnswerCommentListItem'
import FullQuestionCard from '~/components/questions/card/question/FullQuestionCard'; import FullQuestionCard from '~/components/questions/card/question/FullQuestionCard';
import QuestionAnswerCard from '~/components/questions/card/QuestionAnswerCard'; import QuestionAnswerCard from '~/components/questions/card/QuestionAnswerCard';
import FullScreenSpinner from '~/components/questions/FullScreenSpinner'; import FullScreenSpinner from '~/components/questions/FullScreenSpinner';
import PaginationLoadMoreButton from '~/components/questions/PaginationLoadMoreButton';
import SortOptionsSelect from '~/components/questions/SortOptionsSelect'; import SortOptionsSelect from '~/components/questions/SortOptionsSelect';
import { APP_TITLE } from '~/utils/questions/constants'; import { APP_TITLE } from '~/utils/questions/constants';
@ -80,10 +81,11 @@ export default function QuestionPage() {
const utils = trpc.useContext(); const utils = trpc.useContext();
const { data: commentData } = trpc.useInfiniteQuery( const commentInfiniteQuery = trpc.useInfiniteQuery(
[ [
'questions.questions.comments.getQuestionComments', 'questions.questions.comments.getQuestionComments',
{ {
limit: 5,
questionId: questionId as string, questionId: questionId as string,
sortOrder: commentSortOrder, sortOrder: commentSortOrder,
sortType: commentSortType, sortType: commentSortType,
@ -95,6 +97,8 @@ export default function QuestionPage() {
}, },
); );
const { data: commentData } = commentInfiniteQuery;
const { mutate: addComment } = trpc.useMutation( const { mutate: addComment } = trpc.useMutation(
'questions.questions.comments.user.create', 'questions.questions.comments.user.create',
{ {
@ -106,10 +110,11 @@ export default function QuestionPage() {
}, },
); );
const { data: answerData } = trpc.useInfiniteQuery( const answerInfiniteQuery = trpc.useInfiniteQuery(
[ [
'questions.answers.getAnswers', 'questions.answers.getAnswers',
{ {
limit: 5,
questionId: questionId as string, questionId: questionId as string,
sortOrder: answerSortOrder, sortOrder: answerSortOrder,
sortType: answerSortType, sortType: answerSortType,
@ -121,6 +126,8 @@ export default function QuestionPage() {
}, },
); );
const { data: answerData } = answerInfiniteQuery;
const { mutate: addAnswer } = trpc.useMutation( const { mutate: addAnswer } = trpc.useMutation(
'questions.answers.user.create', 'questions.answers.user.create',
{ {
@ -256,6 +263,7 @@ export default function QuestionPage() {
/> />
)), )),
)} )}
<PaginationLoadMoreButton query={commentInfiniteQuery} />
</div> </div>
</div> </div>
</Collapsible> </Collapsible>
@ -311,6 +319,7 @@ export default function QuestionPage() {
/> />
)), )),
)} )}
<PaginationLoadMoreButton query={answerInfiniteQuery} />
</div> </div>
</div> </div>
</div> </div>

@ -10,6 +10,7 @@ import { Button, SlideOut } from '@tih/ui';
import QuestionOverviewCard from '~/components/questions/card/question/QuestionOverviewCard'; import QuestionOverviewCard from '~/components/questions/card/question/QuestionOverviewCard';
import ContributeQuestionCard from '~/components/questions/ContributeQuestionCard'; import ContributeQuestionCard from '~/components/questions/ContributeQuestionCard';
import FilterSection from '~/components/questions/filter/FilterSection'; import FilterSection from '~/components/questions/filter/FilterSection';
import PaginationLoadMoreButton from '~/components/questions/PaginationLoadMoreButton';
import QuestionSearchBar from '~/components/questions/QuestionSearchBar'; import QuestionSearchBar from '~/components/questions/QuestionSearchBar';
import CompanyTypeahead from '~/components/questions/typeahead/CompanyTypeahead'; import CompanyTypeahead from '~/components/questions/typeahead/CompanyTypeahead';
import LocationTypeahead from '~/components/questions/typeahead/LocationTypeahead'; import LocationTypeahead from '~/components/questions/typeahead/LocationTypeahead';
@ -145,12 +146,7 @@ export default function QuestionsBrowsePage() {
: undefined; : undefined;
}, [selectedQuestionAge]); }, [selectedQuestionAge]);
const { const questionsInfiniteQuery = trpc.useInfiniteQuery(
data: questionsQueryData,
fetchNextPage,
hasNextPage,
isFetchingNextPage,
} = trpc.useInfiniteQuery(
[ [
'questions.questions.getQuestionsByFilter', 'questions.questions.getQuestionsByFilter',
{ {
@ -171,6 +167,8 @@ export default function QuestionsBrowsePage() {
}, },
); );
const { data: questionsQueryData } = questionsInfiniteQuery;
const questionCount = useMemo(() => { const questionCount = useMemo(() => {
if (!questionsQueryData) { if (!questionsQueryData) {
return undefined; return undefined;
@ -504,15 +502,7 @@ export default function QuestionsBrowsePage() {
); );
}), }),
)} )}
<Button <PaginationLoadMoreButton query={questionsInfiniteQuery} />
disabled={!hasNextPage || isFetchingNextPage}
isLoading={isFetchingNextPage}
label={hasNextPage ? 'Load more' : 'Nothing more to load'}
variant="tertiary"
onClick={() => {
fetchNextPage();
}}
/>
{questionCount === 0 && ( {questionCount === 0 && (
<div className="flex w-full items-center justify-center gap-2 rounded-md border border-slate-300 bg-slate-200 p-4 text-slate-600"> <div className="flex w-full items-center justify-center gap-2 rounded-md border border-slate-300 bg-slate-200 p-4 text-slate-600">
<NoSymbolIcon className="h-6 w-6" /> <NoSymbolIcon className="h-6 w-6" />

Loading…
Cancel
Save