Add frontend #1
@@ -1,4 +1,4 @@
|
|||||||
import { useParams } from 'react-router';
|
import { useParams, useSearchParams } from 'react-router';
|
||||||
import Page from '../Page';
|
import Page from '../Page';
|
||||||
import { Label } from '@/components/ui/label';
|
import { Label } from '@/components/ui/label';
|
||||||
import { Switch } from '@/components/ui/switch';
|
import { Switch } from '@/components/ui/switch';
|
||||||
@@ -95,6 +95,17 @@ const MOCK_SITE: MockSite = {
|
|||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const VALID_TABS = [
|
||||||
|
'overview',
|
||||||
|
'deployments',
|
||||||
|
'forward-rules',
|
||||||
|
'custom-headers',
|
||||||
|
'settings',
|
||||||
|
] as const;
|
||||||
|
type TabValue = (typeof VALID_TABS)[number];
|
||||||
|
|
||||||
|
const DEFAULT_TAB: TabValue = 'overview';
|
||||||
|
|
||||||
const SiteOverviewSkeleton = memo(() => (
|
const SiteOverviewSkeleton = memo(() => (
|
||||||
<>
|
<>
|
||||||
<div className="flex flex-col sm:flex-row sm:items-center justify-between gap-3 mb-2">
|
<div className="flex flex-col sm:flex-row sm:items-center justify-between gap-3 mb-2">
|
||||||
@@ -149,11 +160,32 @@ const SiteOverviewSkeleton = memo(() => (
|
|||||||
|
|
||||||
const SiteOverview = () => {
|
const SiteOverview = () => {
|
||||||
const { id } = useParams<{ id: string }>();
|
const { id } = useParams<{ id: string }>();
|
||||||
|
const [searchParams, setSearchParams] = useSearchParams();
|
||||||
const { data: site, isLoading: isLoadingSite, error: siteError } = useSite(id!);
|
const { data: site, isLoading: isLoadingSite, error: siteError } = useSite(id!);
|
||||||
const toggleSiteEnabled = useToggleSiteEnabled(id!);
|
const toggleSiteEnabled = useToggleSiteEnabled(id!);
|
||||||
|
|
||||||
const mockSite = MOCK_SITE;
|
const mockSite = MOCK_SITE;
|
||||||
|
|
||||||
|
const tabParam = searchParams.get('tab');
|
||||||
|
const activeTab: TabValue =
|
||||||
|
tabParam && VALID_TABS.includes(tabParam as TabValue)
|
||||||
|
? (tabParam as TabValue)
|
||||||
|
: DEFAULT_TAB;
|
||||||
|
|
||||||
|
const handleTabChange = (value: string) => {
|
||||||
|
setSearchParams(
|
||||||
|
(prev) => {
|
||||||
|
if (value === DEFAULT_TAB) {
|
||||||
|
prev.delete('tab');
|
||||||
|
} else {
|
||||||
|
prev.set('tab', value);
|
||||||
|
}
|
||||||
|
return prev;
|
||||||
|
},
|
||||||
|
{ replace: true }
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
const handleToggleEnabled = () => {
|
const handleToggleEnabled = () => {
|
||||||
toggleSiteEnabled.mutate();
|
toggleSiteEnabled.mutate();
|
||||||
};
|
};
|
||||||
@@ -197,7 +229,7 @@ const SiteOverview = () => {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<Tabs defaultValue="overview">
|
<Tabs value={activeTab} onValueChange={handleTabChange}>
|
||||||
<div className="flex items-center">
|
<div className="flex items-center">
|
||||||
<TabsList>
|
<TabsList>
|
||||||
<TabsTrigger value="overview">
|
<TabsTrigger value="overview">
|
||||||
|
|||||||
Reference in New Issue
Block a user