import useRoute from '@/Hooks/useRoute'; import useTypedPage from '@/Hooks/useTypedPage'; import ActionMessage from '@/Components/ActionMessage'; import ActionSection from '@/Components/ActionSection'; import ConfirmationModal from '@/Components/ConfirmationModal'; import DangerButton from '@/Components/DangerButton'; import DialogModal from '@/Components/DialogModal'; import FormSection from '@/Components/FormSection'; import InputError from '@/Components/InputError'; import InputLabel from '@/Components/InputLabel'; import PrimaryButton from '@/Components/PrimaryButton'; import TextInput from '@/Components/TextInput'; import SecondaryButton from '@/Components/SecondaryButton'; import SectionBorder from '@/Components/SectionBorder'; import { JetstreamTeamPermissions, Nullable, Role, Team, TeamInvitation, User, } from '@/types'; import { router } from '@inertiajs/core'; import { useForm } from '@inertiajs/react'; import classNames from 'classnames'; import React, { useState } from 'react'; interface UserMembership extends User { membership: { role: string; }; } interface Props { team: Team & { team_invitations: TeamInvitation[]; users: UserMembership[]; }; availableRoles: Role[]; userPermissions: JetstreamTeamPermissions; } export default function TeamMemberManager({ team, availableRoles, userPermissions, }: Props) { const route = useRoute(); const addTeamMemberForm = useForm({ email: '', role: null as Nullable, }); const updateRoleForm = useForm({ role: null as Nullable, }); const leaveTeamForm = useForm({}); const removeTeamMemberForm = useForm({}); const [currentlyManagingRole, setCurrentlyManagingRole] = useState(false); const [managingRoleFor, setManagingRoleFor] = useState>(null); const [confirmingLeavingTeam, setConfirmingLeavingTeam] = useState(false); const [teamMemberBeingRemoved, setTeamMemberBeingRemoved] = useState>(null); const page = useTypedPage(); function addTeamMember() { addTeamMemberForm.post(route('team-members.store', [team]), { errorBag: 'addTeamMember', preserveScroll: true, onSuccess: () => addTeamMemberForm.reset(), }); } function cancelTeamInvitation(invitation: TeamInvitation) { router.delete(route('team-invitations.destroy', [invitation]), { preserveScroll: true, }); } function manageRole(teamMember: UserMembership) { setManagingRoleFor(teamMember); updateRoleForm.setData('role', teamMember.membership.role); setCurrentlyManagingRole(true); } function updateRole() { if (!managingRoleFor) { return; } updateRoleForm.put(route('team-members.update', [team, managingRoleFor]), { preserveScroll: true, onSuccess: () => setCurrentlyManagingRole(false), }); } function confirmLeavingTeam() { setConfirmingLeavingTeam(true); } function leaveTeam() { leaveTeamForm.delete( route('team-members.destroy', [team, page.props.auth.user!]), ); } function confirmTeamMemberRemoval(teamMember: User) { setTeamMemberBeingRemoved(teamMember); } function removeTeamMember() { if (!teamMemberBeingRemoved) { return; } removeTeamMemberForm.delete( route('team-members.destroy', [team, teamMemberBeingRemoved]), { errorBag: 'removeTeamMember', preserveScroll: true, preserveState: true, onSuccess: () => setTeamMemberBeingRemoved(null), }, ); } function displayableRole(role: string) { return availableRoles.find(r => r.key === role)?.name; } return (
{userPermissions.canAddTeamMembers ? (
{/* */} ( <> Added. Add )} >
Please provide the email address of the person you would like to add to this team.
{/* */}
addTeamMemberForm.setData('email', e.currentTarget.value) } />
{/* */} {availableRoles.length > 0 ? (
{availableRoles.map((role, i) => ( ))}
) : null}
) : null} {team.team_invitations.length > 0 && userPermissions.canAddTeamMembers ? (
{/* */}
{/* */}
{team.team_invitations.map(invitation => (
{invitation.email}
{/* */} {userPermissions.canRemoveTeamMembers ? ( ) : null}
))}
) : null} {team.users.length > 0 ? (
{/* */}
{/* */}
{team.users.map(user => (
{user.name}
{user.name}
{/* */} {userPermissions.canAddTeamMembers && availableRoles.length ? ( ) : availableRoles.length ? (
{displayableRole(user.membership.role)}
) : null} {/* */} {page.props.auth.user?.id === user.id ? ( ) : null} {/* */} {userPermissions.canRemoveTeamMembers ? ( ) : null}
))}
) : null} {/* */} setCurrentlyManagingRole(false)} > {managingRoleFor ? (
{availableRoles.map((role, i) => ( ))}
) : null} setCurrentlyManagingRole(false)}> Cancel Save
{/* */} setConfirmingLeavingTeam(false)} > Are you sure you would like to leave this team? setConfirmingLeavingTeam(false)}> Cancel Leave {/* */} setTeamMemberBeingRemoved(null)} > Are you sure you would like to remove this person from the team? setTeamMemberBeingRemoved(null)}> Cancel Remove
); }