import { MetaFunction, useNavigate, useParams } from "@remix-run/react"; import { useEffect, useState } from "react"; import { Trash2, UserPlus, Loader2 } from "lucide-react"; import HeaderWithSupport from "../components/HeaderWithSupport"; import AppInput from "../components/AppInput"; import { Button } from "../components/ui/button"; import { useStoreOwnership } from "../hooks/useStoreOwnership"; import { useStoreMembers, useInviteMember, useRemoveMember, } from "../requestHandler/use-seller-hooks"; import { useToast } from "../hooks/use-toast"; import UiProvider from "../components/UiProvider"; export default function StoreTeam() { const { storeId } = useParams(); const navigate = useNavigate(); const { toast } = useToast(); // Team management is owner-only. const { isLoading: isAccessLoading, role } = useStoreOwnership(storeId); useEffect(() => { if (!isAccessLoading && role && role !== "owner") { navigate(`/store/${storeId}`); } }, [isAccessLoading, role, storeId, navigate]); const { data: members, isLoading, isError, refetch, } = useStoreMembers(storeId); const inviteMember = useInviteMember(storeId); const removeMember = useRemoveMember(storeId); const [phone, setPhone] = useState(""); const handleInvite = () => { const trimmed = phone.trim(); if (!trimmed) return; inviteMember.mutate(trimmed, { onSuccess: () => { setPhone(""); toast({ title: "دعوت انجام شد", description: "عضو جدید به تیم فروشگاه اضافه شد.", }); }, onError: (e: unknown) => { toast({ title: "خطا", description: e instanceof Error ? e.message : "دعوت عضو ناموفق بود.", variant: "destructive", }); }, }); }; const handleRemove = (id: string) => { removeMember.mutate(id, { onSuccess: () => toast({ title: "حذف شد", description: "عضو از تیم حذف شد." }), onError: () => toast({ title: "خطا", description: "حذف عضو ناموفق بود.", variant: "destructive", }), }); }; return (
navigate(`/store/${storeId}/setting`)} />

مدیریت اعضای تیم

{/* Invite by phone */}

دعوت عضو جدید با شماره موبایل

setPhone(e.target.value)} onKeyDown={(e) => { if (e.key === "Enter") handleInvite(); }} />

عضو دعوت‌شده می‌تواند محصولات، سفارش‌ها و پیام‌های فروشگاه را مدیریت کند اما به بخش مالی، تنظیمات فروشگاه و مدیریت تیم دسترسی ندارد. اگر حساب کاربری با این شماره وجود نداشته باشد، دعوت تا اولین ورود او در حالت «در انتظار» می‌ماند.

{/* Members list */}

اعضای تیم

{members?.map((m) => (

{m.name || m.phone}

{m.phone}

{m.status === "pending" ? ( در انتظار ) : ( فعال )}
))}
); } export const meta: MetaFunction = () => [ { title: "مدیریت اعضای تیم - ویترون" }, { name: "robots", content: "noindex, nofollow" }, ];