From 8528e340a944fd057d73130280f4da00d47feb1a Mon Sep 17 00:00:00 2001 From: ST3R Git <143852127+st3rs@users.noreply.github.com> Date: Sat, 7 Feb 2026 08:50:35 +0700 Subject: [PATCH] feat: add dark mode and demo/auditor modes --- .gitignore | 8 + index.html | 13 + package-lock.json | 3589 +++++++++++++++++++ package.json | 32 + postcss.config.js | 6 + src/App.tsx | 40 + src/components/charts/StatusPieChart.tsx | 39 + src/components/charts/VolumeLineChart.tsx | 36 + src/components/layout/AppLayout.tsx | 34 + src/components/layout/Sidebar.tsx | 106 + src/components/layout/TopHeader.tsx | 167 + src/components/shared/MetricCard.tsx | 40 + src/components/shared/RequireAuth.tsx | 14 + src/components/shared/RequireRole.tsx | 23 + src/components/tables/AuditTable.tsx | 65 + src/components/tables/MerchantTable.tsx | 83 + src/components/tables/SettlementsTable.tsx | 80 + src/components/tables/TransactionsTable.tsx | 75 + src/components/tables/WebhookTable.tsx | 61 + src/context/AuthContext.tsx | 134 + src/context/ModeContext.tsx | 111 + src/context/ThemeContext.tsx | 69 + src/lib/apiClient.ts | 39 + src/lib/authStorage.ts | 26 + src/lib/masking.ts | 43 + src/lib/mockData.ts | 160 + src/lib/queries.ts | 138 + src/lib/rbac.ts | 15 + src/main.tsx | 34 + src/pages/AccessDeniedPage.tsx | 19 + src/pages/LoginPage.tsx | 93 + src/pages/NotFoundPage.tsx | 19 + src/pages/dashboard/DashboardPage.tsx | 88 + src/pages/logs/LogsPage.tsx | 34 + src/pages/merchants/MerchantDetailPage.tsx | 97 + src/pages/merchants/MerchantsPage.tsx | 36 + src/pages/settings/SettingsPage.tsx | 103 + src/pages/settlements/SettlementsPage.tsx | 40 + src/pages/transactions/TransactionsPage.tsx | 40 + src/pages/webhooks/WebhooksPage.tsx | 34 + src/styles/index.css | 54 + src/types/auth.ts | 13 + src/types/data.ts | 95 + src/vite-env.d.ts | 1 + tailwind.config.js | 9 + tsconfig.json | 25 + tsconfig.node.json | 10 + vite.config.ts | 15 + 48 files changed, 6105 insertions(+) create mode 100644 .gitignore create mode 100644 index.html create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 postcss.config.js create mode 100644 src/App.tsx create mode 100644 src/components/charts/StatusPieChart.tsx create mode 100644 src/components/charts/VolumeLineChart.tsx create mode 100644 src/components/layout/AppLayout.tsx create mode 100644 src/components/layout/Sidebar.tsx create mode 100644 src/components/layout/TopHeader.tsx create mode 100644 src/components/shared/MetricCard.tsx create mode 100644 src/components/shared/RequireAuth.tsx create mode 100644 src/components/shared/RequireRole.tsx create mode 100644 src/components/tables/AuditTable.tsx create mode 100644 src/components/tables/MerchantTable.tsx create mode 100644 src/components/tables/SettlementsTable.tsx create mode 100644 src/components/tables/TransactionsTable.tsx create mode 100644 src/components/tables/WebhookTable.tsx create mode 100644 src/context/AuthContext.tsx create mode 100644 src/context/ModeContext.tsx create mode 100644 src/context/ThemeContext.tsx create mode 100644 src/lib/apiClient.ts create mode 100644 src/lib/authStorage.ts create mode 100644 src/lib/masking.ts create mode 100644 src/lib/mockData.ts create mode 100644 src/lib/queries.ts create mode 100644 src/lib/rbac.ts create mode 100644 src/main.tsx create mode 100644 src/pages/AccessDeniedPage.tsx create mode 100644 src/pages/LoginPage.tsx create mode 100644 src/pages/NotFoundPage.tsx create mode 100644 src/pages/dashboard/DashboardPage.tsx create mode 100644 src/pages/logs/LogsPage.tsx create mode 100644 src/pages/merchants/MerchantDetailPage.tsx create mode 100644 src/pages/merchants/MerchantsPage.tsx create mode 100644 src/pages/settings/SettingsPage.tsx create mode 100644 src/pages/settlements/SettlementsPage.tsx create mode 100644 src/pages/transactions/TransactionsPage.tsx create mode 100644 src/pages/webhooks/WebhooksPage.tsx create mode 100644 src/styles/index.css create mode 100644 src/types/auth.ts create mode 100644 src/types/data.ts create mode 100644 src/vite-env.d.ts create mode 100644 tailwind.config.js create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 vite.config.ts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ba9de6e --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +node_modules +.dist +.vite +dist +.env +*.tsbuildinfo +vite.config.*.js +vite.config.*.d.ts diff --git a/index.html b/index.html new file mode 100644 index 0000000..35b7e36 --- /dev/null +++ b/index.html @@ -0,0 +1,13 @@ + + +
+ + + +Status breakdown
+Rolling 24h
+Volume per day (THB)
+Last 7 days
+Environment
+{metric.label}
+{value}
+{metric.change}
+Audit & Error Logs
+System events and admin actions
+| Actor | +Action | +Target | +Timestamp | +Severity | +
|---|---|---|---|---|
| + {demoMode ? redactPII(log.actor) : log.actor} + | +{demoMode ? redactPII(log.action) : log.action} | ++ {demoMode ? redactPII(log.target) : log.target} + | +{log.createdAt} | ++ {log.severity} + | +
Merchant Portfolio
+Live PromptPay to USDT routing
+| Merchant | +Status | +PromptPay ID | +USDT Wallet | +API Key | +Risk Tier | +Actions | +
|---|---|---|---|---|---|---|
|
+ {merchant.name} +{merchant.id} + |
+ + + {merchant.status} + + | ++ {demoMode ? maskPhoneOrPromptpay(merchant.promptPayId) : merchant.promptPayId} + | ++ {demoMode ? maskWallet(merchant.usdtWallet) : merchant.usdtWallet} + | ++ {demoMode ? maskApiKey(merchant.apiKey) : merchant.apiKey} + | +{merchant.riskTier} | +
+
+
+ View
+
+ {canManage && (
+
+ )}
+
+ |
+
Settlement Batches
+TRC20 confirmations + retry controls
+| Settlement | +Amount (THB) | +Amount (USDT) | +Fee % | +Net | +Tx Hash | +Status | +Action | +
|---|---|---|---|---|---|---|---|
| {settlement.id} | ++ {demoMode ? maskAmountTHB(settlement.amountTHB) : `฿${settlement.amountTHB.toLocaleString()}`} + | ++ {demoMode ? maskAmountUSDT(settlement.amountUSDT) : settlement.amountUSDT.toLocaleString()} + | +{settlement.fee}% | ++ {demoMode ? maskAmountUSDT(settlement.netAmount) : settlement.netAmount.toLocaleString()} + | +{settlement.txHash} | ++ {settlement.status} + | ++ {canRetry && ( + + )} + | +
Realtime Transactions
+PromptPay transfers with settlement state
+| Reference | +Merchant | +Amount (THB) | +Status | +Created | +
|---|---|---|---|---|
| {tx.reference} | +{tx.merchant} | ++ {demoMode ? maskAmountTHB(tx.amountTHB) : `฿${tx.amountTHB.toLocaleString()}`} + | ++ {tx.status} + | +{tx.createdAt} | +
Webhook Intake
+Signature validation + deduplication
+| Event | +Provider | +Signature | +Deduplication | +Created | +
|---|---|---|---|---|
| {log.id} | +{demoMode ? redactPII(log.provider) : log.provider} | ++ + {log.signatureStatus} + + | ++ + {log.deduplication} + + | +{log.createdAt} | +
Access denied
+Contact a super admin if you need elevated access.
+PromptPay → USDT
+Admin sign-in
+Demo accounts
+404
+The route you requested does not exist.
+Overview
+Latest Transactions
+Auto-refreshing every 60 seconds
+{tx.reference}
+{tx.merchant}
++ {demoMode ? maskAmountTHB(tx.amountTHB) : `฿${tx.amountTHB.toLocaleString()}`} +
+{tx.status}
+Operational Alerts
+Requires attention
+Logs
+System actions
+482
+Admin actions
+182
+Failed jobs
+6
+Merchant
+Merchant profile
+PromptPay ID
++ {demoMode ? maskPhoneOrPromptpay(merchant.promptPayId) : merchant.promptPayId} +
+USDT Wallet
+{demoMode ? maskWallet(merchant.usdtWallet) : merchant.usdtWallet}
+API Key
+{demoMode ? maskApiKey(merchant.apiKey) : merchant.apiKey}
+Risk tier
+{merchant.riskTier}
+Settlement rules
+IP whitelist
+Recent transactions
+{tx.reference}
+{tx.createdAt}
++ {demoMode ? maskAmountTHB(tx.amountTHB) : `฿${tx.amountTHB.toLocaleString()}`} +
+{tx.status}
+Merchants
+Active merchants
+124
+Suspended
+6
+Risk reviews
+12
+Settings
+Environment info
+Rate limits
+Feature toggles
+Presentation controls
+Use demo data
+Force mock data for presentation-only environments.
+Global limits
+Daily volume cap
+฿200M
+USDT liquidity buffer
+8.5M
+Alert threshold
+75%
+Settlements
+Ready to settle
++ {demoMode ? maskAmountTHB(8_200_000) : '฿8.2M'} +
+Pending confirmations
+5
+Failed batches
+1
+Transactions
+Success rate
+98.3%
+Avg. settlement time
+14m
+Pending
+128
+Failed
+24
+Webhooks
+Incoming / hr
+1,280
+Signature failures
+4
+Deduped
+92
+