diff --git a/frontend/src/component/application/Application.tsx b/frontend/src/component/application/Application.tsx
index 60d63e13f5..3a78bde156 100644
--- a/frontend/src/component/application/Application.tsx
+++ b/frontend/src/component/application/Application.tsx
@@ -28,8 +28,6 @@ import useToast from 'hooks/useToast';
import { formatDateYMD } from 'utils/formatDate';
import { formatUnknownError } from 'utils/formatUnknownError';
import { useRequiredPathParam } from 'hooks/useRequiredPathParam';
-import { useUiFlag } from 'hooks/useUiFlag';
-import { ApplicationEdit } from './ApplicationEdit/ApplicationEdit';
import ApplicationOverview from './ApplicationOverview';
import PermissionIconButton from 'component/common/PermissionIconButton/PermissionIconButton';
@@ -70,7 +68,6 @@ const StyledTab = styled(Tab)(({ theme }) => ({
}));
export const Application = () => {
- const useOldApplicationScreen = !useUiFlag('sdkReporting');
const navigate = useNavigate();
const name = useRequiredPathParam('name');
const { application, loading } = useApplication(name);
@@ -89,10 +86,6 @@ export const Application = () => {
setShowDialog(!showDialog);
};
- if (useOldApplicationScreen) {
- return ;
- }
-
const formatDate = (v: string) => formatDateYMD(v, locationSettings.locale);
const onDeleteApplication = async (evt: React.SyntheticEvent) => {
diff --git a/frontend/src/component/application/ApplicationEdit/ApplicationEdit.tsx b/frontend/src/component/application/ApplicationEdit/ApplicationEdit.tsx
deleted file mode 100644
index d355f60d7f..0000000000
--- a/frontend/src/component/application/ApplicationEdit/ApplicationEdit.tsx
+++ /dev/null
@@ -1,197 +0,0 @@
-/* eslint react/no-multi-comp:off */
-import type React from 'react';
-import { useContext, useState } from 'react';
-import {
- Box,
- Avatar,
- Icon,
- IconButton,
- LinearProgress,
- Link,
- Tab,
- Tabs,
- Typography,
-} from '@mui/material';
-import LinkIcon from '@mui/icons-material/Link';
-import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender';
-import { UPDATE_APPLICATION } from 'component/providers/AccessProvider/permissions';
-import { ApplicationUpdate } from '../ApplicationUpdate/ApplicationUpdate';
-import { Dialogue } from 'component/common/Dialogue/Dialogue';
-import { PageContent } from 'component/common/PageContent/PageContent';
-import { PageHeader } from 'component/common/PageHeader/PageHeader';
-import AccessContext from 'contexts/AccessContext';
-import useApplicationsApi from 'hooks/api/actions/useApplicationsApi/useApplicationsApi';
-import useApplication from 'hooks/api/getters/useApplication/useApplication';
-import { useNavigate } from 'react-router-dom';
-import { useLocationSettings } from 'hooks/useLocationSettings';
-import useToast from 'hooks/useToast';
-import PermissionButton from 'component/common/PermissionButton/PermissionButton';
-import { formatDateYMD } from 'utils/formatDate';
-import { formatUnknownError } from 'utils/formatUnknownError';
-import { useRequiredPathParam } from 'hooks/useRequiredPathParam';
-import { TabPanel } from 'component/common/TabNav/TabPanel/TabPanel';
-import { ApplicationView } from '../ApplicationView/ApplicationView';
-
-export const ApplicationEdit = () => {
- const navigate = useNavigate();
- const name = useRequiredPathParam('name');
- const { application, loading } = useApplication(name);
- const { appName, url, description, icon = 'apps', createdAt } = application;
- const { hasAccess } = useContext(AccessContext);
- const { deleteApplication } = useApplicationsApi();
- const { locationSettings } = useLocationSettings();
- const { setToastData, setToastApiError } = useToast();
- const [activeTab, setActiveTab] = useState(0);
-
- const [showDialog, setShowDialog] = useState(false);
-
- const toggleModal = () => {
- setShowDialog(!showDialog);
- };
-
- const formatDate = (v: string) => formatDateYMD(v, locationSettings.locale);
-
- const onDeleteApplication = async (evt: React.SyntheticEvent) => {
- evt.preventDefault();
- try {
- await deleteApplication(appName);
- setToastData({
- title: 'Deleted Successfully',
- text: 'Application deleted successfully',
- type: 'success',
- });
- navigate('/applications');
- } catch (error: unknown) {
- setToastApiError(formatUnknownError(error));
- }
- };
-
- const renderModal = () => (
-
- );
- const tabData = [
- {
- label: 'Application overview',
- component: ,
- },
- {
- label: 'Edit application',
- component: ,
- },
- ];
-
- if (loading) {
- return (
-
- );
- } else if (!application) {
- return Application ({appName}) not found
;
- }
-
- return (
- <>
-
-
-
- {icon || 'apps'}
-
- {appName}
-
- }
- title={appName}
- actions={
- <>
-
-
-
- }
- />
-
-
- Delete
-
- >
- }
- />
- ({ marginTop: theme.spacing(1) })}>
- {description || ''}
-
- Created: {formatDate(createdAt)}
-
-
-
-
- {
- setActiveTab(tabId);
- }}
- indicatorColor='primary'
- textColor='primary'
- >
- {tabData.map((tab, index) => (
-
- ))}
-
- }
- >
-
- {renderModal()}
- {tabData.map((tab, index) => (
-
- {tab.component}
-
- ))}
-
- }
- />
-
- >
- );
-};
diff --git a/frontend/src/component/application/ApplicationView/ApplicationView.tsx b/frontend/src/component/application/ApplicationView/ApplicationView.tsx
deleted file mode 100644
index b6d37e5197..0000000000
--- a/frontend/src/component/application/ApplicationView/ApplicationView.tsx
+++ /dev/null
@@ -1,215 +0,0 @@
-import { useContext } from 'react';
-import { Link } from 'react-router-dom';
-import {
- Grid,
- List,
- ListItem,
- ListItemAvatar,
- ListItemText,
- Typography,
- Divider,
-} from '@mui/material';
-import Extension from '@mui/icons-material/Extension';
-import FlagRounded from '@mui/icons-material/FlagRounded';
-import Report from '@mui/icons-material/Report';
-import Timeline from '@mui/icons-material/Timeline';
-import {
- CREATE_FEATURE,
- CREATE_STRATEGY,
-} from 'component/providers/AccessProvider/permissions';
-import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender';
-import { getTogglePath } from 'utils/routePathHelpers';
-import useApplication from 'hooks/api/getters/useApplication/useApplication';
-import AccessContext from 'contexts/AccessContext';
-import { formatDateYMDHMS } from 'utils/formatDate';
-import { useLocationSettings } from 'hooks/useLocationSettings';
-import { useRequiredPathParam } from 'hooks/useRequiredPathParam';
-
-export const ApplicationView = () => {
- const { hasAccess } = useContext(AccessContext);
- const name = useRequiredPathParam('name');
- const { application } = useApplication(name);
- const { locationSettings } = useLocationSettings();
- const { instances, strategies, seenToggles } = application;
-
- const notFoundListItem = ({
- createUrl,
- name,
- permission,
- }: {
- createUrl: string;
- name: string;
- permission: string;
- }) => (
-
-
-
-
- {name}}
- secondary={'Missing, want to create?'}
- />
-
- }
- elseShow={
-
-
-
-
-
-
- }
- />
- );
-
- const foundListItem = ({
- viewUrl,
- name,
- description,
- Icon,
- i,
- }: {
- viewUrl: string;
- name: string;
- description: string;
- Icon: React.ElementType;
- i: number;
- }) => (
-
-
-
-
-
- {name}
-
- }
- secondary={description}
- />
-
- );
-
- return (
-
-
-
- Toggles
-
-
-
- {seenToggles.map(
- ({ name, description, notFound, project }, i) => (
-
- ),
- )}
-
-
-
-
- Implemented strategies
-
-
-
- {strategies.map(
- ({ name, description, notFound }, i: number) => (
-
- ),
- )}
-
-
-
-
- {instances.length} Instances registered
-
-
-
- {instances.map(
- ({
- instanceId,
- clientIp,
- lastSeen,
- sdkVersion,
- }: {
- instanceId: string;
- clientIp: string;
- lastSeen: string;
- sdkVersion: string;
- }) => (
-
-
-
-
-
- {instanceId} {sdkVersion}
-
- }
- elseShow={{instanceId}}
- />
- }
- secondary={
-
- {clientIp} last seen at{' '}
-
- {formatDateYMDHMS(
- lastSeen,
- locationSettings.locale,
- )}
-
-
- }
- />
-
- ),
- )}
-
-
-
- );
-};
diff --git a/frontend/src/component/project/Project/Project.tsx b/frontend/src/component/project/Project/Project.tsx
index 019e089811..acb9716ba3 100644
--- a/frontend/src/component/project/Project/Project.tsx
+++ b/frontend/src/component/project/Project/Project.tsx
@@ -133,7 +133,6 @@ export const Project = () => {
title: 'Applications',
path: `${basePath}/applications`,
name: 'applications',
- flag: 'sdkReporting',
},
{
title: 'Event log',
diff --git a/frontend/src/interfaces/uiConfig.ts b/frontend/src/interfaces/uiConfig.ts
index d28b31c1c7..45858b9c12 100644
--- a/frontend/src/interfaces/uiConfig.ts
+++ b/frontend/src/interfaces/uiConfig.ts
@@ -76,7 +76,6 @@ export type UiFlags = {
showInactiveUsers?: boolean;
featureSearchFeedbackPosting?: boolean;
userAccessUIEnabled?: boolean;
- sdkReporting?: boolean;
outdatedSdksBanner?: boolean;
projectOverviewRefactor?: string;
collectTrafficDataUsage?: boolean;
diff --git a/src/lib/__snapshots__/create-config.test.ts.snap b/src/lib/__snapshots__/create-config.test.ts.snap
index 54d2e18120..b8f7002185 100644
--- a/src/lib/__snapshots__/create-config.test.ts.snap
+++ b/src/lib/__snapshots__/create-config.test.ts.snap
@@ -138,7 +138,6 @@ exports[`should create default config 1`] = `
"responseTimeWithAppNameKillSwitch": false,
"returnGlobalFrontendApiCache": false,
"scimApi": false,
- "sdkReporting": false,
"showInactiveUsers": false,
"signals": false,
"strictSchemaValidation": false,
diff --git a/src/lib/features/project/project-applications.e2e.test.ts b/src/lib/features/project/project-applications.e2e.test.ts
index a5268f75a9..33d1bac48e 100644
--- a/src/lib/features/project/project-applications.e2e.test.ts
+++ b/src/lib/features/project/project-applications.e2e.test.ts
@@ -38,7 +38,6 @@ beforeAll(async () => {
experimental: {
flags: {
strictSchemaValidation: true,
- sdkReporting: true,
},
},
},
diff --git a/src/lib/features/project/project-controller.ts b/src/lib/features/project/project-controller.ts
index f7ac0c51f4..8247631349 100644
--- a/src/lib/features/project/project-controller.ts
+++ b/src/lib/features/project/project-controller.ts
@@ -37,7 +37,6 @@ import {
projectApplicationsSchema,
type ProjectApplicationsSchema,
} from '../../openapi/spec/project-applications-schema';
-import { NotFoundError } from '../../error';
import { projectApplicationsQueryParameters } from '../../openapi/spec/project-applications-query-parameters';
import { normalizeQueryParams } from '../feature-search/search-utils';
import ProjectInsightsController from '../project-insights/project-insights-controller';
@@ -267,10 +266,6 @@ export default class ProjectController extends Controller {
req: IAuthRequest,
res: Response,
): Promise {
- if (!this.flagResolver.isEnabled('sdkReporting')) {
- throw new NotFoundError();
- }
-
const { projectId } = req.params;
const {
diff --git a/src/lib/features/project/projects.e2e.test.ts b/src/lib/features/project/projects.e2e.test.ts
index 13e4eeec86..e195bbfdfd 100644
--- a/src/lib/features/project/projects.e2e.test.ts
+++ b/src/lib/features/project/projects.e2e.test.ts
@@ -24,7 +24,6 @@ beforeAll(async () => {
experimental: {
flags: {
strictSchemaValidation: true,
- sdkReporting: true,
},
},
},
diff --git a/src/lib/routes/admin-api/metrics.ts b/src/lib/routes/admin-api/metrics.ts
index 754f384c5a..9cbc1857e6 100644
--- a/src/lib/routes/admin-api/metrics.ts
+++ b/src/lib/routes/admin-api/metrics.ts
@@ -17,7 +17,6 @@ import type { CreateApplicationSchema } from '../../openapi/spec/create-applicat
import type { IAuthRequest } from '../unleash-types';
import { extractUserIdFromUser } from '../../util';
import { type IFlagResolver, serializeDates } from '../../types';
-import { NotFoundError } from '../../error';
import {
type ApplicationOverviewSchema,
applicationOverviewSchema,
@@ -285,9 +284,6 @@ class MetricsController extends Controller {
req: Request<{ appName: string }>,
res: Response,
): Promise {
- if (!this.flagResolver.isEnabled('sdkReporting')) {
- throw new NotFoundError();
- }
const { appName } = req.params;
const overview =
await this.clientInstanceService.getApplicationOverview(appName);
@@ -301,9 +297,6 @@ class MetricsController extends Controller {
}
async getOutdatedSdks(req: Request, res: Response) {
- if (!this.flagResolver.isEnabled('sdkReporting')) {
- throw new NotFoundError();
- }
const outdatedSdks = await this.clientInstanceService.getOutdatedSdks();
this.openApiService.respondWithValidation(
@@ -318,9 +311,6 @@ class MetricsController extends Controller {
req: Request<{ appName: string; environment: string }>,
res: Response,
): Promise {
- if (!this.flagResolver.isEnabled('sdkReporting')) {
- throw new NotFoundError();
- }
const { appName, environment } = req.params;
const instances =
await this.clientInstanceService.getApplicationEnvironmentInstances(
diff --git a/src/lib/types/experimental.ts b/src/lib/types/experimental.ts
index a81f6ade69..c5ca64bca1 100644
--- a/src/lib/types/experimental.ts
+++ b/src/lib/types/experimental.ts
@@ -49,7 +49,6 @@ export type IFlagKey =
| 'userAccessUIEnabled'
| 'disableUpdateMaxRevisionId'
| 'disablePublishUnannouncedEvents'
- | 'sdkReporting'
| 'outdatedSdksBanner'
| 'responseTimeMetricsFix'
| 'scimApi'
@@ -196,10 +195,6 @@ const flags: IFlags = {
process.env.UNLEASH_EXPERIMENTAL_EXECUTIVE_DASHBOARD_UI,
false,
),
- sdkReporting: parseEnvVarBoolean(
- process.env.UNLEASH_EXPERIMENTAL_SDK_REPORTING,
- false,
- ),
outdatedSdksBanner: parseEnvVarBoolean(
process.env.UNLEASH_EXPERIMENTAL_OUTDATED_SDKS_BANNER,
false,
diff --git a/src/server-dev.ts b/src/server-dev.ts
index 732f5df390..cfe42e8fe2 100644
--- a/src/server-dev.ts
+++ b/src/server-dev.ts
@@ -49,7 +49,6 @@ process.nextTick(async () => {
executiveDashboard: true,
executiveDashboardUI: true,
userAccessUIEnabled: true,
- sdkReporting: true,
outdatedSdksBanner: true,
globalFrontendApiCache: true,
returnGlobalFrontendApiCache: false,
diff --git a/src/test/e2e/api/admin/applications.e2e.test.ts b/src/test/e2e/api/admin/applications.e2e.test.ts
index 849a63a710..41bd760193 100644
--- a/src/test/e2e/api/admin/applications.e2e.test.ts
+++ b/src/test/e2e/api/admin/applications.e2e.test.ts
@@ -56,7 +56,6 @@ beforeAll(async () => {
experimental: {
flags: {
strictSchemaValidation: true,
- sdkReporting: true,
},
},
},