+
+
- >
+
);
}
diff --git a/apps/web/app/(app)/environments/[environmentId]/integrations/google-sheets/loading.tsx b/apps/web/app/(app)/environments/[environmentId]/integrations/google-sheets/loading.tsx
index efb730912f..01e4166575 100644
--- a/apps/web/app/(app)/environments/[environmentId]/integrations/google-sheets/loading.tsx
+++ b/apps/web/app/(app)/environments/[environmentId]/integrations/google-sheets/loading.tsx
@@ -1,5 +1,5 @@
import { Button } from "@formbricks/ui/Button";
-import GoBackButton from "@formbricks/ui/GoBackButton";
+import { GoBackButton } from "@formbricks/ui/GoBackButton";
export default function Loading() {
return (
diff --git a/apps/web/app/(app)/environments/[environmentId]/integrations/google-sheets/page.tsx b/apps/web/app/(app)/environments/[environmentId]/integrations/google-sheets/page.tsx
index b4ce204274..bba0277b5c 100644
--- a/apps/web/app/(app)/environments/[environmentId]/integrations/google-sheets/page.tsx
+++ b/apps/web/app/(app)/environments/[environmentId]/integrations/google-sheets/page.tsx
@@ -13,7 +13,9 @@ import { getProductByEnvironmentId } from "@formbricks/lib/product/service";
import { getSurveys } from "@formbricks/lib/survey/service";
import { TIntegrationItem } from "@formbricks/types/integration";
import { TIntegrationGoogleSheets } from "@formbricks/types/integration/googleSheet";
-import GoBackButton from "@formbricks/ui/GoBackButton";
+import { GoBackButton } from "@formbricks/ui/GoBackButton";
+import { PageContentWrapper } from "@formbricks/ui/PageContentWrapper";
+import { PageHeader } from "@formbricks/ui/PageHeader";
export default async function GoogleSheet({ params }) {
const enabled = !!(GOOGLE_SHEETS_CLIENT_ID && GOOGLE_SHEETS_CLIENT_SECRET && GOOGLE_SHEETS_REDIRECT_URL);
@@ -38,8 +40,9 @@ export default async function GoogleSheet({ params }) {
spreadSheetArray = await getSpreadSheets(params.environmentId);
}
return (
- <>
+
+
- >
+
);
}
diff --git a/apps/web/app/(app)/environments/[environmentId]/integrations/layout.tsx b/apps/web/app/(app)/environments/[environmentId]/integrations/layout.tsx
deleted file mode 100644
index 88e2fa0959..0000000000
--- a/apps/web/app/(app)/environments/[environmentId]/integrations/layout.tsx
+++ /dev/null
@@ -1,15 +0,0 @@
-import { Metadata } from "next";
-
-import { ContentWrapper } from "@formbricks/ui/ContentWrapper";
-
-export const metadata: Metadata = {
- title: "Integrations",
-};
-
-export default function IntegrationsLayout({ children }) {
- return (
- <>
-
{children}
- >
- );
-}
diff --git a/apps/web/app/(app)/environments/[environmentId]/integrations/notion/loading.tsx b/apps/web/app/(app)/environments/[environmentId]/integrations/notion/loading.tsx
index f188d504fa..b49303c9ed 100644
--- a/apps/web/app/(app)/environments/[environmentId]/integrations/notion/loading.tsx
+++ b/apps/web/app/(app)/environments/[environmentId]/integrations/notion/loading.tsx
@@ -1,5 +1,5 @@
import { Button } from "@formbricks/ui/Button";
-import GoBackButton from "@formbricks/ui/GoBackButton";
+import { GoBackButton } from "@formbricks/ui/GoBackButton";
export default function Loading() {
return (
diff --git a/apps/web/app/(app)/environments/[environmentId]/integrations/notion/page.tsx b/apps/web/app/(app)/environments/[environmentId]/integrations/notion/page.tsx
index 8e463ecc8e..4c67ca4b34 100644
--- a/apps/web/app/(app)/environments/[environmentId]/integrations/notion/page.tsx
+++ b/apps/web/app/(app)/environments/[environmentId]/integrations/notion/page.tsx
@@ -12,7 +12,9 @@ import { getIntegrationByType } from "@formbricks/lib/integration/service";
import { getNotionDatabases } from "@formbricks/lib/notion/service";
import { getSurveys } from "@formbricks/lib/survey/service";
import { TIntegrationNotion, TIntegrationNotionDatabase } from "@formbricks/types/integration/notion";
-import GoBackButton from "@formbricks/ui/GoBackButton";
+import { GoBackButton } from "@formbricks/ui/GoBackButton";
+import { PageContentWrapper } from "@formbricks/ui/PageContentWrapper";
+import { PageHeader } from "@formbricks/ui/PageHeader";
export default async function Notion({ params }) {
const enabled = !!(
@@ -37,8 +39,9 @@ export default async function Notion({ params }) {
}
return (
- <>
+
+
- >
+
);
}
diff --git a/apps/web/app/(app)/environments/[environmentId]/integrations/page.tsx b/apps/web/app/(app)/environments/[environmentId]/integrations/page.tsx
index 5c98ef1e06..d4c179054e 100644
--- a/apps/web/app/(app)/environments/[environmentId]/integrations/page.tsx
+++ b/apps/web/app/(app)/environments/[environmentId]/integrations/page.tsx
@@ -18,6 +18,8 @@ import { getWebhookCountBySource } from "@formbricks/lib/webhook/service";
import { TIntegrationType } from "@formbricks/types/integration";
import { Card } from "@formbricks/ui/Card";
import { ErrorComponent } from "@formbricks/ui/ErrorComponent";
+import { PageContentWrapper } from "@formbricks/ui/PageContentWrapper";
+import { PageHeader } from "@formbricks/ui/PageHeader";
import AirtableLogo from "./airtable/images/airtable.svg";
import GoogleSheetsLogo from "./google-sheets/images/google-sheets-small.png";
@@ -69,6 +71,9 @@ export default async function IntegrationsPage({ params }) {
docsHref: "https://formbricks.com/docs/getting-started/framework-guides#next-js",
docsText: "Docs",
docsNewTab: true,
+ connectHref: `/environments/${environmentId}/product/setup`,
+ connectText: "Connect",
+ connectNewTab: false,
label: "Javascript Widget",
description: "Integrate Formbricks into your Webapp",
icon:
,
@@ -204,10 +209,9 @@ export default async function IntegrationsPage({ params }) {
if (isViewer) return
;
return (
-
-
Integrations
-
Connect Formbricks with your favorite tools.
-
+
+
+
{integrationCards.map((card) => (
))}
-
+
);
}
diff --git a/apps/web/app/(app)/environments/[environmentId]/integrations/slack/page.tsx b/apps/web/app/(app)/environments/[environmentId]/integrations/slack/page.tsx
index 9a94b1e54a..9989b7bdb3 100644
--- a/apps/web/app/(app)/environments/[environmentId]/integrations/slack/page.tsx
+++ b/apps/web/app/(app)/environments/[environmentId]/integrations/slack/page.tsx
@@ -7,7 +7,9 @@ import { getSlackChannels } from "@formbricks/lib/slack/service";
import { getSurveys } from "@formbricks/lib/survey/service";
import { TIntegrationItem } from "@formbricks/types/integration";
import { TIntegrationSlack } from "@formbricks/types/integration/slack";
-import GoBackButton from "@formbricks/ui/GoBackButton";
+import { GoBackButton } from "@formbricks/ui/GoBackButton";
+import { PageContentWrapper } from "@formbricks/ui/PageContentWrapper";
+import { PageHeader } from "@formbricks/ui/PageHeader";
export default async function Slack({ params }) {
const isEnabled = !!(SLACK_CLIENT_ID && SLACK_CLIENT_SECRET);
@@ -28,8 +30,9 @@ export default async function Slack({ params }) {
}
return (
- <>
-
+
+
+
- >
+
);
}
diff --git a/apps/web/app/(app)/environments/[environmentId]/integrations/webhooks/components/AddWebhookButton.tsx b/apps/web/app/(app)/environments/[environmentId]/integrations/webhooks/components/AddWebhookButton.tsx
new file mode 100644
index 0000000000..3e2bae9f3b
--- /dev/null
+++ b/apps/web/app/(app)/environments/[environmentId]/integrations/webhooks/components/AddWebhookButton.tsx
@@ -0,0 +1,38 @@
+"use client";
+
+import { Webhook } from "lucide-react";
+import { useState } from "react";
+
+import { TEnvironment } from "@formbricks/types/environment";
+import { TSurvey } from "@formbricks/types/surveys";
+import { Button } from "@formbricks/ui/Button";
+
+import AddWebhookModal from "./AddWebhookModal";
+
+interface AddWebhookButtonProps {
+ environment: TEnvironment;
+ surveys: TSurvey[];
+}
+
+export const AddWebhookButton = ({ environment, surveys }: AddWebhookButtonProps) => {
+ const [isAddWebhookModalOpen, setAddWebhookModalOpen] = useState(false);
+ return (
+ <>
+
+
+ >
+ );
+};
diff --git a/apps/web/app/(app)/environments/[environmentId]/integrations/webhooks/components/WebhookTable.tsx b/apps/web/app/(app)/environments/[environmentId]/integrations/webhooks/components/WebhookTable.tsx
index b58347ef7c..a58fc5abac 100644
--- a/apps/web/app/(app)/environments/[environmentId]/integrations/webhooks/components/WebhookTable.tsx
+++ b/apps/web/app/(app)/environments/[environmentId]/integrations/webhooks/components/WebhookTable.tsx
@@ -1,14 +1,11 @@
"use client";
-import AddWebhookModal from "@/app/(app)/environments/[environmentId]/integrations/webhooks/components/AddWebhookModal";
import WebhookModal from "@/app/(app)/environments/[environmentId]/integrations/webhooks/components/WebhookDetailModal";
-import { Webhook } from "lucide-react";
import { useState } from "react";
import { TEnvironment } from "@formbricks/types/environment";
import { TSurvey } from "@formbricks/types/surveys";
import { TWebhook } from "@formbricks/types/webhooks";
-import { Button } from "@formbricks/ui/Button";
import EmptySpaceFiller from "@formbricks/ui/EmptySpaceFiller";
export default function WebhookTable({
@@ -23,7 +20,6 @@ export default function WebhookTable({
children: [JSX.Element, JSX.Element[]];
}) {
const [isWebhookDetailModalOpen, setWebhookDetailModalOpen] = useState(false);
- const [isAddWebhookModalOpen, setAddWebhookModalOpen] = useState(false);
const [activeWebhook, setActiveWebhook] = useState
({
environmentId: environment.id,
@@ -45,17 +41,6 @@ export default function WebhookTable({
return (
<>
-
-
-
-
{webhooks.length === 0 ? (
)}
-
-
>
);
}
diff --git a/apps/web/app/(app)/environments/[environmentId]/integrations/webhooks/page.tsx b/apps/web/app/(app)/environments/[environmentId]/integrations/webhooks/page.tsx
index 23395120bb..4a8a31b1db 100644
--- a/apps/web/app/(app)/environments/[environmentId]/integrations/webhooks/page.tsx
+++ b/apps/web/app/(app)/environments/[environmentId]/integrations/webhooks/page.tsx
@@ -1,3 +1,4 @@
+import { AddWebhookButton } from "@/app/(app)/environments/[environmentId]/integrations/webhooks/components/AddWebhookButton";
import WebhookRowData from "@/app/(app)/environments/[environmentId]/integrations/webhooks/components/WebhookRowData";
import WebhookTable from "@/app/(app)/environments/[environmentId]/integrations/webhooks/components/WebhookTable";
import WebhookTableHeading from "@/app/(app)/environments/[environmentId]/integrations/webhooks/components/WebhookTableHeading";
@@ -5,7 +6,9 @@ import WebhookTableHeading from "@/app/(app)/environments/[environmentId]/integr
import { getEnvironment } from "@formbricks/lib/environment/service";
import { getSurveys } from "@formbricks/lib/survey/service";
import { getWebhooks } from "@formbricks/lib/webhook/service";
-import GoBackButton from "@formbricks/ui/GoBackButton";
+import { GoBackButton } from "@formbricks/ui/GoBackButton";
+import { PageContentWrapper } from "@formbricks/ui/PageContentWrapper";
+import { PageHeader } from "@formbricks/ui/PageHeader";
export default async function CustomWebhookPage({ params }) {
const [webhooksUnsorted, surveys, environment] = await Promise.all([
@@ -13,23 +16,29 @@ export default async function CustomWebhookPage({ params }) {
getSurveys(params.environmentId, 200), // HOTFIX: not getting all surveys for now since it's maxing out the prisma accelerate limit
getEnvironment(params.environmentId),
]);
+
if (!environment) {
throw new Error("Environment not found");
}
+
const webhooks = webhooksUnsorted.sort((a, b) => {
if (a.createdAt > b.createdAt) return -1;
if (a.createdAt < b.createdAt) return 1;
return 0;
});
+
+ const renderAddWebhookButton = () =>
;
+
return (
- <>
+
+
{webhooks.map((webhook) => (
))}
- >
+
);
}
diff --git a/apps/web/app/(app)/environments/[environmentId]/layout.tsx b/apps/web/app/(app)/environments/[environmentId]/layout.tsx
index 3f1b8cfd58..1a57839366 100644
--- a/apps/web/app/(app)/environments/[environmentId]/layout.tsx
+++ b/apps/web/app/(app)/environments/[environmentId]/layout.tsx
@@ -1,4 +1,4 @@
-import EnvironmentsNavbar from "@/app/(app)/environments/[environmentId]/components/EnvironmentsNavbar";
+import { EnvironmentLayout } from "@/app/(app)/environments/[environmentId]/components/EnvironmentLayout";
import { ResponseFilterProvider } from "@/app/(app)/environments/[environmentId]/components/ResponseFilterContext";
import { getServerSession } from "next-auth";
import { redirect } from "next/navigation";
@@ -12,7 +12,7 @@ import ToasterClient from "@formbricks/ui/ToasterClient";
import FormbricksClient from "../../components/FormbricksClient";
import PosthogIdentify from "./components/PosthogIdentify";
-export default async function EnvironmentLayout({ children, params }) {
+export default async function EnvLayout({ children, params }) {
const session = await getServerSession(authOptions);
if (!session || !session.user) {
return redirect(`/auth/login`);
@@ -41,11 +41,9 @@ export default async function EnvironmentLayout({ children, params }) {
/>
-
-
+
{children}
-
-
+
>
);
diff --git a/apps/web/app/(app)/environments/[environmentId]/settings/api-keys/actions.ts b/apps/web/app/(app)/environments/[environmentId]/product/api-keys/actions.ts
similarity index 100%
rename from apps/web/app/(app)/environments/[environmentId]/settings/api-keys/actions.ts
rename to apps/web/app/(app)/environments/[environmentId]/product/api-keys/actions.ts
diff --git a/apps/web/app/(app)/environments/[environmentId]/settings/api-keys/components/AddApiKeyModal.tsx b/apps/web/app/(app)/environments/[environmentId]/product/api-keys/components/AddApiKeyModal.tsx
similarity index 100%
rename from apps/web/app/(app)/environments/[environmentId]/settings/api-keys/components/AddApiKeyModal.tsx
rename to apps/web/app/(app)/environments/[environmentId]/product/api-keys/components/AddApiKeyModal.tsx
diff --git a/apps/web/app/(app)/environments/[environmentId]/settings/api-keys/components/ApiKeyList.tsx b/apps/web/app/(app)/environments/[environmentId]/product/api-keys/components/ApiKeyList.tsx
similarity index 100%
rename from apps/web/app/(app)/environments/[environmentId]/settings/api-keys/components/ApiKeyList.tsx
rename to apps/web/app/(app)/environments/[environmentId]/product/api-keys/components/ApiKeyList.tsx
diff --git a/apps/web/app/(app)/environments/[environmentId]/settings/api-keys/components/EditApiKeys.tsx b/apps/web/app/(app)/environments/[environmentId]/product/api-keys/components/EditApiKeys.tsx
similarity index 95%
rename from apps/web/app/(app)/environments/[environmentId]/settings/api-keys/components/EditApiKeys.tsx
rename to apps/web/app/(app)/environments/[environmentId]/product/api-keys/components/EditApiKeys.tsx
index d097e88ea2..2c6a6199bc 100644
--- a/apps/web/app/(app)/environments/[environmentId]/settings/api-keys/components/EditApiKeys.tsx
+++ b/apps/web/app/(app)/environments/[environmentId]/product/api-keys/components/EditApiKeys.tsx
@@ -74,23 +74,15 @@ export default function EditAPIKeys({
return (
);
};
return (
- <>
-
-
-
+
Label
@@ -125,6 +117,18 @@ export default function EditAPIKeys({
+
+
+
+
- >
+
);
}
diff --git a/apps/web/app/(app)/environments/[environmentId]/settings/api-keys/loading.tsx b/apps/web/app/(app)/environments/[environmentId]/product/api-keys/loading.tsx
similarity index 100%
rename from apps/web/app/(app)/environments/[environmentId]/settings/api-keys/loading.tsx
rename to apps/web/app/(app)/environments/[environmentId]/product/api-keys/loading.tsx
diff --git a/apps/web/app/(app)/environments/[environmentId]/settings/api-keys/page.tsx b/apps/web/app/(app)/environments/[environmentId]/product/api-keys/page.tsx
similarity index 71%
rename from apps/web/app/(app)/environments/[environmentId]/settings/api-keys/page.tsx
rename to apps/web/app/(app)/environments/[environmentId]/product/api-keys/page.tsx
index 2e8d7af356..e86d8e2312 100644
--- a/apps/web/app/(app)/environments/[environmentId]/settings/api-keys/page.tsx
+++ b/apps/web/app/(app)/environments/[environmentId]/product/api-keys/page.tsx
@@ -1,5 +1,7 @@
+import { ProductConfigNavigation } from "@/app/(app)/environments/[environmentId]/product/components/ProductConfigNavigation";
import { getServerSession } from "next-auth";
+import { getMultiLanguagePermission } from "@formbricks/ee/lib/service";
import { authOptions } from "@formbricks/lib/authOptions";
import { getEnvironment } from "@formbricks/lib/environment/service";
import { getMembershipByUserIdTeamId } from "@formbricks/lib/membership/service";
@@ -7,9 +9,10 @@ import { getAccessFlags } from "@formbricks/lib/membership/utils";
import { getTeamByEnvironmentId } from "@formbricks/lib/team/service";
import EnvironmentNotice from "@formbricks/ui/EnvironmentNotice";
import { ErrorComponent } from "@formbricks/ui/ErrorComponent";
+import { PageContentWrapper } from "@formbricks/ui/PageContentWrapper";
+import { PageHeader } from "@formbricks/ui/PageHeader";
-import SettingsCard from "../components/SettingsCard";
-import SettingsTitle from "../components/SettingsTitle";
+import SettingsCard from "../../settings/components/SettingsCard";
import ApiKeyList from "./components/ApiKeyList";
export default async function ProfileSettingsPage({ params }) {
@@ -29,10 +32,17 @@ export default async function ProfileSettingsPage({ params }) {
const currentUserMembership = await getMembershipByUserIdTeamId(session?.user.id, team.id);
const { isViewer } = getAccessFlags(currentUserMembership?.role);
+ const isMultiLanguageAllowed = await getMultiLanguagePermission(team);
return !isViewer ? (
-
-
+
+
+
+
{environment.type === "development" ? (
)}
-
+
) : (
);
diff --git a/apps/web/app/(app)/environments/[environmentId]/product/components/ProductConfigNavigation.tsx b/apps/web/app/(app)/environments/[environmentId]/product/components/ProductConfigNavigation.tsx
new file mode 100644
index 0000000000..7e932677a8
--- /dev/null
+++ b/apps/web/app/(app)/environments/[environmentId]/product/components/ProductConfigNavigation.tsx
@@ -0,0 +1,67 @@
+"use client";
+
+import { BrushIcon, KeyIcon, LanguagesIcon, ListChecksIcon, TagIcon, UsersIcon } from "lucide-react";
+import { usePathname } from "next/navigation";
+
+import { SecondaryNavigation } from "@formbricks/ui/SecondaryNavigation";
+
+interface ProductConfigNavigationProps {
+ environmentId: string;
+ activeId: string;
+ isMultiLanguageAllowed: boolean;
+}
+
+export const ProductConfigNavigation = ({
+ environmentId,
+ activeId,
+ isMultiLanguageAllowed,
+}: ProductConfigNavigationProps) => {
+ const pathname = usePathname();
+ let navigation = [
+ {
+ id: "general",
+ label: "General",
+ icon:
,
+ href: `/environments/${environmentId}/product/general`,
+ current: pathname?.includes("/general"),
+ },
+ {
+ id: "look",
+ label: "Look & Feel",
+ icon:
,
+ href: `/environments/${environmentId}/product/look`,
+ current: pathname?.includes("/look"),
+ },
+ {
+ id: "languages",
+ label: "Survey Languages",
+ icon:
,
+ href: `/environments/${environmentId}/product/languages`,
+ hidden: !isMultiLanguageAllowed,
+ current: pathname?.includes("/languages"),
+ },
+ {
+ id: "tags",
+ label: "Tags",
+ icon:
,
+ href: `/environments/${environmentId}/product/tags`,
+ current: pathname?.includes("/tags"),
+ },
+ {
+ id: "api-keys",
+ label: "API Keys",
+ icon:
,
+ href: `/environments/${environmentId}/product/api-keys`,
+ current: pathname?.includes("/api-keys"),
+ },
+ {
+ id: "setup",
+ label: "Setup Guide",
+ icon:
,
+ href: `/environments/${environmentId}/product/setup`,
+ current: pathname?.includes("/setup"),
+ },
+ ];
+
+ return
;
+};
diff --git a/apps/web/app/(app)/environments/[environmentId]/settings/product/actions.ts b/apps/web/app/(app)/environments/[environmentId]/product/general/actions.ts
similarity index 100%
rename from apps/web/app/(app)/environments/[environmentId]/settings/product/actions.ts
rename to apps/web/app/(app)/environments/[environmentId]/product/general/actions.ts
diff --git a/apps/web/app/(app)/environments/[environmentId]/settings/product/components/DeleteProduct.tsx b/apps/web/app/(app)/environments/[environmentId]/product/general/components/DeleteProduct.tsx
similarity index 96%
rename from apps/web/app/(app)/environments/[environmentId]/settings/product/components/DeleteProduct.tsx
rename to apps/web/app/(app)/environments/[environmentId]/product/general/components/DeleteProduct.tsx
index a3d6ed40d8..02451c7dc7 100644
--- a/apps/web/app/(app)/environments/[environmentId]/settings/product/components/DeleteProduct.tsx
+++ b/apps/web/app/(app)/environments/[environmentId]/product/general/components/DeleteProduct.tsx
@@ -1,4 +1,4 @@
-import DeleteProductRender from "@/app/(app)/environments/[environmentId]/settings/product/components/DeleteProductRender";
+import DeleteProductRender from "@/app/(app)/environments/[environmentId]/product/general/components/DeleteProductRender";
import { getServerSession } from "next-auth";
import { authOptions } from "@formbricks/lib/authOptions";
diff --git a/apps/web/app/(app)/environments/[environmentId]/settings/product/components/DeleteProductRender.tsx b/apps/web/app/(app)/environments/[environmentId]/product/general/components/DeleteProductRender.tsx
similarity index 98%
rename from apps/web/app/(app)/environments/[environmentId]/settings/product/components/DeleteProductRender.tsx
rename to apps/web/app/(app)/environments/[environmentId]/product/general/components/DeleteProductRender.tsx
index 62643906c9..7ad192dc97 100644
--- a/apps/web/app/(app)/environments/[environmentId]/settings/product/components/DeleteProductRender.tsx
+++ b/apps/web/app/(app)/environments/[environmentId]/product/general/components/DeleteProductRender.tsx
@@ -1,6 +1,6 @@
"use client";
-import { deleteProductAction } from "@/app/(app)/environments/[environmentId]/settings/product/actions";
+import { deleteProductAction } from "@/app/(app)/environments/[environmentId]/product/general/actions";
import { useRouter } from "next/navigation";
import React, { useState } from "react";
import toast from "react-hot-toast";
diff --git a/apps/web/app/(app)/environments/[environmentId]/settings/product/components/EditProductName.tsx b/apps/web/app/(app)/environments/[environmentId]/product/general/components/EditProductName.tsx
similarity index 95%
rename from apps/web/app/(app)/environments/[environmentId]/settings/product/components/EditProductName.tsx
rename to apps/web/app/(app)/environments/[environmentId]/product/general/components/EditProductName.tsx
index 453b2c8c2a..3fccfd61ff 100644
--- a/apps/web/app/(app)/environments/[environmentId]/settings/product/components/EditProductName.tsx
+++ b/apps/web/app/(app)/environments/[environmentId]/product/general/components/EditProductName.tsx
@@ -68,7 +68,7 @@ const EditProductName: React.FC
= ({
};
return !isProductNameEditDisabled ? (
-