Order home group sections by daily score.
This commit is contained in:
parent
3677de58c3
commit
ab883ea777
|
@ -7,12 +7,11 @@ import { Row } from 'web/components/layout/row'
|
|||
import { Page } from 'web/components/page'
|
||||
import { SiteLink } from 'web/components/site-link'
|
||||
import { Title } from 'web/components/title'
|
||||
import { useMemberGroupsSubscription } from 'web/hooks/use-group'
|
||||
import { useTracking } from 'web/hooks/use-tracking'
|
||||
import { useUser } from 'web/hooks/use-user'
|
||||
import { updateUser } from 'web/lib/firebase/users'
|
||||
import { track } from 'web/lib/service/analytics'
|
||||
import { getHomeItems, TrendingGroupsSection } from '.'
|
||||
import { getHomeItems } from '.'
|
||||
|
||||
export default function Home() {
|
||||
const user = useUser()
|
||||
|
@ -27,8 +26,7 @@ export default function Home() {
|
|||
setHomeSections(newHomeSections)
|
||||
}
|
||||
|
||||
const groups = useMemberGroupsSubscription(user)
|
||||
const { sections } = getHomeItems(groups ?? [], homeSections)
|
||||
const { sections } = getHomeItems(homeSections)
|
||||
|
||||
return (
|
||||
<Page>
|
||||
|
@ -38,14 +36,8 @@ export default function Home() {
|
|||
<DoneButton />
|
||||
</Row>
|
||||
|
||||
<Col className="gap-8 md:flex-row">
|
||||
<Col className="flex-1">
|
||||
<ArrangeHome
|
||||
sections={sections}
|
||||
setSectionIds={updateHomeSections}
|
||||
/>
|
||||
</Col>
|
||||
<TrendingGroupsSection className="flex-1" user={user} full />
|
||||
<Col className="flex-1">
|
||||
<ArrangeHome sections={sections} setSectionIds={updateHomeSections} />
|
||||
</Col>
|
||||
</Col>
|
||||
</Page>
|
||||
|
|
|
@ -8,7 +8,7 @@ import {
|
|||
import { PlusCircleIcon, XCircleIcon } from '@heroicons/react/outline'
|
||||
import clsx from 'clsx'
|
||||
import { toast, Toaster } from 'react-hot-toast'
|
||||
import { Dictionary } from 'lodash'
|
||||
import { Dictionary, sortBy, sum } from 'lodash'
|
||||
|
||||
import { Page } from 'web/components/page'
|
||||
import { Col } from 'web/components/layout/col'
|
||||
|
@ -62,16 +62,16 @@ export default function Home() {
|
|||
}
|
||||
})
|
||||
|
||||
const groups = useMemberGroupsSubscription(user)
|
||||
|
||||
const { sections } = getHomeItems(groups ?? [], user?.homeSections ?? [])
|
||||
const { sections } = getHomeItems(user?.homeSections ?? [])
|
||||
|
||||
useEffect(() => {
|
||||
if (user && !user.homeSections && sections.length > 0 && groups) {
|
||||
if (user && !user.homeSections && sections.length > 0) {
|
||||
// Save initial home sections.
|
||||
updateUser(user.id, { homeSections: sections.map((s) => s.id) })
|
||||
}
|
||||
}, [user, sections, groups])
|
||||
}, [user, sections])
|
||||
|
||||
const groups = useMemberGroupsSubscription(user)
|
||||
|
||||
const groupContracts = useContractsByDailyScoreGroups(
|
||||
groups?.map((g) => g.slug)
|
||||
|
@ -94,14 +94,15 @@ export default function Home() {
|
|||
<LoadingIndicator />
|
||||
) : (
|
||||
<>
|
||||
{sections.map((section) =>
|
||||
renderSection(section, user, groups, groupContracts)
|
||||
)}
|
||||
{sections.map((section) => renderSection(section, user))}
|
||||
|
||||
<TrendingGroupsSection user={user} />
|
||||
|
||||
{renderGroupSections(user, groups, groupContracts)}
|
||||
</>
|
||||
)}
|
||||
</Col>
|
||||
|
||||
<button
|
||||
type="button"
|
||||
className="fixed bottom-[70px] right-3 z-20 inline-flex items-center rounded-full border border-transparent bg-indigo-600 p-4 text-white shadow-sm hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2 lg:hidden"
|
||||
|
@ -123,17 +124,12 @@ const HOME_SECTIONS = [
|
|||
{ label: 'New', id: 'newest' },
|
||||
]
|
||||
|
||||
export const getHomeItems = (groups: Group[], sections: string[]) => {
|
||||
export const getHomeItems = (sections: string[]) => {
|
||||
// Accommodate old home sections.
|
||||
if (!isArray(sections)) sections = []
|
||||
|
||||
const items: { id: string; label: string; group?: Group }[] = [
|
||||
...HOME_SECTIONS,
|
||||
...groups.map((g) => ({
|
||||
label: g.name,
|
||||
id: g.id,
|
||||
group: g,
|
||||
})),
|
||||
]
|
||||
const itemsById = keyBy(items, 'id')
|
||||
|
||||
|
@ -152,12 +148,7 @@ export const getHomeItems = (groups: Group[], sections: string[]) => {
|
|||
}
|
||||
}
|
||||
|
||||
function renderSection(
|
||||
section: { id: string; label: string },
|
||||
user: User,
|
||||
groups: Group[] | undefined,
|
||||
groupContracts: Dictionary<CPMMBinaryContract[]> | undefined
|
||||
) {
|
||||
function renderSection(section: { id: string; label: string }, user: User) {
|
||||
const { id, label } = section
|
||||
if (id === 'daily-movers') {
|
||||
return <DailyMoversSection key={id} userId={user.id} />
|
||||
|
@ -178,25 +169,47 @@ function renderSection(
|
|||
<SearchSection key={id} label={label} sort={sort.value} user={user} />
|
||||
)
|
||||
|
||||
if (groups && groupContracts) {
|
||||
const group = groups.find((g) => g.id === id)
|
||||
if (group) {
|
||||
const contracts = groupContracts[group.slug].filter(
|
||||
(c) => Math.abs(c.probChanges.day) >= 0.01
|
||||
)
|
||||
if (contracts.length === 0) return null
|
||||
return (
|
||||
<GroupSection
|
||||
key={id}
|
||||
group={group}
|
||||
user={user}
|
||||
contracts={contracts}
|
||||
/>
|
||||
)
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
function renderGroupSections(
|
||||
user: User,
|
||||
groups: Group[] | undefined,
|
||||
groupContracts: Dictionary<CPMMBinaryContract[]> | undefined
|
||||
) {
|
||||
if (!groups || !groupContracts) {
|
||||
return <LoadingIndicator />
|
||||
}
|
||||
|
||||
return null
|
||||
const filteredGroups = groups.filter((g) => groupContracts[g.slug])
|
||||
const orderedGroups = sortBy(filteredGroups, (g) =>
|
||||
// Sort by sum of top two daily scores.
|
||||
sum(
|
||||
sortBy(groupContracts[g.slug].map((c) => c.dailyScore))
|
||||
.reverse()
|
||||
.slice(0, 2)
|
||||
)
|
||||
).reverse()
|
||||
|
||||
return (
|
||||
<>
|
||||
{orderedGroups.map((group) => {
|
||||
const contracts = groupContracts[group.slug].filter(
|
||||
(c) => Math.abs(c.probChanges.day) >= 0.01
|
||||
)
|
||||
if (contracts.length === 0) return null
|
||||
|
||||
return (
|
||||
<GroupSection
|
||||
key={group.id}
|
||||
group={group}
|
||||
user={user}
|
||||
contracts={contracts}
|
||||
/>
|
||||
)
|
||||
})}
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
function SectionHeader(props: {
|
||||
|
@ -371,9 +384,7 @@ export function TrendingGroupsSection(props: {
|
|||
|
||||
return (
|
||||
<Col className={className}>
|
||||
<SectionHeader label="Trending groups" href="/explore-groups">
|
||||
{!full && <CustomizeButton className="mb-1" />}
|
||||
</SectionHeader>
|
||||
<SectionHeader label="Trending groups" href="/explore-groups" />
|
||||
<Row className="flex-wrap gap-2">
|
||||
{chosenGroups.map((g) => (
|
||||
<PillButton
|
||||
|
|
Loading…
Reference in New Issue
Block a user