From bad79df298013b2061eaf670392bc20787100f5f Mon Sep 17 00:00:00 2001 From: Aine Date: Wed, 18 Jun 2025 16:36:52 +0300 Subject: [PATCH] make linter happy --- package.json | 12 ++++++++ src/components/AdminLayout.tsx | 5 ++-- src/components/DeleteRoomButton.tsx | 4 +-- src/components/DeleteUserButton.tsx | 4 +-- src/components/ExperimentalFeatures.tsx | 2 +- src/components/Footer.tsx | 2 +- src/components/UserRateLimits.tsx | 10 +++---- .../etke.cc/CurrentlyRunningCommand.tsx | 2 +- src/components/etke.cc/ServerActionsPage.tsx | 2 +- .../etke.cc/ServerCommandsPanel.tsx | 2 ++ .../etke.cc/ServerNotificationsBadge.tsx | 2 +- src/components/etke.cc/ServerStatusBadge.tsx | 4 +-- src/components/etke.cc/ServerStatusPage.tsx | 11 ++++---- .../components/ScheduledCommandCreate.tsx | 21 -------------- .../components/ScheduledCommandEdit.tsx | 0 .../recurring/RecurringCommandEdit.tsx | 8 +++--- .../recurring/RecurringCommandsList.tsx | 3 +- .../scheduled/ScheduledCommandEdit.tsx | 12 ++++---- .../scheduled/ScheduledCommandShow.tsx | 3 -- .../scheduled/ScheduledCommandsList.tsx | 7 ++--- src/components/media.tsx | 12 +------- .../user-import/ConflictModeCard.tsx | 4 +-- src/components/user-import/StatsCard.tsx | 4 +-- src/components/user-import/UploadCard.tsx | 4 +-- src/components/user-import/useImportFile.tsx | 2 +- src/pages/LoginPage.test.tsx | 3 +- src/pages/LoginPage.tsx | 6 ++-- src/resources/destinations.tsx | 1 - src/resources/registration_tokens.tsx | 1 - src/resources/reports.tsx | 1 - src/resources/rooms.tsx | 11 ++------ src/resources/user_media_statistics.tsx | 1 - src/resources/users.tsx | 5 ++-- src/synapse/dataProvider.ts | 28 ++++++++----------- src/synapse/matrix.ts | 4 +-- src/utils/config.ts | 2 +- src/utils/decodeURLComponent.ts | 4 +-- 37 files changed, 83 insertions(+), 126 deletions(-) delete mode 100644 src/components/etke.cc/schedules/components/ScheduledCommandCreate.tsx delete mode 100644 src/components/etke.cc/schedules/components/ScheduledCommandEdit.tsx diff --git a/package.json b/package.json index a7df8f3..496d4a9 100644 --- a/package.json +++ b/package.json @@ -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", { diff --git a/src/components/AdminLayout.tsx b/src/components/AdminLayout.tsx index 0446f7f..311955d 100644 --- a/src/components/AdminLayout.tsx +++ b/src/components/AdminLayout.tsx @@ -83,11 +83,11 @@ const AdminMenu = props => { setEtkeRoutesEnabled(true); } }, []); - const [serverProcess, setServerProcess] = useStore("serverProcess", { + const [serverProcess, _setServerProcess] = useStore("serverProcess", { command: "", locked_at: "", }); - const [serverStatus, setServerStatus] = useStore("serverStatus", { + const [serverStatus, _setServerStatus] = useStore("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 | undefined; return ( diff --git a/src/components/DeleteRoomButton.tsx b/src/components/DeleteRoomButton.tsx index 346d08f..6caa26a 100644 --- a/src/components/DeleteRoomButton.tsx +++ b/src/components/DeleteRoomButton.tsx @@ -7,10 +7,8 @@ import { SimpleForm, BooleanInput, useTranslate, - RaRecord, useNotify, useRedirect, - useDelete, NotificationType, useDeleteMany, Identifier, @@ -51,7 +49,7 @@ const DeleteRoomButton: React.FC = 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 }), } ); }; diff --git a/src/components/DeleteUserButton.tsx b/src/components/DeleteUserButton.tsx index a58ee89..65d1dc8 100644 --- a/src/components/DeleteUserButton.tsx +++ b/src/components/DeleteUserButton.tsx @@ -7,10 +7,8 @@ import { SimpleForm, BooleanInput, useTranslate, - RaRecord, useNotify, useRedirect, - useDelete, NotificationType, useDeleteMany, Identifier, @@ -57,7 +55,7 @@ const DeleteUserButton: React.FC = 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 }), } ); }; diff --git a/src/components/ExperimentalFeatures.tsx b/src/components/ExperimentalFeatures.tsx index 95d5b90..d922f7f 100644 --- a/src/components/ExperimentalFeatures.tsx +++ b/src/components/ExperimentalFeatures.tsx @@ -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", diff --git a/src/components/Footer.tsx b/src/components/Footer.tsx index c6498cd..5c54f2d 100644 --- a/src/components/Footer.tsx +++ b/src/components/Footer.tsx @@ -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"; diff --git a/src/components/UserRateLimits.tsx b/src/components/UserRateLimits.tsx index 6e32a16..94c7adb 100644 --- a/src/components/UserRateLimits.tsx +++ b/src/components/UserRateLimits.tsx @@ -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 }); diff --git a/src/components/etke.cc/CurrentlyRunningCommand.tsx b/src/components/etke.cc/CurrentlyRunningCommand.tsx index 44b4d98..810d8de 100644 --- a/src/components/etke.cc/CurrentlyRunningCommand.tsx +++ b/src/components/etke.cc/CurrentlyRunningCommand.tsx @@ -5,7 +5,7 @@ import { ServerProcessResponse } from "../../synapse/dataProvider"; import { getTimeSince } from "../../utils/date"; const CurrentlyRunningCommand = () => { - const [serverProcess, setServerProcess] = useStore("serverProcess", { + const [serverProcess, _setServerProcess] = useStore("serverProcess", { command: "", locked_at: "", }); diff --git a/src/components/etke.cc/ServerActionsPage.tsx b/src/components/etke.cc/ServerActionsPage.tsx index b74af6f..592f21c 100644 --- a/src/components/etke.cc/ServerActionsPage.tsx +++ b/src/components/etke.cc/ServerActionsPage.tsx @@ -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"; diff --git a/src/components/etke.cc/ServerCommandsPanel.tsx b/src/components/etke.cc/ServerCommandsPanel.tsx index dd940b2..dc1334f 100644 --- a/src/components/etke.cc/ServerCommandsPanel.tsx +++ b/src/components/etke.cc/ServerCommandsPanel.tsx @@ -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 | undefined; return IconComponent ? : 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); } }; diff --git a/src/components/etke.cc/ServerNotificationsBadge.tsx b/src/components/etke.cc/ServerNotificationsBadge.tsx index 91efbf6..73aef7b 100644 --- a/src/components/etke.cc/ServerNotificationsBadge.tsx +++ b/src/components/etke.cc/ServerNotificationsBadge.tsx @@ -33,7 +33,7 @@ const useServerNotifications = () => { notifications: [], success: false, }); - const [serverProcess, setServerProcess] = useStore("serverProcess", { + const [serverProcess, _setServerProcess] = useStore("serverProcess", { command: "", locked_at: "", }); diff --git a/src/components/etke.cc/ServerStatusBadge.tsx b/src/components/etke.cc/ServerStatusBadge.tsx index de6d0b5..90dd03f 100644 --- a/src/components/etke.cc/ServerStatusBadge.tsx +++ b/src/components/etke.cc/ServerStatusBadge.tsx @@ -59,11 +59,11 @@ const useServerStatus = () => { host: "", results: [], }); - const [serverProcess, setServerProcess] = useStore("serverProcess", { + const [serverProcess, _setServerProcess] = useStore("serverProcess", { command: "", locked_at: "", }); - const { command, locked_at } = serverProcess; + const { command } = serverProcess; const { etkeccAdmin } = useAppContext(); const dataProvider = useDataProvider(); const isOkay = serverStatus.ok; diff --git a/src/components/etke.cc/ServerStatusPage.tsx b/src/components/etke.cc/ServerStatusPage.tsx index 629cffc..cc8d51f 100644 --- a/src/components/etke.cc/ServerStatusPage.tsx +++ b/src/components/etke.cc/ServerStatusPage.tsx @@ -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("serverStatus", { + const [serverStatus, _setServerStatus] = useStore("serverStatus", { ok: false, success: false, host: "", results: [], }); - const [serverProcess, setServerProcess] = useStore("serverProcess", { + const [serverProcess, _setServerProcess] = useStore("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 = () => { - {Object.keys(groupedResults).map((category, idx) => ( + {Object.keys(groupedResults).map((category, _idx) => ( {category} diff --git a/src/components/etke.cc/schedules/components/ScheduledCommandCreate.tsx b/src/components/etke.cc/schedules/components/ScheduledCommandCreate.tsx deleted file mode 100644 index 60c6873..0000000 --- a/src/components/etke.cc/schedules/components/ScheduledCommandCreate.tsx +++ /dev/null @@ -1,21 +0,0 @@ -const transformCommandsToChoices = (commands: Record) => { - return Object.entries(commands).map(([key, value]) => ({ - id: key, - name: value.name, - description: value.description, - })); -}; - -const ScheduledCommandCreate = () => { - const commandChoices = transformCommandsToChoices(serverCommands); - - return ( - - `${choice.name} - ${choice.description}`} - /> - - ); -}; diff --git a/src/components/etke.cc/schedules/components/ScheduledCommandEdit.tsx b/src/components/etke.cc/schedules/components/ScheduledCommandEdit.tsx deleted file mode 100644 index e69de29..0000000 diff --git a/src/components/etke.cc/schedules/components/recurring/RecurringCommandEdit.tsx b/src/components/etke.cc/schedules/components/recurring/RecurringCommandEdit.tsx index fc47e27..baf5601 100644 --- a/src/components/etke.cc/schedules/components/recurring/RecurringCommandEdit.tsx +++ b/src/components/etke.cc/schedules/components/recurring/RecurringCommandEdit.tsx @@ -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) => { 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" }); } }; diff --git a/src/components/etke.cc/schedules/components/recurring/RecurringCommandsList.tsx b/src/components/etke.cc/schedules/components/recurring/RecurringCommandsList.tsx index c939914..4daa323 100644 --- a/src/components/etke.cc/schedules/components/recurring/RecurringCommandsList.tsx +++ b/src/components/etke.cc/schedules/components/recurring/RecurringCommandsList.tsx @@ -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 = () => { { if (!record) { return ""; diff --git a/src/components/etke.cc/schedules/components/scheduled/ScheduledCommandEdit.tsx b/src/components/etke.cc/schedules/components/scheduled/ScheduledCommandEdit.tsx index 84624b7..fd88f94 100644 --- a/src/components/etke.cc/schedules/components/scheduled/ScheduledCommandEdit.tsx +++ b/src/components/etke.cc/schedules/components/scheduled/ScheduledCommandEdit.tsx @@ -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) => { 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" }); } }; diff --git a/src/components/etke.cc/schedules/components/scheduled/ScheduledCommandShow.tsx b/src/components/etke.cc/schedules/components/scheduled/ScheduledCommandShow.tsx index 80d6042..4cc1e7e 100644 --- a/src/components/etke.cc/schedules/components/scheduled/ScheduledCommandShow.tsx +++ b/src/components/etke.cc/schedules/components/scheduled/ScheduledCommandShow.tsx @@ -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"; diff --git a/src/components/etke.cc/schedules/components/scheduled/ScheduledCommandsList.tsx b/src/components/etke.cc/schedules/components/scheduled/ScheduledCommandsList.tsx index 681d534..1544484 100644 --- a/src/components/etke.cc/schedules/components/scheduled/ScheduledCommandsList.tsx +++ b/src/components/etke.cc/schedules/components/scheduled/ScheduledCommandsList.tsx @@ -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 = () => { { if (!record) { return ""; diff --git a/src/components/media.tsx b/src/components/media.tsx index 3baf49e..7ffa1dd 100644 --- a/src/components/media.tsx +++ b/src/components/media.tsx @@ -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(); diff --git a/src/components/user-import/ConflictModeCard.tsx b/src/components/user-import/ConflictModeCard.tsx index 3d686ff..c7737c6 100644 --- a/src/components/user-import/ConflictModeCard.tsx +++ b/src/components/user-import/ConflictModeCard.tsx @@ -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; conflictMode: string; progress: Progress; diff --git a/src/components/user-import/StatsCard.tsx b/src/components/user-import/StatsCard.tsx index 875393f..c940732 100644 --- a/src/components/user-import/StatsCard.tsx +++ b/src/components/user-import/StatsCard.tsx @@ -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; diff --git a/src/components/user-import/UploadCard.tsx b/src/components/user-import/UploadCard.tsx index aff709d..21ea2dc 100644 --- a/src/components/user-import/UploadCard.tsx +++ b/src/components/user-import/UploadCard.tsx @@ -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; progress: Progress; }) => { diff --git a/src/components/user-import/useImportFile.tsx b/src/components/user-import/useImportFile.tsx index 0d4a2fa..19ae0ab 100644 --- a/src/components/user-import/useImportFile.tsx +++ b/src/components/user-import/useImportFile.tsx @@ -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"); diff --git a/src/pages/LoginPage.test.tsx b/src/pages/LoginPage.test.tsx index 6ec36ce..88454d1 100644 --- a/src/pages/LoginPage.test.tsx +++ b/src/pages/LoginPage.test.tsx @@ -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 () => { diff --git a/src/pages/LoginPage.tsx b/src/pages/LoginPage.tsx index 5886f4b..360aee4 100644 --- a/src/pages/LoginPage.tsx +++ b/src/pages/LoginPage.tsx @@ -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(""); } diff --git a/src/resources/destinations.tsx b/src/resources/destinations.tsx index fe7f04c..e0a8102 100644 --- a/src/resources/destinations.tsx +++ b/src/resources/destinations.tsx @@ -114,7 +114,6 @@ const destinationFieldRender = (record: RaRecord) => { }; export const DestinationList = (props: ListProps) => { - const record = useRecordContext(props); return ( { 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 ( } title={}> diff --git a/src/resources/user_media_statistics.tsx b/src/resources/user_media_statistics.tsx index fcf678e..919211f 100644 --- a/src/resources/user_media_statistics.tsx +++ b/src/resources/user_media_statistics.tsx @@ -1,6 +1,5 @@ import PermMediaIcon from "@mui/icons-material/PermMedia"; import { - Datagrid, DatagridConfigurable, ExportButton, List, diff --git a/src/resources/users.tsx b/src/resources/users.tsx index 57a7b3f..0f32b5b 100644 --- a/src/resources/users.tsx +++ b/src/resources/users.tsx @@ -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( ); + /* eslint-disable-next-line @typescript-eslint/no-explicit-any */ const [formData, setFormData] = useState>({}); 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) => { setFormData(data); if (!userIsAvailable) { diff --git a/src/synapse/dataProvider.ts b/src/synapse/dataProvider.ts index 62edd6c..2dad72c 100644 --- a/src/synapse/dataProvider.ts +++ b/src/synapse/dataProvider.ts @@ -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 = {}; // 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) => { - 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; -} - 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, dataProvider: DataProvider) => { + beforeDelete: async (params: DeleteParams, _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, dataProvider: DataProvider) => { + beforeDeleteMany: async (params: DeleteManyParams, _dataProvider: DataProvider) => { await Promise.all( params.ids.map(async id => { if (params.meta?.deleteMedia) { diff --git a/src/synapse/matrix.ts b/src/synapse/matrix.ts index 2b51e0f..a1e45cb 100644 --- a/src/synapse/matrix.ts +++ b/src/synapse/matrix.ts @@ -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 = /^@(?[a-zA-Z0-9._=\-/]+):(?[a-zA-Z0-9\-.]+\.[a-zA-Z]+)$/; diff --git a/src/utils/config.ts b/src/utils/config.ts index 5fee21f..6193418 100644 --- a/src/utils/config.ts +++ b/src/utils/config.ts @@ -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[]; } diff --git a/src/utils/decodeURLComponent.ts b/src/utils/decodeURLComponent.ts index 851ca20..c7ec27d 100644 --- a/src/utils/decodeURLComponent.ts +++ b/src/utils/decodeURLComponent.ts @@ -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; } };