diff --git a/src/Utilities/useIsCockpitAdmin.tsx b/src/Utilities/useIsCockpitAdmin.tsx new file mode 100644 index 00000000..7aa843e1 --- /dev/null +++ b/src/Utilities/useIsCockpitAdmin.tsx @@ -0,0 +1,26 @@ +import { useEffect, useState } from 'react'; + +import cockpit from 'cockpit'; + +export const useIsCockpitAdmin = () => { + const [isAdmin, setIsAdmin] = useState(false); + + useEffect(() => { + const permission = cockpit.permission({ admin: true }); + + const onChangeListener = () => { + setIsAdmin(permission.allowed); + }; + + permission.addEventListener('changed', onChangeListener); + + // Check the initial state + onChangeListener(); + + return () => { + permission.removeEventListener('changed', onChangeListener); + }; + }, []); + + return isAdmin; +}; diff --git a/src/test/mocks/cockpit/cockpitPermission.ts b/src/test/mocks/cockpit/cockpitPermission.ts new file mode 100644 index 00000000..4e0305d8 --- /dev/null +++ b/src/test/mocks/cockpit/cockpitPermission.ts @@ -0,0 +1,15 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ + +type PermissionObject = { + allowed: boolean; + addEventListener(eventType: string, callback: () => void): void; + removeEventListener(eventType: string, callback: () => void): void; +}; + +export const cockpitPermission = ({ admin = false }): PermissionObject => { + return { + allowed: admin, + addEventListener: (eventType: string, callback: () => void) => {}, + removeEventListener: (eventType: string, callback: () => void) => {}, + }; +}; diff --git a/src/test/mocks/cockpit/index.ts b/src/test/mocks/cockpit/index.ts index 0b7f733b..c813c390 100644 --- a/src/test/mocks/cockpit/index.ts +++ b/src/test/mocks/cockpit/index.ts @@ -4,6 +4,7 @@ import path from 'path'; import { cockpitFile } from './cockpitFile'; import { cockpitHTTP } from './cockpitHTTP'; +import { cockpitPermission } from './cockpitPermission'; type userinfo = { home: string; @@ -31,4 +32,5 @@ export default { }); }, http: cockpitHTTP, + permission: cockpitPermission, };