client/packages/chat/src/components/media/mediaGroups.ts
Alois 6f4cc62530
Some checks failed
/ build-web (push) Successful in 8m40s
/ build-mobile (push) Failing after 11m17s
/ build-desktop (linux) (push) Successful in 14m8s
/ release (push) Has been skipped
feat(gif-picker): add gif groups
feat(gif-picker): increase default size
2026-08-11 13:01:09 +02:00

65 lines
1.5 KiB
TypeScript

import type { ChatPickerMediaGroup } from "@tensamin/shared/data";
function withoutMedia(
groups: ChatPickerMediaGroup[],
url: string,
keepGroupId?: string,
) {
return groups
.map((group) => ({
...group,
media: group.media.filter((item) => item !== url),
}))
.filter((group) => group.id === keepGroupId || group.media.length > 0);
}
export function assignMediaToGroup(
groups: ChatPickerMediaGroup[],
groupId: string | null,
url: string,
) {
const nextGroups = withoutMedia(groups, url, groupId ?? undefined);
if (groupId === null) return nextGroups;
return nextGroups.map((group) =>
group.id === groupId ? { ...group, media: [url, ...group.media] } : group,
);
}
export function createMediaGroup(
groups: ChatPickerMediaGroup[],
id: string,
name: string,
url: string,
) {
const trimmedName = name.trim();
if (
!trimmedName ||
groups.some(
(group) =>
group.name.toLocaleLowerCase() === trimmedName.toLocaleLowerCase(),
)
) {
return groups;
}
return [
...withoutMedia(groups, url),
{ id, name: trimmedName, media: [url] },
];
}
export function getMediaGroupId(groups: ChatPickerMediaGroup[], url: string) {
return groups.find((group) => group.media.includes(url))?.id ?? null;
}
export function getUngroupedMedia(
savedMedia: string[],
groups: ChatPickerMediaGroup[],
) {
const groupedMedia = new Set(groups.flatMap((group) => group.media));
return savedMedia.filter((url) => !groupedMedia.has(url));
}