make linter happy

This commit is contained in:
Aine 2025-06-18 16:36:52 +03:00
parent ef41275cf0
commit bad79df298
No known key found for this signature in database
GPG Key ID: 34969C908CCA2804
37 changed files with 83 additions and 126 deletions

View File

@ -122,6 +122,18 @@
"root": true,
"rules": {
"prettier/prettier": "error",
"@typescript-eslint/no-unused-vars": [
"error",
{
"args": "all",
"argsIgnorePattern": "^_",
"caughtErrors": "all",
"caughtErrorsIgnorePattern": "^_",
"destructuredArrayIgnorePattern": "^_",
"varsIgnorePattern": "^_",
"ignoreRestSiblings": true
}
],
"import/no-extraneous-dependencies": [
"error",
{

View File

@ -83,11 +83,11 @@ const AdminMenu = props => {
setEtkeRoutesEnabled(true);
}
}, []);
const [serverProcess, setServerProcess] = useStore<ServerProcessResponse>("serverProcess", {
const [serverProcess, _setServerProcess] = useStore<ServerProcessResponse>("serverProcess", {
command: "",
locked_at: "",
});
const [serverStatus, setServerStatus] = useStore<ServerStatusResponse>("serverStatus", {
const [serverStatus, _setServerStatus] = useStore<ServerStatusResponse>("serverStatus", {
success: false,
ok: false,
host: "",
@ -124,6 +124,7 @@ const AdminMenu = props => {
{menu &&
menu.map((item, index) => {
const { url, icon, label } = item;
/* eslint-disable-next-line @typescript-eslint/no-explicit-any */
const IconComponent = Icons[icon] as React.ComponentType<any> | undefined;
return (

View File

@ -7,10 +7,8 @@ import {
SimpleForm,
BooleanInput,
useTranslate,
RaRecord,
useNotify,
useRedirect,
useDelete,
NotificationType,
useDeleteMany,
Identifier,
@ -51,7 +49,7 @@ const DeleteRoomButton: React.FC<DeleteRoomButtonProps> = props => {
unselectAll();
redirect("/rooms");
},
onError: error => notify("resources.rooms.action.erase.failure", { type: "error" as NotificationType }),
onError: _error => notify("resources.rooms.action.erase.failure", { type: "error" as NotificationType }),
}
);
};

View File

@ -7,10 +7,8 @@ import {
SimpleForm,
BooleanInput,
useTranslate,
RaRecord,
useNotify,
useRedirect,
useDelete,
NotificationType,
useDeleteMany,
Identifier,
@ -57,7 +55,7 @@ const DeleteUserButton: React.FC<DeleteUserButtonProps> = props => {
unselectAll();
redirect("/users");
},
onError: error => notify("ra.notification.data_provider_error", { type: "error" as NotificationType }),
onError: _error => notify("ra.notification.data_provider_error", { type: "error" as NotificationType }),
}
);
};

View File

@ -74,7 +74,7 @@ export const ExperimentalFeaturesList = () => {
const updateFeature = async (feature_name: string, feature_value: boolean) => {
const updatedFeatures = { ...features, [feature_name]: feature_value } as ExperimentalFeaturesModel;
setFeatures(updatedFeatures);
const response = await dataProvider.updateFeatures(record.id, updatedFeatures);
await dataProvider.updateFeatures(record.id, updatedFeatures);
notify("ra.notification.updated", {
messageArgs: { smart_count: 1 },
type: "success",

View File

@ -1,4 +1,4 @@
import { Avatar, Box, Link, Typography } from "@mui/material";
import { Avatar, Box, Link } from "@mui/material";
import { useTheme } from "@mui/material/styles";
import { useEffect, useState } from "react";

View File

@ -1,7 +1,7 @@
import { Stack, Typography } from "@mui/material";
import { TextField } from "@mui/material";
import { useEffect, useState } from "react";
import { useDataProvider, useNotify, useRecordContext, useTranslate } from "react-admin";
import { useDataProvider, useRecordContext, useTranslate } from "react-admin";
import { useFormContext } from "react-hook-form";
const RateLimitRow = ({
@ -10,8 +10,8 @@ const RateLimitRow = ({
updateRateLimit,
}: {
limit: string;
value: any;
updateRateLimit: (limit: string, value: any) => void;
value: object;
updateRateLimit: (limit: string, value: integer | null) => void;
}) => {
const translate = useTranslate();
@ -53,8 +53,6 @@ const RateLimitRow = ({
};
const UserRateLimits = () => {
const translate = useTranslate();
const notify = useNotify();
const record = useRecordContext();
const form = useFormContext();
const dataProvider = useDataProvider();
@ -78,7 +76,7 @@ const UserRateLimits = () => {
fetchRateLimits();
}, []);
const updateRateLimit = async (limit: string, value: any) => {
const updateRateLimit = async (limit: string, value: integer | null) => {
const updatedRateLimits = { ...rateLimits, [limit]: value };
setRateLimits(updatedRateLimits);
form.setValue(`rates.${limit}`, value, { shouldDirty: true });

View File

@ -5,7 +5,7 @@ import { ServerProcessResponse } from "../../synapse/dataProvider";
import { getTimeSince } from "../../utils/date";
const CurrentlyRunningCommand = () => {
const [serverProcess, setServerProcess] = useStore<ServerProcessResponse>("serverProcess", {
const [serverProcess, _setServerProcess] = useStore<ServerProcessResponse>("serverProcess", {
command: "",
locked_at: "",
});

View File

@ -1,6 +1,6 @@
import RestoreIcon from "@mui/icons-material/Restore";
import ScheduleIcon from "@mui/icons-material/Schedule";
import { Box, Typography, Link, Divider } from "@mui/material";
import { Box, Typography, Link } from "@mui/material";
import { Stack } from "@mui/material";
import CurrentlyRunningCommand from "./CurrentlyRunningCommand";

View File

@ -23,6 +23,7 @@ import { ServerCommand, ServerProcessResponse } from "../../synapse/dataProvider
import { Icons } from "../../utils/icons";
const renderIcon = (icon: string) => {
/* eslint-disable-next-line @typescript-eslint/no-explicit-any */
const IconComponent = Icons[icon] as React.ComponentType<any> | undefined;
return IconComponent ? <IconComponent sx={{ verticalAlign: "middle", mr: 1 }} /> : null;
};
@ -80,6 +81,7 @@ const ServerCommandsPanel = () => {
// Update server process status
await updateServerProcessStatus(serverCommands[command]);
} catch (error) {
console.error("Error running command:", error);
setCommandIsRunning(false);
}
};

View File

@ -33,7 +33,7 @@ const useServerNotifications = () => {
notifications: [],
success: false,
});
const [serverProcess, setServerProcess] = useStore<ServerProcessResponse>("serverProcess", {
const [serverProcess, _setServerProcess] = useStore<ServerProcessResponse>("serverProcess", {
command: "",
locked_at: "",
});

View File

@ -59,11 +59,11 @@ const useServerStatus = () => {
host: "",
results: [],
});
const [serverProcess, setServerProcess] = useStore<ServerProcessResponse>("serverProcess", {
const [serverProcess, _setServerProcess] = useStore<ServerProcessResponse>("serverProcess", {
command: "",
locked_at: "",
});
const { command, locked_at } = serverProcess;
const { command } = serverProcess;
const { etkeccAdmin } = useAppContext();
const dataProvider = useDataProvider();
const isOkay = serverStatus.ok;

View File

@ -1,12 +1,11 @@
import CheckIcon from "@mui/icons-material/Check";
import CloseIcon from "@mui/icons-material/Close";
import EngineeringIcon from "@mui/icons-material/Engineering";
import { Alert, Box, Stack, Typography, Paper, Link, Chip, Divider, Tooltip, ChipProps } from "@mui/material";
import { Box, Stack, Typography, Paper, Link, Chip, Divider, ChipProps } from "@mui/material";
import { useStore } from "ra-core";
import CurrentlyRunningCommand from "./CurrentlyRunningCommand";
import { ServerProcessResponse, ServerStatusComponent, ServerStatusResponse } from "../../synapse/dataProvider";
import { getTimeSince } from "../../utils/date";
const StatusChip = ({
isOkay,
@ -40,17 +39,17 @@ const ServerComponentText = ({ text }: { text: string }) => {
};
const ServerStatusPage = () => {
const [serverStatus, setServerStatus] = useStore<ServerStatusResponse>("serverStatus", {
const [serverStatus, _setServerStatus] = useStore<ServerStatusResponse>("serverStatus", {
ok: false,
success: false,
host: "",
results: [],
});
const [serverProcess, setServerProcess] = useStore<ServerProcessResponse>("serverProcess", {
const [serverProcess, _setServerProcess] = useStore<ServerProcessResponse>("serverProcess", {
command: "",
locked_at: "",
});
const { command, locked_at } = serverProcess;
const { command } = serverProcess;
const successCheck = serverStatus.success;
const isOkay = serverStatus.ok;
const host = serverStatus.host;
@ -104,7 +103,7 @@ const ServerStatusPage = () => {
</Typography>
<Stack spacing={2} direction="row">
{Object.keys(groupedResults).map((category, idx) => (
{Object.keys(groupedResults).map((category, _idx) => (
<Box key={`category_${category}`} sx={{ flex: 1 }}>
<Typography variant="h5" mb={1}>
{category}

View File

@ -1,21 +0,0 @@
const transformCommandsToChoices = (commands: Record<string, any>) => {
return Object.entries(commands).map(([key, value]) => ({
id: key,
name: value.name,
description: value.description,
}));
};
const ScheduledCommandCreate = () => {
const commandChoices = transformCommandsToChoices(serverCommands);
return (
<SimpleForm>
<SelectInput
source="command"
choices={commandChoices}
optionText={choice => `${choice.name} - ${choice.description}`}
/>
</SimpleForm>
);
};

View File

@ -22,6 +22,7 @@ import { RecurringCommand } from "../../../../../synapse/dataProvider";
import { useServerCommands } from "../../../hooks/useServerCommands";
import { useRecurringCommands } from "../../hooks/useRecurringCommands";
/* eslint-disable-next-line @typescript-eslint/no-explicit-any */
const transformCommandsToChoices = (commands: Record<string, any>) => {
return Object.entries(commands).map(([key, value]) => ({
id: key,
@ -111,13 +112,11 @@ const RecurringCommandEdit = () => {
delete submissionData.args;
}
let result;
if (isCreating) {
result = await dataProvider.createRecurringCommand(etkeccAdmin, submissionData);
await dataProvider.createRecurringCommand(etkeccAdmin, submissionData);
notify("recurring_commands.action.create_success", { type: "success" });
} else {
result = await dataProvider.updateRecurringCommand(etkeccAdmin, {
await dataProvider.updateRecurringCommand(etkeccAdmin, {
...submissionData,
id: id,
});
@ -129,6 +128,7 @@ const RecurringCommandEdit = () => {
navigate("/server_actions");
} catch (error) {
console.error("Error saving recurring command:", error);
notify("recurring_commands.action.update_failure", { type: "error" });
}
};

View File

@ -21,7 +21,7 @@ const ListActions = () => {
};
const RecurringCommandsList = () => {
const { data, isLoading, error } = useRecurringCommands();
const { data, isLoading } = useRecurringCommands();
const listContext = useList({
resource: "recurring",
@ -40,6 +40,7 @@ const RecurringCommandsList = () => {
<Paper>
<Datagrid
bulkActionButtons={false}
/* eslint-disable-next-line @typescript-eslint/no-explicit-any */
rowClick={(id: Identifier, resource: string, record: any) => {
if (!record) {
return "";

View File

@ -11,7 +11,6 @@ import {
useDataProvider,
Loading,
Button,
BooleanInput,
SelectInput,
} from "react-admin";
import { useWatch } from "react-hook-form";
@ -23,6 +22,7 @@ import { ScheduledCommand } from "../../../../../synapse/dataProvider";
import { useServerCommands } from "../../../hooks/useServerCommands";
import { useScheduledCommands } from "../../hooks/useScheduledCommands";
/* eslint-disable-next-line @typescript-eslint/no-explicit-any */
const transformCommandsToChoices = (commands: Record<string, any>) => {
return Object.entries(commands).map(([key, value]) => ({
id: key,
@ -50,7 +50,7 @@ const ScheduledCommandEdit = () => {
const isCreating = typeof id === "undefined";
const [loading, setLoading] = useState(!isCreating);
const { data: scheduledCommands, isLoading: isLoadingList } = useScheduledCommands();
const { serverCommands, isLoading: isLoadingServerCommands } = useServerCommands();
const { serverCommands } = useServerCommands();
const pageTitle = isCreating ? "Create Scheduled Command" : "Edit Scheduled Command";
const commandChoices = transformCommandsToChoices(serverCommands);
@ -67,15 +67,12 @@ const ScheduledCommandEdit = () => {
const handleSubmit = async data => {
try {
let result;
data.scheduled_at = new Date(data.scheduled_at).toISOString();
if (isCreating) {
result = await dataProvider.createScheduledCommand(etkeccAdmin, data);
await dataProvider.createScheduledCommand(etkeccAdmin, data);
notify("scheduled_commands.action.create_success", { type: "success" });
} else {
result = await dataProvider.updateScheduledCommand(etkeccAdmin, {
await dataProvider.updateScheduledCommand(etkeccAdmin, {
...data,
id: id,
});
@ -84,6 +81,7 @@ const ScheduledCommandEdit = () => {
navigate("/server_actions");
} catch (error) {
console.log("Error saving scheduled command:", error);
notify("scheduled_commands.action.update_failure", { type: "error" });
}
};

View File

@ -4,8 +4,6 @@ import { useState, useEffect } from "react";
import {
Loading,
Button,
useDataProvider,
useNotify,
SimpleShowLayout,
TextField,
BooleanField,
@ -15,7 +13,6 @@ import {
import { useParams, useNavigate } from "react-router-dom";
import ScheduledDeleteButton from "./ScheduledDeleteButton";
import { useAppContext } from "../../../../../Context";
import { ScheduledCommand } from "../../../../../synapse/dataProvider";
import { useScheduledCommands } from "../../hooks/useScheduledCommands";

View File

@ -1,15 +1,13 @@
import AddIcon from "@mui/icons-material/Add";
import { Paper } from "@mui/material";
import { Loading, Button, useNotify, useRefresh, useCreatePath, useRecordContext } from "react-admin";
import { Loading, Button } from "react-admin";
import { ResourceContextProvider, useList } from "react-admin";
import { ListContextProvider, TextField } from "react-admin";
import { Datagrid } from "react-admin";
import { BooleanField, DateField, TopToolbar } from "react-admin";
import { useDataProvider } from "react-admin";
import { Identifier } from "react-admin";
import { useNavigate } from "react-router-dom";
import { useAppContext } from "../../../../../Context";
import { DATE_FORMAT } from "../../../../../utils/date";
import { useScheduledCommands } from "../../hooks/useScheduledCommands";
const ListActions = () => {
@ -27,7 +25,7 @@ const ListActions = () => {
};
const ScheduledCommandsList = () => {
const { data, isLoading, error } = useScheduledCommands();
const { data, isLoading } = useScheduledCommands();
const listContext = useList({
resource: "scheduled",
@ -46,6 +44,7 @@ const ScheduledCommandsList = () => {
<Paper>
<Datagrid
bulkActionButtons={false}
/* eslint-disable-next-line @typescript-eslint/no-explicit-any */
rowClick={(id: Identifier, resource: string, record: any) => {
if (!record) {
return "";

View File

@ -7,16 +7,7 @@ import DownloadingIcon from "@mui/icons-material/Downloading";
import FileOpenIcon from "@mui/icons-material/FileOpen";
import LockIcon from "@mui/icons-material/Lock";
import LockOpenIcon from "@mui/icons-material/LockOpen";
import {
Grid2 as Grid,
Box,
Dialog,
DialogContent,
DialogContentText,
DialogTitle,
Tooltip,
Link,
} from "@mui/material";
import { Box, Dialog, DialogContent, DialogContentText, DialogTitle, Tooltip } from "@mui/material";
import { alpha, useTheme } from "@mui/material/styles";
import { useMutation } from "@tanstack/react-query";
import { get } from "lodash";
@ -149,7 +140,6 @@ const PurgeRemoteMediaDialog = ({ open, onClose, onSubmit }) => {
};
export const PurgeRemoteMediaButton = (props: ButtonProps) => {
const theme = useTheme();
const [open, setOpen] = useState(false);
const notify = useNotify();
const dataProvider = useDataProvider<SynapseDataProvider>();

View File

@ -3,7 +3,7 @@ import { CardContent, CardHeader, Container } from "@mui/material";
import { useTranslate } from "ra-core";
import { ChangeEventHandler } from "react";
import { ParsedStats, Progress } from "./types";
import { ImportResult, ParsedStats, Progress } from "./types";
const TranslatableOption = ({ value, text }: { value: string; text: string }) => {
const translate = useTranslate();
@ -18,7 +18,7 @@ const ConflictModeCard = ({
progress,
}: {
stats: ParsedStats | null;
importResults: any;
importResults: ImportResult | null;
onConflictModeChanged: ChangeEventHandler<HTMLSelectElement>;
conflictMode: string;
progress: Progress;

View File

@ -5,7 +5,7 @@ import { Checkbox } from "@mui/material";
import { useTranslate } from "ra-core";
import { ChangeEventHandler } from "react";
import { ParsedStats, Progress } from "./types";
import { ImportResult, ParsedStats, Progress } from "./types";
const StatsCard = ({
stats,
@ -18,7 +18,7 @@ const StatsCard = ({
}: {
stats: ParsedStats | null;
progress: Progress;
importResults: any;
importResults: ImportResult | null;
useridMode: string;
passwordMode: boolean;
onUseridModeChanged: ChangeEventHandler<HTMLSelectElement>;

View File

@ -2,14 +2,14 @@ import { CardHeader, CardContent, Container, Link, Stack, Typography, Paper } fr
import { useTranslate } from "ra-core";
import { ChangeEventHandler } from "react";
import { Progress } from "./types";
import { ImportResult, Progress } from "./types";
const UploadCard = ({
importResults,
onFileChange,
progress,
}: {
importResults: any;
importResults: ImportResult | null;
onFileChange: ChangeEventHandler<HTMLInputElement>;
progress: Progress;
}) => {

View File

@ -273,7 +273,7 @@ const useImportFile = () => {
let retries = 0;
const submitRecord = async (recordData: ImportLine) => {
try {
const response = await dataProvider.getOne("users", { id: recordData.id });
await dataProvider.getOne("users", { id: recordData.id });
if (LOGGING) console.log("already existed");

View File

@ -1,4 +1,4 @@
import { render, screen } from "@testing-library/react";
import { act, render, screen } from "@testing-library/react";
import polyglotI18nProvider from "ra-i18n-polyglot";
import { AdminContext } from "react-admin";
@ -7,7 +7,6 @@ import { AppContext } from "../Context";
import englishMessages from "../i18n/en";
const i18nProvider = polyglotI18nProvider(() => englishMessages, "en", [{ locale: "en", name: "English" }]);
import { act } from "@testing-library/react";
describe("LoginForm", () => {
it("renders with no restriction to homeserver", async () => {

View File

@ -161,14 +161,14 @@ const LoginPage = () => {
try {
const serverVersion = await getServerVersion(url);
setServerVersion(`${translate("synapseadmin.auth.server_version")} ${serverVersion}`);
} catch (error) {
} catch {
setServerVersion("");
}
try {
const features = await getSupportedFeatures(url);
setMatrixVersions(`${translate("synapseadmin.auth.supports_specs")} ${features.versions.join(", ")}`);
} catch (error) {
} catch {
setMatrixVersions("");
}
@ -179,7 +179,7 @@ const LoginPage = () => {
const supportSSO = loginFlows.find(f => f.type === "m.login.sso") !== undefined;
setSupportPassAuth(supportPass);
setSSOBaseUrl(supportSSO ? url : "");
} catch (error) {
} catch {
setSupportPassAuth(false);
setSSOBaseUrl("");
}

View File

@ -114,7 +114,6 @@ const destinationFieldRender = (record: RaRecord) => {
};
export const DestinationList = (props: ListProps) => {
const record = useRecordContext(props);
return (
<List
{...props}

View File

@ -3,7 +3,6 @@ import {
BooleanInput,
Create,
CreateProps,
Datagrid,
DatagridConfigurable,
DateField,
DateTimeInput,

View File

@ -2,7 +2,6 @@ import PageviewIcon from "@mui/icons-material/Pageview";
import ViewListIcon from "@mui/icons-material/ViewList";
import ReportIcon from "@mui/icons-material/Warning";
import {
Datagrid,
DatagridConfigurable,
DateField,
DeleteButton,

View File

@ -119,13 +119,9 @@ export const MakeAdminBtn = () => {
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;
const result = await dataProvider.makeRoomAdmin(record.room_id, userIdValue);
if (!result.success) {
throw new Error(result.error);
}
},
onSuccess: () => {
@ -203,7 +199,6 @@ export const MakeAdminBtn = () => {
export const RoomShow = (props: ShowProps) => {
const translate = useTranslate();
const record = useRecordContext();
return (
<Show {...props} actions={<RoomShowActions />} title={<RoomTitle />}>
<TabbedShowLayout>

View File

@ -1,6 +1,5 @@
import PermMediaIcon from "@mui/icons-material/PermMedia";
import {
Datagrid,
DatagridConfigurable,
ExportButton,
List,

View File

@ -219,13 +219,12 @@ export const UserList = (props: ListProps) => (
// here only local part of user_id
// maxLength = 255 - "@" - ":" - storage.getItem("home_server").length
// storage.getItem("home_server").length is not valid here
const validateUser = [required(), maxLength(253), regex(/^[a-z0-9._=\-\+/]+$/, "synapseadmin.users.invalid_user_id")];
const validateUser = [required(), maxLength(253), regex(/^[a-z0-9._=\-+/]+$/, "synapseadmin.users.invalid_user_id")];
const validateAddress = [required(), maxLength(255)];
const UserEditActions = () => {
const record = useRecordContext();
const translate = useTranslate();
const ownUserId = localStorage.getItem("user_id");
let ownUserIsSelected = false;
let asManagedUserIsSelected = false;
@ -262,6 +261,7 @@ export const UserCreate = (props: CreateProps) => {
const [userAvailabilityEl, setUserAvailabilityEl] = useState<React.ReactElement | false>(
<Typography component="span"></Typography>
);
/* eslint-disable-next-line @typescript-eslint/no-explicit-any */
const [formData, setFormData] = useState<Record<string, any>>({});
const [create] = useCreate();
@ -284,6 +284,7 @@ export const UserCreate = (props: CreateProps) => {
}
};
/* eslint-disable-next-line @typescript-eslint/no-explicit-any */
const postSave = (data: Record<string, any>) => {
setFormData(data);
if (!userIsAvailable) {

View File

@ -17,6 +17,7 @@ import { GetConfig } from "../utils/config";
import { MatrixError, displayError } from "../utils/error";
import { returnMXID } from "../utils/mxid";
/* eslint-disable-next-line @typescript-eslint/no-explicit-any */
const CACHED_MANY_REF: Record<string, any> = {};
// Adds the access token to all requests
@ -33,7 +34,7 @@ const jsonClient = async (url: string, options: Options = {}) => {
try {
const response = await fetchUtils.fetchJson(url, options);
return response;
} catch (err: any) {
} catch (err) {
const error = err as HttpError;
const errorStatus = error.status;
const errorBody = error.body as MatrixError;
@ -45,16 +46,11 @@ const jsonClient = async (url: string, options: Options = {}) => {
}
};
/* eslint-disable-next-line @typescript-eslint/no-explicit-any */
const filterUndefined = (obj: Record<string, any>) => {
return Object.fromEntries(Object.entries(obj).filter(([key, value]) => value !== undefined));
return Object.fromEntries(Object.entries(obj).filter(([_key, value]) => value !== undefined));
};
interface Action {
endpoint: string;
method?: string;
body?: Record<string, any>;
}
export interface Room {
room_id: string;
name?: string;
@ -990,7 +986,7 @@ const baseDataProvider: SynapseDataProvider = {
},
setRateLimits: async (id: Identifier, rateLimits: RateLimitsModel) => {
const filtered = Object.entries(rateLimits)
.filter(([key, value]) => value !== null && value !== undefined)
.filter(([_key, value]) => value !== null && value !== undefined)
.reduce((obj, [key, value]) => {
obj[key] = value;
return obj;
@ -1023,7 +1019,7 @@ const baseDataProvider: SynapseDataProvider = {
const endpoint_url = `${base_url}/_synapse/admin/v1/rooms/${encodeURIComponent(room_id)}/make_room_admin`;
try {
const { json } = await jsonClient(endpoint_url, { method: "POST", body: JSON.stringify({ user_id }) });
await jsonClient(endpoint_url, { method: "POST", body: JSON.stringify({ user_id }) });
return { success: true };
} catch (error) {
if (error instanceof HttpError) {
@ -1036,7 +1032,7 @@ const baseDataProvider: SynapseDataProvider = {
const base_url = localStorage.getItem("base_url");
const endpoint_url = `${base_url}/_synapse/admin/v1/suspend/${encodeURIComponent(returnMXID(id))}`;
try {
const { json } = await jsonClient(endpoint_url, {
await jsonClient(endpoint_url, {
method: "PUT",
body: JSON.stringify({ suspend: suspendValue }),
});
@ -1211,7 +1207,7 @@ const baseDataProvider: SynapseDataProvider = {
return {};
} catch (error) {
console.error("Error fetching server commands, error");
console.error("Error fetching server commands:", error);
}
return {};
@ -1271,7 +1267,7 @@ const baseDataProvider: SynapseDataProvider = {
return [];
} catch (error) {
console.error("Error fetching scheduled commands, error");
console.error("Error fetching scheduled commands:", error);
}
return [];
},
@ -1296,7 +1292,7 @@ const baseDataProvider: SynapseDataProvider = {
return [];
} catch (error) {
console.error("Error fetching recurring commands, error");
console.error("Error fetching recurring commands:", error);
}
return [];
},
@ -1501,7 +1497,7 @@ const dataProvider = withLifecycleCallbacks(baseDataProvider, [
}
return params;
},
beforeDelete: async (params: DeleteParams<any>, dataProvider: DataProvider) => {
beforeDelete: async (params: DeleteParams<any>, _dataProvider: DataProvider) => {
if (params.meta?.deleteMedia) {
const base_url = localStorage.getItem("base_url");
const endpoint_url = `${base_url}/_synapse/admin/v1/users/${encodeURIComponent(returnMXID(params.id))}/media`;
@ -1516,7 +1512,7 @@ const dataProvider = withLifecycleCallbacks(baseDataProvider, [
return params;
},
beforeDeleteMany: async (params: DeleteManyParams<any>, dataProvider: DataProvider) => {
beforeDeleteMany: async (params: DeleteManyParams<any>, _dataProvider: DataProvider) => {
await Promise.all(
params.ids.map(async id => {
if (params.meta?.deleteMedia) {

View File

@ -1,6 +1,4 @@
import { Identifier, fetchUtils } from "react-admin";
import { isMXID } from "../utils/mxid";
import { fetchUtils } from "react-admin";
export const splitMxid = mxid => {
const re = /^@(?<name>[a-zA-Z0-9._=\-/]+):(?<domain>[a-zA-Z0-9\-.]+\.[a-zA-Z]+)$/;

View File

@ -69,7 +69,7 @@ export const FetchConfig = async () => {
// load config from context
// we deliberately processing each key separately to avoid overwriting the whole config, losing some keys, and messing
// with typescript types
export const LoadConfig = (context: any) => {
export const LoadConfig = (context: object) => {
if (context?.restrictBaseUrl) {
config.restrictBaseUrl = context.restrictBaseUrl as string | string[];
}

View File

@ -4,10 +4,10 @@
* @returns The decoded string, or the original string if decoding fails.
* @example decodeURIComponent("Hello%20World") // "Hello World"
*/
const decodeURLComponent = (str: any): any => {
const decodeURLComponent = (str: string): string => {
try {
return decodeURIComponent(str);
} catch (e) {
} catch {
return str;
}
};