Skip to content

Instantly share code, notes, and snippets.

@KASOGIT
Created October 4, 2021 16:24
Show Gist options
  • Save KASOGIT/18fa5aebdf4b9d51f6a25ae9982eb08f to your computer and use it in GitHub Desktop.
Save KASOGIT/18fa5aebdf4b9d51f6a25ae9982eb08f to your computer and use it in GitHub Desktop.
useFeature flag hook
declare global {
interface Window {
flags: {
enableFlag?: (name: string) => void;
disableFlag?: (name: string) => void;
};
}
}
const FeatureFlagsContext = React.createContext({}); // flag names
export function useFeatureFlags() {
const [flags, setFlags] = React.useState({});
const enableFlag = React.useCallback(
(flagName: string) => {
setFlags((prevFlags) => ({ ...prevFlags, [flagName]: true }));
},
[setFlags]
);
const disableFlag = React.useCallback(
(flagName: string) => {
setFlags((prevFlags) => ({ ...prevFlags, [flagName]: false }));
},
[setFlags]
);
React.useEffect(() => {
window.flags = {
enableFlag,
disableFlag,
};
}, [disableFlag, enableFlag]);
return flags;
}
export function useIsFeatureFlag(flagName: string) {
const flags = React.useContext(FeatureFlagsContext);
return flags[flagName];
}
// usage
function App() {
const flags = useFeatureFlags();
return (
<FeatureFlagsContext.Provider value={flags}>
<div>
<h1>Feature Flags</h1>
</div>
</FeatureFlagsContext.Provider>
);
}
function Component() {
const isFlagEnabled = useIsFeatureFlag("flag-name");
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment