Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ export NEXT_PUBLIC_WC_PROJECT_ID=""
export NEXT_PUBLIC_SENTRY_DSN=""
export NEXT_PUBLIC_RECAPTCHA_SITE_KEY=""
export NEXT_PUBLIC_INFURA_API_KEY=""
export NEXT_PUBLIC_ALCHEMY_API_KEY=""
export NEXT_PUBLIC_JUSTANAME_ENS_DOMAIN=""

export MOBULA_API_KEY=""
Expand All @@ -26,13 +27,19 @@ export WC_PROJECT_ID=""
export GA_KEY=""
export SOCKET_API_KEY=""

# SQUID
export SQUID_API_URL=""
export SQUID_INTEGRATOR_ID=""

# Passkey envs
export NEXT_PUBLIC_ZERO_DEV_PASSKEY_PROJECT_ID=""
export NEXT_PUBLIC_ZERO_DEV_BUNDLER_URL=""
export NEXT_PUBLIC_ZERO_DEV_PAYMASTER_URL=""
export NEXT_PUBLIC_ZERO_DEV_PASSKEY_SERVER_URL=""
export NEXT_PUBLIC_POLYGON_PAYMASTER_URL=""
export NEXT_PUBLIC_POLYGON_BUNDLER_URL=""
export NEXT_PUBLIC_BALANCE_WARNING_THRESHOLD=1
export NEXT_PUBLIC_BALANCE_WARNING_EXPIRY=15

export NEXT_PUBLIC_INFURA_API_KEY=""

Expand Down
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
"@hookform/resolvers": "3.9.1",
"@justaname.id/react": "0.3.180",
"@justaname.id/sdk": "0.2.177",
"@radix-ui/react-slider": "^1.3.5",
"@reduxjs/toolkit": "^2.5.0",
"@reown/appkit": "1.6.9",
"@reown/appkit-adapter-wagmi": "1.6.9",
Expand Down
115 changes: 113 additions & 2 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions public/arrows/small-arrow.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 2 additions & 2 deletions src/app/(mobile-ui)/add-money/[country]/bank/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ export default function OnrampBankPage() {

const [isKycModalOpen, setIsKycModalOpen] = useState(false)
const [liveKycStatus, setLiveKycStatus] = useState<KYCStatus | undefined>(undefined)
const { amountToOnramp: amountFromContext, setAmountToOnramp, setError, error } = useOnrampFlow()
const { amountToOnramp: amountFromContext, setAmountToOnramp, setError, error, setOnrampData } = useOnrampFlow()
const formRef = useRef<{ handleSubmit: () => void }>(null)
const [isUpdatingUser, setIsUpdatingUser] = useState(false)
const [userUpdateError, setUserUpdateError] = useState<string | null>(null)
Expand Down Expand Up @@ -186,7 +186,7 @@ export default function OnrampBankPage() {
amount: cleanedAmount,
country: selectedCountry,
})
sessionStorage.setItem('onrampData', JSON.stringify(onrampDataResponse))
setOnrampData(onrampDataResponse)

if (onrampDataResponse.transferId) {
setStep('showDetails')
Expand Down
56 changes: 53 additions & 3 deletions src/app/(mobile-ui)/home/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,28 @@ import { UserHeader } from '@/components/UserHeader'
import { useAuth } from '@/context/authContext'
import { useWallet } from '@/hooks/wallet/useWallet'
import { useUserStore, useWalletStore } from '@/redux/hooks'
import { formatExtendedNumber, getUserPreferences, printableUsdc, updateUserPreferences } from '@/utils'
import {
formatExtendedNumber,
getUserPreferences,
printableUsdc,
updateUserPreferences,
getFromLocalStorage,
saveToLocalStorage,
} from '@/utils'
import { useDisconnect } from '@reown/appkit/react'
import Image from 'next/image'
import Link from 'next/link'
import { useEffect, useMemo, useState } from 'react'
import { twMerge } from 'tailwind-merge'
import { useAccount } from 'wagmi'
import AddMoneyPromptModal from '@/components/Home/AddMoneyPromptModal'
import BalanceWarningModal from '@/components/Global/BalanceWarningModal'
import { AccountType } from '@/interfaces'
import { formatUnits } from 'viem'
import { PEANUT_WALLET_TOKEN_DECIMALS } from '@/constants'

const BALANCE_WARNING_THRESHOLD = parseInt(process.env.NEXT_PUBLIC_BALANCE_WARNING_THRESHOLD ?? '500')
const BALANCE_WARNING_EXPIRY = parseInt(process.env.NEXT_PUBLIC_BALANCE_WARNING_EXPIRY ?? '1814400') // 21 days in seconds

export default function Home() {
const { balance, address, isFetchingBalance, isFetchingRewardBalance } = useWallet()
Expand All @@ -43,6 +56,7 @@ export default function Home() {

const [showIOSPWAInstallModal, setShowIOSPWAInstallModal] = useState(false)
const [showAddMoneyPromptModal, setShowAddMoneyPromptModal] = useState(false)
const [showBalanceWarningModal, setShowBalanceWarningModal] = useState(false)

const userFullName = useMemo(() => {
if (!user) return
Expand Down Expand Up @@ -97,6 +111,27 @@ export default function Home() {
}
}, [user?.hasPwaInstalled])

// effect for showing balance warning modal
useEffect(() => {
if (typeof window !== 'undefined' && !isFetchingBalance) {
const hasSeenBalanceWarning = getFromLocalStorage('hasSeenBalanceWarning')
const balanceInUsd = Number(formatUnits(balance, PEANUT_WALLET_TOKEN_DECIMALS))

// show if:
// 1. balance is above the threshold
// 2. user hasn't seen this warning in the current session
// 3. no other modals are currently active
if (
balanceInUsd > BALANCE_WARNING_THRESHOLD &&
!hasSeenBalanceWarning &&
!showIOSPWAInstallModal &&
!showAddMoneyPromptModal
) {
setShowBalanceWarningModal(true)
}
}
}, [balance, isFetchingBalance, showIOSPWAInstallModal, showAddMoneyPromptModal])

// effect for showing add money prompt modal
useEffect(() => {
if (typeof window !== 'undefined' && !isFetchingBalance) {
Expand All @@ -106,14 +141,20 @@ export default function Home() {
// 1. balance is zero.
// 2. user hasn't seen this prompt in the current session.
// 3. the iOS PWA install modal is not currently active.
// 4. the balance warning modal is not currently active.
// this allows the modal on any device (iOS/Android) and in any display mode (PWA/browser),
// as long as the PWA modal (which is iOS & browser-specific) isn't taking precedence.
if (balance === 0n && !hasSeenAddMoneyPromptThisSession && !showIOSPWAInstallModal) {
if (
balance === 0n &&
!hasSeenAddMoneyPromptThisSession &&
!showIOSPWAInstallModal &&
!showBalanceWarningModal
) {
setShowAddMoneyPromptModal(true)
sessionStorage.setItem('hasSeenAddMoneyPromptThisSession', 'true')
}
}
}, [balance, isFetchingBalance, showIOSPWAInstallModal])
}, [balance, isFetchingBalance, showIOSPWAInstallModal, showBalanceWarningModal])

if (isLoading) {
return <PeanutLoading coverFullScreen />
Expand Down Expand Up @@ -174,6 +215,15 @@ export default function Home() {

{/* Add Money Prompt Modal */}
<AddMoneyPromptModal visible={showAddMoneyPromptModal} onClose={() => setShowAddMoneyPromptModal(false)} />

{/* Balance Warning Modal */}
<BalanceWarningModal
visible={showBalanceWarningModal}
onCloseAction={() => {
setShowBalanceWarningModal(false)
saveToLocalStorage('hasSeenBalanceWarning', 'true', BALANCE_WARNING_EXPIRY)
}}
/>
</PageContainer>
)
}
Expand Down
Loading
Loading