From 61ead81ed91dfc196eb3fff24c75621b36efbbe4 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Wed, 1 May 2024 18:31:53 -0500 Subject: [PATCH] Allow updating admin relays --- .../admin/hooks/useAdminNostrRelays.ts | 21 +++++++++++++++ src/features/admin/nostr-relays.tsx | 27 ++++++++++++++----- 2 files changed, 41 insertions(+), 7 deletions(-) create mode 100644 src/features/admin/hooks/useAdminNostrRelays.ts diff --git a/src/features/admin/hooks/useAdminNostrRelays.ts b/src/features/admin/hooks/useAdminNostrRelays.ts new file mode 100644 index 000000000..b55255135 --- /dev/null +++ b/src/features/admin/hooks/useAdminNostrRelays.ts @@ -0,0 +1,21 @@ +import { useQuery } from '@tanstack/react-query'; +import { z } from 'zod'; + +import { useApi } from 'soapbox/hooks'; + +const relayEntitySchema = z.object({ + url: z.string().url(), + marker: z.enum(['read', 'write']).optional(), +}); + +export function useAdminNostrRelays() { + const api = useApi(); + + return useQuery({ + queryKey: ['NostrRelay'], + queryFn: async () => { + const { data } = await api.get('/api/v1/admin/ditto/relays'); + return relayEntitySchema.array().parse(data); + }, + }); +} \ No newline at end of file diff --git a/src/features/admin/nostr-relays.tsx b/src/features/admin/nostr-relays.tsx index 69fa1f4c5..40c7d719e 100644 --- a/src/features/admin/nostr-relays.tsx +++ b/src/features/admin/nostr-relays.tsx @@ -1,23 +1,36 @@ -import React, { useState } from 'react'; +import { useMutation } from '@tanstack/react-query'; +import React, { useEffect, useState } from 'react'; import { FormattedMessage, defineMessages, useIntl } from 'react-intl'; import { Button, Column, Form, FormActions, Stack } from 'soapbox/components/ui'; import RelayEditor, { RelayData } from 'soapbox/features/nostr-relays/components/relay-editor'; +import { useApi } from 'soapbox/hooks'; + +import { useAdminNostrRelays } from './hooks/useAdminNostrRelays'; const messages = defineMessages({ title: { id: 'column.admin.nostr_relays', defaultMessage: 'Relays' }, }); const AdminNostrRelays: React.FC = () => { + const api = useApi(); const intl = useIntl(); + const result = useAdminNostrRelays(); - const [relays, setRelays] = useState([]); - const [isLoading, setIsLoading] = useState(false); + const [relays, setRelays] = useState(result.data ?? []); - const handleSubmit = async () => { - setIsLoading(true); + const mutation = useMutation({ + mutationFn: async () => api.put('/api/v1/admin/ditto/relays', relays), + }); + + const handleSubmit = () => { + mutation.mutate(); }; + useEffect(() => { + setRelays(result.data ?? []); + }, [result.data]); + return (
@@ -25,11 +38,11 @@ const AdminNostrRelays: React.FC = () => { - -