B2B Portal React 18 · CRA + Craco TypeScript 4.9 Tailwind CSS 3 @kioskgaming/ui

Agent Portal (Cổng Đại Lý)

Giao diện dành riêng cho Đại Lý — nhà phân phối khu vực quản lý mạng lưới shop gaming, mua/phân phối credits, ví USD online, giám sát giao dịch tiền mặt và giao tiếp với hệ sinh thái kiosk.

17+
Route bảo vệ
2
Ví (Credit + USD)
Shops quản lý
B2B
Credit Economy

Vị trí trong hệ thống

Agent là tầng thứ hai trong chuỗi phân cấp bốn lớp của KioskGaming. Mỗi Agent phụ trách nhiều Shop và tiếp nhận credits từ SuperAgent hoặc nền tảng.

👑  SuperAgent
🏢  Agent YOU ARE HERE
🏪  Shop
💵  Cashier
🎮  Player
🏢

Agent (Đại Lý): Nhà phân phối khu vực. Mua credits từ SuperAgent/platform, bán credits cho shop qua giao dịch tiền mặt (cash-credits), thiết lập costRate cho từng shop và giám sát ví credit + ví USD online.

🔗

Chuỗi B2B: SuperAgent → Agent → Shop → Cashier → Player. Credits chảy xuống; tiền mặt/USD chảy ngược lên theo costRate.

💡

Repo lưu ý: Thư mục lồng kioskgaming_backend/ chỉ là bản clone backend tham khảo — frontend gọi API qua REACT_APP_API_BASE_URL, không import code backend.

Hành trình Đại Lý

Quy trình vận hành tiêu chuẩn của một Agent từ khi mua credits đến khi giám sát hiệu suất shop.

1. Mua Credits từ Platform

Agent mở CreditPurchaseModal, chọn số lượng và phương thức thanh toán (ZeroX crypto, eCash, chuyển khoản ngân hàng…). Sau khi thanh toán xong, credits được cộng vào ví của Agent.

2. Bán Credits cho Shop (Cash Sale)

Từ trang chi tiết shop, Agent dùng SellCreditsCashToShopTrigger (SellCreditsCashModal từ @kioskgaming/ui) gọi POST /agent/shops/:id/cash-credits — ghi nhận tiền mặt shop trả và phân phối credits đồng thời.

3. Tạo và Cấu hình Shop

Agent tạo shop mới với thông tin: tên, email, số điện thoại, mật khẩu và costRate — tỷ lệ thập phân (0.05 = 5%) Agent thu trên mỗi credit giao cho shop đó.

4. Giám sát Hiệu suất

Dashboard hiển thị số dư credits, danh sách shops, số lượng players, giao dịch gần đây và AgentHierarchyMiniTree — cây phân cấp trực quan Agent → Shops.

5. Quản trị Shop (Governance)

Nếu shop vi phạm, Agent dùng ShopGovernanceModal để tạm ngưng (Suspend), mở lại (Unsuspend) hoặc chấm dứt hợp đồng (Terminate) một shop.

Quản lý Shop

Agent có toàn quyền CRUD đối với các Shop thuộc phạm vi của mình, bao gồm thiết lập giá và kiểm soát trạng thái hoạt động.

🏪

Tạo Shop mới

Form sử dụng react-hook-form v7. Các trường: tên, username, email, phone, password và costRate (% → cost_rate thập phân). File: ShopsPage.tsx

📋

Danh sách Shops

Liệt kê tất cả shops với trạng thái, số dư credits, số players và nút hành động nhanh. Hỗ trợ phân phối credits trực tiếp từ danh sách.

🔍

Chi tiết Shop

Route /shops/:shopId dùng ShopDetailPageRedesign.tsx (import alias ShopDetailPage). Hiển thị ví credit/USD shop, game mapping, bán/rút credits.

⚖️

Shop Governance Modal

ShopGovernanceModal.tsx cung cấp ba hành động quản trị với xác nhận: Suspend, Unsuspend, Terminate.

costRate — Tỷ lệ giá Credit

💰

costRate là số thập phân 0–1 (vd 0.05 = 5%). Shop phải có costRate lớn hơn costRate của Agent. Tiền shop nợ = credits × shopCostRate; lợi nhuận agent = credits × (shopCostRate − agentCostRate). Dùng formatCostRate()percentInputToRate() trong costFormat.ts.

Trạng thái Shop Hiển thị Agent có thể làm Giao dịch
Active Badge xanh lá Phân phối credits, xem chi tiết, Suspend / Terminate Bình thường
Suspended Badge vàng Unsuspend, Terminate, xem chi tiết Bị chặn
Terminated Badge đỏ Chỉ xem — không thể phục hồi Đã đóng

Hệ thống Credits

Credits là đơn vị tiền tệ trung gian trong hệ thống. Agent mua credits từ nền tảng và phân phối xuống các shop để shop phục vụ players. Đây là luồng tiền tệ cốt lõi của toàn bộ hệ sinh thái.

Luồng Credits

Platform / SuperAgent
Agent Wallet
Shop Wallet
Player Sessions

Hai ví: Credit + USD Online

💳

Ví Credit (CDN)

Số dư credit_balance trên dashboard. Mua qua CreditPurchaseModal, chuyển đổi từ USD qua convertBalanceToCredits. Ledger tại /transactions.

💵

Ví USD Online

online_balance_net — hoa hồng/tiền mặt tích lũy. Trang /online-transactions, rút crypto qua OTP + createAgentOnlineBalanceWithdrawal.

CreditPurchaseModal — Mua credit online

1

Chọn số tiền

Agent nhập hoặc chọn số tiền muốn mua. Với eCash, chỉ được chọn từ danh sách cố định (ECASH_APP_ALLOWED_AMOUNTS).

2

Chọn phương thức thanh toán

Hiển thị các tùy chọn: ZeroX crypto, eCash app, chuyển khoản ngân hàng, v.v. Mỗi phương thức có UI riêng biệt.

3

Xác nhận & Thanh toán

Modal nhúng iframe checkout provider + nút mở tab mới. ZeroX static wallets qua /agent/payments/zeroxprocessing/static-wallets.

4

Xác nhận hoàn thành

AgentPaymentReturnPage.tsx nhận redirect sau khi thanh toán. Credits được cộng vào ví Agent.

Phương thức thanh toán

🔮

ZeroX Crypto — Thanh toán tiền điện tử. Hiển thị địa chỉ ví, QR code. Options định nghĩa tại ZEROX_PAYMENT_OPTIONS.

📱

eCash App — Ứng dụng thanh toán nội bộ. Chỉ nhận các mệnh giá được liệt kê trong ECASH_APP_ALLOWED_AMOUNTS.

🏦

Bank Transfer — Chuyển khoản ngân hàng truyền thống với thông tin tài khoản được cung cấp.

SellCreditsCashToShopTrigger — Bán credit cho shop

📤

Bán credits (cash-credits)

SellCreditsCashToShopTrigger trên Shop Detail gọi createShopCashCredits. Ghi cash transaction + phân phối credits một lần.

📥

Rút credits từ shop

WithdrawCreditsFromShopTriggerPOST /agent/shops/:id/credits/withdraw. Hoàn credits về ví agent khi cần.

Broadcast & Thông báo

Agent có nhiều kênh giao tiếp với shops và players: broadcast toàn hệ thống, popup định mục tiêu và notification bell thời gian thực.

📢

SendBroadcastPage

Gửi thông điệp broadcast đến tất cả shops/players thuộc Agent. Hỗ trợ link markup được xử lý bởi broadcastLinkMarkup.ts.

💬

SendShopPopupPage

Gửi popup thông báo đến một shop cụ thể. Phù hợp cho cảnh báo riêng tư, thông báo khuyến mãi theo shop.

🔔

AgentNotificationBell

Icon chuông với badge đếm số thông báo chưa đọc. Hiển thị ở header mọi trang. Demo: 🔔 3 Thông báo

AgentInAppPopupGate

🚪

AgentInAppPopupGate.tsx là một wrapper component đặt ở cấp cao trong cây component. Nó lắng nghe các broadcast/popup đến từ server và tự động chặn màn hình để hiển thị thông điệp trước khi Agent tiếp tục dùng app.

🔗

broadcastLinkMarkup.ts: Parser chuyển đổi cú pháp link đặc biệt trong nội dung broadcast thành các thẻ HTML anchor có thể click được. BroadcastMessageBody.tsx render kết quả đã parse.

Luồng Broadcast

1

Agent soạn thông điệp

Nhập nội dung, có thể dùng link markup [text](url).

2

Server phân phối

Backend gửi thông điệp đến tất cả shops/players thuộc Agent.

3

InAppPopupGate chặn

Shops/players nhận popup overlay khi đăng nhập hoặc theo thời gian thực.

Dashboard & Analytics

Trang chủ Dashboard (DashboardPage.tsx) là trung tâm điều hành của Agent — cung cấp cái nhìn tổng quan tức thì về toàn bộ mạng lưới.

🌳

AgentHierarchyMiniTree

AgentHierarchyMiniTree.tsx — cây phân cấp dạng thu gọn hiển thị ngay trên Dashboard. Visualize mối quan hệ Agent → Shops với số liệu tóm tắt từng nhánh.

💳

AvailableCreditsCallout

AvailableCreditsCallout.tsx — khối nổi bật hiển thị số dư credits hiện tại của Agent, kèm nút "Mua Credits" và "Phân phối" để truy cập nhanh.

🧾

AgentHomeRecentTransactions

AgentHomeRecentTransactions.tsx — bảng giao dịch gần nhất hiển thị trên Dashboard. Liệt kê loại, số tiền, shop liên quan và thời gian.

📈

AgentTransactionsPage

Trang lịch sử giao dịch đầy đủ (AgentTransactionsPage.tsx) với filter theo thời gian, loại giao dịch và shop.

Các Widget trên Dashboard

Widget Component Dữ liệu hiển thị Action
Credit Balance AvailableCreditsCallout Số dư ví Agent Mua / Phân phối
Shops Overview DashboardPage Tổng shops, active / suspended Xem chi tiết
Players Count DashboardPage Tổng players dưới tất cả shops Xem PlayersPage
Recent Transactions AgentHomeRecentTransactions 5–10 giao dịch gần nhất Xem tất cả
Hierarchy Tree AgentHierarchyMiniTree Cây Agent → Shops Drill-down shop

Kỹ thuật

Stack kỹ thuật, cấu trúc thư mục, các utilities quan trọng và tích hợp thanh toán ZeroX.

Cấu trúc thư mục

src/
pages/
DashboardPage.tsx // Trang chủ Agent
ShopsPage.tsx // Quản lý shops
ShopDetailPage.tsx
ShopDetailPageRedesign.tsx
PlayersPage.tsx
AgentPlayerDetailPage.tsx
AgentTransactionsPage.tsx
SendBroadcastPage.tsx
SendShopPopupPage.tsx
OnlineBalanceTransactionsPage.tsx
CashTransactionsLedgerPage.tsx
ProviderFeesPage.tsx · FraudIndicatorsPage.tsx
SendBroadcastPage.tsx · SendShopPopupPage.tsx
SettingsPage.tsx · AgentPaymentReturnPage.tsx
components/credits/
CreditPurchaseModal.tsx · SellCreditsCashToShopTrigger.tsx
WithdrawCreditsFromShopTrigger.tsx · AvailableCreditsCallout.tsx
services/ api.ts // prefix /agent/*
craco.config.js // webpack + @kioskgaming/ui

Stack kỹ thuật

CRA + Craco 7 TypeScript 4.9 React Router v6 Tailwind CSS 3 @kioskgaming/ui @kioskgaming/page-loading Axios · react-hot-toast

costFormat.ts — Utilities chính

// Chuyển % hiển thị → rate nội bộ
percentInputToRate(5)  // "5%" → 0.05

// Format rate nội bộ → hiển thị
formatCostRate(0.05)   // 0.05 → "5%"

Constants quan trọng

// eCash: chỉ cho phép mệnh giá cố định
ECASH_APP_ALLOWED_AMOUNTS = [
  50, 100, 200, 500, 1000
]

// ZeroX: tùy chọn crypto
ZEROX_PAYMENT_OPTIONS = [
  { id: 'eth', label: 'Ethereum' },
  { id: 'usdt', label: 'USDT' },
  ...
]

ZeroX Crypto Integration

🔮

ZeroX là tích hợp thanh toán crypto của nền tảng. Agent chọn token (ETH, USDT…), hệ thống hiển thị địa chỉ ví và QR code. Sau khi on-chain transaction xác nhận, webhook backend cập nhật số dư Agent tự động.

🔒

sanitizeUser.ts làm sạch dữ liệu user trước khi hiển thị — loại bỏ thông tin nhạy cảm, chuẩn hóa tên trường. Dùng trước khi render bất kỳ object user nào ra UI.

React Router v6 — Route chính

Route Component Chức năng
/ DashboardPage Trang chủ — credit + USD balance
/transactions AgentTransactionsPage Ledger ví credit
/online-transactions OnlineBalanceTransactionsPage Ledger ví USD + rút tiền
/cash-transactions CashTransactionsLedgerPage Giao dịch tiền mặt với shop
/provider-fees ProviderFeesPage Phí provider (read-only)
/fraud-indicators FraudIndicatorsPage Cảnh báo gian lận player
/shops ShopsPage Danh sách + tạo shop
/shops/:shopId ShopDetailPageRedesign Chi tiết shop + bán/rút credits
/players PlayersPage Players (read-only)
/broadcasts/send SendBroadcastPage Gửi broadcast
/popups/send SendShopPopupPage Gửi popup in-app
/settings SettingsPage 2FA, cảnh báo số dư, xác minh
/payment/{success,cancelled,error} AgentPayment*Page Callback sau thanh toán online

Quản lý Players

Agent có tầm nhìn (visibility) toàn bộ players thuộc tất cả shops trong mạng lưới, nhưng không can thiệp trực tiếp vào tài khoản player.

👥

PlayersPage

Liệt kê tất cả players trên tất cả shops của Agent. Có thể lọc theo shop, trạng thái. Hiển thị username, shop nguồn, số dư, ngày đăng ký.

👤

AgentPlayerDetailPage

Xem chi tiết một player: thông tin cá nhân, lịch sử giao dịch, session gần đây, shop nào quản lý. Read-only từ phía Agent.

ℹ️

Lưu ý phân quyền: Agent không có quyền tạo, chỉnh sửa hay xóa player. Players được tạo bởi Shop hoặc tự đăng ký. Agent chỉ có quyền xem player trong phạm vi mạng lưới của mình.

Tổng hợp nhanh

📄

17+ Routes

Dashboard, Shops, ShopDetail, Players, Transactions, Online/Cash transactions, Provider fees, Fraud, Broadcast, Popup, Settings, Payment return

🧩

API prefix

/agent/*, /agent-auth/* qua Axios singleton services/api.ts → backend B2B routes

🛠️

Build

craco start/build · packages file:../packages/ui + page-loading · PORT 3003

💳

Hai ví

Credit CDN + USD online balance; mua online, bán cash cho shop, rút crypto

📐

Hierarchy

SuperAgent → Agent → Shop → Cashier → Player

🎯

Chi tiết kỹ thuật

Xem 04+ Chi tiết kỹ thuật — endpoint đầy đủ, auth, cookbook