Ignore rankings/members for huge groups for now
This commit is contained in:
parent
f08d6bda93
commit
7a49549389
|
@ -57,6 +57,7 @@ export function ContractSearch(props: {
|
||||||
creatorId?: string
|
creatorId?: string
|
||||||
tag?: string
|
tag?: string
|
||||||
excludeContractIds?: string[]
|
excludeContractIds?: string[]
|
||||||
|
groupSlug?: string
|
||||||
}
|
}
|
||||||
onContractClick?: (contract: Contract) => void
|
onContractClick?: (contract: Contract) => void
|
||||||
showPlaceHolder?: boolean
|
showPlaceHolder?: boolean
|
||||||
|
@ -79,7 +80,6 @@ export function ContractSearch(props: {
|
||||||
?.map((g) => g.slug)
|
?.map((g) => g.slug)
|
||||||
.filter((s) => !NEW_USER_GROUP_SLUGS.includes(s))
|
.filter((s) => !NEW_USER_GROUP_SLUGS.includes(s))
|
||||||
const follows = useFollows(user?.id)
|
const follows = useFollows(user?.id)
|
||||||
console.log(memberGroupSlugs, follows)
|
|
||||||
const { initialSort } = useInitialQueryAndSort(querySortOptions)
|
const { initialSort } = useInitialQueryAndSort(querySortOptions)
|
||||||
|
|
||||||
const sort = sortIndexes
|
const sort = sortIndexes
|
||||||
|
@ -112,6 +112,9 @@ export function ContractSearch(props: {
|
||||||
additionalFilter?.creatorId
|
additionalFilter?.creatorId
|
||||||
? `creatorId:${additionalFilter.creatorId}`
|
? `creatorId:${additionalFilter.creatorId}`
|
||||||
: '',
|
: '',
|
||||||
|
additionalFilter?.groupSlug
|
||||||
|
? `groupSlugs:${additionalFilter.groupSlug}`
|
||||||
|
: '',
|
||||||
].filter((f) => f)
|
].filter((f) => f)
|
||||||
// Hack to make Algolia work.
|
// Hack to make Algolia work.
|
||||||
filters = ['', ...filters]
|
filters = ['', ...filters]
|
||||||
|
|
|
@ -75,19 +75,21 @@ export const useMemberGroupIds = (user: User | null | undefined) => {
|
||||||
return memberGroupIds
|
return memberGroupIds
|
||||||
}
|
}
|
||||||
|
|
||||||
export function useMembers(group: Group) {
|
export function useMembers(group: Group, max?: number) {
|
||||||
const [members, setMembers] = useState<User[]>([])
|
const [members, setMembers] = useState<User[]>([])
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const { memberIds } = group
|
const { memberIds } = group
|
||||||
if (memberIds.length > 0) {
|
if (memberIds.length > 0) {
|
||||||
listMembers(group).then((members) => setMembers(members))
|
listMembers(group, max).then((members) => setMembers(members))
|
||||||
}
|
}
|
||||||
}, [group])
|
}, [group, max])
|
||||||
return members
|
return members
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function listMembers(group: Group) {
|
export async function listMembers(group: Group, max?: number) {
|
||||||
return await Promise.all(group.memberIds.map(getUser))
|
return await Promise.all(
|
||||||
|
group.memberIds.slice(0, max ? max : group.memberIds.length).map(getUser)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
export const useGroupsWithContract = (contractId: string | undefined) => {
|
export const useGroupsWithContract = (contractId: string | undefined) => {
|
||||||
|
|
|
@ -7,10 +7,10 @@ import { Contract } from 'web/lib/firebase/contracts'
|
||||||
import {
|
import {
|
||||||
groupPath,
|
groupPath,
|
||||||
getGroupBySlug,
|
getGroupBySlug,
|
||||||
getGroupContracts,
|
|
||||||
updateGroup,
|
updateGroup,
|
||||||
addUserToGroup,
|
addUserToGroup,
|
||||||
addContractToGroup,
|
addContractToGroup,
|
||||||
|
getGroupContracts,
|
||||||
} from 'web/lib/firebase/groups'
|
} from 'web/lib/firebase/groups'
|
||||||
import { Row } from 'web/components/layout/row'
|
import { Row } from 'web/components/layout/row'
|
||||||
import { UserLink } from 'web/components/user-page'
|
import { UserLink } from 'web/components/user-page'
|
||||||
|
@ -33,7 +33,6 @@ import { SEO } from 'web/components/SEO'
|
||||||
import { Linkify } from 'web/components/linkify'
|
import { Linkify } from 'web/components/linkify'
|
||||||
import { fromPropz, usePropz } from 'web/hooks/use-propz'
|
import { fromPropz, usePropz } from 'web/hooks/use-propz'
|
||||||
import { Tabs } from 'web/components/layout/tabs'
|
import { Tabs } from 'web/components/layout/tabs'
|
||||||
import { ContractsGrid } from 'web/components/contract/contracts-list'
|
|
||||||
import {
|
import {
|
||||||
createButtonStyle,
|
createButtonStyle,
|
||||||
CreateQuestionButton,
|
CreateQuestionButton,
|
||||||
|
@ -42,13 +41,15 @@ import React, { useEffect, useState } from 'react'
|
||||||
import { GroupChat } from 'web/components/groups/group-chat'
|
import { GroupChat } from 'web/components/groups/group-chat'
|
||||||
import { LoadingIndicator } from 'web/components/loading-indicator'
|
import { LoadingIndicator } from 'web/components/loading-indicator'
|
||||||
import { Modal } from 'web/components/layout/modal'
|
import { Modal } from 'web/components/layout/modal'
|
||||||
import { checkAgainstQuery } from 'web/hooks/use-sort-and-query-params'
|
import {
|
||||||
|
checkAgainstQuery,
|
||||||
|
getSavedSort,
|
||||||
|
} from 'web/hooks/use-sort-and-query-params'
|
||||||
import { ChoicesToggleGroup } from 'web/components/choices-toggle-group'
|
import { ChoicesToggleGroup } from 'web/components/choices-toggle-group'
|
||||||
import { toast } from 'react-hot-toast'
|
import { toast } from 'react-hot-toast'
|
||||||
import { useCommentsOnGroup } from 'web/hooks/use-comments'
|
import { useCommentsOnGroup } from 'web/hooks/use-comments'
|
||||||
import { ShareIconButton } from 'web/components/share-icon-button'
|
import { ShareIconButton } from 'web/components/share-icon-button'
|
||||||
import { REFERRAL_AMOUNT } from 'common/user'
|
import { REFERRAL_AMOUNT } from 'common/user'
|
||||||
import { SiteLink } from 'web/components/site-link'
|
|
||||||
import { ContractSearch } from 'web/components/contract-search'
|
import { ContractSearch } from 'web/components/contract-search'
|
||||||
import clsx from 'clsx'
|
import clsx from 'clsx'
|
||||||
import { FollowList } from 'web/components/follow-list'
|
import { FollowList } from 'web/components/follow-list'
|
||||||
|
@ -61,10 +62,14 @@ export async function getStaticPropz(props: { params: { slugs: string[] } }) {
|
||||||
const { slugs } = props.params
|
const { slugs } = props.params
|
||||||
|
|
||||||
const group = await getGroupBySlug(slugs[0])
|
const group = await getGroupBySlug(slugs[0])
|
||||||
const members = group ? await listMembers(group) : []
|
const members =
|
||||||
|
group && group.memberIds.length < 100 ? await listMembers(group) : []
|
||||||
const creatorPromise = group ? getUser(group.creatorId) : null
|
const creatorPromise = group ? getUser(group.creatorId) : null
|
||||||
|
|
||||||
const contracts = group ? await getGroupContracts(group).catch((_) => []) : []
|
const contracts =
|
||||||
|
group && group.contractIds.length < 100
|
||||||
|
? await getGroupContracts(group).catch((_) => [])
|
||||||
|
: []
|
||||||
|
|
||||||
const bets = await Promise.all(
|
const bets = await Promise.all(
|
||||||
contracts.map((contract: Contract) => listAllBets(contract.id))
|
contracts.map((contract: Contract) => listAllBets(contract.id))
|
||||||
|
@ -149,26 +154,9 @@ export default function GroupPage(props: {
|
||||||
const page = slugs?.[1] as typeof groupSubpages[number]
|
const page = slugs?.[1] as typeof groupSubpages[number]
|
||||||
|
|
||||||
const group = useGroup(props.group?.id) ?? props.group
|
const group = useGroup(props.group?.id) ?? props.group
|
||||||
const [contracts, setContracts] = useState<Contract[] | undefined>(undefined)
|
|
||||||
const [query, setQuery] = useState('')
|
|
||||||
const tips = useTipTxns({ groupId: group?.id })
|
const tips = useTipTxns({ groupId: group?.id })
|
||||||
|
|
||||||
const messages = useCommentsOnGroup(group?.id)
|
const messages = useCommentsOnGroup(group?.id)
|
||||||
const debouncedQuery = debounce(setQuery, 50)
|
|
||||||
const filteredContracts =
|
|
||||||
query != '' && contracts
|
|
||||||
? contracts.filter(
|
|
||||||
(c) =>
|
|
||||||
checkAgainstQuery(query, c.question) ||
|
|
||||||
checkAgainstQuery(query, c.creatorName) ||
|
|
||||||
checkAgainstQuery(query, c.creatorUsername)
|
|
||||||
)
|
|
||||||
: []
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
if (group)
|
|
||||||
getGroupContracts(group).then((contracts) => setContracts(contracts))
|
|
||||||
}, [group])
|
|
||||||
|
|
||||||
const user = useUser()
|
const user = useUser()
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
@ -237,37 +225,14 @@ export default function GroupPage(props: {
|
||||||
{
|
{
|
||||||
title: 'Questions',
|
title: 'Questions',
|
||||||
content: (
|
content: (
|
||||||
<div className={'mt-2 px-1'}>
|
<ContractSearch
|
||||||
{contracts ? (
|
querySortOptions={{
|
||||||
contracts.length > 0 ? (
|
shouldLoadFromStorage: true,
|
||||||
<>
|
defaultSort: getSavedSort() ?? 'newest',
|
||||||
<input
|
defaultFilter: 'open',
|
||||||
type="text"
|
}}
|
||||||
onChange={(e) => debouncedQuery(e.target.value)}
|
additionalFilter={{ groupSlug: group.slug }}
|
||||||
placeholder="Search the group's questions"
|
|
||||||
className="input input-bordered mb-4 w-full"
|
|
||||||
/>
|
/>
|
||||||
<ContractsGrid
|
|
||||||
contracts={query != '' ? filteredContracts : contracts}
|
|
||||||
hasMore={false}
|
|
||||||
loadMore={() => {}}
|
|
||||||
/>
|
|
||||||
</>
|
|
||||||
) : (
|
|
||||||
<div className="p-2 text-gray-500">
|
|
||||||
No questions yet. Why not{' '}
|
|
||||||
<SiteLink
|
|
||||||
href={`/create/?groupId=${group.id}`}
|
|
||||||
className={'font-bold text-gray-700'}
|
|
||||||
>
|
|
||||||
add one?
|
|
||||||
</SiteLink>
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
) : (
|
|
||||||
<LoadingIndicator />
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
),
|
),
|
||||||
href: groupPath(group.slug, 'questions'),
|
href: groupPath(group.slug, 'questions'),
|
||||||
},
|
},
|
||||||
|
@ -491,8 +456,10 @@ function GroupMemberSearch(props: { group: Group }) {
|
||||||
|
|
||||||
export function GroupMembersList(props: { group: Group }) {
|
export function GroupMembersList(props: { group: Group }) {
|
||||||
const { group } = props
|
const { group } = props
|
||||||
const members = useMembers(group).filter((m) => m.id !== group.creatorId)
|
|
||||||
const maxMembersToShow = 3
|
const maxMembersToShow = 3
|
||||||
|
const members = useMembers(group, maxMembersToShow).filter(
|
||||||
|
(m) => m.id !== group.creatorId
|
||||||
|
)
|
||||||
if (group.memberIds.length === 1) return <div />
|
if (group.memberIds.length === 1) return <div />
|
||||||
return (
|
return (
|
||||||
<div className="text-neutral flex flex-wrap gap-1">
|
<div className="text-neutral flex flex-wrap gap-1">
|
||||||
|
@ -503,8 +470,8 @@ export function GroupMembersList(props: { group: Group }) {
|
||||||
{members.length > 1 && i !== members.length - 1 && <span>,</span>}
|
{members.length > 1 && i !== members.length - 1 && <span>,</span>}
|
||||||
</div>
|
</div>
|
||||||
))}
|
))}
|
||||||
{members.length > maxMembersToShow && (
|
{group.memberIds.length > maxMembersToShow && (
|
||||||
<span> & {members.length - maxMembersToShow} more</span>
|
<span> & {group.memberIds.length - maxMembersToShow} more</span>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user