feat: multi-tier agent hierarchy, wallet ledger, and player UX polish
Add configurable agent max level and default sub-agent credit ratio, per-agent block direct player login on suspend, admin/agent wallet transaction views, and match detail my-bets section with refreshed player card styling. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -9,6 +9,8 @@ export interface StaffUser {
|
||||
locale?: string;
|
||||
role?: string;
|
||||
agentLevel?: number | null;
|
||||
maxAgentLevel?: number | null;
|
||||
canManageSubAgents?: boolean;
|
||||
}
|
||||
|
||||
const TOKEN_KEY = 'manage_token';
|
||||
@@ -127,6 +129,15 @@ export function useAuthStore() {
|
||||
const isAgent = computed(() => resolveUserType() === 'AGENT');
|
||||
const isTier1Agent = computed(() => isAgent.value && user.value?.agentLevel === 1);
|
||||
const isTier2Agent = computed(() => isAgent.value && user.value?.agentLevel === 2);
|
||||
const canManageSubAgents = computed(() => {
|
||||
if (!isAgent.value) return false;
|
||||
if (user.value?.canManageSubAgents != null) return user.value.canManageSubAgents;
|
||||
const level = user.value?.agentLevel;
|
||||
const max = user.value?.maxAgentLevel;
|
||||
if (level == null || level < 1) return false;
|
||||
if (max == null || max === 0) return true;
|
||||
return level < max;
|
||||
});
|
||||
const portalLabel = computed(() => (isAdmin.value ? '平台后台' : '代理后台'));
|
||||
|
||||
function setSession(newToken: string, newUser: StaffUser) {
|
||||
@@ -149,6 +160,7 @@ export function useAuthStore() {
|
||||
isAgent,
|
||||
isTier1Agent,
|
||||
isTier2Agent,
|
||||
canManageSubAgents,
|
||||
portalLabel,
|
||||
setSession,
|
||||
logout,
|
||||
|
||||
Reference in New Issue
Block a user