import { useState, useEffect } from 'react' import { PrivateUser, User } from 'common/user' import { getUser, listenForAllUsers, listenForPrivateUsers, } from 'web/lib/firebase/users' import { groupBy, sortBy, difference } from 'lodash' import { getContractsOfUserBets } from 'web/lib/firebase/bets' import { useFollows } from './use-follows' import { useUser } from './use-user' export const useUsers = () => { const [users, setUsers] = useState([]) useEffect(() => { listenForAllUsers(setUsers) }, []) return users } export const useUserById = (userId?: string) => { const [user, setUser] = useState(undefined) useEffect(() => { if (userId) { getUser(userId).then(setUser) } }, [userId]) return user } export const usePrivateUsers = () => { const [users, setUsers] = useState([]) useEffect(() => { listenForPrivateUsers(setUsers) }, []) return users } export const useDiscoverUsers = (userId: string | null | undefined) => { const [discoverUserIds, setDiscoverUserIds] = useState([]) useEffect(() => { if (userId) getContractsOfUserBets(userId).then((contracts) => { const creatorCounts = Object.entries( groupBy(contracts, 'creatorId') ).map(([id, contracts]) => [id, contracts.length] as const) const topCreatorIds = sortBy(creatorCounts, ([_, i]) => i) .map(([id]) => id) .reverse() setDiscoverUserIds(topCreatorIds) }) }, [userId]) const user = useUser() const followedUserIds = useFollows(user?.id) const nonSuggestions = [user?.id ?? '', ...(followedUserIds ?? [])] return difference(discoverUserIds, nonSuggestions).slice(0, 50) }