sendou.ink/app/features/team/team-utils.ts
Kalle 8f156fb917
Team editors in addition to the owner (#2077)
* Initial

* Handle owner leaving

* Remove old team queries

* Progress

* Retire old toggle

* e2e tests

* Divide loaders/actions of team pages
2025-02-04 10:56:33 +02:00

75 lines
1.6 KiB
TypeScript

import type * as TeamRepository from "./TeamRepository.server";
import { TEAM } from "./team-constants";
export function isTeamOwner({
team,
user,
}: {
team: TeamRepository.findByCustomUrl;
user?: { id: number };
}) {
if (!user) return false;
return team.members.some((member) => member.isOwner && member.id === user.id);
}
export function isTeamManager({
team,
user,
}: {
team: TeamRepository.findByCustomUrl;
user?: { id: number };
}) {
if (!user) return false;
return team.members.some(
(member) => (member.isManager || member.isOwner) && member.id === user.id,
);
}
export function isTeamMember({
team,
user,
}: {
team: TeamRepository.findByCustomUrl;
user?: { id: number };
}) {
if (!user) return false;
return team.members.some((member) => member.id === user.id);
}
export function isTeamFull(team: TeamRepository.findByCustomUrl) {
return team.members.length >= TEAM.MAX_MEMBER_COUNT;
}
export function canAddCustomizedColors(team: {
members: { patronTier: number | null }[];
}) {
return team.members.some(
(member) => member.patronTier && member.patronTier >= 2,
);
}
/** Returns the user who will become the new owner after old one leaves */
export function resolveNewOwner(
members: Array<{
id: number;
username: string;
isOwner: number;
isManager: number;
}>,
) {
const managers = members.filter((m) => m.isManager && !m.isOwner);
if (managers.length > 0) {
return managers.sort((a, b) => a.id - b.id)[0];
}
const regularMembers = members.filter((m) => !m.isOwner);
if (regularMembers.length > 0) {
return regularMembers.sort((a, b) => a.id - b.id)[0];
}
return null;
}