"use client"; import type { GroupSettingsViewModelState } from "@/features/groups/components/use-group-settings-view-model"; import ToggleButtonGroup from "@/shared/components/forms/toggle-button-group"; type GroupSettingsJoinInvitesCardProps = { vm: GroupSettingsViewModelState; }; export default function GroupSettingsJoinInvitesCard({ vm }: GroupSettingsJoinInvitesCardProps) { if (!vm.isAdmin) return null; return (
Join and Invites
Join policy
Join Requests ({vm.requests.length})
{!vm.requests.length ? (
No pending requests.
) : (
{vm.requests.map(request => (
{request.displayName || request.email}
{request.email}
))}
)}
Invite links
{!vm.links.length ? (
No invite links yet.
) : (
{vm.links.map(link => (
Token: {link.token.slice(0, 6)}...{link.token.slice(-4)}
{(() => { const showRevive = link.revokedAt || vm.isInviteExpired(link.expiresAt) || (link.singleUse && link.usedAt); const showRevoke = !showRevive && !link.revokedAt && !(link.singleUse && link.usedAt) && !vm.isInviteExpired(link.expiresAt); const options = [ { value: "COPY", label: "Copy link", className: "btn-outline-accent", disabled: vm.localJoinPolicy === "NOT_ACCEPTING", onClick: () => vm.handleCopyInvite(link.token) }, ...(showRevive ? [{ value: "REVIVE", label: "Revive", className: "btn-outline-accent", disabled: vm.localJoinPolicy === "NOT_ACCEPTING", onClick: () => vm.reviveInvite(link.id, vm.inviteTtlDays) }] : showRevoke ? [{ value: "REVOKE", label: "Revoke", className: "border border-red-400/60 bg-red-500/10 text-red-200", onClick: () => vm.revokeInvite(link.id) }] : []), { value: "DELETE", label: "Delete", className: "border border-red-400/60 bg-red-500/10 text-red-200", onClick: () => vm.setConfirmDeleteInvite({ id: link.id, token: link.token }) } ]; return ( ); })()}
Expires {vm.formatInviteExpiry(link.expiresAt)} Uses: {link.singleUse ? "1 use" : "Unlimited"} Status: {link.revokedAt ? "Revoked" : link.singleUse && link.usedAt ? "Used" : vm.isInviteExpired(link.expiresAt) ? "Expired" : "Active"}
))}
)}
); }