From 55271c34367305c4daaaca950518c08aa5782c44 Mon Sep 17 00:00:00 2001 From: hzrd149 Date: Tue, 24 Oct 2023 12:12:50 -0500 Subject: [PATCH] allow user to edit community moderators --- src/components/npub-autocomplete.tsx | 36 ++++++++++ .../post-modal/zap-split-creator.tsx | 26 +------ .../components/community-create-modal.tsx | 69 +++++++++++++------ 3 files changed, 85 insertions(+), 46 deletions(-) create mode 100644 src/components/npub-autocomplete.tsx diff --git a/src/components/npub-autocomplete.tsx b/src/components/npub-autocomplete.tsx new file mode 100644 index 000000000..9e13880cf --- /dev/null +++ b/src/components/npub-autocomplete.tsx @@ -0,0 +1,36 @@ +import { Input, InputProps } from "@chakra-ui/react"; +import { forwardRef } from "react"; +import { useAsync } from "react-use"; +import { nip19 } from "nostr-tools"; + +import { useUserSearchDirectoryContext } from "../providers/user-directory-provider"; +import userMetadataService from "../services/user-metadata"; +import { getUserDisplayName } from "../helpers/user-metadata"; + +const NpubAutocomplete = forwardRef(({ value, ...props }, ref) => { + const getDirectory = useUserSearchDirectoryContext(); + + const { value: users } = useAsync(async () => { + const dir = await getDirectory(); + return dir.map(({ pubkey }) => ({ pubkey, metadata: userMetadataService.getSubject(pubkey).value })); + }, [getDirectory]); + + return ( + <> + + {users && ( + + {users + .filter((p) => !!p.metadata) + .map(({ metadata, pubkey }) => ( + + ))} + + )} + + ); +}); + +export default NpubAutocomplete; diff --git a/src/components/post-modal/zap-split-creator.tsx b/src/components/post-modal/zap-split-creator.tsx index b142ac7c1..61a81a039 100644 --- a/src/components/post-modal/zap-split-creator.tsx +++ b/src/components/post-modal/zap-split-creator.tsx @@ -2,7 +2,6 @@ import { Flex, Heading, IconButton, - Input, NumberDecrementStepper, NumberIncrementStepper, NumberInput, @@ -12,18 +11,14 @@ import { useToast, } from "@chakra-ui/react"; import { CloseIcon } from "@chakra-ui/icons"; -import { nip19 } from "nostr-tools"; import { useForm } from "react-hook-form"; import { EventSplit } from "../../helpers/nostr/zaps"; import { AddIcon } from "../icons"; -import { useUserSearchDirectoryContext } from "../../providers/user-directory-provider"; -import { useAsync } from "react-use"; -import { getUserDisplayName } from "../../helpers/user-metadata"; -import userMetadataService from "../../services/user-metadata"; import { normalizeToHex } from "../../helpers/nip19"; import UserAvatar from "../user-avatar"; import { UserLink } from "../user-link"; +import NpubAutocomplete from "../npub-autocomplete"; function getRemainingPercent(split: EventSplit) { return Math.round((1 - split.reduce((v, p) => v + p.percent, 0)) * 100) / 100; @@ -58,12 +53,6 @@ function AddUserForm({ }); watch("percent"); - const getDirectory = useUserSearchDirectoryContext(); - const { value: users } = useAsync(async () => { - const dir = await getDirectory(); - return dir.map(({ pubkey }) => ({ pubkey, metadata: userMetadataService.getSubject(pubkey).value })); - }, [getDirectory]); - const submit = handleSubmit((values) => { try { const pubkey = normalizeToHex(values.pubkey); @@ -78,18 +67,7 @@ function AddUserForm({ return ( - - {users && ( - - {users - .filter((p) => !!p.metadata) - .map(({ metadata, pubkey }) => ( - - ))} - - )} + } size="sm" colorScheme="red" variant="ghost" ml="auto" {...props} />; +} export type FormValues = { name: string; @@ -113,6 +118,22 @@ export default function CommunityCreateModal({ [setValue, getValues, requestSignature, toast], ); + const [modInput, setModInput] = useState(""); + const addMod = () => { + if (!modInput) return; + const pubkey = normalizeToHex(modInput); + if (pubkey) { + setValue("mods", getValues("mods").concat(pubkey)); + } + setModInput(""); + }; + const removeMod = (pubkey: string) => { + setValue( + "mods", + getValues("mods").filter((p) => p !== pubkey), + ); + }; + const [relayInput, setRelayInput] = useState(""); const addRelay = () => { if (!relayInput) return; @@ -216,12 +237,25 @@ export default function CommunityCreateModal({ Moderators - {getValues().mods.map((pubkey) => ( - - - - - ))} + + {getValues().mods.map((pubkey) => ( + + + + removeMod(pubkey)} + /> + + ))} + + + setModInput(e.target.value)} /> + + @@ -249,16 +283,7 @@ export default function CommunityCreateModal({ {url} - } - aria-label={`Remove ${url}`} - title={`Remove ${url}`} - onClick={() => removeRelay(url)} - size="sm" - colorScheme="red" - variant="ghost" - ml="auto" - /> + removeRelay(url)} /> ))}