51 lines
1.0 KiB
TypeScript
51 lines
1.0 KiB
TypeScript
/**
|
|
* Shared utilities for share modals across workshop types.
|
|
*/
|
|
|
|
import type { ShareRole } from '@prisma/client';
|
|
|
|
export interface ShareUser {
|
|
id: string;
|
|
name: string | null;
|
|
email: string;
|
|
}
|
|
|
|
export interface Share {
|
|
id: string;
|
|
role: ShareRole;
|
|
user: ShareUser;
|
|
createdAt?: Date;
|
|
}
|
|
|
|
export interface TeamMemberUser {
|
|
id: string;
|
|
email: string;
|
|
name: string | null;
|
|
}
|
|
|
|
export interface TeamWithMembers {
|
|
id: string;
|
|
name: string;
|
|
description: string | null;
|
|
userRole?: 'ADMIN' | 'MEMBER';
|
|
members?: { user: TeamMemberUser }[];
|
|
}
|
|
|
|
/**
|
|
* Flatten team members from all teams, dedupe by userId, exclude current user.
|
|
*/
|
|
export function getTeamMembersForShare(
|
|
userTeams: TeamWithMembers[],
|
|
currentUserId: string
|
|
): TeamMemberUser[] {
|
|
const seen = new Set<string>();
|
|
return userTeams
|
|
.flatMap((t) => t.members ?? [])
|
|
.map((m) => m.user)
|
|
.filter((u) => {
|
|
if (u.id === currentUserId || seen.has(u.id)) return false;
|
|
seen.add(u.id);
|
|
return true;
|
|
});
|
|
}
|