TorbatYar/frontend/modules/workspace/hooks/useTenantMembers.ts
Mortezakoohjani a483b47369 feat(workspace): complete production workspace and content operations
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-12 11:54:17 +03:30

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,
});
}