import { useState, useEffect } from 'react' import PropTypes from 'prop-types' import { useTranslation } from 'react-i18next' import { useShareProjectContext } from './share-project-modal' import TransferOwnershipModal from './transfer-ownership-modal' import { removeMemberFromProject, updateMember } from '../utils/api' import Icon from '../../../shared/components/icon' import { useProjectContext } from '../../../shared/context/project-context' import { sendMB } from '../../../infrastructure/event-tracking' import OLFormGroup from '@/features/ui/components/ol/ol-form-group' import OLCol from '@/features/ui/components/ol/ol-col' import OLFormSelect from '@/features/ui/components/ol/ol-form-select' import OLTooltip from '@/features/ui/components/ol/ol-tooltip' import OLButton from '@/features/ui/components/ol/ol-button' import MaterialIcon from '@/shared/components/material-icon' import BootstrapVersionSwitcher from '@/features/ui/components/bootstrap-5/bootstrap-version-switcher' import { bsVersion } from '@/features/utils/bootstrap-5' export default function EditMember({ member }) { const [privileges, setPrivileges] = useState(member.privileges) const [confirmingOwnershipTransfer, setConfirmingOwnershipTransfer] = useState(false) // update the local state if the member's privileges change externally useEffect(() => { setPrivileges(member.privileges) }, [member.privileges]) const { updateProject, monitorRequest } = useShareProjectContext() const { _id: projectId, members } = useProjectContext() function handleSubmit(event) { event.preventDefault() if (privileges === 'owner') { setConfirmingOwnershipTransfer(true) } else { monitorRequest(() => updateMember(projectId, member, { privilegeLevel: privileges, }) ).then(() => { updateProject({ members: members.map(item => item._id === member._id ? { ...item, privileges } : item ), }) }) } } if (confirmingOwnershipTransfer) { return ( setConfirmingOwnershipTransfer(false)} /> ) } return (
{member.email} setPrivileges(event.target.value)} /> {privileges === member.privileges ? ( ) : ( setPrivileges(member.privileges)} /> )}
) } EditMember.propTypes = { member: PropTypes.shape({ _id: PropTypes.string.isRequired, email: PropTypes.string.isRequired, privileges: PropTypes.string.isRequired, }), } function SelectPrivilege({ value, handleChange }) { const { t } = useTranslation() return ( ) } SelectPrivilege.propTypes = { value: PropTypes.string.isRequired, handleChange: PropTypes.func.isRequired, } function RemoveMemberAction({ member }) { const { t } = useTranslation() const { updateProject, monitorRequest } = useShareProjectContext() const { _id: projectId, members, invites } = useProjectContext() function handleClick(event) { event.preventDefault() monitorRequest(() => removeMemberFromProject(projectId, member)).then( () => { const updatedMembers = members.filter(existing => existing !== member) updateProject({ members: updatedMembers, }) sendMB('collaborator-removed', { project_id: projectId, current_collaborators_amount: updatedMembers.length, current_invites_amount: invites.length, }) } ) } return (
} bs5={} />
) } RemoveMemberAction.propTypes = { member: PropTypes.shape({ _id: PropTypes.string.isRequired, email: PropTypes.string.isRequired, privileges: PropTypes.string.isRequired, }), } function ChangePrivilegesActions({ handleReset }) { const { t } = useTranslation() return (
{t('change_or_cancel-change')}
{t('change_or_cancel-or')}   {t('change_or_cancel-cancel')}
) } ChangePrivilegesActions.propTypes = { handleReset: PropTypes.func.isRequired, }