42 lines
1.1 KiB
TypeScript
42 lines
1.1 KiB
TypeScript
|
|
import type { Member, Role } from "../domain/types";
|
|||
|
|
|
|||
|
|
type TFn = (key: string) => string;
|
|||
|
|
|
|||
|
|
/** 角色標籤(可接 i18n) */
|
|||
|
|
export function roleLabel(role: Role | string, t?: TFn): string {
|
|||
|
|
if (role === "admin") return t ? t("role.admin") : "管理員";
|
|||
|
|
if (role === "member") return t ? t("role.member") : "一般會員";
|
|||
|
|
return String(role);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 主要顯示角色:有 admin 就顯示管理員,否則一般會員。
|
|||
|
|
* 回傳列表供多角色展示。
|
|||
|
|
*/
|
|||
|
|
export function memberRoleSummary(
|
|||
|
|
member: Pick<Member, "roles"> | null | undefined,
|
|||
|
|
t?: TFn,
|
|||
|
|
): {
|
|||
|
|
primary: "admin" | "member";
|
|||
|
|
primaryLabel: string;
|
|||
|
|
labels: string[];
|
|||
|
|
isAdmin: boolean;
|
|||
|
|
} {
|
|||
|
|
const roles = member?.roles?.length ? member.roles : (["member"] as Role[]);
|
|||
|
|
const isAdmin = roles.includes("admin");
|
|||
|
|
const primary = isAdmin ? "admin" : "member";
|
|||
|
|
const labels = [...new Set(roles.map((r) => roleLabel(r, t)))];
|
|||
|
|
return {
|
|||
|
|
primary,
|
|||
|
|
primaryLabel: isAdmin
|
|||
|
|
? t
|
|||
|
|
? t("role.admin")
|
|||
|
|
: "管理員"
|
|||
|
|
: t
|
|||
|
|
? t("role.member")
|
|||
|
|
: "一般會員",
|
|||
|
|
labels,
|
|||
|
|
isAdmin,
|
|||
|
|
};
|
|||
|
|
}
|