From 286f2f53f74c465f7e3d37857665a359c96b0f85 Mon Sep 17 00:00:00 2001 From: ze0s <43699394+zze0s@users.noreply.github.com> Date: Sun, 16 Apr 2023 18:50:23 +0200 Subject: [PATCH] fix(indexers): test API button (#844) fix(indexers): api test button --- web/index.html | 4 ++-- web/src/App.tsx | 2 +- web/src/forms/filters/FilterAddForm.tsx | 4 ++-- web/src/forms/settings/APIKeyAddForm.tsx | 5 +++-- web/src/forms/settings/DownloadClientForms.tsx | 7 +++++-- web/src/forms/settings/FeedForms.tsx | 5 +++-- web/src/forms/settings/IndexerForms.tsx | 16 ++++++++-------- web/src/forms/settings/IrcForms.tsx | 8 ++++---- web/src/forms/settings/NotificationForms.tsx | 7 +++++-- web/src/screens/Base.tsx | 16 ++++++++-------- web/src/screens/auth/login.tsx | 5 ++--- web/src/screens/filters/details.tsx | 4 ++-- web/src/screens/filters/list.tsx | 8 +------- web/src/screens/settings/Api.tsx | 5 +++-- web/src/screens/settings/Application.tsx | 5 +++-- web/src/screens/settings/DownloadClient.tsx | 3 +-- web/src/screens/settings/Feed.tsx | 2 +- web/src/screens/settings/Irc.tsx | 7 +------ web/src/screens/settings/Logs.tsx | 5 +++-- web/src/screens/settings/Releases.tsx | 6 +++--- 20 files changed, 61 insertions(+), 63 deletions(-) diff --git a/web/index.html b/web/index.html index bac14e6..0ba259d 100644 --- a/web/index.html +++ b/web/index.html @@ -14,8 +14,8 @@ autobrr diff --git a/web/src/App.tsx b/web/src/App.tsx index 92bae96..d1eec6a 100644 --- a/web/src/App.tsx +++ b/web/src/App.tsx @@ -8,7 +8,7 @@ import { AuthContext, SettingsContext } from "./utils/Context"; import { ErrorPage } from "./components/alerts"; import Toast from "./components/notifications/Toast"; -export const queryClient = new QueryClient({ +const queryClient = new QueryClient({ defaultOptions: { queries: { // The retries will have exponential delay. diff --git a/web/src/forms/filters/FilterAddForm.tsx b/web/src/forms/filters/FilterAddForm.tsx index e18bd9a..9b9702b 100644 --- a/web/src/forms/filters/FilterAddForm.tsx +++ b/web/src/forms/filters/FilterAddForm.tsx @@ -1,12 +1,11 @@ import { Fragment } from "react"; -import { useMutation } from "react-query"; +import { useMutation, useQueryClient } from "react-query"; import { toast } from "react-hot-toast"; import { XMarkIcon } from "@heroicons/react/24/solid"; import { Dialog, Transition } from "@headlessui/react"; import type { FieldProps } from "formik"; import { Field, Form, Formik, FormikErrors, FormikValues } from "formik"; -import { queryClient } from "../../App"; import { APIClient } from "../../api/APIClient"; import DEBUG from "../../components/debug"; import Toast from "../../components/notifications/Toast"; @@ -18,6 +17,7 @@ interface filterAddFormProps { } function FilterAddForm({ isOpen, toggle }: filterAddFormProps) { + const queryClient = useQueryClient(); const navigate = useNavigate(); const mutation = useMutation( (filter: Filter) => APIClient.filters.create(filter), diff --git a/web/src/forms/settings/APIKeyAddForm.tsx b/web/src/forms/settings/APIKeyAddForm.tsx index 0693158..1566623 100644 --- a/web/src/forms/settings/APIKeyAddForm.tsx +++ b/web/src/forms/settings/APIKeyAddForm.tsx @@ -1,12 +1,11 @@ import { Fragment } from "react"; -import { useMutation } from "react-query"; +import { useMutation, useQueryClient } from "react-query"; import { toast } from "react-hot-toast"; import { XMarkIcon } from "@heroicons/react/24/solid"; import { Dialog, Transition } from "@headlessui/react"; import type { FieldProps } from "formik"; import { Field, Form, Formik, FormikErrors, FormikValues } from "formik"; -import { queryClient } from "../../App"; import { APIClient } from "../../api/APIClient"; import DEBUG from "../../components/debug"; import Toast from "../../components/notifications/Toast"; @@ -17,6 +16,8 @@ interface apiKeyAddFormProps { } function APIKeyAddForm({ isOpen, toggle }: apiKeyAddFormProps) { + const queryClient = useQueryClient(); + const mutation = useMutation( (apikey: APIKey) => APIClient.apikeys.create(apikey), { diff --git a/web/src/forms/settings/DownloadClientForms.tsx b/web/src/forms/settings/DownloadClientForms.tsx index 2945422..1db0581 100644 --- a/web/src/forms/settings/DownloadClientForms.tsx +++ b/web/src/forms/settings/DownloadClientForms.tsx @@ -1,11 +1,10 @@ import React, { Fragment, useRef, useState } from "react"; -import { useMutation } from "react-query"; +import { useMutation, useQueryClient } from "react-query"; import { Dialog, Transition } from "@headlessui/react"; import { XMarkIcon } from "@heroicons/react/24/solid"; import { classNames, sleep } from "../../utils"; import { Form, Formik, useFormikContext } from "formik"; import DEBUG from "../../components/debug"; -import { queryClient } from "../../App"; import { APIClient } from "../../api/APIClient"; import { DownloadClientTypeOptions, DownloadRuleConditionOptions } from "../../domain/constants"; @@ -516,6 +515,8 @@ export function DownloadClientAddForm({ isOpen, toggle }: formProps) { const [isSuccessfulTest, setIsSuccessfulTest] = useState(false); const [isErrorTest, setIsErrorTest] = useState(false); + const queryClient = useQueryClient(); + const mutation = useMutation( (client: DownloadClient) => APIClient.download_clients.create(client), { @@ -691,6 +692,8 @@ export function DownloadClientUpdateForm({ client, isOpen, toggle }: updateFormP const [isErrorTest, setIsErrorTest] = useState(false); const [deleteModalIsOpen, toggleDeleteModal] = useToggle(false); + const queryClient = useQueryClient(); + const mutation = useMutation( (client: DownloadClient) => APIClient.download_clients.update(client), { diff --git a/web/src/forms/settings/FeedForms.tsx b/web/src/forms/settings/FeedForms.tsx index b3fbe15..7e560e3 100644 --- a/web/src/forms/settings/FeedForms.tsx +++ b/web/src/forms/settings/FeedForms.tsx @@ -1,6 +1,5 @@ -import { useMutation } from "react-query"; +import { useMutation, useQueryClient } from "react-query"; import { APIClient } from "../../api/APIClient"; -import { queryClient } from "../../App"; import { toast } from "react-hot-toast"; import Toast from "../../components/notifications/Toast"; import { SlideOver } from "../../components/panels"; @@ -39,6 +38,8 @@ export function FeedUpdateForm({ isOpen, toggle, feed }: UpdateProps) { const [isTestSuccessful, setIsSuccessfulTest] = useState(false); const [isTestError, setIsErrorTest] = useState(false); + const queryClient = useQueryClient(); + const mutation = useMutation( (feed: Feed) => APIClient.feeds.update(feed), { diff --git a/web/src/forms/settings/IndexerForms.tsx b/web/src/forms/settings/IndexerForms.tsx index bee902d..0eb634e 100644 --- a/web/src/forms/settings/IndexerForms.tsx +++ b/web/src/forms/settings/IndexerForms.tsx @@ -1,22 +1,18 @@ import React, { Fragment, useState } from "react"; import { toast } from "react-hot-toast"; -import { useMutation, useQuery } from "react-query"; +import { useMutation, useQuery, useQueryClient } from "react-query"; import Select, { components, ControlProps, InputProps, MenuProps, OptionProps } from "react-select"; import type { FieldProps } from "formik"; import { Field, Form, Formik, FormikValues } from "formik"; - import { XMarkIcon } from "@heroicons/react/24/solid"; import { Dialog, Transition } from "@headlessui/react"; - import { classNames, sleep } from "../../utils"; -import { queryClient } from "../../App"; import DEBUG from "../../components/debug"; import { APIClient } from "../../api/APIClient"; import { PasswordFieldWide, SwitchGroupWide, TextFieldWide } from "../../components/inputs"; import { SlideOver } from "../../components/panels"; import Toast from "../../components/notifications/Toast"; import { SelectFieldBasic, SelectFieldCreatable } from "../../components/inputs/select_wide"; - import { CustomTooltip } from "../../components/tooltips/CustomTooltip"; import { FeedDownloadTypeOptions } from "../../domain/constants"; @@ -247,6 +243,7 @@ interface AddProps { export function IndexerAddForm({ isOpen, toggle }: AddProps) { const [indexer, setIndexer] = useState({} as IndexerDefinition); + const queryClient = useQueryClient(); const { data } = useQuery( "indexerDefinition", () => APIClient.indexers.getSchema(), @@ -578,14 +575,15 @@ export function IndexerAddForm({ isOpen, toggle }: AddProps) { interface TestApiButtonProps { values: FormikValues; + show: boolean; } -function TestApiButton({ values }: TestApiButtonProps) { +function TestApiButton({ values, show }: TestApiButtonProps) { const [isTesting, setIsTesting] = useState(false); const [isSuccessfulTest, setIsSuccessfulTest] = useState(false); const [isErrorTest, setIsErrorTest] = useState(false); - if (!values.settings.api_key) { + if (!show) { return null; } @@ -706,6 +704,8 @@ interface UpdateProps { } export function IndexerUpdateForm({ isOpen, toggle, indexer }: UpdateProps) { + const queryClient = useQueryClient(); + const mutation = useMutation((indexer: Indexer) => APIClient.indexers.update(indexer), { onSuccess: () => { queryClient.invalidateQueries(["indexer"]); @@ -783,7 +783,7 @@ export function IndexerUpdateForm({ isOpen, toggle, indexer }: UpdateProps) { deleteAction={deleteAction} onSubmit={onSubmit} initialValues={initialValues} - extraButtons={(values) => } + extraButtons={(values) => } > {() => (
diff --git a/web/src/forms/settings/IrcForms.tsx b/web/src/forms/settings/IrcForms.tsx index 51a5340..1199b44 100644 --- a/web/src/forms/settings/IrcForms.tsx +++ b/web/src/forms/settings/IrcForms.tsx @@ -1,12 +1,9 @@ -import { useMutation } from "react-query"; +import { useMutation, useQueryClient } from "react-query"; import { toast } from "react-hot-toast"; import { XMarkIcon } from "@heroicons/react/24/solid"; import type { FieldProps } from "formik"; import { Field, FieldArray, FormikErrors, FormikValues } from "formik"; - -import { queryClient } from "../../App"; import { APIClient } from "../../api/APIClient"; - import { NumberFieldWide, PasswordFieldWide, SwitchGroupWide, SwitchGroupWideRed, TextFieldWide } from "../../components/inputs"; import { SlideOver } from "../../components/panels"; import Toast from "../../components/notifications/Toast"; @@ -98,6 +95,7 @@ interface AddFormProps { } export function IrcNetworkAddForm({ isOpen, toggle }: AddFormProps) { + const queryClient = useQueryClient(); const mutation = useMutation( (network: IrcNetwork) => APIClient.irc.createNetwork(network), { @@ -241,6 +239,8 @@ export function IrcNetworkUpdateForm({ toggle, network }: IrcNetworkUpdateFormProps) { + const queryClient = useQueryClient(); + const mutation = useMutation((network: IrcNetwork) => APIClient.irc.updateNetwork(network), { onSuccess: () => { queryClient.invalidateQueries(["networks"]); diff --git a/web/src/forms/settings/NotificationForms.tsx b/web/src/forms/settings/NotificationForms.tsx index dbeea9e..e688b67 100644 --- a/web/src/forms/settings/NotificationForms.tsx +++ b/web/src/forms/settings/NotificationForms.tsx @@ -7,9 +7,8 @@ import Select, { components, ControlProps, InputProps, MenuProps, OptionProps } import { PasswordFieldWide, SwitchGroupWide, TextFieldWide } from "../../components/inputs"; import DEBUG from "../../components/debug"; import { EventOptions, NotificationTypeOptions, SelectOption } from "../../domain/constants"; -import { useMutation } from "react-query"; +import { useMutation, useQueryClient } from "react-query"; import { APIClient } from "../../api/APIClient"; -import { queryClient } from "../../App"; import { toast } from "react-hot-toast"; import Toast from "../../components/notifications/Toast"; import { SlideOver } from "../../components/panels"; @@ -136,6 +135,8 @@ interface AddProps { } export function NotificationAddForm({ isOpen, toggle }: AddProps) { + const queryClient = useQueryClient(); + const mutation = useMutation( (notification: Notification) => APIClient.notifications.create(notification), { @@ -407,6 +408,8 @@ interface InitialValues { } export function NotificationUpdateForm({ isOpen, toggle, notification }: UpdateProps) { + const queryClient = useQueryClient(); + const mutation = useMutation( (notification: Notification) => APIClient.notifications.update(notification), { diff --git a/web/src/screens/Base.tsx b/web/src/screens/Base.tsx index 1f9631d..2ad8f3c 100644 --- a/web/src/screens/Base.tsx +++ b/web/src/screens/Base.tsx @@ -21,16 +21,16 @@ function classNames(...classes: string[]) { return classes.filter(Boolean).join(" "); } +const nav: Array = [ + { name: "Dashboard", path: "/" }, + { name: "Filters", path: "/filters" }, + { name: "Releases", path: "/releases" }, + { name: "Settings", path: "/settings" }, + { name: "Logs", path: "/logs" } +]; + export default function Base() { const authContext = AuthContext.useValue(); - const nav: Array = [ - { name: "Dashboard", path: "/" }, - { name: "Filters", path: "/filters" }, - { name: "Releases", path: "/releases" }, - { name: "Settings", path: "/settings" }, - { name: "Logs", path: "/logs" } - ]; - const { data } = useQuery( ["updates"], diff --git a/web/src/screens/auth/login.tsx b/web/src/screens/auth/login.tsx index f9a5499..27b6af0 100644 --- a/web/src/screens/auth/login.tsx +++ b/web/src/screens/auth/login.tsx @@ -2,7 +2,6 @@ import { useEffect } from "react"; import { useForm } from "react-hook-form"; import { useNavigate } from "react-router-dom"; import { useMutation } from "react-query"; - import logo from "../../logo.png"; import { APIClient } from "../../api/APIClient"; import { AuthContext } from "../../utils/Context"; @@ -86,10 +85,10 @@ export const Login = () => { Sign in
-

+ Forgot? -

+
diff --git a/web/src/screens/filters/details.tsx b/web/src/screens/filters/details.tsx index 429479c..35ea2ac 100644 --- a/web/src/screens/filters/details.tsx +++ b/web/src/screens/filters/details.tsx @@ -1,5 +1,5 @@ import React, { useRef } from "react"; -import { useMutation, useQuery } from "react-query"; +import { useMutation, useQuery, useQueryClient } from "react-query"; import { NavLink, Route, Routes, useLocation, useNavigate, useParams } from "react-router-dom"; import { toast } from "react-hot-toast"; import { Form, Formik, FormikValues, useFormikContext } from "formik"; @@ -21,7 +21,6 @@ import { SOURCES_OPTIONS, tagsMatchLogicOptions } from "../../domain/constants"; -import { queryClient } from "../../App"; import { APIClient } from "../../api/APIClient"; import { useToggle } from "../../hooks/hooks"; import { classNames } from "../../utils"; @@ -141,6 +140,7 @@ const FormButtonsGroup = ({ values, deleteAction, reset }: FormButtonsGroupProps }; export default function FilterDetails() { + const queryClient = useQueryClient(); const navigate = useNavigate(); const { filterId } = useParams<{ filterId: string }>(); diff --git a/web/src/screens/filters/list.tsx b/web/src/screens/filters/list.tsx index f680eae..3011519 100644 --- a/web/src/screens/filters/list.tsx +++ b/web/src/screens/filters/list.tsx @@ -5,12 +5,8 @@ import { Listbox, Menu, Switch, Transition } from "@headlessui/react"; import { useMutation, useQuery, useQueryClient } from "react-query"; import { FormikValues } from "formik"; import { useCallback } from "react"; - import { Tooltip } from "react-tooltip"; - - import { FilterListContext, FilterListState } from "../../utils/Context"; - import { ArrowsRightLeftIcon, CheckIcon, @@ -22,8 +18,6 @@ import { ChatBubbleBottomCenterTextIcon, TrashIcon } from "@heroicons/react/24/outline"; - -import { queryClient } from "../../App"; import { classNames } from "../../utils"; import { FilterAddForm } from "../../forms"; import { useToggle } from "../../hooks/hooks"; @@ -74,7 +68,6 @@ interface FilterProps { } export default function Filters({}: FilterProps){ - const queryClient = useQueryClient(); const [createFilterIsOpen, setCreateFilterIsOpen] = useState(false); @@ -642,6 +635,7 @@ interface FilterListItemProps { function FilterListItem({ filter, values, idx }: FilterListItemProps) { const [enabled, setEnabled] = useState(filter.enabled); + const queryClient = useQueryClient(); const updateMutation = useMutation( (status: boolean) => APIClient.filters.toggleEnable(filter.id, status), diff --git a/web/src/screens/settings/Api.tsx b/web/src/screens/settings/Api.tsx index db4f4ee..2c0f5cf 100644 --- a/web/src/screens/settings/Api.tsx +++ b/web/src/screens/settings/Api.tsx @@ -1,6 +1,5 @@ -import { queryClient } from "../../App"; import { useRef } from "react"; -import { useMutation, useQuery } from "react-query"; +import { useMutation, useQuery, useQueryClient } from "react-query"; import { KeyField } from "../../components/fields/text"; import { DeleteModal } from "../../components/modals"; import APIKeyAddForm from "../../forms/settings/APIKeyAddForm"; @@ -82,6 +81,8 @@ function APIListItem({ apikey }: ApiKeyItemProps) { const cancelModalButtonRef = useRef(null); const [deleteModalIsOpen, toggleDeleteModal] = useToggle(false); + const queryClient = useQueryClient(); + const deleteMutation = useMutation( (key: string) => APIClient.apikeys.delete(key), { diff --git a/web/src/screens/settings/Application.tsx b/web/src/screens/settings/Application.tsx index 7b4f0cb..4896a8e 100644 --- a/web/src/screens/settings/Application.tsx +++ b/web/src/screens/settings/Application.tsx @@ -1,11 +1,10 @@ -import { useMutation, useQuery } from "react-query"; +import { useMutation, useQuery, useQueryClient } from "react-query"; import { APIClient } from "../../api/APIClient"; import { Checkbox } from "../../components/Checkbox"; import { SettingsContext } from "../../utils/Context"; import { GithubRelease } from "../../types/Update"; import { toast } from "react-hot-toast"; import Toast from "../../components/notifications/Toast"; -import { queryClient } from "../../App"; interface RowItemProps { label: string; @@ -89,6 +88,8 @@ function ApplicationSettings() { } ); + const queryClient = useQueryClient(); + const checkUpdateMutation = useMutation( () => APIClient.updates.check(), { diff --git a/web/src/screens/settings/DownloadClient.tsx b/web/src/screens/settings/DownloadClient.tsx index c0f75a5..08a0835 100644 --- a/web/src/screens/settings/DownloadClient.tsx +++ b/web/src/screens/settings/DownloadClient.tsx @@ -27,8 +27,6 @@ interface SortConfig { function useSort(items: ListItemProps["clients"][], config?: SortConfig) { const [sortConfig, setSortConfig] = useState(config); - - const sortedItems = useMemo(() => { if (!sortConfig) { return items; @@ -80,6 +78,7 @@ function DownloadClientSettingsListItem({ client }: DLSettingsItemProps) { const [updateClientIsOpen, toggleUpdateClient] = useToggle(false); const queryClient = useQueryClient(); + const mutation = useMutation( (client: DownloadClient) => APIClient.download_clients.update(client), { diff --git a/web/src/screens/settings/Feed.tsx b/web/src/screens/settings/Feed.tsx index 6425154..04913e4 100644 --- a/web/src/screens/settings/Feed.tsx +++ b/web/src/screens/settings/Feed.tsx @@ -7,7 +7,6 @@ import { baseUrl, classNames, IsEmptyDate, simplifyDate } from "../../utils"; import { Fragment, useRef, useState, useMemo } from "react"; import { toast } from "react-hot-toast"; import Toast from "../../components/notifications/Toast"; -import { queryClient } from "../../App"; import { DeleteModal } from "../../components/modals"; import { ArrowsRightLeftIcon, @@ -141,6 +140,7 @@ function ListItem({ feed }: ListItemProps) { const [updateFormIsOpen, toggleUpdateForm] = useToggle(false); const [enabled, setEnabled] = useState(feed.enabled); + const queryClient = useQueryClient(); const updateMutation = useMutation( (status: boolean) => APIClient.feeds.toggleEnable(feed.id, status), diff --git a/web/src/screens/settings/Irc.tsx b/web/src/screens/settings/Irc.tsx index 77553de..dcc0eda 100644 --- a/web/src/screens/settings/Irc.tsx +++ b/web/src/screens/settings/Irc.tsx @@ -1,5 +1,4 @@ import { useMutation, useQuery, useQueryClient } from "react-query"; - import { classNames, IsEmptyDate, simplifyDate } from "../../utils"; import { IrcNetworkAddForm, IrcNetworkUpdateForm } from "../../forms"; import { useToggle } from "../../hooks/hooks"; @@ -10,7 +9,6 @@ import { Menu, Switch, Transition } from "@headlessui/react"; import { Fragment, useRef } from "react"; import { DeleteModal } from "../../components/modals"; import { useState, useMemo } from "react"; - import { toast } from "react-hot-toast"; import Toast from "../../components/notifications/Toast"; import { @@ -30,8 +28,6 @@ interface SortConfig { function useSort(items: ListItemProps["network"][], config?: SortConfig) { const [sortConfig, setSortConfig] = useState(config); - - const sortedItems = useMemo(() => { if (!sortConfig) { return items; @@ -79,7 +75,6 @@ function useSort(items: ListItemProps["network"][], config?: SortConfig) { return { items: sortedItems, requestSort, sortConfig, getSortIndicator }; } - const IrcSettings = () => { const [expandNetworks, toggleExpand] = useToggle(false); const [addNetworkIsOpen, toggleAddNetwork] = useToggle(false); @@ -92,7 +87,6 @@ const IrcSettings = () => { const sortedNetworks = useSort(data || []); - return (
@@ -209,6 +203,7 @@ const ListItem = ({ idx, network, expanded }: ListItemProps) => { const [edit, toggleEdit] = useToggle(false); const queryClient = useQueryClient(); + const mutation = useMutation( (network: IrcNetwork) => APIClient.irc.updateNetwork(network), { diff --git a/web/src/screens/settings/Logs.tsx b/web/src/screens/settings/Logs.tsx index 5a27ac1..de38040 100644 --- a/web/src/screens/settings/Logs.tsx +++ b/web/src/screens/settings/Logs.tsx @@ -1,9 +1,8 @@ -import { useMutation, useQuery } from "react-query"; +import { useMutation, useQuery, useQueryClient } from "react-query"; import { APIClient } from "../../api/APIClient"; import { GithubRelease } from "../../types/Update"; import { toast } from "react-hot-toast"; import Toast from "../../components/notifications/Toast"; -import { queryClient } from "../../App"; import Select, { components, ControlProps, InputProps, MenuProps, OptionProps } from "react-select"; import { LogLevelOptions, SelectOption } from "../../domain/constants"; import { LogFiles } from "../Logs"; @@ -132,6 +131,8 @@ function LogSettings() { } ); + const queryClient = useQueryClient(); + const setLogLevelUpdateMutation = useMutation( (value: string) => APIClient.config.update({ log_level: value }), { diff --git a/web/src/screens/settings/Releases.tsx b/web/src/screens/settings/Releases.tsx index ad563ad..d85778f 100644 --- a/web/src/screens/settings/Releases.tsx +++ b/web/src/screens/settings/Releases.tsx @@ -1,15 +1,15 @@ import { useRef } from "react"; -import { useMutation } from "react-query"; +import { useMutation, useQueryClient } from "react-query"; import { toast } from "react-hot-toast"; - import { APIClient } from "../../api/APIClient"; import Toast from "../../components/notifications/Toast"; -import { queryClient } from "../../App"; import { useToggle } from "../../hooks/hooks"; import { DeleteModal } from "../../components/modals"; function ReleaseSettings() { const [deleteModalIsOpen, toggleDeleteModal] = useToggle(false); + const queryClient = useQueryClient(); + const deleteMutation = useMutation(() => APIClient.release.delete(), { onSuccess: () => { toast.custom((t) => (