feat: mutation permersions

pull/12372/head
Joel 2 years ago
parent c6a6c53084
commit 324437b3f1

@ -34,7 +34,7 @@ const PluginSettingModal: FC<Props> = ({
const handleSave = useCallback(async () => { const handleSave = useCallback(async () => {
await onSave(tempPrivilege) await onSave(tempPrivilege)
onHide() onHide()
}, [tempPrivilege]) }, [onHide, onSave, tempPrivilege])
return ( return (
<Modal <Modal

@ -11,16 +11,13 @@ import {
useContextSelector, useContextSelector,
} from 'use-context-selector' } from 'use-context-selector'
import { useSelector as useAppContextSelector } from '@/context/app-context' import { useSelector as useAppContextSelector } from '@/context/app-context'
import type { Permissions, PluginDetail } from '../types' import type { PluginDetail } from '../types'
import type { FilterState } from './filter-management' import type { FilterState } from './filter-management'
import { PermissionType } from '../types'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import { useTabSearchParams } from '@/hooks/use-tab-searchparams' import { useTabSearchParams } from '@/hooks/use-tab-searchparams'
export type PluginPageContextValue = { export type PluginPageContextValue = {
containerRef: React.RefObject<HTMLDivElement> containerRef: React.RefObject<HTMLDivElement>
permissions: Permissions
setPermissions: (permissions: PluginPageContextValue['permissions']) => void
currentPluginDetail: PluginDetail | undefined currentPluginDetail: PluginDetail | undefined
setCurrentPluginDetail: (plugin: PluginDetail) => void setCurrentPluginDetail: (plugin: PluginDetail) => void
filters: FilterState filters: FilterState
@ -32,21 +29,16 @@ export type PluginPageContextValue = {
export const PluginPageContext = createContext<PluginPageContextValue>({ export const PluginPageContext = createContext<PluginPageContextValue>({
containerRef: { current: null }, containerRef: { current: null },
permissions: {
install_permission: PermissionType.noOne,
debug_permission: PermissionType.noOne,
},
setPermissions: () => {},
currentPluginDetail: undefined, currentPluginDetail: undefined,
setCurrentPluginDetail: () => {}, setCurrentPluginDetail: () => { },
filters: { filters: {
categories: [], categories: [],
tags: [], tags: [],
searchQuery: '', searchQuery: '',
}, },
setFilters: () => {}, setFilters: () => { },
activeTab: '', activeTab: '',
setActiveTab: () => {}, setActiveTab: () => { },
options: [], options: [],
}) })
@ -63,10 +55,6 @@ export const PluginPageContextProvider = ({
}: PluginPageContextProviderProps) => { }: PluginPageContextProviderProps) => {
const { t } = useTranslation() const { t } = useTranslation()
const containerRef = useRef<HTMLDivElement>(null) const containerRef = useRef<HTMLDivElement>(null)
const [permissions, setPermissions] = useState<PluginPageContextValue['permissions']>({
install_permission: PermissionType.noOne,
debug_permission: PermissionType.noOne,
})
const [filters, setFilters] = useState<FilterState>({ const [filters, setFilters] = useState<FilterState>({
categories: [], categories: [],
tags: [], tags: [],
@ -93,8 +81,6 @@ export const PluginPageContextProvider = ({
<PluginPageContext.Provider <PluginPageContext.Provider
value={{ value={{
containerRef, containerRef,
permissions,
setPermissions,
currentPluginDetail, currentPluginDetail,
setCurrentPluginDetail, setCurrentPluginDetail,
filters, filters,

@ -206,7 +206,7 @@ const PluginPage = ({
{showPluginSettingModal && ( {showPluginSettingModal && (
<PermissionSetModal <PermissionSetModal
payload={permissions} payload={permissions!}
onHide={setHidePluginSettingModal} onHide={setHidePluginSettingModal}
onSave={setPermissions} onSave={setPermissions}
/> />

@ -1,15 +1,12 @@
import { useEffect } from 'react'
import type { Permissions } from '../types'
import { PermissionType } from '../types' import { PermissionType } from '../types'
import {
usePluginPageContext,
} from './context'
import { useAppContext } from '@/context/app-context' import { useAppContext } from '@/context/app-context'
import { updatePermission as doUpdatePermission, fetchPermission } from '@/service/plugins'
import Toast from '../../base/toast' import Toast from '../../base/toast'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import { useInvalidatePermissions, useMutationPermissions, usePermissions } from '@/service/use-plugins'
const hasPermission = (permission: PermissionType, isAdmin: boolean) => { const hasPermission = (permission: PermissionType | undefined, isAdmin: boolean) => {
if (!permission)
return false
if (permission === PermissionType.noOne) if (permission === PermissionType.noOne)
return false return false
@ -22,29 +19,26 @@ const hasPermission = (permission: PermissionType, isAdmin: boolean) => {
const usePermission = () => { const usePermission = () => {
const { t } = useTranslation() const { t } = useTranslation()
const { isCurrentWorkspaceManager, isCurrentWorkspaceOwner } = useAppContext() const { isCurrentWorkspaceManager, isCurrentWorkspaceOwner } = useAppContext()
const [permissions, setPermissions] = usePluginPageContext(v => [v.permissions, v.setPermissions]) const { data: permissions } = usePermissions()
const isAdmin = isCurrentWorkspaceManager || isCurrentWorkspaceOwner const invalidatePermissions = useInvalidatePermissions()
const { mutate: updatePermission, isPending: isUpdatePending } = useMutationPermissions({
const updatePermission = async (permission: Permissions) => { onSuccess: () => {
await doUpdatePermission(permission) invalidatePermissions()
setPermissions(permission)
Toast.notify({ Toast.notify({
type: 'success', type: 'success',
message: t('common.api.actionSuccess'), message: t('common.api.actionSuccess'),
}) })
} },
useEffect(() => { })
(async () => { const isAdmin = isCurrentWorkspaceManager || isCurrentWorkspaceOwner
const permission = await fetchPermission()
setPermissions(permission)
})()
}, [])
return { return {
canManagement: hasPermission(permissions.install_permission, isAdmin), canManagement: hasPermission(permissions?.install_permission, isAdmin),
canDebugger: hasPermission(permissions.debug_permission, isAdmin), canDebugger: hasPermission(permissions?.debug_permission, isAdmin),
canSetPermissions: isAdmin, canSetPermissions: isAdmin,
permissions, permissions,
setPermissions: updatePermission, setPermissions: updatePermission,
isUpdatePending,
} }
} }

@ -15,7 +15,6 @@ import type {
UpdateEndpointRequest, UpdateEndpointRequest,
uploadGitHubResponse, uploadGitHubResponse,
} from '@/app/components/plugins/types' } from '@/app/components/plugins/types'
import type { DebugInfo as DebugInfoTypes } from '@/app/components/plugins/types'
import type { import type {
MarketplaceCollectionPluginsResponse, MarketplaceCollectionPluginsResponse,
MarketplaceCollectionsResponse, MarketplaceCollectionsResponse,
@ -51,10 +50,6 @@ export const disableEndpoint: Fetcher<EndpointOperationResponse, { url: string;
return post<EndpointOperationResponse>(url, { body: { endpoint_id: endpointID } }) return post<EndpointOperationResponse>(url, { body: { endpoint_id: endpointID } })
} }
export const fetchDebugKey = async () => {
return get<DebugInfoTypes>('/workspaces/current/plugin/debugging-key')
}
export const uploadPackageFile = async (file: File) => { export const uploadPackageFile = async (file: File) => {
const formData = new FormData() const formData = new FormData()
formData.append('pkg', file) formData.append('pkg', file)
@ -131,10 +126,6 @@ export const checkTaskStatus = async (taskId: string) => {
return get<TaskStatusResponse>(`/workspaces/current/plugin/tasks/${taskId}`) return get<TaskStatusResponse>(`/workspaces/current/plugin/tasks/${taskId}`)
} }
export const fetchPermission = async () => {
return get<Permissions>('/workspaces/current/plugin/permission/fetch')
}
export const updatePermission = async (permissions: Permissions) => { export const updatePermission = async (permissions: Permissions) => {
return post('/workspaces/current/plugin/permission/change', { body: permissions }) return post('/workspaces/current/plugin/permission/change', { body: permissions })
} }

@ -1,6 +1,7 @@
import type { DebugInfo as DebugInfoTypes, InstalledPluginListResponse } from '@/app/components/plugins/types' import type { DebugInfo as DebugInfoTypes, InstalledPluginListResponse, Permissions } from '@/app/components/plugins/types'
import { get } from './base' import { get, post } from './base'
import { import {
useMutation,
useQueryClient, useQueryClient,
} from '@tanstack/react-query' } from '@tanstack/react-query'
@ -34,3 +35,34 @@ export const useDebugKey = () => {
queryFn: () => get<DebugInfoTypes>('/workspaces/current/plugin/debugging-key'), queryFn: () => get<DebugInfoTypes>('/workspaces/current/plugin/debugging-key'),
}) })
} }
const usePermissionsKey = [NAME_SPACE, 'permissions']
export const usePermissions = () => {
return useQuery({
queryKey: usePermissionsKey,
queryFn: () => get<Permissions>('/workspaces/current/plugin/permission/fetch'),
})
}
export const useInvalidatePermissions = () => {
const queryClient = useQueryClient()
return () => {
queryClient.invalidateQueries(
{
queryKey: usePermissionsKey,
})
}
}
export const useMutationPermissions = ({
onSuccess,
}: {
onSuccess?: () => void
}) => {
return useMutation({
mutationFn: (payload: Permissions) => {
return post('/workspaces/current/plugin/permission/change', { body: payload })
},
onSuccess,
})
}

Loading…
Cancel
Save