53 lines
1.9 KiB
TypeScript
53 lines
1.9 KiB
TypeScript
"use client";
|
|
|
|
import { useQuery } from "@tanstack/react-query";
|
|
import { getValidAccessToken } from "@/lib/auth";
|
|
import { identityApi } from "@/lib/identity";
|
|
import { useTenantId } from "@/hooks/useTenantId";
|
|
import { useMe } from "@/hooks/useMe";
|
|
|
|
export type TenantPerson = { id: string; label: string };
|
|
|
|
export function useTenantMembers() {
|
|
const { tenantId } = useTenantId();
|
|
const { me } = useMe();
|
|
|
|
return useQuery({
|
|
queryKey: ["workspace", tenantId, "identity-members"],
|
|
queryFn: async (): Promise<TenantPerson[]> => {
|
|
const token = await getValidAccessToken();
|
|
if (!token || !tenantId) throw new Error("برای انتخاب اعضا باید وارد شوید.");
|
|
let members: Awaited<ReturnType<typeof identityApi.listMembers>> = [];
|
|
try {
|
|
members = await identityApi.listMembers(token, tenantId);
|
|
} catch {
|
|
members = me?.user_id ? [{ id: me.user_id, tenant_id: tenantId, user_id: me.user_id, role: "tenant_member", is_active: true, joined_at: "" }] : [];
|
|
}
|
|
let users: Awaited<ReturnType<typeof identityApi.listUsers>> = [];
|
|
try {
|
|
users = await identityApi.listUsers(token, { limit: 100 });
|
|
} catch {
|
|
users = [];
|
|
}
|
|
const names = new Map(
|
|
users.map((user) => [
|
|
user.id,
|
|
user.display_name || user.username || user.email || user.mobile || "عضو سازمان",
|
|
])
|
|
);
|
|
const people = members
|
|
.filter((member) => member.is_active)
|
|
.map((member) => ({
|
|
id: member.user_id,
|
|
label: names.get(member.user_id) || "عضو سازمان",
|
|
}));
|
|
if (me?.user_id && !people.some((person) => person.id === me.user_id)) {
|
|
people.unshift({ id: me.user_id, label: "من" });
|
|
}
|
|
return people;
|
|
},
|
|
enabled: !!tenantId,
|
|
staleTime: 60_000,
|
|
});
|
|
}
|