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 { useSetting } from '../../state/hooks/settings'; import { settingsAtom } from '../../state/settings'; import { timeDayMonYear, timeHourMinute } from '../../utils/time'; type UserKickAlertProps = { reason?: string; kickedBy?: string; ts?: number; }; export function UserKickAlert({ reason, kickedBy, ts }: UserKickAlertProps) { const [hour24Clock] = useSetting(settingsAtom, 'hour24Clock'); const [dateFormatString] = useSetting(settingsAtom, 'dateFormatString'); const time = ts ? timeHourMinute(ts, hour24Clock) : undefined; const date = ts ? timeDayMonYear(ts, dateFormatString) : undefined; return ( Kicked User {time && date && ( {date} {time} )} {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 [hour24Clock] = useSetting(settingsAtom, 'hour24Clock'); const [dateFormatString] = useSetting(settingsAtom, 'dateFormatString'); const time = ts ? timeHourMinute(ts, hour24Clock) : undefined; const date = ts ? timeDayMonYear(ts, dateFormatString) : 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 {time && date && ( {date} {time} )} {bannedBy && ( Banned by: {bannedBy} )} {reason ? ( <> Reason: {reason} ) : ( No Reason Provided. )} {error && ( {unbanState.error.message} )} {canUnban && ( )} ); } 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 [hour24Clock] = useSetting(settingsAtom, 'hour24Clock'); const [dateFormatString] = useSetting(settingsAtom, 'dateFormatString'); const time = ts ? timeHourMinute(ts, hour24Clock) : undefined; const date = ts ? timeDayMonYear(ts, dateFormatString) : 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 {time && date && ( {date} {time} )} {invitedBy && ( Invited by: {invitedBy} )} {reason ? ( <> Reason: {reason} ) : ( No Reason Provided. )} {error && ( {kickState.error.message} )} {canKick && ( )} ); } 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 && ( )} {canKick && ( )} {canBan && ( )} ); }