edeaecad05
Issue: When attempting to toggle a public feature flag that didn't exist in the workspace's feature flags array, the LabService threw a FeatureFlagException with code FEATURE_FLAG_NOT_FOUND. This prevented users from enabling public feature flags for the first time in their workspace. Fix: Modified the LabService to handle non-existent public feature flags by creating them instead of throwing an error. When the flag doesn't exist, the service now saves a new feature flag record with the provided key and value, associates it with the workspace, and returns the newly created flag.
77 lines
2.0 KiB
TypeScript
77 lines
2.0 KiB
TypeScript
import { currentWorkspaceState } from '@/auth/states/currentWorkspaceState';
|
|
import { labPublicFeatureFlagsState } from '@/client-config/states/labPublicFeatureFlagsState';
|
|
import { useState } from 'react';
|
|
import { useRecoilState, useRecoilValue } from 'recoil';
|
|
import { isDefined } from 'twenty-shared';
|
|
import {
|
|
FeatureFlagKey,
|
|
useUpdateLabPublicFeatureFlagMutation,
|
|
} from '~/generated/graphql';
|
|
|
|
export const useLabPublicFeatureFlags = () => {
|
|
const [error, setError] = useState<string | null>(null);
|
|
const [currentWorkspace, setCurrentWorkspace] = useRecoilState(
|
|
currentWorkspaceState,
|
|
);
|
|
const labPublicFeatureFlags = useRecoilValue(labPublicFeatureFlagsState);
|
|
|
|
const [updateLabPublicFeatureFlag] = useUpdateLabPublicFeatureFlagMutation({
|
|
onCompleted: (data) => {
|
|
if (isDefined(currentWorkspace)) {
|
|
const updatedFlag = data.updateLabPublicFeatureFlag;
|
|
|
|
setCurrentWorkspace({
|
|
...currentWorkspace,
|
|
featureFlags: [
|
|
...(currentWorkspace.featureFlags?.filter(
|
|
(flag) => flag.key !== updatedFlag.key,
|
|
) ?? []),
|
|
{
|
|
...updatedFlag,
|
|
workspaceId: currentWorkspace.id,
|
|
},
|
|
],
|
|
});
|
|
}
|
|
},
|
|
onError: (error) => {
|
|
setError(error.message);
|
|
},
|
|
});
|
|
|
|
const handleLabPublicFeatureFlagUpdate = async (
|
|
publicFeatureFlag: FeatureFlagKey,
|
|
value: boolean,
|
|
) => {
|
|
if (!isDefined(currentWorkspace)) {
|
|
setError('No workspace selected');
|
|
return false;
|
|
}
|
|
|
|
setError(null);
|
|
|
|
const response = await updateLabPublicFeatureFlag({
|
|
variables: {
|
|
input: {
|
|
publicFeatureFlag,
|
|
value,
|
|
},
|
|
},
|
|
});
|
|
|
|
return !!response.data;
|
|
};
|
|
|
|
return {
|
|
labPublicFeatureFlags: labPublicFeatureFlags.map((flag) => ({
|
|
...flag,
|
|
value:
|
|
currentWorkspace?.featureFlags?.find(
|
|
(workspaceFlag) => workspaceFlag.key === flag.key,
|
|
)?.value ?? false,
|
|
})),
|
|
handleLabPublicFeatureFlagUpdate,
|
|
error,
|
|
};
|
|
};
|