From 8eb2dd66abf2857e4b840139ef547f628a8f9759 Mon Sep 17 00:00:00 2001 From: DIYgod Date: Wed, 17 Aug 2022 21:04:35 +0100 Subject: [PATCH] feat: follow count and list --- src/components/site/PostFooter.tsx | 14 +++++-- src/components/site/SiteHeader.tsx | 62 ++++++++++++++++++++++++++++++ src/models/site.model.ts | 18 +++++++++ src/queries/site.ts | 9 +++++ 4 files changed, 99 insertions(+), 4 deletions(-) diff --git a/src/components/site/PostFooter.tsx b/src/components/site/PostFooter.tsx index 71259c8d..9f0d26e7 100644 --- a/src/components/site/PostFooter.tsx +++ b/src/components/site/PostFooter.tsx @@ -303,11 +303,14 @@ export const PostFooter: React.FC<{ images={ like.fromCharacter?.metadata?.content?.avatars || [] } - name={like.fromCharacter?.metadata?.content?.name} + name={ + like.fromCharacter?.metadata?.content?.name || + like.fromCharacter?.handle + } size={40} /> {like.fromCharacter?.metadata?.content?.name} - + @{like.fromCharacter?.handle} @@ -341,11 +344,14 @@ export const PostFooter: React.FC<{ {mint.character?.metadata?.content?.name} - + @{mint.character?.handle} diff --git a/src/components/site/SiteHeader.tsx b/src/components/site/SiteHeader.tsx index f9cf4397..4e020190 100644 --- a/src/components/site/SiteHeader.tsx +++ b/src/components/site/SiteHeader.tsx @@ -18,6 +18,7 @@ import { Fragment, useEffect, useState } from "react" import toast from "react-hot-toast" import { useGetSubscription, + useGetSiteSubscriptions, useSubscribeToSite, useUnsubscribeFromSite, useGetUserSites, @@ -27,6 +28,7 @@ import { Menu } from "@headlessui/react" import { CrossbellIcon } from "~/components/icons/CrossbellIcon" import { BlockchainIcon } from "~/components/icons/BlockchainIcon" import { DotsHorizontalIcon, RssIcon } from "@heroicons/react/solid" +import { Modal } from "~/components/ui/Modal" export type HeaderLinkType = { icon?: React.ReactNode @@ -63,6 +65,7 @@ export const SiteHeader: React.FC<{ const [followProgress, setFollowProgress] = useState(false) const userSite = useGetUserSites(address) const router = useRouter() + let [isFollowListOpen, setIsFollowListOpen] = useState(false) const handleClickSubscribe = async () => { if (!address) { @@ -90,6 +93,11 @@ export const SiteHeader: React.FC<{ siteId: site?.username || "", }) + const siteSubscriptions = useGetSiteSubscriptions({ + siteId: site?.username || "", + }) + console.log(siteSubscriptions.data) + useEffect(() => { if ( followProgress && @@ -175,6 +183,19 @@ export const SiteHeader: React.FC<{
{site?.bio}
)}
+ {siteSubscriptions.data ? ( + setIsFollowListOpen(true)} + > + + {siteSubscriptions.data.total} + {" "} + Followers + + ) : ( + "" + )} {subscription.data ? (
+ +
    + {siteSubscriptions.data?.list?.map((sub: any, index) => ( +
  • + + + {sub.character?.metadata?.content?.name} + + @{sub.character?.handle} + + + + + +
  • + ))} +
+
+ +
+
) } diff --git a/src/models/site.model.ts b/src/models/site.model.ts index 3995033d..c9746542 100644 --- a/src/models/site.model.ts +++ b/src/models/site.model.ts @@ -2,6 +2,7 @@ import { SiteNavigationItem, Profile } from "~/lib/types" import { nanoid } from "nanoid" import { checkReservedWords } from "~/lib/reserved-words" import unidata from "~/lib/unidata" +import { indexer, getContract } from "~/lib/crossbell" export const checkSubdomain = async ({ subdomain, @@ -113,6 +114,23 @@ export const getSubscription = async (data: { return !!links?.list?.length } +export const getSiteSubscriptions = async (data: { siteId: string }) => { + const links = await unidata.links.get({ + source: "Crossbell Link", + identity: data.siteId, + platform: "Crossbell", + reversed: true, + }) + + await Promise.all( + links?.list.map(async (item: any) => { + const owner = item.from + item.character = await indexer.getCharacterByHandle(owner) + }) || [], + ) + return links +} + export async function updateSite(payload: { site: string name?: string diff --git a/src/queries/site.ts b/src/queries/site.ts index a88aa210..4aed9472 100644 --- a/src/queries/site.ts +++ b/src/queries/site.ts @@ -29,6 +29,15 @@ export const useGetSubscription = (data: { }) } +export const useGetSiteSubscriptions = (data: { siteId: string }) => { + return useQuery(["getSiteSubscriptions", data], async () => { + if (!data.siteId) { + return null + } + return siteModel.getSiteSubscriptions(data) + }) +} + export function useUpdateSite() { const queryClient = useQueryClient() const mutation = useMutation(