diff --git a/package.json b/package.json index 265ae42d..71840a64 100644 --- a/package.json +++ b/package.json @@ -16,13 +16,13 @@ "dependencies": { "@primer/octicons-react": "19.1.0", "@tailwindcss/forms": "0.5.3", + "@tanstack/react-query": "^4.29.12", "@vercel/og": "0.5.6", "dayjs": "1.11.7", "next": "13.4.4", "next-pwa": "5.6.0", "react": "18.2.0", "react-dom": "18.2.0", - "react-hooks-fetch": "0.16.1", "react-use": "17.4.0", "sharp": "0.32.1", "uuid": "9.0.0" diff --git a/pages/kusa/[username].tsx b/pages/kusa/[username].tsx index 011106bd..211a3d53 100644 --- a/pages/kusa/[username].tsx +++ b/pages/kusa/[username].tsx @@ -1,9 +1,11 @@ import Head from 'next/head'; import { GetServerSidePropsContext, GetServerSidePropsResult } from 'next'; -import { FetchProvider, useFetch } from 'react-hooks-fetch'; -import { Suspense } from 'react'; +import { useEffect } from 'react'; +import { useInfiniteQuery, useQueryClient, QueryClient, QueryClientProvider } from '@tanstack/react-query'; import Contributions from '@components/kusa/contributions/contributions'; +const queryClient = new QueryClient(); + type Props = { username: string; todayContributionCount: number; @@ -34,17 +36,52 @@ export const getServerSideProps = async ( return { props: { username, todayContributionCount, yesterdayContributionCount, currentStreak } }; }; -const fetchFunc = async (username: string) => { - const res = await fetch(`https://api.github.com/users/${username}/events?per_page=100&page=1`); - const data = await res.json(); +const createQueryFn = (username: string) => { + const fetchEvents = async ({ pageParam = 1 }) => { + const res = await fetch(`https://api.github.com/users/${username}/events?per_page=100&page=${pageParam}`); + return res.json(); + }; - return data; + return fetchEvents; }; const Detail = ({ username }: { username: string }) => { - const { result, refetch } = useFetch(fetchFunc); + const queryClient = useQueryClient(); + const queryFn = createQueryFn(username); + + const { status, data, error, isFetching, isFetchingNextPage, fetchNextPage, hasNextPage } = useInfiniteQuery( + ['events'], + queryFn, + { + getNextPageParam: (lastPage, allPages) => (allPages.length >= 3 ? undefined : allPages.length + 1), + }, + ); - return ; + useEffect(() => { + fetchNextPage(); + }, [fetchNextPage]); + + return status === 'loading' ? ( +
Loading...
+ ) : status === 'error' ? ( +
Eerror
+ ) : ( + <> +
+ +
+ + + + ); }; const Kusa = (props: Props) => { @@ -79,13 +116,10 @@ const Kusa = (props: Props) => { GitHub Contribution - {desc} - {/* @ts-ignore */} - - Loading...}> - - - +
{desc}
+ + + ); diff --git a/src/components/kusa/contributions/contributions.tsx b/src/components/kusa/contributions/contributions.tsx index a4f5384b..728787c1 100644 --- a/src/components/kusa/contributions/contributions.tsx +++ b/src/components/kusa/contributions/contributions.tsx @@ -42,7 +42,7 @@ const Contributions = (props: Props) => { } else { setApiResult(props.result); } - }, [exclude]); + }, [exclude, props.result]); const handleChange = (e: React.ChangeEvent) => { setExclude(e.target.checked); diff --git a/yarn.lock b/yarn.lock index 5fef90d7..b33688b0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4689,6 +4689,19 @@ dependencies: mini-svg-data-uri "^1.2.3" +"@tanstack/query-core@4.29.11": + version "4.29.11" + resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-4.29.11.tgz#fa338f7d6897c6be5de6d8dabd603d9b78ee48c7" + integrity sha512-8C+hF6SFAb/TlFZyS9FItgNwrw4PMa7YeX+KQYe2ZAiEz6uzg6yIr+QBzPkUwZ/L0bXvGd1sufTm3wotoz+GwQ== + +"@tanstack/react-query@^4.29.12": + version "4.29.12" + resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-4.29.12.tgz#de111cf1d6c389b86acacfaf972302914cfa1208" + integrity sha512-zhcN6+zF6cxprxhTHQajHGlvxgK8npnp9uLe9yaWhGc6sYcPWXzyO4raL4HomUzQOPzu3jLvkriJQ7BOrDM8vA== + dependencies: + "@tanstack/query-core" "4.29.11" + use-sync-external-store "^1.2.0" + "@testing-library/dom@^8.3.0": version "8.18.1" resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.18.1.tgz#80f91be02bc171fe5a3a7003f88207be31ac2cf3" @@ -12677,13 +12690,6 @@ react-element-to-jsx-string@^15.0.0: is-plain-object "5.0.0" react-is "18.1.0" -react-hooks-fetch@0.16.1: - version "0.16.1" - resolved "https://registry.yarnpkg.com/react-hooks-fetch/-/react-hooks-fetch-0.16.1.tgz#21a3ffda3060aeb82b6655b49280f42ea4d608c7" - integrity sha512-f5CQPjtl2gTV4tLv2YooGrbihjLoHqlWZd7+0bM8z14txdHv2r53obFlouPcLnUpY6y3V+hcMyCDhh4A8KIQyg== - dependencies: - use-context-selector "1.4.0" - react-inspector@^6.0.0: version "6.0.1" resolved "https://registry.yarnpkg.com/react-inspector/-/react-inspector-6.0.1.tgz#1a37f0165d9df81ee804d63259eaaeabe841287d" @@ -14771,11 +14777,6 @@ url@^0.11.0: punycode "1.3.2" querystring "0.2.0" -use-context-selector@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/use-context-selector/-/use-context-selector-1.4.0.tgz#fd46afe322e4f7e2d8fba91d806af075d646ef85" - integrity sha512-1vaCjBq/ryq9y79qwh1tkqrUNLYlSLXNHClUkpgBWPvnUV5jqAJvRSsK77mG80uBwNF9HF/kuRyPtXEQhlJ4Jw== - use-resize-observer@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/use-resize-observer/-/use-resize-observer-9.1.0.tgz#14735235cf3268569c1ea468f8a90c5789fc5c6c" @@ -14783,6 +14784,11 @@ use-resize-observer@^9.1.0: dependencies: "@juggle/resize-observer" "^3.3.1" +use-sync-external-store@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" + integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== + use@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"