Just for playing with, bad code

This commit is contained in:
Ian Philips 2022-04-22 16:48:39 -06:00
parent 4e4ffe8e20
commit 7b497b0e33
3 changed files with 222 additions and 46 deletions

View File

@ -15,3 +15,4 @@ node_modules/
package-lock.json
ui-debug.log
firebase-debug.log
firestore_export/

View File

@ -23,6 +23,7 @@ export type ActivityItem =
| CloseItem
| ResolveItem
| CommentInputItem
| AnswerItem
type BaseActivityItem = {
id: string
@ -73,6 +74,11 @@ export type AnswerGroupItem = BaseActivityItem & {
items: ActivityItem[]
}
export type AnswerItem = BaseActivityItem & {
type: 'answer'
answer: Answer
}
export type CloseItem = BaseActivityItem & {
type: 'close'
}
@ -233,13 +239,14 @@ function getAnswerGroups(
(answer) => answer.id === outcome
) as Answer
let items = groupBets(answerBets, answerComments, contract, user?.id, {
hideOutcome: true,
abbreviated,
smallAvatar: true,
reversed,
})
// let items = groupBets(answerBets, answerComments, contract, user?.id, {
// hideOutcome: true,
// abbreviated,
// smallAvatar: true,
// reversed,
// })
//
let items: ActivityItem[] = []
if (abbreviated) items = items.slice(-2)
return {
@ -255,6 +262,81 @@ function getAnswerGroups(
return answerGroups
}
function getAnswers(
contract: FullContract<DPM, FreeResponse>,
bets: Bet[],
comments: Comment[],
user: User | undefined | null,
options: {
sortByProb: boolean
abbreviated: boolean
reversed: boolean
}
) {
const { sortByProb, abbreviated, reversed } = options
let outcomes = _.uniq(bets.map((bet) => bet.outcome)).filter(
(outcome) => getOutcomeProbability(contract, outcome) > 0.0001
)
if (abbreviated) {
const lastComment = _.last(comments)
const lastCommentOutcome = bets.find(
(bet) => bet.id === lastComment?.betId
)?.outcome
const lastBetOutcome = _.last(bets)?.outcome
if (lastCommentOutcome && lastBetOutcome) {
outcomes = _.uniq([
...outcomes.filter(
(outcome) =>
outcome !== lastCommentOutcome && outcome !== lastBetOutcome
),
lastCommentOutcome,
lastBetOutcome,
])
}
outcomes = outcomes.slice(-2)
}
if (sortByProb) {
outcomes = _.sortBy(outcomes, (outcome) =>
getOutcomeProbability(contract, outcome)
)
} else {
// Sort by recent bet.
outcomes = _.sortBy(outcomes, (outcome) =>
_.findLastIndex(bets, (bet) => bet.outcome === outcome)
)
}
const answerGroups = outcomes
.map((outcome) => {
const answerBets = bets.filter((bet) => bet.outcome === outcome)
const answerComments = comments.filter((comment) =>
answerBets.some((bet) => bet.id === comment.betId)
)
const answer = contract.answers?.find(
(answer) => answer.id === outcome
) as Answer
// let items = groupBets(answerBets, answerComments, contract, user?.id, {
// hideOutcome: true,
// abbreviated,
// smallAvatar: true,
// reversed,
// })
//
return {
id: outcome,
type: 'answer' as const,
contract,
answer,
user,
}
})
.filter((group) => group.answer)
return answerGroups
}
function groupBetsAndComments(
bets: Bet[],
@ -329,7 +411,24 @@ export function getAllContractActivityItems(
if (outcomeType === 'FREE_RESPONSE') {
items.push(
...getAnswerGroups(
...groupBetsAndComments(bets, comments, contract, user?.id, {
hideOutcome: false,
abbreviated,
smallAvatar: false,
reversed,
})
)
const commentsByBetId = mapCommentsByBetId(comments)
items.push({
type: 'commentInput',
id: 'commentInput',
bets,
commentsByBetId,
contract,
})
items.push(
...getAnswers(
contract as FullContract<DPM, FreeResponse>,
bets,
comments,
@ -359,14 +458,16 @@ export function getAllContractActivityItems(
items.push({ type: 'resolve', id: `${contract.resolutionTime}`, contract })
}
const commentsByBetId = mapCommentsByBetId(comments)
items.push({
type: 'commentInput',
id: 'commentInput',
bets,
commentsByBetId,
contract,
})
if (outcomeType === 'BINARY') {
const commentsByBetId = mapCommentsByBetId(comments)
items.push({
type: 'commentInput',
id: 'commentInput',
bets,
commentsByBetId,
contract,
})
}
if (reversed) items.reverse()

View File

@ -67,7 +67,12 @@ export function FeedItems(props: {
<div className={clsx('flow-root pr-2 md:pr-0', className)} ref={ref}>
<div className={clsx(tradingAllowed(contract) ? '' : '-mb-6')}>
{items.map((item, activityItemIdx) => (
<div key={item.id} className="relative pb-6">
<div
key={item.id}
className={
item.type === 'answer' ? 'relative pb-2' : 'relative pb-6'
}
>
{activityItemIdx !== items.length - 1 ||
item.type === 'answergroup' ? (
<span
@ -104,6 +109,8 @@ function FeedItem(props: { item: ActivityItem }) {
return <FeedBetGroup {...item} />
case 'answergroup':
return <FeedAnswerGroup {...item} />
case 'answer':
return <FeedAnswer {...item} />
case 'close':
return <FeedClose {...item} />
case 'resolve':
@ -195,9 +202,9 @@ export function CommentInput(props: {
const user = useUser()
const [comment, setComment] = useState('')
if (outcomeType === 'FREE_RESPONSE') {
return <div />
}
// if (outcomeType === 'FREE_RESPONSE') {
// return <div />
// }
let canCommentOnABet = false
bets.some((bet) => {
@ -224,34 +231,36 @@ export function CommentInput(props: {
return (
<>
<div>
<Avatar avatarUrl={user?.avatarUrl} username={user?.username} />
</div>
<div className={'min-w-0 flex-1 py-1.5'}>
<div className="text-sm text-gray-500">
<div className="mt-2">
<Textarea
value={comment}
onChange={(e) => setComment(e.target.value)}
className="textarea textarea-bordered w-full resize-none"
placeholder="Add a comment..."
rows={3}
maxLength={MAX_COMMENT_LENGTH}
onKeyDown={(e) => {
if (e.key === 'Enter' && (e.ctrlKey || e.metaKey)) {
submitComment()
}
}}
/>
<button
className="btn btn-outline btn-sm mt-1"
onClick={submitComment}
>
Comment
</button>
<Row className={'flex w-full gap-2 pt-5'}>
<div>
<Avatar avatarUrl={user?.avatarUrl} username={user?.username} />
</div>
<div className={'min-w-0 flex-1 py-1.5'}>
<div className="text-sm text-gray-500">
<div className="mt-2">
<Textarea
value={comment}
onChange={(e) => setComment(e.target.value)}
className="textarea textarea-bordered w-full resize-none"
placeholder="Add a comment..."
rows={3}
maxLength={MAX_COMMENT_LENGTH}
onKeyDown={(e) => {
if (e.key === 'Enter' && (e.ctrlKey || e.metaKey)) {
submitComment()
}
}}
/>
<button
className="btn btn-outline btn-sm mt-1"
onClick={submitComment}
>
Comment
</button>
</div>
</div>
</div>
</div>
</Row>
</>
)
}
@ -723,6 +732,71 @@ function FeedAnswerGroup(props: {
</Col>
)
}
function FeedAnswer(props: {
contract: FullContract<any, FreeResponse>
answer: Answer
}) {
const { answer, contract } = props
const { username, avatarUrl, name, text } = answer
const prob = getDpmOutcomeProbability(contract.totalShares, answer.id)
const probPercent = formatPercent(prob)
const [open, setOpen] = useState(false)
return (
<Col
className="bg-base-200 border-base-300 flex-1 p-3"
style={{ borderWidth: 2, borderRadius: 6 }}
>
<Modal open={open} setOpen={setOpen}>
<AnswerBetPanel
answer={answer}
contract={contract}
closePanel={() => setOpen(false)}
className="sm:max-w-84 !rounded-md bg-white !px-8 !py-6"
isModal={true}
/>
</Modal>
<Row className="my-4 gap-3">
<div className="px-1">
<div className="flex h-8 w-8 items-center justify-center rounded-full bg-gray-200">
<Avatar username={username} avatarUrl={avatarUrl} />
</div>
</div>
<Col className="min-w-0 flex-1 gap-2">
<div className="text-sm text-gray-500">
<UserLink username={username} name={name} /> answered
</div>
<Col className="align-items justify-between gap-4 sm:flex-row">
<span className="whitespace-pre-line text-lg">
<Linkify text={text} />
</span>
<Row className="align-items justify-end gap-4">
<span
className={clsx(
'text-2xl',
tradingAllowed(contract) ? 'text-green-500' : 'text-gray-500'
)}
>
{probPercent}
</span>
<BuyButton
className={clsx(
'btn-sm flex-initial !px-6 sm:flex',
tradingAllowed(contract) ? '' : '!hidden'
)}
onClick={() => setOpen(true)}
/>
</Row>
</Col>
</Col>
</Row>
</Col>
)
}
// TODO: Should highlight the entire Feed segment
function FeedExpand(props: { setExpanded: (expanded: boolean) => void }) {