Skip to content

Commit

Permalink
transfer dialog: pay fees and render withdraw toast
Browse files Browse the repository at this point in the history
  • Loading branch information
sehyunc committed Oct 3, 2024
1 parent db7bf06 commit 398ade4
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 43 deletions.
65 changes: 25 additions & 40 deletions app/components/task-toaster.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,57 +20,32 @@ import {
isWithdrawTask,
} from "@/lib/task"

const DURATION_MS = 15_000 // 15 seconds

export function TaskToaster() {
const toastTimers = React.useRef<Map<string, NodeJS.Timeout>>(new Map())
const seenStates = React.useRef<Map<string, string>>(new Map())

const scheduleToastDismissal = React.useCallback((id: string) => {
if (toastTimers.current.has(id)) {
clearTimeout(toastTimers.current.get(id)!)
}
const timer = setTimeout(() => {
toast.dismiss(id)
toastTimers.current.delete(id)
seenStates.current.delete(id)
}, DURATION_MS)
toastTimers.current.set(id, timer)
}, [])

React.useEffect(() => {
const timers = toastTimers.current
return () => {
timers.forEach(clearTimeout)
}
}, [])

useTaskHistoryWebSocket({
onUpdate(task) {
const currentState = `${task.id}-${task.state}`
if (seenStates.current.get(task.id) === currentState) return
seenStates.current.set(task.id, currentState)

if (isWithdrawTask(task)) {
processWithdrawTask(task, scheduleToastDismissal)
processWithdrawTask(task)
} else if (
isDepositTask(task) ||
isPlaceOrderTask(task) ||
isCancelOrderTask(task) ||
isRefreshWalletTask(task)
) {
processTask(task, scheduleToastDismissal)
processTask(task)
}
},
})

return null
}

function processTask(
incomingTask: Task,
scheduleToastDismissal: (id: string) => void,
) {
function processTask(incomingTask: Task) {
const state = formatTaskState(incomingTask.state)
const id = incomingTask.id

Expand Down Expand Up @@ -101,38 +76,48 @@ function processTask(
icon: <Loader2 className="h-4 w-4 animate-spin text-black" />,
})
}

scheduleToastDismissal(id)
}

function processWithdrawTask(
incomingTask: Task,
scheduleToastDismissal: (id: string) => void,
) {
function processWithdrawTask(incomingTask: Task) {
if (isWithdrawTask(incomingTask)) {
const state = formatTaskState(incomingTask.state)
const id = incomingTask.id

if (incomingTask.state === "Completed") {
const message = generateCompletionToastMessage(incomingTask)
toast.success(message, { id, description: state, icon: undefined })
toast.success(message, {
id,
description: state,
icon: undefined,
duration: 10000,
})
} else if (incomingTask.state === "Failed") {
const message = generateFailedToastMessage(incomingTask)
toast.error(message, { id, icon: undefined })
toast.error(message, { id, icon: undefined, duration: 10000 })
} else if (incomingTask.state === "Updating Validity Proofs") {
const message = generateCompletionToastMessage(incomingTask)
toast.success(message, { id, description: "Completed", icon: undefined })
toast.success(message, {
id,
description: "Completed",
icon: undefined,
duration: 10000,
})
} else if (incomingTask.state === "Proving") {
return
const message = generateStartToastMessage(incomingTask)
toast.success(message, {
id,
description: state,
icon: <Loader2 className="h-4 w-4 animate-spin text-black" />,
duration: 10000,
})
} else {
const message = generateStartToastMessage(incomingTask)
toast.success(message, {
id,
description: state,
icon: <Loader2 className="h-4 w-4 animate-spin text-black" />,
duration: 10000,
})
}

scheduleToastDismissal(id)
}
}
22 changes: 19 additions & 3 deletions components/dialogs/transfer/transfer-dialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,13 @@ import { usePathname, useRouter } from "next/navigation"

import { zodResolver } from "@hookform/resolvers/zod"
import { VisuallyHidden } from "@radix-ui/react-visually-hidden"
import { Token, UpdateType, useBalances, usePayFees } from "@renegade-fi/react"
import {
Token,
UpdateType,
useBackOfQueueWallet,
useBalances,
usePayFees,
} from "@renegade-fi/react"
import { QueryClient, useQueryClient } from "@tanstack/react-query"
import { Loader2 } from "lucide-react"
import { useForm, useWatch } from "react-hook-form"
Expand Down Expand Up @@ -95,12 +101,22 @@ export function TransferDialog({

const { payFees } = usePayFees()
const feeOnZeroBalance = useFeeOnZeroBalance()
const { data: numFees } = useBackOfQueueWallet({
query: {
select: (data) =>
data.balances.filter(
(balance) =>
balance.protocol_fee_balance || balance.relayer_fee_balance,
).length,
},
})

React.useEffect(() => {
if (open && feeOnZeroBalance) {
if (!open) return
if (feeOnZeroBalance || (numFees ?? 0) > 2) {
payFees()
}
}, [open, payFees, feeOnZeroBalance])
}, [feeOnZeroBalance, numFees, open, payFees])

if (isDesktop) {
return (
Expand Down

0 comments on commit 398ade4

Please sign in to comment.