diff --git a/apps/console/src/pages/organizations/cookie-banners/configuration/trackers/_components/DetectedTrackerRow.tsx b/apps/console/src/pages/organizations/cookie-banners/configuration/trackers/_components/DetectedTrackerRow.tsx index f07355ef0..f444f498f 100644 --- a/apps/console/src/pages/organizations/cookie-banners/configuration/trackers/_components/DetectedTrackerRow.tsx +++ b/apps/console/src/pages/organizations/cookie-banners/configuration/trackers/_components/DetectedTrackerRow.tsx @@ -12,6 +12,7 @@ // OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR // PERFORMANCE OF THIS SOFTWARE. +import { getTrackerSourceBadge } from "@probo/helpers"; import { useTranslate } from "@probo/i18n"; import { Badge, Td, Tr } from "@probo/ui"; import { graphql, useFragment } from "react-relay"; @@ -29,14 +30,6 @@ const detectedTrackerFragment = graphql` } `; -function sourceBadge(source: string, __: (s: string) => string) { - switch (source) { - case "SCRIPT": return { label: __("Script"), variant: "info" as const }; - case "PRE_EXISTING": return { label: __("Pre-existing"), variant: "outline" as const }; - default: return { label: source, variant: "neutral" as const }; - } -} - interface DetectedTrackerRowProps { detectedTrackerKey: DetectedTrackerRow_detectedTracker$key; } @@ -63,8 +56,8 @@ export function DetectedTrackerRow({ detectedTrackerKey }: DetectedTrackerRowPro {tracker.source ? ( - - {sourceBadge(tracker.source, __).label} + + {getTrackerSourceBadge(tracker.source, __).label} ) : -} diff --git a/apps/console/src/pages/organizations/cookie-banners/configuration/trackers/_components/TrackerPatternPropertiesSection.tsx b/apps/console/src/pages/organizations/cookie-banners/configuration/trackers/_components/TrackerPatternPropertiesSection.tsx index 42f830708..805ff56d1 100644 --- a/apps/console/src/pages/organizations/cookie-banners/configuration/trackers/_components/TrackerPatternPropertiesSection.tsx +++ b/apps/console/src/pages/organizations/cookie-banners/configuration/trackers/_components/TrackerPatternPropertiesSection.tsx @@ -12,7 +12,7 @@ // OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR // PERFORMANCE OF THIS SOFTWARE. -import { humanizeSeconds } from "@probo/helpers"; +import { getTrackerSourceBadge, getTrackerTypeBadge, humanizeSeconds } from "@probo/helpers"; import { useTranslate } from "@probo/i18n"; import { Badge, Card, PropertyRow } from "@probo/ui"; import { graphql, useFragment } from "react-relay"; @@ -42,25 +42,6 @@ const trackerPatternPropertiesSectionFragment = graphql` } `; -function trackerTypeBadge(type: string, __: (s: string) => string) { - switch (type) { - case "COOKIE": return { label: __("Cookie"), variant: "warning" as const }; - case "LOCAL_STORAGE": return { label: __("localStorage"), variant: "info" as const }; - case "SESSION_STORAGE": return { label: __("sessionStorage"), variant: "highlight" as const }; - case "INDEXED_DB": return { label: __("IndexedDB"), variant: "success" as const }; - case "CACHE_STORAGE": return { label: __("Cache Storage"), variant: "outline" as const }; - default: return { label: type, variant: "neutral" as const }; - } -} - -function sourceBadge(source: string, __: (s: string) => string) { - switch (source) { - case "SCRIPT": return { label: __("Script"), variant: "info" as const }; - case "PRE_EXISTING": return { label: __("Pre-existing"), variant: "outline" as const }; - default: return { label: source, variant: "neutral" as const }; - } -} - interface TrackerPatternPropertiesSectionProps { trackerPatternKey: TrackerPatternPropertiesSection_trackerPattern$key; } @@ -74,7 +55,7 @@ export function TrackerPatternPropertiesSection({ trackerPatternKey, ); - const typeBadge = trackerTypeBadge(pattern.trackerType, __); + const typeBadge = getTrackerTypeBadge(pattern.trackerType, __); return ( @@ -89,8 +70,8 @@ export function TrackerPatternPropertiesSection({ {pattern.source && ( - - {sourceBadge(pattern.source, __).label} + + {getTrackerSourceBadge(pattern.source, __).label} )} diff --git a/apps/console/src/pages/organizations/cookie-banners/configuration/trackers/_components/TrackerPatternRow.tsx b/apps/console/src/pages/organizations/cookie-banners/configuration/trackers/_components/TrackerPatternRow.tsx index 50055cd68..379d2fc92 100644 --- a/apps/console/src/pages/organizations/cookie-banners/configuration/trackers/_components/TrackerPatternRow.tsx +++ b/apps/console/src/pages/organizations/cookie-banners/configuration/trackers/_components/TrackerPatternRow.tsx @@ -13,7 +13,7 @@ // PERFORMANCE OF THIS SOFTWARE. import { EyeIcon, EyeSlashIcon } from "@phosphor-icons/react"; -import { formatError, type GraphQLError } from "@probo/helpers"; +import { formatError, getTrackerSourceBadge, getTrackerTypeBadge, type GraphQLError } from "@probo/helpers"; import { useTranslate } from "@probo/i18n"; import { Badge, @@ -134,25 +134,6 @@ const updatePatternMutation = graphql` } `; -function trackerTypeBadge(type: string, __: (s: string) => string) { - switch (type) { - case "COOKIE": return { label: __("Cookie"), variant: "warning" as const }; - case "LOCAL_STORAGE": return { label: __("localStorage"), variant: "info" as const }; - case "SESSION_STORAGE": return { label: __("sessionStorage"), variant: "highlight" as const }; - case "INDEXED_DB": return { label: __("IndexedDB"), variant: "success" as const }; - case "CACHE_STORAGE": return { label: __("Cache Storage"), variant: "outline" as const }; - default: return { label: type, variant: "neutral" as const }; - } -} - -function sourceBadge(source: string, __: (s: string) => string) { - switch (source) { - case "SCRIPT": return { label: __("Script"), variant: "info" as const }; - case "PRE_EXISTING": return { label: __("Pre-existing"), variant: "outline" as const }; - default: return { label: source, variant: "neutral" as const }; - } -} - interface TrackerPatternRowProps { patternKey: TrackerPatternRowFragment$key; connectionId: string; @@ -304,8 +285,8 @@ export function TrackerPatternRow({ patternKey, connectionId }: TrackerPatternRo ); } - const typeBadge = trackerTypeBadge(pattern.trackerType, __); - const srcBadge = pattern.source ? sourceBadge(pattern.source, __) : null; + const typeBadge = getTrackerTypeBadge(pattern.trackerType, __); + const srcBadge = pattern.source ? getTrackerSourceBadge(pattern.source, __) : null; return ( diff --git a/packages/helpers/src/index.ts b/packages/helpers/src/index.ts index 015a5aff9..14dff2cc7 100644 --- a/packages/helpers/src/index.ts +++ b/packages/helpers/src/index.ts @@ -109,6 +109,7 @@ export { toMaxAgeSeconds, fromMaxAgeSeconds, } from "./duration"; +export { getTrackerTypeBadge, getTrackerSourceBadge } from "./tracker"; export { getTrustCenterUrl } from "./trustCenter"; export { detectSocialName } from "./socialUrl"; export { formatError, type GraphQLError } from "./error"; diff --git a/packages/helpers/src/tracker.ts b/packages/helpers/src/tracker.ts new file mode 100644 index 000000000..a3d4e8b3d --- /dev/null +++ b/packages/helpers/src/tracker.ts @@ -0,0 +1,48 @@ +// Copyright (c) 2025-2026 Probo Inc . +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +// OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +// PERFORMANCE OF THIS SOFTWARE. + +type Translator = (s: string) => string; + +type BadgeVariant + = | "warning" + | "info" + | "highlight" + | "success" + | "outline" + | "neutral"; + +type Badge = { + label: string; + variant: BadgeVariant; +}; + +export function getTrackerTypeBadge(type: string, __: Translator): Badge { + switch (type) { + case "COOKIE": return { label: __("Cookie"), variant: "warning" }; + case "LOCAL_STORAGE": return { label: __("localStorage"), variant: "info" }; + case "SESSION_STORAGE": return { label: __("sessionStorage"), variant: "highlight" }; + case "INDEXED_DB": return { label: __("IndexedDB"), variant: "success" }; + case "CACHE_STORAGE": return { label: __("Cache Storage"), variant: "outline" }; + default: return { label: type, variant: "neutral" }; + } +} + +export function getTrackerSourceBadge(source: string, __: Translator): Badge { + switch (source) { + case "SCRIPT": return { label: __("Script"), variant: "info" }; + case "PRE_EXISTING": return { label: __("Pre-existing"), variant: "outline" }; + case "HTTP": return { label: __("HTTP"), variant: "neutral" }; + default: return { label: source, variant: "neutral" }; + } +} diff --git a/pkg/server/api/console/v1/graphql/cookie_banner.graphql b/pkg/server/api/console/v1/graphql/cookie_banner.graphql index 4ac8bebd5..2aeb7cf2c 100644 --- a/pkg/server/api/console/v1/graphql/cookie_banner.graphql +++ b/pkg/server/api/console/v1/graphql/cookie_banner.graphql @@ -32,6 +32,10 @@ enum CookieSource @goEnum( value: "go.probo.inc/probo/pkg/coredata.CookieSourcePreExisting" ) + HTTP + @goEnum( + value: "go.probo.inc/probo/pkg/coredata.CookieSourceHTTP" + ) EXTENSION @goEnum( value: "go.probo.inc/probo/pkg/coredata.CookieSourceExtension"