Compare commits

...

5 Commits

Author SHA1 Message Date
Jarrod Flesch
1ec23f4139 fix: corrects user type in userHasAccessToAllTenants fn 2025-01-21 12:17:25 -05:00
Jarrod Flesch
2866d49041 chore: updates example to use actual package 2025-01-21 11:30:37 -05:00
Jarrod Flesch
f675994608 chore: allow new plugin-multi-tenant scope 2025-01-21 11:16:35 -05:00
Jarrod Flesch
509eb903e9 chore: refresh tenants if user changes 2025-01-21 11:08:07 -05:00
Jarrod Flesch
25f72a67c5 fix: prevent throwing when no user exists 2025-01-21 09:12:23 -05:00
6 changed files with 30 additions and 15 deletions

View File

@@ -53,6 +53,7 @@ jobs:
plugin-cloud
plugin-cloud-storage
plugin-form-builder
plugin-multi-tenant
plugin-nested-docs
plugin-redirects
plugin-search

View File

@@ -18,7 +18,7 @@
"dependencies": {
"@payloadcms/db-mongodb": "latest",
"@payloadcms/next": "latest",
"@payloadcms/plugin-multi-tenant": "file:payloadcms-plugin-multi-tenant-3.15.1.tgz",
"@payloadcms/plugin-multi-tenant": "latest",
"@payloadcms/richtext-lexical": "latest",
"@payloadcms/ui": "latest",
"cross-env": "^7.0.3",

View File

@@ -2,6 +2,7 @@
import type { OptionObject } from 'payload'
import { useAuth } from '@payloadcms/ui'
import { useRouter } from 'next/navigation.js'
import React, { createContext } from 'react'
@@ -34,6 +35,8 @@ export const TenantSelectionProviderClient = ({
initialValue || SELECT_ALL,
)
const [preventRefreshOnChange, setPreventRefreshOnChange] = React.useState(false)
const { user } = useAuth()
const userID = React.useMemo(() => user?.id, [user?.id])
const router = useRouter()
@@ -72,6 +75,10 @@ export const TenantSelectionProviderClient = ({
}
}, [initialValue, setTenant, selectedTenantID, tenantOptions])
React.useEffect(() => {
router.refresh()
}, [userID, router])
return (
<Context.Provider
value={{

View File

@@ -19,19 +19,26 @@ export const TenantSelectionProvider = async ({
useAsTitle,
user,
}: Args) => {
const { docs: userTenants } = await payload.find({
collection: tenantsCollectionSlug,
depth: 0,
limit: 1000,
overrideAccess: false,
sort: useAsTitle,
user,
})
let tenantOptions: OptionObject[] = []
try {
const { docs: userTenants } = await payload.find({
collection: tenantsCollectionSlug,
depth: 0,
limit: 1000,
overrideAccess: false,
sort: useAsTitle,
user,
})
tenantOptions = userTenants.map((doc) => ({
label: String(doc[useAsTitle]),
value: String(doc.id),
}))
} catch (_) {
// user likely does not have access
}
const tenantOptions: OptionObject[] = userTenants.map((doc) => ({
label: String(doc[useAsTitle]),
value: String(doc.id),
}))
const cookies = await getCookies()
const tenantCookie = cookies.get('payload-tenant')?.value
const selectedTenant =

View File

@@ -105,7 +105,7 @@ export type MultiTenantPluginConfig<ConfigTypes = unknown> = {
* Useful for super-admin type users
*/
userHasAccessToAllTenants?: (
user: ConfigTypes extends { user: User } ? ConfigTypes['user'] : User,
user: ConfigTypes extends { user: unknown } ? ConfigTypes['user'] : User,
) => boolean
}

View File

@@ -31,7 +31,7 @@ export const withTenantAccess =
if (
args.req.user &&
!userHasAccessToAllTenants(
args.req.user as ConfigType extends { user: User } ? ConfigType['user'] : User,
args.req.user as ConfigType extends { user: unknown } ? ConfigType['user'] : User,
)
) {
constraints.push(