in apps/chat/src/components/Chat/Publish/PublicVersionSelector.tsx [35:190]
export function PublicVersionSelector({
publicVersionGroupId,
btnClassNames,
readonly,
groupVersions,
textBeforeSelector,
onChangeSelectedVersion,
selectedEntityId,
excludeEntityId,
}: Props) {
const { t } = useTranslation(Translation.Chat);
const [isVersionSelectOpen, setIsVersionSelectOpen] = useState(false);
const [selectedId, setSelectedId] = useState(selectedEntityId);
const versionGroup = useAppSelector((state) =>
PublicationSelectors.selectPublicVersionGroupById(
state,
publicVersionGroupId,
),
);
useEffect(() => {
setSelectedId(
selectedEntityId ??
(excludeEntityId !== versionGroup?.selectedVersion.id
? versionGroup?.selectedVersion.id
: undefined),
);
}, [excludeEntityId, selectedEntityId, versionGroup?.selectedVersion.id]);
const currentVersionGroup = useMemo(() => {
if (!versionGroup || (!selectedId && !excludeEntityId)) {
return versionGroup;
}
if (
selectedId &&
versionGroup.allVersions.some((ver) => ver.id === selectedId)
) {
return {
allVersions: excludeEntityId
? versionGroup.allVersions.filter((v) => v.id !== excludeEntityId)
: versionGroup.allVersions,
selectedVersion: versionGroup.allVersions.find(
(v) => v.id === selectedId,
)!,
};
}
if (
excludeEntityId &&
versionGroup.allVersions.some((ver) => ver.id === excludeEntityId)
) {
const selected = versionGroup.allVersions.find(
(v) => v.id !== excludeEntityId,
);
setSelectedId(selected?.id);
return {
allVersions: excludeEntityId
? versionGroup.allVersions.filter((v) => v.id !== excludeEntityId)
: versionGroup.allVersions,
selectedVersion: selected!,
};
}
return versionGroup;
}, [excludeEntityId, selectedId, versionGroup]);
const allVersions = useMemo(() => {
if (!currentVersionGroup?.allVersions) {
return [];
}
if (!groupVersions) {
return currentVersionGroup.allVersions;
}
return groupAllVersions(currentVersionGroup.allVersions);
}, [currentVersionGroup?.allVersions, groupVersions]);
if (!currentVersionGroup) {
return null;
}
return (
<Menu
onOpenChange={setIsVersionSelectOpen}
dropdownWidth={82}
className="flex shrink-0 items-center"
disabled={allVersions.length <= 1}
trigger={
<button
onClick={(e) => stopBubbling(e)}
disabled={allVersions.length <= 1}
className={classNames(
'flex gap-1 whitespace-nowrap text-sm',
allVersions.length <= 1 && 'cursor-default',
btnClassNames,
readonly && 'text-xs text-secondary',
)}
>
{textBeforeSelector ? textBeforeSelector : t('v. ')}
{currentVersionGroup.selectedVersion.version}
{allVersions.length > 1 && (
<IconChevronDown
className={classNames(
'shrink-0 transition-all',
isVersionSelectOpen && 'rotate-180',
readonly && 'text-secondary',
)}
size={readonly ? 16 : 18}
/>
)}
</button>
}
>
{allVersions.map(({ version, id }) => {
if (onChangeSelectedVersion && !readonly) {
return (
<MenuItem
disabled={currentVersionGroup.selectedVersion.version === version}
onClick={(e) => {
stopBubbling(e);
setIsVersionSelectOpen(false);
return onChangeSelectedVersion(
publicVersionGroupId,
{ version, id },
currentVersionGroup.selectedVersion,
);
}}
className={classNames(
'hover:bg-accent-primary-alpha',
currentVersionGroup.selectedVersion.version === version &&
'bg-accent-primary-alpha',
)}
item={<span>{version}</span>}
key={id}
/>
);
}
return (
<li
className={classNames(
'cursor-default list-none px-3 py-[6.5px] hover:bg-accent-primary-alpha',
currentVersionGroup.selectedVersion.version === version &&
'bg-accent-primary-alpha',
)}
key={id}
>
{version}
</li>
);
})}
</Menu>
);
}