From d37e28215ecc2c7535c379c3b0f5dd538c14acfc Mon Sep 17 00:00:00 2001 From: Pallavi Kumari Date: Sat, 18 Oct 2025 16:15:21 +0530 Subject: [PATCH] add restart button --- .../[domainId]/DomainSettingsLayout.tsx | 112 ++++++++++++++++++ .../settings/domains/[domainId]/layout.tsx | 68 +++++------ 2 files changed, 140 insertions(+), 40 deletions(-) create mode 100644 src/app/[orgId]/settings/domains/[domainId]/DomainSettingsLayout.tsx diff --git a/src/app/[orgId]/settings/domains/[domainId]/DomainSettingsLayout.tsx b/src/app/[orgId]/settings/domains/[domainId]/DomainSettingsLayout.tsx new file mode 100644 index 00000000..3b822dc0 --- /dev/null +++ b/src/app/[orgId]/settings/domains/[domainId]/DomainSettingsLayout.tsx @@ -0,0 +1,112 @@ +"use client"; + +import { useState } from "react"; +import { createApiClient, formatAxiosError } from "@app/lib/api"; +import { useEnvContext } from "@app/hooks/useEnvContext"; +import { toast } from "@app/hooks/useToast"; +import { useRouter } from "next/navigation"; +import { RefreshCw } from "lucide-react"; +import { Button } from "@app/components/ui/button"; +import SettingsSectionTitle from "@app/components/SettingsSectionTitle"; +import DomainInfoCard from "@app/components/DomainInfoCard"; +import DomainProvider from "@app/providers/DomainProvider"; +import { useTranslations } from "next-intl"; + + +interface DomainSettingsLayoutProps { + orgId: string; + domain: any, + children: React.ReactNode; +} + +export default function DomainSettingsLayout({ orgId, domain, children }: DomainSettingsLayoutProps) { + const router = useRouter(); + const api = createApiClient(useEnvContext()); + const [isRefreshing, setIsRefreshing] = useState(false); + const [restartingDomains, setRestartingDomains] = useState>(new Set()); + const t = useTranslations(); + const refreshData = async () => { + setIsRefreshing(true); + try { + await new Promise((resolve) => setTimeout(resolve, 200)); + router.refresh(); + } catch { + toast({ + title: t("error"), + description: t("refreshError"), + variant: "destructive", + }); + } finally { + setIsRefreshing(false); + } + }; + + const restartDomain = async (domainId: string) => { + setRestartingDomains((prev) => new Set(prev).add(domainId)); + try { + await api.post(`/org/${orgId}/domain/${domainId}/restart`); + toast({ + title: t("success"), + description: t("domainRestartedDescription", { + fallback: "Domain verification restarted successfully", + }), + }); + refreshData(); + } catch (e) { + toast({ + title: t("error"), + description: formatAxiosError(e), + variant: "destructive", + }); + } finally { + setRestartingDomains((prev) => { + const newSet = new Set(prev); + newSet.delete(domainId); + return newSet; + }); + } + }; + + const isRestarting = restartingDomains.has(domain.domainId); + + return ( + <> +
+ + + +
+ + +
+ +
+ {children} +
+ + ); +} diff --git a/src/app/[orgId]/settings/domains/[domainId]/layout.tsx b/src/app/[orgId]/settings/domains/[domainId]/layout.tsx index 319ccdd5..c75ceaf4 100644 --- a/src/app/[orgId]/settings/domains/[domainId]/layout.tsx +++ b/src/app/[orgId]/settings/domains/[domainId]/layout.tsx @@ -1,50 +1,38 @@ -import { internal } from "@app/lib/api"; -import { AxiosResponse } from "axios"; import { redirect } from "next/navigation"; import { authCookieHeader } from "@app/lib/api/cookies"; -import SettingsSectionTitle from "@app/components/SettingsSectionTitle"; -import { getTranslations } from "next-intl/server"; +import { internal } from "@app/lib/api"; import { GetDomainResponse } from "@server/routers/domain/getDomain"; -import DomainProvider from "@app/providers/DomainProvider"; -import DomainInfoCard from "@app/components/DomainInfoCard"; +import { AxiosResponse } from "axios"; +import { getTranslations } from "next-intl/server"; +import SettingsLayoutClient from "./DomainSettingsLayout"; interface SettingsLayoutProps { - children: React.ReactNode; - params: Promise<{ domainId: string; orgId: string }>; + children: React.ReactNode; + params: Promise<{ domainId: string; orgId: string }>; } -export default async function SettingsLayout(props: SettingsLayoutProps) { - const params = await props.params; +export default async function SettingsLayout({ children, params }: SettingsLayoutProps) { + const { domainId, orgId } = await params; - const { children } = props; - - let domain = null; - try { - const res = await internal.get>( - `/org/${params.orgId}/domain/${params.domainId}`, - await authCookieHeader() - ); - domain = res.data.data; - console.log(JSON.stringify(domain)); - } catch { - redirect(`/${params.orgId}/settings/domains`); - } - - const t = await getTranslations(); - - - return ( - <> - - - -
- -
-
- + let domain = null; + try { + const res = await internal.get>( + `/org/${orgId}/domain/${domainId}`, + await authCookieHeader() ); + domain = res.data.data; + } catch { + redirect(`/${orgId}/settings/domains`); + } + + const t = await getTranslations(); + + return ( + + {children} + + ); }