c596a5e342
## Description Promotes the next-gen UI library (formerly `twenty-new-ui`) to the name **`twenty-ui`** (v0.1.0, publishable) and renames the old package to **`twenty-ui-deprecated`**. Rewrites ~1,730 `twenty-ui` imports → `twenty-ui-deprecated`, updates all configs/CI/Docker/deps, and migrates twenty-front's `Toggle` to the new package (first consumer) as a drop-in. ## Next steps - Wire the `ui/v*` publish dispatch (`cd-deploy-tag.yaml` + `.yarnrc.yml`), then tag `ui/v0.1.0` to publish. - Continue migrating components from `twenty-ui-deprecated` → `twenty-ui`.
72 lines
1.9 KiB
TypeScript
72 lines
1.9 KiB
TypeScript
import React, { useMemo } from 'react';
|
|
|
|
import { getFieldLinkDefinedLinks } from '@/object-record/record-field/ui/meta-types/input/utils/getFieldLinkDefinedLinks';
|
|
import { type FieldLinksValue } from '@/object-record/record-field/ui/types/FieldMetadata';
|
|
import { ExpandableList } from '@/ui/layout/expandable-list/components/ExpandableList';
|
|
import {
|
|
getAbsoluteUrlOrThrow,
|
|
getUrlHostnameOrThrow,
|
|
isDefined,
|
|
} from 'twenty-shared/utils';
|
|
import {
|
|
LinkType,
|
|
RoundedLink,
|
|
SocialLink,
|
|
} from 'twenty-ui-deprecated/navigation';
|
|
import { checkUrlType } from '~/utils/checkUrlType';
|
|
|
|
type LinksDisplayProps = {
|
|
value?: FieldLinksValue;
|
|
onLinkClick?: (url: string, event: React.MouseEvent<HTMLElement>) => void;
|
|
};
|
|
|
|
export const LinksDisplay = ({ value, onLinkClick }: LinksDisplayProps) => {
|
|
const links = useMemo(() => {
|
|
if (!isDefined(value)) {
|
|
return [];
|
|
}
|
|
|
|
return getFieldLinkDefinedLinks(value).map(({ url, label }) => {
|
|
let absoluteUrl = '';
|
|
let hostname = '';
|
|
try {
|
|
absoluteUrl = getAbsoluteUrlOrThrow(url);
|
|
hostname = getUrlHostnameOrThrow(absoluteUrl);
|
|
} catch {
|
|
absoluteUrl = '';
|
|
hostname = '';
|
|
}
|
|
return {
|
|
url: absoluteUrl,
|
|
label: label || hostname,
|
|
type: checkUrlType(absoluteUrl),
|
|
};
|
|
});
|
|
}, [value]);
|
|
|
|
return (
|
|
<ExpandableList>
|
|
{links.map(({ url, label, type }, index) =>
|
|
type === LinkType.LinkedIn ||
|
|
type === LinkType.Twitter ||
|
|
type === LinkType.Facebook ? (
|
|
<SocialLink
|
|
key={index}
|
|
href={url}
|
|
type={type}
|
|
label={label}
|
|
onClick={(event) => onLinkClick?.(url, event)}
|
|
/>
|
|
) : (
|
|
<RoundedLink
|
|
key={index}
|
|
href={url}
|
|
label={label}
|
|
onClick={(event) => onLinkClick?.(url, event)}
|
|
/>
|
|
),
|
|
)}
|
|
</ExpandableList>
|
|
);
|
|
};
|