Files
payloadcms/test/helpers/adminUrlUtil.ts
Jacob Fletcher f3aebe3263 fix(ui): public users unable to log out (#10188)
Fixes #10180. When logged in as an unauthorized user who cannot access
the admin panel, the user is unable to log out through the prompted
`/admin/logout` page. This was because that page was using an incorrect
API endpoint, reading from `admin.user` instead of `user.collection`
when formatting the route. This page was also able to get stuck in an
infinite loading state when attempting to log out without any user at
all. Now, public users can properly log out and then back in with
another user who might have access. The messaging around this was also
misleading. Instead of displaying the "Unauthorized, you must be logged
in to make this request" message, we now display a new "Unauthorized,
this user does not have access to the admin panel" message for added
clarity.
2024-12-26 22:52:00 -05:00

92 lines
2.0 KiB
TypeScript

import type { Config } from 'payload'
// IMPORTANT: ensure that imports do not contain React components, etc. as this breaks Playwright tests
// Instead of pointing to the bundled code, which will include React components, use direct import paths
import { formatAdminURL } from '../../packages/ui/src/utilities/formatAdminURL.js' // eslint-disable-line payload/no-relative-monorepo-imports
export class AdminUrlUtil {
account: string
admin: string
create: string
entitySlug: string
list: string
login: string
logout: string
routes: Config['routes']
serverURL: string
constructor(serverURL: string, slug: string, routes?: Config['routes']) {
this.routes = {
admin: routes?.admin || '/admin',
}
this.serverURL = serverURL
this.entitySlug = slug
this.admin = formatAdminURL({
adminRoute: this.routes.admin,
path: '',
serverURL: this.serverURL,
})
this.account = formatAdminURL({
adminRoute: this.routes.admin,
path: '/account',
serverURL: this.serverURL,
})
this.login = formatAdminURL({
adminRoute: this.routes.admin,
path: '/login',
serverURL: this.serverURL,
})
this.logout = formatAdminURL({
adminRoute: this.routes.admin,
path: '/logout',
serverURL: this.serverURL,
})
this.list = formatAdminURL({
adminRoute: this.routes.admin,
path: `/collections/${this.entitySlug}`,
serverURL: this.serverURL,
})
this.create = formatAdminURL({
adminRoute: this.routes.admin,
path: `/collections/${this.entitySlug}/create`,
serverURL: this.serverURL,
})
}
collection(slug: string): string {
return formatAdminURL({
adminRoute: this.routes.admin,
path: `/collections/${slug}`,
serverURL: this.serverURL,
})
}
edit(id: number | string): string {
return `${this.list}/${id}`
}
global(slug: string): string {
return formatAdminURL({
adminRoute: this.routes.admin,
path: `/globals/${slug}`,
serverURL: this.serverURL,
})
}
}