import EventIcon from "@mui/icons-material/Event"; import FastForwardIcon from "@mui/icons-material/FastForward"; import UserIcon from "@mui/icons-material/Group"; import HttpsIcon from "@mui/icons-material/Https"; import NoEncryptionIcon from "@mui/icons-material/NoEncryption"; import PageviewIcon from "@mui/icons-material/Pageview"; import ViewListIcon from "@mui/icons-material/ViewList"; import RoomIcon from "@mui/icons-material/ViewList"; import VisibilityIcon from "@mui/icons-material/Visibility"; import PermMediaIcon from "@mui/icons-material/PermMedia"; import Box from "@mui/material/Box"; import { useTheme } from "@mui/material/styles"; import { BooleanField, DateField, WrapperField, Datagrid, DatagridConfigurable, ExportButton, FunctionField, List, ListProps, NumberField, Pagination, ReferenceField, ReferenceManyField, ResourceProps, SearchInput, SelectColumnsButton, SelectField, Show, ShowProps, Tab, TabbedShowLayout, TextField as RaTextField, TopToolbar, useRecordContext, useTranslate, useListContext, useNotify, DeleteButton, } from "react-admin"; import TextField from "@mui/material/TextField"; import { RoomDirectoryBulkUnpublishButton, RoomDirectoryBulkPublishButton, RoomDirectoryUnpublishButton, RoomDirectoryPublishButton, } from "./room_directory"; import { DATE_FORMAT } from "../utils/date"; import DeleteRoomButton from "../components/DeleteRoomButton"; import { MediaIDField } from "../components/media"; import AvatarField from "../components/AvatarField"; import { Room } from "../synapse/dataProvider"; import { useMutation } from "@tanstack/react-query"; import { useDataProvider } from "react-admin"; import { Confirm } from "react-admin"; import { useState } from "react"; import Button from "@mui/material/Button"; import PersonIcon from '@mui/icons-material/Person'; import Typography from "@mui/material/Typography"; import Alert from "@mui/material/Alert"; const RoomPagination = () => ; const RoomTitle = () => { const record = useRecordContext(); const translate = useTranslate(); let name = ""; if (record) { name = record.name !== "" ? record.name : record.id; } return ( {translate("resources.rooms.name", 1)} {name} ); }; const RoomShowActions = () => { const record = useRecordContext(); if (!record) { return null; } const publishButton = record?.public ? : ; // FIXME: refresh after (un)publish return ( {publishButton} ); }; export const MakeAdminBtn = () => { const record = useRecordContext() as Room; if (!record) { return null; } if (record.joined_local_members < 1) { return null; } const ownMXID = localStorage.getItem("user_id") || ""; const [open, setOpen] = useState(false); const [userIdValue, setUserIdValue] = useState(ownMXID); const dataProvider = useDataProvider(); const notify = useNotify(); const translate = useTranslate(); const { mutate, isPending } = useMutation({ mutationFn: async () => { try { const result = await dataProvider.makeRoomAdmin(record.room_id, userIdValue); if (!result.success) { throw new Error(result.error); } } catch (error) { throw error; } }, onSuccess: () => { notify("resources.rooms.action.make_admin.success", { type: "success" }); setOpen(false); setUserIdValue(""); }, onError: (err) => { const errorMessage = err instanceof Error ? err.message : "Unknown error"; notify("resources.rooms.action.make_admin.failure", { type: "error", messageArgs: { errMsg: errorMessage } }); setOpen(false); setUserIdValue(""); } }); const handleChange = (event: React.ChangeEvent) => { setUserIdValue(event.target.value); }; const handleConfirm = async () => { mutate(); setOpen(false); }; const handleDialogClose = () => { setOpen(false); }; const handleKeyDown = (event: React.KeyboardEvent) => { if (event.key === "Enter") { handleConfirm(); } }; return (<> {translate("resources.rooms.action.make_admin.content")} } /> ); }; export const RoomShow = (props: ShowProps) => { const translate = useTranslate(); const record = useRecordContext(); return ( } title={}> }> } path="detail"> } path="members"> "/users/" + id} bulkActionButtons={false}> } path="media"> {translate("resources.room_media.helper.info")} } path="permission"> } path="state"> `${JSON.stringify(record.content, null, 2)}`} /> } path="forward_extremities"> {translate("resources.rooms.helper.forward_extremities")} ); }; const RoomBulkActionButtons = () => { const record = useListContext(); return ( <> ); }; const roomFilters = []; const RoomListActions = () => ( ); export const RoomList = (props: ListProps) => { const theme = useTheme(); return ( } sort={{ field: "name", order: "ASC" }} filters={roomFilters} actions={} perPage={50} > } omit={["joined_local_members", "state_events", "version", "federatable"]} > } sx={{ [`& [data-testid="true"]`]: { color: theme.palette.success.main }, [`& [data-testid="false"]`]: { color: theme.palette.error.main }, }} /> record["name"] || record["canonical_alias"] || record["id"]} label="resources.rooms.fields.name" /> ); }; const resource: ResourceProps = { name: "rooms", icon: RoomIcon, list: RoomList, show: RoomShow, }; export default resource;