Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(web): remove navigation items component loading skeleton #724

Merged
merged 3 commits into from
Feb 14, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/great-baboons-learn.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@blobscan/web": patch
---

Removed skeleton display from navigation items component if the env vars are not set
28 changes: 10 additions & 18 deletions apps/web/src/components/NavigationMenus.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,30 +8,22 @@ import {
Transition,
} from "@headlessui/react";
import { ChevronDownIcon } from "@heroicons/react/24/outline";
import Skeleton from "react-loading-skeleton";

import { useHover } from "~/hooks/useHover";
import { useEnv } from "~/providers/Env";
import type { ExpandibleNavigationItem, NavigationItem } from "./content";
import { getNavigationItems, isExpandibleNavigationItem } from "./content";
import type { ExpandibleNavigationItem, NavigationItem } from "../content";
import { getNavigationItems, isExpandibleNavigationItem } from "../content";

export const NavigationMenus: FC = () => {
const { env } = useEnv();

const navigationItems = useMemo(() => {
const networkName = env ? env.PUBLIC_NETWORK_NAME : undefined;
const publicSupportedNetworks = env
? env.PUBLIC_SUPPORTED_NETWORKS
: undefined;

return networkName && publicSupportedNetworks
? getNavigationItems(networkName, publicSupportedNetworks)
: undefined;
}, [env]);

if (!navigationItems) {
return <Skeleton width={20} />;
}
const navigationItems = useMemo(
() =>
getNavigationItems({
networkName: env?.PUBLIC_NETWORK_NAME,
publicSupportedNetworks: env?.PUBLIC_SUPPORTED_NETWORKS,
}),
[env]
);

return (
<div className="items-center gap-4 xl:flex">
Expand Down
56 changes: 24 additions & 32 deletions apps/web/src/components/SidebarNavigationMenu.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,37 +4,33 @@ import { usePathname } from "next/navigation";
import { ChevronDownIcon } from "@heroicons/react/24/outline";
import { Bars3Icon } from "@heroicons/react/24/solid";
import cn from "classnames";
import Skeleton from "react-loading-skeleton";

import { useEnv } from "~/providers/Env";
import type { ExpandibleNavigationItem, NavigationItem } from "../content";
import { isExpandibleNavigationItem, getNavigationItems } from "../content";
import { BlobscanLogo } from "./BlobscanLogo";
import { Collapsable } from "./Collapsable";
import { IconButton } from "./IconButton";
import { Rotable } from "./Rotable";
import { SidePanel, useSidePanel } from "./SidePanel";
import { ThemeModeButton } from "./ThemeModeButton";
import type { ExpandibleNavigationItem, NavigationItem } from "./content";
import { isExpandibleNavigationItem, getNavigationItems } from "./content";

export function SidebarNavigationMenu({ className }: { className?: string }) {
const { env } = useEnv();
const [open, setOpen] = useState(false);
const navigationItems = useMemo(
() =>
getNavigationItems({
networkName: env?.PUBLIC_NETWORK_NAME,
publicSupportedNetworks: env?.PUBLIC_SUPPORTED_NETWORKS,
}),
[env]
);

const openSidebar = useCallback(() => setOpen(true), []);

const closeSidebar = useCallback(() => setOpen(false), []);

const { env } = useEnv();

const navigationItems = useMemo(() => {
const networkName = env ? env.PUBLIC_NETWORK_NAME : undefined;
const publicSupportedNetworks = env
? env.PUBLIC_SUPPORTED_NETWORKS
: undefined;
return networkName && publicSupportedNetworks
? getNavigationItems(networkName, publicSupportedNetworks)
: undefined;
}, [env]);

return (
<div className={className}>
<IconButton onClick={openSidebar}>
Expand All @@ -44,24 +40,20 @@ export function SidebarNavigationMenu({ className }: { className?: string }) {
<div className="p-4 pb-16">
<BlobscanLogo className="mb-8 mt-4 w-40" />
<div className="flex flex-col justify-center gap-2 opacity-80">
{navigationItems ? (
navigationItems.map((item, i) =>
isExpandibleNavigationItem(item) ? (
<ExpandableNavigationLinks
key={`${item.label}-${i}`}
{...item}
onClick={closeSidebar}
/>
) : (
<NavigationLink
key={`${item.label}-${i}`}
{...item}
onClick={closeSidebar}
/>
)
{navigationItems.map((item, i) =>
isExpandibleNavigationItem(item) ? (
<ExpandableNavigationLinks
key={`${item.label}-${i}`}
{...item}
onClick={closeSidebar}
/>
) : (
<NavigationLink
key={`${item.label}-${i}`}
{...item}
onClick={closeSidebar}
/>
)
) : (
<Skeleton width={24} height={34} />
)}
</div>
</div>
Expand Down
15 changes: 9 additions & 6 deletions apps/web/src/components/content.tsx → apps/web/src/content.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -58,10 +58,13 @@ export function isExpandibleNavigationItem(
return typeof item === "object" && item !== null && "items" in item;
}

export const getNavigationItems = (
networkName: string,
publicSupportedNetworks: string
): Array<NavigationItem | ExpandibleNavigationItem> => {
export const getNavigationItems = ({
networkName,
publicSupportedNetworks,
}: {
networkName?: string;
publicSupportedNetworks?: ExpandibleNavigationSubItem[];
}): Array<NavigationItem | ExpandibleNavigationItem> => {
return [
{
label: "Blockchain",
Expand All @@ -84,7 +87,7 @@ export const getNavigationItems = (
{
label: "Networks",
icon: <EthereumIcon />,
items: JSON.parse(publicSupportedNetworks || "[]"),
items: publicSupportedNetworks ?? [],
},
{
label: "Stats",
Expand All @@ -94,7 +97,7 @@ export const getNavigationItems = (
{
label: "API",
icon: <CommandLineIcon />,
href: resolveApiUrl(networkName),
href: networkName ? resolveApiUrl(networkName) : "#",
},
{
label: "Docs",
Expand Down
19 changes: 18 additions & 1 deletion apps/web/src/env.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,11 @@ const booleanSchema = z
.refine((s) => s === "true" || s === "false")
.transform((s) => s === "true");

const publicSupportedNetwork = z.object({
label: z.string(),
href: z.string().url(),
});

const clientEnvVars = {
PUBLIC_BEACON_BASE_URL: z.string().url().default("https://beaconcha.in"),
PUBLIC_EXPLORER_BASE_URL: z.string().url().default("https://etherscan.io"),
Expand All @@ -28,7 +33,19 @@ const clientEnvVars = {
.string()
.default(
'[{"label":"Ethereum Mainnet","href":"https://blobscan.com/"},{"label":"Gnosis","href":"https://gnosis.blobscan.com/"},{"label":"Holesky Testnet","href":"https://holesky.blobscan.com/"},{"label":"Sepolia Testnet","href":"https://sepolia.blobscan.com/"}]'
),
)
.transform((value) => JSON.parse(value))
.transform((value) => {
const res = z.array(publicSupportedNetwork).safeParse(value);

if (!res.success) {
throw new Error(`Failed to parse PUBLIC_SUPPORTED_NETWORKS`, {
cause: res.error,
});
}

return res.data;
}),
PUBLIC_VERCEL_ANALYTICS_ENABLED: booleanSchema.default("false"),
};

Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/pages/block/[id].tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ import type { DetailsLayoutProps } from "~/components/Layouts/DetailsLayout";
import { Link } from "~/components/Link";
import { NavArrows } from "~/components/NavArrows";
import { BlockStatus } from "~/components/Status";
import { getFirstBlobNumber } from "~/components/content";
import { api } from "~/api-client";
import { getFirstBlobNumber } from "~/content";
import NextError from "~/pages/_error";
import { useEnv } from "~/providers/Env";
import type { BlockWithExpandedBlobsAndTransactions } from "~/types";
Expand Down
Loading