2022-10-01 20:51:08 +00:00
|
|
|
import { useEffect, useRef, useState } from 'react'
|
2022-10-02 17:55:58 +00:00
|
|
|
import toast from 'react-hot-toast'
|
|
|
|
import { debounce, sum } from 'lodash'
|
2022-10-01 20:51:08 +00:00
|
|
|
|
2022-06-18 03:28:16 +00:00
|
|
|
import { Comment } from 'common/comment'
|
|
|
|
import { User } from 'common/user'
|
|
|
|
import { CommentTips } from 'web/hooks/use-tip-txns'
|
|
|
|
import { useUser } from 'web/hooks/use-user'
|
2022-07-10 22:03:15 +00:00
|
|
|
import { transact } from 'web/lib/firebase/api'
|
2022-06-21 15:36:44 +00:00
|
|
|
import { track } from 'web/lib/service/analytics'
|
2022-10-01 20:51:08 +00:00
|
|
|
import { TipButton } from './contract/tip-button'
|
2022-06-18 03:28:16 +00:00
|
|
|
import { Row } from './layout/row'
|
2022-10-01 20:57:47 +00:00
|
|
|
import { LIKE_TIP_AMOUNT } from 'common/like'
|
2022-10-02 17:55:58 +00:00
|
|
|
import { formatMoney } from 'common/util/format'
|
2022-09-21 22:25:54 +00:00
|
|
|
|
2022-06-18 03:28:16 +00:00
|
|
|
export function Tipper(prop: { comment: Comment; tips: CommentTips }) {
|
|
|
|
const { comment, tips } = prop
|
|
|
|
|
|
|
|
const me = useUser()
|
|
|
|
const myId = me?.id ?? ''
|
2022-06-27 16:18:15 +00:00
|
|
|
const savedTip = tips[myId] ?? 0
|
2022-06-18 03:28:16 +00:00
|
|
|
|
2022-06-27 16:18:15 +00:00
|
|
|
const [localTip, setLocalTip] = useState(savedTip)
|
2022-10-01 20:51:08 +00:00
|
|
|
|
2022-06-27 16:18:15 +00:00
|
|
|
// listen for user being set
|
2022-06-18 03:28:16 +00:00
|
|
|
const initialized = useRef(false)
|
|
|
|
useEffect(() => {
|
2022-06-27 16:18:15 +00:00
|
|
|
if (tips[myId] && !initialized.current) {
|
|
|
|
setLocalTip(tips[myId])
|
2022-06-18 03:28:16 +00:00
|
|
|
initialized.current = true
|
|
|
|
}
|
2022-06-27 16:18:15 +00:00
|
|
|
}, [tips, myId])
|
2022-06-18 03:28:16 +00:00
|
|
|
|
2022-10-01 21:10:17 +00:00
|
|
|
const total = sum(Object.values(tips)) - savedTip + localTip
|
|
|
|
|
2022-06-18 03:28:16 +00:00
|
|
|
// declare debounced function only on first render
|
|
|
|
const [saveTip] = useState(() =>
|
2022-08-10 06:05:56 +00:00
|
|
|
debounce(async (user: User, comment: Comment, change: number) => {
|
2022-06-18 03:28:16 +00:00
|
|
|
if (change === 0) {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2022-08-19 08:06:40 +00:00
|
|
|
const contractId =
|
|
|
|
comment.commentType === 'contract' ? comment.contractId : undefined
|
|
|
|
const groupId =
|
|
|
|
comment.commentType === 'group' ? comment.groupId : undefined
|
2022-09-07 22:09:20 +00:00
|
|
|
const postId = comment.commentType === 'post' ? comment.postId : undefined
|
2022-06-18 03:28:16 +00:00
|
|
|
await transact({
|
|
|
|
amount: change,
|
|
|
|
fromId: user.id,
|
|
|
|
fromType: 'USER',
|
|
|
|
toId: comment.userId,
|
|
|
|
toType: 'USER',
|
|
|
|
token: 'M$',
|
|
|
|
category: 'TIP',
|
2022-09-07 22:09:20 +00:00
|
|
|
data: { commentId: comment.id, contractId, groupId, postId },
|
2022-06-18 03:28:16 +00:00
|
|
|
description: `${user.name} tipped M$ ${change} to ${comment.userName} for a comment`,
|
|
|
|
})
|
2022-06-21 15:36:44 +00:00
|
|
|
|
|
|
|
track('send comment tip', {
|
|
|
|
commentId: comment.id,
|
2022-08-19 08:06:40 +00:00
|
|
|
contractId,
|
|
|
|
groupId,
|
2022-09-07 22:09:20 +00:00
|
|
|
postId,
|
2022-06-21 15:36:44 +00:00
|
|
|
amount: change,
|
|
|
|
fromId: user.id,
|
|
|
|
toId: comment.userId,
|
|
|
|
})
|
2022-06-18 03:28:16 +00:00
|
|
|
}, 1500)
|
|
|
|
)
|
|
|
|
// instant save on unrender
|
|
|
|
useEffect(() => () => void saveTip.flush(), [saveTip])
|
|
|
|
|
2022-08-10 06:05:56 +00:00
|
|
|
const addTip = (delta: number) => {
|
|
|
|
setLocalTip(localTip + delta)
|
|
|
|
me && saveTip(me, comment, localTip - savedTip + delta)
|
2022-10-02 17:55:58 +00:00
|
|
|
toast(`You tipped ${comment.userName} ${formatMoney(LIKE_TIP_AMOUNT)}!`)
|
2022-06-18 03:28:16 +00:00
|
|
|
}
|
|
|
|
|
2022-10-01 21:22:19 +00:00
|
|
|
const canUp =
|
|
|
|
me && comment.userId !== me.id && me.balance >= localTip + LIKE_TIP_AMOUNT
|
2022-10-01 20:51:08 +00:00
|
|
|
|
2022-06-18 03:28:16 +00:00
|
|
|
return (
|
|
|
|
<Row className="items-center gap-0.5">
|
2022-10-01 20:51:08 +00:00
|
|
|
<TipButton
|
2022-10-01 20:57:47 +00:00
|
|
|
tipAmount={LIKE_TIP_AMOUNT}
|
2022-10-01 21:10:17 +00:00
|
|
|
totalTipped={total}
|
2022-10-01 20:57:47 +00:00
|
|
|
onClick={() => addTip(+LIKE_TIP_AMOUNT)}
|
2022-10-01 20:51:08 +00:00
|
|
|
userTipped={localTip > 0}
|
|
|
|
disabled={!canUp}
|
|
|
|
isCompact
|
2022-09-21 22:25:54 +00:00
|
|
|
/>
|
2022-06-18 03:28:16 +00:00
|
|
|
</Row>
|
|
|
|
)
|
|
|
|
}
|