2020-03-27 22:32:33 +00:00
|
|
|
import React, { useState } from 'react';
|
|
|
|
import { Subuser } from '@/state/server/subusers';
|
|
|
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
|
|
import { faPencilAlt } from '@fortawesome/free-solid-svg-icons/faPencilAlt';
|
|
|
|
import RemoveSubuserButton from '@/components/server/users/RemoveSubuserButton';
|
2020-03-27 22:40:24 +00:00
|
|
|
import EditSubuserModal from '@/components/server/users/EditSubuserModal';
|
2020-03-27 23:42:27 +00:00
|
|
|
import { faUnlockAlt } from '@fortawesome/free-solid-svg-icons/faUnlockAlt';
|
|
|
|
import { faUserLock } from '@fortawesome/free-solid-svg-icons/faUserLock';
|
|
|
|
import classNames from 'classnames';
|
2020-03-29 21:19:17 +00:00
|
|
|
import Can from '@/components/elements/Can';
|
2020-04-19 18:58:26 +00:00
|
|
|
import { useStoreState } from 'easy-peasy';
|
2020-07-04 23:26:07 +00:00
|
|
|
import tw from 'twin.macro';
|
|
|
|
import GreyRowBox from '@/components/elements/GreyRowBox';
|
2020-03-27 22:32:33 +00:00
|
|
|
|
|
|
|
interface Props {
|
|
|
|
subuser: Subuser;
|
|
|
|
}
|
|
|
|
|
|
|
|
export default ({ subuser }: Props) => {
|
2020-04-19 18:58:26 +00:00
|
|
|
const uuid = useStoreState(state => state.user!.data!.uuid);
|
2020-03-27 22:40:24 +00:00
|
|
|
const [ visible, setVisible ] = useState(false);
|
2020-03-27 22:32:33 +00:00
|
|
|
|
|
|
|
return (
|
2020-07-04 23:26:07 +00:00
|
|
|
<GreyRowBox css={tw`mb-2`}>
|
2020-03-27 22:40:24 +00:00
|
|
|
{visible &&
|
|
|
|
<EditSubuserModal
|
2020-07-04 23:26:07 +00:00
|
|
|
appear
|
|
|
|
visible
|
2020-03-27 22:40:24 +00:00
|
|
|
subuser={subuser}
|
|
|
|
onDismissed={() => setVisible(false)}
|
|
|
|
/>
|
|
|
|
}
|
2020-07-04 23:26:07 +00:00
|
|
|
<div css={tw`w-10 h-10 rounded-full bg-white border-2 border-neutral-800 overflow-hidden`}>
|
|
|
|
<img css={tw`w-full h-full`} src={`${subuser.image}?s=400`}/>
|
2020-03-27 22:32:33 +00:00
|
|
|
</div>
|
2020-07-04 23:26:07 +00:00
|
|
|
<div css={tw`ml-4 flex-1`}>
|
|
|
|
<p css={tw`text-sm`}>{subuser.email}</p>
|
2020-03-27 22:32:33 +00:00
|
|
|
</div>
|
2020-07-04 23:26:07 +00:00
|
|
|
<div css={tw`ml-4`}>
|
|
|
|
<p css={tw`font-medium text-center`}>
|
2020-03-27 23:42:27 +00:00
|
|
|
|
|
|
|
<FontAwesomeIcon
|
|
|
|
icon={subuser.twoFactorEnabled ? faUserLock : faUnlockAlt}
|
|
|
|
className={classNames('fa-fw', {
|
|
|
|
'text-red-400': !subuser.twoFactorEnabled,
|
|
|
|
})}
|
|
|
|
/>
|
|
|
|
|
|
|
|
</p>
|
2020-07-04 23:26:07 +00:00
|
|
|
<p css={tw`text-2xs text-neutral-500 uppercase`}>2FA Enabled</p>
|
2020-03-27 23:42:27 +00:00
|
|
|
</div>
|
2020-07-04 23:26:07 +00:00
|
|
|
<div css={tw`ml-4`}>
|
|
|
|
<p css={tw`font-medium text-center`}>
|
2020-04-17 17:21:15 +00:00
|
|
|
{subuser.permissions.filter(permission => permission !== 'websocket.connect').length}
|
2020-03-27 23:42:27 +00:00
|
|
|
</p>
|
2020-07-04 23:26:07 +00:00
|
|
|
<p css={tw`text-2xs text-neutral-500 uppercase`}>Permissions</p>
|
2020-03-27 23:42:27 +00:00
|
|
|
</div>
|
2020-03-27 22:32:33 +00:00
|
|
|
<button
|
|
|
|
type={'button'}
|
|
|
|
aria-label={'Edit subuser'}
|
2020-04-19 18:58:26 +00:00
|
|
|
className={classNames('block text-sm p-2 text-neutral-500 hover:text-neutral-100 transition-colors duration-150 mx-4', {
|
|
|
|
hidden: subuser.uuid === uuid,
|
|
|
|
})}
|
2020-03-27 22:40:24 +00:00
|
|
|
onClick={() => setVisible(true)}
|
2020-03-27 22:32:33 +00:00
|
|
|
>
|
|
|
|
<FontAwesomeIcon icon={faPencilAlt}/>
|
|
|
|
</button>
|
2020-03-29 21:19:17 +00:00
|
|
|
<Can action={'user.delete'}>
|
|
|
|
<RemoveSubuserButton subuser={subuser}/>
|
|
|
|
</Can>
|
2020-07-04 23:26:07 +00:00
|
|
|
</GreyRowBox>
|
2020-03-27 22:32:33 +00:00
|
|
|
);
|
|
|
|
};
|