diff --git a/apps/console/src/pages/organizations/cookie-banners/configuration/CookieBannerConfigLayout.tsx b/apps/console/src/pages/organizations/cookie-banners/configuration/CookieBannerConfigLayout.tsx index f4f9d5b09..98665fedb 100644 --- a/apps/console/src/pages/organizations/cookie-banners/configuration/CookieBannerConfigLayout.tsx +++ b/apps/console/src/pages/organizations/cookie-banners/configuration/CookieBannerConfigLayout.tsx @@ -19,6 +19,7 @@ import { Breadcrumb, Button, IconImage, + IconListStack, IconPageTextLine, IconSettingsGear2, PageHeader, @@ -188,6 +189,10 @@ export default function CookieBannerConfigLayout({ queryRef }: CookieBannerConfi {__("Settings")} + + + {__("Cookies")} + {__("Snippet")} diff --git a/apps/console/src/pages/organizations/cookie-banners/configuration/_components/BannerSettingsForm.tsx b/apps/console/src/pages/organizations/cookie-banners/configuration/_components/BannerSettingsForm.tsx index 38171c72b..fb25f9bef 100644 --- a/apps/console/src/pages/organizations/cookie-banners/configuration/_components/BannerSettingsForm.tsx +++ b/apps/console/src/pages/organizations/cookie-banners/configuration/_components/BannerSettingsForm.tsx @@ -16,11 +16,23 @@ import { formatError, type GraphQLError } from "@probo/helpers"; import { useTranslate } from "@probo/i18n"; import { Button, Card, Field, Input, Label, Option, Select, useToast } from "@probo/ui"; import { useState } from "react"; -import { useMutation } from "react-relay"; +import { useFragment, useMutation } from "react-relay"; import { graphql } from "relay-runtime"; +import type { BannerSettingsForm_cookieBanner$key } from "#/__generated__/core/BannerSettingsForm_cookieBanner.graphql"; import type { BannerSettingsFormMutation } from "#/__generated__/core/BannerSettingsFormMutation.graphql"; +const bannerSettingsFormFragment = graphql` + fragment BannerSettingsForm_cookieBanner on CookieBanner { + id + name + origin + privacyPolicyUrl + consentExpiryDays + consentMode + } +`; + const updateBannerMutation = graphql` mutation BannerSettingsFormMutation($input: UpdateCookieBannerInput!) { updateCookieBanner(input: $input) { @@ -37,20 +49,15 @@ const updateBannerMutation = graphql` `; interface BannerSettingsFormProps { - banner: { - id: string; - name: string; - origin: string; - privacyPolicyUrl: string; - consentExpiryDays: number; - consentMode: string; - }; + cookieBannerKey: BannerSettingsForm_cookieBanner$key; } -export function BannerSettingsForm({ banner }: BannerSettingsFormProps) { +export function BannerSettingsForm({ cookieBannerKey }: BannerSettingsFormProps) { const { __ } = useTranslate(); const { toast } = useToast(); + const banner = useFragment(bannerSettingsFormFragment, cookieBannerKey); + const [commitMutation, isInFlight] = useMutation(updateBannerMutation); const [name, setName] = useState(banner.name); @@ -70,7 +77,7 @@ export function BannerSettingsForm({ banner }: BannerSettingsFormProps) { origin, privacyPolicyUrl, consentExpiryDays: parseInt(consentExpiryDays, 10), - consentMode: consentMode as "OPT_IN" | "OPT_OUT", + consentMode: consentMode, }, }, onCompleted() { @@ -112,7 +119,7 @@ export function BannerSettingsForm({ banner }: BannerSettingsFormProps) {
- setConsentMode(v as "OPT_IN" | "OPT_OUT")}> diff --git a/apps/console/src/pages/organizations/cookie-banners/configuration/_components/CategoryDialog.tsx b/apps/console/src/pages/organizations/cookie-banners/configuration/_components/CategoryDialog.tsx index 77dcb0b54..838319067 100644 --- a/apps/console/src/pages/organizations/cookie-banners/configuration/_components/CategoryDialog.tsx +++ b/apps/console/src/pages/organizations/cookie-banners/configuration/_components/CategoryDialog.tsx @@ -16,13 +16,11 @@ import { formatError, type GraphQLError } from "@probo/helpers"; import { useTranslate } from "@probo/i18n"; import { Button, - Checkbox, Dialog, DialogContent, DialogFooter, Field, Input, - Label, Textarea, useToast, } from "@probo/ui"; @@ -31,7 +29,6 @@ import { useMutation } from "react-relay"; import { graphql } from "relay-runtime"; import type { CategoryDialogCreateMutation } from "#/__generated__/core/CategoryDialogCreateMutation.graphql"; -import type { CategoryDialogUpdateMutation } from "#/__generated__/core/CategoryDialogUpdateMutation.graphql"; const createMutation = graphql` mutation CategoryDialogCreateMutation( @@ -59,196 +56,71 @@ const createMutation = graphql` } `; -const updateMutation = graphql` - mutation CategoryDialogUpdateMutation($input: UpdateCookieCategoryInput!) { - updateCookieCategory(input: $input) { - cookieCategory { - id - name - description - rank - cookies { - name - duration - description - } - updatedAt - } - } - } -`; - -interface CookieEntry { - name: string; - duration: string; - description: string; -} - interface CategoryDialogProps { cookieBannerId: string; connectionId: string; - category?: { - id: string; - name: string; - description: string; - required: boolean; - rank: number; - cookies: ReadonlyArray; - }; onOpenChange: (open: boolean) => void; } export function CategoryDialog({ cookieBannerId, connectionId, - category, onOpenChange, }: CategoryDialogProps) { const { __ } = useTranslate(); const { toast } = useToast(); - const isEditing = !!category; const [commitCreate, isCreating] = useMutation(createMutation); - const [commitUpdate, isUpdating] = useMutation(updateMutation); - const [name, setName] = useState(category?.name ?? ""); - const [description, setDescription] = useState(category?.description ?? ""); - const [required, setRequired] = useState(category?.required ?? false); - const [cookies, setCookies] = useState( - category?.cookies ? [...category.cookies.map(c => ({ ...c }))] : [], - ); - - const addCookie = () => { - setCookies([...cookies, { name: "", duration: "", description: "" }]); - }; - - const removeCookie = (index: number) => { - setCookies(cookies.filter((_, i) => i !== index)); - }; - - const updateCookie = (index: number, field: keyof CookieEntry, value: string) => { - setCookies(cookies.map((c, i) => (i === index ? { ...c, [field]: value } : c))); - }; + const [name, setName] = useState(""); + const [description, setDescription] = useState(""); const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); - const cookieItems = cookies.filter(c => c.name.trim() !== ""); - - if (isEditing) { - commitUpdate({ - variables: { - input: { - cookieCategoryId: category.id, - name, - description, - cookies: cookieItems, - }, + commitCreate({ + variables: { + input: { + cookieBannerId, + name, + description, + required: false, + rank: 0, }, - onCompleted() { - toast({ title: __("Success"), description: __("Category updated"), variant: "success" }); - onOpenChange(false); - }, - onError(error) { - toast({ title: __("Error"), description: formatError(__("Failed to update category"), error as GraphQLError), variant: "error" }); - }, - }); - } else { - commitCreate({ - variables: { - input: { - cookieBannerId, - name, - description, - required, - rank: 0, - cookies: cookieItems.length > 0 ? cookieItems : null, - }, - connections: [connectionId], - }, - onCompleted() { - toast({ title: __("Success"), description: __("Category created"), variant: "success" }); - onOpenChange(false); - }, - onError(error) { - toast({ title: __("Error"), description: formatError(__("Failed to create category"), error as GraphQLError), variant: "error" }); - }, - }); - } + connections: [connectionId], + }, + onCompleted() { + toast({ title: __("Success"), description: __("Category created"), variant: "success" }); + onOpenChange(false); + }, + onError(error) { + toast({ title: __("Error"), description: formatError(__("Failed to create category"), error as GraphQLError), variant: "error" }); + }, + }); }; return ( onOpenChange(false)} - title={isEditing ? __("Edit Category") : __("Add Category")} + title={__("Add Category")} className="max-w-lg" >
- setName(e.target.value)} required /> + setName(e.target.value)} required /> -