diff --git a/components/builds/BuildsSkeleton.tsx b/components/builds/BuildsSkeleton.tsx new file mode 100644 index 000000000..ef80b418d --- /dev/null +++ b/components/builds/BuildsSkeleton.tsx @@ -0,0 +1,32 @@ +import { Flex, Skeleton } from "@chakra-ui/react"; + +const BuildsSkeleton = () => ( + + + + + +); + +export default BuildsSkeleton; diff --git a/hooks/builds.ts b/hooks/builds.ts index 9b9309278..2c55d8869 100644 --- a/hooks/builds.ts +++ b/hooks/builds.ts @@ -110,15 +110,17 @@ export function useBuildsByWeapon() { { weapon: "", filters: [], expandedUsers: new Set() as Set } ); - const { data = [] } = useSWR(() => { + const { data } = useSWR(() => { if (!state.weapon) return null; const key = state.weapon as keyof typeof weaponToCode; return `/api/builds/${weaponToCode[key]}`; }); + const buildArrays = data ?? []; + const buildsToShow = state.filters.length - ? data.reduce((acc: GetBuildsByWeaponData, buildArray) => { + ? buildArrays.reduce((acc: GetBuildsByWeaponData, buildArray) => { const filteredArray = buildArray.filter((build) => { return state.filters.every((filter) => { // @ts-ignore @@ -146,12 +148,13 @@ export function useBuildsByWeapon() { return [...acc, filteredArray]; }, []) - : data; + : buildArrays; return { data: buildsToShow, + isLoading: state.weapon && !data, state, dispatch, - hiddenBuildCount: data.length - buildsToShow.length, + hiddenBuildCount: buildArrays.length - buildsToShow.length, }; } diff --git a/pages/builds/[[...slug]].tsx b/pages/builds/[[...slug]].tsx index a69bef0cd..06f6b90b0 100644 --- a/pages/builds/[[...slug]].tsx +++ b/pages/builds/[[...slug]].tsx @@ -2,6 +2,7 @@ import { Box, Flex } from "@chakra-ui/react"; import { t, Trans } from "@lingui/macro"; import BuildCard from "components/builds/BuildCard"; import BuildFilters from "components/builds/BuildFilters"; +import BuildsSkeleton from "components/builds/BuildsSkeleton"; import Breadcrumbs from "components/common/Breadcrumbs"; import MyInfiniteScroller from "components/common/MyInfiniteScroller"; import WeaponImage from "components/common/WeaponImage"; @@ -10,7 +11,13 @@ import { useBuildsByWeapon } from "hooks/builds"; import { useMyTheme } from "lib/useMyTheme"; const BuildsPage = () => { - const { data, state, dispatch, hiddenBuildCount } = useBuildsByWeapon(); + const { + data, + isLoading, + state, + dispatch, + hiddenBuildCount, + } = useBuildsByWeapon(); const { themeColorHex } = useMyTheme(); return ( <> @@ -21,39 +28,44 @@ const BuildsPage = () => { excludeAlt isHeader /> - {state.weapon && (data.length > 0 || hiddenBuildCount > 0) && ( - <> - + <> + + {state.weapon ? ( - - - - - {data.length} builds{" "} - {hiddenBuildCount > 0 && ( - <> - (+ {hiddenBuildCount} hidden) - - )} - - + ) : ( + + )} + + + + + {data.length} builds{" "} + {hiddenBuildCount > 0 && ( + <> + (+ {hiddenBuildCount} hidden) + + )} + - - )} + + + {state.weapon && ( )} + {isLoading && } + {data.flatMap((buildArray) => state.expandedUsers.has(buildArray[0].userId) ? (