import { Box, Button, color, config, Icon, Icons, Spinner, Text, Input } from 'folds';
import React, { useCallback, useRef } from 'react';
import { useRoom } from '../../hooks/useRoom';
import { CutoutCard } from '../cutout-card';
import { SettingTile } from '../setting-tile';
import { AsyncStatus, useAsyncCallback } from '../../hooks/useAsyncCallback';
import { useMatrixClient } from '../../hooks/useMatrixClient';
import { BreakWord } from '../../styles/Text.css';
import { useTimestampFormatter } from '../../hooks/useTimestampFormatter';
type UserKickAlertProps = {
reason?: string;
kickedBy?: string;
ts?: number;
};
export function UserKickAlert({ reason, kickedBy, ts }: UserKickAlertProps) {
const { format } = useTimestampFormatter();
const when = ts ? format(ts) : undefined;
return (
Kicked User
{when && {when}}
{kickedBy && (
Kicked by: {kickedBy}
)}
{reason ? (
<>
Reason: {reason}
>
) : (
No Reason Provided.
)}
);
}
type UserBanAlertProps = {
userId: string;
reason?: string;
canUnban?: boolean;
bannedBy?: string;
ts?: number;
};
export function UserBanAlert({ userId, reason, canUnban, bannedBy, ts }: UserBanAlertProps) {
const mx = useMatrixClient();
const room = useRoom();
const { format } = useTimestampFormatter();
const when = ts ? format(ts) : undefined;
const [unbanState, unban] = useAsyncCallback(
useCallback(async () => {
await mx.unban(room.roomId, userId);
}, [mx, room, userId]),
);
const banning = unbanState.status === AsyncStatus.Loading;
const error = unbanState.status === AsyncStatus.Error;
return (
Banned User
{when && {when}}
{bannedBy && (
Banned by: {bannedBy}
)}
{reason ? (
<>
Reason: {reason}
>
) : (
No Reason Provided.
)}
{error && (
{unbanState.error.message}
)}
{canUnban && (
}
disabled={banning}
>
Unban
)}
);
}
type UserInviteAlertProps = {
userId: string;
reason?: string;
canKick?: boolean;
invitedBy?: string;
ts?: number;
};
export function UserInviteAlert({ userId, reason, canKick, invitedBy, ts }: UserInviteAlertProps) {
const mx = useMatrixClient();
const room = useRoom();
const { format } = useTimestampFormatter();
const when = ts ? format(ts) : undefined;
const [kickState, kick] = useAsyncCallback(
useCallback(async () => {
await mx.kick(room.roomId, userId);
}, [mx, room, userId]),
);
const kicking = kickState.status === AsyncStatus.Loading;
const error = kickState.status === AsyncStatus.Error;
return (
Invited User
{when && {when}}
{invitedBy && (
Invited by: {invitedBy}
)}
{reason ? (
<>
Reason: {reason}
>
) : (
No Reason Provided.
)}
{error && (
{kickState.error.message}
)}
{canKick && (
}
disabled={kicking}
>
Cancel Invite
)}
);
}
type UserModerationProps = {
userId: string;
canKick: boolean;
canBan: boolean;
canInvite: boolean;
};
export function UserModeration({ userId, canKick, canBan, canInvite }: UserModerationProps) {
const mx = useMatrixClient();
const room = useRoom();
const reasonInputRef = useRef(null);
const getReason = useCallback((): string | undefined => {
const reason = reasonInputRef.current?.value.trim() || undefined;
if (reasonInputRef.current) {
reasonInputRef.current.value = '';
}
return reason;
}, []);
const [kickState, kick] = useAsyncCallback(
useCallback(async () => {
await mx.kick(room.roomId, userId, getReason());
}, [mx, room, userId, getReason]),
);
const [banState, ban] = useAsyncCallback(
useCallback(async () => {
await mx.ban(room.roomId, userId, getReason());
}, [mx, room, userId, getReason]),
);
const [inviteState, invite] = useAsyncCallback(
useCallback(async () => {
await mx.invite(room.roomId, userId, getReason());
}, [mx, room, userId, getReason]),
);
const disabled =
kickState.status === AsyncStatus.Loading ||
banState.status === AsyncStatus.Loading ||
inviteState.status === AsyncStatus.Loading;
if (!canBan && !canKick && !canInvite) return null;
return (
Moderation
{kickState.status === AsyncStatus.Error && (
{kickState.error.message}
)}
{banState.status === AsyncStatus.Error && (
{banState.error.message}
)}
{inviteState.status === AsyncStatus.Error && (
{inviteState.error.message}
)}
{canInvite && (
) : (
)
}
onClick={invite}
disabled={disabled}
>
Invite
)}
{canKick && (
) : (
)
}
onClick={kick}
disabled={disabled}
>
Kick
)}
{canBan && (
) : (
)
}
onClick={ban}
disabled={disabled}
>
Ban
)}
);
}