@iotopen/react-lynx 1.0.2-rc.0 → 1.0.2-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/Contexts/LynxClientProvider.tsx","../../src/Contexts/UserProvider.tsx","../../src/Contexts/LynxProvider.tsx","../../src/Hooks/useCheckPermissions.ts","../../src/Hooks/useConfiguredEdgeApps.ts","../../src/Hooks/useDevice.ts","../../src/Hooks/useDevices.ts","../../src/Hooks/useEdgeApp.ts","../../src/Hooks/useEdgeApps.ts","../../src/Hooks/useEdgeAppVersions.ts","../../src/Hooks/useFunction.ts","../../src/Hooks/useFunctions.ts","../../src/Hooks/useIDTokenAlgorithms.ts","../../src/Hooks/useInstallation.ts","../../src/Hooks/useInstallationInfo.ts","../../src/Hooks/useInstallations.ts","../../src/Hooks/usePahoMQTTClient.ts","../../src/Hooks/useSimpleMQTT.ts","../../src/Hooks/useMQTT.ts","../../src/Hooks/useLiveInstallation.ts","../../src/Hooks/useMeta.ts","../../src/Hooks/useMultiLiveInstallation.ts","../../src/Hooks/useNewDevice.ts","../../src/Hooks/useNewFunction.ts","../../src/Hooks/useNewInstallation.ts","../../src/Hooks/useNewNotificationMessage.ts","../../src/Hooks/useNewNotificationOutput.ts","../../src/Hooks/useNewOAuth2Client.ts","../../src/Hooks/useNewOrganization.ts","../../src/Hooks/useNewUser.ts","../../src/Hooks/useNotificationMessage.ts","../../src/Hooks/useNotificationMessages.ts","../../src/Hooks/useNotificationOutput.ts","../../src/Hooks/useNotificationOutputExecutor.ts","../../src/Hooks/useNotificationOutputExecutors.ts","../../src/Hooks/useNotificationOutputs.ts","../../src/Hooks/useOAuth2Client.ts","../../src/Hooks/useOAuth2Clients.ts","../../src/Hooks/useOAuth2Consent.ts","../../src/Hooks/useOrganization.ts","../../src/Hooks/useOrganizations.ts","../../src/Hooks/useRoles.ts","../../src/Hooks/useTokens.ts","../../src/Hooks/useUser.ts","../../src/Hooks/useUsers.ts"],"sourcesContent":["import { createContext, useCallback, useContext, useMemo, useState } from 'react';\n\nimport { LynxClient } from '@iotopen/node-lynx';\nimport type { ReactNode } from 'react';\n\n\ninterface lynxClientContext {\n lynxClient: LynxClient;\n newLynxClient: (url: string, apiKey?: string, bearer?: boolean) => void;\n}\n\nconst defaultLynxClientContext = {\n lynxClient: new LynxClient(''),\n newLynxClient: (_url?: string, _apiKey?: string, _bearer?: boolean) => {\n // intentionally unused, see interface for signature\n }\n};\n\nconst LynxClientContext = createContext(defaultLynxClientContext as lynxClientContext);\n\ninterface LynxClientProviderProps {\n children?: ReactNode;\n url?: string | undefined;\n apiKey?: string | undefined;\n bearer?: boolean | undefined;\n}\n\nexport const LynxClientProvider = ({ children, url, apiKey, bearer }: LynxClientProviderProps) => {\n const [client, setClient] = useState(new LynxClient(url, apiKey, bearer));\n const newClient = useCallback((newUrl: string, newApiKey?: string, newBearer?: boolean) => {\n setClient(new LynxClient(newUrl, newApiKey, newBearer));\n }, [setClient]);\n const contextValue = useMemo(() => ({ lynxClient: client, newLynxClient: newClient }), [client, newClient]);\n return (\n <LynxClientContext.Provider value={contextValue}>\n {children}\n </LynxClientContext.Provider>\n );\n};\n\nexport const useGlobalLynxClient = () => {\n return useContext(LynxClientContext);\n};\n","import { createContext, useContext, useLayoutEffect, useMemo, useState } from 'react';\n\nimport type { ErrorResponse, User } from '@iotopen/node-lynx';\nimport type { ReactNode } from 'react';\n\nimport { useGlobalLynxClient } from './LynxClientProvider';\n\ninterface userContext {\n user: User | null;\n permissions: { [key: string]: boolean } | null;\n error: ErrorResponse | undefined;\n loading: boolean;\n}\n\nconst defaultUserContext = {\n user: null,\n permissions: null,\n};\nconst UserContext = createContext(defaultUserContext as userContext);\n\ninterface UserProviderProps {\n children: ReactNode;\n}\n\nexport const UserProvider = ({ children }: UserProviderProps) => {\n const [user, setUser] = useState<User | null>(null);\n const [permissions, setPermissions] = useState<{ [key: string]: boolean } | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<ErrorResponse | undefined>();\n const { lynxClient } = useGlobalLynxClient();\n useLayoutEffect(() => {\n const me = lynxClient.getMe();\n const perms = lynxClient.getPermissions();\n setLoading(true);\n Promise.all([me, perms]).then(([u, p]) => {\n setError((err) => err !== undefined ? undefined : err);\n setUser(u);\n setPermissions(p);\n }).catch(e => {\n setError(e);\n setUser(null);\n setPermissions(null);\n }).finally(() => {\n setLoading(false);\n });\n }, [lynxClient]);\n const contextValue = useMemo(() => ({ user, permissions, loading, error }), [user, permissions, loading, error]);\n return (\n <UserContext.Provider value={contextValue}>\n {children}\n </UserContext.Provider>\n );\n};\n\n\nexport const useGlobalUser = () => {\n return useContext(UserContext);\n};\n\nexport const useGlobalPermissions = () => {\n const { permissions } = useGlobalUser();\n return permissions;\n};\n","import type { ReactNode } from 'react';\n\nimport { LynxClientProvider } from './LynxClientProvider';\nimport { UserProvider } from './UserProvider';\n\ninterface LynxProviderProps {\n apiURL?: string;\n apiKey?: string;\n bearer?: boolean;\n children?: ReactNode;\n}\n\nexport const LynxProvider = ({ children, apiURL, apiKey, bearer }: LynxProviderProps) => {\n return (\n <LynxClientProvider url={apiURL} apiKey={apiKey} bearer={bearer}>\n <UserProvider>\n {children}\n </UserProvider>\n </LynxClientProvider>\n );\n};\n","import type { Permissions } from '@iotopen/node-lynx';\n\nimport { useGlobalPermissions } from '../Contexts';\n\n\nexport type Permission = Permissions | string\n\nexport const usePermissionsCheckAll = (...permissions: Permission[]): boolean => {\n const currentPermissions = useGlobalPermissions();\n if (currentPermissions === undefined || currentPermissions === null) {return false;}\n return permissions.every(permission => currentPermissions[permission] !== undefined && currentPermissions[permission]);\n};\n\n\nexport const usePermissionsCheckAny = (...permissions: Permission[]): boolean => {\n const currentPermissions = useGlobalPermissions();\n if (currentPermissions === undefined || currentPermissions === null) {return false;}\n return permissions.some(permission => currentPermissions[permission] !== undefined && currentPermissions[permission]);\n};\n","import { useCallback, useLayoutEffect, useState } from 'react';\n\nimport type { EdgeAppInstance, ErrorResponse } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nexport const useConfiguredEdgeApps = (installationId: number | string) => {\n const id = typeof installationId === 'string' ? Number.parseInt(installationId) : installationId;\n if(isNaN(id)) {\n throw new Error('invalid installationId');\n }\n const { lynxClient } = useGlobalLynxClient();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<ErrorResponse | undefined>();\n const [apps, setApps] = useState<EdgeAppInstance[]>([]);\n\n const refresh = useCallback(() => {\n setLoading(true);\n lynxClient.getConfiguredEdgeApps(id).then(fetchedApps => {\n setError((err) => err !== undefined ? undefined : err);\n setApps(fetchedApps);\n }).catch(e => {\n setError(e);\n }).finally(() => {\n setLoading(false);\n });\n }, [id, lynxClient]);\n\n useLayoutEffect(() => {\n refresh();\n }, [refresh]);\n\n return {\n refresh,\n loading,\n error,\n apps,\n };\n};\n","import { useCallback, useLayoutEffect, useState } from 'react';\n\nimport type { Devicex, ErrorResponse, MetaObject, OKResponse } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nconst zeroDevice = {\n updated: 0,\n created: 0,\n id: 0,\n installation_id: 0,\n type: '',\n meta: {},\n protected_meta: {}\n};\n\nexport const useDevice = (installationId: number | string, deviceId: number | string) => {\n const iid = typeof installationId === 'string' ? Number.parseInt(installationId) : installationId;\n const id = typeof deviceId === 'string' ? Number.parseInt(deviceId) : deviceId;\n if(isNaN(iid) || isNaN(id)) {\n throw new Error('invalid installationId or deviceId');\n }\n const { lynxClient } = useGlobalLynxClient();\n const [loading, setLoading] = useState(true);\n const [dev, setDev] = useState<Devicex>({ ...zeroDevice });\n const [error, setError] = useState<ErrorResponse | undefined>();\n\n useLayoutEffect(() => {\n lynxClient.getDevice(iid, id).then(fn => {\n setError((err) => err !== undefined ? undefined : err);\n setDev(fn);\n }).catch(e => {\n setError(e);\n }).finally(() => {\n setLoading(false);\n });\n }, [lynxClient, iid, id]);\n\n const update = useCallback(() => {\n return new Promise<Devicex>(() => {\n if (!dev) {\n throw new Error('update on undefined function');\n }\n return lynxClient.updateDevice(dev);\n });\n }, [lynxClient, dev]);\n\n const setType = useCallback((t: string) => {\n if (dev) {setDev({ ...dev, type: t });}\n }, [dev, setDev]);\n\n const remove = useCallback(() => {\n return new Promise<OKResponse>(() => {\n if (!dev) {\n throw new Error('delete on undefined function');\n }\n return lynxClient.deleteDevice(dev);\n });\n }, [dev, lynxClient]);\n\n return {\n loading,\n error,\n Device: dev,\n setDevice: setDev,\n update,\n remove,\n setType,\n };\n};\n\nexport const useDeviceMeta = (installationId: number | string, deviceId?: number|string) => {\n const iid = typeof installationId === 'string' ? Number.parseInt(installationId) : installationId;\n const devId = typeof deviceId === 'string' ? Number.parseInt(deviceId) : deviceId;\n\n const { lynxClient } = useGlobalLynxClient();\n\n const create = useCallback((key: string, meta: MetaObject, overrideDevId?: number, silent?: boolean) => {\n const id = overrideDevId ?? devId ?? 0;\n return lynxClient.createDeviceMeta(iid, id, key, meta, silent);\n }, [lynxClient, iid, devId]);\n\n\n const update = useCallback((key: string, meta: MetaObject, createMissing?: boolean, overrideDevId?: number, silent?: boolean) => {\n const id = overrideDevId ?? devId ?? 0;\n return lynxClient.updateDeviceMeta(iid, id, key, meta, silent, createMissing);\n }, [lynxClient, iid, devId]);\n\n\n const remove = useCallback((key: string, overrideDevId?: number, silent?: boolean) => {\n const id = overrideDevId ?? devId ?? 0;\n return lynxClient.deleteDeviceMeta(iid, id, key, silent);\n }, [lynxClient, iid, devId]);\n\n return {\n createMeta: create,\n updateMeta: update,\n removeMeta: remove,\n };\n};\n","import { useCallback, useLayoutEffect, useState } from 'react';\n\nimport type { Devicex, EmptyDevicex, ErrorResponse, Metadata, OKResponse } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\nimport type { ObjectOrArray } from '../types';\n\nexport const useDevices = (installationId: number|string, filter?: Metadata) => {\n const iid = typeof installationId === 'string' ? Number.parseInt(installationId) : installationId;\n if(isNaN(iid) && iid !== undefined) {\n throw new Error('invalid installationId');\n }\n const { lynxClient } = useGlobalLynxClient();\n const [loading, setLoading] = useState(true);\n const [devices, setDevices] = useState<Devicex[]>([]);\n const [error, setError] = useState<ErrorResponse | undefined>();\n const refreshCall = useCallback(() => {\n if(iid === undefined) {\n setLoading(false);\n setDevices([]);\n return;\n }\n setLoading(true);\n lynxClient.getDevices(iid, filter).then(res => {\n setError((err) => err !== undefined ? undefined : err);\n setDevices(res);\n }).catch(e => {\n setError(e);\n }).finally(() => {\n setLoading(false);\n });\n }, [lynxClient, iid, filter]);\n\n function removeFn<T extends Devicex | Devicex[]>(devs: T): ObjectOrArray<OKResponse, Devicex, T>\n function removeFn(devs: Devicex | Devicex[]) {\n if (Array.isArray(devs)) {\n const last = devs.pop();\n if (!last) {return Promise.allSettled([]);}\n const rest = devs.map((dev => {\n return lynxClient.deleteDevice(dev, true);\n }));\n return Promise.allSettled(rest).then(async(settled) => {\n try {\n settled.push({ status: 'fulfilled', value: await lynxClient.deleteDevice(last) });\n } catch (e) {\n settled.push({ status: 'rejected', reason: e });\n }\n return settled;\n });\n }\n return lynxClient.deleteDevice(devs);\n }\n\n function createFn<T extends EmptyDevicex | EmptyDevicex[]>(devs: T): ObjectOrArray<Devicex, EmptyDevicex, T>\n function createFn(devs: EmptyDevicex | EmptyDevicex[]) {\n if (Array.isArray(devs)) {\n const last = devs.pop();\n if (!last) {return Promise.allSettled([]);}\n const rest = devs.map(dev => {\n return lynxClient.createDevice(dev, true);\n });\n return Promise.allSettled(rest).then(async(settled) => {\n try {\n settled.push({ status: 'fulfilled', value: await lynxClient.createDevice(last) });\n } catch (e) {\n settled.push({ status: 'rejected', reason: e });\n }\n return settled;\n });\n }\n return lynxClient.createDevice(devs);\n }\n\n const create = useCallback(createFn, [lynxClient, createFn]);\n const remove = useCallback(removeFn, [lynxClient, removeFn]);\n\n useLayoutEffect(() => {\n refreshCall();\n }, [refreshCall]);\n\n return {\n loading,\n error,\n create,\n remove,\n devices,\n refresh: refreshCall,\n };\n};\n","import { useCallback, useLayoutEffect, useState } from 'react';\n\nimport type { EdgeApp, ErrorResponse } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nconst zeroEdgeApp = {\n id: 0,\n created: 0,\n updated: 0,\n name: '',\n category: '',\n short_description: '',\n description: '',\n source_url: '',\n tags: [],\n publisher: { id: 0 },\n public: false,\n official: false\n};\n\nexport const useEdgeApp = (appId: number | string) => {\n const id = typeof appId === 'string' ? Number.parseInt(appId) : appId;\n if(isNaN(id)) {\n throw new Error('invalid appId');\n }\n const { lynxClient } = useGlobalLynxClient();\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<ErrorResponse | undefined>();\n const [app, setApp] = useState<EdgeApp>({ ...zeroEdgeApp });\n\n const refresh = useCallback(() => {\n setLoading(true);\n lynxClient.getEdgeApp(id).then(fetchedApp => {\n setError((err) => err !== undefined ? undefined : err);\n setApp(fetchedApp);\n }).catch(e => {\n setError(e);\n }).finally(() => {\n setLoading(false);\n });\n }, [id, lynxClient]);\n\n useLayoutEffect(() => {\n refresh();\n }, [refresh]);\n\n return {\n loading,\n error,\n app,\n setApp,\n refresh\n };\n};\n","import { useCallback, useLayoutEffect, useState } from 'react';\n\nimport type { EdgeApp, ErrorResponse } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nexport const useEdgeApps = () => {\n const { lynxClient } = useGlobalLynxClient();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<ErrorResponse | undefined>();\n const [apps, setApps] = useState<EdgeApp[]>([]);\n\n const refresh = useCallback(() => {\n setLoading(true);\n lynxClient.getEdgeApps().then(fetchedApps => {\n setError((err) => err !== undefined ? undefined : err);\n setApps(fetchedApps);\n }).catch(e => {\n setError(e);\n }).finally(() => {\n setLoading(false);\n });\n }, [lynxClient]);\n\n useLayoutEffect(() => {\n refresh();\n }, [refresh]);\n\n return {\n apps,\n error,\n loading,\n refresh,\n };\n};\n","import { useCallback, useLayoutEffect, useState } from 'react';\n\nimport type { EdgeAppVersion, ErrorResponse } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nexport const useEdgeAppVersions = (appId: number | string, untagged?: boolean) => {\n const id = typeof appId === 'string' ? Number.parseInt(appId) : appId;\n if(isNaN(id)) {\n throw new Error('invalid appId');\n }\n const { lynxClient } = useGlobalLynxClient();\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<ErrorResponse | undefined>();\n const [versions, setVersions] = useState<EdgeAppVersion[]>([]);\n\n const refresh = useCallback(() => {\n setLoading(true);\n lynxClient.getEdgeAppVersions(id, untagged).then((fetchedVersions) => {\n setError((err) => err !== undefined ? undefined : err);\n setVersions(fetchedVersions);\n }).catch(e => {\n setError(e);\n }).finally(() => {\n setLoading(false);\n });\n }, [lynxClient, id, untagged]);\n\n const nameVersion = useCallback((name: string, hash: string) => {\n return lynxClient.nameEdgeAppVersion(id, name, hash);\n }, [lynxClient, id]);\n\n useLayoutEffect(() => {\n refresh();\n }, [refresh]);\n\n return {\n loading,\n error,\n versions,\n nameVersion,\n refresh\n };\n};\n","import { useCallback, useLayoutEffect, useState } from 'react';\n\nimport type { ErrorResponse, Functionx, MetaObject, OKResponse } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nconst zeroFunction = {\n id: 0,\n installation_id: 0,\n type: '',\n updated: 0,\n created: 0,\n meta: {},\n protected_meta: {}\n};\n\nexport const useFunction = (installationId: number | string, functionId: number | string) => {\n const iid = typeof installationId === 'string' ? Number.parseInt(installationId) : installationId;\n const id = typeof functionId === 'string' ? Number.parseInt(functionId) : functionId;\n\n if (isNaN(iid) || isNaN(id)) {\n throw new Error('invalid installationId or functionId');\n }\n\n const { lynxClient } = useGlobalLynxClient();\n const [loading, setLoading] = useState(true);\n const [func, setFunc] = useState<Functionx>({ ...zeroFunction });\n const [error, setError] = useState<ErrorResponse | undefined>();\n\n useLayoutEffect(() => {\n lynxClient.getFunction(iid, id).then(fn => {\n setError((err) => err !== undefined ? undefined : err);\n setFunc(fn);\n }).catch(e => {\n setError(e);\n }).finally(() => {\n setLoading(false);\n });\n }, [lynxClient, iid, id]);\n\n const update = useCallback(() => {\n return new Promise<Functionx>(() => {\n if (!func) {\n throw new Error('update on undefined function');\n }\n return lynxClient.updateFunction(func);\n });\n }, [lynxClient, func]);\n\n const setType = useCallback((t: string) => {\n if (func) {setFunc({ ...func, type: t });}\n }, [func, setFunc]);\n\n const remove = useCallback(() => {\n return new Promise<OKResponse>(() => {\n if (!func) {\n throw new Error('delete on undefined function');\n }\n return lynxClient.deleteFunction(func);\n });\n }, [func, lynxClient]);\n\n return {\n loading,\n error,\n Function: func,\n setFunction: setFunc,\n update,\n remove,\n setType,\n };\n};\n\nexport const useFunctionMeta = (installationId: number | string, functionId?: number | string) => {\n const iid = typeof installationId === 'string' ? Number.parseInt(installationId) : installationId;\n const fnId = typeof functionId === 'string' ? Number.parseInt(functionId) : functionId;\n\n const { lynxClient } = useGlobalLynxClient();\n const create = useCallback((key: string, meta: MetaObject, funId?: number, silent?: boolean) => {\n const id = funId ?? fnId ?? 0;\n return lynxClient.createFunctionMeta(iid, id, key, meta, silent);\n }, [lynxClient, iid, fnId]);\n\n const update = useCallback((key: string, meta: MetaObject, createMissing?: boolean, funId?: number, silent?: boolean) => {\n const id = funId ?? fnId ?? 0;\n return lynxClient.updateFunctionMeta(iid, id, key, meta, silent, createMissing);\n }, [lynxClient, iid, fnId]);\n\n const remove = useCallback((key: string, funId?: number, silent?: boolean) => {\n const id = funId ?? fnId ?? 0;\n return lynxClient.deleteFunctionMeta(iid, id, key, silent);\n }, [lynxClient, iid, fnId]);\n\n return {\n createMeta: create,\n updateMeta: update,\n removeMeta: remove,\n };\n};\n","import { useCallback, useLayoutEffect, useState } from 'react';\n\nimport type { EmptyFunctionx, ErrorResponse, Functionx, Metadata, OKResponse } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\nimport type { ObjectOrArray } from '../types';\n\nexport const useFunctions = (installationId: number | string, filter?: Metadata) => {\n const iid = typeof installationId === 'string' ? Number.parseInt(installationId) : installationId;\n if(isNaN(iid) && iid !== undefined) {\n throw new Error('invalid installationId');\n }\n const { lynxClient } = useGlobalLynxClient();\n const [loading, setLoading] = useState(true);\n const [functions, setFunctions] = useState<Functionx[]>([]);\n const [error, setError] = useState<ErrorResponse | undefined>();\n const refreshCall = useCallback(() => {\n if (iid === undefined) {\n setLoading(false);\n setFunctions([]);\n return;\n }\n setLoading(true);\n lynxClient.getFunctions(iid, filter).then(res => {\n setError((err) => err !== undefined ? undefined : err);\n setFunctions(res);\n return res;\n }).catch(e => {\n setError(e);\n }).finally(() => {\n setLoading(false);\n });\n }, [lynxClient, iid, filter]);\n\n function removeFn<T extends Functionx | Functionx[]>(fns: T): ObjectOrArray<OKResponse, Functionx, T>\n function removeFn(fns: Functionx | Functionx[]) {\n if (Array.isArray(fns)) {\n const last = fns.pop();\n if (!last) {return Promise.allSettled([]);}\n const rest = fns.map((f => {\n return lynxClient.deleteFunction(f, true);\n }));\n return Promise.allSettled(rest).then(async(settled) => {\n try {\n settled.push({ status: 'fulfilled', value: await lynxClient.deleteFunction(last) });\n } catch (e) {\n settled.push({ status: 'rejected', reason: e });\n }\n return settled;\n });\n }\n return lynxClient.deleteFunction(fns);\n }\n\n function createFn<T extends EmptyFunctionx | EmptyFunctionx[]>(fns: T): ObjectOrArray<Functionx, EmptyFunctionx, T>\n function createFn(fns: EmptyFunctionx | EmptyFunctionx[]) {\n if (Array.isArray(fns)) {\n const last = fns.pop();\n if (!last) {return Promise.allSettled([]);}\n const rest = fns.map(f => {\n return lynxClient.createFunction(f, true);\n });\n return Promise.allSettled(rest).then(async(settled) => {\n try {\n settled.push({ status: 'fulfilled', value: await lynxClient.createFunction(last) });\n } catch (e) {\n settled.push({ status: 'rejected', reason: e });\n }\n return settled;\n });\n }\n return lynxClient.createFunction(fns);\n }\n\n const create = useCallback(createFn, [lynxClient, createFn]);\n const remove = useCallback(removeFn, [lynxClient, removeFn]);\n\n useLayoutEffect(() => {\n refreshCall();\n }, [refreshCall]);\n\n return {\n loading,\n error,\n create,\n remove,\n functions,\n refresh: refreshCall,\n };\n};\n","import { useCallback, useEffect, useState } from 'react';\n\nimport type { ErrorResponse } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\n\nexport const useIDTokenAlgorithms = () => {\n const { lynxClient } = useGlobalLynxClient();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<ErrorResponse | undefined>();\n const [algs, setAlgs] = useState<string[]>([]);\n const refresh = useCallback(() => {\n setLoading(true);\n lynxClient.getIDTokenAlgorithms().then(res => {\n setError((err) => err !== undefined ? undefined : err);\n setAlgs(res);\n }).catch(e => {\n setError(e);\n }).finally(() => {\n setLoading(false);\n });\n }, [lynxClient]);\n\n useEffect(() => {\n refresh();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return {\n loading,\n refresh,\n algs,\n error,\n };\n};","import { useCallback, useLayoutEffect, useState } from 'react';\n\nimport type { Installation } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nconst zeroInstallation = {\n client_id: 0,\n notes: '',\n organization_id: 0,\n id: 0,\n name: '',\n created: 0,\n meta: {},\n users: [],\n protected_meta: {}\n};\n\nexport const useInstallation = (installationId: number | string) => {\n const id = typeof installationId === 'string' ? Number.parseInt(installationId) : installationId;\n if(isNaN(id)) {\n throw new Error('invalid installationId');\n }\n const { lynxClient } = useGlobalLynxClient();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | undefined>(undefined);\n const [installation, setInstallation] = useState<Installation>({ ...zeroInstallation });\n\n useLayoutEffect(() => {\n lynxClient.getInstallationRow(id).then(inst => {\n setError((err) => err !== undefined ? undefined : err);\n setInstallation(inst);\n }).catch(e => {\n setError(e);\n }).finally(() => {\n setLoading(false);\n });\n }, [lynxClient, id]);\n\n const update = useCallback(() => {\n return new Promise<Installation>(() => {\n if (!installation) {\n throw new Error('update on undefined installation');\n }\n return lynxClient.updateInstallation(installation);\n });\n }, [lynxClient, installation]);\n\n const remove = useCallback(() => {\n return new Promise<Installation>(() => {\n if (!installation) {\n throw new Error('update on undefined installation');\n }\n return lynxClient.deleteInstallation(installation);\n });\n }, [lynxClient, installation]);\n return {\n installation,\n setInstallation,\n update,\n remove,\n error,\n loading,\n };\n};","import { useCallback, useLayoutEffect, useState } from 'react';\n\nimport type { ErrorResponse, InstallationInfo } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nexport const useInstallationInfo = (assignedOnly?: boolean) => {\n const { lynxClient } = useGlobalLynxClient();\n const [installations, setInstallations] = useState<InstallationInfo[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<ErrorResponse | undefined>(undefined);\n\n const refreshCall = useCallback(() => {\n setLoading(true);\n lynxClient.getInstallations(assignedOnly).then((res) => {\n setError((err) => err !== undefined ? undefined : err);\n setInstallations(res);\n }).catch((e: ErrorResponse) => {\n setError(e);\n }).finally(() => {\n setLoading(false);\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [lynxClient]);\n\n useLayoutEffect(() => {\n refreshCall();\n }, [refreshCall]);\n\n return {\n installations,\n refresh: refreshCall,\n loading,\n error,\n };\n};\n","import { useCallback, useLayoutEffect, useState } from 'react';\n\nimport type { ErrorResponse, Installation, Metadata } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nexport const useInstallations = (filter?: Metadata) => {\n const { lynxClient } = useGlobalLynxClient();\n const [loading, setLoading] = useState(true);\n const [installations, setInstallations] = useState<Installation[]>([]);\n const [error, setError] = useState<ErrorResponse | undefined>();\n\n const refresh = useCallback(() => {\n setLoading(true);\n lynxClient.listInstallations(filter).then(res => {\n setError((err) => err !== undefined ? undefined : err);\n setInstallations(res);\n }).catch(e => {\n setError(() => e);\n }).finally(() => {\n setLoading(false);\n });\n }, [lynxClient, filter]);\n\n useLayoutEffect(() => {\n refresh();\n }, [refresh]);\n\n return {\n loading,\n error,\n installations,\n refresh,\n };\n};","import { useCallback, useLayoutEffect, useRef, useState } from 'react';\n\nimport type { MQTTError, Qos, TypedArray } from 'paho-mqtt';\nimport Paho from 'paho-mqtt';\n\ninterface MQTTHandlers {\n onMessage?: Paho.OnMessageHandler;\n onDelivery?: Paho.OnMessageHandler;\n onConnected?: Paho.OnConnectHandler;\n onDisconnect?: Paho.OnConnectionLostHandler;\n}\n\nexport const usePahoMQTTClient = (uri: string,\n handlers?: MQTTHandlers, connectionOptions?: Paho.ConnectionOptions, clientId?: string) => {\n if (clientId === undefined) {\n let uuid;\n if(window?.crypto?.randomUUID) {\n uuid = window.crypto.randomUUID();\n } else if(typeof crypto !== 'undefined' && crypto?.randomUUID) {\n uuid = crypto.randomUUID();\n } else {\n uuid = Math.random().toString(36).substring(2, 15);\n }\n clientId = `paho-ws-mqtt-${uuid}`;\n }\n const client = useRef<Paho.Client>(new Paho.Client(uri, clientId));\n const opts = useRef(connectionOptions);\n const callbacks = useRef(handlers);\n const reconnectTimer = useRef<number | undefined>(undefined);\n const [connected, setConnected] = useState(false);\n const [error, setError] = useState<Paho.MQTTError | undefined>(undefined);\n useLayoutEffect(() => {\n const c = client;\n const rct = reconnectTimer;\n const o = {\n timeout: 5,\n ...opts.current,\n onFailure: (e: MQTTError) => {\n setError(e);\n setConnected(client.current.isConnected());\n rct.current ??= window.setInterval(() => {\n if (c.current.isConnected()) {\n clearInterval(rct.current);\n } else {\n c.current.connect(o);\n }\n }, 5000);\n },\n onSuccess: () => {\n setError(undefined);\n setConnected(client.current.isConnected());\n if (rct.current !== undefined) {\n window.clearInterval(rct.current);\n rct.current = undefined;\n }\n },\n } as Paho.ConnectionOptions;\n const cbs = callbacks.current;\n c.current.onConnectionLost = (e: MQTTError) => {\n setError(e);\n setConnected(client.current.isConnected());\n cbs?.onDisconnect?.(e);\n };\n c.current.onConnected = (reconnect: boolean, host: string) => {\n setConnected(client.current.isConnected());\n setError(undefined);\n cbs?.onConnected?.(reconnect, host);\n };\n if (cbs) {\n if (cbs.onMessage) {\n c.current.onMessageArrived = cbs.onMessage;\n }\n if (cbs.onDelivery) {\n c.current.onMessageDelivered = cbs.onDelivery;\n }\n }\n try {\n c.current.connect(o);\n } catch (_e) {\n window.setTimeout(() => {\n c.current.connect(o);\n }, 5000);\n }\n return () => {\n try {\n c.current.disconnect();\n if (rct.current !== undefined) {\n window.clearInterval(rct.current);\n }\n } catch (e) {\n console.log(e);\n }\n };\n\n }, []);\n\n\n const sub = useCallback((topic: string, qos?: Qos) => {\n return new Promise<Qos>((resolve) => {\n client.current.subscribe(topic, {\n qos: qos ?? 0,\n timeout: 1,\n onFailure: (e: MQTTError) => {\n throw e;\n },\n onSuccess: (res) => {\n resolve(res.grantedQos);\n }\n });\n });\n }, [client]);\n\n const pub = useCallback((topic: string, payload: string | TypedArray, qos?: Qos, retained?: boolean) => {\n let sendPayload: string | ArrayBuffer;\n if (typeof payload === 'string') {\n sendPayload = payload;\n } else if (ArrayBuffer.isView(payload)) {\n // Always create a new ArrayBuffer to guarantee type\n sendPayload = new Uint8Array(payload.buffer, payload.byteOffset, payload.byteLength).slice().buffer;\n } else {\n throw new Error('Payload must be a string or TypedArray');\n }\n client.current.send(topic, sendPayload, qos, retained);\n }, [client]);\n\n const unsub = useCallback((topic: string) => {\n return new Promise<void>((resolve) => {\n client.current.unsubscribe(topic, {\n timeout: 1,\n onSuccess: () => {\n resolve();\n },\n onFailure: (e: MQTTError) => {\n throw e;\n }\n });\n });\n }, [client]);\n\n return {\n client,\n connected,\n error,\n sub,\n pub,\n unsub,\n };\n};\n","import { useCallback, useEffect, useRef } from 'react';\n\nimport type { Qos, TypedArray } from 'paho-mqtt';\nimport type Paho from 'paho-mqtt';\n\nimport { usePahoMQTTClient } from './usePahoMQTTClient';\n\nexport type Binding = (topic: string, payload: string, qos: Qos, retained: boolean) => void;\n\nexport type Binder = (topic: RegExp | string, binder: Binding) => void;\nexport type Unbinder = (binder: Binding) => void;\n\nexport type ExactBinder = (topic: string, binder: Binding) => void;\nexport type ExactUnbinder = (topic: string, binder: Binding) => void;\n\nexport type Publisher = (topic: string, payload: string | TypedArray, qos?: Qos, retained?: boolean) => void;\n\nfunction isEq<T>(a: T[], b: T[]): boolean {\n if (a.length === b.length) {\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n }\n return false;\n}\n\ntype Unsub = (topic: string) => void | Promise<void>;\n\nfunction unsubscribe(unsub: Unsub, subs: string[]): Promise<void> {\n return new Promise<void>((resolve) => {\n subs.forEach(async(topic) => {\n try {\n await unsub(topic);\n } catch (e) {\n console.warn('failed to unsubscribe to', topic, e);\n }\n });\n resolve();\n });\n}\n\nfunction subscribe(sub: (topic: string, qos?: Qos) => void | Promise<Qos>, subs: string[]): Promise<void> {\n return new Promise<void>((resolve) => {\n subs.forEach(async(topic) => {\n try {\n await sub(topic);\n } catch (e) {\n console.warn('failed to subscribe to', topic, e);\n }\n });\n resolve();\n });\n}\n\nexport interface SimpleMQTT {\n setSubs: (subscriptions: string[]) => void;\n error?: Paho.MQTTError;\n connected: boolean;\n bind: Binder;\n unbind: Unbinder;\n bindExact: ExactBinder;\n unbindExact: ExactUnbinder;\n pub: Publisher;\n}\n\nexport const useSimpleMQTT = (uri?: string, username?: string, password?: string) => {\n if (uri === undefined) {\n if (window !== undefined) {\n uri = window.location.protocol === 'http:' ? `ws://${window.location.host}/mqtt` : `wss://${window.location.host}/mqtt`;\n } else {\n uri = location.protocol === 'http:' ? `ws://${location.host}/mqtt` : `wss://${location.host}/mqtt`;\n }\n }\n const subs = useRef<string[]>([]);\n const bindings = useRef(new Map<string, Binding[]>([]));\n const exactBindings = useRef(new Map<string, Binding[]>([]));\n const onMessage = useCallback((msg: Paho.Message) => {\n const tmp = exactBindings.current.get(msg.destinationName);\n if (tmp) {\n tmp.forEach((cb) => {\n cb(msg.destinationName, new TextDecoder().decode(msg.payloadBytes), msg.qos, msg.retained);\n });\n }\n bindings.current.forEach((binds, key) => {\n const re = new RegExp(key);\n if (re.test(msg.destinationName)) {\n binds.forEach(cb => {\n cb(msg.destinationName, new TextDecoder().decode(msg.payloadBytes), msg.qos, msg.retained);\n });\n }\n });\n }, []);\n const c = useRef<boolean>(false);\n\n const options = {\n cleanSession: true,\n reconnect: true,\n keepAliveInterval: 5,\n } as Paho.ConnectionOptions;\n if (username) {\n options.userName = username;\n }\n if (password) {\n options.password = password;\n }\n const {\n error,\n connected,\n sub,\n unsub,\n pub\n } = usePahoMQTTClient(uri, {\n onMessage, onConnected: () => {\n subs.current.forEach(s => {\n sub(s).catch((e) => {\n console.warn('Failed to subscribe to', s, e);\n });\n });\n },\n }, options);\n\n useEffect(() => {\n c.current = connected;\n }, [connected]);\n\n const bind = useCallback((topic: RegExp | string, binder: Binding) => {\n let re: RegExp;\n if (typeof topic === 'string') {\n re = new RegExp(`^${topic}$`);\n } else {\n re = topic;\n }\n const key = re.toString().slice(1, -1);\n let binds = bindings.current.get(key);\n if (binds === undefined) {\n binds = [binder];\n bindings.current.set(key, binds);\n return;\n }\n if (binds.includes(binder)) {\n return;\n }\n binds.push(binder);\n }, []);\n\n const unbind = useCallback((binder: Binding) => {\n bindings.current.forEach((binds, key) => {\n const newBinds = binds.filter((b) => b !== binder);\n bindings.current.set(key, newBinds);\n });\n }, []);\n\n\n const bindExact = useCallback((topic: string, binder: Binding) => {\n let binds = exactBindings.current.get(topic);\n if (binds === undefined) {\n binds = [binder];\n exactBindings.current.set(topic, binds);\n return;\n }\n if (binds.includes(binder)) {\n return;\n }\n binds.push(binder);\n }, []);\n\n const unbindExact = useCallback((topic: string, binder: Binding) => {\n const binds = exactBindings.current.get(topic);\n if (binds === undefined) {return;}\n exactBindings.current.set(topic, binds.filter((b) => b !== binder));\n }, []);\n\n const updateSubs = useCallback((s: string[]) => {\n if (isEq(subs.current, s)) {\n return;\n }\n if (c.current) {\n unsubscribe(unsub, subs.current)\n .then(() => subscribe(sub, s))\n .catch((e) => {\n console.warn('Failed to update subscriptions', e);\n });\n }\n subs.current = s;\n }, [sub, unsub]);\n\n return {\n setSubs: updateSubs,\n error,\n connected,\n bind,\n unbind,\n bindExact,\n unbindExact,\n pub,\n } as SimpleMQTT;\n};\n","import { useGlobalLynxClient, useGlobalUser } from '../Contexts';\n\nimport { useSimpleMQTT } from './useSimpleMQTT';\n\nexport const useMQTT = () => {\n const client = useGlobalLynxClient();\n const { user } = useGlobalUser();\n const baseURLObj = new URL(client.lynxClient.baseURL);\n const protocol = baseURLObj.protocol === 'http:' ? 'ws:' : 'wss:';\n const hostname = baseURLObj.hostname;\n const port = baseURLObj.port ? `:${baseURLObj.port}` : '';\n const wsURL = `${protocol}//${hostname}${port}/mqtt`;\n let username = user?.email ?? 'api-key';\n if (client.lynxClient.bearer) {\n username = 'bearer';\n }\n return useSimpleMQTT(wsURL, username, client.lynxClient.apiKey);\n};\n","import { useEffect } from 'react';\n\nimport type { Devicex, Functionx, Installation } from '@iotopen/node-lynx';\n\nimport { useDevices } from './useDevices';\nimport { useFunctions } from './useFunctions';\nimport { useInstallation } from './useInstallation';\nimport { useMQTT } from './useMQTT';\nimport type { SimpleMQTT } from './useSimpleMQTT';\n\nexport interface LiveInstallation {\n installation: Installation;\n functions: Functionx[];\n devices: Devicex[];\n mqtt: SimpleMQTT;\n}\n\nexport const useLiveInstallation = (installation: Installation) => {\n const mqtt = useMQTT();\n const { functions, refresh: fnRefresh } = useFunctions(installation.id);\n const { devices, refresh: devRefresh } = useDevices(installation.id);\n const { unbind, bind, setSubs } = mqtt;\n\n useEffect(() => {\n setSubs([`${installation.client_id}/#`]);\n bind(/[0-9]+\\/evt\\/functionx\\/updated/, fnRefresh);\n bind(/[0-9]+\\/evt\\/devicex\\/updated/, devRefresh);\n return () => {\n unbind(fnRefresh);\n unbind(devRefresh);\n };\n }, [bind, devRefresh, fnRefresh, installation, setSubs, unbind]);\n\n return {\n installation,\n functions,\n devices,\n mqtt,\n } as LiveInstallation;\n};\n\nexport const useLiveInstallationId = (installationId: number | string) => {\n const mqtt = useMQTT();\n const { installation } = useInstallation(installationId);\n const { functions, refresh: fnRefresh } = useFunctions(installationId);\n const { devices, refresh: devRefresh } = useDevices(installationId);\n const { unbind, bind, setSubs } = mqtt;\n useEffect(() => {\n setSubs([`${installation.client_id}/#`]);\n bind(/[0-9]+\\/evt\\/functionx\\/updated/, fnRefresh);\n bind(/[0-9]+\\/evt\\/devicex\\/updated/, devRefresh);\n return () => {\n unbind(fnRefresh);\n unbind(devRefresh);\n };\n }, [bind, devRefresh, fnRefresh, installation, setSubs, unbind]);\n\n return {\n installation,\n functions,\n devices,\n mqtt\n } as LiveInstallation;\n};\n","import { useCallback, useLayoutEffect, useState } from 'react';\n\nimport type { MetaObject, WithMeta } from '@iotopen/node-lynx';\nimport type { DependencyList } from 'react';\n\nexport type MetaElement = MetaObject & {\n key: string\n}\n\nexport const useMeta = (obj?: WithMeta, deps: DependencyList = []) => {\n const [metaList, setMetaList] = useState<MetaElement[]>([]);\n\n useLayoutEffect(() => {\n if (obj) {\n const newList = [] as MetaElement[];\n for (const key in obj.meta) {\n const value = obj.meta[key];\n newList.push({ key, value: value ?? '', protected: false });\n }\n for (const key in obj.protected_meta) {\n const value = obj.protected_meta[key];\n newList.push({ key, value: value ?? '', protected: true });\n }\n newList.sort((a, b) => a.key.localeCompare(b.key));\n setMetaList(newList);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [obj, ...deps]);\n\n const compile = useCallback(() => {\n const res = { meta: {}, protected_meta: {} } as WithMeta;\n metaList.forEach((e) => {\n if (e.protected) {\n res.protected_meta[e.key] = e.value;\n } else {\n res.meta[e.key] = e.value;\n }\n });\n return res;\n }, [metaList]);\n\n const add = useCallback((e?: MetaElement) => {\n setMetaList([...metaList, e ?? { key: '', value: '', protected: false }]);\n }, [metaList, setMetaList]);\n\n const remove = useCallback((idx: number) => {\n setMetaList(metaList.filter((_, i) => i !== idx));\n }, [metaList, setMetaList]);\n\n const update = useCallback((idx: number, e: MetaElement) => {\n setMetaList(metaList.map((x, i) => i === idx ? e : x));\n }, [metaList, setMetaList]);\n\n const setKey = useCallback((idx: number, key: string) => {\n setMetaList(metaList.map((x, i) => i === idx ? { ...x, key } : x));\n }, [metaList, setMetaList]);\n\n const setValue = useCallback((idx: number, value: string) => {\n setMetaList(metaList.map((x, i) => i === idx ? { ...x, value } : x));\n }, [metaList, setMetaList]);\n\n const setProtected = useCallback((idx: number, value: boolean) => {\n setMetaList(metaList.map((x, i) => i === idx ? { ...x, protected: value } : x));\n }, [metaList, setMetaList]);\n\n return {\n metaList,\n compile,\n addMeta: add,\n removeMeta: remove,\n setMeta: update,\n setMetaKey: setKey,\n setMetaValue: setValue,\n setMetaProtected: setProtected,\n };\n};\n","import { useCallback, useEffect, useState } from 'react';\n\nimport type { Devicex, Functionx, Installation } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nimport { useMQTT } from './useMQTT';\nimport type { SimpleMQTT } from './useSimpleMQTT';\n\nexport interface MultiLiveInstallation {\n installationMap: Map<number, Installation>;\n functionMap: Map<number, Functionx[]>;\n deviceMap: Map<number, Devicex[]>;\n mqtt: SimpleMQTT;\n toClientId: (iid: number) => number;\n toInstallationId: (cid: number) => number;\n}\n\nexport const useMultiLiveInstallation = (installations: Installation[]) => {\n const { lynxClient } = useGlobalLynxClient();\n const mqtt = useMQTT();\n const { bind, unbind, setSubs } = mqtt;\n\n\n // To keep track of client id => installation\n const [clientIdMap, setClientIdMap] = useState<Map<number, Installation>>(new Map());\n\n const [installationMap, setInstallationMap] = useState<Map<number, Installation>>(new Map());\n const [functionMap, setFunctionMap] = useState<Map<number, Functionx[]>>(new Map());\n const [deviceMap, setDeviceMap] = useState<Map<number, Devicex[]>>(new Map());\n\n const toClientId = useCallback((installationId: number) => {\n const i = installationMap.get(installationId);\n if (i !== undefined) {\n return i.client_id;\n }\n return 0;\n }, [installationMap]);\n\n const toInstallationId = useCallback((clientId: number) => {\n const i = clientIdMap.get(clientId);\n if (i !== undefined) {\n return i.id;\n }\n return 0;\n }, [clientIdMap]);\n\n useEffect(() => {\n if (installations.length === 0) {\n return;\n }\n const newInstallationMap = new Map<number, Installation>();\n const newClientIdMap = new Map<number, Installation>();\n const newTopics = new Array<string>();\n\n installations.forEach((inst) => {\n newInstallationMap.set(inst.id, inst);\n newClientIdMap.set(inst.client_id, inst);\n newTopics.push(`${inst.client_id}/#`);\n });\n\n // This is a flag to prevent new fetches during the initial fetch\n let done = false;\n const fnFetchers = installations.map(async(i) => {\n const fns = await lynxClient.getFunctions(i.id);\n return { functions: fns, installationId: i.id };\n });\n const devFetchers = installations.map(async(i) => {\n const devs = await lynxClient.getDevices(i.id);\n return { devices: devs, installationId: i.id };\n });\n\n const newDeviceMap = new Map<number, Devicex[]>();\n const newFunctionMap = new Map<number, Functionx[]>();\n const work = new Promise<void>((resolve, reject) => {\n let fnDone = false;\n let devDone = false;\n Promise.allSettled(fnFetchers).then((fnsResult) => {\n fnsResult.forEach((result) => {\n if (result.status === 'fulfilled') {\n newFunctionMap.set(result.value.installationId, result.value.functions);\n }\n });\n fnDone = true;\n if (fnDone && devDone) {resolve();}\n }).catch(reject);\n\n Promise.allSettled(devFetchers).then((devsResult) => {\n devsResult.forEach((result) => {\n if (result.status === 'fulfilled') {\n newDeviceMap.set(result.value.installationId, result.value.devices);\n }\n });\n devDone = true;\n if (fnDone && devDone) {resolve();}\n }).catch(reject);\n });\n work.finally(() => {\n setClientIdMap(() => newClientIdMap);\n setInstallationMap(() => newInstallationMap);\n setFunctionMap(() => newFunctionMap);\n setDeviceMap(() => newDeviceMap);\n // Now we can accept updates from mqtt\n done = true;\n }).catch((e) => {\n console.warn('Error in work.finally:', e);\n });\n\n const fnRefresh = (topic: string) => {\n if (!done) {return;}\n const cid = Number(topic.split('/')[0]);\n const inst = newClientIdMap.get(cid);\n if (inst === undefined) {return;}\n lynxClient.getFunctions(inst.id)\n .then((fns) => {\n setFunctionMap((p) => new Map([...p, [inst.id, fns]]));\n })\n .catch((e) => {\n console.warn('Failed to update function map for', inst.id, e);\n });\n };\n const devRefresh = (topic: string) => {\n if (!done) {return;}\n const cid = Number(topic.split('/')[0]);\n const inst = newClientIdMap.get(cid);\n if (inst === undefined) {return;}\n lynxClient.getDevices(inst.id)\n .then((devs) => {\n setDeviceMap((p) => new Map([...p, [inst.id, devs]]));\n })\n .catch((e) => {\n console.warn('Failed to update device map for', inst.id, e);\n });\n };\n setSubs(newTopics);\n\n bind(/[0-9]+\\/evt\\/functionx\\/updated/, fnRefresh);\n bind(/[0-9]+\\/evt\\/devicex\\/updated/, devRefresh);\n return () => {\n unbind(fnRefresh);\n unbind(devRefresh);\n };\n }, [installations, lynxClient, bind, unbind, setSubs]);\n\n return {\n installationMap,\n functionMap,\n deviceMap,\n mqtt,\n toClientId,\n toInstallationId\n } as MultiLiveInstallation;\n};\n","import { useCallback, useState } from 'react';\n\nimport type { EmptyDevicex, Metadata } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nexport interface DeviceTemplate {\n type?: string\n meta?: Metadata\n protected_meta?: Metadata\n}\n\nexport const useNewDevice = (installationId: number | string, template?: DeviceTemplate) => {\n const id = typeof installationId === 'string' ? Number.parseInt(installationId) : installationId;\n if (isNaN(id)) {\n throw new Error('invalid installationId');\n }\n const { lynxClient } = useGlobalLynxClient();\n const [newDevice, setNewDevice] = useState<EmptyDevicex>({\n meta: {},\n protected_meta: {},\n type: '', ...template, installation_id: id\n });\n\n const setType = useCallback((t: string) => {\n setNewDevice({ ...newDevice, type: t });\n }, [newDevice, setNewDevice]);\n\n const create = useCallback(() => {\n return lynxClient.createDevice(newDevice);\n }, [lynxClient, newDevice]);\n\n return {\n newDevice,\n setNewDevice,\n create,\n setType,\n };\n};\n","import { useCallback, useState } from 'react';\n\nimport type { EmptyFunctionx, Metadata } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nexport interface FunctionTemplate {\n type?: string\n meta?: Metadata\n protected_meta?: Metadata\n}\n\nexport const useNewFunction = (installationId: number | string, template?: FunctionTemplate) => {\n const id = typeof installationId === 'string' ? Number.parseInt(installationId) : installationId;\n if (isNaN(id)) {\n throw new Error('invalid installationId');\n }\n const { lynxClient } = useGlobalLynxClient();\n const [newFunction, setNewFunction] = useState<EmptyFunctionx>({\n meta: {},\n protected_meta: {},\n type: '', ...template, installation_id: id\n });\n\n const setType = useCallback((t: string) => {\n setNewFunction({ ...newFunction, type: t });\n }, [newFunction, setNewFunction]);\n\n const create = useCallback(() => {\n return lynxClient.createFunction(newFunction);\n }, [lynxClient, newFunction]);\n\n return {\n newFunction,\n setNewFunction,\n create,\n setType,\n };\n};\n","import { useCallback, useState } from 'react';\n\nimport type { EmptyInstallation, Metadata } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\n\nexport interface InstallationTemplate {\n name?: string\n notes?: string\n meta?: Metadata\n protected_meta?: Metadata\n}\n\nexport const useNewInstallation = (organizationId: number | string, template?: InstallationTemplate) => {\n const oid = typeof organizationId === 'string' ? Number.parseInt(organizationId) : organizationId;\n if (isNaN(oid)) {\n throw new Error('invalid organizationId');\n }\n const [newInstallation, setNewInstallation] = useState<EmptyInstallation>({\n name: '', notes: '', users: [],\n meta: {},\n protected_meta: {},\n ...template, organization_id: oid\n });\n const { lynxClient } = useGlobalLynxClient();\n\n const create = useCallback(() => {\n return lynxClient.createInstallation(newInstallation);\n }, [lynxClient, newInstallation]);\n\n return {\n newInstallation,\n setNewInstallation,\n create,\n };\n};","import { useCallback, useState } from 'react';\n\nimport type { EmptyNotificationMessage } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\n\nconst zeroEmptyNotificationMessage = {\n installation_id: 0,\n name: '',\n text: '',\n};\n\nexport interface NotificationMessageTemplate {\n installation_id?: number;\n name?: string;\n text?: string;\n}\n\nexport const useNewNotificationMessage = (installationId: number | string, template?: NotificationMessageTemplate) => {\n const iid = typeof installationId === 'string' ? Number.parseInt(installationId) : installationId;\n const { lynxClient } = useGlobalLynxClient();\n const [newNotificationMessage, setNewNotificationMessage] = useState<EmptyNotificationMessage>({\n ...zeroEmptyNotificationMessage,\n ...template,\n installation_id: iid,\n });\n\n const create = useCallback(() => {\n return lynxClient.createNotificationMessage(newNotificationMessage);\n }, [lynxClient, newNotificationMessage]);\n\n return {\n newNotificationMessage,\n setNewNotificationMessage,\n create\n };\n};","import { useCallback, useState } from 'react';\n\nimport type { EmptyNotificationOutput } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nconst zeroEmptyNotificationOutput = {\n installation_id: 0,\n name: '',\n notification_message_id: 0,\n notification_output_executor_id: 0,\n config: {},\n};\n\nexport interface NotificationOutputTemplate {\n installation_id?: number;\n name?: string;\n notification_message_id?: number;\n notification_output_executor_id?: number;\n config?: { [key: string]: string };\n}\n\nexport const useNewNotificationOutput = (installationId: number | string, template?: NotificationOutputTemplate) => {\n const iid = typeof installationId === 'string' ? Number.parseInt(installationId) : installationId;\n const { lynxClient } = useGlobalLynxClient();\n const [newNotificationOutput, setNewNotificationOutput] = useState<EmptyNotificationOutput>({\n ...zeroEmptyNotificationOutput,\n ...template,\n installation_id: iid,\n });\n\n const create = useCallback(() => {\n return lynxClient.createNotificationOutput(newNotificationOutput);\n }, [lynxClient, newNotificationOutput]);\n\n\n return {\n newNotificationOutput,\n setNewNotificationOutput,\n create,\n };\n};","import { useCallback, useState } from 'react';\n\nimport type { EmptyOAuth2Client } from '@iotopen/node-lynx';\nimport { zero } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nexport interface OAuth2ClientTemplate {\n name?: string\n trusted?: boolean\n allowed_scopes?: string[]\n icon_uri?: string\n tos_uri?: string\n policy_uri?: string\n redirect_uris?: string[]\n id_token_alg?: string\n}\n\nexport const useNewOAuth2Client = (template?: OAuth2ClientTemplate) => {\n const { lynxClient } = useGlobalLynxClient();\n const [client, setClient] = useState<EmptyOAuth2Client>({\n ...zero.getEmptyOAuth2Client(),\n ...template,\n });\n\n const setName = useCallback((name: string) => {\n setClient({ ...client, name });\n }, [client]);\n\n const setScope = useCallback((scopes: string[]) => {\n setClient({ ...client, allowed_scopes: scopes });\n }, [client]);\n\n const setIconURI = useCallback((uri: string) => {\n setClient({ ...client, icon_uri: uri });\n }, [client]);\n\n const setTosURI = useCallback((uri: string) => {\n setClient({ ...client, tos_uri: uri });\n }, [client]);\n\n const setPolicyURI = useCallback((uri: string) => {\n setClient({ ...client, policy_uri: uri });\n }, [client]);\n\n const setRedirectURIs = useCallback((uris: string[]) => {\n setClient({ ...client, redirect_uris: uris });\n }, [client]);\n\n const create = useCallback(() => {\n return lynxClient.createOAuth2Client(client);\n }, [lynxClient, client]);\n\n return {\n newClient: client,\n create,\n setName,\n setScope,\n setIconURI,\n setTosURI,\n setPolicyURI,\n setRedirectURIs,\n setClient,\n };\n};\n","import { useCallback, useState } from 'react';\n\nimport type { Address, EmptyOrganization, Metadata, OrganizationChild } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nexport interface OrganizationTemplate {\n address?: Address\n children?: OrganizationChild[]\n email?: string\n force_sms_login?: boolean\n phone?: string\n name?: string\n notes?: string\n password_valid_days?: number\n meta?: Metadata\n protected_meta?: Metadata\n}\nconst zeroEmptyOrganization = {\n address: {\n address: '',\n city: '',\n country: '',\n zip: '',\n },\n children: [],\n email: '',\n force_sms_login: false,\n meta: {},\n name: '',\n notes: '',\n parent: 0,\n password_valid_days: 0,\n phone: '',\n protected_meta: {},\n};\nexport const useNewOrganization = (parentId: number | string, template?: OrganizationTemplate) => {\n const pid = typeof parentId === 'string' ? Number.parseInt(parentId) : parentId;\n if (isNaN(pid)) {\n throw new Error('invalid parentId');\n }\n const { lynxClient } = useGlobalLynxClient();\n const [newOrganization, setNewOrganization] = useState<EmptyOrganization>({\n ...zeroEmptyOrganization,\n ...template, parent: pid\n });\n\n const create = useCallback(() => {\n return lynxClient.createOrganization(newOrganization);\n }, [lynxClient, newOrganization]);\n\n return {\n newOrganization,\n setNewOrganization,\n create,\n };\n};","import { useCallback, useState } from 'react';\n\nimport type { Address, EmptyUser } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nconst zeroEmptyUser = {\n address: {\n address: '',\n zip: '',\n city: '',\n country: ''\n },\n assigned_installations: [],\n email: '',\n expire_at: 0,\n first_name: '',\n last_name: '',\n mobile: '',\n note: '',\n organisations: [],\n password: '',\n role: 0,\n sms_login: false,\n protected_meta: {},\n meta: {},\n};\n\nexport interface UserTemplate {\n email?: string\n password?: string\n first_name?: string\n last_name?: string\n role?: number\n sms_login?: boolean\n mobile?: string\n note?: string\n organisations?: number[]\n assigned_installations?: number[]\n address?: Address\n expire_at?: number\n meta?: {[key: string]: unknown},\n protected_meta?: {[key: string]: unknown}\n}\n\nexport const useNewUser = (template?: UserTemplate) => {\n const [newUser, setNewUser] = useState<EmptyUser>({\n ...zeroEmptyUser,\n ...template\n });\n const { lynxClient } = useGlobalLynxClient();\n\n const create = useCallback(() => {\n return lynxClient.createUser(newUser);\n }, [lynxClient, newUser]);\n\n return {\n newUser, setNewUser,\n create,\n\n };\n};\n","import { useCallback, useEffect, useState } from 'react';\n\nimport type { ErrorResponse, NotificationMessage } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nconst zeroNotificationMessage= {\n id: 0,\n installation_id: 0,\n name: '',\n text: ''\n};\n\nexport const useNotificationMessage = (installationId: number | string, notificationId: number | string) => {\n const iid = typeof installationId === 'string' ? Number.parseInt(installationId) : installationId;\n const id = typeof notificationId === 'string' ? Number.parseInt(notificationId) : notificationId;\n if (isNaN(iid)) {\n throw new Error('invalid installationId');\n }\n if (isNaN(id)) {\n throw new Error('invalid messageId');\n }\n const { lynxClient } = useGlobalLynxClient();\n const [loading, setLoading] = useState(true);\n const [message, setMessage] = useState<NotificationMessage>({\n ...zeroNotificationMessage,\n });\n const [error, setError] = useState<ErrorResponse | undefined>();\n const refresh = useCallback(() => {\n if(iid === 0 || id === 0) {return;}\n setLoading(true);\n lynxClient.getNotificationMessage(iid, id).then(res => {\n setError((err) => err !== undefined ? undefined : err);\n setMessage(res);\n }).catch(e => {\n setError(e);\n }).finally(() => {\n setLoading(false);\n });\n }, [id, iid, lynxClient]);\n\n const update = useCallback(() => {\n if (error !== undefined) {setError(undefined);}\n lynxClient.updateNotificationMessage(message).then(res => {\n setMessage(res);\n }).catch(e => {\n setError(e);\n });\n }, [error, lynxClient, message]);\n\n const remove = useCallback(() => {\n lynxClient.deleteNotificationMessage(message).then(() => {\n setMessage({ ...zeroNotificationMessage });\n }).catch(e => {\n setError(e);\n });\n }, [lynxClient, message]);\n\n useEffect(() => {\n refresh();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return {\n refresh,\n message,\n setMessage,\n error,\n loading,\n remove,\n update\n };\n};","import { useCallback, useEffect, useState } from 'react';\n\nimport type { ErrorResponse, NotificationMessage } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nexport const useNotificationMessages = (installationId: number | string) => {\n const iid = typeof installationId === 'string' ? Number.parseInt(installationId) : installationId;\n if (isNaN(iid)) {\n throw new Error('invalid installationId');\n }\n const { lynxClient } = useGlobalLynxClient();\n const [notificationMessages, setNotificationMessages] = useState<NotificationMessage[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<ErrorResponse | undefined>();\n const refresh = useCallback(() => {\n lynxClient.getNotificationMessages(iid).then(res => {\n setError((err) => err !== undefined ? undefined : err);\n setNotificationMessages(res);\n }).catch(e => {\n setError(e);\n }).finally(() => {\n setLoading(false);\n });\n }, [iid, lynxClient]);\n\n useEffect(() => {\n refresh();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return {\n refresh,\n notificationMessages,\n error,\n loading,\n };\n};\n","import { useCallback, useEffect, useState } from 'react';\n\nimport type { ErrorResponse, NotificationOutput } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nconst zeroNotificationOutput = {\n id: 0,\n installation_id: 0,\n name: '',\n notification_message_id: 0,\n notification_output_executor_id: 0,\n config: {},\n};\n\nexport const useNotificationOutput = (installationId: number | string, notificationId: number | string) => {\n const iid = typeof installationId === 'string' ? Number.parseInt(installationId) : installationId;\n const id = typeof notificationId === 'string' ? Number.parseInt(notificationId) : notificationId;\n if (isNaN(iid)) {\n throw new Error('invalid installationId');\n }\n if (isNaN(id)) {\n throw new Error('invalid notificationId');\n }\n const { lynxClient } = useGlobalLynxClient();\n const [loading, setLoading] = useState(true);\n const [output, setOutput] = useState<NotificationOutput>({\n ...zeroNotificationOutput,\n config: { ...zeroNotificationOutput.config }\n });\n const [error, setError] = useState<ErrorResponse | undefined>();\n const refresh = useCallback(() => {\n if(iid === 0 || id === 0) {return;}\n setLoading(true);\n lynxClient.getNotificationOutput(iid, id).then(res => {\n setError((err) => err !== undefined ? undefined : err);\n setOutput(res);\n }).catch(e => {\n setError(e);\n }).finally(() => {\n setLoading(false);\n });\n }, [id, iid, lynxClient]);\n\n const update = useCallback(() => {\n if (error !== undefined) {setError(undefined);}\n lynxClient.updateNotificationOutput(output).then(res => {\n setOutput(res);\n }).catch(e => {\n setError(e);\n });\n }, [error, lynxClient, output]);\n\n const remove = useCallback(() => {\n lynxClient.deleteNotificationOutput(output).then(() => {\n setOutput({ ...zeroNotificationOutput });\n }).catch(e => {\n setError(e);\n });\n }, [lynxClient, output]);\n\n useEffect(() => {\n refresh();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return {\n refresh,\n output,\n setOutput,\n error,\n loading,\n remove,\n update\n };\n};","import { useCallback, useEffect, useState } from 'react';\n\nimport type { ErrorResponse, NotificationOutputExecutor } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\n\nconst zeroExecutor = {\n id: 0,\n type: '',\n name: '',\n organization_id: 0,\n config: {},\n secret: ''\n};\n\nexport const useNotificationOutputExecutor = (installationId: number | string, executorId: number | string) => {\n const iid = typeof installationId === 'string' ? Number.parseInt(installationId) : installationId;\n const id = typeof executorId === 'string' ? Number.parseInt(executorId) : executorId;\n if (isNaN(iid)) {\n throw new Error('invalid installationId');\n }\n if (isNaN(id)) {\n throw new Error('invalid messageId');\n }\n const { lynxClient } = useGlobalLynxClient();\n const [loading, setLoading] = useState(true);\n const [outputExecutor, setOutputExecutor] = useState<NotificationOutputExecutor>({\n ...zeroExecutor,\n });\n const [error, setError] = useState<ErrorResponse | undefined>();\n const refresh = useCallback(() => {\n if(iid === 0 || id === 0) {return;}\n setLoading(true);\n lynxClient.getNotificationOutputExecutor(iid, id).then(res => {\n setError((err) => err !== undefined ? undefined : err);\n setOutputExecutor(res);\n }).catch(e => {\n setError(e);\n }).finally(() => {\n setLoading(false);\n });\n }, [id, iid, lynxClient]);\n\n useEffect(() => {\n refresh();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return {\n refresh,\n outputExecutor,\n setOutputExecutor,\n error,\n loading,\n };\n};","import { useCallback, useEffect, useState } from 'react';\n\nimport type { ErrorResponse, NotificationOutputExecutor } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nexport const useNotificationOutputExecutors = (installationId: number | string) => {\n const iid = typeof installationId === 'string' ? Number.parseInt(installationId) : installationId;\n if (isNaN(iid)) {\n throw new Error('invalid installationId');\n }\n const { lynxClient } = useGlobalLynxClient();\n const [notificationExecutors, setNotificationExecutors] = useState<NotificationOutputExecutor[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<ErrorResponse | undefined>();\n const refresh = useCallback(() => {\n lynxClient.getNotificationOutputExecutors(iid).then(res => {\n setError((err) => err !== undefined ? undefined : err);\n setNotificationExecutors(res);\n }).catch(e => {\n setError(e);\n }).finally(() => {\n setLoading(false);\n });\n }, [iid, lynxClient]);\n\n useEffect(() => {\n refresh();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return {\n refresh,\n notificationExecutors,\n error,\n loading,\n };\n};\n","import { useCallback, useEffect, useState } from 'react';\n\nimport type { ErrorResponse, NotificationOutput } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nexport const useNotificationOutputs = (installationId: number | string) => {\n const iid = typeof installationId === 'string' ? Number.parseInt(installationId) : installationId;\n if (isNaN(iid)) {\n throw new Error('invalid installationId');\n }\n const { lynxClient } = useGlobalLynxClient();\n const [notificationOutputs, setNotificationOutputs] = useState<NotificationOutput[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<ErrorResponse | undefined>();\n const refresh = useCallback(() => {\n lynxClient.getNotificationOutputs(iid).then(res => {\n setError((err) => err !== undefined ? undefined : err);\n setNotificationOutputs(res);\n }).catch(e => {\n setError(e);\n }).finally(() => {\n setLoading(false);\n });\n }, [iid, lynxClient]);\n\n useEffect(() => {\n refresh();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return {\n refresh,\n notificationOutputs,\n error,\n loading,\n };\n};","import { useCallback, useEffect, useState } from 'react';\n\nimport type { ErrorResponse, OAuth2Client } from '@iotopen/node-lynx';\nimport { zero } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nexport const useOAuth2Client = (id: string) => {\n const { lynxClient } = useGlobalLynxClient();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<ErrorResponse | undefined>();\n const [client, setClient] = useState<OAuth2Client>({ ...zero.getOAuth2Client() });\n const refresh = useCallback(() => {\n if (!loading) {setLoading(true);}\n lynxClient.getOAuth2Client(id).then(fetchedClient => {\n setError((err) => err !== undefined ? undefined : err);\n setClient(fetchedClient);\n }).catch(e => {\n setError(e);\n }).finally(() => {\n setLoading(false);\n });\n }, [loading, lynxClient, id]);\n\n useEffect(() => {\n refresh();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [id]);\n\n const remove = useCallback(() => {\n return lynxClient.deleteOAuth2Client(client);\n }, [client, lynxClient]);\n\n const update = useCallback(() => {\n return lynxClient.updateOAuth2Client(client);\n }, [client, lynxClient]);\n\n return {\n refresh,\n client,\n setClient,\n error,\n loading,\n remove,\n update,\n };\n};\n","import { useCallback, useEffect, useState } from 'react';\n\nimport type { ErrorResponse, OAuth2Client } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nexport const useOAuth2Clients = () => {\n const { lynxClient } = useGlobalLynxClient();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<ErrorResponse | undefined>();\n const [clients, setClients] = useState<OAuth2Client[]>([]);\n const refresh = useCallback(() => {\n lynxClient.getOAuth2Clients().then(fetchedClients => {\n setError((err) => err !== undefined ? undefined : err);\n setClients(fetchedClients);\n }).catch(e => {\n setError(e);\n }).finally(() => {\n setLoading(false);\n });\n }, [lynxClient]);\n\n useEffect(() => {\n refresh();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return {\n refresh,\n clients,\n error,\n loading\n };\n};\n","import { useCallback, useEffect, useState } from 'react';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nimport { useOAuth2Client } from './useOAuth2Client';\n\nexport const useOAuth2Consent = () => {\n const { lynxClient } = useGlobalLynxClient();\n const [requestedScopes, setRequestedScopes] = useState<string[]>([]);\n const [params] = useState(new URLSearchParams(window.location.search));\n const clientId = params.get('client_id') ?? '';\n const { client } = useOAuth2Client(clientId);\n\n const consent = useCallback((scope: string[]) => {\n const consentObject = Object.fromEntries(params);\n\n consentObject['scope'] = scope.join(' ');\n return lynxClient.consentOAuth2Authorization(consentObject);\n }, [lynxClient, params]);\n\n useEffect(() => {\n setRequestedScopes(params.get('scope')?.split(' ') ?? []);\n }, [params]);\n\n return {\n consent,\n client,\n requestedScopes\n };\n};\n","import { useCallback, useEffect, useState } from 'react';\n\nimport type { Organization } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nconst zeroOrganization = {\n address: {\n address: '',\n city: '',\n country: '',\n zip: '',\n },\n children: [],\n email: '',\n force_sms_login: false,\n meta: {},\n name: '',\n notes: '',\n parent: 0,\n password_valid_days: 0,\n phone: '',\n protected_meta: {},\n id: 0\n};\nexport const useOrganization = (organizationId: number | string) => {\n const oid = typeof organizationId === 'string' ? Number.parseInt(organizationId) : organizationId;\n if (isNaN(oid)) {\n throw new Error('invalid organizationId');\n }\n const [organization, setOrganization] = useState<Organization>({ ...zeroOrganization });\n const [loading, setLoading] = useState<boolean>(true);\n const [error, setError] = useState<Error | undefined>();\n const { lynxClient } = useGlobalLynxClient();\n\n const refresh = useCallback(() => {\n setLoading(true);\n lynxClient.getOrganization(oid).then(org => {\n setError((err) => err !== undefined ? undefined : err);\n setOrganization(org);\n }).catch(e => {\n setError(e);\n }).finally(() => {\n setLoading(false);\n });\n }, [lynxClient, oid]);\n\n useEffect(() => {\n refresh();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const update = useCallback(() => {\n return lynxClient.updateOrganization(organization);\n }, [lynxClient, organization]);\n\n const remove = useCallback(() => {\n return lynxClient.deleteOrganization(organization);\n }, [lynxClient, organization]);\n\n return {\n loading,\n organization,\n setOrganization,\n error,\n update,\n remove,\n refresh\n };\n};","import { useCallback, useEffect, useState } from 'react';\n\nimport type { ErrorResponse, MinimalOrg, Organization } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nexport const useOrganizations = <T extends boolean = false>(minimal?: T) => {\n const { lynxClient } = useGlobalLynxClient();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<ErrorResponse | undefined>();\n const [organizations, setOrganizations] = useState<MinimalOrg<T>[]>([]);\n\n const refresh = useCallback(() => {\n setLoading(true);\n lynxClient.getOrganizations(minimal === true).then(orgs => {\n setError((err) => err !== undefined ? undefined : err);\n setOrganizations(<MinimalOrg<T>[]>orgs);\n }).catch(e => {\n setError(e);\n }).finally(() => {\n setLoading(false);\n });\n }, [lynxClient, minimal]);\n\n useEffect(() => {\n refresh();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const create = useCallback((org: Organization) => {\n return lynxClient.createOrganization(org);\n }, [lynxClient]);\n\n const remove = useCallback((org: Organization) => {\n return lynxClient.deleteOrganization(org);\n }, [lynxClient]);\n\n return {\n loading,\n organizations,\n setOrganizations,\n error,\n create,\n remove,\n };\n};","import { useCallback, useEffect, useState } from 'react';\n\nimport type { Role } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nexport const useRoles = () => {\n const { lynxClient } = useGlobalLynxClient();\n const [roles, setRoles] = useState<Role[]>([]);\n const [error, setError] = useState<Error | undefined>();\n const [loading, setLoading] = useState(true);\n\n const refresh = useCallback(() => {\n setLoading(true);\n lynxClient.getRoles().then((fetchedRoles) => {\n setError((err) => err !== undefined ? undefined : err);\n setRoles(fetchedRoles);\n }).catch((e) => {\n setError(e);\n }).finally(() => {\n setLoading(false);\n });\n }, [lynxClient]);\n\n useEffect(() => {\n refresh();\n /* eslint-disable react-hooks/exhaustive-deps */\n }, []);\n\n return {\n loading,\n error,\n roles,\n refresh\n };\n};\n","import { useCallback, useLayoutEffect, useState } from 'react';\n\nimport type { EmptyToken, ErrorResponse, Token } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nexport const useTokens = () => {\n const { lynxClient } = useGlobalLynxClient();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<ErrorResponse | undefined>();\n const [tokens, setTokens] = useState<Token[]>([]);\n\n const refresh = useCallback(() => {\n setLoading(true);\n lynxClient.getTokens().then((fetchedTokens) => {\n setError((err) => err !== undefined ? undefined : err);\n setTokens(fetchedTokens);\n }).catch((e) => {\n setError(e);\n }).finally(() => {\n setLoading(false);\n });\n }, [lynxClient]);\n\n const remove = useCallback((token: Token) => {\n return lynxClient.deleteToken(token);\n }, [lynxClient]);\n\n const create = useCallback((token: EmptyToken) => {\n return lynxClient.createToken(token);\n }, [lynxClient]);\n\n useLayoutEffect(() => {\n refresh();\n }, [refresh]);\n\n return {\n tokens,\n remove,\n create,\n refresh,\n loading,\n error\n };\n};\n","import { useCallback, useState } from 'react';\n\nimport type { User } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nconst zeroUser = {\n id: 0,\n address: {\n address: '',\n zip: '',\n city: '',\n country: ''\n },\n assigned_installations: [],\n email: '',\n expire_at: 0,\n first_name: '',\n last_name: '',\n mobile: '',\n note: '',\n organisations: [],\n password: '',\n role: 0,\n sms_login: false,\n protected_meta: {},\n meta: {},\n};\n\nexport const useUser = (userId: number | string) => {\n const id = typeof userId === 'string' ? Number.parseInt(userId) : userId;\n if (isNaN(id)) {\n throw new Error('invalid userId');\n }\n const [user, setUser] = useState<User>({ ...zeroUser });\n const [loading, setLoading] = useState<boolean>(true);\n const { lynxClient } = useGlobalLynxClient();\n const [error, setError] = useState<Error | undefined>();\n\n const refresh = useCallback(() => {\n setLoading(true);\n lynxClient.getUser(id).then((fetchedUser) => {\n setError((err) => err !== undefined ? undefined : err);\n setUser(fetchedUser);\n }).catch(e => {\n setError(e);\n }).finally(() => {\n setLoading(false);\n });\n }, [lynxClient, id]);\n\n const update = useCallback(() => {\n return lynxClient.updateUser(user);\n }, [lynxClient, user]);\n\n const remove = useCallback(() => {\n return lynxClient.deleteUser(user);\n }, [lynxClient, user]);\n\n return {\n loading,\n error,\n user,\n setUser,\n update,\n refresh,\n remove,\n };\n};\n","import { useCallback, useState } from 'react';\n\nimport type { Metadata, User } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\n\n// TODO: implement organization filter\nexport const useUsers = (filter?: Metadata) => {\n const [users, setUsers] = useState<User[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | undefined>();\n const { lynxClient } = useGlobalLynxClient();\n\n new URLSearchParams();\n\n const refresh = useCallback(() => {\n setLoading(true);\n lynxClient.getUsers(filter).then((fetchedUsers) => {\n setError((err) => err !== undefined ? undefined : err);\n setUsers(fetchedUsers);\n }).catch((e) => {\n setError(e);\n }).finally(() => {\n setLoading(false);\n });\n }, [lynxClient, filter]);\n\n return {\n users,\n setUsers,\n refresh,\n loading,\n error\n };\n};\n"],"names":["defaultLynxClientContext","LynxClient","_url","_apiKey","_bearer","LynxClientContext","createContext","LynxClientProvider","children","url","apiKey","bearer","client","setClient","useState","newClient","useCallback","newUrl","newApiKey","newBearer","contextValue","useMemo","useGlobalLynxClient","useContext","defaultUserContext","UserContext","UserProvider","user","setUser","permissions","setPermissions","loading","setLoading","error","setError","lynxClient","useLayoutEffect","me","perms","u","p","err","e","useGlobalUser","useGlobalPermissions","LynxProvider","apiURL","jsx","usePermissionsCheckAll","currentPermissions","permission","usePermissionsCheckAny","useConfiguredEdgeApps","installationId","id","apps","setApps","refresh","fetchedApps","zeroDevice","useDevice","deviceId","iid","dev","setDev","fn","update","setType","t","remove","useDeviceMeta","devId","create","key","meta","overrideDevId","silent","createMissing","useDevices","filter","devices","setDevices","refreshCall","res","removeFn","devs","last","rest","settled","createFn","zeroEdgeApp","useEdgeApp","appId","app","setApp","fetchedApp","useEdgeApps","useEdgeAppVersions","untagged","versions","setVersions","fetchedVersions","nameVersion","name","hash","zeroFunction","useFunction","functionId","func","setFunc","useFunctionMeta","fnId","funId","useFunctions","functions","setFunctions","fns","f","useIDTokenAlgorithms","algs","setAlgs","useEffect","zeroInstallation","useInstallation","installation","setInstallation","inst","useInstallationInfo","assignedOnly","installations","setInstallations","useInstallations","usePahoMQTTClient","uri","handlers","connectionOptions","clientId","uuid","useRef","Paho","opts","callbacks","reconnectTimer","connected","setConnected","c","rct","o","cbs","reconnect","host","sub","topic","qos","resolve","pub","payload","retained","sendPayload","unsub","isEq","a","b","i","unsubscribe","subs","subscribe","useSimpleMQTT","username","password","bindings","exactBindings","onMessage","msg","tmp","cb","binds","options","s","bind","binder","re","unbind","newBinds","bindExact","unbindExact","useMQTT","baseURLObj","protocol","hostname","port","wsURL","useLiveInstallation","mqtt","fnRefresh","devRefresh","setSubs","useLiveInstallationId","useMeta","obj","deps","metaList","setMetaList","newList","value","compile","add","idx","_","x","setKey","setValue","setProtected","useMultiLiveInstallation","clientIdMap","setClientIdMap","installationMap","setInstallationMap","functionMap","setFunctionMap","deviceMap","setDeviceMap","toClientId","toInstallationId","newInstallationMap","newClientIdMap","newTopics","done","fnFetchers","devFetchers","newDeviceMap","newFunctionMap","reject","fnDone","devDone","fnsResult","result","devsResult","cid","useNewDevice","template","newDevice","setNewDevice","useNewFunction","newFunction","setNewFunction","useNewInstallation","organizationId","oid","newInstallation","setNewInstallation","zeroEmptyNotificationMessage","useNewNotificationMessage","newNotificationMessage","setNewNotificationMessage","zeroEmptyNotificationOutput","useNewNotificationOutput","newNotificationOutput","setNewNotificationOutput","useNewOAuth2Client","zero","setName","setScope","scopes","setIconURI","setTosURI","setPolicyURI","setRedirectURIs","uris","zeroEmptyOrganization","useNewOrganization","parentId","pid","newOrganization","setNewOrganization","zeroEmptyUser","useNewUser","newUser","setNewUser","zeroNotificationMessage","useNotificationMessage","notificationId","message","setMessage","useNotificationMessages","notificationMessages","setNotificationMessages","zeroNotificationOutput","useNotificationOutput","output","setOutput","zeroExecutor","useNotificationOutputExecutor","executorId","outputExecutor","setOutputExecutor","useNotificationOutputExecutors","notificationExecutors","setNotificationExecutors","useNotificationOutputs","notificationOutputs","setNotificationOutputs","useOAuth2Client","fetchedClient","useOAuth2Clients","clients","setClients","fetchedClients","useOAuth2Consent","requestedScopes","setRequestedScopes","params","consent","scope","consentObject","zeroOrganization","useOrganization","organization","setOrganization","org","useOrganizations","minimal","organizations","setOrganizations","orgs","useRoles","roles","setRoles","fetchedRoles","useTokens","tokens","setTokens","fetchedTokens","token","zeroUser","useUser","userId","fetchedUser","useUsers","users","setUsers","fetchedUsers"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/Contexts/LynxClientProvider.tsx","../../src/Contexts/UserProvider.tsx","../../src/Contexts/LynxProvider.tsx","../../src/Hooks/useCheckPermissions.ts","../../src/Hooks/useConfiguredEdgeApps.ts","../../src/Hooks/useDevice.ts","../../src/Hooks/useDevices.ts","../../src/Hooks/useEdgeApp.ts","../../src/Hooks/useEdgeApps.ts","../../src/Hooks/useEdgeAppVersions.ts","../../src/Hooks/useFunction.ts","../../src/Hooks/useFunctions.ts","../../src/Hooks/useIDTokenAlgorithms.ts","../../src/Hooks/useInstallation.ts","../../src/Hooks/useInstallationInfo.ts","../../src/Hooks/useInstallations.ts","../../src/Hooks/usePahoMQTTClient.ts","../../src/Hooks/useSimpleMQTT.ts","../../src/Hooks/useMQTT.ts","../../src/Hooks/useLiveInstallation.ts","../../src/Hooks/useMeta.ts","../../src/Hooks/useMultiLiveInstallation.ts","../../src/Hooks/useNewDevice.ts","../../src/Hooks/useNewFunction.ts","../../src/Hooks/useNewInstallation.ts","../../src/Hooks/useNewNotificationMessage.ts","../../src/Hooks/useNewNotificationOutput.ts","../../src/Hooks/useNewOAuth2Client.ts","../../src/Hooks/useNewOrganization.ts","../../src/Hooks/useNewUser.ts","../../src/Hooks/useNotificationMessage.ts","../../src/Hooks/useNotificationMessages.ts","../../src/Hooks/useNotificationOutput.ts","../../src/Hooks/useNotificationOutputExecutor.ts","../../src/Hooks/useNotificationOutputExecutors.ts","../../src/Hooks/useNotificationOutputs.ts","../../src/Hooks/useOAuth2Client.ts","../../src/Hooks/useOAuth2Clients.ts","../../src/Hooks/useOAuth2Consent.ts","../../src/Hooks/useOrganization.ts","../../src/Hooks/useOrganizations.ts","../../src/Hooks/useRoles.ts","../../src/Hooks/useTokens.ts","../../src/Hooks/useUser.ts","../../src/Hooks/useUsers.ts"],"sourcesContent":["import { createContext, type ReactNode, useCallback, useContext, useMemo, useState } from 'react';\n\nimport { LynxClient } from '@iotopen/node-lynx';\n\n\ninterface lynxClientContext {\n lynxClient: LynxClient;\n newLynxClient: (url: string, apiKey?: string, bearer?: boolean) => void;\n}\n\nconst defaultLynxClientContext = {\n lynxClient: new LynxClient(''),\n newLynxClient: (_url?: string, _apiKey?: string, _bearer?: boolean) => {\n // intentionally unused, see interface for signature\n }\n};\n\nconst LynxClientContext = createContext(defaultLynxClientContext as lynxClientContext);\n\ninterface LynxClientProviderProps {\n children?: ReactNode;\n url?: string | undefined;\n apiKey?: string | undefined;\n bearer?: boolean | undefined;\n}\n\nexport const LynxClientProvider = ({ children, url, apiKey, bearer }: LynxClientProviderProps) => {\n const [client, setClient] = useState(new LynxClient(url, apiKey, bearer));\n const newClient = useCallback((newUrl: string, newApiKey?: string, newBearer?: boolean) => {\n setClient(new LynxClient(newUrl, newApiKey, newBearer));\n }, [setClient]);\n const contextValue = useMemo(() => ({ lynxClient: client, newLynxClient: newClient }), [client, newClient]);\n return (\n <LynxClientContext.Provider value={contextValue}>\n {children}\n </LynxClientContext.Provider>\n );\n};\n\nexport const useGlobalLynxClient = () => {\n return useContext(LynxClientContext);\n};\n","import { createContext, type ReactNode, useContext, useLayoutEffect, useMemo, useState } from 'react';\n\nimport type { ErrorResponse, User } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from './LynxClientProvider';\n\ninterface userContext {\n user: User | null;\n permissions: { [key: string]: boolean } | null;\n error: ErrorResponse | undefined;\n loading: boolean;\n}\n\nconst defaultUserContext = {\n user: null,\n permissions: null,\n};\nconst UserContext = createContext(defaultUserContext as userContext);\n\ninterface UserProviderProps {\n children: ReactNode;\n}\n\nexport const UserProvider = ({ children }: UserProviderProps) => {\n const [user, setUser] = useState<User | null>(null);\n const [permissions, setPermissions] = useState<{ [key: string]: boolean } | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<ErrorResponse | undefined>();\n const { lynxClient } = useGlobalLynxClient();\n useLayoutEffect(() => {\n void Promise.resolve().then(() => {\n const me = lynxClient.getMe();\n const perms = lynxClient.getPermissions();\n setLoading(true);\n Promise.all([me, perms]).then(([u, p]) => {\n setError((err) => err !== undefined ? undefined : err);\n setUser(u);\n setPermissions(p);\n }).catch(e => {\n setError(e as ErrorResponse);\n setUser(null);\n setPermissions(null);\n }).finally(() => {\n setLoading(false);\n });\n });\n }, [lynxClient]);\n const contextValue = useMemo(() => ({ user, permissions, loading, error }), [user, permissions, loading, error]);\n return (\n <UserContext.Provider value={contextValue}>\n {children}\n </UserContext.Provider>\n );\n};\n\n\nexport const useGlobalUser = () => {\n return useContext(UserContext);\n};\n\nexport const useGlobalPermissions = () => {\n const { permissions } = useGlobalUser();\n return permissions;\n};\n","import type { ReactNode } from 'react';\n\nimport { LynxClientProvider } from './LynxClientProvider';\nimport { UserProvider } from './UserProvider';\n\ninterface LynxProviderProps {\n apiURL?: string;\n apiKey?: string;\n bearer?: boolean;\n children?: ReactNode;\n}\n\nexport const LynxProvider = ({ children, apiURL, apiKey, bearer }: LynxProviderProps) => {\n return (\n <LynxClientProvider url={apiURL} apiKey={apiKey} bearer={bearer}>\n <UserProvider>\n {children}\n </UserProvider>\n </LynxClientProvider>\n );\n};\n","import type { Permissions } from '@iotopen/node-lynx';\n\nimport { useGlobalPermissions } from '../Contexts';\n\n\nexport type Permission = Permissions | string\n\nexport const usePermissionsCheckAll = (...permissions: Permission[]): boolean => {\n const currentPermissions = useGlobalPermissions();\n if (currentPermissions === undefined || currentPermissions === null) {return false;}\n return permissions.every(permission => currentPermissions[permission] !== undefined && currentPermissions[permission]);\n};\n\n\nexport const usePermissionsCheckAny = (...permissions: Permission[]): boolean => {\n const currentPermissions = useGlobalPermissions();\n if (currentPermissions === undefined || currentPermissions === null) {return false;}\n return permissions.some(permission => currentPermissions[permission] !== undefined && currentPermissions[permission]);\n};\n","import { useCallback, useLayoutEffect, useState } from 'react';\n\nimport type { EdgeAppInstance, ErrorResponse } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nexport const useConfiguredEdgeApps = (installationId: number | string) => {\n const id = typeof installationId === 'string' ? Number.parseInt(installationId) : installationId;\n if (isNaN(id)) {\n throw new Error('invalid installationId');\n }\n const { lynxClient } = useGlobalLynxClient();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<ErrorResponse | undefined>();\n const [apps, setApps] = useState<EdgeAppInstance[]>([]);\n\n const refresh = useCallback(() => {\n setLoading(true);\n lynxClient.getConfiguredEdgeApps(id).then(fetchedApps => {\n setError((err) => err !== undefined ? undefined : err);\n setApps(fetchedApps);\n }).catch(e => {\n setError(e as ErrorResponse);\n }).finally(() => {\n setLoading(false);\n });\n }, [id, lynxClient]);\n\n useLayoutEffect(() => {\n void Promise.resolve().then(refresh);\n }, [refresh]);\n\n return {\n refresh,\n loading,\n error,\n apps,\n };\n};\n","import { useCallback, useLayoutEffect, useState } from 'react';\n\nimport type { Devicex, ErrorResponse, MetaObject, OKResponse } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nconst zeroDevice = {\n updated: 0,\n created: 0,\n id: 0,\n installation_id: 0,\n type: '',\n meta: {},\n protected_meta: {}\n};\n\nexport const useDevice = (installationId: number | string, deviceId: number | string) => {\n const iid = typeof installationId === 'string' ? Number.parseInt(installationId) : installationId;\n const id = typeof deviceId === 'string' ? Number.parseInt(deviceId) : deviceId;\n if (isNaN(iid) || isNaN(id)) {\n throw new Error('invalid installationId or deviceId');\n }\n const { lynxClient } = useGlobalLynxClient();\n const [loading, setLoading] = useState(true);\n const [dev, setDev] = useState<Devicex>({ ...zeroDevice });\n const [error, setError] = useState<ErrorResponse | undefined>();\n\n useLayoutEffect(() => {\n lynxClient.getDevice(iid, id).then(fn => {\n setError((err) => err !== undefined ? undefined : err);\n setDev(fn);\n }).catch(e => {\n setError(e as ErrorResponse);\n }).finally(() => {\n setLoading(false);\n });\n }, [lynxClient, iid, id]);\n\n const update = useCallback(() => {\n return new Promise<Devicex>(() => {\n if (!dev) {\n throw new Error('update on undefined function');\n }\n return lynxClient.updateDevice(dev);\n });\n }, [lynxClient, dev]);\n\n const setType = useCallback((t: string) => {\n if (dev) {setDev({ ...dev, type: t });}\n }, [dev, setDev]);\n\n const remove = useCallback(() => {\n return new Promise<OKResponse>(() => {\n if (!dev) {\n throw new Error('delete on undefined function');\n }\n return lynxClient.deleteDevice(dev);\n });\n }, [dev, lynxClient]);\n\n return {\n loading,\n error,\n Device: dev,\n setDevice: setDev,\n update,\n remove,\n setType,\n };\n};\n\nexport const useDeviceMeta = (installationId: number | string, deviceId?: number|string) => {\n const iid = typeof installationId === 'string' ? Number.parseInt(installationId) : installationId;\n const devId = typeof deviceId === 'string' ? Number.parseInt(deviceId) : deviceId;\n\n const { lynxClient } = useGlobalLynxClient();\n\n const create = useCallback((key: string, meta: MetaObject, overrideDevId?: number, silent?: boolean) => {\n const id = overrideDevId ?? devId ?? 0;\n return lynxClient.createDeviceMeta(iid, id, key, meta, silent);\n }, [lynxClient, iid, devId]);\n\n\n const update = useCallback((key: string, meta: MetaObject, createMissing?: boolean, overrideDevId?: number, silent?: boolean) => {\n const id = overrideDevId ?? devId ?? 0;\n return lynxClient.updateDeviceMeta(iid, id, key, meta, silent, createMissing);\n }, [lynxClient, iid, devId]);\n\n\n const remove = useCallback((key: string, overrideDevId?: number, silent?: boolean) => {\n const id = overrideDevId ?? devId ?? 0;\n return lynxClient.deleteDeviceMeta(iid, id, key, silent);\n }, [lynxClient, iid, devId]);\n\n return {\n createMeta: create,\n updateMeta: update,\n removeMeta: remove,\n };\n};\n","import { useCallback, useLayoutEffect, useState } from 'react';\n\nimport type { Devicex, EmptyDevicex, ErrorResponse, Metadata, OKResponse } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\nimport type { ObjectOrArray } from '../types';\n\nexport const useDevices = (installationId: number|string, filter?: Metadata) => {\n const iid = typeof installationId === 'string' ? Number.parseInt(installationId) : installationId;\n if (isNaN(iid) && iid !== undefined) {\n throw new Error('invalid installationId');\n }\n const { lynxClient } = useGlobalLynxClient();\n const [loading, setLoading] = useState(true);\n const [devices, setDevices] = useState<Devicex[]>([]);\n const [error, setError] = useState<ErrorResponse | undefined>();\n const refreshCall = useCallback(() => {\n if (iid === undefined) {\n setLoading(false);\n setDevices([]);\n return;\n }\n setLoading(true);\n lynxClient.getDevices(iid, filter).then(res => {\n setError((err) => err !== undefined ? undefined : err);\n setDevices(res);\n }).catch(e => {\n setError(e as ErrorResponse);\n }).finally(() => {\n setLoading(false);\n });\n }, [lynxClient, iid, filter]);\n\n function removeFn<T extends Devicex | Devicex[]>(devs: T): ObjectOrArray<OKResponse, Devicex, T>\n function removeFn(devs: Devicex | Devicex[]) {\n if (Array.isArray(devs)) {\n const last = devs.pop();\n if (!last) {return Promise.allSettled([]);}\n const rest = devs.map((dev => {\n return lynxClient.deleteDevice(dev, true);\n }));\n return Promise.allSettled(rest).then(async(settled) => {\n try {\n settled.push({ status: 'fulfilled', value: await lynxClient.deleteDevice(last) });\n } catch (e) {\n settled.push({ status: 'rejected', reason: e });\n }\n return settled;\n });\n }\n return lynxClient.deleteDevice(devs);\n }\n\n function createFn<T extends EmptyDevicex | EmptyDevicex[]>(devs: T): ObjectOrArray<Devicex, EmptyDevicex, T>\n function createFn(devs: EmptyDevicex | EmptyDevicex[]) {\n if (Array.isArray(devs)) {\n const last = devs.pop();\n if (!last) {return Promise.allSettled([]);}\n const rest = devs.map(dev => {\n return lynxClient.createDevice(dev, true);\n });\n return Promise.allSettled(rest).then(async(settled) => {\n try {\n settled.push({ status: 'fulfilled', value: await lynxClient.createDevice(last) });\n } catch (e) {\n settled.push({ status: 'rejected', reason: e });\n }\n return settled;\n });\n }\n return lynxClient.createDevice(devs);\n }\n\n // createFn/removeFn are overloaded; allow any args and result here.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-call\n const create = useCallback((...args: any[]) => (createFn as any)(...args), [createFn]);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-call\n const remove = useCallback((...args: any[]) => (removeFn as any)(...args), [removeFn]);\n\n useLayoutEffect(() => {\n void Promise.resolve().then(refreshCall);\n }, [refreshCall]);\n\n return {\n loading,\n error,\n create,\n remove,\n devices,\n refresh: refreshCall,\n };\n};\n","import { useCallback, useLayoutEffect, useState } from 'react';\n\nimport type { EdgeApp, ErrorResponse } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nconst zeroEdgeApp = {\n id: 0,\n created: 0,\n updated: 0,\n name: '',\n category: '',\n short_description: '',\n description: '',\n source_url: '',\n tags: [],\n publisher: { id: 0 },\n public: false,\n official: false\n};\n\nexport const useEdgeApp = (appId: number | string) => {\n const id = typeof appId === 'string' ? Number.parseInt(appId) : appId;\n if (isNaN(id)) {\n throw new Error('invalid appId');\n }\n const { lynxClient } = useGlobalLynxClient();\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<ErrorResponse | undefined>();\n const [app, setApp] = useState<EdgeApp>({ ...zeroEdgeApp });\n\n const refresh = useCallback(() => {\n setLoading(true);\n lynxClient.getEdgeApp(id).then(fetchedApp => {\n setError((err) => err !== undefined ? undefined : err);\n setApp(fetchedApp);\n }).catch(e => {\n setError(e as ErrorResponse);\n }).finally(() => {\n setLoading(false);\n });\n }, [id, lynxClient]);\n\n useLayoutEffect(() => {\n void Promise.resolve().then(refresh);\n }, [refresh]);\n\n return {\n loading,\n error,\n app,\n setApp,\n refresh\n };\n};\n","import { useCallback, useLayoutEffect, useState } from 'react';\n\nimport type { EdgeApp, ErrorResponse } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nexport const useEdgeApps = () => {\n const { lynxClient } = useGlobalLynxClient();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<ErrorResponse | undefined>();\n const [apps, setApps] = useState<EdgeApp[]>([]);\n\n const refresh = useCallback(() => {\n setLoading(true);\n lynxClient.getEdgeApps().then(fetchedApps => {\n setError((err) => err !== undefined ? undefined : err);\n setApps(fetchedApps);\n }).catch(e => {\n setError(e as ErrorResponse);\n }).finally(() => {\n setLoading(false);\n });\n }, [lynxClient]);\n\n useLayoutEffect(() => {\n void Promise.resolve().then(refresh);\n }, [refresh]);\n\n return {\n apps,\n error,\n loading,\n refresh,\n };\n};\n","import { useCallback, useLayoutEffect, useState } from 'react';\n\nimport type { EdgeAppVersion, ErrorResponse } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nexport const useEdgeAppVersions = (appId: number | string, untagged?: boolean) => {\n const id = typeof appId === 'string' ? Number.parseInt(appId) : appId;\n if (isNaN(id)) {\n throw new Error('invalid appId');\n }\n const { lynxClient } = useGlobalLynxClient();\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<ErrorResponse | undefined>();\n const [versions, setVersions] = useState<EdgeAppVersion[]>([]);\n\n const refresh = useCallback(() => {\n setLoading(true);\n lynxClient.getEdgeAppVersions(id, untagged).then((fetchedVersions) => {\n setError((err) => err !== undefined ? undefined : err);\n setVersions(fetchedVersions);\n }).catch(e => {\n setError(e as ErrorResponse);\n }).finally(() => {\n setLoading(false);\n });\n }, [lynxClient, id, untagged]);\n\n const nameVersion = useCallback((name: string, hash: string) => {\n return lynxClient.nameEdgeAppVersion(id, name, hash);\n }, [lynxClient, id]);\n\n useLayoutEffect(() => {\n void Promise.resolve().then(refresh);\n }, [refresh]);\n\n return {\n loading,\n error,\n versions,\n nameVersion,\n refresh\n };\n};\n","import { useCallback, useLayoutEffect, useState } from 'react';\n\nimport type { ErrorResponse, Functionx, MetaObject, OKResponse } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nconst zeroFunction = {\n id: 0,\n installation_id: 0,\n type: '',\n updated: 0,\n created: 0,\n meta: {},\n protected_meta: {}\n};\n\nexport const useFunction = (installationId: number | string, functionId: number | string) => {\n const iid = typeof installationId === 'string' ? Number.parseInt(installationId) : installationId;\n const id = typeof functionId === 'string' ? Number.parseInt(functionId) : functionId;\n\n if (isNaN(iid) || isNaN(id)) {\n throw new Error('invalid installationId or functionId');\n }\n\n const { lynxClient } = useGlobalLynxClient();\n const [loading, setLoading] = useState(true);\n const [func, setFunc] = useState<Functionx>({ ...zeroFunction });\n const [error, setError] = useState<ErrorResponse | undefined>();\n\n useLayoutEffect(() => {\n lynxClient.getFunction(iid, id).then(fn => {\n setError((err) => err !== undefined ? undefined : err);\n setFunc(fn);\n }).catch(e => {\n setError(e as ErrorResponse);\n }).finally(() => {\n setLoading(false);\n });\n }, [lynxClient, iid, id]);\n\n const update = useCallback(() => {\n return new Promise<Functionx>(() => {\n if (!func) {\n throw new Error('update on undefined function');\n }\n return lynxClient.updateFunction(func);\n });\n }, [lynxClient, func]);\n\n const setType = useCallback((t: string) => {\n if (func) {setFunc({ ...func, type: t });}\n }, [func, setFunc]);\n\n const remove = useCallback(() => {\n return new Promise<OKResponse>(() => {\n if (!func) {\n throw new Error('delete on undefined function');\n }\n return lynxClient.deleteFunction(func);\n });\n }, [func, lynxClient]);\n\n return {\n loading,\n error,\n Function: func,\n setFunction: setFunc,\n update,\n remove,\n setType,\n };\n};\n\nexport const useFunctionMeta = (installationId: number | string, functionId?: number | string) => {\n const iid = typeof installationId === 'string' ? Number.parseInt(installationId) : installationId;\n const fnId = typeof functionId === 'string' ? Number.parseInt(functionId) : functionId;\n\n const { lynxClient } = useGlobalLynxClient();\n const create = useCallback((key: string, meta: MetaObject, funId?: number, silent?: boolean) => {\n const id = funId ?? fnId ?? 0;\n return lynxClient.createFunctionMeta(iid, id, key, meta, silent);\n }, [lynxClient, iid, fnId]);\n\n const update = useCallback((key: string, meta: MetaObject, createMissing?: boolean, funId?: number, silent?: boolean) => {\n const id = funId ?? fnId ?? 0;\n return lynxClient.updateFunctionMeta(iid, id, key, meta, silent, createMissing);\n }, [lynxClient, iid, fnId]);\n\n const remove = useCallback((key: string, funId?: number, silent?: boolean) => {\n const id = funId ?? fnId ?? 0;\n return lynxClient.deleteFunctionMeta(iid, id, key, silent);\n }, [lynxClient, iid, fnId]);\n\n return {\n createMeta: create,\n updateMeta: update,\n removeMeta: remove,\n };\n};\n","import { useCallback, useLayoutEffect, useState } from 'react';\n\nimport type { EmptyFunctionx, ErrorResponse, Functionx, Metadata, OKResponse } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\nimport type { ObjectOrArray } from '../types';\n\nexport const useFunctions = (installationId: number | string, filter?: Metadata) => {\n const iid = typeof installationId === 'string' ? Number.parseInt(installationId) : installationId;\n if (isNaN(iid) && iid !== undefined) {\n throw new Error('invalid installationId');\n }\n const { lynxClient } = useGlobalLynxClient();\n const [loading, setLoading] = useState(true);\n const [functions, setFunctions] = useState<Functionx[]>([]);\n const [error, setError] = useState<ErrorResponse | undefined>();\n const refreshCall = useCallback(() => {\n if (iid === undefined) {\n setLoading(false);\n setFunctions([]);\n return;\n }\n setLoading(true);\n lynxClient.getFunctions(iid, filter).then(res => {\n setError((err) => err !== undefined ? undefined : err);\n setFunctions(res);\n return res;\n }).catch(e => {\n setError(e as ErrorResponse);\n }).finally(() => {\n setLoading(false);\n });\n }, [lynxClient, iid, filter]);\n\n function removeFn<T extends Functionx | Functionx[]>(fns: T): ObjectOrArray<OKResponse, Functionx, T>\n function removeFn(fns: Functionx | Functionx[]) {\n if (Array.isArray(fns)) {\n const last = fns.pop();\n if (!last) {return Promise.allSettled([]);}\n const rest = fns.map((f => {\n return lynxClient.deleteFunction(f, true);\n }));\n return Promise.allSettled(rest).then(async(settled) => {\n try {\n settled.push({ status: 'fulfilled', value: await lynxClient.deleteFunction(last) });\n } catch (e) {\n settled.push({ status: 'rejected', reason: e });\n }\n return settled;\n });\n }\n return lynxClient.deleteFunction(fns);\n }\n\n function createFn<T extends EmptyFunctionx | EmptyFunctionx[]>(fns: T): ObjectOrArray<Functionx, EmptyFunctionx, T>\n function createFn(fns: EmptyFunctionx | EmptyFunctionx[]) {\n if (Array.isArray(fns)) {\n const last = fns.pop();\n if (!last) {return Promise.allSettled([]);}\n const rest = fns.map(f => {\n return lynxClient.createFunction(f, true);\n });\n return Promise.allSettled(rest).then(async(settled) => {\n try {\n settled.push({ status: 'fulfilled', value: await lynxClient.createFunction(last) });\n } catch (e) {\n settled.push({ status: 'rejected', reason: e });\n }\n return settled;\n });\n }\n return lynxClient.createFunction(fns);\n }\n\n // createFn/removeFn are overloaded; allow any args and result here.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-call\n const create = useCallback((...args: any[]) => (createFn as any)(...args), [createFn]);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-call\n const remove = useCallback((...args: any[]) => (removeFn as any)(...args), [removeFn]);\n\n useLayoutEffect(() => {\n void Promise.resolve().then(refreshCall);\n }, [refreshCall]);\n\n return {\n loading,\n error,\n create,\n remove,\n functions,\n refresh: refreshCall,\n };\n};\n","import { useCallback, useEffect, useState } from 'react';\n\nimport type { ErrorResponse } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\n\nexport const useIDTokenAlgorithms = () => {\n const { lynxClient } = useGlobalLynxClient();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<ErrorResponse | undefined>();\n const [algs, setAlgs] = useState<string[]>([]);\n const refresh = useCallback(() => {\n setLoading(true);\n lynxClient.getIDTokenAlgorithms().then(res => {\n setError((err) => err !== undefined ? undefined : err);\n setAlgs(res);\n }).catch(e => {\n setError(e as ErrorResponse);\n }).finally(() => {\n setLoading(false);\n });\n }, [lynxClient]);\n\n useEffect(() => {\n refresh();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return {\n loading,\n refresh,\n algs,\n error,\n };\n};\n","import { useCallback, useLayoutEffect, useState } from 'react';\n\nimport type { Installation } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nconst zeroInstallation = {\n client_id: 0,\n notes: '',\n organization_id: 0,\n id: 0,\n name: '',\n created: 0,\n meta: {},\n users: [],\n protected_meta: {}\n};\n\nexport const useInstallation = (installationId: number | string) => {\n const id = typeof installationId === 'string' ? Number.parseInt(installationId) : installationId;\n if (isNaN(id)) {\n throw new Error('invalid installationId');\n }\n const { lynxClient } = useGlobalLynxClient();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | undefined>(undefined);\n const [installation, setInstallation] = useState<Installation>({ ...zeroInstallation });\n\n useLayoutEffect(() => {\n lynxClient.getInstallationRow(id).then(inst => {\n setError((err) => err !== undefined ? undefined : err);\n setInstallation(inst);\n }).catch(e => {\n setError(e as Error);\n }).finally(() => {\n setLoading(false);\n });\n }, [lynxClient, id]);\n\n const update = useCallback(() => {\n return new Promise<Installation>(() => {\n if (!installation) {\n throw new Error('update on undefined installation');\n }\n return lynxClient.updateInstallation(installation);\n });\n }, [lynxClient, installation]);\n\n const remove = useCallback(() => {\n return new Promise<Installation>(() => {\n if (!installation) {\n throw new Error('update on undefined installation');\n }\n return lynxClient.deleteInstallation(installation);\n });\n }, [lynxClient, installation]);\n return {\n installation,\n setInstallation,\n update,\n remove,\n error,\n loading,\n };\n};\n","import { useCallback, useLayoutEffect, useState } from 'react';\n\nimport type { ErrorResponse, InstallationInfo } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nexport const useInstallationInfo = (assignedOnly?: boolean) => {\n const { lynxClient } = useGlobalLynxClient();\n const [installations, setInstallations] = useState<InstallationInfo[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<ErrorResponse | undefined>(undefined);\n\n const refreshCall = useCallback(() => {\n setLoading(true);\n lynxClient.getInstallations(assignedOnly).then((res) => {\n setError((err) => err !== undefined ? undefined : err);\n setInstallations(res);\n }).catch((e: ErrorResponse) => {\n setError(e);\n }).finally(() => {\n setLoading(false);\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [lynxClient]);\n\n useLayoutEffect(() => {\n refreshCall();\n }, [refreshCall]);\n\n return {\n installations,\n refresh: refreshCall,\n loading,\n error,\n };\n};\n","import { useCallback, useLayoutEffect, useState } from 'react';\n\nimport type { ErrorResponse, Installation, Metadata } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nexport const useInstallations = (filter?: Metadata) => {\n const { lynxClient } = useGlobalLynxClient();\n const [loading, setLoading] = useState(true);\n const [installations, setInstallations] = useState<Installation[]>([]);\n const [error, setError] = useState<ErrorResponse | undefined>();\n\n const refresh = useCallback(() => {\n setLoading(true);\n lynxClient.listInstallations(filter).then(res => {\n setError((err) => err !== undefined ? undefined : err);\n setInstallations(res);\n }).catch(e => {\n setError(e as ErrorResponse);\n }).finally(() => {\n setLoading(false);\n });\n }, [lynxClient, filter]);\n\n useLayoutEffect(() => {\n void Promise.resolve().then(refresh);\n }, [refresh]);\n\n return {\n loading,\n error,\n installations,\n refresh,\n };\n};\n","import { useCallback, useLayoutEffect, useRef, useState } from 'react';\n\nimport Paho, { type MQTTError, type Qos, type TypedArray } from 'paho-mqtt';\n\nfunction assertError(e: unknown): Error {\n return e instanceof Error ? e : new Error(String(e));\n}\n\ninterface MQTTHandlers {\n onMessage?: Paho.OnMessageHandler;\n onDelivery?: Paho.OnMessageHandler;\n onConnected?: Paho.OnConnectHandler;\n onDisconnect?: Paho.OnConnectionLostHandler;\n}\n\nexport const usePahoMQTTClient = (uri: string,\n handlers?: MQTTHandlers, connectionOptions?: Paho.ConnectionOptions, clientId?: string) => {\n if (clientId === undefined) {\n let uuid;\n if (window?.crypto?.randomUUID) {\n uuid = window.crypto.randomUUID();\n } else if (typeof crypto !== 'undefined' && crypto?.randomUUID) {\n uuid = crypto.randomUUID();\n } else {\n uuid = Math.random().toString(36).substring(2, 15);\n }\n clientId = `paho-ws-mqtt-${uuid}`;\n }\n const client = useRef<Paho.Client>(new Paho.Client(uri, clientId));\n const opts = useRef(connectionOptions);\n const callbacks = useRef(handlers);\n const reconnectTimer = useRef<number | undefined>(undefined);\n const [connected, setConnected] = useState(false);\n const [error, setError] = useState<Paho.MQTTError | undefined>(undefined);\n useLayoutEffect(() => {\n const c = client;\n const rct = reconnectTimer;\n const o = {\n timeout: 5,\n ...opts.current,\n onFailure: (e: MQTTError) => {\n setError(e);\n setConnected(client.current.isConnected());\n rct.current ??= window.setInterval(() => {\n if (c.current.isConnected()) {\n clearInterval(rct.current);\n } else {\n c.current.connect(o);\n }\n }, 5000);\n },\n onSuccess: () => {\n setError(undefined);\n setConnected(client.current.isConnected());\n if (rct.current !== undefined) {\n window.clearInterval(rct.current);\n rct.current = undefined;\n }\n },\n } as Paho.ConnectionOptions;\n const cbs = callbacks.current;\n c.current.onConnectionLost = (e: MQTTError) => {\n setError(e);\n setConnected(client.current.isConnected());\n cbs?.onDisconnect?.(e);\n };\n c.current.onConnected = (reconnect: boolean, host: string) => {\n setConnected(client.current.isConnected());\n setError(undefined);\n cbs?.onConnected?.(reconnect, host);\n };\n if (cbs) {\n if (cbs.onMessage) {\n c.current.onMessageArrived = cbs.onMessage;\n }\n if (cbs.onDelivery) {\n c.current.onMessageDelivered = cbs.onDelivery;\n }\n }\n try {\n c.current.connect(o);\n } catch (_e) {\n window.setTimeout(() => {\n c.current.connect(o);\n }, 5000);\n }\n return () => {\n try {\n c.current.disconnect();\n if (rct.current !== undefined) {\n window.clearInterval(rct.current);\n }\n } catch (e) {\n console.log(e);\n }\n };\n\n }, []);\n\n\n const sub = useCallback((topic: string, qos?: Qos) => {\n return new Promise<Qos>((resolve) => {\n client.current.subscribe(topic, {\n qos: qos ?? 0,\n timeout: 1,\n onFailure: (e: MQTTError) => {\n throw assertError(e);\n },\n onSuccess: (res) => {\n resolve(res.grantedQos);\n }\n });\n });\n }, [client]);\n\n const pub = useCallback((topic: string, payload: string | TypedArray, qos?: Qos, retained?: boolean) => {\n let sendPayload: string | ArrayBuffer;\n if (typeof payload === 'string') {\n sendPayload = payload;\n } else if (ArrayBuffer.isView(payload)) {\n // Always create a new ArrayBuffer to guarantee type\n sendPayload = new Uint8Array(payload.buffer, payload.byteOffset, payload.byteLength).slice().buffer;\n } else {\n throw new Error('Payload must be a string or TypedArray');\n }\n client.current.send(topic, sendPayload, qos, retained);\n }, [client]);\n\n const unsub = useCallback((topic: string) => {\n return new Promise<void>((resolve) => {\n client.current.unsubscribe(topic, {\n timeout: 1,\n onSuccess: () => {\n resolve();\n },\n onFailure: (e: MQTTError) => {\n throw assertError(e);\n }\n });\n });\n }, [client]);\n\n return {\n client,\n connected,\n error,\n sub,\n pub,\n unsub,\n };\n};\n","import { useCallback, useEffect, useRef } from 'react';\n\nimport type { Qos, TypedArray } from 'paho-mqtt';\nimport type Paho from 'paho-mqtt';\n\nimport { usePahoMQTTClient } from './usePahoMQTTClient';\n\nexport type Binding = (topic: string, payload: string, qos: Qos, retained: boolean) => void;\n\nexport type Binder = (topic: RegExp | string, binder: Binding) => void;\nexport type Unbinder = (binder: Binding) => void;\n\nexport type ExactBinder = (topic: string, binder: Binding) => void;\nexport type ExactUnbinder = (topic: string, binder: Binding) => void;\n\nexport type Publisher = (topic: string, payload: string | TypedArray, qos?: Qos, retained?: boolean) => void;\n\nfunction isEq<T>(a: T[], b: T[]): boolean {\n if (a.length === b.length) {\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n }\n return false;\n}\n\ntype Unsub = (topic: string) => void | Promise<void>;\n\nfunction unsubscribe(unsub: Unsub, subs: string[]): Promise<void> {\n return new Promise<void>((resolve) => {\n subs.forEach(async(topic) => {\n try {\n await unsub(topic);\n } catch (e) {\n console.warn('failed to unsubscribe to', topic, e);\n }\n });\n resolve();\n });\n}\n\nfunction subscribe(sub: (topic: string, qos?: Qos) => void | Promise<Qos>, subs: string[]): Promise<void> {\n return new Promise<void>((resolve) => {\n subs.forEach(async(topic) => {\n try {\n await sub(topic);\n } catch (e) {\n console.warn('failed to subscribe to', topic, e);\n }\n });\n resolve();\n });\n}\n\nexport interface SimpleMQTT {\n setSubs: (subscriptions: string[]) => void;\n error?: Paho.MQTTError;\n connected: boolean;\n bind: Binder;\n unbind: Unbinder;\n bindExact: ExactBinder;\n unbindExact: ExactUnbinder;\n pub: Publisher;\n}\n\nexport const useSimpleMQTT = (uri?: string, username?: string, password?: string) => {\n if (uri === undefined) {\n if (window !== undefined) {\n uri = window.location.protocol === 'http:' ? `ws://${window.location.host}/mqtt` : `wss://${window.location.host}/mqtt`;\n } else {\n uri = location.protocol === 'http:' ? `ws://${location.host}/mqtt` : `wss://${location.host}/mqtt`;\n }\n }\n const subs = useRef<string[]>([]);\n const bindings = useRef(new Map<string, Binding[]>([]));\n const exactBindings = useRef(new Map<string, Binding[]>([]));\n const onMessage = useCallback((msg: Paho.Message) => {\n const tmp = exactBindings.current.get(msg.destinationName);\n if (tmp) {\n tmp.forEach((cb) => {\n cb(msg.destinationName, new TextDecoder().decode(msg.payloadBytes), msg.qos, msg.retained);\n });\n }\n bindings.current.forEach((binds, key) => {\n const re = new RegExp(key);\n if (re.test(msg.destinationName)) {\n binds.forEach(cb => {\n cb(msg.destinationName, new TextDecoder().decode(msg.payloadBytes), msg.qos, msg.retained);\n });\n }\n });\n }, []);\n const c = useRef<boolean>(false);\n\n const options = {\n cleanSession: true,\n reconnect: true,\n keepAliveInterval: 5,\n } as Paho.ConnectionOptions;\n if (username) {\n options.userName = username;\n }\n if (password) {\n options.password = password;\n }\n const {\n error,\n connected,\n sub,\n unsub,\n pub\n } = usePahoMQTTClient(uri, {\n onMessage, onConnected: () => {\n subs.current.forEach(s => {\n sub(s).catch((e) => {\n console.warn('Failed to subscribe to', s, e);\n });\n });\n },\n }, options);\n\n useEffect(() => {\n c.current = connected;\n }, [connected]);\n\n const bind = useCallback((topic: RegExp | string, binder: Binding) => {\n let re: RegExp;\n if (typeof topic === 'string') {\n re = new RegExp(`^${topic}$`);\n } else {\n re = topic;\n }\n const key = re.toString().slice(1, -1);\n let binds = bindings.current.get(key);\n if (binds === undefined) {\n binds = [binder];\n bindings.current.set(key, binds);\n return;\n }\n if (binds.includes(binder)) {\n return;\n }\n binds.push(binder);\n }, []);\n\n const unbind = useCallback((binder: Binding) => {\n bindings.current.forEach((binds, key) => {\n const newBinds = binds.filter((b) => b !== binder);\n bindings.current.set(key, newBinds);\n });\n }, []);\n\n\n const bindExact = useCallback((topic: string, binder: Binding) => {\n let binds = exactBindings.current.get(topic);\n if (binds === undefined) {\n binds = [binder];\n exactBindings.current.set(topic, binds);\n return;\n }\n if (binds.includes(binder)) {\n return;\n }\n binds.push(binder);\n }, []);\n\n const unbindExact = useCallback((topic: string, binder: Binding) => {\n const binds = exactBindings.current.get(topic);\n if (binds === undefined) {return;}\n exactBindings.current.set(topic, binds.filter((b) => b !== binder));\n }, []);\n\n const updateSubs = useCallback((s: string[]) => {\n if (isEq(subs.current, s)) {\n return;\n }\n if (c.current) {\n unsubscribe(unsub, subs.current)\n .then(() => subscribe(sub, s))\n .catch((e) => {\n console.warn('Failed to update subscriptions', e);\n });\n }\n subs.current = s;\n }, [sub, unsub]);\n\n return {\n setSubs: updateSubs,\n error,\n connected,\n bind,\n unbind,\n bindExact,\n unbindExact,\n pub,\n } as SimpleMQTT;\n};\n","import { useGlobalLynxClient, useGlobalUser } from '../Contexts';\n\nimport { useSimpleMQTT } from './useSimpleMQTT';\n\nexport const useMQTT = () => {\n const client = useGlobalLynxClient();\n const { user } = useGlobalUser();\n const baseURLObj = new URL(client.lynxClient.baseURL);\n const protocol = baseURLObj.protocol === 'http:' ? 'ws:' : 'wss:';\n const hostname = baseURLObj.hostname;\n const port = baseURLObj.port ? `:${baseURLObj.port}` : '';\n const wsURL = `${protocol}//${hostname}${port}/mqtt`;\n let username = user?.email ?? 'api-key';\n if (client.lynxClient.bearer) {\n username = 'bearer';\n }\n return useSimpleMQTT(wsURL, username, client.lynxClient.apiKey);\n};\n","import { useEffect } from 'react';\n\nimport type { Devicex, Functionx, Installation } from '@iotopen/node-lynx';\n\nimport { useDevices } from './useDevices';\nimport { useFunctions } from './useFunctions';\nimport { useInstallation } from './useInstallation';\nimport { useMQTT } from './useMQTT';\nimport type { SimpleMQTT } from './useSimpleMQTT';\n\nexport interface LiveInstallation {\n installation: Installation;\n functions: Functionx[];\n devices: Devicex[];\n mqtt: SimpleMQTT;\n}\n\nexport const useLiveInstallation = (installation: Installation) => {\n const mqtt = useMQTT();\n const { functions, refresh: fnRefresh } = useFunctions(installation.id);\n const { devices, refresh: devRefresh } = useDevices(installation.id);\n const { unbind, bind, setSubs } = mqtt;\n\n useEffect(() => {\n setSubs([`${installation.client_id}/#`]);\n bind(/[0-9]+\\/evt\\/functionx\\/updated/, fnRefresh);\n bind(/[0-9]+\\/evt\\/devicex\\/updated/, devRefresh);\n return () => {\n unbind(fnRefresh);\n unbind(devRefresh);\n };\n }, [bind, devRefresh, fnRefresh, installation, setSubs, unbind]);\n\n return {\n installation,\n functions,\n devices,\n mqtt,\n } as LiveInstallation;\n};\n\nexport const useLiveInstallationId = (installationId: number | string) => {\n const mqtt = useMQTT();\n const { installation } = useInstallation(installationId);\n const { functions, refresh: fnRefresh } = useFunctions(installationId);\n const { devices, refresh: devRefresh } = useDevices(installationId);\n const { unbind, bind, setSubs } = mqtt;\n useEffect(() => {\n setSubs([`${installation.client_id}/#`]);\n bind(/[0-9]+\\/evt\\/functionx\\/updated/, fnRefresh);\n bind(/[0-9]+\\/evt\\/devicex\\/updated/, devRefresh);\n return () => {\n unbind(fnRefresh);\n unbind(devRefresh);\n };\n }, [bind, devRefresh, fnRefresh, installation, setSubs, unbind]);\n\n return {\n installation,\n functions,\n devices,\n mqtt\n } as LiveInstallation;\n};\n","import { type DependencyList, useCallback, useLayoutEffect, useState } from 'react';\n\nimport type { MetaObject, WithMeta } from '@iotopen/node-lynx';\n\nexport type MetaElement = MetaObject & {\n key: string\n}\n\nexport const useMeta = (obj?: WithMeta, deps: DependencyList = []) => {\n const [metaList, setMetaList] = useState<MetaElement[]>([]);\n\n useLayoutEffect(() => {\n if (obj) {\n const newList = [] as MetaElement[];\n for (const key in obj.meta) {\n const value = obj.meta[key];\n newList.push({ key, value: value ?? '', protected: false });\n }\n for (const key in obj.protected_meta) {\n const value = obj.protected_meta[key];\n newList.push({ key, value: value ?? '', protected: true });\n }\n newList.sort((a, b) => a.key.localeCompare(b.key));\n setMetaList(newList);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [obj, ...deps]);\n\n const compile = useCallback(() => {\n const res = { meta: {}, protected_meta: {} } as WithMeta;\n metaList.forEach((e) => {\n if (e.protected) {\n res.protected_meta[e.key] = e.value;\n } else {\n res.meta[e.key] = e.value;\n }\n });\n return res;\n }, [metaList]);\n\n const add = useCallback((e?: MetaElement) => {\n setMetaList([...metaList, e ?? { key: '', value: '', protected: false }]);\n }, [metaList, setMetaList]);\n\n const remove = useCallback((idx: number) => {\n setMetaList(metaList.filter((_, i) => i !== idx));\n }, [metaList, setMetaList]);\n\n const update = useCallback((idx: number, e: MetaElement) => {\n setMetaList(metaList.map((x, i) => i === idx ? e : x));\n }, [metaList, setMetaList]);\n\n const setKey = useCallback((idx: number, key: string) => {\n setMetaList(metaList.map((x, i) => i === idx ? { ...x, key } : x));\n }, [metaList, setMetaList]);\n\n const setValue = useCallback((idx: number, value: string) => {\n setMetaList(metaList.map((x, i) => i === idx ? { ...x, value } : x));\n }, [metaList, setMetaList]);\n\n const setProtected = useCallback((idx: number, value: boolean) => {\n setMetaList(metaList.map((x, i) => i === idx ? { ...x, protected: value } : x));\n }, [metaList, setMetaList]);\n\n return {\n metaList,\n compile,\n addMeta: add,\n removeMeta: remove,\n setMeta: update,\n setMetaKey: setKey,\n setMetaValue: setValue,\n setMetaProtected: setProtected,\n };\n};\n","import { useCallback, useEffect, useState } from 'react';\n\nimport type { Devicex, Functionx, Installation } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nimport { useMQTT } from './useMQTT';\nimport type { SimpleMQTT } from './useSimpleMQTT';\n\nexport interface MultiLiveInstallation {\n installationMap: Map<number, Installation>;\n functionMap: Map<number, Functionx[]>;\n deviceMap: Map<number, Devicex[]>;\n mqtt: SimpleMQTT;\n toClientId: (iid: number) => number;\n toInstallationId: (cid: number) => number;\n}\n\nexport const useMultiLiveInstallation = (installations: Installation[]) => {\n const { lynxClient } = useGlobalLynxClient();\n const mqtt = useMQTT();\n const { bind, unbind, setSubs } = mqtt;\n\n\n // To keep track of client id => installation\n const [clientIdMap, setClientIdMap] = useState<Map<number, Installation>>(new Map());\n\n const [installationMap, setInstallationMap] = useState<Map<number, Installation>>(new Map());\n const [functionMap, setFunctionMap] = useState<Map<number, Functionx[]>>(new Map());\n const [deviceMap, setDeviceMap] = useState<Map<number, Devicex[]>>(new Map());\n\n const toClientId = useCallback((installationId: number) => {\n const i = installationMap.get(installationId);\n if (i !== undefined) {\n return i.client_id;\n }\n return 0;\n }, [installationMap]);\n\n const toInstallationId = useCallback((clientId: number) => {\n const i = clientIdMap.get(clientId);\n if (i !== undefined) {\n return i.id;\n }\n return 0;\n }, [clientIdMap]);\n\n useEffect(() => {\n if (installations.length === 0) {\n return;\n }\n const newInstallationMap = new Map<number, Installation>();\n const newClientIdMap = new Map<number, Installation>();\n const newTopics = new Array<string>();\n\n installations.forEach((inst) => {\n newInstallationMap.set(inst.id, inst);\n newClientIdMap.set(inst.client_id, inst);\n newTopics.push(`${inst.client_id}/#`);\n });\n\n // This is a flag to prevent new fetches during the initial fetch\n let done = false;\n const fnFetchers = installations.map(async(i) => {\n const fns = await lynxClient.getFunctions(i.id);\n return { functions: fns, installationId: i.id };\n });\n const devFetchers = installations.map(async(i) => {\n const devs = await lynxClient.getDevices(i.id);\n return { devices: devs, installationId: i.id };\n });\n\n const newDeviceMap = new Map<number, Devicex[]>();\n const newFunctionMap = new Map<number, Functionx[]>();\n const work = new Promise<void>((resolve, reject) => {\n let fnDone = false;\n let devDone = false;\n Promise.allSettled(fnFetchers).then((fnsResult) => {\n fnsResult.forEach((result) => {\n if (result.status === 'fulfilled') {\n newFunctionMap.set(result.value.installationId, result.value.functions);\n }\n });\n fnDone = true;\n if (fnDone && devDone) {resolve();}\n }).catch(reject);\n\n Promise.allSettled(devFetchers).then((devsResult) => {\n devsResult.forEach((result) => {\n if (result.status === 'fulfilled') {\n newDeviceMap.set(result.value.installationId, result.value.devices);\n }\n });\n devDone = true;\n if (fnDone && devDone) {resolve();}\n }).catch(reject);\n });\n work.finally(() => {\n setClientIdMap(() => newClientIdMap);\n setInstallationMap(() => newInstallationMap);\n setFunctionMap(() => newFunctionMap);\n setDeviceMap(() => newDeviceMap);\n // Now we can accept updates from mqtt\n done = true;\n }).catch((e) => {\n console.warn('Error in work.finally:', e);\n });\n\n const fnRefresh = (topic: string) => {\n if (!done) {return;}\n const cid = Number(topic.split('/')[0]);\n const inst = newClientIdMap.get(cid);\n if (inst === undefined) {return;}\n lynxClient.getFunctions(inst.id)\n .then((fns) => {\n setFunctionMap((p) => new Map([...p, [inst.id, fns]]));\n })\n .catch((e) => {\n console.warn('Failed to update function map for', inst.id, e);\n });\n };\n const devRefresh = (topic: string) => {\n if (!done) {return;}\n const cid = Number(topic.split('/')[0]);\n const inst = newClientIdMap.get(cid);\n if (inst === undefined) {return;}\n lynxClient.getDevices(inst.id)\n .then((devs) => {\n setDeviceMap((p) => new Map([...p, [inst.id, devs]]));\n })\n .catch((e) => {\n console.warn('Failed to update device map for', inst.id, e);\n });\n };\n setSubs(newTopics);\n\n bind(/[0-9]+\\/evt\\/functionx\\/updated/, fnRefresh);\n bind(/[0-9]+\\/evt\\/devicex\\/updated/, devRefresh);\n return () => {\n unbind(fnRefresh);\n unbind(devRefresh);\n };\n }, [installations, lynxClient, bind, unbind, setSubs]);\n\n return {\n installationMap,\n functionMap,\n deviceMap,\n mqtt,\n toClientId,\n toInstallationId\n } as MultiLiveInstallation;\n};\n","import { useCallback, useState } from 'react';\n\nimport type { EmptyDevicex, Metadata } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nexport interface DeviceTemplate {\n type?: string\n meta?: Metadata\n protected_meta?: Metadata\n}\n\nexport const useNewDevice = (installationId: number | string, template?: DeviceTemplate) => {\n const id = typeof installationId === 'string' ? Number.parseInt(installationId) : installationId;\n if (isNaN(id)) {\n throw new Error('invalid installationId');\n }\n const { lynxClient } = useGlobalLynxClient();\n const [newDevice, setNewDevice] = useState<EmptyDevicex>({\n meta: {},\n protected_meta: {},\n type: '', ...template, installation_id: id\n });\n\n const setType = useCallback((t: string) => {\n setNewDevice({ ...newDevice, type: t });\n }, [newDevice, setNewDevice]);\n\n const create = useCallback(() => {\n return lynxClient.createDevice(newDevice);\n }, [lynxClient, newDevice]);\n\n return {\n newDevice,\n setNewDevice,\n create,\n setType,\n };\n};\n","import { useCallback, useState } from 'react';\n\nimport type { EmptyFunctionx, Metadata } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nexport interface FunctionTemplate {\n type?: string\n meta?: Metadata\n protected_meta?: Metadata\n}\n\nexport const useNewFunction = (installationId: number | string, template?: FunctionTemplate) => {\n const id = typeof installationId === 'string' ? Number.parseInt(installationId) : installationId;\n if (isNaN(id)) {\n throw new Error('invalid installationId');\n }\n const { lynxClient } = useGlobalLynxClient();\n const [newFunction, setNewFunction] = useState<EmptyFunctionx>({\n meta: {},\n protected_meta: {},\n type: '', ...template, installation_id: id\n });\n\n const setType = useCallback((t: string) => {\n setNewFunction({ ...newFunction, type: t });\n }, [newFunction, setNewFunction]);\n\n const create = useCallback(() => {\n return lynxClient.createFunction(newFunction);\n }, [lynxClient, newFunction]);\n\n return {\n newFunction,\n setNewFunction,\n create,\n setType,\n };\n};\n","import { useCallback, useState } from 'react';\n\nimport type { EmptyInstallation, Metadata } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\n\nexport interface InstallationTemplate {\n name?: string\n notes?: string\n meta?: Metadata\n protected_meta?: Metadata\n}\n\nexport const useNewInstallation = (organizationId: number | string, template?: InstallationTemplate) => {\n const oid = typeof organizationId === 'string' ? Number.parseInt(organizationId) : organizationId;\n if (isNaN(oid)) {\n throw new Error('invalid organizationId');\n }\n const [newInstallation, setNewInstallation] = useState<EmptyInstallation>({\n name: '', notes: '', users: [],\n meta: {},\n protected_meta: {},\n ...template, organization_id: oid\n });\n const { lynxClient } = useGlobalLynxClient();\n\n const create = useCallback(() => {\n return lynxClient.createInstallation(newInstallation);\n }, [lynxClient, newInstallation]);\n\n return {\n newInstallation,\n setNewInstallation,\n create,\n };\n};","import { useCallback, useState } from 'react';\n\nimport type { EmptyNotificationMessage } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\n\nconst zeroEmptyNotificationMessage = {\n installation_id: 0,\n name: '',\n text: '',\n};\n\nexport interface NotificationMessageTemplate {\n installation_id?: number;\n name?: string;\n text?: string;\n}\n\nexport const useNewNotificationMessage = (installationId: number | string, template?: NotificationMessageTemplate) => {\n const iid = typeof installationId === 'string' ? Number.parseInt(installationId) : installationId;\n const { lynxClient } = useGlobalLynxClient();\n const [newNotificationMessage, setNewNotificationMessage] = useState<EmptyNotificationMessage>({\n ...zeroEmptyNotificationMessage,\n ...template,\n installation_id: iid,\n });\n\n const create = useCallback(() => {\n return lynxClient.createNotificationMessage(newNotificationMessage);\n }, [lynxClient, newNotificationMessage]);\n\n return {\n newNotificationMessage,\n setNewNotificationMessage,\n create\n };\n};","import { useCallback, useState } from 'react';\n\nimport type { EmptyNotificationOutput } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nconst zeroEmptyNotificationOutput = {\n installation_id: 0,\n name: '',\n notification_message_id: 0,\n notification_output_executor_id: 0,\n config: {},\n};\n\nexport interface NotificationOutputTemplate {\n installation_id?: number;\n name?: string;\n notification_message_id?: number;\n notification_output_executor_id?: number;\n config?: { [key: string]: string };\n}\n\nexport const useNewNotificationOutput = (installationId: number | string, template?: NotificationOutputTemplate) => {\n const iid = typeof installationId === 'string' ? Number.parseInt(installationId) : installationId;\n const { lynxClient } = useGlobalLynxClient();\n const [newNotificationOutput, setNewNotificationOutput] = useState<EmptyNotificationOutput>({\n ...zeroEmptyNotificationOutput,\n ...template,\n installation_id: iid,\n });\n\n const create = useCallback(() => {\n return lynxClient.createNotificationOutput(newNotificationOutput);\n }, [lynxClient, newNotificationOutput]);\n\n\n return {\n newNotificationOutput,\n setNewNotificationOutput,\n create,\n };\n};","import { useCallback, useState } from 'react';\n\nimport { type EmptyOAuth2Client, zero } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nexport interface OAuth2ClientTemplate {\n name?: string\n trusted?: boolean\n allowed_scopes?: string[]\n icon_uri?: string\n tos_uri?: string\n policy_uri?: string\n redirect_uris?: string[]\n id_token_alg?: string\n}\n\nexport const useNewOAuth2Client = (template?: OAuth2ClientTemplate) => {\n const { lynxClient } = useGlobalLynxClient();\n const [client, setClient] = useState<EmptyOAuth2Client>({\n ...zero.getEmptyOAuth2Client(),\n ...template,\n });\n\n const setName = useCallback((name: string) => {\n setClient({ ...client, name });\n }, [client]);\n\n const setScope = useCallback((scopes: string[]) => {\n setClient({ ...client, allowed_scopes: scopes });\n }, [client]);\n\n const setIconURI = useCallback((uri: string) => {\n setClient({ ...client, icon_uri: uri });\n }, [client]);\n\n const setTosURI = useCallback((uri: string) => {\n setClient({ ...client, tos_uri: uri });\n }, [client]);\n\n const setPolicyURI = useCallback((uri: string) => {\n setClient({ ...client, policy_uri: uri });\n }, [client]);\n\n const setRedirectURIs = useCallback((uris: string[]) => {\n setClient({ ...client, redirect_uris: uris });\n }, [client]);\n\n const create = useCallback(() => {\n return lynxClient.createOAuth2Client(client);\n }, [lynxClient, client]);\n\n return {\n newClient: client,\n create,\n setName,\n setScope,\n setIconURI,\n setTosURI,\n setPolicyURI,\n setRedirectURIs,\n setClient,\n };\n};\n","import { useCallback, useState } from 'react';\n\nimport type { Address, EmptyOrganization, Metadata, OrganizationChild } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nexport interface OrganizationTemplate {\n address?: Address\n children?: OrganizationChild[]\n email?: string\n force_sms_login?: boolean\n phone?: string\n name?: string\n notes?: string\n password_valid_days?: number\n meta?: Metadata\n protected_meta?: Metadata\n}\nconst zeroEmptyOrganization = {\n address: {\n address: '',\n city: '',\n country: '',\n zip: '',\n },\n children: [],\n email: '',\n force_sms_login: false,\n meta: {},\n name: '',\n notes: '',\n parent: 0,\n password_valid_days: 0,\n phone: '',\n protected_meta: {},\n};\nexport const useNewOrganization = (parentId: number | string, template?: OrganizationTemplate) => {\n const pid = typeof parentId === 'string' ? Number.parseInt(parentId) : parentId;\n if (isNaN(pid)) {\n throw new Error('invalid parentId');\n }\n const { lynxClient } = useGlobalLynxClient();\n const [newOrganization, setNewOrganization] = useState<EmptyOrganization>({\n ...zeroEmptyOrganization,\n ...template, parent: pid\n });\n\n const create = useCallback(() => {\n return lynxClient.createOrganization(newOrganization);\n }, [lynxClient, newOrganization]);\n\n return {\n newOrganization,\n setNewOrganization,\n create,\n };\n};","import { useCallback, useState } from 'react';\n\nimport type { Address, EmptyUser } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nconst zeroEmptyUser = {\n address: {\n address: '',\n zip: '',\n city: '',\n country: ''\n },\n assigned_installations: [],\n email: '',\n expire_at: 0,\n first_name: '',\n last_name: '',\n mobile: '',\n note: '',\n organisations: [],\n password: '',\n role: 0,\n sms_login: false,\n protected_meta: {},\n meta: {},\n};\n\nexport interface UserTemplate {\n email?: string\n password?: string\n first_name?: string\n last_name?: string\n role?: number\n sms_login?: boolean\n mobile?: string\n note?: string\n organisations?: number[]\n assigned_installations?: number[]\n address?: Address\n expire_at?: number\n meta?: {[key: string]: unknown},\n protected_meta?: {[key: string]: unknown}\n}\n\nexport const useNewUser = (template?: UserTemplate) => {\n const [newUser, setNewUser] = useState<EmptyUser>({\n ...zeroEmptyUser,\n ...template\n });\n const { lynxClient } = useGlobalLynxClient();\n\n const create = useCallback(() => {\n return lynxClient.createUser(newUser);\n }, [lynxClient, newUser]);\n\n return {\n newUser, setNewUser,\n create,\n\n };\n};\n","import { useCallback, useEffect, useState } from 'react';\n\nimport type { ErrorResponse, NotificationMessage } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nconst zeroNotificationMessage= {\n id: 0,\n installation_id: 0,\n name: '',\n text: ''\n};\n\nexport const useNotificationMessage = (installationId: number | string, notificationId: number | string) => {\n const iid = typeof installationId === 'string' ? Number.parseInt(installationId) : installationId;\n const id = typeof notificationId === 'string' ? Number.parseInt(notificationId) : notificationId;\n if (isNaN(iid)) {\n throw new Error('invalid installationId');\n }\n if (isNaN(id)) {\n throw new Error('invalid messageId');\n }\n const { lynxClient } = useGlobalLynxClient();\n const [loading, setLoading] = useState(true);\n const [message, setMessage] = useState<NotificationMessage>({\n ...zeroNotificationMessage,\n });\n const [error, setError] = useState<ErrorResponse | undefined>();\n const refresh = useCallback(() => {\n if (iid === 0 || id === 0) {return;}\n setLoading(true);\n lynxClient.getNotificationMessage(iid, id).then(res => {\n setError((err) => err !== undefined ? undefined : err);\n setMessage(res);\n }).catch(e => {\n setError(e as ErrorResponse);\n }).finally(() => {\n setLoading(false);\n });\n }, [id, iid, lynxClient]);\n\n const update = useCallback(() => {\n if (error !== undefined) {setError(undefined);}\n lynxClient.updateNotificationMessage(message).then(res => {\n setMessage(res);\n }).catch(e => {\n setError(e as ErrorResponse);\n });\n }, [error, lynxClient, message]);\n\n const remove = useCallback(() => {\n lynxClient.deleteNotificationMessage(message).then(() => {\n setMessage({ ...zeroNotificationMessage });\n }).catch(e => {\n setError(e as ErrorResponse);\n });\n }, [lynxClient, message]);\n\n useEffect(() => {\n refresh();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return {\n refresh,\n message,\n setMessage,\n error,\n loading,\n remove,\n update\n };\n};\n","import { useCallback, useEffect, useState } from 'react';\n\nimport type { ErrorResponse, NotificationMessage } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nexport const useNotificationMessages = (installationId: number | string) => {\n const iid = typeof installationId === 'string' ? Number.parseInt(installationId) : installationId;\n if (isNaN(iid)) {\n throw new Error('invalid installationId');\n }\n const { lynxClient } = useGlobalLynxClient();\n const [notificationMessages, setNotificationMessages] = useState<NotificationMessage[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<ErrorResponse | undefined>();\n const refresh = useCallback(() => {\n lynxClient.getNotificationMessages(iid).then(res => {\n setError((err) => err !== undefined ? undefined : err);\n setNotificationMessages(res);\n }).catch(e => {\n setError(e as ErrorResponse);\n }).finally(() => {\n setLoading(false);\n });\n }, [iid, lynxClient]);\n\n useEffect(() => {\n refresh();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return {\n refresh,\n notificationMessages,\n error,\n loading,\n };\n};\n","import { useCallback, useEffect, useState } from 'react';\n\nimport type { ErrorResponse, NotificationOutput } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nconst zeroNotificationOutput = {\n id: 0,\n installation_id: 0,\n name: '',\n notification_message_id: 0,\n notification_output_executor_id: 0,\n config: {},\n};\n\nexport const useNotificationOutput = (installationId: number | string, notificationId: number | string) => {\n const iid = typeof installationId === 'string' ? Number.parseInt(installationId) : installationId;\n const id = typeof notificationId === 'string' ? Number.parseInt(notificationId) : notificationId;\n if (isNaN(iid)) {\n throw new Error('invalid installationId');\n }\n if (isNaN(id)) {\n throw new Error('invalid notificationId');\n }\n const { lynxClient } = useGlobalLynxClient();\n const [loading, setLoading] = useState(true);\n const [output, setOutput] = useState<NotificationOutput>({\n ...zeroNotificationOutput,\n config: { ...zeroNotificationOutput.config }\n });\n const [error, setError] = useState<ErrorResponse | undefined>();\n const refresh = useCallback(() => {\n if (iid === 0 || id === 0) {return;}\n setLoading(true);\n lynxClient.getNotificationOutput(iid, id).then(res => {\n setError((err) => err !== undefined ? undefined : err);\n setOutput(res);\n }).catch(e => {\n setError(e as ErrorResponse);\n }).finally(() => {\n setLoading(false);\n });\n }, [id, iid, lynxClient]);\n\n const update = useCallback(() => {\n if (error !== undefined) {setError(undefined);}\n lynxClient.updateNotificationOutput(output).then(res => {\n setOutput(res);\n }).catch(e => {\n setError(e as ErrorResponse);\n });\n }, [error, lynxClient, output]);\n\n const remove = useCallback(() => {\n lynxClient.deleteNotificationOutput(output).then(() => {\n setOutput({ ...zeroNotificationOutput });\n }).catch(e => {\n setError(e as ErrorResponse);\n });\n }, [lynxClient, output]);\n\n useEffect(() => {\n refresh();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return {\n refresh,\n output,\n setOutput,\n error,\n loading,\n remove,\n update\n };\n};\n","import { useCallback, useEffect, useState } from 'react';\n\nimport type { ErrorResponse, NotificationOutputExecutor } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\n\nconst zeroExecutor = {\n id: 0,\n type: '',\n name: '',\n organization_id: 0,\n config: {},\n secret: ''\n};\n\nexport const useNotificationOutputExecutor = (installationId: number | string, executorId: number | string) => {\n const iid = typeof installationId === 'string' ? Number.parseInt(installationId) : installationId;\n const id = typeof executorId === 'string' ? Number.parseInt(executorId) : executorId;\n if (isNaN(iid)) {\n throw new Error('invalid installationId');\n }\n if (isNaN(id)) {\n throw new Error('invalid messageId');\n }\n const { lynxClient } = useGlobalLynxClient();\n const [loading, setLoading] = useState(true);\n const [outputExecutor, setOutputExecutor] = useState<NotificationOutputExecutor>({\n ...zeroExecutor,\n });\n const [error, setError] = useState<ErrorResponse | undefined>();\n const refresh = useCallback(() => {\n if (iid === 0 || id === 0) {return;}\n setLoading(true);\n lynxClient.getNotificationOutputExecutor(iid, id).then(res => {\n setError((err) => err !== undefined ? undefined : err);\n setOutputExecutor(res);\n }).catch(e => {\n setError(e as ErrorResponse);\n }).finally(() => {\n setLoading(false);\n });\n }, [id, iid, lynxClient]);\n\n useEffect(() => {\n refresh();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return {\n refresh,\n outputExecutor,\n setOutputExecutor,\n error,\n loading,\n };\n};\n","import { useCallback, useEffect, useState } from 'react';\n\nimport type { ErrorResponse, NotificationOutputExecutor } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nexport const useNotificationOutputExecutors = (installationId: number | string) => {\n const iid = typeof installationId === 'string' ? Number.parseInt(installationId) : installationId;\n if (isNaN(iid)) {\n throw new Error('invalid installationId');\n }\n const { lynxClient } = useGlobalLynxClient();\n const [notificationExecutors, setNotificationExecutors] = useState<NotificationOutputExecutor[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<ErrorResponse | undefined>();\n const refresh = useCallback(() => {\n lynxClient.getNotificationOutputExecutors(iid).then(res => {\n setError((err) => err !== undefined ? undefined : err);\n setNotificationExecutors(res);\n }).catch(e => {\n setError(e as ErrorResponse);\n }).finally(() => {\n setLoading(false);\n });\n }, [iid, lynxClient]);\n\n useEffect(() => {\n refresh();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return {\n refresh,\n notificationExecutors,\n error,\n loading,\n };\n};\n","import { useCallback, useEffect, useState } from 'react';\n\nimport type { ErrorResponse, NotificationOutput } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nexport const useNotificationOutputs = (installationId: number | string) => {\n const iid = typeof installationId === 'string' ? Number.parseInt(installationId) : installationId;\n if (isNaN(iid)) {\n throw new Error('invalid installationId');\n }\n const { lynxClient } = useGlobalLynxClient();\n const [notificationOutputs, setNotificationOutputs] = useState<NotificationOutput[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<ErrorResponse | undefined>();\n const refresh = useCallback(() => {\n lynxClient.getNotificationOutputs(iid).then(res => {\n setError((err) => err !== undefined ? undefined : err);\n setNotificationOutputs(res);\n }).catch(e => {\n setError(e as ErrorResponse);\n }).finally(() => {\n setLoading(false);\n });\n }, [iid, lynxClient]);\n\n useEffect(() => {\n refresh();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return {\n refresh,\n notificationOutputs,\n error,\n loading,\n };\n};\n","import { useCallback, useEffect, useState } from 'react';\n\nimport { type ErrorResponse, type OAuth2Client, zero } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nexport const useOAuth2Client = (id: string) => {\n const { lynxClient } = useGlobalLynxClient();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<ErrorResponse | undefined>();\n const [client, setClient] = useState<OAuth2Client>({ ...zero.getOAuth2Client() });\n const refresh = useCallback(() => {\n if (!loading) {setLoading(true);}\n lynxClient.getOAuth2Client(id).then(fetchedClient => {\n setError((err) => err !== undefined ? undefined : err);\n setClient(fetchedClient);\n }).catch(e => {\n setError(e as ErrorResponse);\n }).finally(() => {\n setLoading(false);\n });\n }, [loading, lynxClient, id]);\n\n useEffect(() => {\n refresh();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [id]);\n\n const remove = useCallback(() => {\n return lynxClient.deleteOAuth2Client(client);\n }, [client, lynxClient]);\n\n const update = useCallback(() => {\n return lynxClient.updateOAuth2Client(client);\n }, [client, lynxClient]);\n\n return {\n refresh,\n client,\n setClient,\n error,\n loading,\n remove,\n update,\n };\n};\n","import { useCallback, useEffect, useState } from 'react';\n\nimport type { ErrorResponse, OAuth2Client } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nexport const useOAuth2Clients = () => {\n const { lynxClient } = useGlobalLynxClient();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<ErrorResponse | undefined>();\n const [clients, setClients] = useState<OAuth2Client[]>([]);\n const refresh = useCallback(() => {\n lynxClient.getOAuth2Clients().then(fetchedClients => {\n setError((err) => err !== undefined ? undefined : err);\n setClients(fetchedClients);\n }).catch(e => {\n setError(e as ErrorResponse);\n }).finally(() => {\n setLoading(false);\n });\n }, [lynxClient]);\n\n useEffect(() => {\n refresh();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return {\n refresh,\n clients,\n error,\n loading\n };\n};\n","import { useCallback, useEffect, useState } from 'react';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nimport { useOAuth2Client } from './useOAuth2Client';\n\nexport const useOAuth2Consent = () => {\n const { lynxClient } = useGlobalLynxClient();\n const [requestedScopes, setRequestedScopes] = useState<string[]>([]);\n const [params] = useState(new URLSearchParams(window.location.search));\n const clientId = params.get('client_id') ?? '';\n const { client } = useOAuth2Client(clientId);\n\n const consent = useCallback((scope: string[]) => {\n const consentObject = Object.fromEntries(params);\n\n consentObject['scope'] = scope.join(' ');\n return lynxClient.consentOAuth2Authorization(consentObject);\n }, [lynxClient, params]);\n\n useEffect(() => {\n void Promise.resolve().then(() => setRequestedScopes(params.get('scope')?.split(' ') ?? []));\n }, [params]);\n\n return {\n consent,\n client,\n requestedScopes\n };\n};\n","import { useCallback, useEffect, useState } from 'react';\n\nimport type { Organization } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nconst zeroOrganization = {\n address: {\n address: '',\n city: '',\n country: '',\n zip: '',\n },\n children: [],\n email: '',\n force_sms_login: false,\n meta: {},\n name: '',\n notes: '',\n parent: 0,\n password_valid_days: 0,\n phone: '',\n protected_meta: {},\n id: 0\n};\nexport const useOrganization = (organizationId: number | string) => {\n const oid = typeof organizationId === 'string' ? Number.parseInt(organizationId) : organizationId;\n if (isNaN(oid)) {\n throw new Error('invalid organizationId');\n }\n const [organization, setOrganization] = useState<Organization>({ ...zeroOrganization });\n const [loading, setLoading] = useState<boolean>(true);\n const [error, setError] = useState<Error | undefined>();\n const { lynxClient } = useGlobalLynxClient();\n\n const refresh = useCallback(() => {\n setLoading(true);\n lynxClient.getOrganization(oid).then(org => {\n setError((err) => err !== undefined ? undefined : err);\n setOrganization(org);\n }).catch(e => {\n setError(e as Error);\n }).finally(() => {\n setLoading(false);\n });\n }, [lynxClient, oid]);\n\n useEffect(() => {\n refresh();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const update = useCallback(() => {\n return lynxClient.updateOrganization(organization);\n }, [lynxClient, organization]);\n\n const remove = useCallback(() => {\n return lynxClient.deleteOrganization(organization);\n }, [lynxClient, organization]);\n\n return {\n loading,\n organization,\n setOrganization,\n error,\n update,\n remove,\n refresh\n };\n};\n","import { useCallback, useEffect, useState } from 'react';\n\nimport type { ErrorResponse, MinimalOrg, Organization } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nexport const useOrganizations = <T extends boolean = false>(minimal?: T) => {\n const { lynxClient } = useGlobalLynxClient();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<ErrorResponse | undefined>();\n const [organizations, setOrganizations] = useState<MinimalOrg<T>[]>([]);\n\n const refresh = useCallback(() => {\n setLoading(true);\n lynxClient.getOrganizations(minimal === true).then(orgs => {\n setError((err) => err !== undefined ? undefined : err);\n setOrganizations(<MinimalOrg<T>[]>orgs);\n }).catch(e => {\n setError(e as ErrorResponse);\n }).finally(() => {\n setLoading(false);\n });\n }, [lynxClient, minimal]);\n\n useEffect(() => {\n refresh();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const create = useCallback((org: Organization) => {\n return lynxClient.createOrganization(org);\n }, [lynxClient]);\n\n const remove = useCallback((org: Organization) => {\n return lynxClient.deleteOrganization(org);\n }, [lynxClient]);\n\n return {\n loading,\n organizations,\n setOrganizations,\n error,\n create,\n remove,\n };\n};\n","import { useCallback, useEffect, useState } from 'react';\n\nimport type { Role } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nexport const useRoles = () => {\n const { lynxClient } = useGlobalLynxClient();\n const [roles, setRoles] = useState<Role[]>([]);\n const [error, setError] = useState<Error | undefined>();\n const [loading, setLoading] = useState(true);\n\n const refresh = useCallback(() => {\n setLoading(true);\n lynxClient.getRoles().then((fetchedRoles) => {\n setError((err) => err !== undefined ? undefined : err);\n setRoles(fetchedRoles);\n }).catch((e) => {\n setError(e as Error);\n }).finally(() => {\n setLoading(false);\n });\n }, [lynxClient]);\n\n useEffect(() => {\n refresh();\n /* eslint-disable react-hooks/exhaustive-deps */\n }, []);\n\n return {\n loading,\n error,\n roles,\n refresh\n };\n};\n","import { useCallback, useLayoutEffect, useState } from 'react';\n\nimport type { EmptyToken, ErrorResponse, Token } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nexport const useTokens = () => {\n const { lynxClient } = useGlobalLynxClient();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<ErrorResponse | undefined>();\n const [tokens, setTokens] = useState<Token[]>([]);\n\n const refresh = useCallback(() => {\n setLoading(true);\n lynxClient.getTokens().then((fetchedTokens) => {\n setError((err) => err !== undefined ? undefined : err);\n setTokens(fetchedTokens);\n }).catch((e) => {\n setError(e as ErrorResponse);\n }).finally(() => {\n setLoading(false);\n });\n }, [lynxClient]);\n\n const remove = useCallback((token: Token) => {\n return lynxClient.deleteToken(token);\n }, [lynxClient]);\n\n const create = useCallback((token: EmptyToken) => {\n return lynxClient.createToken(token);\n }, [lynxClient]);\n\n useLayoutEffect(() => {\n void Promise.resolve().then(refresh);\n }, [refresh]);\n\n return {\n tokens,\n remove,\n create,\n refresh,\n loading,\n error\n };\n};\n","import { useCallback, useState } from 'react';\n\nimport type { User } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\nconst zeroUser = {\n id: 0,\n address: {\n address: '',\n zip: '',\n city: '',\n country: ''\n },\n assigned_installations: [],\n email: '',\n expire_at: 0,\n first_name: '',\n last_name: '',\n mobile: '',\n note: '',\n organisations: [],\n password: '',\n role: 0,\n sms_login: false,\n protected_meta: {},\n meta: {},\n};\n\nexport const useUser = (userId: number | string) => {\n const id = typeof userId === 'string' ? Number.parseInt(userId) : userId;\n if (isNaN(id)) {\n throw new Error('invalid userId');\n }\n const [user, setUser] = useState<User>({ ...zeroUser });\n const [loading, setLoading] = useState<boolean>(true);\n const { lynxClient } = useGlobalLynxClient();\n const [error, setError] = useState<Error | undefined>();\n\n const refresh = useCallback(() => {\n setLoading(true);\n lynxClient.getUser(id).then((fetchedUser) => {\n setError((err) => err !== undefined ? undefined : err);\n setUser(fetchedUser);\n }).catch(e => {\n setError(e as Error);\n }).finally(() => {\n setLoading(false);\n });\n }, [lynxClient, id]);\n\n const update = useCallback(() => {\n return lynxClient.updateUser(user);\n }, [lynxClient, user]);\n\n const remove = useCallback(() => {\n return lynxClient.deleteUser(user);\n }, [lynxClient, user]);\n\n return {\n loading,\n error,\n user,\n setUser,\n update,\n refresh,\n remove,\n };\n};\n","import { useCallback, useState } from 'react';\n\nimport type { Metadata, User } from '@iotopen/node-lynx';\n\nimport { useGlobalLynxClient } from '../Contexts';\n\n\n// TODO: implement organization filter\nexport const useUsers = (filter?: Metadata) => {\n const [users, setUsers] = useState<User[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | undefined>();\n const { lynxClient } = useGlobalLynxClient();\n\n const refresh = useCallback(() => {\n setLoading(true);\n lynxClient.getUsers(filter).then((fetchedUsers) => {\n setError((err) => err !== undefined ? undefined : err);\n setUsers(fetchedUsers);\n }).catch((e) => {\n setError(e as Error);\n }).finally(() => {\n setLoading(false);\n });\n }, [lynxClient, filter]);\n\n return {\n users,\n setUsers,\n refresh,\n loading,\n error\n };\n};\n"],"names":["defaultLynxClientContext","LynxClient","_url","_apiKey","_bearer","LynxClientContext","createContext","LynxClientProvider","children","url","apiKey","bearer","client","setClient","useState","newClient","useCallback","newUrl","newApiKey","newBearer","contextValue","useMemo","useGlobalLynxClient","useContext","defaultUserContext","UserContext","UserProvider","user","setUser","permissions","setPermissions","loading","setLoading","error","setError","lynxClient","useLayoutEffect","me","perms","u","p","err","e","useGlobalUser","useGlobalPermissions","LynxProvider","apiURL","jsx","usePermissionsCheckAll","currentPermissions","permission","usePermissionsCheckAny","useConfiguredEdgeApps","installationId","id","apps","setApps","refresh","fetchedApps","zeroDevice","useDevice","deviceId","iid","dev","setDev","fn","update","setType","t","remove","useDeviceMeta","devId","create","key","meta","overrideDevId","silent","createMissing","useDevices","filter","devices","setDevices","refreshCall","res","removeFn","devs","last","rest","settled","createFn","args","zeroEdgeApp","useEdgeApp","appId","app","setApp","fetchedApp","useEdgeApps","useEdgeAppVersions","untagged","versions","setVersions","fetchedVersions","nameVersion","name","hash","zeroFunction","useFunction","functionId","func","setFunc","useFunctionMeta","fnId","funId","useFunctions","functions","setFunctions","fns","f","useIDTokenAlgorithms","algs","setAlgs","useEffect","zeroInstallation","useInstallation","installation","setInstallation","inst","useInstallationInfo","assignedOnly","installations","setInstallations","useInstallations","assertError","usePahoMQTTClient","uri","handlers","connectionOptions","clientId","uuid","useRef","Paho","opts","callbacks","reconnectTimer","connected","setConnected","c","rct","o","cbs","reconnect","host","sub","topic","qos","resolve","pub","payload","retained","sendPayload","unsub","isEq","a","b","i","unsubscribe","subs","subscribe","useSimpleMQTT","username","password","bindings","exactBindings","onMessage","msg","tmp","cb","binds","options","s","bind","binder","re","unbind","newBinds","bindExact","unbindExact","useMQTT","baseURLObj","protocol","hostname","port","wsURL","useLiveInstallation","mqtt","fnRefresh","devRefresh","setSubs","useLiveInstallationId","useMeta","obj","deps","metaList","setMetaList","newList","value","compile","add","idx","_","x","setKey","setValue","setProtected","useMultiLiveInstallation","clientIdMap","setClientIdMap","installationMap","setInstallationMap","functionMap","setFunctionMap","deviceMap","setDeviceMap","toClientId","toInstallationId","newInstallationMap","newClientIdMap","newTopics","done","fnFetchers","devFetchers","newDeviceMap","newFunctionMap","reject","fnDone","devDone","fnsResult","result","devsResult","cid","useNewDevice","template","newDevice","setNewDevice","useNewFunction","newFunction","setNewFunction","useNewInstallation","organizationId","oid","newInstallation","setNewInstallation","zeroEmptyNotificationMessage","useNewNotificationMessage","newNotificationMessage","setNewNotificationMessage","zeroEmptyNotificationOutput","useNewNotificationOutput","newNotificationOutput","setNewNotificationOutput","useNewOAuth2Client","zero","setName","setScope","scopes","setIconURI","setTosURI","setPolicyURI","setRedirectURIs","uris","zeroEmptyOrganization","useNewOrganization","parentId","pid","newOrganization","setNewOrganization","zeroEmptyUser","useNewUser","newUser","setNewUser","zeroNotificationMessage","useNotificationMessage","notificationId","message","setMessage","useNotificationMessages","notificationMessages","setNotificationMessages","zeroNotificationOutput","useNotificationOutput","output","setOutput","zeroExecutor","useNotificationOutputExecutor","executorId","outputExecutor","setOutputExecutor","useNotificationOutputExecutors","notificationExecutors","setNotificationExecutors","useNotificationOutputs","notificationOutputs","setNotificationOutputs","useOAuth2Client","fetchedClient","useOAuth2Clients","clients","setClients","fetchedClients","useOAuth2Consent","requestedScopes","setRequestedScopes","params","consent","scope","consentObject","zeroOrganization","useOrganization","organization","setOrganization","org","useOrganizations","minimal","organizations","setOrganizations","orgs","useRoles","roles","setRoles","fetchedRoles","useTokens","tokens","setTokens","fetchedTokens","token","zeroUser","useUser","userId","fetchedUser","useUsers","users","setUsers","fetchedUsers"],"mappings":"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"}