diff --git a/src/components/common/FollowAllButton.tsx b/src/components/common/FollowAllButton.tsx new file mode 100644 index 00000000..779c9fa4 --- /dev/null +++ b/src/components/common/FollowAllButton.tsx @@ -0,0 +1,64 @@ +import { useTranslation } from "next-i18next" +import { useState } from "react" + +import { useAccountState } from "@crossbell/connect-kit" +import { useRefCallback } from "@crossbell/util-hooks" + +import { Button } from "~/components/ui/Button" +import { getSubscriptionsFromList } from "~/models/site.model" +import { useSubscribeToSites } from "~/queries/site" + +export const FollowAllButton: React.FC<{ + size?: "sm" | "xl" + characterIds?: number[] + siteIds?: string[] + className?: string +}> = ({ size, characterIds = [], siteIds = [], className }) => { + const subscribeToSites = useSubscribeToSites() + const { t } = useTranslation("index") + const account = useAccountState((s) => s.computed.account) + const [noMore, setNoMore] = useState(false) + + const doSubscribeToSites = useRefCallback(() => { + if (account?.characterId) { + getSubscriptionsFromList(characterIds, account.characterId).then( + (res) => { + const list = characterIds.filter((id) => !res.includes(id)) + if (list.length) { + subscribeToSites.mutate({ + characterIds: list, + siteIds: siteIds, + } as any) + } else { + setNoMore(true) + } + }, + ) + } else { + subscribeToSites.mutate({ + characterIds: characterIds, + siteIds: siteIds, + } as any) + } + }) + + const followAll = () => { + doSubscribeToSites() + } + + return ( + + ) +} diff --git a/src/components/main/MainSidebar.tsx b/src/components/main/MainSidebar.tsx index 2b5d2854..41b9254c 100644 --- a/src/components/main/MainSidebar.tsx +++ b/src/components/main/MainSidebar.tsx @@ -1,43 +1,20 @@ import { useTranslation } from "next-i18next" import { useState } from "react" -import { useRefCallback } from "@crossbell/util-hooks" - import { CharacterFloatCard } from "~/components/common/CharacterFloatCard" import { SearchInput } from "~/components/common/SearchInput" -import { Button } from "~/components/ui/Button" import { Image } from "~/components/ui/Image" import { UniLink } from "~/components/ui/UniLink" import { getSiteLink } from "~/lib/helpers" -import { - useAccountSites, - useGetShowcase, - useSubscribeToSites, -} from "~/queries/site" +import { useGetShowcase } from "~/queries/site" import topics from "../../../data/topics.json" +import { FollowAllButton } from "../common/FollowAllButton" export function MainSidebar({ hideSearch }: { hideSearch?: boolean }) { const showcaseSites = useGetShowcase() const { t } = useTranslation("index") - const userSite = useAccountSites() - const subscribeToSites = useSubscribeToSites() - - const doSubscribeToSites = useRefCallback(() => { - subscribeToSites.mutate({ - characterIds: showcaseSites.data - ?.map((s: { characterId?: string }) => s.characterId) - .filter(Boolean) - .map(Number), - siteIds: showcaseSites.data?.map((s: { handle: string }) => s.handle), - } as any) - }) - - const followAll = () => { - doSubscribeToSites() - } - const [showcaseMore, setShowcaseMore] = useState(false) return ( @@ -66,20 +43,15 @@ export function MainSidebar({ hideSearch }: { hideSearch?: boolean }) {
{t("Suggested creators for you")}
- +