From 70be5589fa1271bcd9a8a7f357ad90a5f042c571 Mon Sep 17 00:00:00 2001 From: 0xzio Date: Sat, 24 Aug 2024 13:17:02 +0800 Subject: [PATCH] feat: can add contributor --- .../AddContributorDialog.tsx | 4 +- .../AddContributorForm.tsx | 67 ++++++++----------- .../settings/contributors/ContributorList.tsx | 18 +++-- hooks/useContributors.ts | 11 +++ server/routers/contributor.ts | 2 +- 5 files changed, 55 insertions(+), 47 deletions(-) create mode 100644 hooks/useContributors.ts diff --git a/app/~/space/[id]/settings/contributors/AddContributorDialog/AddContributorDialog.tsx b/app/~/space/[id]/settings/contributors/AddContributorDialog/AddContributorDialog.tsx index 96c3a37d..fac08f02 100644 --- a/app/~/space/[id]/settings/contributors/AddContributorDialog/AddContributorDialog.tsx +++ b/app/~/space/[id]/settings/contributors/AddContributorDialog/AddContributorDialog.tsx @@ -17,7 +17,9 @@ export function AddContributorDialog() { return ( setIsOpen(v)}> - + diff --git a/app/~/space/[id]/settings/contributors/AddContributorDialog/AddContributorForm.tsx b/app/~/space/[id]/settings/contributors/AddContributorDialog/AddContributorForm.tsx index 2610130c..dd2186cf 100644 --- a/app/~/space/[id]/settings/contributors/AddContributorDialog/AddContributorForm.tsx +++ b/app/~/space/[id]/settings/contributors/AddContributorDialog/AddContributorForm.tsx @@ -1,5 +1,6 @@ 'use client' +import { useState } from 'react' import { useForm } from 'react-hook-form' import LoadingDots from '@/components/icons/loading-dots' import { Button } from '@/components/ui/button' @@ -12,13 +13,13 @@ import { FormMessage, } from '@/components/ui/form' import { Input } from '@/components/ui/input' -import { channelsAtom } from '@/hooks/useChannels' +import { useContributors } from '@/hooks/useContributors' import { useSpace } from '@/hooks/useSpace' import { spaceAbi } from '@/lib/abi' +import { checkChain } from '@/lib/checkChain' import { extractErrorMessage } from '@/lib/extractErrorMessage' import { api, trpc } from '@/lib/trpc' import { wagmiConfig } from '@/lib/wagmi' -import { store } from '@/store' import { zodResolver } from '@hookform/resolvers/zod' import { readContract, writeContract } from '@wagmi/core' import { toast } from 'sonner' @@ -33,53 +34,53 @@ const FormSchema = z.object({ .string() .min(1, { message: 'Address is required' }) .regex(ethAddressRegex, { message: 'Invalid Ethereum address' }), - share: z - .string() - .min(1, { message: 'Share cannot be empty' }) - .regex(/^\d+$/, { message: 'Share must be a numeric string' }), }) export function AddContributorForm() { + const [isLoading, setLoading] = useState(false) const { isPending, mutateAsync } = trpc.contributor.create.useMutation() const { setIsOpen } = useAddContributorDialog() const { space } = useSpace() + const { contributors = [], refetch } = useContributors() const form = useForm>({ resolver: zodResolver(FormSchema), defaultValues: { address: '', - share: '', }, }) async function onSubmit(data: z.infer) { try { + setLoading(true) + await checkChain() + const some = contributors.find((c) => c.user.address === data.address) + + if (some) { + setLoading(false) + return toast.error('This address has already been added.') + } + + await writeContract(wagmiConfig, { + address: space.spaceAddress as Address, + abi: spaceAbi, + functionName: 'addContributor', + args: [data.address as Address], + }) + await mutateAsync({ spaceId: space.id, address: data.address, - share: data.share, }) + refetch() - // await writeContract(wagmiConfig, { - // address: space.spaceAddress as Address, - // abi: spaceAbi, - // functionName: 'addContributor', - // args: [ - // { - // account: data.address as Address, - // shares: BigInt(data.share), - // }, - // ], - // }) - - // const channels = await api.channel.listBySpaceId.query(space.id) - // store.set(channelsAtom, channels) setIsOpen(false) toast.success('Add Contributor successfully!') } catch (error) { const msg = extractErrorMessage(error) toast.error(msg || 'Failed to add Contributor. Please try again.') } + setLoading(false) } return ( @@ -99,22 +100,12 @@ export function AddContributorForm() { )} /> - ( - - Share - - - - - - )} - /> - - diff --git a/app/~/space/[id]/settings/contributors/ContributorList.tsx b/app/~/space/[id]/settings/contributors/ContributorList.tsx index 2710bf02..d5178982 100644 --- a/app/~/space/[id]/settings/contributors/ContributorList.tsx +++ b/app/~/space/[id]/settings/contributors/ContributorList.tsx @@ -1,20 +1,20 @@ 'use client' +import { Badge } from '@/components/ui/badge' import { Skeleton } from '@/components/ui/skeleton' import { UserAvatar } from '@/components/UserAvatar' +import { useContributors } from '@/hooks/useContributors' import { useSpace } from '@/hooks/useSpace' import { trpc } from '@/lib/trpc' import { cn, shortenAddress } from '@/lib/utils' export function ContributorList() { const { space } = useSpace() - const { data = [], isLoading } = trpc.contributor.listBySpaceId.useQuery( - space.id, - ) + const { contributors = [], isLoading } = useContributors() if (isLoading) { return ( -
+
{Array(5) .fill('') .map((_, i) => ( @@ -24,7 +24,7 @@ export function ContributorList() { ) } - if (!data.length) { + if (!contributors.length) { return (
No contributors yet. @@ -34,7 +34,7 @@ export function ContributorList() { return (
- {data.map((item) => ( + {contributors.map((item) => (
@@ -44,9 +44,13 @@ export function ContributorList() { ? item.user.ensName : shortenAddress(item.user.address)}
+ {space.userId === item.user.id && Founder} + {space.userId !== item.user.id && ( + Shareholder + )}
- {item.shares} share + {item.shares} shares
))} diff --git a/hooks/useContributors.ts b/hooks/useContributors.ts new file mode 100644 index 00000000..2e9919be --- /dev/null +++ b/hooks/useContributors.ts @@ -0,0 +1,11 @@ +import { trpc } from '@/lib/trpc' +import { useSpace } from './useSpace' + +export function useContributors() { + const { space } = useSpace() + const { data: contributors = [], ...rest } = + trpc.contributor.listBySpaceId.useQuery(space.id, { + enabled: !!space?.id, + }) + return { contributors, ...rest } +} diff --git a/server/routers/contributor.ts b/server/routers/contributor.ts index 777908e6..31207363 100644 --- a/server/routers/contributor.ts +++ b/server/routers/contributor.ts @@ -8,6 +8,7 @@ export const contributorRouter = router({ .query(async ({ input }) => { return [] as (Contributor & { user: { + id: string name: string | null ensName: string | null email: string | null @@ -25,7 +26,6 @@ export const contributorRouter = router({ z.object({ spaceId: z.string(), address: z.string(), - share: z.string(), }), ) .mutation(async ({ ctx, input }) => {