From 65bad13aaac22431720714d25936a21db2642a3d Mon Sep 17 00:00:00 2001 From: kyle-ssg Date: Wed, 19 Feb 2025 13:20:37 +0000 Subject: [PATCH] Identity traits --- frontend/common/services/useIdentityTrait.ts | 34 ++++++++++++++++++- frontend/web/components/IdentityTraits.tsx | 3 -- .../web/components/modals/CreateSegment.tsx | 28 ++++----------- .../web/components/modals/CreateTrait.tsx | 4 +-- frontend/web/components/pages/UserPage.tsx | 6 ++-- 5 files changed, 44 insertions(+), 31 deletions(-) diff --git a/frontend/common/services/useIdentityTrait.ts b/frontend/common/services/useIdentityTrait.ts index 3cd4854a8012..8ae8a00d1e1d 100644 --- a/frontend/common/services/useIdentityTrait.ts +++ b/frontend/common/services/useIdentityTrait.ts @@ -2,6 +2,9 @@ import { IdentityTrait, Res } from 'common/types/responses' import { Req } from 'common/types/requests' import { service } from 'common/service' import Utils from 'common/utils/utils' +import { getStore } from 'common/store' +import { identitySegmentService } from './useIdentitySegment' +import q from 'refractor/lang/q' function getTraitEndpoint( use_edge_identities: boolean, @@ -66,6 +69,12 @@ export const identityTraitService = service ), } }, + transformResponse: (res) => { + getStore().dispatch( + identitySegmentService.util.invalidateTags(['IdentitySegment']), + ) + return res + }, }), deleteIdentityTrait: builder.mutation< Res['identityTrait'], @@ -94,9 +103,16 @@ export const identityTraitService = service query.use_edge_identities, query.environmentId, query.identity, + query.data.id, ), } }, + transformResponse: (res) => { + getStore().dispatch( + identitySegmentService.util.invalidateTags(['IdentitySegment']), + ) + return res + }, }), getIdentityTraits: builder.query< Res['identityTraits'], @@ -110,6 +126,16 @@ export const identityTraitService = service query.identity, ), }), + transformResponse: (res) => { + // Core API returns paginated were as edge doesn't + if (res?.results) { + return res?.results.map((v) => ({ + ...v, + trait_value: Utils.featureStateToValue(v), + })) + } + return res + }, }), updateIdentityTrait: builder.mutation< Res['identityTrait'], @@ -126,7 +152,7 @@ export const identityTraitService = service query.identity, query.data, ), - method: query.use_edge_identities ? 'PUT' : 'POST', + method: 'PUT', url: getUpdateTraitEndpoint( query.use_edge_identities, query.environmentId, @@ -135,6 +161,12 @@ export const identityTraitService = service ), } }, + transformResponse: (res) => { + getStore().dispatch( + identitySegmentService.util.invalidateTags(['IdentitySegment']), + ) + return res + }, }), // END OF ENDPOINTS }), diff --git a/frontend/web/components/IdentityTraits.tsx b/frontend/web/components/IdentityTraits.tsx index 02b1eeb69fae..f4307cd931c8 100644 --- a/frontend/web/components/IdentityTraits.tsx +++ b/frontend/web/components/IdentityTraits.tsx @@ -9,7 +9,6 @@ import Panel from './base/grid/Panel' import { useHasPermission } from 'common/providers/Permission' import API from 'project/api' import CreateTraitModal from './modals/CreateTrait' -import AppActions from 'common/dispatcher/app-actions' import { useDeleteIdentityTraitMutation, useGetIdentityTraitsQuery, @@ -46,10 +45,8 @@ const IdentityTraits: FC = ({ const [deleteTrait, { isLoading: deletingTrait }] = useDeleteIdentityTraitMutation({}) - //todo : https://github.com/Flagsmith/flagsmith/pull/5121 migrates this const onTraitSaved = () => { closeModal?.() - AppActions.getIdentitySegments(projectId, identityId) } const createTrait = () => { diff --git a/frontend/web/components/modals/CreateSegment.tsx b/frontend/web/components/modals/CreateSegment.tsx index 280e7abacec7..80554ab736d4 100644 --- a/frontend/web/components/modals/CreateSegment.tsx +++ b/frontend/web/components/modals/CreateSegment.tsx @@ -108,6 +108,7 @@ const CreateSegment: FC = ({ project?: number } = { description: '', + metadata: [], name: '', rules: [ { @@ -157,9 +158,7 @@ const CreateSegment: FC = ({ const isSaving = creating || updating const [showDescriptions, setShowDescriptions] = useState(false) const [tab, setTab] = useState(UserTabs.RULES) - const [metadata, setMetadata] = useState( - segment.metadata, - ) + const [metadata, setMetadata] = useState(segment.metadata) const metadataEnable = Utils.getPlansPermission('METADATA') const error = createError || updateError const totalSegments = ProjectStore.getTotalSegments() ?? 0 @@ -240,13 +239,6 @@ const CreateSegment: FC = ({ } } - const fetchUserIdentityList = () => { - if (!environmentId) return - identities?.results.forEach((identity) => - AppActions.getIdentitySegments(projectId, identity.id), - ) - } - const [valueChanged, setValueChanged] = useState(false) const [metadataValueChanged, setMetadataValueChanged] = useState(false) const onClosing = useCallback(() => { @@ -288,7 +280,6 @@ const CreateSegment: FC = ({ if (createSuccess && createSegmentData) { setSegment(createSegmentData) onComplete?.(createSegmentData) - fetchUserIdentityList() } //eslint-disable-next-line }, [createSuccess]) @@ -296,7 +287,6 @@ const CreateSegment: FC = ({ if (updateSuccess && updateSegmentData) { setSegment(updateSegmentData) onComplete?.(updateSegmentData) - fetchUserIdentityList() } //eslint-disable-next-line }, [updateSuccess]) @@ -366,11 +356,7 @@ const CreateSegment: FC = ({ readOnly={readOnly} data-test={`rule-${displayIndex}`} rule={rule} - operators={operators} - onRemove={() => { - setValueChanged(true) - removeRule(0, i) - }} + operators={operators!} onChange={(v: SegmentRule) => { setValueChanged(true) updateRule(0, i, v) @@ -418,8 +404,8 @@ const CreateSegment: FC = ({ entityId={`${segment.id}` || ''} entityContentType={segmentContentType?.id} entity={segmentContentType?.model} - onChange={(m: CustomMetadataField[]) => { - setMetadata(m) + onChange={(m) => { + setMetadata(m as Metadata[]) if (isEdit) { setMetadataValueChanged(true) } @@ -488,7 +474,7 @@ const CreateSegment: FC = ({ environmentId={environmentId} setEnvironmentId={setEnvironmentId} identitiesLoading={identitiesLoading} - identities={identities} + identities={identities!} page={page} setPage={setPage} name={name} @@ -638,7 +624,7 @@ const LoadingCreateSegment: FC = (props) => { pageType: page.pageType, page_size: 10, pages: page.pages, - search, + q: search, }, { skip: !environmentId, diff --git a/frontend/web/components/modals/CreateTrait.tsx b/frontend/web/components/modals/CreateTrait.tsx index 406f3be30552..e1099c879e3e 100644 --- a/frontend/web/components/modals/CreateTrait.tsx +++ b/frontend/web/components/modals/CreateTrait.tsx @@ -24,7 +24,7 @@ import { import { FlagsmithValue } from 'common/types/responses' type CreateTraitProps = { - id?: number | string + id?: number trait_key?: string trait_value?: FlagsmithValue identityName: string @@ -83,7 +83,7 @@ const CreateTrait: FC = ({ const handleSave = () => { if (isEdit) { updateTrait({ - data: { id: identity, trait_key: traitKey, trait_value: traitValue }, + data: { id, trait_key: traitKey, trait_value: traitValue }, environmentId, identity, use_edge_identities, diff --git a/frontend/web/components/pages/UserPage.tsx b/frontend/web/components/pages/UserPage.tsx index 067482abf970..22655fb9bec8 100644 --- a/frontend/web/components/pages/UserPage.tsx +++ b/frontend/web/components/pages/UserPage.tsx @@ -928,7 +928,7 @@ const UserPage: FC = (props) => { environmentId={environmentId} projectId={projectId} identityId={id} - identityName={identity} + identityName={identity?.identity?.identifier || id} /> )}{' '} {!segments?.results ? ( @@ -1036,9 +1036,7 @@ const UserPage: FC = (props) => {