From 328593ecb08090544093f1589fa97a6c8ddf41a8 Mon Sep 17 00:00:00 2001 From: James Grugett Date: Sun, 13 Mar 2022 23:28:30 -0500 Subject: [PATCH] Implement feed answer groups! --- web/components/feed/activity-items.ts | 17 ++-- web/components/feed/feed-items.tsx | 141 ++++++++++++++------------ 2 files changed, 88 insertions(+), 70 deletions(-) diff --git a/web/components/feed/activity-items.ts b/web/components/feed/activity-items.ts index 8380bbcd..2b7b3902 100644 --- a/web/components/feed/activity-items.ts +++ b/web/components/feed/activity-items.ts @@ -7,7 +7,6 @@ import { Contract } from '../../../common/contract' import { User } from '../../../common/user' import { filterDefined } from '../../../common/util/array' import { canAddComment, mapCommentsByBetId } from '../../lib/firebase/comments' -import { fromNow } from '../../lib/util/time' export type ActivityItem = | DescriptionItem @@ -61,10 +60,8 @@ export type BetGroupItem = BaseActivityItem & { export type AnswerGroupItem = BaseActivityItem & { type: 'answergroup' - bets: Bet[] - comments: Comment[] answer: Answer - user: User | null | undefined + items: ActivityItem[] } export type CloseItem = BaseActivityItem & { @@ -181,13 +178,21 @@ function getAnswerGroups( (answer) => answer.id === outcome ) as Answer + const answerItems = groupBets( + answerBets, + answerComments, + DAY_IN_MS, + contract, + user?.id, + true + ) + return { id: outcome, type: 'answergroup' as const, contract, answer, - bets: answerBets, - comments: answerComments, + items: answerItems, user, } }) diff --git a/web/components/feed/feed-items.tsx b/web/components/feed/feed-items.tsx index 1edd78eb..56fa87e4 100644 --- a/web/components/feed/feed-items.tsx +++ b/web/components/feed/feed-items.tsx @@ -8,6 +8,7 @@ import { LockClosedIcon, UserIcon, UsersIcon, + PencilAltIcon, XIcon, } from '@heroicons/react/solid' import dayjs from 'dayjs' @@ -46,7 +47,6 @@ import { Avatar } from '../avatar' import { useAdmin } from '../../hooks/use-admin' import { Answer } from '../../../common/answer' import { ActivityItem } from './activity-items' -import { User } from '../../../common/user' export function FeedItems(props: { contract: Contract @@ -61,32 +61,15 @@ export function FeedItems(props: {
{items.map((item, activityItemIdx) => (
- {activityItemIdx !== items.length - 1 ? ( + {activityItemIdx !== items.length - 1 || + item.type === 'answergroup' ? (
))} @@ -98,6 +81,31 @@ export function FeedItems(props: { ) } +function FeedItem(props: { item: ActivityItem }) { + const { item } = props + + switch (item.type) { + case 'question': + return + case 'description': + return + case 'comment': + return + case 'bet': + return + case 'createanswer': + return + case 'betgroup': + return + case 'answergroup': + return + case 'close': + return + case 'resolve': + return + } +} + function FeedComment(props: { contract: Contract comment: Comment @@ -106,28 +114,16 @@ function FeedComment(props: { truncate: boolean }) { const { contract, comment, bet, showOutcomeLabel, truncate } = props - const { createdTime } = contract const { amount, outcome } = bet - const { text, userUsername, userName, userAvatarUrl } = comment + const { text, userUsername, userName, userAvatarUrl, createdTime } = comment const bought = amount >= 0 ? 'bought' : 'sold' const money = formatMoney(Math.abs(amount)) - // const answer = - // feedType !== 'multi' && - // (contract.answers?.find((answer: Answer) => answer?.id === outcome) as - // | Answer - // | undefined) - return ( <>
- {/* {answer && ( -
- {answer.text} -
- )} */}

)} - +

@@ -227,7 +223,7 @@ function FeedBet(props: { of )} - + {canComment && ( // Allow user to comment in an textarea if they are the creator
@@ -421,7 +417,7 @@ export function FeedQuestion(props: { <> {contract.closeTime > Date.now() ? 'Closes' : 'Closed'} - + ) @@ -497,7 +493,7 @@ function FeedDescription(props: { contract: Contract }) { name={creatorName} username={creatorUsername} />{' '} - created this market + created this market
@@ -518,7 +514,7 @@ function FeedCreateAnswer(props: { contract: Contract; answer: Answer }) { name={answer.name} username={answer.username} />{' '} - submitted this answer + submitted this answer
@@ -561,7 +557,7 @@ function FeedResolve(props: { contract: Contract }) { username={creatorUsername} />{' '} resolved this market to {' '} - + @@ -586,7 +582,7 @@ function FeedClose(props: { contract: Contract }) {
Trading closed in this market{' '} - +
@@ -653,7 +649,7 @@ function FeedBetGroup(props: { {index !== outcomes.length - 1 &&
} ))} - + @@ -663,33 +659,50 @@ function FeedBetGroup(props: { function FeedAnswerGroup(props: { contract: Contract answer: Answer - bets: Bet[] - comments: Comment[] - user: User | null | undefined + items: ActivityItem[] }) { - const { contract, answer, bets, comments, user } = props - - const betGroups = _.groupBy(bets, (bet) => bet.outcome) - const outcomes = Object.keys(betGroups) - - // Use the time of the last bet for the entire group - const createdTime = bets[bets.length - 1].createdTime + const { answer, items } = props return ( - <> -
-
-
-
-
-
- {answer.text} +
+
+ +
-
- + + + {items.map((item, index) => ( +
+ {index !== items.length - 1 ? ( +
+ ))} + ) }