import { Fragment } from "react"; import { useMutation, useQuery } from "react-query"; import { Channel, Indexer, IndexerSchema, IndexerSchemaSettings, Network } from "../../domain/interfaces"; import { sleep } from "../../utils"; import { XIcon } from "@heroicons/react/solid"; import { Dialog, Transition } from "@headlessui/react"; import { Field, FieldProps, Form, Formik } from "formik"; import DEBUG from "../../components/debug"; import Select, { components, InputProps } from "react-select"; import { queryClient } from "../../App"; import APIClient from "../../api/APIClient"; import { TextFieldWide, PasswordFieldWide, SwitchGroupWide } from "../../components/inputs/input_wide"; import { toast } from 'react-hot-toast' import Toast from '../../components/notifications/Toast'; import { SlideOver } from "../../components/panels"; const Input = ({ type, ...rest }: InputProps) => ; interface AddProps { isOpen: boolean; toggle: any; } export function IndexerAddForm({ isOpen, toggle }: AddProps) { const { data } = useQuery('indexerSchema', APIClient.indexers.getSchema, { enabled: isOpen, refetchOnWindowFocus: false } ) const mutation = useMutation((indexer: Indexer) => APIClient.indexers.create(indexer), { onSuccess: () => { queryClient.invalidateQueries(['indexer']); toast.custom((t) => ) sleep(1500) toggle() }, onError: () => { toast.custom((t) => ) } }) const ircMutation = useMutation((network: Network) => APIClient.irc.createNetwork(network), { onSuccess: (data) => { // console.log("irc mutation: ", data); // queryClient.invalidateQueries(['networks']); // sleep(1500) // toggle() } }) const onSubmit = (formData: any) => { let ind = data && data.find(i => i.identifier === formData.identifier) if (!ind) { return } let channels: Channel[] = [] if (ind.irc.channels.length) { ind.irc.channels.forEach(element => { channels.push({ name: element, password: "" }) }); } const network: Network = { name: ind.irc.network, enabled: false, server: ind.irc.server, port: ind.irc.port, tls: ind.irc.tls, nickserv: formData.irc.nickserv, invite_command: formData.irc.invite_command, settings: formData.irc.settings, channels: channels, } mutation.mutate(formData, { onSuccess: (data) => { // create irc ircMutation.mutate(network) } }) }; const renderSettingFields = (indexer: string) => { if (indexer !== "") { let ind = data && data.find(i => i.identifier === indexer) return ( {ind && ind.settings && ind.settings.map((f: any, idx: number) => { switch (f.type) { case "text": return ( ) case "secret": return ( ) } return null })} ) } } const renderIrcSettingFields = (indexer: string) => { if (indexer !== "") { let ind = data && data.find(i => i.identifier === indexer) return ( {ind && ind.irc && ind.irc.settings && ( IRC Networks, channels and invite commands are configured automatically. {ind.irc.settings.map((f: IndexerSchemaSettings, idx: number) => { switch (f.type) { case "text": return case "secret": return } return null })} {/* */} )} ) } } return ( {({ values }) => { return ( Add indexer Add indexer. Close panel Indexer {({ field, form: { setFieldValue } }: FieldProps) => ( { setFieldValue("name", option?.label ?? "") setFieldValue(field.name, option?.value ?? "") }} options={data && data.sort((a, b): any => a.name.localeCompare(b.name)).map(v => ({ label: v.name, value: v.identifier }))} /> )} {renderSettingFields(values.identifier)} {renderIrcSettingFields(values.identifier)} Cancel Save ) }} ) } interface UpdateProps { isOpen: boolean; toggle: any; indexer: Indexer; } export function IndexerUpdateForm({ isOpen, toggle, indexer }: UpdateProps) { const mutation = useMutation((indexer: Indexer) => APIClient.indexers.update(indexer), { onSuccess: () => { queryClient.invalidateQueries(['indexer']); toast.custom((t) => ) sleep(1500) toggle() } }) const deleteMutation = useMutation((id: number) => APIClient.indexers.delete(id), { onSuccess: () => { queryClient.invalidateQueries(['indexer']); toast.custom((t) => ) } }) const onSubmit = (data: any) => { // TODO clear data depending on type mutation.mutate(data) }; const deleteAction = () => { deleteMutation.mutate(indexer.id) } const renderSettingFields = (settings: any[]) => { if (settings !== []) { return ( {settings && settings.map((f: any, idx: number) => { switch (f.type) { case "text": return ( ) case "secret": return ( ) } return null })} ) } } let initialValues = { id: indexer.id, name: indexer.name, enabled: indexer.enabled, identifier: indexer.identifier, settings: indexer.settings.reduce((o: any, obj: any) => ({ ...o, [obj.name]: obj.value }), {}), } return ( {({ values }: any) => ( Name {({ field, meta }: FieldProps) => ( {meta.touched && meta.error && {meta.error}} )} {renderSettingFields(indexer.settings)} )} ) }
Networks, channels and invite commands are configured automatically.
Add indexer.