diff --git a/frontend/package-lock.json b/frontend/package-lock.json
index b953045d740a..c69dfe57f993 100644
--- a/frontend/package-lock.json
+++ b/frontend/package-lock.json
@@ -23,7 +23,7 @@
"@babel/register": "^7.12.1",
"@datadog/ui-extensions-react": "0.32.0",
"@datadog/ui-extensions-sdk": "0.32.0",
- "@flagsmith/flagsmith": "^11.0.0-internal.5",
+ "@flagsmith/flagsmith": "^11.0.0-internal.6",
"@ionic/react": "^7.5.3",
"@material-ui/core": "4.12.4",
"@react-oauth/google": "^0.2.8",
@@ -2780,9 +2780,9 @@
}
},
"node_modules/@flagsmith/flagsmith": {
- "version": "11.0.0",
- "resolved": "https://registry.npmjs.org/@flagsmith/flagsmith/-/flagsmith-11.0.0.tgz",
- "integrity": "sha512-jJB+1O/ctU7TCoIBsV2lgYAUOpShjcSqHkH4nlyqUGeQCGC0ZHto8IvGf+nZwpFAF5Czaphn/anm9MDoZIS3rw==",
+ "version": "11.0.0-internal.6",
+ "resolved": "https://registry.npmjs.org/@flagsmith/flagsmith/-/flagsmith-11.0.0-internal.6.tgz",
+ "integrity": "sha512-Vz719LOLC6h6KDHqlULOJTCth5RuX2iT4GPxcTZTGxOrxM9q4XwE8AxxLqoExgucXrd2neKUMU0PDmB1Q3LE0Q==",
"license": "BSD-3-Clause"
},
"node_modules/@floating-ui/core": {
diff --git a/frontend/package.json b/frontend/package.json
index 7a1e53625582..e22927246a51 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -51,7 +51,7 @@
"@babel/register": "^7.12.1",
"@datadog/ui-extensions-react": "0.32.0",
"@datadog/ui-extensions-sdk": "0.32.0",
- "@flagsmith/flagsmith": "^11.0.0-internal.5",
+ "@flagsmith/flagsmith": "^11.0.0-internal.6",
"@ionic/react": "^7.5.3",
"@material-ui/core": "4.12.4",
"@react-oauth/google": "^0.2.8",
diff --git a/frontend/web/components/feature-page/FeatureNavTab/CodeReferences/FeatureCodeReferencesContainer.tsx b/frontend/web/components/feature-page/FeatureNavTab/CodeReferences/FeatureCodeReferencesContainer.tsx
index 42227eb39165..4ede1c2b5bfc 100644
--- a/frontend/web/components/feature-page/FeatureNavTab/CodeReferences/FeatureCodeReferencesContainer.tsx
+++ b/frontend/web/components/feature-page/FeatureNavTab/CodeReferences/FeatureCodeReferencesContainer.tsx
@@ -1,4 +1,5 @@
-import React, { useMemo } from 'react'
+import React, { useEffect, useMemo, useRef } from 'react'
+import flagsmith from '@flagsmith/flagsmith'
import { useGetFeatureCodeReferencesQuery } from 'common/services/useCodeReferences'
import RepoCodeReferencesSection from './components/RepoCodeReferencesSection'
import { FeatureCodeReferences } from 'common/types/responses'
@@ -34,6 +35,23 @@ const FeatureCodeReferencesContainer: React.FC<
[data],
)
+ const hasTrackedView = useRef(false)
+ useEffect(() => {
+ if (data.length > 0 && !hasTrackedView.current) {
+ hasTrackedView.current = true
+ const totalRefs = data.reduce(
+ (sum, repo) => sum + repo.code_references.length,
+ 0,
+ )
+ flagsmith.trackEvent('code_references_view', {
+ feature_id: featureId,
+ project_id: projectId,
+ repos_count: data.length,
+ total_refs_count: totalRefs,
+ })
+ }
+ }, [data, featureId, projectId])
+
if (isLoading) {
return (
@@ -59,6 +77,7 @@ const FeatureCodeReferencesContainer: React.FC<
key={codeReferencesByRepo[repo].repository_url}
repositoryName={codeReferencesByRepo[repo].repository_url}
repositoryScan={codeReferencesByRepo[repo]}
+ featureId={featureId}
/>
))}
diff --git a/frontend/web/components/feature-page/FeatureNavTab/CodeReferences/components/CodeReferenceItem.tsx b/frontend/web/components/feature-page/FeatureNavTab/CodeReferences/components/CodeReferenceItem.tsx
index edeb324c30c0..334a16903db8 100644
--- a/frontend/web/components/feature-page/FeatureNavTab/CodeReferences/components/CodeReferenceItem.tsx
+++ b/frontend/web/components/feature-page/FeatureNavTab/CodeReferences/components/CodeReferenceItem.tsx
@@ -1,12 +1,17 @@
+import flagsmith from '@flagsmith/flagsmith'
import Icon from 'components/Icon'
-import { CodeReference } from 'common/types/responses'
+import { CodeReference, VCSProvider } from 'common/types/responses'
interface CodeReferenceItemProps {
codeReference: CodeReference
+ featureId: number
+ vcsProvider: VCSProvider
}
const CodeReferenceItem: React.FC = ({
codeReference,
+ featureId,
+ vcsProvider,
}) => {
return (
@@ -25,6 +30,12 @@ const CodeReferenceItem: React.FC = ({
href={codeReference.permalink}
target='_blank'
rel='noreferrer'
+ onClick={() => {
+ flagsmith.trackEvent('code_references_click_permalink', {
+ feature_id: featureId,
+ vcs_provider: vcsProvider,
+ })
+ }}
>
{codeReference.file_path}:{codeReference.line_number}
diff --git a/frontend/web/components/feature-page/FeatureNavTab/CodeReferences/components/RepoCodeReferencesSection.tsx b/frontend/web/components/feature-page/FeatureNavTab/CodeReferences/components/RepoCodeReferencesSection.tsx
index 48adc5f7c5f8..cc8018dea91a 100644
--- a/frontend/web/components/feature-page/FeatureNavTab/CodeReferences/components/RepoCodeReferencesSection.tsx
+++ b/frontend/web/components/feature-page/FeatureNavTab/CodeReferences/components/RepoCodeReferencesSection.tsx
@@ -1,4 +1,5 @@
import React, { useState } from 'react'
+import flagsmith from '@flagsmith/flagsmith'
import { FeatureCodeReferences } from 'common/types/responses'
import moment from 'moment'
import CodeReferenceItem from './CodeReferenceItem'
@@ -9,9 +10,11 @@ import CodeReferenceScanIndicator from './CodeReferenceScanIndicator'
interface RepoCodeReferencesSectionProps {
repositoryScan: FeatureCodeReferences
repositoryName: string
+ featureId: number
}
const RepoCodeReferencesSection: React.FC = ({
+ featureId,
repositoryName,
repositoryScan,
}) => {
@@ -42,7 +45,16 @@ const RepoCodeReferencesSection: React.FC = ({
>
setIsOpen(!isOpen)}
+ onClick={() => {
+ if (!isOpen) {
+ flagsmith.trackEvent('code_references_expand_repo', {
+ feature_id: featureId,
+ refs_count: repositoryScan?.code_references?.length,
+ vcs_provider: repositoryScan?.vcs_provider,
+ })
+ }
+ setIsOpen(!isOpen)
+ }}
>
= ({
{repositoryScan?.code_references?.map((codeReference) => (
))}
diff --git a/frontend/web/components/modals/create-feature/tabs/UsageTab.tsx b/frontend/web/components/modals/create-feature/tabs/UsageTab.tsx
index c59793c75307..f35df112c9b3 100644
--- a/frontend/web/components/modals/create-feature/tabs/UsageTab.tsx
+++ b/frontend/web/components/modals/create-feature/tabs/UsageTab.tsx
@@ -1,4 +1,5 @@
import React, { FC } from 'react'
+import flagsmith from '@flagsmith/flagsmith'
import Project from 'common/project'
import FeatureAnalytics from 'components/feature-page/FeatureNavTab/FeatureAnalytics'
import FeatureCodeReferencesContainer from 'components/feature-page/FeatureNavTab/CodeReferences/FeatureCodeReferencesContainer'
@@ -48,6 +49,11 @@ const UsageTab: FC = ({
target='_blank'
href='https://docs.flagsmith.com/managing-flags/code-references'
rel='noreferrer'
+ onClick={() => {
+ flagsmith.trackEvent('code_references_click_docs', {
+ feature_id: featureId,
+ })
+ }}
>
Learn more
diff --git a/frontend/web/components/navigation/navbars/ProjectNavbar.tsx b/frontend/web/components/navigation/navbars/ProjectNavbar.tsx
index 19a96788b2c1..e2666ff3355a 100644
--- a/frontend/web/components/navigation/navbars/ProjectNavbar.tsx
+++ b/frontend/web/components/navigation/navbars/ProjectNavbar.tsx
@@ -51,18 +51,18 @@ const ProjectNavbar: FC = ({ environmentId, projectId }) => {
>
Segments
- {Utils.getFlagsmithHasFeature('feature_lifecycle') && (
- }
- id='lifecycle-link'
- to={`/project/${projectId}/lifecycle`}
- isActive={(_, location) =>
- location.pathname.startsWith(`/project/${projectId}/lifecycle`)
- }
- >
- Feature Lifecycle
-
- )}
+ {Utils.getFlagsmithHasFeature('feature_lifecycle') && (
+ }
+ id='lifecycle-link'
+ to={`/project/${projectId}/lifecycle`}
+ isActive={(_, location) =>
+ location.pathname.startsWith(`/project/${projectId}/lifecycle`)
+ }
+ >
+ Feature Lifecycle
+
+ )}