Skip to content

Commit f556f84

Browse files
committed
feat(dashboard): add Payment Activity tab and make header tabs scrollable on mobile
- import and register `UserActivityCard`; extend `activeTab` union to include 'payment' - add new "Payment Activity" tab panel and move `UserPaymentLogs` into it - make tab header horizontally scrollable on small screens (wrap in overflow-x-auto, use flex-nowrap/whitespace-nowrap) - prevent tab buttons from shrinking (add flex-shrink-0) so tabs remain scrollable touch targets
1 parent 5d8d5a2 commit f556f84

File tree

1 file changed

+60
-36
lines changed

1 file changed

+60
-36
lines changed

src/react/pages/Dashboard.tsx

Lines changed: 60 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@ import React from 'react';
22
import { getUserInfo } from '../utils/user';
33
import DashboardContent from './dashboard/DashboardContent';
44
import UserPaymentLogs from './dashboard/UserPaymentLogs';
5+
import UserActivityCard from './dashboard/UserActivityCard';
56

67
export default function Dashboard() {
78
const [isAuthenticated, setIsAuthenticated] = React.useState<boolean>(false);
89
const [isLoading, setIsLoading] = React.useState<boolean>(true);
9-
const [activeTab, setActiveTab] = React.useState<'content' | 'activity'>('content');
10+
const [activeTab, setActiveTab] = React.useState<'content' | 'activity' | 'payment'>('content');
1011

1112
React.useEffect(() => {
1213
let mounted = true;
@@ -46,40 +47,57 @@ export default function Dashboard() {
4647
<>
4748
<div className="w-full">
4849
<div className="mb-4 border-b border-gray-200 dark:border-gray-700">
49-
<ul
50-
className="flex flex-wrap -mb-px text-sm font-medium text-center text-gray-500 dark:text-gray-400"
51-
role="tablist">
52-
<li className="me-2" role="presentation">
53-
<button
54-
type="button"
55-
role="tab"
56-
aria-controls="user-information"
57-
aria-selected={activeTab === 'content'}
58-
className={`inline-block p-4 rounded-t-lg border-b-2 ${
59-
activeTab === 'content'
60-
? 'text-blue-600 border-blue-600 dark:text-blue-500 dark:border-blue-500 bg-gray-100 dark:bg-gray-800'
61-
: 'border-transparent hover:text-gray-600 hover:border-gray-300 dark:hover:text-gray-300'
62-
}`}
63-
onClick={() => setActiveTab('content')}>
64-
User information
65-
</button>
66-
</li>
67-
<li role="presentation">
68-
<button
69-
type="button"
70-
role="tab"
71-
aria-controls="user-activity"
72-
aria-selected={activeTab === 'activity'}
73-
className={`inline-block p-4 rounded-t-lg border-b-2 ${
74-
activeTab === 'activity'
75-
? 'text-blue-600 border-blue-600 dark:text-blue-500 dark:border-blue-500 bg-gray-100 dark:bg-gray-800'
76-
: 'border-transparent hover:text-gray-600 hover:border-gray-300 dark:hover:text-gray-300'
77-
}`}
78-
onClick={() => setActiveTab('activity')}>
79-
Activity
80-
</button>
81-
</li>
82-
</ul>
50+
<div className="overflow-x-auto">
51+
<ul
52+
className="flex flex-nowrap -mb-px text-sm font-medium text-center text-gray-500 dark:text-gray-400 whitespace-nowrap"
53+
role="tablist">
54+
<li className="me-2" role="presentation">
55+
<button
56+
type="button"
57+
role="tab"
58+
aria-controls="user-information"
59+
aria-selected={activeTab === 'content'}
60+
className={`inline-block p-4 rounded-t-lg border-b-2 flex-shrink-0 ${
61+
activeTab === 'content'
62+
? 'text-blue-600 border-blue-600 dark:text-blue-500 dark:border-blue-500 bg-gray-100 dark:bg-gray-800'
63+
: 'border-transparent hover:text-gray-600 hover:border-gray-300 dark:hover:text-gray-300'
64+
}`}
65+
onClick={() => setActiveTab('content')}>
66+
User information
67+
</button>
68+
</li>
69+
<li role="presentation">
70+
<button
71+
type="button"
72+
role="tab"
73+
aria-controls="user-activity"
74+
aria-selected={activeTab === 'activity'}
75+
className={`inline-block p-4 rounded-t-lg border-b-2 flex-shrink-0 ${
76+
activeTab === 'activity'
77+
? 'text-blue-600 border-blue-600 dark:text-blue-500 dark:border-blue-500 bg-gray-100 dark:bg-gray-800'
78+
: 'border-transparent hover:text-gray-600 hover:border-gray-300 dark:hover:text-gray-300'
79+
}`}
80+
onClick={() => setActiveTab('activity')}>
81+
Activity
82+
</button>
83+
</li>
84+
<li role="presentation">
85+
<button
86+
type="button"
87+
role="tab"
88+
aria-controls="payment-activity"
89+
aria-selected={activeTab === 'payment'}
90+
className={`inline-block p-4 rounded-t-lg border-b-2 flex-shrink-0 ${
91+
activeTab === 'payment'
92+
? 'text-blue-600 border-blue-600 dark:text-blue-500 dark:border-blue-500 bg-gray-100 dark:bg-gray-800'
93+
: 'border-transparent hover:text-gray-600 hover:border-gray-300 dark:hover:text-gray-300'
94+
}`}
95+
onClick={() => setActiveTab('payment')}>
96+
Payment Activity
97+
</button>
98+
</li>
99+
</ul>
100+
</div>
83101
</div>
84102

85103
<div id="dashboard-tabs-content">
@@ -95,7 +113,13 @@ export default function Dashboard() {
95113
role="tabpanel"
96114
aria-labelledby="user-activity"
97115
className={`${activeTab === 'activity' ? '' : 'hidden'}`}>
98-
{/* <UserActivityCard /> */}
116+
<UserActivityCard />
117+
</div>
118+
<div
119+
id="payment-activity"
120+
role="tabpanel"
121+
aria-labelledby="payment-activity"
122+
className={`${activeTab === 'payment' ? '' : 'hidden'}`}>
99123
<UserPaymentLogs className="w-full px-2 sm:px-4 md:px-6 lg:px-8 transition-colors mt-4" />
100124
</div>
101125
</div>

0 commit comments

Comments
 (0)