diff --git a/src/components/message-broadcast.tsx b/src/components/message-broadcast.tsx index 72c2f02..6eb4f4a 100644 --- a/src/components/message-broadcast.tsx +++ b/src/components/message-broadcast.tsx @@ -120,7 +120,7 @@ export function MessageBroadcast({ src={broadcast} />
- + {activeBroadcast ? ( state.setModalOpen) + const { isRefreshingBalance, refreshWalletBalance } = + useWalletBalanceRefresh() const { authStatus, currentLanguageLabel, @@ -217,10 +222,7 @@ export function DesktopHeader() {
- + + - + ) : (
state.setModalOpen) + const { isRefreshingBalance, refreshWalletBalance } = + useWalletBalanceRefresh() const { authStatus, currentLanguageLabel, @@ -133,11 +137,7 @@ export function MobileHeader() {
- + - + ) : (
diff --git a/src/hooks/use-wallet-balance-refresh.ts b/src/hooks/use-wallet-balance-refresh.ts new file mode 100644 index 0000000..b8d5bd7 --- /dev/null +++ b/src/hooks/use-wallet-balance-refresh.ts @@ -0,0 +1,45 @@ +import { useCallback, useRef, useState } from 'react' +import { useTranslation } from 'react-i18next' +import { getCurrentUserProfile } from '@/api' +import { notify } from '@/lib/notify' +import { useAuthStore } from '@/store' + +export function useWalletBalanceRefresh() { + const { t } = useTranslation() + const setCurrentUser = useAuthStore((state) => state.setCurrentUser) + const [isRefreshingBalance, setIsRefreshingBalance] = useState(false) + const refreshPromiseRef = useRef | null>(null) + + const refreshWalletBalance = useCallback(() => { + if (refreshPromiseRef.current) { + return refreshPromiseRef.current + } + + setIsRefreshingBalance(true) + + const refreshPromise = getCurrentUserProfile() + .then((currentUser) => { + setCurrentUser(currentUser) + }) + .catch((error: unknown) => { + notify.error( + error instanceof Error + ? error.message + : t('commonUi.toast.requestFailed'), + ) + }) + .finally(() => { + refreshPromiseRef.current = null + setIsRefreshingBalance(false) + }) + + refreshPromiseRef.current = refreshPromise + + return refreshPromise + }, [setCurrentUser, t]) + + return { + isRefreshingBalance, + refreshWalletBalance, + } +} diff --git a/src/locales/en-US.ts b/src/locales/en-US.ts index d25973d..97c86f3 100644 --- a/src/locales/en-US.ts +++ b/src/locales/en-US.ts @@ -479,6 +479,7 @@ export default { }, commonUi: { actions: { + refreshBalance: 'Refresh balance', submitting: TEXT_SUBMITTING, }, dialog: { diff --git a/src/locales/id-ID.ts b/src/locales/id-ID.ts index a920692..77c7c44 100644 --- a/src/locales/id-ID.ts +++ b/src/locales/id-ID.ts @@ -478,6 +478,7 @@ export default { }, commonUi: { actions: { + refreshBalance: 'Segarkan saldo', submitting: TEXT_SUBMITTING, }, dialog: { diff --git a/src/locales/ms-MY.ts b/src/locales/ms-MY.ts index b651815..7d4f64a 100644 --- a/src/locales/ms-MY.ts +++ b/src/locales/ms-MY.ts @@ -481,6 +481,7 @@ export default { }, commonUi: { actions: { + refreshBalance: 'Segarkan baki', submitting: TEXT_SUBMITTING, }, dialog: { diff --git a/src/locales/zh-CN.ts b/src/locales/zh-CN.ts index a4a17c5..ed04774 100644 --- a/src/locales/zh-CN.ts +++ b/src/locales/zh-CN.ts @@ -462,6 +462,7 @@ export default { }, commonUi: { actions: { + refreshBalance: '刷新余额', submitting: TEXT_SUBMITTING, }, dialog: {