20cf2c51f0
Co-Authored-By: Claude <noreply@anthropic.com>
104 lines
2.8 KiB
TypeScript
104 lines
2.8 KiB
TypeScript
import { createRouter, createWebHistory, type RouteRecordRaw } from 'vue-router'
|
|
|
|
// `/` redirects to `/customers`. Chat timeline params are path segments so the
|
|
// URL is shareable + survives refresh:
|
|
// /chat/:channel/:ownerId/:talkerId? (1:1 DM; talkerId optional → account-level)
|
|
// /group/:channel/:ownerId/:roomId? (group chat — same component, room_id)
|
|
const routes: RouteRecordRaw[] = [
|
|
{
|
|
path: '/',
|
|
redirect: { name: 'customers' },
|
|
},
|
|
{
|
|
path: '/customers',
|
|
name: 'customers',
|
|
component: () => import('@/views/CustomerList.vue'),
|
|
meta: { title: '客户列表' },
|
|
},
|
|
{
|
|
path: '/staff',
|
|
name: 'staff',
|
|
component: () => import('@/views/StaffList.vue'),
|
|
meta: { title: '员工列表' },
|
|
},
|
|
{
|
|
// Standalone 员工详情 page mirroring 云客's
|
|
// /cms/customer/userDetailNew?userId=... — replaces the all-fields drawer
|
|
// degradation for the 员工姓名 click. Row-click in StaffList still opens
|
|
// the drawer for a quick preview.
|
|
path: '/staff-detail/:userId',
|
|
name: 'staff-detail',
|
|
component: () => import('@/views/StaffDetail.vue'),
|
|
props: true,
|
|
meta: { title: '员工详情' },
|
|
},
|
|
{
|
|
path: '/accounts',
|
|
redirect: { name: 'staff' },
|
|
},
|
|
{
|
|
path: '/groups',
|
|
name: 'groups',
|
|
component: () => import('@/views/GroupList.vue'),
|
|
meta: { title: '群列表' },
|
|
},
|
|
{
|
|
path: '/calls',
|
|
name: 'calls',
|
|
component: () => import('@/views/CallList.vue'),
|
|
meta: { title: '通话记录' },
|
|
},
|
|
{
|
|
path: '/sms',
|
|
name: 'sms',
|
|
component: () => import('@/views/SmsList.vue'),
|
|
meta: { title: '短信记录' },
|
|
},
|
|
{
|
|
path: '/sync',
|
|
name: 'sync',
|
|
component: () => import('@/views/SyncStatus.vue'),
|
|
meta: { title: '同步状态' },
|
|
},
|
|
{
|
|
path: '/search',
|
|
name: 'search',
|
|
component: () => import('@/views/SearchView.vue'),
|
|
meta: { title: '搜索' },
|
|
},
|
|
{
|
|
path: '/chat/:channel/:ownerId/:talkerId?',
|
|
name: 'chat',
|
|
component: () => import('@/views/ChatTimeline.vue'),
|
|
props: true,
|
|
meta: { title: '聊天记录' },
|
|
},
|
|
{
|
|
// Group chat timeline — same component, but with a `roomId` prop so it
|
|
// issues a room_id query instead of a talker_id query.
|
|
path: '/group/:channel/:ownerId/:roomId?',
|
|
name: 'group-chat',
|
|
component: () => import('@/views/ChatTimeline.vue'),
|
|
props: true,
|
|
meta: { title: '群聊记录' },
|
|
},
|
|
{
|
|
// Anything else → back to the list.
|
|
path: '/:pathMatch(.*)*',
|
|
redirect: { name: 'customers' },
|
|
},
|
|
]
|
|
|
|
export const router = createRouter({
|
|
history: createWebHistory(),
|
|
routes,
|
|
scrollBehavior() {
|
|
return { top: 0 }
|
|
},
|
|
})
|
|
|
|
router.afterEach((to) => {
|
|
const title = (to.meta.title as string | undefined) ?? ''
|
|
document.title = title ? `${title} · 云客数据镜像` : '云客数据镜像'
|
|
})
|