Files
twenty/packages/twenty-front/src/modules/settings/roles/role-assignment/components/SettingsRoleAssignmentConfirmationModalSubtitle.tsx
T
Raphaël Bosi 5f22908588 Decouple twenty-ui Avatar from app server-URL config (#21968)
Makes `twenty-ui`'s `Avatar` render the `avatarUrl` it receives instead
of building it from `window._env_`/`window.location` at module load, so
the library no longer depends on the app environment. URL resolution
moves to `twenty-front` via a `getAbsoluteImageUrl` helper applied at
the call sites.

Part of making twenty-ui a standalone library.
2026-06-22 18:38:00 +02:00

62 lines
2.3 KiB
TypeScript

import { currentWorkspaceMembersState } from '@/auth/states/currentWorkspaceMembersState';
import { SettingsCard } from '@/settings/components/SettingsCard';
import { type SettingsRoleAssignmentConfirmationModalSelectedRoleTarget } from '@/settings/roles/role-assignment/types/SettingsRoleAssignmentConfirmationModalSelectedRoleTarget';
import { styled } from '@linaria/react';
import { t } from '@lingui/core/macro';
import { Avatar } from 'twenty-ui/data-display';
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
import { themeCssVariables } from 'twenty-ui/theme-constants';
import { getAbsoluteImageUrl } from '~/utils/image/getAbsoluteImageUrl';
const StyledSettingsCardContainer = styled.div`
margin-top: ${themeCssVariables.spacing[6]};
`;
type SettingsRoleAssignmentConfirmationModalSubtitleProps = {
selectedRoleTarget: SettingsRoleAssignmentConfirmationModalSelectedRoleTarget;
onRoleClick: (roleId: string) => void;
};
export const SettingsRoleAssignmentConfirmationModalSubtitle = ({
selectedRoleTarget,
onRoleClick,
}: SettingsRoleAssignmentConfirmationModalSubtitleProps) => {
const currentWorkspaceMembers = useAtomStateValue(
currentWorkspaceMembersState,
);
const enrichedSelectedWorkspaceMember = currentWorkspaceMembers.find(
(member) => member.id === selectedRoleTarget.id,
);
const workspaceMemberName = enrichedSelectedWorkspaceMember
? `${enrichedSelectedWorkspaceMember?.name.firstName} ${enrichedSelectedWorkspaceMember?.name.lastName}`
: selectedRoleTarget.name;
return (
<>
{t`${workspaceMemberName} will be unassigned from the following role:`}
<StyledSettingsCardContainer>
<SettingsCard
title={selectedRoleTarget.role?.label || ''}
Icon={
<Avatar
avatarUrl={getAbsoluteImageUrl(
enrichedSelectedWorkspaceMember?.avatarUrl,
)}
placeholderColorSeed={enrichedSelectedWorkspaceMember?.id}
placeholder={workspaceMemberName}
size="md"
type="rounded"
/>
}
onClick={() =>
selectedRoleTarget.role && onRoleClick(selectedRoleTarget.role.id)
}
/>
</StyledSettingsCardContainer>
</>
);
};