import { IFeatureStrategy, IConstraint } from 'interfaces/strategy'; import React from 'react'; import { ConstraintAccordion } from 'component/common/ConstraintAccordion/ConstraintAccordion'; import produce from 'immer'; import useUnleashContext from 'hooks/api/getters/useUnleashContext/useUnleashContext'; import PermissionButton from 'component/common/PermissionButton/PermissionButton'; import { CREATE_FEATURE_STRATEGY, UPDATE_FEATURE_STRATEGY, } from 'component/providers/AccessProvider/permissions'; import { createEmptyConstraint } from 'component/feature/FeatureStrategy/FeatureStrategyConstraints2/createEmptyConstraint'; import { useWeakMap } from 'hooks/useWeakMap'; import { objectId } from 'utils/object-id'; import { useStyles } from 'component/feature/FeatureStrategy/FeatureStrategyConstraints2/FeatureStrategyConstraints2.styles'; interface IFeatureStrategyConstraints2Props { projectId: string; environmentId: string; strategy: Partial; setStrategy: React.Dispatch< React.SetStateAction> >; } // Extra form state for each constraint. interface IConstraintFormState { // Is the constraint currently being edited? editing?: boolean; // Is the constraint new (not yet saved)? unsaved?: boolean; } export const FeatureStrategyConstraints2 = ({ projectId, environmentId, strategy, setStrategy, }: IFeatureStrategyConstraints2Props) => { const state = useWeakMap(); const { context } = useUnleashContext(); const { constraints = [] } = strategy; const styles = useStyles(); const onEdit = (constraint: IConstraint) => { state.set(constraint, { editing: true }); }; const onAdd = () => { const constraint = createEmptyConstraint(context); state.set(constraint, { editing: true, unsaved: true }); setStrategy( produce(draft => { draft.constraints = draft.constraints ?? []; draft.constraints.push(constraint); }) ); }; const onCancel = (index: number) => { const constraint = constraints[index]; state.get(constraint)?.unsaved && onRemove(index); state.set(constraint, {}); }; const onRemove = (index: number) => { const constraint = constraints[index]; state.set(constraint, {}); setStrategy( produce(draft => { draft.constraints?.splice(index, 1); }) ); }; const onSave = (index: number, constraint: IConstraint) => { state.set(constraint, {}); setStrategy( produce(draft => { draft.constraints = draft.constraints ?? []; draft.constraints[index] = constraint; }) ); }; if (context.length === 0) { return null; } return (
Add constraint {strategy.constraints?.map((constraint, index) => ( ))}
); };