diff --git a/web/components/fast-fold-following.tsx b/web/components/fast-fold-following.tsx new file mode 100644 index 00000000..d4d350ee --- /dev/null +++ b/web/components/fast-fold-following.tsx @@ -0,0 +1,107 @@ +import clsx from 'clsx' +import { useState } from 'react' +import { SearchIcon } from '@heroicons/react/outline' + +import { User } from '../../common/user' +import { followFoldFromSlug, unfollowFoldFromSlug } from '../lib/firebase/folds' +import { Row } from './layout/row' +import { Spacer } from './layout/spacer' + +function FollowFoldButton(props: { + fold: { slug: string; name: string } + user: User | null | undefined + isFollowed?: boolean +}) { + const { fold, user, isFollowed } = props + const { slug, name } = fold + + const [followed, setFollowed] = useState(isFollowed) + + const onClick = async () => { + if (followed) { + if (user) await unfollowFoldFromSlug(slug, user.id) + setFollowed(false) + } else { + if (user) await followFoldFromSlug(slug, user.id) + setFollowed(true) + } + } + + return ( +
+ {name} +
+ ) +} + +function FollowFolds(props: { + folds: { slug: string; name: string }[] + followedFoldSlugs: string[] + noLabel?: boolean + className?: string + user: User | null | undefined +}) { + const { folds, noLabel, className, user, followedFoldSlugs } = props + + return ( + + {folds.length > 0 && ( + <> + {!noLabel &&
Communities
} + {folds.map((fold) => ( + + ))} + + )} +
+ ) +} + +export const FastFoldFollowing = (props: { + followedFoldSlugs: string[] + user: User | null | undefined +}) => { + const { followedFoldSlugs, user } = props + + return ( + <> + + + + + + + + ) +} diff --git a/web/components/tags-list.tsx b/web/components/tags-list.tsx index 16cf5357..7e02d5f9 100644 --- a/web/components/tags-list.tsx +++ b/web/components/tags-list.tsx @@ -1,6 +1,5 @@ import clsx from 'clsx' -import { useUser } from '../hooks/use-user' -import { followFold } from '../lib/firebase/folds' + import { Row } from './layout/row' import { SiteLink } from './site-link' @@ -46,18 +45,9 @@ export function TagsList(props: { ) } -export function FoldTag(props: { - fold: { slug: string; name: string } - isFollowButton?: boolean -}) { - const { fold, isFollowButton } = props +export function FoldTag(props: { fold: { slug: string; name: string } }) { + const { fold } = props const { slug, name } = fold - const user = useUser() - const onClick = isFollowButton - ? async () => { - await followFold(fold.id, user.id) - } - : undefined return ( diff --git a/web/lib/firebase/folds.ts b/web/lib/firebase/folds.ts index caa60a5c..d1170565 100644 --- a/web/lib/firebase/folds.ts +++ b/web/lib/firebase/folds.ts @@ -128,6 +128,26 @@ export function unfollowFold(fold: Fold, user: User) { return deleteDoc(followDoc) } +export async function followFoldFromSlug(slug: string, userId: string) { + const snap = await getDocs(query(foldCollection, where('slug', '==', slug))) + if (snap.empty) return undefined + + const foldDoc = snap.docs[0] + const followDoc = doc(foldDoc.ref, 'followers', userId) + + return setDoc(followDoc, { userId }) +} + +export async function unfollowFoldFromSlug(slug: string, userId: string) { + const snap = await getDocs(query(foldCollection, where('slug', '==', slug))) + if (snap.empty) return undefined + + const foldDoc = snap.docs[0] + const followDoc = doc(foldDoc.ref, 'followers', userId) + + return deleteDoc(followDoc) +} + export function listenForFollow( fold: Fold, user: User, diff --git a/web/pages/folds.tsx b/web/pages/folds.tsx index cd59fac9..170f5672 100644 --- a/web/pages/folds.tsx +++ b/web/pages/folds.tsx @@ -73,7 +73,8 @@ export default function Folds(props: {
Communities on Manifold are centered around a collection of - markets. + markets. Follow a community to personalize your feed and receive + relevant updates.
diff --git a/web/pages/home.tsx b/web/pages/home.tsx index 2e824227..038ed3b9 100644 --- a/web/pages/home.tsx +++ b/web/pages/home.tsx @@ -17,12 +17,10 @@ import { Fold } from '../../common/fold' import { filterDefined } from '../../common/util/array' import { useUserBetContracts } from '../hooks/use-user-bets' import { LoadingIndicator } from '../components/loading-indicator' -import { FoldTagList } from '../components/tags-list' -import { SearchIcon } from '@heroicons/react/outline' import { Row } from '../components/layout/row' import { SparklesIcon } from '@heroicons/react/solid' import { useFollowedFolds } from '../hooks/use-fold' -import { SiteLink } from '../components/site-link' +import { FastFoldFollowing } from '../components/fast-fold-following' export async function getStaticProps() { let [contracts, folds] = await Promise.all([ @@ -123,20 +121,19 @@ const Home = (props: { - - + + {followedFolds.length === 0 && ( + f.slug)} + /> + )} + -
- - Follow a community - {' '} - to personalize -
{activeContracts ? ( @@ -154,31 +151,4 @@ const Home = (props: { ) } -const FastFoldFollowing = () => { - return ( - <> - - - - - ) -} - export default Home