Just for playing with, bad code
This commit is contained in:
		
							parent
							
								
									4e4ffe8e20
								
							
						
					
					
						commit
						7b497b0e33
					
				
							
								
								
									
										1
									
								
								functions/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								functions/.gitignore
									
									
									
									
										vendored
									
									
								
							| 
						 | 
					@ -15,3 +15,4 @@ node_modules/
 | 
				
			||||||
package-lock.json
 | 
					package-lock.json
 | 
				
			||||||
ui-debug.log
 | 
					ui-debug.log
 | 
				
			||||||
firebase-debug.log
 | 
					firebase-debug.log
 | 
				
			||||||
 | 
					firestore_export/
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -23,6 +23,7 @@ export type ActivityItem =
 | 
				
			||||||
  | CloseItem
 | 
					  | CloseItem
 | 
				
			||||||
  | ResolveItem
 | 
					  | ResolveItem
 | 
				
			||||||
  | CommentInputItem
 | 
					  | CommentInputItem
 | 
				
			||||||
 | 
					  | AnswerItem
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type BaseActivityItem = {
 | 
					type BaseActivityItem = {
 | 
				
			||||||
  id: string
 | 
					  id: string
 | 
				
			||||||
| 
						 | 
					@ -73,6 +74,11 @@ export type AnswerGroupItem = BaseActivityItem & {
 | 
				
			||||||
  items: ActivityItem[]
 | 
					  items: ActivityItem[]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export type AnswerItem = BaseActivityItem & {
 | 
				
			||||||
 | 
					  type: 'answer'
 | 
				
			||||||
 | 
					  answer: Answer
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export type CloseItem = BaseActivityItem & {
 | 
					export type CloseItem = BaseActivityItem & {
 | 
				
			||||||
  type: 'close'
 | 
					  type: 'close'
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -233,13 +239,14 @@ function getAnswerGroups(
 | 
				
			||||||
        (answer) => answer.id === outcome
 | 
					        (answer) => answer.id === outcome
 | 
				
			||||||
      ) as Answer
 | 
					      ) as Answer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      let items = groupBets(answerBets, answerComments, contract, user?.id, {
 | 
					      // let items = groupBets(answerBets, answerComments, contract, user?.id, {
 | 
				
			||||||
        hideOutcome: true,
 | 
					      //   hideOutcome: true,
 | 
				
			||||||
        abbreviated,
 | 
					      //   abbreviated,
 | 
				
			||||||
        smallAvatar: true,
 | 
					      //   smallAvatar: true,
 | 
				
			||||||
        reversed,
 | 
					      //   reversed,
 | 
				
			||||||
      })
 | 
					      // })
 | 
				
			||||||
 | 
					      //
 | 
				
			||||||
 | 
					      let items: ActivityItem[] = []
 | 
				
			||||||
      if (abbreviated) items = items.slice(-2)
 | 
					      if (abbreviated) items = items.slice(-2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      return {
 | 
					      return {
 | 
				
			||||||
| 
						 | 
					@ -255,6 +262,81 @@ function getAnswerGroups(
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return answerGroups
 | 
					  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(
 | 
					function groupBetsAndComments(
 | 
				
			||||||
  bets: Bet[],
 | 
					  bets: Bet[],
 | 
				
			||||||
| 
						 | 
					@ -329,7 +411,24 @@ export function getAllContractActivityItems(
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (outcomeType === 'FREE_RESPONSE') {
 | 
					  if (outcomeType === 'FREE_RESPONSE') {
 | 
				
			||||||
    items.push(
 | 
					    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>,
 | 
					        contract as FullContract<DPM, FreeResponse>,
 | 
				
			||||||
        bets,
 | 
					        bets,
 | 
				
			||||||
        comments,
 | 
					        comments,
 | 
				
			||||||
| 
						 | 
					@ -359,6 +458,7 @@ export function getAllContractActivityItems(
 | 
				
			||||||
    items.push({ type: 'resolve', id: `${contract.resolutionTime}`, contract })
 | 
					    items.push({ type: 'resolve', id: `${contract.resolutionTime}`, contract })
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (outcomeType === 'BINARY') {
 | 
				
			||||||
    const commentsByBetId = mapCommentsByBetId(comments)
 | 
					    const commentsByBetId = mapCommentsByBetId(comments)
 | 
				
			||||||
    items.push({
 | 
					    items.push({
 | 
				
			||||||
      type: 'commentInput',
 | 
					      type: 'commentInput',
 | 
				
			||||||
| 
						 | 
					@ -367,6 +467,7 @@ export function getAllContractActivityItems(
 | 
				
			||||||
      commentsByBetId,
 | 
					      commentsByBetId,
 | 
				
			||||||
      contract,
 | 
					      contract,
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (reversed) items.reverse()
 | 
					  if (reversed) items.reverse()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -67,7 +67,12 @@ export function FeedItems(props: {
 | 
				
			||||||
    <div className={clsx('flow-root pr-2 md:pr-0', className)} ref={ref}>
 | 
					    <div className={clsx('flow-root pr-2 md:pr-0', className)} ref={ref}>
 | 
				
			||||||
      <div className={clsx(tradingAllowed(contract) ? '' : '-mb-6')}>
 | 
					      <div className={clsx(tradingAllowed(contract) ? '' : '-mb-6')}>
 | 
				
			||||||
        {items.map((item, activityItemIdx) => (
 | 
					        {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 ||
 | 
					            {activityItemIdx !== items.length - 1 ||
 | 
				
			||||||
            item.type === 'answergroup' ? (
 | 
					            item.type === 'answergroup' ? (
 | 
				
			||||||
              <span
 | 
					              <span
 | 
				
			||||||
| 
						 | 
					@ -104,6 +109,8 @@ function FeedItem(props: { item: ActivityItem }) {
 | 
				
			||||||
      return <FeedBetGroup {...item} />
 | 
					      return <FeedBetGroup {...item} />
 | 
				
			||||||
    case 'answergroup':
 | 
					    case 'answergroup':
 | 
				
			||||||
      return <FeedAnswerGroup {...item} />
 | 
					      return <FeedAnswerGroup {...item} />
 | 
				
			||||||
 | 
					    case 'answer':
 | 
				
			||||||
 | 
					      return <FeedAnswer {...item} />
 | 
				
			||||||
    case 'close':
 | 
					    case 'close':
 | 
				
			||||||
      return <FeedClose {...item} />
 | 
					      return <FeedClose {...item} />
 | 
				
			||||||
    case 'resolve':
 | 
					    case 'resolve':
 | 
				
			||||||
| 
						 | 
					@ -195,9 +202,9 @@ export function CommentInput(props: {
 | 
				
			||||||
  const user = useUser()
 | 
					  const user = useUser()
 | 
				
			||||||
  const [comment, setComment] = useState('')
 | 
					  const [comment, setComment] = useState('')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (outcomeType === 'FREE_RESPONSE') {
 | 
					  // if (outcomeType === 'FREE_RESPONSE') {
 | 
				
			||||||
    return <div />
 | 
					  //   return <div />
 | 
				
			||||||
  }
 | 
					  // }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  let canCommentOnABet = false
 | 
					  let canCommentOnABet = false
 | 
				
			||||||
  bets.some((bet) => {
 | 
					  bets.some((bet) => {
 | 
				
			||||||
| 
						 | 
					@ -224,6 +231,7 @@ export function CommentInput(props: {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <>
 | 
					    <>
 | 
				
			||||||
 | 
					      <Row className={'flex w-full gap-2 pt-5'}>
 | 
				
			||||||
        <div>
 | 
					        <div>
 | 
				
			||||||
          <Avatar avatarUrl={user?.avatarUrl} username={user?.username} />
 | 
					          <Avatar avatarUrl={user?.avatarUrl} username={user?.username} />
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
| 
						 | 
					@ -252,6 +260,7 @@ export function CommentInput(props: {
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
 | 
					      </Row>
 | 
				
			||||||
    </>
 | 
					    </>
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -723,6 +732,71 @@ function FeedAnswerGroup(props: {
 | 
				
			||||||
    </Col>
 | 
					    </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
 | 
					// TODO: Should highlight the entire Feed segment
 | 
				
			||||||
function FeedExpand(props: { setExpanded: (expanded: boolean) => void }) {
 | 
					function FeedExpand(props: { setExpanded: (expanded: boolean) => void }) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user