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) ? (