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 ( -
-

Loading...

- -
- ); - } 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, }, }, },