diff --git a/frontend/web/components/modals/CreateSegment.tsx b/frontend/web/components/modals/CreateSegment.tsx index 1d87a4a29114..cc495da43c80 100644 --- a/frontend/web/components/modals/CreateSegment.tsx +++ b/frontend/web/components/modals/CreateSegment.tsx @@ -28,7 +28,7 @@ import { } from 'common/services/useSegment' import Utils from 'common/utils/utils' import AssociatedSegmentOverrides from 'components/segments/AssociatedSegmentOverrides' -import { SegmentMembershipTotalBadge } from 'components/segments/SegmentMembershipBadge' +import { SegmentMembershipTabCount } from 'components/segments/SegmentMembershipBadge' import Button from 'components/base/forms/Button' import InfoMessage from 'components/InfoMessage' import InputGroup from 'components/base/forms/InputGroup' @@ -588,10 +588,7 @@ const CreateSegment: FC = ({ tabLabel={ <> Identities - + } > diff --git a/frontend/web/components/modals/CreateSegmentUsersTabContent.tsx b/frontend/web/components/modals/CreateSegmentUsersTabContent.tsx index 1d665b780448..f808bdb7f30c 100644 --- a/frontend/web/components/modals/CreateSegmentUsersTabContent.tsx +++ b/frontend/web/components/modals/CreateSegmentUsersTabContent.tsx @@ -11,9 +11,9 @@ import { identitySegmentService, useGetIdentitySegmentsQuery, } from 'common/services/useIdentitySegment' +import { useGetEnvironmentsQuery } from 'common/services/useEnvironment' import { getStore } from 'common/store' -import ProjectStore from 'common/stores/project-store' -import { SegmentMembershipEnvBadge } from 'components/segments/SegmentMembershipBadge' +import { SegmentMembershipEnvCount } from 'components/segments/SegmentMembershipBadge' interface CreateSegmentUsersTabContentProps { projectId: string | number @@ -99,6 +99,10 @@ const CreateSegmentUsersTabContent: React.FC< setPage, setSearchInput, }) => { + const { data: envsData } = useGetEnvironmentsQuery({ + projectId: `${projectId}`, + }) + const membershipByEnvId = React.useMemo(() => { const map = new Map() ;(memberships ?? []).forEach((m) => map.set(m.environment, m)) @@ -111,12 +115,12 @@ const CreateSegmentUsersTabContent: React.FC< ? membershipByEnvId.get(environment.id) : undefined return ( - + {label} {environment && membership && ( - )} @@ -125,10 +129,9 @@ const CreateSegmentUsersTabContent: React.FC< const selectedMembership = React.useMemo(() => { if (!environmentId) return null - const envs = (ProjectStore.getEnvs() as Environment[] | null) || [] - const env = envs.find((e) => e.api_key === environmentId) + const env = envsData?.results.find((e) => e.api_key === environmentId) return env ? membershipByEnvId.get(env.id) ?? null : null - }, [environmentId, membershipByEnvId]) + }, [environmentId, envsData?.results, membershipByEnvId]) return ( <> diff --git a/frontend/web/components/segments/SegmentMembershipBadge.tsx b/frontend/web/components/segments/SegmentMembershipBadge.tsx index 53ab0e44150d..58832c3eb1a4 100644 --- a/frontend/web/components/segments/SegmentMembershipBadge.tsx +++ b/frontend/web/components/segments/SegmentMembershipBadge.tsx @@ -1,89 +1,65 @@ import React, { FC } from 'react' -import { Environment, SegmentMembership } from 'common/types/responses' -import ProjectStore from 'common/stores/project-store' +import { SegmentMembership } from 'common/types/responses' import UsersIcon from 'components/icons/UsersIcon' -const shortAgo = (iso: string): string => { - const diffSec = Math.max(0, Math.round((Date.now() - new Date(iso).getTime()) / 1000)) - if (diffSec < 60) return `${diffSec}s ago` - const diffMin = Math.round(diffSec / 60) - if (diffMin < 60) return `${diffMin}m ago` - const diffHr = Math.round(diffMin / 60) - if (diffHr < 24) return `${diffHr}h ago` - return `${Math.round(diffHr / 24)}d ago` -} +const sumCounts = (memberships: SegmentMembership[]): number => + memberships.reduce((sum, m) => sum + m.count, 0) + +const identityNoun = (count: number): string => + count === 1 ? 'identity' : 'identities' -type ChipProps = { - count: number - ago?: string - dataTest?: string - compact?: boolean +type TotalProps = { + memberships: SegmentMembership[] | undefined } -const Chip: FC = ({ ago, compact, count, dataTest }) => { - const noun = count === 1 ? 'identity' : 'identities' +export const SegmentMembershipTotalBadge: FC = ({ + memberships, +}) => { + if (!memberships?.length) { + return null + } + const total = sumCounts(memberships) return ( - {count} - {compact ? '' : ` ${noun}`} - {ago ? ` ~${ago}` : ''} + {total} {identityNoun(total)} ) } -type TotalProps = { - memberships: SegmentMembership[] | undefined - compact?: boolean -} - -export const SegmentMembershipTotalBadge: FC = ({ - compact, - memberships, -}) => { +export const SegmentMembershipTabCount: FC = ({ memberships }) => { if (!memberships?.length) { return null } - const total = memberships.reduce((sum, m) => sum + m.count, 0) - const latest = memberships.reduce( - (acc, m) => (!acc || m.last_synced_at > acc ? m.last_synced_at : acc), - '', - ) return ( - + + ({sumCounts(memberships)}) + ) } type EnvProps = { membership: SegmentMembership - environment?: Environment + envApiKey: string } -export const SegmentMembershipEnvBadge: FC = ({ - environment, +export const SegmentMembershipEnvCount: FC = ({ + envApiKey, membership, -}) => { - const envs = (ProjectStore.getEnvs() as Environment[] | null) || [] - const env = environment ?? envs.find((e) => e.id === membership.environment) - if (!env) { - return null - } - return ( - - ) -} +}) => ( + + {membership.count} {identityNoun(membership.count)} + +) diff --git a/frontend/web/styles/components/_chip.scss b/frontend/web/styles/components/_chip.scss index 0f3e07a99d85..0eac834f874f 100644 --- a/frontend/web/styles/components/_chip.scss +++ b/frontend/web/styles/components/_chip.scss @@ -27,7 +27,7 @@ .chip { display: flex; align-items: center; - align-self: flex-start; + align-self: flex-start !important; background-color: $primary-alfa-8; border: 1px solid $primary-alfa-24; padding: 5px 12px; @@ -38,6 +38,11 @@ font-weight: normal; text-wrap: nowrap; color: $primary600; + &--filled { + background-color: $primary; + border-color: $primary; + color: $white; + } &-secondary { background-color: $bg-light300; color: $text-icon-grey;