Admin: add match/player overview sub-nav; refine settlement flow and league match management UI; improve action button enabled/disabled styles; enhance logo upload and outright odds sync. API: expose matchPhase/bettingOpen for closed matches; league publish guards; settlement preview with auto score save; outright team auto-sync. Player: watermark for closed/settled states; keep match and bet details visible; remove default login credentials. Co-authored-by: Cursor <cursoragent@cursor.com>
172 lines
4.6 KiB
TypeScript
172 lines
4.6 KiB
TypeScript
import { createRouter, createWebHistory } from 'vue-router';
|
|
import { useAuthStore } from '../stores/auth';
|
|
import { ensureStaffSession } from '../utils/session-hydrate';
|
|
|
|
const router = createRouter({
|
|
history: createWebHistory(),
|
|
routes: [
|
|
{ path: '/login', component: () => import('../views/Login.vue'), meta: { public: true } },
|
|
{
|
|
path: '/',
|
|
component: () => import('../layouts/ManageLayout.vue'),
|
|
meta: { auth: true },
|
|
children: [
|
|
{
|
|
path: '',
|
|
component: () => import('../views/HomeEntry.vue'),
|
|
children: [
|
|
{
|
|
path: '',
|
|
component: () => import('../views/dashboard/DashboardMatches.vue'),
|
|
},
|
|
{
|
|
path: 'dashboard/players',
|
|
component: () => import('../views/dashboard/DashboardPlayers.vue'),
|
|
},
|
|
],
|
|
},
|
|
{
|
|
path: 'users',
|
|
component: () => import('../views/AgentManager.vue'),
|
|
meta: { adminOnly: true },
|
|
},
|
|
{
|
|
path: 'finance-logs',
|
|
component: () => import('../views/FinanceLogs.vue'),
|
|
},
|
|
{
|
|
path: 'agent-credit-transactions',
|
|
redirect: (to) => ({
|
|
path: '/finance-logs',
|
|
query: { ...to.query, tab: 'credit' },
|
|
}),
|
|
},
|
|
{
|
|
path: 'agents',
|
|
redirect: '/users',
|
|
},
|
|
{
|
|
path: 'matches',
|
|
component: () => import('../views/Matches.vue'),
|
|
meta: { adminOnly: true },
|
|
},
|
|
{
|
|
path: 'matches/outrights',
|
|
component: () => import('../views/MatchesOutrights.vue'),
|
|
meta: { adminOnly: true },
|
|
},
|
|
{
|
|
path: 'matches/:matchId/edit',
|
|
name: 'admin-match-edit',
|
|
component: () => import('../views/matches/MatchEventEditor.vue'),
|
|
meta: { adminOnly: true },
|
|
},
|
|
{
|
|
path: 'matches/:matchId/markets',
|
|
name: 'admin-match-markets',
|
|
component: () => import('../views/matches/MatchMarketsPage.vue'),
|
|
meta: { adminOnly: true },
|
|
},
|
|
{ path: 'outrights', redirect: '/matches/outrights' },
|
|
{
|
|
path: 'outrights/:matchId/edit',
|
|
name: 'admin-outright-edit',
|
|
component: () => import('../views/outrights/OutrightEditRedirect.vue'),
|
|
meta: { adminOnly: true },
|
|
},
|
|
{ path: 'world-cup-outright', redirect: '/matches/outrights' },
|
|
{
|
|
path: 'bets',
|
|
component: () => import('../views/Bets.vue'),
|
|
meta: { adminOnly: true },
|
|
},
|
|
{
|
|
path: 'settlement/:id',
|
|
component: () => import('../views/Settlement.vue'),
|
|
meta: { adminOnly: true },
|
|
},
|
|
{
|
|
path: 'cashback',
|
|
component: () => import('../views/Cashback.vue'),
|
|
meta: { adminOnly: true },
|
|
},
|
|
{
|
|
path: 'contents',
|
|
component: () => import('../views/Contents.vue'),
|
|
meta: { adminOnly: true },
|
|
},
|
|
{
|
|
path: 'audit',
|
|
component: () => import('../views/Audit.vue'),
|
|
meta: { adminOnly: true },
|
|
},
|
|
{
|
|
path: 'smoke-tests',
|
|
component: () => import('../views/SmokeTests.vue'),
|
|
meta: { adminOnly: true },
|
|
},
|
|
{
|
|
path: 'media',
|
|
component: () => import('../views/MediaLibrary.vue'),
|
|
meta: { adminOnly: true },
|
|
},
|
|
{
|
|
path: 'my-players',
|
|
component: () => import('../views/agent/Players.vue'),
|
|
meta: { agentOnly: true },
|
|
},
|
|
{
|
|
path: 'sub-agents',
|
|
redirect: '/my-players',
|
|
},
|
|
{
|
|
path: 'my-bets',
|
|
component: () => import('../views/agent/Bets.vue'),
|
|
meta: { agentOnly: true },
|
|
},
|
|
],
|
|
},
|
|
],
|
|
});
|
|
|
|
router.beforeEach(async (to) => {
|
|
const auth = useAuthStore();
|
|
const hasToken = !!auth.token.value;
|
|
|
|
if (hasToken) {
|
|
await ensureStaffSession();
|
|
}
|
|
|
|
const hasUser = !!auth.user.value?.userType;
|
|
|
|
if (to.meta.public) {
|
|
if (hasToken && hasUser) return '/';
|
|
return true;
|
|
}
|
|
|
|
if (!hasToken || !hasUser) {
|
|
auth.clearStaffSession();
|
|
return { path: '/login', query: { redirect: to.fullPath } };
|
|
}
|
|
|
|
if (to.meta.adminOnly && !auth.isAdmin.value) {
|
|
return '/';
|
|
}
|
|
|
|
if (to.path.startsWith('/dashboard/') && !auth.isAdmin.value) {
|
|
return '/';
|
|
}
|
|
|
|
if (to.meta.agentOnly && !auth.isAgent.value) {
|
|
return '/';
|
|
}
|
|
|
|
if (to.meta.tier1AgentOnly && !auth.isTier1Agent.value) {
|
|
return '/';
|
|
}
|
|
|
|
return true;
|
|
});
|
|
|
|
export default router;
|