From 1d6a7755a0a3815c85b6c973e6a54dcfc9d72614 Mon Sep 17 00:00:00 2001 From: Vasilica Olariu Date: Wed, 23 Apr 2025 19:15:35 +0300 Subject: [PATCH] PM-1098 - payout tab --- src/apps/wallet/src/home/tabs/WalletTabs.tsx | 18 +++-- .../home/tabs/config/wallet-tabs-config.ts | 21 ++++-- .../home/tabs/payout/PayoutTab.module.scss | 8 +++ .../wallet/src/home/tabs/payout/PayoutTab.tsx | 65 +++++++++++++++++++ src/apps/wallet/src/home/tabs/payout/index.ts | 1 + src/apps/wallet/src/lib/services/wallet.ts | 17 +++++ src/config/environments/default.env.ts | 2 + .../environments/global-config.model.ts | 1 + .../lib/components/tabs-navbar/TabsNavbar.tsx | 33 +++++----- .../tabs-navbar/tabs-nav-item.model.ts | 4 +- 10 files changed, 138 insertions(+), 32 deletions(-) create mode 100644 src/apps/wallet/src/home/tabs/payout/PayoutTab.module.scss create mode 100644 src/apps/wallet/src/home/tabs/payout/PayoutTab.tsx create mode 100644 src/apps/wallet/src/home/tabs/payout/index.ts diff --git a/src/apps/wallet/src/home/tabs/WalletTabs.tsx b/src/apps/wallet/src/home/tabs/WalletTabs.tsx index e754cdd7b..643d438db 100644 --- a/src/apps/wallet/src/home/tabs/WalletTabs.tsx +++ b/src/apps/wallet/src/home/tabs/WalletTabs.tsx @@ -7,6 +7,7 @@ import { PageTitle, TabsNavbar, TabsNavItem } from '~/libs/ui' import { getHashFromTabId, getTabIdFromHash, WalletTabsConfig, WalletTabViews } from './config' import { WinningsTab } from './winnings' import { HomeTab } from './home' +import { PayoutTab } from './payout' import styles from './WalletTabs.module.scss' interface WalletHomeProps { @@ -16,15 +17,16 @@ interface WalletHomeProps { const WalletTabs: FC = (props: WalletHomeProps) => { const { hash }: { hash: string } = useLocation() - const activeTabHash: string = useMemo(() => getTabIdFromHash(hash), [hash]) + const activeTabHash: WalletTabViews = useMemo(() => getTabIdFromHash(hash), [hash]) - const [activeTab, setActiveTab]: [string, Dispatch>] = useState(activeTabHash) + const [activeTab, setActiveTab]: [WalletTabViews, Dispatch>] + = useState(activeTabHash) useEffect(() => { setActiveTab(activeTabHash) }, [activeTabHash]) - function handleTabChange(tabId: string): void { + function handleTabChange(tabId: WalletTabViews): void { setActiveTab(tabId) window.location.hash = getHashFromTabId(tabId) } @@ -34,14 +36,18 @@ const WalletTabs: FC = (props: WalletHomeProps) => { - {[WalletTabsConfig.find((tab: TabsNavItem) => tab.id === activeTab)?.title, 'Wallet', 'Topcoder'].join( - ' | ', - )} + {[ + WalletTabsConfig.find((tab: TabsNavItem) => tab.id === activeTab)?.title, + 'Wallet', + 'Topcoder', + ].join(' | ')} {activeTab === WalletTabViews.winnings && } {activeTab === WalletTabViews.home && } + + {activeTab === WalletTabViews.payout && } ) } diff --git a/src/apps/wallet/src/home/tabs/config/wallet-tabs-config.ts b/src/apps/wallet/src/home/tabs/config/wallet-tabs-config.ts index 231b14521..eb0eac4e9 100644 --- a/src/apps/wallet/src/home/tabs/config/wallet-tabs-config.ts +++ b/src/apps/wallet/src/home/tabs/config/wallet-tabs-config.ts @@ -1,11 +1,12 @@ import { TabsNavItem } from '~/libs/ui' export enum WalletTabViews { - home = '0', - winnings = '1', + home, + winnings, + payout, } -export const WalletTabsConfig: TabsNavItem[] = [ +export const WalletTabsConfig: TabsNavItem[] = [ { id: WalletTabViews.home, title: 'Wallet', @@ -14,23 +15,29 @@ export const WalletTabsConfig: TabsNavItem[] = [ id: WalletTabViews.winnings, title: 'Winnings', }, + { + id: WalletTabViews.payout, + title: 'Payout', + }, ] -export function getHashFromTabId(tabId: string): string { +export function getHashFromTabId(tabId: WalletTabViews): string { switch (tabId) { - case WalletTabViews.home: - return '#home' case WalletTabViews.winnings: return '#winnings' + case WalletTabViews.payout: + return '#payout' default: return '#home' } } -export function getTabIdFromHash(hash: string): string { +export function getTabIdFromHash(hash: string): WalletTabViews { switch (hash) { case '#winnings': return WalletTabViews.winnings + case '#payout': + return WalletTabViews.payout default: return WalletTabViews.home } diff --git a/src/apps/wallet/src/home/tabs/payout/PayoutTab.module.scss b/src/apps/wallet/src/home/tabs/payout/PayoutTab.module.scss new file mode 100644 index 000000000..4cd9378bd --- /dev/null +++ b/src/apps/wallet/src/home/tabs/payout/PayoutTab.module.scss @@ -0,0 +1,8 @@ +@import '@libs/ui/styles/includes'; + +.iframe { + width: 100%; + height: 100%; + border: none; + height: 90vh; +} \ No newline at end of file diff --git a/src/apps/wallet/src/home/tabs/payout/PayoutTab.tsx b/src/apps/wallet/src/home/tabs/payout/PayoutTab.tsx new file mode 100644 index 000000000..749d541c6 --- /dev/null +++ b/src/apps/wallet/src/home/tabs/payout/PayoutTab.tsx @@ -0,0 +1,65 @@ +import { FC, MutableRefObject, useEffect, useRef } from 'react' + +import { UserProfile } from '~/libs/core' +import { EnvironmentConfig } from '~/config' + +import { getTrolleyPortalLink } from '../../../lib/services/wallet' + +import styles from './PayoutTab.module.scss' + +interface PayoutTabProps { + profile: UserProfile +} + +const PayoutTab: FC = props => { + const loading = useRef() + const frameRef: MutableRefObject = useRef() + + useEffect(() => { + if (!props.profile.userId || props.profile.userId === loading.current) { + return + } + + loading.current = props.profile.userId + getTrolleyPortalLink() + .then((link: string) => { + frameRef.current.src = link + }) + }, [props.profile.userId]) + + useEffect(() => { + if (!frameRef.current) { + return undefined + } + + const handleEvent: (event: any) => void = (event: any) => { + const { data: widgetEvent, origin }: { data: { event: string, data: number }, origin: string } = event + + if (origin.indexOf(EnvironmentConfig.TROLLEY_WIDGET_ORIGIN) === -1) { + return + } + + // resize iframe based on the reported content height + if (widgetEvent.event === 'document.height') { + Object.assign(frameRef.current.style, { height: `${widgetEvent.data}px` }) + } + } + + window.addEventListener('message', handleEvent, false) + return (): void => { + window.removeEventListener('message', handleEvent, false) + } + }, [frameRef.current?.src]) + + return ( +
+