mirror of
https://github.com/lux-tel/websites.git
synced 2026-10-30 20:31:36 +00:00
156 lines
5.0 KiB
TypeScript
156 lines
5.0 KiB
TypeScript
'use client';
|
|
|
|
import { Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle } from '@session/ui/ui/sheet';
|
|
import { useEffect, useMemo, useState } from 'react';
|
|
import Link from 'next/link';
|
|
import { SANITY_UTIL_PATH, SOCIALS } from '@/lib/constants';
|
|
import { Social } from '@session/ui/components/SocialLinkList';
|
|
import type { BuildInfo } from '@session/util-js/build';
|
|
import { getEnvironment, isProduction } from '@session/util-js/env';
|
|
import { CopyToClipboardButton } from '@session/ui/components/CopyToClipboardButton';
|
|
import { getPagesInfo } from '@session/sanity-cms/queries/getPages';
|
|
import { Button } from '@session/ui/ui/button';
|
|
|
|
/** TODO: This was copied from the staking portal, investigate if we can turn it into a shared library */
|
|
|
|
export function DevSheet({
|
|
buildInfo,
|
|
pages,
|
|
isDraftMode,
|
|
}: {
|
|
buildInfo: BuildInfo;
|
|
pages: Awaited<ReturnType<typeof getPagesInfo>>;
|
|
isDraftMode: boolean;
|
|
}) {
|
|
const [isOpen, setIsOpen] = useState(false);
|
|
|
|
useEffect(() => {
|
|
const handleKeyDown = (event: KeyboardEvent) => {
|
|
// Checks for the ctrl + k key combination
|
|
if ((event.ctrlKey || event.metaKey) && event.key === 'k') {
|
|
event.preventDefault();
|
|
setIsOpen((prev) => !prev);
|
|
} else if (event.code === 'Escape') {
|
|
setIsOpen(false);
|
|
}
|
|
};
|
|
|
|
// Add event listener
|
|
document.addEventListener('keydown', handleKeyDown);
|
|
|
|
// Cleanup
|
|
return () => {
|
|
document.removeEventListener('keydown', handleKeyDown);
|
|
};
|
|
}, []);
|
|
|
|
const { COMMIT_HASH, COMMIT_HASH_PRETTY } = buildInfo.env;
|
|
|
|
const textToCopy = useMemo(() => {
|
|
const sections = [
|
|
`Commit Hash: ${COMMIT_HASH}`,
|
|
`Build Env: ${getEnvironment()}`,
|
|
`Is Production: ${isProduction() ? 'True' : 'False'}`,
|
|
`User Agent: ${navigator.userAgent}`,
|
|
];
|
|
return sections.join('\n');
|
|
}, [navigator.userAgent]);
|
|
|
|
return (
|
|
<Sheet open={isOpen}>
|
|
<SheetContent
|
|
closeSheet={() => setIsOpen(false)}
|
|
className="bg-session-white text-session-text-black"
|
|
>
|
|
<SheetHeader>
|
|
<SheetTitle>Welcome to the danger zone</SheetTitle>
|
|
<SheetDescription className="text-session-text-black-secondary">
|
|
This sheet only shows when the site is in development mode.
|
|
</SheetDescription>
|
|
<SheetTitle>
|
|
Build Info{' '}
|
|
{textToCopy ? (
|
|
<CopyToClipboardButton
|
|
className="bg-session-black"
|
|
textToCopy={textToCopy}
|
|
copyToClipboardToastMessage={textToCopy}
|
|
data-testid={'button:dont-worry-about-it'}
|
|
/>
|
|
) : null}
|
|
</SheetTitle>
|
|
<span className="inline-flex justify-start gap-1 align-middle">
|
|
{'Commit Hash:'}
|
|
<Link
|
|
href={`${SOCIALS[Social.Github].link}/commit/${buildInfo.env.COMMIT_HASH}`}
|
|
target="_blank"
|
|
className="text-session-green-dark"
|
|
>
|
|
<span>{COMMIT_HASH_PRETTY}</span>
|
|
</Link>
|
|
</span>
|
|
<span className="inline-flex justify-start gap-1 align-middle">
|
|
{'Build Env:'}
|
|
<span className="text-session-green-dark">{getEnvironment()}</span>
|
|
</span>
|
|
<span className="inline-flex justify-start gap-1 align-middle">
|
|
{'Is Production:'}
|
|
<span className="text-session-green-dark">{isProduction() ? 'True' : 'False'}</span>
|
|
</span>
|
|
<DevSheetCMSNavigator pages={pages} isDraftMode={isDraftMode} />
|
|
</SheetHeader>
|
|
</SheetContent>
|
|
</Sheet>
|
|
);
|
|
}
|
|
|
|
function DevSheetCMSNavigator({
|
|
pages,
|
|
isDraftMode,
|
|
}: {
|
|
pages: Awaited<ReturnType<typeof getPagesInfo>>;
|
|
isDraftMode: boolean;
|
|
}) {
|
|
return (
|
|
<>
|
|
<SheetTitle>
|
|
CMS Pages{' '}
|
|
<Link href={SANITY_UTIL_PATH.STUDIO}>
|
|
<Button
|
|
data-testid="button:open-studio-dev-sheet"
|
|
rounded="md"
|
|
size="xs"
|
|
variant="secondary"
|
|
>
|
|
🔗 Open Sanity Studio ↗
|
|
</Button>
|
|
</Link>
|
|
</SheetTitle>
|
|
{isDraftMode ? (
|
|
<a href={SANITY_UTIL_PATH.DISABLE_DRAFT}>
|
|
<Button data-testid={'button:disable-draft-mode'} rounded="md" size="xs">
|
|
Disable Draft Mode
|
|
</Button>
|
|
</a>
|
|
) : (
|
|
<Link href={SANITY_UTIL_PATH.STUDIO}>
|
|
<Button data-testid={'button:enable-draft-mode'} rounded="md" size="xs">
|
|
Enable Draft Mode in Sanity Studio ↗
|
|
</Button>
|
|
</Link>
|
|
)}
|
|
<div className="flex flex-col gap-2">
|
|
{pages.map(({ slug, label }) => (
|
|
<Link
|
|
key={slug.current}
|
|
href={`/${slug.current}`}
|
|
className="text-session-text-black-secondary inline-flex items-center gap-1 align-middle"
|
|
>
|
|
{label}
|
|
<span className="text-session-text-black-secondary text-xs">{` (/${slug.current})`}</span>
|
|
</Link>
|
|
))}
|
|
</div>
|
|
</>
|
|
);
|
|
}
|