From 9c69d134c9a4a34865d44e6f37a2c513c3a49969 Mon Sep 17 00:00:00 2001 From: Mike Fortman Date: Mon, 10 Mar 2025 15:37:13 -0500 Subject: [PATCH] feat: Add feature flag customization and astra tracking (#6963) * Add feature flag customization and astra tracking * [autofix.ci] apply automated fixes * add external url check --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> --- .../components/NodeDialogComponent/index.tsx | 15 ++++++++++ .../CustomNodes/hooks/use-handle-new-value.ts | 4 +++ .../components/AccountMenu/index.tsx | 29 ++++++++++++++----- src/frontend/src/controllers/API/api.tsx | 24 +++++++++++++-- .../components/custom-feature-flag-dialog.tsx | 11 +++++++ .../custom-feature-flag-menu-items.tsx | 5 ++++ 6 files changed, 78 insertions(+), 10 deletions(-) create mode 100644 src/frontend/src/customization/components/custom-feature-flag-dialog.tsx create mode 100644 src/frontend/src/customization/components/custom-feature-flag-menu-items.tsx diff --git a/src/frontend/src/CustomNodes/GenericNode/components/NodeDialogComponent/index.tsx b/src/frontend/src/CustomNodes/GenericNode/components/NodeDialogComponent/index.tsx index c764018b4..9ffec93ee 100644 --- a/src/frontend/src/CustomNodes/GenericNode/components/NodeDialogComponent/index.tsx +++ b/src/frontend/src/CustomNodes/GenericNode/components/NodeDialogComponent/index.tsx @@ -10,6 +10,7 @@ import { } from "@/components/ui/dialog"; import { usePostTemplateValue } from "@/controllers/API/queries/nodes/use-post-template-value"; import { getCustomParameterTitle } from "@/customization/components/custom-parameter"; +import { track } from "@/customization/utils/analytics"; import { mutateTemplate } from "@/CustomNodes/helpers/mutate-template"; import useAlertStore from "@/stores/alertStore"; import useFlowStore from "@/stores/flowStore"; @@ -122,6 +123,20 @@ export const NodeDialog: React.FC = ({ nodeClass.tool_mode, ); + if (nodeId.toLowerCase().includes("astra") && name === "database_name") { + const { + cloud_provider: cloudProvider, + new_database_name: databaseName, + ...otherFields + } = fieldValues; + track("Database Created", { + nodeId, + cloudProvider, + databaseName, + ...otherFields, + }); + } + setTimeout(() => { handleCloseDialog(); }, 5000); diff --git a/src/frontend/src/CustomNodes/hooks/use-handle-new-value.ts b/src/frontend/src/CustomNodes/hooks/use-handle-new-value.ts index cf024ef23..778dc5417 100644 --- a/src/frontend/src/CustomNodes/hooks/use-handle-new-value.ts +++ b/src/frontend/src/CustomNodes/hooks/use-handle-new-value.ts @@ -81,6 +81,10 @@ const useHandleOnNewValue = ({ // Debounced tracking track("Component Edited", { nodeId }); + if (nodeId.toLowerCase().includes("astra") && name === "database_name") { + track("Database Selected", { nodeId, databaseName: changes.value }); + } + if (!template) { setErrorData({ title: "Template not found in the component" }); return; diff --git a/src/frontend/src/components/core/appHeaderComponent/components/AccountMenu/index.tsx b/src/frontend/src/components/core/appHeaderComponent/components/AccountMenu/index.tsx index 1767acd4f..c57dda22c 100644 --- a/src/frontend/src/components/core/appHeaderComponent/components/AccountMenu/index.tsx +++ b/src/frontend/src/components/core/appHeaderComponent/components/AccountMenu/index.tsx @@ -1,4 +1,6 @@ import { useLogout } from "@/controllers/API/queries/auth"; +import CustomFeatureFlagDialog from "@/customization/components/custom-feature-flag-dialog"; +import CustomFeatureFlagMenuItems from "@/customization/components/custom-feature-flag-menu-items"; import { CustomFeedbackDialog } from "@/customization/components/custom-feedback-dialog"; import { CustomHeaderMenuItemsTitle } from "@/customization/components/custom-header-menu-items-title"; import { CustomProfileIcon } from "@/customization/components/custom-profile-icon"; @@ -22,6 +24,8 @@ import ThemeButtons from "../ThemeButtons"; export const AccountMenu = () => { const [isFeedbackOpen, setIsFeedbackOpen] = useState(false); + const [isCustomFeatureFlagsOpen, setIsCustomFeatureFlagsOpen] = + useState(false); const { customParam: id } = useParams(); const version = useDarkStore((state) => state.version); const navigate = useCustomNavigate(); @@ -99,14 +103,19 @@ export const AccountMenu = () => { )} {ENABLE_DATASTAX_LANGFLOW ? ( - setIsFeedbackOpen(true)}> - - Feedback - - + <> + setIsFeedbackOpen(true)}> + + Feedback + + + setIsCustomFeatureFlagsOpen(true)} + /> + ) : ( @@ -168,6 +177,10 @@ export const AccountMenu = () => { isOpen={isFeedbackOpen} setIsOpen={setIsFeedbackOpen} /> + ); }; diff --git a/src/frontend/src/controllers/API/api.tsx b/src/frontend/src/controllers/API/api.tsx index 9d95c1ff2..9c23b490f 100644 --- a/src/frontend/src/controllers/API/api.tsx +++ b/src/frontend/src/controllers/API/api.tsx @@ -46,9 +46,12 @@ function ApiInterceptor() { config.headers["Authorization"] = `Bearer ${accessToken}`; } - for (const [key, value] of Object.entries(customHeaders)) { - config.headers[key] = value; + if (!isExternalURL(url)) { + for (const [key, value] of Object.entries(customHeaders)) { + config.headers[key] = value; + } } + return [url, config]; }, }); @@ -115,6 +118,23 @@ function ApiInterceptor() { } }; + // Check for external url which we don't want to add custom headers to + const isExternalURL = (url: string): boolean => { + const EXTERNAL_DOMAINS = [ + "https://raw.githubusercontent.com", + "https://api.github.com", + "https://api.segment.io", + "https://cdn.sprig.com", + ]; + + try { + const parsedURL = new URL(url); + return EXTERNAL_DOMAINS.some((domain) => parsedURL.origin === domain); + } catch (e) { + return false; + } + }; + // Request interceptor to add access token to every request const requestInterceptor = api.interceptors.request.use( (config) => { diff --git a/src/frontend/src/customization/components/custom-feature-flag-dialog.tsx b/src/frontend/src/customization/components/custom-feature-flag-dialog.tsx new file mode 100644 index 000000000..3c5703106 --- /dev/null +++ b/src/frontend/src/customization/components/custom-feature-flag-dialog.tsx @@ -0,0 +1,11 @@ +const CustomFeatureFlagDialog = ({ + isOpen, + setIsOpen, +}: { + isOpen: boolean; + setIsOpen: (isOpen: boolean) => void; +}) => { + return <>; +}; + +export default CustomFeatureFlagDialog; diff --git a/src/frontend/src/customization/components/custom-feature-flag-menu-items.tsx b/src/frontend/src/customization/components/custom-feature-flag-menu-items.tsx new file mode 100644 index 000000000..78b9eb1f5 --- /dev/null +++ b/src/frontend/src/customization/components/custom-feature-flag-menu-items.tsx @@ -0,0 +1,5 @@ +const CustomFeatureFlagMenuItems = ({ onClick }: { onClick?: () => void }) => { + return <>; +}; + +export default CustomFeatureFlagMenuItems;