Feature Toggles
The Configuration Api provides an endpoint for collecting feature toggles defined in the Github repo: configuration-api-files.
We primarily use Feature Toggles as a release mechanism to support continuous delivery as well as timed releases.
Adding a new feature toggle
To add a new feature toggle, create a PR in the configuration-api-files
in the main file that relates to your project/team, in each environment directory.
NB: As a general rule of thumb, it's good to enable to feature toggle for development
initially, while having it off for the others until you need to toggle.
In the @mtfh/common/lib/configuration
you will need to define the scope, as well as the feature toggles the frontend needs to support.
const initialFeatureToggles = {
MMH: {
Test: false,
TenureActivityHistory: false,
RefactorComments: false,
CreateTenure: false,
EditTenure: false,
},
};
This step allows us to enforce feature toggle names in our UI.
Using a feature toggle
In React, we provide a hook to access feature toggles within React components:
import { useFeatureToggle } from '@mtfh/common/lib/hooks'
const View = () => {
const hasEditTenure = useFeatureToggle('MMH.EditTenure');
}
** Outside of React: **
import { hasToggle } from '@mtfh/common/lib/configuration'
const hasEditTenure = hasToggle('MMH.EditTenure')
Released Deployments
Our micro-frontends are setup for continuous delivery through trunk based git flow, and as a result all unreleased features that introduce change should be feature toggled. This is so developers can continuously work on features and still allow hot fixes.
A helpful strategy to reduce complexity and avoid deeply nested feature toggles, we recommend duplicating the top level views and marking the current version as legacy.
** In app.tsx: **
import { useFeatureToggle } from '@mtfh/common/lib/hooks';
import { EditTenureViewV2, EditTenureView } from './views';
export default function App(): JSX.Element {
const hasEditTenureV2 = useFeatureToggle('MMH.EditTenureV2');
return (
<Switch>
<Route path="/tenure/:tenureId/edit">
{hasEditTenureV2 ? <EditTenureView /> : <EditTenureViewLegacy />}
</Route>
</Switch>
)
}