Feature: invite/disinvite from profile viewer
Signed-off-by: Ajay Bura <ajbura@gmail.com>
This commit is contained in:
parent
e25dc46863
commit
8711658e75
2 changed files with 50 additions and 10 deletions
|
@ -78,19 +78,27 @@ SessionInfo.propTypes = {
|
||||||
userId: PropTypes.string.isRequired,
|
userId: PropTypes.string.isRequired,
|
||||||
};
|
};
|
||||||
|
|
||||||
function ProfileFooter({ userId, onRequestClose }) {
|
function ProfileFooter({ roomId, userId, onRequestClose }) {
|
||||||
const [isCreatingDM, setIsCreatingDM] = useState(false);
|
const [isCreatingDM, setIsCreatingDM] = useState(false);
|
||||||
const [isIgnoring, setIsIgnoring] = useState(false);
|
const [isIgnoring, setIsIgnoring] = useState(false);
|
||||||
const [isUserIgnored, setIsUserIgnored] = useState(initMatrix.matrixClient.isUserIgnored(userId));
|
const [isUserIgnored, setIsUserIgnored] = useState(initMatrix.matrixClient.isUserIgnored(userId));
|
||||||
|
|
||||||
const mx = initMatrix.matrixClient;
|
|
||||||
const isMountedRef = useRef(true);
|
const isMountedRef = useRef(true);
|
||||||
|
const mx = initMatrix.matrixClient;
|
||||||
|
const room = mx.getRoom(roomId);
|
||||||
|
const member = room.getMember(userId);
|
||||||
|
const isInvitable = member?.membership !== 'join' && member?.membership !== 'ban';
|
||||||
|
|
||||||
|
const [isInviting, setIsInviting] = useState(false);
|
||||||
|
const [isInvited, setIsInvited] = useState(member?.membership === 'invite');
|
||||||
|
|
||||||
useEffect(() => () => {
|
useEffect(() => () => {
|
||||||
isMountedRef.current = false;
|
isMountedRef.current = false;
|
||||||
}, []);
|
}, []);
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
setIsUserIgnored(initMatrix.matrixClient.isUserIgnored(userId));
|
setIsUserIgnored(initMatrix.matrixClient.isUserIgnored(userId));
|
||||||
|
setIsIgnoring(false);
|
||||||
|
setIsInviting(false);
|
||||||
}, [userId]);
|
}, [userId]);
|
||||||
|
|
||||||
async function openDM() {
|
async function openDM() {
|
||||||
|
@ -144,6 +152,24 @@ function ProfileFooter({ userId, onRequestClose }) {
|
||||||
setIsIgnoring(false);
|
setIsIgnoring(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function toggleInvite() {
|
||||||
|
try {
|
||||||
|
setIsInviting(true);
|
||||||
|
let isInviteSent = false;
|
||||||
|
if (isInvited) await roomActions.kick(roomId, userId);
|
||||||
|
else {
|
||||||
|
await roomActions.invite(roomId, userId);
|
||||||
|
isInviteSent = true;
|
||||||
|
}
|
||||||
|
if (isMountedRef.current === false) return;
|
||||||
|
setIsInvited(isInviteSent);
|
||||||
|
setIsInviting(false);
|
||||||
|
} catch {
|
||||||
|
setIsInviting(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="profile-viewer__buttons">
|
<div className="profile-viewer__buttons">
|
||||||
<Button
|
<Button
|
||||||
|
@ -153,7 +179,16 @@ function ProfileFooter({ userId, onRequestClose }) {
|
||||||
>
|
>
|
||||||
{isCreatingDM ? 'Creating room...' : 'Message'}
|
{isCreatingDM ? 'Creating room...' : 'Message'}
|
||||||
</Button>
|
</Button>
|
||||||
<Button>Mention</Button>
|
{ member?.membership === 'join' && <Button>Mention</Button>}
|
||||||
|
{room.canInvite(mx.getUserId()) && isInvitable && (
|
||||||
|
<Button onClick={toggleInvite}>
|
||||||
|
{
|
||||||
|
isInvited
|
||||||
|
? `${isInviting ? 'Disinviting...' : 'Disinvite'}`
|
||||||
|
: `${isInviting ? 'Inviting...' : 'Invite'}`
|
||||||
|
}
|
||||||
|
</Button>
|
||||||
|
)}
|
||||||
<Button
|
<Button
|
||||||
variant={isUserIgnored ? 'positive' : 'danger'}
|
variant={isUserIgnored ? 'positive' : 'danger'}
|
||||||
onClick={toggleIgnore}
|
onClick={toggleIgnore}
|
||||||
|
@ -169,6 +204,7 @@ function ProfileFooter({ userId, onRequestClose }) {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
ProfileFooter.propTypes = {
|
ProfileFooter.propTypes = {
|
||||||
|
roomId: PropTypes.string.isRequired,
|
||||||
userId: PropTypes.string.isRequired,
|
userId: PropTypes.string.isRequired,
|
||||||
onRequestClose: PropTypes.func.isRequired,
|
onRequestClose: PropTypes.func.isRequired,
|
||||||
};
|
};
|
||||||
|
@ -231,6 +267,7 @@ function ProfileViewer() {
|
||||||
<SessionInfo userId={userId} />
|
<SessionInfo userId={userId} />
|
||||||
{ userId !== mx.getUserId() && (
|
{ userId !== mx.getUserId() && (
|
||||||
<ProfileFooter
|
<ProfileFooter
|
||||||
|
roomId={roomId}
|
||||||
userId={userId}
|
userId={userId}
|
||||||
onRequestClose={() => setIsOpen(false)}
|
onRequestClose={() => setIsOpen(false)}
|
||||||
/>
|
/>
|
||||||
|
|
|
@ -188,12 +188,15 @@ async function create(opts) {
|
||||||
async function invite(roomId, userId) {
|
async function invite(roomId, userId) {
|
||||||
const mx = initMatrix.matrixClient;
|
const mx = initMatrix.matrixClient;
|
||||||
|
|
||||||
try {
|
|
||||||
const result = await mx.invite(roomId, userId);
|
const result = await mx.invite(roomId, userId);
|
||||||
return result;
|
return result;
|
||||||
} catch (e) {
|
}
|
||||||
throw new Error(e);
|
|
||||||
}
|
async function kick(roomId, userId) {
|
||||||
|
const mx = initMatrix.matrixClient;
|
||||||
|
|
||||||
|
const result = await mx.kick(roomId, userId);
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
function createSpaceShortcut(roomId) {
|
function createSpaceShortcut(roomId) {
|
||||||
|
@ -212,6 +215,6 @@ function deleteSpaceShortcut(roomId) {
|
||||||
|
|
||||||
export {
|
export {
|
||||||
join, leave,
|
join, leave,
|
||||||
create, invite,
|
create, invite, kick,
|
||||||
createSpaceShortcut, deleteSpaceShortcut,
|
createSpaceShortcut, deleteSpaceShortcut,
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue