1
0
mirror of https://github.com/Unleash/unleash.git synced 2024-12-22 19:07:54 +01:00

feat: useUiFlag shorthand hook (#4566)

## About the changes
Instead of this:
```ts
const { uiConfig } = useUiConfig();
const myFlag = Boolean(uiConfig?.flags?.myFlag)
```
we can have this:
```ts
const myFlag = useUiFlag("myFlag")
```
With the same type safety, less verbose and more purposeful code.

### Important files
- `frontend/src/hooks/useUiFlag.ts`


## Discussion points
Can we in the future share flags between frontend and backend? Right now
adding a new flag has to be done in 4 different places (backend flag
keys list, backend flags defaults config, backend experimental server
options, frontend type).

Most ergonomic option is to pull config directly from Unleash. 
Issue, based on previous user feedback:
https://github.com/Unleash/unleash/issues/4565
Internal feature request document:
[docs.google.com/document/d/1Sx0q...](https://docs.google.com/document/d/1Sx0qKZXUVUCjuY5F4MOh1ieOM1A2_jE58zEA7jaM_1g/edit?usp=sharing)
This commit is contained in:
Tymoteusz Czech 2023-09-11 10:01:20 +02:00 committed by GitHub
parent f6a157f2f5
commit a9ac81a089
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 22 additions and 10 deletions

View File

@ -8,7 +8,6 @@ import { ReactComponent as UnleashLogo } from 'assets/img/logoDarkWithText.svg';
import { ReactComponent as UnleashLogoWhite } from 'assets/img/logoWithWhiteText.svg';
import NavigationLink from '../NavigationLink/NavigationLink';
import { basePath } from 'utils/formatPath';
import { IFlags } from 'interfaces/uiConfig';
import { INavigationMenuItem } from 'interfaces/route';
import styles from './DrawerMenu.module.scss'; // FIXME: useStyle - theme
import theme from 'themes/theme';
@ -36,7 +35,6 @@ interface IDrawerMenuProps {
href: string;
title: string;
}>;
flags?: IFlags;
routes: {
mainNavRoutes: INavigationMenuItem[];
mobileRoutes: INavigationMenuItem[];
@ -46,7 +44,6 @@ interface IDrawerMenuProps {
export const DrawerMenu: VFC<IDrawerMenuProps> = ({
links = [],
flags = {},
open = false,
toggleDrawer,
routes,

View File

@ -147,7 +147,6 @@ const Header: VFC = () => {
</IconButton>
</Tooltip>
<DrawerMenu
flags={uiConfig.flags}
links={uiConfig.links}
open={openDrawer}
toggleDrawer={toggleDrawer}

View File

@ -0,0 +1,9 @@
import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig';
type flags = ReturnType<typeof useUiConfig>['uiConfig']['flags'];
export const useUiFlag = <K extends keyof flags>(flag: K) => {
const { uiConfig } = useUiConfig();
return uiConfig?.flags?.[flag] || false;
};

View File

@ -1,5 +1,5 @@
import { VoidFunctionComponent } from 'react';
import { IFlags, IUiConfig } from 'interfaces/uiConfig';
import { UiFlags, IUiConfig } from 'interfaces/uiConfig';
export interface IRoute {
path: string;
@ -7,7 +7,7 @@ export interface IRoute {
type: 'protected' | 'unprotected';
layout?: string;
parent?: string;
flag?: keyof IFlags;
flag?: keyof UiFlags;
configFlag?: keyof IUiConfig;
hidden?: boolean;
enterprise?: boolean;
@ -20,7 +20,7 @@ export interface INavigationMenuItem {
path: string;
title: string;
menu: IRouteMenu;
flag?: keyof IFlags;
flag?: keyof UiFlags;
configFlag?: keyof IUiConfig;
group?: string;
}

View File

@ -4,7 +4,14 @@ import { Variant } from 'utils/variants';
export interface IUiConfig {
authenticationType?: string;
baseUriPath?: string;
flags: IFlags;
/**
* @deprecated `useUiFlags` can be used instead
* @example
* ```ts
* const yourFlag = useUiFlags("yourFlag")
* ```
*/
flags: UiFlags;
name: string;
slogan: string;
environment?: string;
@ -29,7 +36,7 @@ export interface IProclamationToast {
link: string;
}
export interface IFlags {
export type UiFlags = {
P: boolean;
RE: boolean;
EEA?: boolean;
@ -59,7 +66,7 @@ export interface IFlags {
featureNamingPattern?: boolean;
doraMetrics?: boolean;
[key: string]: boolean | Variant | undefined;
}
};
export interface IVersionInfo {
instanceId: string;