diff --git a/packages/core-app-api/src/apis/implementations/FeatureFlagsApi/LocalStorageFeatureFlags.test.tsx b/packages/core-app-api/src/apis/implementations/FeatureFlagsApi/LocalStorageFeatureFlags.test.tsx index a0b04a922c..1193592e96 100644 --- a/packages/core-app-api/src/apis/implementations/FeatureFlagsApi/LocalStorageFeatureFlags.test.tsx +++ b/packages/core-app-api/src/apis/implementations/FeatureFlagsApi/LocalStorageFeatureFlags.test.tsx @@ -218,51 +218,4 @@ describe('FeatureFlags', () => { ).toThrow(/only contain lowercase letters, numbers and hyphens/i); }); }); - - describe('getSortedRegisteredFlags', () => { - let featureFlags: FeatureFlagsApi; - - beforeEach(() => { - featureFlags = new LocalStorageFeatureFlags(); - }); - - it('should return empty list', () => { - expect(featureFlags.getSortedFlags()).toEqual([]); - }); - - it('loads active flags first in registered order', () => { - featureFlags.registerFlag({ - name: 'registered-flag-1', - pluginId: 'plugin-one', - }); - featureFlags.registerFlag({ - name: 'registered-flag-2', - pluginId: 'plugin-two', - }); - featureFlags.registerFlag({ - name: 'registered-flag-3', - pluginId: 'plugin-three', - }); - featureFlags.registerFlag({ - name: 'registered-flag-4', - pluginId: 'plugin-four', - }); - - featureFlags.save({ - states: { - 'registered-flag-1': FeatureFlagState.None, - 'registered-flag-2': FeatureFlagState.Active, - 'registered-flag-3': FeatureFlagState.None, - 'registered-flag-4': FeatureFlagState.Active, - }, - }); - - expect(featureFlags.getSortedFlags()).toEqual([ - { name: 'registered-flag-2', pluginId: 'plugin-two' }, - { name: 'registered-flag-4', pluginId: 'plugin-four' }, - { name: 'registered-flag-1', pluginId: 'plugin-one' }, - { name: 'registered-flag-3', pluginId: 'plugin-three' }, - ]); - }); - }); }); diff --git a/packages/core-app-api/src/apis/implementations/FeatureFlagsApi/LocalStorageFeatureFlags.tsx b/packages/core-app-api/src/apis/implementations/FeatureFlagsApi/LocalStorageFeatureFlags.tsx index 66bb5f48c0..2c8470642a 100644 --- a/packages/core-app-api/src/apis/implementations/FeatureFlagsApi/LocalStorageFeatureFlags.tsx +++ b/packages/core-app-api/src/apis/implementations/FeatureFlagsApi/LocalStorageFeatureFlags.tsx @@ -57,14 +57,6 @@ export class LocalStorageFeatureFlags implements FeatureFlagsApi { this.registeredFeatureFlags.push(flag); } - getSortedFlags(): FeatureFlag[] { - const flags = this.registeredFeatureFlags; - const activeFlags = flags.filter(flag => this.isActive(flag.name)); - const idleFlags = flags.filter(flag => !this.isActive(flag.name)); - this.registeredFeatureFlags = [...activeFlags, ...idleFlags]; - return this.registeredFeatureFlags.slice(); - } - getRegisteredFlags(): FeatureFlag[] { return this.registeredFeatureFlags.slice(); } diff --git a/packages/core-plugin-api/api-report.md b/packages/core-plugin-api/api-report.md index b9c88f7cd7..52ee47f6bb 100644 --- a/packages/core-plugin-api/api-report.md +++ b/packages/core-plugin-api/api-report.md @@ -436,7 +436,6 @@ export type FeatureFlag = { // @public export interface FeatureFlagsApi { getRegisteredFlags(): FeatureFlag[]; - getSortedFlags(): FeatureFlag[]; isActive(name: string): boolean; registerFlag(flag: FeatureFlag): void; save(options: FeatureFlagsSaveOptions): void; diff --git a/packages/core-plugin-api/src/apis/definitions/FeatureFlagsApi.ts b/packages/core-plugin-api/src/apis/definitions/FeatureFlagsApi.ts index 1dcc1ba74d..66260afa32 100644 --- a/packages/core-plugin-api/src/apis/definitions/FeatureFlagsApi.ts +++ b/packages/core-plugin-api/src/apis/definitions/FeatureFlagsApi.ts @@ -84,11 +84,6 @@ export interface FeatureFlagsApi { */ registerFlag(flag: FeatureFlag): void; - /** - * Get a list of all registered flags sorted. - */ - getSortedFlags(): FeatureFlag[]; - /** * Get a list of all registered flags. */ diff --git a/plugins/explore/src/components/ExploreLayout/ExploreLayout.test.tsx b/plugins/explore/src/components/ExploreLayout/ExploreLayout.test.tsx index 808a0d9dec..7574c685a4 100644 --- a/plugins/explore/src/components/ExploreLayout/ExploreLayout.test.tsx +++ b/plugins/explore/src/components/ExploreLayout/ExploreLayout.test.tsx @@ -29,7 +29,6 @@ const featureFlagsApi: jest.Mocked = { save: jest.fn(), getRegisteredFlags: jest.fn(), registerFlag: jest.fn(), - getSortedFlags: jest.fn(), }; describe('', () => { diff --git a/plugins/scaffolder/src/components/TemplatePage/TemplatePage.test.tsx b/plugins/scaffolder/src/components/TemplatePage/TemplatePage.test.tsx index 1854f4a307..344929fa43 100644 --- a/plugins/scaffolder/src/components/TemplatePage/TemplatePage.test.tsx +++ b/plugins/scaffolder/src/components/TemplatePage/TemplatePage.test.tsx @@ -62,7 +62,6 @@ const featureFlagsApiMock: jest.Mocked = { registerFlag: jest.fn(), getRegisteredFlags: jest.fn(), save: jest.fn(), - getSortedFlags: jest.fn(), }; const errorApiMock = { post: jest.fn(), error$: jest.fn() }; diff --git a/plugins/user-settings/src/components/FeatureFlags/UserSettingsFeatureFlags.tsx b/plugins/user-settings/src/components/FeatureFlags/UserSettingsFeatureFlags.tsx index d5943c4e8c..60b951ab60 100644 --- a/plugins/user-settings/src/components/FeatureFlags/UserSettingsFeatureFlags.tsx +++ b/plugins/user-settings/src/components/FeatureFlags/UserSettingsFeatureFlags.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ -import React, { useCallback, useEffect, useState } from 'react'; +import React, { useCallback, useState } from 'react'; import { List, TextField, @@ -25,6 +25,8 @@ import { import { EmptyFlags } from './EmptyFlags'; import { FlagItem } from './FeatureFlagsItem'; import { + FeatureFlag, + FeatureFlagsApi, featureFlagsApiRef, FeatureFlagState, useApi, @@ -32,19 +34,27 @@ import { import { InfoCard } from '@backstage/core-components'; import ClearIcon from '@material-ui/icons/Clear'; +export const sortFlags = ( + flags: FeatureFlag[], + featureFlagsApi: FeatureFlagsApi, +): FeatureFlag[] => { + const activeFlags = flags.filter(flag => featureFlagsApi.isActive(flag.name)); + const idleFlags = flags.filter(flag => !featureFlagsApi.isActive(flag.name)); + return [...activeFlags, ...idleFlags]; +}; + /** @public */ export const UserSettingsFeatureFlags = () => { const featureFlagsApi = useApi(featureFlagsApiRef); - const inputRef = React.useRef(); - const [isFirstLoad, setIsFirstLoad] = React.useState(true); - useEffect(() => { - if (isFirstLoad) setIsFirstLoad(false); - }, [isFirstLoad]); - const featureFlags = isFirstLoad - ? featureFlagsApi.getSortedFlags() - : featureFlagsApi.getRegisteredFlags(); + const initialFeatureFlags = featureFlagsApi.getRegisteredFlags(); + const initialFeatureFlagsSorted = sortFlags( + initialFeatureFlags, + featureFlagsApi, + ); + const [featureFlags] = useState(initialFeatureFlagsSorted); + const initialFlagState = Object.fromEntries( featureFlags.map(({ name }) => [name, featureFlagsApi.isActive(name)]), );