Skip to content

Commit

Permalink
refactor(core): update useReleasePermission with useResourceCache
Browse files Browse the repository at this point in the history
  • Loading branch information
RitaDias committed Feb 19, 2025
1 parent 2e8da24 commit c086df8
Showing 1 changed file with 50 additions and 9 deletions.
59 changes: 50 additions & 9 deletions packages/sanity/src/core/releases/store/useReleasePermissions.ts
Original file line number Diff line number Diff line change
@@ -1,21 +1,30 @@
import {useMemo} from 'react'

import {isErrorWithDetails} from '../../error/types/isErrorWithDetails'
import {useResourceCache} from '../../store/_legacy/ResourceCacheProvider'

export interface useReleasePermissionsValue {
checkWithPermissionGuard: <T extends (...args: any[]) => Promise<void> | void>(
action: T,
...args: Parameters<T>
) => Promise<boolean>
permissions: {[key: string]: boolean}
}

type ReleasePermissionError = {details: {type: 'insufficientPermissionsError'}}

const RELEASE_PERMISSIONS_RESOURCE_CACHE_NAMESPACE = 'ReleasePermissions'

export const isReleasePermissionError = (error: unknown): error is ReleasePermissionError =>
isErrorWithDetails(error) && error.details?.type === 'insufficientPermissionsError'

/**
*
* @internal
*/
export function useReleasePermissions(): useReleasePermissionsValue {
function createReleasePermissionsStore(): useReleasePermissionsValue {
let permissions: {[key: string]: boolean} = {}

/**
* Checks if a release action can be performed by running a dry run of the given action
*
Expand All @@ -27,17 +36,49 @@ export function useReleasePermissions(): useReleasePermissionsValue {
action: T,
...args: Parameters<T>
): Promise<boolean> => {
try {
await action(...args, {
dryRun: true,
skipCrossDatasetReferenceValidation: true,
})
return true
} catch (e) {
return !isReleasePermissionError(e)
if (permissions[action.name] === undefined) {
try {
await action(...args, {
dryRun: true,
skipCrossDatasetReferenceValidation: true,
})
permissions = {...permissions, [action.name]: true}

return true
} catch (e) {
permissions = {...permissions, [action.name]: false}

return !isReleasePermissionError(e)
}
} else {
return permissions[action.name]
}
}
return {
checkWithPermissionGuard: checkWithPermissionGuard,
permissions,
}
}

/**
* @internal
*/
export function useReleasePermissions(): useReleasePermissionsValue {

Check failure on line 66 in packages/sanity/src/core/releases/store/useReleasePermissions.ts

View workflow job for this annotation

GitHub Actions / Test (ubuntu-latest-m / node 18)

src/core/releases/store/__tests__/useReleasePermissions.test.ts > useReleasePermissions > should return true when action succeeds

TypeError: Cannot read properties of null (reading 'useMemo') ❯ Object.useMemo ../../node_modules/.pnpm/[email protected]/node_modules/react/cjs/react.development.js:1650:21 ❯ _c ../../node_modules/.pnpm/[email protected][email protected]/node_modules/react-compiler-runtime/src/index.ts:29:22 ❯ useReleasePermissions src/core/releases/store/useReleasePermissions.ts:66:8 ❯ src/core/releases/store/__tests__/useReleasePermissions.test.ts:9:13

Check failure on line 66 in packages/sanity/src/core/releases/store/useReleasePermissions.ts

View workflow job for this annotation

GitHub Actions / Test (ubuntu-latest-m / node 18)

src/core/releases/store/__tests__/useReleasePermissions.test.ts > useReleasePermissions > should return true when action succeeds

TypeError: Cannot read properties of null (reading 'useMemo') ❯ Object.useMemo ../../node_modules/.pnpm/[email protected]/node_modules/react/cjs/react.development.js:1650:21 ❯ _c ../../node_modules/.pnpm/[email protected][email protected]/node_modules/react-compiler-runtime/src/index.ts:29:22 ❯ useReleasePermissions src/core/releases/store/useReleasePermissions.ts:66:8 ❯ src/core/releases/store/__tests__/useReleasePermissions.test.ts:9:13

Check failure on line 66 in packages/sanity/src/core/releases/store/useReleasePermissions.ts

View workflow job for this annotation

GitHub Actions / Test (ubuntu-latest-m / node 18)

src/core/releases/store/__tests__/useReleasePermissions.test.ts > useReleasePermissions > should return true when action succeeds

TypeError: Cannot read properties of null (reading 'useMemo') ❯ Object.useMemo ../../node_modules/.pnpm/[email protected]/node_modules/react/cjs/react.development.js:1650:21 ❯ _c ../../node_modules/.pnpm/[email protected][email protected]/node_modules/react-compiler-runtime/src/index.ts:29:22 ❯ useReleasePermissions src/core/releases/store/useReleasePermissions.ts:66:8 ❯ src/core/releases/store/__tests__/useReleasePermissions.test.ts:9:13

Check failure on line 66 in packages/sanity/src/core/releases/store/useReleasePermissions.ts

View workflow job for this annotation

GitHub Actions / Test (ubuntu-latest-m / node 18)

src/core/releases/store/__tests__/useReleasePermissions.test.ts > useReleasePermissions > should return true when action succeeds

TypeError: Cannot read properties of null (reading 'useMemo') ❯ Object.useMemo ../../node_modules/.pnpm/[email protected]/node_modules/react/cjs/react.development.js:1650:21 ❯ _c ../../node_modules/.pnpm/[email protected][email protected]/node_modules/react-compiler-runtime/src/index.ts:29:22 ❯ useReleasePermissions src/core/releases/store/useReleasePermissions.ts:66:8 ❯ src/core/releases/store/__tests__/useReleasePermissions.test.ts:9:13

Check failure on line 66 in packages/sanity/src/core/releases/store/useReleasePermissions.ts

View workflow job for this annotation

GitHub Actions / Test (ubuntu-latest-m / node 18)

src/core/releases/store/__tests__/useReleasePermissions.test.ts > useReleasePermissions > should return true when action succeeds

TypeError: Cannot read properties of null (reading 'useMemo') ❯ Object.useMemo ../../node_modules/.pnpm/[email protected]/node_modules/react/cjs/react.development.js:1650:21 ❯ _c ../../node_modules/.pnpm/[email protected][email protected]/node_modules/react-compiler-runtime/src/index.ts:29:22 ❯ useReleasePermissions src/core/releases/store/useReleasePermissions.ts:66:8 ❯ src/core/releases/store/__tests__/useReleasePermissions.test.ts:9:13

Check failure on line 66 in packages/sanity/src/core/releases/store/useReleasePermissions.ts

View workflow job for this annotation

GitHub Actions / Test (ubuntu-latest-m / node 22)

src/core/releases/store/__tests__/useReleasePermissions.test.ts > useReleasePermissions > should return true when action succeeds

TypeError: Cannot read properties of null (reading 'useMemo') ❯ Object.useMemo ../../node_modules/.pnpm/[email protected]/node_modules/react/cjs/react.development.js:1650:21 ❯ _c ../../node_modules/.pnpm/[email protected][email protected]/node_modules/react-compiler-runtime/src/index.ts:29:22 ❯ useReleasePermissions src/core/releases/store/useReleasePermissions.ts:66:8 ❯ src/core/releases/store/__tests__/useReleasePermissions.test.ts:9:13

Check failure on line 66 in packages/sanity/src/core/releases/store/useReleasePermissions.ts

View workflow job for this annotation

GitHub Actions / Test (ubuntu-latest-m / node 22)

src/core/releases/store/__tests__/useReleasePermissions.test.ts > useReleasePermissions > should return true when action succeeds

TypeError: Cannot read properties of null (reading 'useMemo') ❯ Object.useMemo ../../node_modules/.pnpm/[email protected]/node_modules/react/cjs/react.development.js:1650:21 ❯ _c ../../node_modules/.pnpm/[email protected][email protected]/node_modules/react-compiler-runtime/src/index.ts:29:22 ❯ useReleasePermissions src/core/releases/store/useReleasePermissions.ts:66:8 ❯ src/core/releases/store/__tests__/useReleasePermissions.test.ts:9:13

Check failure on line 66 in packages/sanity/src/core/releases/store/useReleasePermissions.ts

View workflow job for this annotation

GitHub Actions / Test (ubuntu-latest-m / node 22)

src/core/releases/store/__tests__/useReleasePermissions.test.ts > useReleasePermissions > should return true when action succeeds

TypeError: Cannot read properties of null (reading 'useMemo') ❯ Object.useMemo ../../node_modules/.pnpm/[email protected]/node_modules/react/cjs/react.development.js:1650:21 ❯ _c ../../node_modules/.pnpm/[email protected][email protected]/node_modules/react-compiler-runtime/src/index.ts:29:22 ❯ useReleasePermissions src/core/releases/store/useReleasePermissions.ts:66:8 ❯ src/core/releases/store/__tests__/useReleasePermissions.test.ts:9:13

Check failure on line 66 in packages/sanity/src/core/releases/store/useReleasePermissions.ts

View workflow job for this annotation

GitHub Actions / Test (ubuntu-latest-m / node 22)

src/core/releases/store/__tests__/useReleasePermissions.test.ts > useReleasePermissions > should return true when action succeeds

TypeError: Cannot read properties of null (reading 'useMemo') ❯ Object.useMemo ../../node_modules/.pnpm/[email protected]/node_modules/react/cjs/react.development.js:1650:21 ❯ _c ../../node_modules/.pnpm/[email protected][email protected]/node_modules/react-compiler-runtime/src/index.ts:29:22 ❯ useReleasePermissions src/core/releases/store/useReleasePermissions.ts:66:8 ❯ src/core/releases/store/__tests__/useReleasePermissions.test.ts:9:13

Check failure on line 66 in packages/sanity/src/core/releases/store/useReleasePermissions.ts

View workflow job for this annotation

GitHub Actions / Test (ubuntu-latest-m / node 22)

src/core/releases/store/__tests__/useReleasePermissions.test.ts > useReleasePermissions > should return true when action succeeds

TypeError: Cannot read properties of null (reading 'useMemo') ❯ Object.useMemo ../../node_modules/.pnpm/[email protected]/node_modules/react/cjs/react.development.js:1650:21 ❯ _c ../../node_modules/.pnpm/[email protected][email protected]/node_modules/react-compiler-runtime/src/index.ts:29:22 ❯ useReleasePermissions src/core/releases/store/useReleasePermissions.ts:66:8 ❯ src/core/releases/store/__tests__/useReleasePermissions.test.ts:9:13

Check failure on line 66 in packages/sanity/src/core/releases/store/useReleasePermissions.ts

View workflow job for this annotation

GitHub Actions / report-coverage

src/core/releases/store/__tests__/useReleasePermissions.test.ts > useReleasePermissions > should return true when action succeeds

TypeError: Cannot read properties of null (reading 'useMemo') ❯ Object.useMemo ../../node_modules/.pnpm/[email protected]/node_modules/react/cjs/react.development.js:1650:21 ❯ _c ../../node_modules/.pnpm/[email protected][email protected]/node_modules/react-compiler-runtime/src/index.ts:29:22 ❯ useReleasePermissions src/core/releases/store/useReleasePermissions.ts:66:8 ❯ src/core/releases/store/__tests__/useReleasePermissions.test.ts:9:13

Check failure on line 66 in packages/sanity/src/core/releases/store/useReleasePermissions.ts

View workflow job for this annotation

GitHub Actions / report-coverage

src/core/releases/store/__tests__/useReleasePermissions.test.ts > useReleasePermissions > should return true when action succeeds

TypeError: Cannot read properties of null (reading 'useMemo') ❯ Object.useMemo ../../node_modules/.pnpm/[email protected]/node_modules/react/cjs/react.development.js:1650:21 ❯ _c ../../node_modules/.pnpm/[email protected][email protected]/node_modules/react-compiler-runtime/src/index.ts:29:22 ❯ useReleasePermissions src/core/releases/store/useReleasePermissions.ts:66:8 ❯ src/core/releases/store/__tests__/useReleasePermissions.test.ts:9:13

Check failure on line 66 in packages/sanity/src/core/releases/store/useReleasePermissions.ts

View workflow job for this annotation

GitHub Actions / report-coverage

src/core/releases/store/__tests__/useReleasePermissions.test.ts > useReleasePermissions > should return true when action succeeds

TypeError: Cannot read properties of null (reading 'useMemo') ❯ Object.useMemo ../../node_modules/.pnpm/[email protected]/node_modules/react/cjs/react.development.js:1650:21 ❯ _c ../../node_modules/.pnpm/[email protected][email protected]/node_modules/react-compiler-runtime/src/index.ts:29:22 ❯ useReleasePermissions src/core/releases/store/useReleasePermissions.ts:66:8 ❯ src/core/releases/store/__tests__/useReleasePermissions.test.ts:9:13

Check failure on line 66 in packages/sanity/src/core/releases/store/useReleasePermissions.ts

View workflow job for this annotation

GitHub Actions / report-coverage

src/core/releases/store/__tests__/useReleasePermissions.test.ts > useReleasePermissions > should return true when action succeeds

TypeError: Cannot read properties of null (reading 'useMemo') ❯ Object.useMemo ../../node_modules/.pnpm/[email protected]/node_modules/react/cjs/react.development.js:1650:21 ❯ _c ../../node_modules/.pnpm/[email protected][email protected]/node_modules/react-compiler-runtime/src/index.ts:29:22 ❯ useReleasePermissions src/core/releases/store/useReleasePermissions.ts:66:8 ❯ src/core/releases/store/__tests__/useReleasePermissions.test.ts:9:13

Check failure on line 66 in packages/sanity/src/core/releases/store/useReleasePermissions.ts

View workflow job for this annotation

GitHub Actions / report-coverage

src/core/releases/store/__tests__/useReleasePermissions.test.ts > useReleasePermissions > should return true when action succeeds

TypeError: Cannot read properties of null (reading 'useMemo') ❯ Object.useMemo ../../node_modules/.pnpm/[email protected]/node_modules/react/cjs/react.development.js:1650:21 ❯ _c ../../node_modules/.pnpm/[email protected][email protected]/node_modules/react-compiler-runtime/src/index.ts:29:22 ❯ useReleasePermissions src/core/releases/store/useReleasePermissions.ts:66:8 ❯ src/core/releases/store/__tests__/useReleasePermissions.test.ts:9:13
const resourceCache = useResourceCache()

return useMemo(() => {
const releasePermissionsStore =
resourceCache.get<useReleasePermissionsValue>({
dependencies: [null],
namespace: RELEASE_PERMISSIONS_RESOURCE_CACHE_NAMESPACE,
}) || createReleasePermissionsStore()

resourceCache.set({
namespace: RELEASE_PERMISSIONS_RESOURCE_CACHE_NAMESPACE,
value: releasePermissionsStore,
dependencies: [null],
})

return releasePermissionsStore
}, [resourceCache])
}

0 comments on commit c086df8

Please sign in to comment.