Files
IdP/apps/frontend/lib/family-chat.ts
2026-06-25 23:48:57 +03:00

67 lines
2.2 KiB
TypeScript

import { ChatRoom, fetchChatRooms } from '@/lib/api';
const ACTIVE_ROOM_STORAGE_PREFIX = 'lendry-family-active-room:';
export function readStoredActiveRoomId(groupId: string) {
if (typeof window === 'undefined') return null;
return localStorage.getItem(`${ACTIVE_ROOM_STORAGE_PREFIX}${groupId}`);
}
export function storeActiveRoomId(groupId: string, roomId: string | null) {
if (typeof window === 'undefined') return;
const key = `${ACTIVE_ROOM_STORAGE_PREFIX}${groupId}`;
if (!roomId) {
localStorage.removeItem(key);
return;
}
localStorage.setItem(key, roomId);
}
export function findMemberRoom(
rooms: ChatRoom[],
memberUserId: string,
currentUserId: string,
options?: { isBot?: boolean; e2e?: boolean }
) {
const targetType = options?.isBot ? 'BOT' : options?.e2e ? 'E2E' : 'DIRECT';
return rooms.find(
(room) =>
room.type === targetType &&
room.members.some((member) => member.userId === memberUserId) &&
room.members.some((member) => member.userId === currentUserId)
);
}
export async function findOrCreateMemberChat(
groupId: string,
memberUserId: string,
_memberName: string,
currentUserId: string,
token: string
) {
const response = await fetchChatRooms(groupId, token);
const rooms = response.rooms ?? [];
const member = rooms.find(
(room) =>
(room.type === 'DIRECT' || room.type === 'BOT') &&
room.members.some((item) => item.userId === memberUserId) &&
room.members.some((item) => item.userId === currentUserId)
);
if (member) return member;
throw new Error('Чат ещё не создан. Обновите страницу семьи.');
}
export function roomDisplayLabel(room: ChatRoom, currentUserId: string) {
if (room.type === 'GENERAL') return room.name;
if (room.type === 'BOT') return room.name;
if (room.type === 'E2E') {
const other = room.members.find((member) => member.userId !== currentUserId);
return other ? `🔒 ${other.displayName}` : '🔒 Секретный чат';
}
if (room.type === 'DIRECT' || room.members.length === 2) {
const other = room.members.find((member) => member.userId !== currentUserId);
if (other) return other.displayName;
}
return room.name;
}