2024-08-06 14:52:22 +00:00
|
|
|
import type { FeatureFlag } from "ee/entities/FeatureFlag";
|
2024-04-11 11:51:14 +00:00
|
|
|
import {
|
|
|
|
|
setFeatureFlagOverridesAction,
|
|
|
|
|
updateFeatureFlagOverrideAction,
|
|
|
|
|
} from "actions/featureFlagActions";
|
|
|
|
|
import { isBoolean } from "lodash";
|
|
|
|
|
import { useEffect } from "react";
|
|
|
|
|
import { useDispatch, useSelector } from "react-redux";
|
|
|
|
|
import { getFeatureFlagsFetched } from "selectors/usersSelectors";
|
|
|
|
|
import {
|
|
|
|
|
getFeatureFlagOverrideValues,
|
|
|
|
|
setFeatureFlagOverrideValues,
|
|
|
|
|
} from "utils/storage";
|
|
|
|
|
|
|
|
|
|
export const AvailableFeaturesToOverride: FeatureFlag[] = [
|
|
|
|
|
"release_anvil_enabled",
|
|
|
|
|
"release_layout_conversion_enabled",
|
2024-07-05 08:27:59 +00:00
|
|
|
"release_anvil_toggle_enabled",
|
2025-03-12 12:59:36 +00:00
|
|
|
"release_fn_calling_enabled",
|
2024-04-11 11:51:14 +00:00
|
|
|
];
|
2024-04-11 13:33:39 +00:00
|
|
|
export type OverriddenFeatureFlags = Partial<Record<FeatureFlag, boolean>>;
|
2024-04-11 11:51:14 +00:00
|
|
|
|
|
|
|
|
export const useFeatureFlagOverride = () => {
|
|
|
|
|
const dispatch = useDispatch();
|
|
|
|
|
const areFeatureFlagsFetched = useSelector(getFeatureFlagsFetched);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Fetches the feature flag override values and updates the state.
|
|
|
|
|
*/
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
if (areFeatureFlagsFetched) {
|
|
|
|
|
getFeatureFlagOverrideValues().then((flagValues) => {
|
|
|
|
|
const filteredFlagValues = (
|
|
|
|
|
Object.entries(flagValues) as [FeatureFlag, boolean][]
|
|
|
|
|
).reduce((acc, [flagName, flagValue]) => {
|
|
|
|
|
if (
|
|
|
|
|
AvailableFeaturesToOverride.includes(flagName) &&
|
|
|
|
|
isBoolean(flagValue)
|
|
|
|
|
) {
|
|
|
|
|
acc[flagName] = flagValues[flagName];
|
|
|
|
|
}
|
2024-09-18 16:35:28 +00:00
|
|
|
|
2024-04-11 11:51:14 +00:00
|
|
|
return acc;
|
|
|
|
|
}, {} as OverriddenFeatureFlags);
|
2024-09-18 16:35:28 +00:00
|
|
|
|
2024-04-11 11:51:14 +00:00
|
|
|
if (filteredFlagValues) {
|
|
|
|
|
dispatch(setFeatureFlagOverridesAction(filteredFlagValues));
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
2024-07-05 08:27:59 +00:00
|
|
|
}, [areFeatureFlagsFetched, dispatch]);
|
2024-04-11 11:51:14 +00:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Sets up a global function to toggle the feature flag override.
|
|
|
|
|
*/
|
|
|
|
|
useEffect(() => {
|
2024-07-31 15:41:28 +00:00
|
|
|
// TODO: Fix this the next time the file is edited
|
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
2024-04-11 11:51:14 +00:00
|
|
|
(window as any).overrideFeatureFlag = (
|
|
|
|
|
featureFlagValues: OverriddenFeatureFlags,
|
|
|
|
|
) => {
|
|
|
|
|
const areAllFlagsValid = (
|
|
|
|
|
Object.entries(featureFlagValues) as [FeatureFlag, boolean][]
|
|
|
|
|
).every(
|
|
|
|
|
([flagName, flagValue]) =>
|
|
|
|
|
AvailableFeaturesToOverride.includes(flagName) &&
|
|
|
|
|
isBoolean(flagValue),
|
|
|
|
|
);
|
2024-09-18 16:35:28 +00:00
|
|
|
|
2024-04-11 11:51:14 +00:00
|
|
|
if (areAllFlagsValid) {
|
|
|
|
|
dispatch(updateFeatureFlagOverrideAction(featureFlagValues));
|
|
|
|
|
setFeatureFlagOverrideValues(featureFlagValues);
|
|
|
|
|
window.console.log(
|
|
|
|
|
"Feature flag override values set to: ",
|
|
|
|
|
featureFlagValues,
|
|
|
|
|
);
|
|
|
|
|
} else {
|
|
|
|
|
window.console.error(
|
|
|
|
|
"Invalid feature flag override values. Please check the feature flags being overridden.",
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
}, [dispatch]);
|
|
|
|
|
};
|