mirror of
https://github.com/Unleash/unleash.git
synced 2025-04-19 01:17:18 +02:00
* feat: create segmentation structure and list * feat: remove unused deps and change route * feat: change header style and add renderNoSegments * fix: style table header * feat: create useSegments hook * feat: add segmentApi hook * feat: create segment * fix: errors * feat: add contextfields list * fix: remove user from create segment api * feat: add form structure * feat: add SegmentFormStepOne * fix: tests and routes * feat: add constraint view * feat: UI to match the sketch * feat: add constraint on context select * fix: duplication * fix adding constraints Co-authored-by: olav <mail@olav.io> * fix: input date not showing up in constraint view Co-authored-by: olav <mail@olav.io> * fix: minor bugs Co-authored-by: olav <mail@olav.io> * fix: create context modal in segment page Co-authored-by: olav <mail@olav.io> * fix: validate constraint before create segment Co-authored-by: olav <mail@olav.io> * feat: create useSegment hook Co-authored-by: olav <mail@olav.io> * feat: create edit component Co-authored-by: olav <mail@olav.io> * refactor: move constraint validation endpoint * refactor: add missing route snapshot * refactor: fix segment constraints unsaved/editing state * refactor: remove create segment from mobile header menu * refactor: update segments form description * refactor: extract SegmentFormStepList component * refactor: add an optional FormTemplate docs link label * refactor: fix update segment payload * feat: finish edit component Co-authored-by: olav <mail@olav.io> * refactor: move step list above segment form * fix: update PR based on feedback Co-authored-by: olav <mail@olav.io> * refactor: fix constraint validation endpoint path * refactor: improve constraint state field name * refactor: extract AutocompleteBox component * feat: add strategy segment selection * refactor: add strategy segment previews * refactor: fix double section separator line * feat: disable deleting a usable segment * refactor: warn about segments without constraints * refactor: update text in delete segment dialogue * refactur: improve arg names * refactor: improve index var name * refactor: clarify steps list logic * refactor: use a required prop for the segment name * refactor: use ConditionallyRender for segment deletion * refactor: fix segments refetch * refactor: improve CreateUnleashContext component names * refactor: adjust segment form styles * refactor: adjust text * refactor: fix info icon tooltip hover target * refactor: add missing aria attrs to preview button * refactor: add strat name to delete segment modal * refactor: fix segment chip text alighment * refactor: use bulk endpoint for strategy segments * refactor: fix imports after merge Co-authored-by: Fredrik Oseberg <fredrik.no@gmail.com> Co-authored-by: olav <mail@olav.io>
101 lines
3.6 KiB
TypeScript
101 lines
3.6 KiB
TypeScript
import { CreateButton } from 'component/common/CreateButton/CreateButton';
|
|
import FormTemplate from 'component/common/FormTemplate/FormTemplate';
|
|
import { CREATE_SEGMENT } from 'component/providers/AccessProvider/permissions';
|
|
import { useSegmentsApi } from 'hooks/api/actions/useSegmentsApi/useSegmentsApi';
|
|
import { useConstraintsValidation } from 'hooks/api/getters/useConstraintsValidation/useConstraintsValidation';
|
|
import { useSegments } from 'hooks/api/getters/useSegments/useSegments';
|
|
import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig';
|
|
import useToast from 'hooks/useToast';
|
|
import React from 'react';
|
|
import { useHistory } from 'react-router-dom';
|
|
import { formatUnknownError } from 'utils/formatUnknownError';
|
|
import { useSegmentForm } from '../hooks/useSegmentForm';
|
|
import { SegmentForm } from '../SegmentForm/SegmentForm';
|
|
|
|
export const CreateSegment = () => {
|
|
const { uiConfig } = useUiConfig();
|
|
const { setToastData, setToastApiError } = useToast();
|
|
const history = useHistory();
|
|
const { createSegment, loading } = useSegmentsApi();
|
|
const { refetchSegments } = useSegments();
|
|
|
|
const {
|
|
name,
|
|
setName,
|
|
description,
|
|
setDescription,
|
|
constraints,
|
|
setConstraints,
|
|
getSegmentPayload,
|
|
errors,
|
|
clearErrors,
|
|
} = useSegmentForm();
|
|
|
|
const hasValidConstraints = useConstraintsValidation(constraints);
|
|
|
|
const formatApiCode = () => {
|
|
return `curl --location --request POST '${
|
|
uiConfig.unleashUrl
|
|
}/api/admin/segments' \\
|
|
--header 'Authorization: INSERT_API_KEY' \\
|
|
--header 'Content-Type: application/json' \\
|
|
--data-raw '${JSON.stringify(getSegmentPayload(), undefined, 2)}'`;
|
|
};
|
|
|
|
const handleSubmit = async (e: React.FormEvent) => {
|
|
e.preventDefault();
|
|
clearErrors();
|
|
try {
|
|
await createSegment(getSegmentPayload());
|
|
await refetchSegments();
|
|
history.push('/segments/');
|
|
setToastData({
|
|
title: 'Segment created',
|
|
confetti: true,
|
|
type: 'success',
|
|
});
|
|
} catch (error: unknown) {
|
|
setToastApiError(formatUnknownError(error));
|
|
}
|
|
};
|
|
|
|
return (
|
|
<FormTemplate
|
|
loading={loading}
|
|
title="Create segment"
|
|
description={segmentsFormDescription}
|
|
documentationLink={segmentsFormDocsLink}
|
|
documentationLinkLabel="More about segments"
|
|
formatApiCode={formatApiCode}
|
|
>
|
|
<SegmentForm
|
|
handleSubmit={handleSubmit}
|
|
name={name}
|
|
setName={setName}
|
|
description={description}
|
|
setDescription={setDescription}
|
|
constraints={constraints}
|
|
setConstraints={setConstraints}
|
|
mode="Create"
|
|
errors={errors}
|
|
clearErrors={clearErrors}
|
|
>
|
|
<CreateButton
|
|
name="segment"
|
|
permission={CREATE_SEGMENT}
|
|
disabled={!hasValidConstraints}
|
|
/>
|
|
</SegmentForm>
|
|
</FormTemplate>
|
|
);
|
|
};
|
|
|
|
export const segmentsFormDescription = `
|
|
Segments make it easy for you to define which of your users should get access to a feature.
|
|
A segment is a reusable collection of constraints.
|
|
You can create and apply a segment when configuring activation strategies for a feature toggle or at any time from the segments page in the navigation menu.
|
|
`;
|
|
|
|
// TODO(olav): Update link when the segments docs are ready.
|
|
export const segmentsFormDocsLink = 'https://docs.getunleash.io';
|