Skip to content

Commit 9b6e7ff

Browse files
committed
fix: handle redirects only once in useDrupalRoute
1 parent 96bceb5 commit 9b6e7ff

File tree

1 file changed

+31
-28
lines changed
  • src/runtime/composables/useDrupalRoute

1 file changed

+31
-28
lines changed

src/runtime/composables/useDrupalRoute/index.ts

Lines changed: 31 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,12 @@ export async function useDrupalRoute<T extends object = object>(
172172
return {}
173173
})
174174

175+
const ctx: UseDrupalRoute<T | undefined> = {
176+
entity,
177+
drupalRoute,
178+
metatags,
179+
}
180+
175181
const nuxtRoute = useRoute()
176182

177183
const hookPayload = computed<DrupalRouteHookPayload>(() => ({
@@ -181,31 +187,32 @@ export async function useDrupalRoute<T extends object = object>(
181187
routeQuery: query.value,
182188
}))
183189

184-
const handleRoute = async () => {
185-
// Handle redirects first.
186-
if (query.value?.route && 'redirect' in query.value.route) {
187-
const redirectTarget = query.value.route.path
188-
if (redirectTarget) {
189-
// If the redirect already includes query parameters don't add the
190-
// current query params. Otherwise redirect to the path including the
191-
// current query parameters.
192-
const target: RouteLocationRaw = redirectTarget.includes('?')
193-
? redirectTarget
194-
: {
195-
path: redirectTarget,
196-
query: nuxtRoute.query,
197-
}
198-
199-
await navigateTo(target, {
200-
redirectCode: query.value.route.redirect?.statusCode ?? 301,
201-
replace: true,
202-
external: true,
203-
})
204-
}
205-
206-
return
190+
// Redirects are only handled once.
191+
if (query.value?.route && 'redirect' in query.value.route) {
192+
const redirectTarget = query.value.route.path
193+
if (redirectTarget) {
194+
// If the redirect already includes query parameters don't add the
195+
// current query params. Otherwise redirect to the path including the
196+
// current query parameters.
197+
const target: RouteLocationRaw = redirectTarget.includes('?')
198+
? redirectTarget
199+
: {
200+
path: redirectTarget,
201+
query: nuxtRoute.query,
202+
}
203+
204+
await navigateTo(target, {
205+
redirectCode: query.value.route.redirect?.statusCode ?? 301,
206+
replace: true,
207+
external: true,
208+
})
207209
}
208210

211+
// Return the context immediately.
212+
return ctx
213+
}
214+
215+
const handleRoute = async () => {
209216
// Check if Drupal returned a route and/or entity.
210217
// If it's missing, throw an error, unless the user requested not to throw.
211218
if ((!query.value?.route || !entity.value) && !options?.noError) {
@@ -229,11 +236,7 @@ export async function useDrupalRoute<T extends object = object>(
229236

230237
await handleRoute()
231238

232-
return {
233-
entity,
234-
drupalRoute,
235-
metatags,
236-
}
239+
return ctx
237240
}
238241

239242
declare module '#app' {

0 commit comments

Comments
 (0)