From d88c6027fe3accf7a6872ada8aa2724d30bf691c Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Mon, 8 Dec 2025 16:52:25 +0100 Subject: [PATCH] fix(deps): update dependency typescript-eslint to ^8.48.1 (#4438) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> Co-authored-by: Meier Lukas --- .../[locale]/init/_steps/group/init-group.tsx | 9 +- .../init/_steps/settings/init-settings.tsx | 12 +- .../init/_steps/user/init-user-form.tsx | 8 +- .../_components/board-card-menu-dropdown.tsx | 3 - .../new/_integration-new-form.tsx | 10 +- .../_components/remove-certificate.tsx | 9 +- .../hostnames/_components/remove-hostname.tsx | 9 +- .../manage/tools/docker/docker-table.tsx | 9 +- .../_components/_profile-avatar-form.tsx | 15 +- .../groups/[id]/_transfer-group-ownership.tsx | 9 +- .../manage/users/groups/_groups-table.tsx | 9 +- .../src/upload-media/upload-media.tsx | 25 +-- .../quick-add-app/quick-add-app-modal.tsx | 7 +- .../src/boards/duplicate-board-modal.tsx | 12 +- .../src/boards/import-board-modal.tsx | 9 +- .../certificates/add-certificate-modal.tsx | 9 +- .../src/components/initial/token-modal.tsx | 4 +- .../widgets/src/_inputs/widget-app-input.tsx | 8 +- packages/widgets/src/docker/component.tsx | 13 +- pnpm-lock.yaml | 143 +++++++++--------- tooling/eslint/package.json | 2 +- 21 files changed, 180 insertions(+), 154 deletions(-) diff --git a/apps/nextjs/src/app/[locale]/init/_steps/group/init-group.tsx b/apps/nextjs/src/app/[locale]/init/_steps/group/init-group.tsx index d423c2fce..0a91d4ced 100644 --- a/apps/nextjs/src/app/[locale]/init/_steps/group/init-group.tsx +++ b/apps/nextjs/src/app/[locale]/init/_steps/group/init-group.tsx @@ -12,7 +12,11 @@ import { groupCreateSchema } from "@homarr/validation/group"; export const InitGroup = () => { const t = useI18n(); - const { mutateAsync } = clientApi.group.createInitialExternalGroup.useMutation(); + const { mutateAsync } = clientApi.group.createInitialExternalGroup.useMutation({ + async onSuccess() { + await revalidatePathActionAsync("/init"); + }, + }); const form = useZodForm(groupCreateSchema, { initialValues: { name: "", @@ -21,9 +25,6 @@ export const InitGroup = () => { const handleSubmitAsync = async (values: z.infer) => { await mutateAsync(values, { - async onSuccess() { - await revalidatePathActionAsync("/init"); - }, onError(error) { if (error.data?.code === "CONFLICT") { form.setErrors({ name: t("common.zod.errors.custom.groupNameTaken") }); diff --git a/apps/nextjs/src/app/[locale]/init/_steps/settings/init-settings.tsx b/apps/nextjs/src/app/[locale]/init/_steps/settings/init-settings.tsx index b5839b743..08e3e0c2d 100644 --- a/apps/nextjs/src/app/[locale]/init/_steps/settings/init-settings.tsx +++ b/apps/nextjs/src/app/[locale]/init/_steps/settings/init-settings.tsx @@ -17,7 +17,11 @@ import { settingsInitSchema } from "@homarr/validation/settings"; export const InitSettings = () => { const tSection = useScopedI18n("management.page.settings.section"); const t = useI18n(); - const { mutateAsync } = clientApi.serverSettings.initSettings.useMutation(); + const { mutateAsync } = clientApi.serverSettings.initSettings.useMutation({ + async onSuccess() { + await revalidatePathActionAsync("/init"); + }, + }); const form = useZodForm(settingsInitSchema, { initialValues: defaultServerSettings }); form.watch("analytics.enableGeneral", ({ value }) => { @@ -31,11 +35,7 @@ export const InitSettings = () => { }); const handleSubmitAsync = async (values: z.infer) => { - await mutateAsync(values, { - async onSuccess() { - await revalidatePathActionAsync("/init"); - }, - }); + await mutateAsync(values); }; return ( diff --git a/apps/nextjs/src/app/[locale]/init/_steps/user/init-user-form.tsx b/apps/nextjs/src/app/[locale]/init/_steps/user/init-user-form.tsx index daf73f7b3..3a659032f 100644 --- a/apps/nextjs/src/app/[locale]/init/_steps/user/init-user-form.tsx +++ b/apps/nextjs/src/app/[locale]/init/_steps/user/init-user-form.tsx @@ -26,19 +26,19 @@ export const InitUserForm = () => { const handleSubmitAsync = async (values: FormType) => { await mutateAsync(values, { - async onSuccess() { + onSuccess() { showSuccessNotification({ title: tUser("notification.success.title"), message: tUser("notification.success.message"), }); - await signIn("credentials", { + void signIn("credentials", { name: values.username, password: values.password, redirect: false, + }).then(async () => { + await revalidatePathActionAsync("/init"); }); - - await revalidatePathActionAsync("/init"); }, onError: (error) => { showErrorNotification({ diff --git a/apps/nextjs/src/app/[locale]/manage/boards/_components/board-card-menu-dropdown.tsx b/apps/nextjs/src/app/[locale]/manage/boards/_components/board-card-menu-dropdown.tsx index 4c918f9ef..e5ae194af 100644 --- a/apps/nextjs/src/app/[locale]/manage/boards/_components/board-card-menu-dropdown.tsx +++ b/apps/nextjs/src/app/[locale]/manage/boards/_components/board-card-menu-dropdown.tsx @@ -84,9 +84,6 @@ export const BoardCardMenuDropdown = ({ board }: BoardCardMenuDropdownProps) => id: board.id, name: board.name, }, - onSuccess: async () => { - await revalidatePathActionAsync("/manage/boards"); - }, }); }, [board.id, board.name, openDuplicateModal]); diff --git a/apps/nextjs/src/app/[locale]/manage/integrations/new/_integration-new-form.tsx b/apps/nextjs/src/app/[locale]/manage/integrations/new/_integration-new-form.tsx index 1152174a4..016b9336c 100644 --- a/apps/nextjs/src/app/[locale]/manage/integrations/new/_integration-new-form.tsx +++ b/apps/nextjs/src/app/[locale]/manage/integrations/new/_integration-new-form.tsx @@ -86,7 +86,11 @@ export const NewIntegrationForm = ({ searchParams }: NewIntegrationFormProps) => }, }); - const { mutateAsync: createIntegrationAsync, isPending } = clientApi.integration.create.useMutation(); + const { mutateAsync: createIntegrationAsync, isPending } = clientApi.integration.create.useMutation({ + async onSuccess() { + await revalidatePathActionAsync("/manage/integrations"); + }, + }); const [error, setError] = useState(null); const handleSubmitAsync = async ({ appId, appHref, hasApp, ...values }: FormType) => { @@ -116,7 +120,7 @@ export const NewIntegrationForm = ({ searchParams }: NewIntegrationFormProps) => app, }, { - async onSuccess(data) { + onSuccess(data) { // We do it this way as we are unable to send a typesafe error through onError if (data?.error) { setError(data.error); @@ -132,7 +136,7 @@ export const NewIntegrationForm = ({ searchParams }: NewIntegrationFormProps) => message: t("integration.page.create.notification.success.message"), }); - await revalidatePathActionAsync("/manage/integrations").then(() => router.push("/manage/integrations")); + router.push("/manage/integrations"); }, onError: () => { showErrorNotification({ diff --git a/apps/nextjs/src/app/[locale]/manage/tools/certificates/_components/remove-certificate.tsx b/apps/nextjs/src/app/[locale]/manage/tools/certificates/_components/remove-certificate.tsx index 04e1c7613..ca45aefb3 100644 --- a/apps/nextjs/src/app/[locale]/manage/tools/certificates/_components/remove-certificate.tsx +++ b/apps/nextjs/src/app/[locale]/manage/tools/certificates/_components/remove-certificate.tsx @@ -15,7 +15,11 @@ interface RemoveCertificateProps { export const RemoveCertificate = ({ fileName }: RemoveCertificateProps) => { const { openConfirmModal } = useConfirmModal(); - const { mutateAsync } = clientApi.certificates.removeCertificate.useMutation(); + const { mutateAsync } = clientApi.certificates.removeCertificate.useMutation({ + async onSuccess() { + await revalidatePathActionAsync("/manage/tools/certificates"); + }, + }); const t = useI18n(); const handleClick = () => { @@ -27,12 +31,11 @@ export const RemoveCertificate = ({ fileName }: RemoveCertificateProps) => { await mutateAsync( { fileName }, { - async onSuccess() { + onSuccess() { showSuccessNotification({ title: t("certificate.action.remove.notification.success.title"), message: t("certificate.action.remove.notification.success.message"), }); - await revalidatePathActionAsync("/manage/tools/certificates"); }, onError() { showErrorNotification({ diff --git a/apps/nextjs/src/app/[locale]/manage/tools/certificates/hostnames/_components/remove-hostname.tsx b/apps/nextjs/src/app/[locale]/manage/tools/certificates/hostnames/_components/remove-hostname.tsx index d0004c849..445a301b2 100644 --- a/apps/nextjs/src/app/[locale]/manage/tools/certificates/hostnames/_components/remove-hostname.tsx +++ b/apps/nextjs/src/app/[locale]/manage/tools/certificates/hostnames/_components/remove-hostname.tsx @@ -15,7 +15,11 @@ interface RemoveHostnameActionIconProps { } export const RemoveHostnameActionIcon = (input: RemoveHostnameActionIconProps) => { - const { mutateAsync } = clientApi.certificates.removeTrustedHostname.useMutation(); + const { mutateAsync } = clientApi.certificates.removeTrustedHostname.useMutation({ + async onSuccess() { + await revalidatePathActionAsync("/manage/tools/certificates/hostnames"); + }, + }); const { openConfirmModal } = useConfirmModal(); const t = useI18n(); @@ -26,8 +30,7 @@ export const RemoveHostnameActionIcon = (input: RemoveHostnameActionIconProps) = // eslint-disable-next-line no-restricted-syntax async onConfirm() { await mutateAsync(input, { - async onSuccess() { - await revalidatePathActionAsync("/manage/tools/certificates/hostnames"); + onSuccess() { showSuccessNotification({ title: t("certificate.action.removeHostname.notification.success.title"), message: t("certificate.action.removeHostname.notification.success.message"), diff --git a/apps/nextjs/src/app/[locale]/manage/tools/docker/docker-table.tsx b/apps/nextjs/src/app/[locale]/manage/tools/docker/docker-table.tsx index 0db5d2116..ce087bf7d 100644 --- a/apps/nextjs/src/app/[locale]/manage/tools/docker/docker-table.tsx +++ b/apps/nextjs/src/app/[locale]/manage/tools/docker/docker-table.tsx @@ -206,15 +206,16 @@ const ContainerActionBarButton = (props: ContainerActionBarButtonProps) => { const t = useScopedI18n("docker.action"); const utils = clientApi.useUtils(); - const { mutateAsync, isPending } = clientApi.docker[`${props.action}All`].useMutation(); + const { mutateAsync, isPending } = clientApi.docker[`${props.action}All`].useMutation({ + async onSettled() { + await utils.docker.getContainers.invalidate(); + }, + }); const handleClickAsync = async () => { await mutateAsync( { ids: props.selectedIds }, { - async onSettled() { - await utils.docker.getContainers.invalidate(); - }, onSuccess() { showSuccessNotification({ title: t(`${props.action}.notification.success.title`), diff --git a/apps/nextjs/src/app/[locale]/manage/users/[userId]/general/_components/_profile-avatar-form.tsx b/apps/nextjs/src/app/[locale]/manage/users/[userId]/general/_components/_profile-avatar-form.tsx index 485bffdf5..e4ee64583 100644 --- a/apps/nextjs/src/app/[locale]/manage/users/[userId]/general/_components/_profile-avatar-form.tsx +++ b/apps/nextjs/src/app/[locale]/manage/users/[userId]/general/_components/_profile-avatar-form.tsx @@ -18,7 +18,12 @@ interface UserProfileAvatarForm { } export const UserProfileAvatarForm = ({ user }: UserProfileAvatarForm) => { - const { mutate } = clientApi.user.setProfileImage.useMutation(); + const { mutate } = clientApi.user.setProfileImage.useMutation({ + async onSuccess() { + // Revalidate all as the avatar is used in multiple places + await revalidatePathActionAsync("/"); + }, + }); const [opened, { toggle }] = useDisclosure(false); const { openConfirmModal } = useConfirmModal(); const t = useI18n(); @@ -38,9 +43,7 @@ export const UserProfileAvatarForm = ({ user }: UserProfileAvatarForm) => { image: base64Url, }, { - async onSuccess() { - // Revalidate all as the avatar is used in multiple places - await revalidatePathActionAsync("/"); + onSuccess() { showSuccessNotification({ message: tManageAvatar("changeImage.notification.success.message"), }); @@ -74,9 +77,7 @@ export const UserProfileAvatarForm = ({ user }: UserProfileAvatarForm) => { image: null, }, { - async onSuccess() { - // Revalidate all as the avatar is used in multiple places - await revalidatePathActionAsync("/"); + onSuccess() { showSuccessNotification({ message: tManageAvatar("removeImage.notification.success.message"), }); diff --git a/apps/nextjs/src/app/[locale]/manage/users/groups/[id]/_transfer-group-ownership.tsx b/apps/nextjs/src/app/[locale]/manage/users/groups/[id]/_transfer-group-ownership.tsx index 9074c9ecf..a9fd0bd4f 100644 --- a/apps/nextjs/src/app/[locale]/manage/users/groups/[id]/_transfer-group-ownership.tsx +++ b/apps/nextjs/src/app/[locale]/manage/users/groups/[id]/_transfer-group-ownership.tsx @@ -25,7 +25,11 @@ export const TransferGroupOwnership = ({ group }: TransferGroupOwnershipProps) = const [innerOwnerId, setInnerOwnerId] = useState(group.ownerId); const { openModal } = useModalAction(UserSelectModal); const { openConfirmModal } = useConfirmModal(); - const { mutateAsync } = clientApi.group.transferOwnership.useMutation(); + const { mutateAsync } = clientApi.group.transferOwnership.useMutation({ + async onSuccess() { + await revalidatePathActionAsync(`/manage/users/groups/${group.id}`); + }, + }); const handleTransfer = useCallback(() => { openModal( @@ -47,7 +51,7 @@ export const TransferGroupOwnership = ({ group }: TransferGroupOwnershipProps) = userId: id, }, { - async onSuccess() { + onSuccess() { setInnerOwnerId(id); showSuccessNotification({ title: tRoot("common.notification.transfer.success"), @@ -56,7 +60,6 @@ export const TransferGroupOwnership = ({ group }: TransferGroupOwnershipProps) = user: name, }), }); - await revalidatePathActionAsync(`/manage/users/groups/${group.id}`); }, onError() { showErrorNotification({ diff --git a/apps/nextjs/src/app/[locale]/manage/users/groups/_groups-table.tsx b/apps/nextjs/src/app/[locale]/manage/users/groups/_groups-table.tsx index 2dcfb21a2..c03c8cddc 100644 --- a/apps/nextjs/src/app/[locale]/manage/users/groups/_groups-table.tsx +++ b/apps/nextjs/src/app/[locale]/manage/users/groups/_groups-table.tsx @@ -56,16 +56,19 @@ export const GroupsTable = ({ groups, initialGroupIds, hasFilter }: GroupsTableP () => initialGroupIds.some((groupId, index) => groupIds.indexOf(groupId) !== index), [groupIds, initialGroupIds], ); - const { mutateAsync, isPending } = clientApi.group.savePositions.useMutation(); + const { mutateAsync, isPending } = clientApi.group.savePositions.useMutation({ + async onSuccess() { + await revalidatePathActionAsync("/manage/users/groups"); + }, + }); const handleSavePositionsAsync = async () => { await mutateAsync( { positions: groupIds }, { - async onSuccess() { + onSuccess() { showSuccessNotification({ message: t("group.action.changePosition.notification.success.message"), }); - await revalidatePathActionAsync("/manage/users/groups"); }, onError() { showSuccessNotification({ diff --git a/packages/forms-collection/src/upload-media/upload-media.tsx b/packages/forms-collection/src/upload-media/upload-media.tsx index 1a0779259..9da7a52d1 100644 --- a/packages/forms-collection/src/upload-media/upload-media.tsx +++ b/packages/forms-collection/src/upload-media/upload-media.tsx @@ -16,7 +16,19 @@ interface UploadMediaProps { export const UploadMedia = ({ children, onSettled, onSuccess, multiple = false }: UploadMediaProps) => { const t = useI18n(); - const { mutateAsync, isPending } = clientApi.media.uploadMedia.useMutation(); + const { mutateAsync, isPending } = clientApi.media.uploadMedia.useMutation({ + async onSuccess(mediaIds) { + await onSuccess?.( + mediaIds.map((id) => ({ + id, + url: `/api/user-medias/${id}`, + })), + ); + }, + async onSettled() { + await onSettled?.(); + }, + }); const handleFileUploadAsync = async (files: File[] | File | null) => { if (!files || (Array.isArray(files) && files.length === 0)) return; @@ -24,25 +36,16 @@ export const UploadMedia = ({ children, onSettled, onSuccess, multiple = false } const formData = new FormData(); filesArray.forEach((file) => formData.append("files", file)); await mutateAsync(formData, { - async onSuccess(mediaIds) { + onSuccess() { showSuccessNotification({ message: t("media.action.upload.notification.success.message"), }); - await onSuccess?.( - mediaIds.map((id) => ({ - id, - url: `/api/user-medias/${id}`, - })), - ); }, onError() { showErrorNotification({ message: t("media.action.upload.notification.error.message"), }); }, - async onSettled() { - await onSettled?.(); - }, }); }; diff --git a/packages/modals-collection/src/apps/quick-add-app/quick-add-app-modal.tsx b/packages/modals-collection/src/apps/quick-add-app/quick-add-app-modal.tsx index 500e8540b..617bf6403 100644 --- a/packages/modals-collection/src/apps/quick-add-app/quick-add-app-modal.tsx +++ b/packages/modals-collection/src/apps/quick-add-app/quick-add-app-modal.tsx @@ -2,7 +2,6 @@ import type { z } from "zod/v4"; import type { RouterOutputs } from "@homarr/api"; import { clientApi } from "@homarr/api/client"; -import type { MaybePromise } from "@homarr/common/types"; import { AppForm } from "@homarr/forms-collection"; import { createModal } from "@homarr/modals"; import { showErrorNotification, showSuccessNotification } from "@homarr/notifications"; @@ -10,7 +9,7 @@ import { useI18n, useScopedI18n } from "@homarr/translation/client"; import type { appManageSchema } from "@homarr/validation/app"; interface QuickAddAppModalProps { - onClose: (createdApp: Omit) => MaybePromise; + onClose: (createdApp: Omit) => void; } export const QuickAddAppModal = createModal(({ actions, innerProps }) => { @@ -28,13 +27,13 @@ export const QuickAddAppModal = createModal(({ actions, i const handleSubmit = (values: z.infer) => { mutate(values, { - async onSuccess(app) { + onSuccess(app) { showSuccessNotification({ title: tScoped("success.title"), message: tScoped("success.message"), }); - await innerProps.onClose(app); + innerProps.onClose(app); actions.closeModal(); }, }); diff --git a/packages/modals-collection/src/boards/duplicate-board-modal.tsx b/packages/modals-collection/src/boards/duplicate-board-modal.tsx index 441e16edf..85cfaed17 100644 --- a/packages/modals-collection/src/boards/duplicate-board-modal.tsx +++ b/packages/modals-collection/src/boards/duplicate-board-modal.tsx @@ -1,7 +1,7 @@ import { Button, Group, Stack, Text, TextInput } from "@mantine/core"; import { clientApi } from "@homarr/api/client"; -import type { MaybePromise } from "@homarr/common/types"; +import { revalidatePathActionAsync } from "@homarr/common/client"; import { useZodForm } from "@homarr/form"; import { showErrorNotification, showSuccessNotification } from "@homarr/notifications"; import { useI18n } from "@homarr/translation/client"; @@ -15,7 +15,6 @@ interface InnerProps { id: string; name: string; }; - onSuccess: () => MaybePromise; } export const DuplicateBoardModal = createModal(({ actions, innerProps }) => { @@ -27,7 +26,11 @@ export const DuplicateBoardModal = createModal(({ actions, innerProp }, }); const boardNameStatus = useBoardNameStatus(form.values.name); - const { mutateAsync, isPending } = clientApi.board.duplicateBoard.useMutation(); + const { mutateAsync, isPending } = clientApi.board.duplicateBoard.useMutation({ + async onSuccess() { + await revalidatePathActionAsync("/manage/boards"); + }, + }); return (
(({ actions, innerProp id: innerProps.board.id, }, { - async onSuccess() { + onSuccess() { actions.closeModal(); showSuccessNotification({ title: t("board.action.duplicate.notification.success.title"), message: t("board.action.duplicate.notification.success.message"), }); - await innerProps.onSuccess(); }, onError() { showErrorNotification({ diff --git a/packages/modals-collection/src/boards/import-board-modal.tsx b/packages/modals-collection/src/boards/import-board-modal.tsx index 1fd5cbfdf..3ddbd8324 100644 --- a/packages/modals-collection/src/boards/import-board-modal.tsx +++ b/packages/modals-collection/src/boards/import-board-modal.tsx @@ -65,7 +65,11 @@ export const ImportBoardModal = createModal(({ actions }) => { }, ); - const { mutateAsync, isPending } = clientApi.board.importOldmarrConfig.useMutation(); + const { mutateAsync, isPending } = clientApi.board.importOldmarrConfig.useMutation({ + async onSuccess() { + await revalidatePathActionAsync("/manage/boards"); + }, + }); const boardNameStatus = useBoardNameStatus(form.values.configuration.name); const handleSubmitAsync = async (values: { file: File; configuration: OldmarrImportConfiguration }) => { @@ -74,9 +78,8 @@ export const ImportBoardModal = createModal(({ actions }) => { formData.set("configuration", JSON.stringify(values.configuration)); await mutateAsync(formData, { - async onSuccess() { + onSuccess() { actions.closeModal(); - await revalidatePathActionAsync("/manage/boards"); showSuccessNotification({ title: tOldImport("notification.success.title"), message: tOldImport("notification.success.message"), diff --git a/packages/modals-collection/src/certificates/add-certificate-modal.tsx b/packages/modals-collection/src/certificates/add-certificate-modal.tsx index 100ee13cd..b414d0c6a 100644 --- a/packages/modals-collection/src/certificates/add-certificate-modal.tsx +++ b/packages/modals-collection/src/certificates/add-certificate-modal.tsx @@ -27,7 +27,11 @@ export const AddCertificateModal = createModal(({ actions, innerProp }, }, ); - const { mutateAsync } = clientApi.certificates.addCertificate.useMutation(); + const { mutateAsync } = clientApi.certificates.addCertificate.useMutation({ + async onSuccess() { + await innerProps.onSuccess?.(); + }, + }); return ( (({ actions, innerProp const formData = new FormData(); formData.set("file", values.file); await mutateAsync(formData, { - async onSuccess() { + onSuccess() { showSuccessNotification({ title: t("certificate.action.create.notification.success.title"), message: t("certificate.action.create.notification.success.message"), }); - await innerProps.onSuccess?.(); actions.closeModal(); }, onError() { diff --git a/packages/old-import/src/components/initial/token-modal.tsx b/packages/old-import/src/components/initial/token-modal.tsx index d519d312f..0bc5920f5 100644 --- a/packages/old-import/src/components/initial/token-modal.tsx +++ b/packages/old-import/src/components/initial/token-modal.tsx @@ -29,10 +29,10 @@ export const ImportTokenModal = createModal(({ actions, innerProps } mutate( { checksum: innerProps.checksum, token: values.token }, { - async onSuccess(isValid) { + onSuccess(isValid) { if (isValid) { actions.closeModal(); - await innerProps.onSuccessAsync(values.token); + void innerProps.onSuccessAsync(values.token); } else { showErrorNotification({ title: tTokenModal("notification.error.title"), diff --git a/packages/widgets/src/_inputs/widget-app-input.tsx b/packages/widgets/src/_inputs/widget-app-input.tsx index 2138258c2..4640a7889 100644 --- a/packages/widgets/src/_inputs/widget-app-input.tsx +++ b/packages/widgets/src/_inputs/widget-app-input.tsx @@ -69,10 +69,10 @@ export const WidgetAppInput = ({ property, kind }: CommonWidgetInputProps<"app"> variant="default" onClick={() => openModal({ - // eslint-disable-next-line no-restricted-syntax - async onClose(createdAppId) { - await refetch(); - form.setFieldValue(`options.${property}`, createdAppId); + onClose(createdAppId) { + void refetch().then(() => { + form.setFieldValue(`options.${property}`, createdAppId); + }); }, }) } diff --git a/packages/widgets/src/docker/component.tsx b/packages/widgets/src/docker/component.tsx index a17d365ee..0687b7f18 100644 --- a/packages/widgets/src/docker/component.tsx +++ b/packages/widgets/src/docker/component.tsx @@ -111,9 +111,13 @@ const createColumns = ( header: t("action.title"), Cell({ row }) { const utils = clientApi.useUtils(); - const { mutateAsync: startContainer } = clientApi.docker.startAll.useMutation(); - const { mutateAsync: stopContainer } = clientApi.docker.stopAll.useMutation(); - const { mutateAsync: restartContainer } = clientApi.docker.restartAll.useMutation(); + // eslint-disable-next-line no-restricted-syntax + const onSettled = async () => { + await utils.docker.getContainers.invalidate(); + }; + const { mutateAsync: startContainer } = clientApi.docker.startAll.useMutation({ onSettled }); + const { mutateAsync: stopContainer } = clientApi.docker.stopAll.useMutation({ onSettled }); + const { mutateAsync: restartContainer } = clientApi.docker.restartAll.useMutation({ onSettled }); const handleActionAsync = async (action: "start" | "stop" | "restart") => { const mutation = action === "start" ? startContainer : action === "stop" ? stopContainer : restartContainer; @@ -121,9 +125,6 @@ const createColumns = ( await mutation( { ids: [row.original.id] }, { - async onSettled() { - await utils.docker.getContainers.invalidate(); - }, onSuccess() { showSuccessNotification({ title: t(`action.${action}.notification.success.title`), diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 50951fd17..d52d13771 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2421,7 +2421,7 @@ importers: version: 2.6.1(eslint@9.39.1)(turbo@2.6.1) eslint-plugin-import: specifier: ^2.32.0 - version: 2.32.0(@typescript-eslint/parser@8.46.2(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1) + version: 2.32.0(@typescript-eslint/parser@8.48.1(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1) eslint-plugin-jsx-a11y: specifier: ^6.10.2 version: 6.10.2(eslint@9.39.1) @@ -2432,8 +2432,8 @@ importers: specifier: ^6.1.1 version: 6.1.1(eslint@9.39.1) typescript-eslint: - specifier: ^8.46.2 - version: 8.46.2(eslint@9.39.1)(typescript@5.9.3) + specifier: ^8.48.1 + version: 8.48.1(eslint@9.39.1)(typescript@5.9.3) devDependencies: '@homarr/prettier-config': specifier: workspace:^0.1.0 @@ -5061,63 +5061,63 @@ packages: '@types/xml2js@0.4.14': resolution: {integrity: sha512-4YnrRemBShWRO2QjvUin8ESA41rH+9nQGLUGZV/1IDhi3SL9OhdpNC/MrulTWuptXKwhx/aDxE7toV0f/ypIXQ==} - '@typescript-eslint/eslint-plugin@8.46.2': - resolution: {integrity: sha512-ZGBMToy857/NIPaaCucIUQgqueOiq7HeAKkhlvqVV4lm089zUFW6ikRySx2v+cAhKeUCPuWVHeimyk6Dw1iY3w==} + '@typescript-eslint/eslint-plugin@8.48.1': + resolution: {integrity: sha512-X63hI1bxl5ohelzr0LY5coufyl0LJNthld+abwxpCoo6Gq+hSqhKwci7MUWkXo67mzgUK6YFByhmaHmUcuBJmA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.46.2 + '@typescript-eslint/parser': ^8.48.1 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.46.2': - resolution: {integrity: sha512-BnOroVl1SgrPLywqxyqdJ4l3S2MsKVLDVxZvjI1Eoe8ev2r3kGDo+PcMihNmDE+6/KjkTubSJnmqGZZjQSBq/g==} + '@typescript-eslint/parser@8.48.1': + resolution: {integrity: sha512-PC0PDZfJg8sP7cmKe6L3QIL8GZwU5aRvUFedqSIpw3B+QjRSUZeeITC2M5XKeMXEzL6wccN196iy3JLwKNvDVA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.46.2': - resolution: {integrity: sha512-PULOLZ9iqwI7hXcmL4fVfIsBi6AN9YxRc0frbvmg8f+4hQAjQ5GYNKK0DIArNo+rOKmR/iBYwkpBmnIwin4wBg==} + '@typescript-eslint/project-service@8.48.1': + resolution: {integrity: sha512-HQWSicah4s9z2/HifRPQ6b6R7G+SBx64JlFQpgSSHWPKdvCZX57XCbszg/bapbRsOEv42q5tayTYcEFpACcX1w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@8.46.2': - resolution: {integrity: sha512-LF4b/NmGvdWEHD2H4MsHD8ny6JpiVNDzrSZr3CsckEgCbAGZbYM4Cqxvi9L+WqDMT+51Ozy7lt2M+d0JLEuBqA==} + '@typescript-eslint/scope-manager@8.48.1': + resolution: {integrity: sha512-rj4vWQsytQbLxC5Bf4XwZ0/CKd362DkWMUkviT7DCS057SK64D5lH74sSGzhI6PDD2HCEq02xAP9cX68dYyg1w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.46.2': - resolution: {integrity: sha512-a7QH6fw4S57+F5y2FIxxSDyi5M4UfGF+Jl1bCGd7+L4KsaUY80GsiF/t0UoRFDHAguKlBaACWJRmdrc6Xfkkag==} + '@typescript-eslint/tsconfig-utils@8.48.1': + resolution: {integrity: sha512-k0Jhs4CpEffIBm6wPaCXBAD7jxBtrHjrSgtfCjUvPp9AZ78lXKdTR8fxyZO5y4vWNlOvYXRtngSZNSn+H53Jkw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.46.2': - resolution: {integrity: sha512-HbPM4LbaAAt/DjxXaG9yiS9brOOz6fabal4uvUmaUYe6l3K1phQDMQKBRUrr06BQkxkvIZVVHttqiybM9nJsLA==} + '@typescript-eslint/type-utils@8.48.1': + resolution: {integrity: sha512-1jEop81a3LrJQLTf/1VfPQdhIY4PlGDBc/i67EVWObrtvcziysbLN3oReexHOM6N3jyXgCrkBsZpqwH0hiDOQg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@8.46.2': - resolution: {integrity: sha512-lNCWCbq7rpg7qDsQrd3D6NyWYu+gkTENkG5IKYhUIcxSb59SQC/hEQ+MrG4sTgBVghTonNWq42bA/d4yYumldQ==} + '@typescript-eslint/types@8.48.1': + resolution: {integrity: sha512-+fZ3LZNeiELGmimrujsDCT4CRIbq5oXdHe7chLiW8qzqyPMnn1puNstCrMNVAqwcl2FdIxkuJ4tOs/RFDBVc/Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.46.2': - resolution: {integrity: sha512-f7rW7LJ2b7Uh2EiQ+7sza6RDZnajbNbemn54Ob6fRwQbgcIn+GWfyuHDHRYgRoZu1P4AayVScrRW+YfbTvPQoQ==} + '@typescript-eslint/typescript-estree@8.48.1': + resolution: {integrity: sha512-/9wQ4PqaefTK6POVTjJaYS0bynCgzh6ClJHGSBj06XEHjkfylzB+A3qvyaXnErEZSaxhIo4YdyBgq6j4RysxDg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.46.2': - resolution: {integrity: sha512-sExxzucx0Tud5tE0XqR0lT0psBQvEpnpiul9XbGUB1QwpWJJAps1O/Z7hJxLGiZLBKMCutjTzDgmd1muEhBnVg==} + '@typescript-eslint/utils@8.48.1': + resolution: {integrity: sha512-fAnhLrDjiVfey5wwFRwrweyRlCmdz5ZxXz2G/4cLn0YDLjTapmN4gcCsTBR1N2rWnZSDeWpYtgLDsJt+FpmcwA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@8.46.2': - resolution: {integrity: sha512-tUFMXI4gxzzMXt4xpGJEsBsTox0XbNQ1y94EwlD/CuZwFcQP79xfQqMhau9HsRc/J0cAPA/HZt1dZPtGn9V/7w==} + '@typescript-eslint/visitor-keys@8.48.1': + resolution: {integrity: sha512-BmxxndzEWhE4TIEEMBs8lP3MBWN3jFPs/p6gPm/wkv02o41hI6cq9AuSmGAaTTHPtA1FTi2jBre4A9rm5ZmX+Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@umami/node@0.4.0': @@ -10565,8 +10565,8 @@ packages: types-ramda@0.30.1: resolution: {integrity: sha512-1HTsf5/QVRmLzcGfldPFvkVsAdi1db1BBKzi7iW3KBUlOICg/nKnFS+jGqDJS3YD8VsWbAh7JiHeBvbsw8RPxA==} - typescript-eslint@8.46.2: - resolution: {integrity: sha512-vbw8bOmiuYNdzzV3lsiWv6sRwjyuKJMQqWulBOU7M0RrxedXledX8G8kBbQeiOYDnTfiXz0Y4081E1QMNB6iQg==} + typescript-eslint@8.48.1: + resolution: {integrity: sha512-FbOKN1fqNoXp1hIl5KYpObVrp0mCn+CLgn479nmu2IsRMrx2vyv74MmsBLVlhg8qVwNFGbXSp8fh1zp8pEoC2A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -14090,14 +14090,14 @@ snapshots: dependencies: '@types/node': 24.10.1 - '@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.48.1(@typescript-eslint/parser@8.48.1(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.46.2(eslint@9.39.1)(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.46.2 - '@typescript-eslint/type-utils': 8.46.2(eslint@9.39.1)(typescript@5.9.3) - '@typescript-eslint/utils': 8.46.2(eslint@9.39.1)(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.46.2 + '@typescript-eslint/parser': 8.48.1(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.48.1 + '@typescript-eslint/type-utils': 8.48.1(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/utils': 8.48.1(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.48.1 eslint: 9.39.1 graphemer: 1.4.0 ignore: 7.0.4 @@ -14107,41 +14107,41 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.46.2(eslint@9.39.1)(typescript@5.9.3)': + '@typescript-eslint/parser@8.48.1(eslint@9.39.1)(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.46.2 - '@typescript-eslint/types': 8.46.2 - '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.46.2 + '@typescript-eslint/scope-manager': 8.48.1 + '@typescript-eslint/types': 8.48.1 + '@typescript-eslint/typescript-estree': 8.48.1(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.48.1 debug: 4.4.3 eslint: 9.39.1 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.46.2(typescript@5.9.3)': + '@typescript-eslint/project-service@8.48.1(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.9.3) - '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/tsconfig-utils': 8.48.1(typescript@5.9.3) + '@typescript-eslint/types': 8.48.1 debug: 4.4.3 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.46.2': + '@typescript-eslint/scope-manager@8.48.1': dependencies: - '@typescript-eslint/types': 8.46.2 - '@typescript-eslint/visitor-keys': 8.46.2 + '@typescript-eslint/types': 8.48.1 + '@typescript-eslint/visitor-keys': 8.48.1 - '@typescript-eslint/tsconfig-utils@8.46.2(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.48.1(typescript@5.9.3)': dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.46.2(eslint@9.39.1)(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.48.1(eslint@9.39.1)(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.46.2 - '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) - '@typescript-eslint/utils': 8.46.2(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/types': 8.48.1 + '@typescript-eslint/typescript-estree': 8.48.1(typescript@5.9.3) + '@typescript-eslint/utils': 8.48.1(eslint@9.39.1)(typescript@5.9.3) debug: 4.4.3 eslint: 9.39.1 ts-api-utils: 2.1.0(typescript@5.9.3) @@ -14149,38 +14149,37 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.46.2': {} + '@typescript-eslint/types@8.48.1': {} - '@typescript-eslint/typescript-estree@8.46.2(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.48.1(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.46.2(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.9.3) - '@typescript-eslint/types': 8.46.2 - '@typescript-eslint/visitor-keys': 8.46.2 + '@typescript-eslint/project-service': 8.48.1(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.48.1(typescript@5.9.3) + '@typescript-eslint/types': 8.48.1 + '@typescript-eslint/visitor-keys': 8.48.1 debug: 4.4.3 - fast-glob: 3.3.2 - is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.7.3 + tinyglobby: 0.2.15 ts-api-utils: 2.1.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.46.2(eslint@9.39.1)(typescript@5.9.3)': + '@typescript-eslint/utils@8.48.1(eslint@9.39.1)(typescript@5.9.3)': dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) - '@typescript-eslint/scope-manager': 8.46.2 - '@typescript-eslint/types': 8.46.2 - '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.48.1 + '@typescript-eslint/types': 8.48.1 + '@typescript-eslint/typescript-estree': 8.48.1(typescript@5.9.3) eslint: 9.39.1 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.46.2': + '@typescript-eslint/visitor-keys@8.48.1': dependencies: - '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/types': 8.48.1 eslint-visitor-keys: 4.2.1 '@umami/node@0.4.0': {} @@ -15988,17 +15987,17 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.46.2(eslint@9.39.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.1): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.48.1(eslint@9.39.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.1): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.46.2(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/parser': 8.48.1(eslint@9.39.1)(typescript@5.9.3) eslint: 9.39.1 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.46.2(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.1(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -16009,7 +16008,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.39.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.46.2(eslint@9.39.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.1) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.48.1(eslint@9.39.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.1) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -16021,7 +16020,7 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.46.2(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/parser': 8.48.1(eslint@9.39.1)(typescript@5.9.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -20508,12 +20507,12 @@ snapshots: dependencies: ts-toolbelt: 9.6.0 - typescript-eslint@8.46.2(eslint@9.39.1)(typescript@5.9.3): + typescript-eslint@8.48.1(eslint@9.39.1)(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3) - '@typescript-eslint/parser': 8.46.2(eslint@9.39.1)(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) - '@typescript-eslint/utils': 8.46.2(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.48.1(@typescript-eslint/parser@8.48.1(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/parser': 8.48.1(eslint@9.39.1)(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.48.1(typescript@5.9.3) + '@typescript-eslint/utils': 8.48.1(eslint@9.39.1)(typescript@5.9.3) eslint: 9.39.1 typescript: 5.9.3 transitivePeerDependencies: diff --git a/tooling/eslint/package.json b/tooling/eslint/package.json index 4840848ab..90c31940b 100644 --- a/tooling/eslint/package.json +++ b/tooling/eslint/package.json @@ -24,7 +24,7 @@ "eslint-plugin-jsx-a11y": "^6.10.2", "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-hooks": "^6.1.1", - "typescript-eslint": "^8.46.2" + "typescript-eslint": "^8.48.1" }, "devDependencies": { "@homarr/prettier-config": "workspace:^0.1.0",