Skip to content

Commit e2cdfa1

Browse files
committed
refactor(router): extract createSpaRouter factory
Seven SPA routers (CAHFS, CMS, CTS, ClinicalScheduler, Computing, Effort, Students) duplicated the same createRouter + VITE_VIPER_HOME + scroll-top + useRouteFocus setup. Hoist into src/shared/createSpaRouter.ts so each router only owns its bespoke beforeEach guard. No behavior change.
1 parent 82e613e commit e2cdfa1

8 files changed

Lines changed: 45 additions & 79 deletions

File tree

VueApp/src/CAHFS/router/index.ts

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,9 @@
1-
import { createRouter, createWebHistory } from "vue-router"
1+
import { createSpaRouter } from "@/shared/createSpaRouter"
22
import { routes } from "./routes"
33
import { useRequireLogin } from "@/composables/RequireLogin"
44
import { checkHasOnePermission } from "@/composables/CheckPagePermission"
5-
import { useRouteFocus } from "@/composables/use-route-focus"
65

7-
const baseUrl = import.meta.env.VITE_VIPER_HOME
8-
const router = createRouter({
9-
scrollBehavior: () => ({ left: 0, top: 0 }),
10-
history: createWebHistory(baseUrl),
11-
routes,
12-
})
6+
const router = createSpaRouter(routes)
137

148
router.beforeEach(async (to) => {
159
const { requireLogin } = useRequireLogin(to)
@@ -25,6 +19,4 @@ router.beforeEach(async (to) => {
2519
}
2620
})
2721

28-
useRouteFocus(router)
29-
3022
export { router as CAHFSRouter }

VueApp/src/CMS/router/index.ts

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,9 @@
1-
import { createRouter, createWebHistory } from "vue-router"
1+
import { createSpaRouter } from "@/shared/createSpaRouter"
22
import { routes } from "./routes"
33
import { useRequireLogin } from "@/composables/RequireLogin"
44
import { checkHasOnePermission } from "@/composables/CheckPagePermission"
5-
import { useRouteFocus } from "@/composables/use-route-focus"
65

7-
const baseUrl = import.meta.env.VITE_VIPER_HOME
8-
const router = createRouter({
9-
scrollBehavior: () => ({ left: 0, top: 0 }),
10-
history: createWebHistory(baseUrl),
11-
routes,
12-
})
6+
const router = createSpaRouter(routes)
137

148
router.beforeEach(async (to) => {
159
const { requireLogin } = useRequireLogin(to)
@@ -25,6 +19,4 @@ router.beforeEach(async (to) => {
2519
}
2620
})
2721

28-
useRouteFocus(router)
29-
3022
export { router as cmsRouter }

VueApp/src/CTS/router/index.ts

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,9 @@
1-
import { createRouter, createWebHistory } from "vue-router"
1+
import { createSpaRouter } from "@/shared/createSpaRouter"
22
import { routes } from "./routes"
33
import { useRequireLogin } from "@/composables/RequireLogin"
44
import { checkHasOnePermission } from "@/composables/CheckPagePermission"
5-
import { useRouteFocus } from "@/composables/use-route-focus"
65

7-
const baseUrl = import.meta.env.VITE_VIPER_HOME
8-
const router = createRouter({
9-
scrollBehavior: () => ({ left: 0, top: 0 }),
10-
history: createWebHistory(baseUrl),
11-
routes,
12-
})
6+
const router = createSpaRouter(routes)
137

148
router.beforeEach(async (to) => {
159
const { requireLogin } = useRequireLogin(to)
@@ -25,6 +19,4 @@ router.beforeEach(async (to) => {
2519
}
2620
})
2721

28-
useRouteFocus(router)
29-
3022
export { router }
Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,12 @@
1-
import { createRouter, createWebHistory } from "vue-router"
1+
import { createSpaRouter } from "@/shared/createSpaRouter"
22
import { clinicalSchedulerRoutes as routes } from "./routes"
33
import { useRequireLogin } from "@/composables/RequireLogin"
4-
import { useRouteFocus } from "@/composables/use-route-focus"
54

6-
const baseUrl = import.meta.env.VITE_VIPER_HOME
7-
const router = createRouter({
8-
scrollBehavior: () => ({ left: 0, top: 0 }),
9-
history: createWebHistory(baseUrl),
10-
routes,
11-
})
5+
const router = createSpaRouter(routes)
126

137
router.beforeEach((to) => {
148
const { requireLogin } = useRequireLogin(to)
159
return requireLogin(true, "SVMSecure.ClnSched")
1610
})
1711

18-
useRouteFocus(router)
19-
2012
export { router as clinicalSchedulerRouter }
Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,12 @@
1-
import { createRouter, createWebHistory } from "vue-router"
1+
import { createSpaRouter } from "@/shared/createSpaRouter"
22
import { routes } from "./routes"
33
import { useRequireLogin } from "@/composables/RequireLogin"
4-
import { useRouteFocus } from "@/composables/use-route-focus"
54

6-
const baseUrl = import.meta.env.VITE_VIPER_HOME
7-
const router = createRouter({
8-
scrollBehavior: () => ({ left: 0, top: 0 }),
9-
history: createWebHistory(baseUrl),
10-
routes,
11-
})
5+
const router = createSpaRouter(routes)
126

137
router.beforeEach((to) => {
148
const { requireLogin } = useRequireLogin(to)
159
return requireLogin()
1610
})
1711

18-
useRouteFocus(router)
19-
2012
export { router }

VueApp/src/Effort/router/index.ts

Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,27 @@
1-
import { createRouter, createWebHistory } from "vue-router"
1+
import { createSpaRouter } from "@/shared/createSpaRouter"
22
import { effortRoutes as routes } from "./routes"
33
import { useRequireLogin } from "@/composables/RequireLogin"
44
import { checkHasOnePermission } from "@/composables/CheckPagePermission"
55
import { useFetch } from "@/composables/ViperFetch"
66
import { useUserStore } from "@/store/UserStore"
7-
import { useRouteFocus } from "@/composables/use-route-focus"
87

9-
const baseUrl = import.meta.env.VITE_VIPER_HOME
10-
const router = createRouter({
11-
scrollBehavior: () => ({ left: 0, top: 0 }),
12-
history: createWebHistory(baseUrl),
13-
routes,
14-
})
8+
const router = createSpaRouter(routes)
159

1610
// Dedup latch: reuse in-flight fetch so concurrent navigations don't fire multiple requests
1711
let evalPermissionsPromise: Promise<void> | null = null
1812

1913
async function loadEvalPermissions() {
20-
const userStore = useUserStore()
21-
const existingPermissions = userStore.userInfo?.permissions ?? []
22-
const { get } = useFetch()
23-
const apiUrl = import.meta.env.VITE_API_URL
24-
const evalPerms = await get(`${apiUrl}loggedInUser/permissions?prefix=SVMSecure.Eval`)
25-
if (evalPerms.success && Array.isArray(evalPerms.result)) {
26-
userStore.setPermissions([...existingPermissions, ...evalPerms.result])
27-
} else {
28-
// Reset latch so the next navigation retries the fetch
14+
try {
15+
const userStore = useUserStore()
16+
const existingPermissions = userStore.userInfo?.permissions ?? []
17+
const { get } = useFetch()
18+
const apiUrl = import.meta.env.VITE_API_URL
19+
const evalPerms = await get(`${apiUrl}loggedInUser/permissions?prefix=SVMSecure.Eval`)
20+
if (evalPerms.success && Array.isArray(evalPerms.result)) {
21+
userStore.setPermissions([...existingPermissions, ...evalPerms.result])
22+
}
23+
} finally {
24+
// Reset latch so future session changes refetch instead of reusing the old resolved promise
2925
evalPermissionsPromise = null
3026
}
3127
}
@@ -63,6 +59,4 @@ router.beforeEach(async (to, from) => {
6359
}
6460
})
6561

66-
useRouteFocus(router)
67-
6862
export { router as effortRouter }

VueApp/src/Students/router/index.ts

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,11 @@
1-
import { createRouter, createWebHistory } from "vue-router"
1+
import { createSpaRouter } from "@/shared/createSpaRouter"
22
import { routes } from "./routes"
33
import { useRequireLogin } from "@/composables/RequireLogin"
4-
import { useRouteFocus } from "@/composables/use-route-focus"
54
import { checkHasOnePermission } from "@/composables/CheckPagePermission"
65
import { useFetch } from "@/composables/ViperFetch"
76
import { useUserStore } from "@/store/UserStore"
87

9-
const baseUrl = import.meta.env.VITE_VIPER_HOME
10-
const router = createRouter({
11-
scrollBehavior: () => ({ left: 0, top: 0 }),
12-
history: createWebHistory(baseUrl),
13-
routes,
14-
})
8+
const router = createSpaRouter(routes)
159

1610
// In-flight latch: dedups concurrent navigations but resets after each attempt so later
1711
// sessions (e.g. re-auth into an SIS role) can re-fetch instead of reusing a stale resolution.
@@ -66,6 +60,4 @@ router.beforeEach(async (to, from) => {
6660
}
6761
})
6862

69-
useRouteFocus(router)
70-
7163
export { router }
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { createRouter, createWebHistory } from "vue-router"
2+
import type { RouteRecordRaw, Router } from "vue-router"
3+
import { useRouteFocus } from "@/composables/use-route-focus"
4+
5+
/**
6+
* Standard VIPER SPA router: web history rooted at VITE_VIPER_HOME,
7+
* scroll-to-top on every navigation, and route-change focus management
8+
* for accessibility. Callers wire their own `beforeEach` guard since
9+
* auth/permission rules vary per SPA.
10+
*/
11+
export function createSpaRouter(routes: RouteRecordRaw[]): Router {
12+
const baseUrl = import.meta.env.VITE_VIPER_HOME
13+
const router = createRouter({
14+
scrollBehavior: () => ({ left: 0, top: 0 }),
15+
history: createWebHistory(baseUrl),
16+
routes,
17+
})
18+
useRouteFocus(router)
19+
return router
20+
}

0 commit comments

Comments
 (0)