feat: add hook that detects if the bee-dashboard is run within bee-desktop (#334)
* feat: add hook that detects if the bee-dashboard is run withing bee-desktop * chore: make the URL configurable * feat: remove error and instead return false * test: add testing with mockserver
This commit is contained in:
Generated
+436
-176
File diff suppressed because it is too large
Load Diff
@@ -64,6 +64,9 @@
|
|||||||
"@commitlint/config-conventional": "14.1.0",
|
"@commitlint/config-conventional": "14.1.0",
|
||||||
"@testing-library/jest-dom": "5.15.0",
|
"@testing-library/jest-dom": "5.15.0",
|
||||||
"@testing-library/react": "12.1.2",
|
"@testing-library/react": "12.1.2",
|
||||||
|
"@testing-library/react-hooks": "^8.0.0",
|
||||||
|
"@types/cors": "^2.8.12",
|
||||||
|
"@types/express": "^4.17.13",
|
||||||
"@types/file-saver": "2.0.4",
|
"@types/file-saver": "2.0.4",
|
||||||
"@types/jest": "27.0.2",
|
"@types/jest": "27.0.2",
|
||||||
"@types/qrcode.react": "1.0.2",
|
"@types/qrcode.react": "1.0.2",
|
||||||
@@ -80,6 +83,7 @@
|
|||||||
"babel-loader": "8.1.0",
|
"babel-loader": "8.1.0",
|
||||||
"babel-plugin-syntax-dynamic-import": "6.18.0",
|
"babel-plugin-syntax-dynamic-import": "6.18.0",
|
||||||
"babel-plugin-tsconfig-paths": "1.0.2",
|
"babel-plugin-tsconfig-paths": "1.0.2",
|
||||||
|
"cors": "^2.8.5",
|
||||||
"depcheck": "^1.4.3",
|
"depcheck": "^1.4.3",
|
||||||
"eslint": "7.24.0",
|
"eslint": "7.24.0",
|
||||||
"eslint-config-prettier": "8.2.0",
|
"eslint-config-prettier": "8.2.0",
|
||||||
@@ -92,6 +96,7 @@
|
|||||||
"eslint-plugin-react": "7.23.2",
|
"eslint-plugin-react": "7.23.2",
|
||||||
"eslint-plugin-react-hooks": "4.2.0",
|
"eslint-plugin-react-hooks": "4.2.0",
|
||||||
"eslint-plugin-testing-library": "3.10.2",
|
"eslint-plugin-testing-library": "3.10.2",
|
||||||
|
"express": "^4.17.3",
|
||||||
"file-loader": "6.2.0",
|
"file-loader": "6.2.0",
|
||||||
"prettier": "2.4.1",
|
"prettier": "2.4.1",
|
||||||
"react-scripts": "4.0.3",
|
"react-scripts": "4.0.3",
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ class Config {
|
|||||||
public readonly BEE_DOCS_HOST: string
|
public readonly BEE_DOCS_HOST: string
|
||||||
public readonly BEE_DISCORD_HOST: string
|
public readonly BEE_DISCORD_HOST: string
|
||||||
public readonly GITHUB_REPO_URL: string
|
public readonly GITHUB_REPO_URL: string
|
||||||
|
public readonly BEE_DESKTOP_URL: string
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
this.BEE_API_HOST =
|
this.BEE_API_HOST =
|
||||||
@@ -21,6 +22,7 @@ class Config {
|
|||||||
this.BEE_DISCORD_HOST = getProcessEnv('REACT_APP_BEE_DISCORD_HOST') || 'https://discord.gg/eKr9XPv7'
|
this.BEE_DISCORD_HOST = getProcessEnv('REACT_APP_BEE_DISCORD_HOST') || 'https://discord.gg/eKr9XPv7'
|
||||||
this.GITHUB_REPO_URL =
|
this.GITHUB_REPO_URL =
|
||||||
getProcessEnv('REACT_APP_BEE_GITHUB_REPO_URL') || 'https://api.github.com/repos/ethersphere/bee'
|
getProcessEnv('REACT_APP_BEE_GITHUB_REPO_URL') || 'https://api.github.com/repos/ethersphere/bee'
|
||||||
|
this.BEE_DESKTOP_URL = getProcessEnv('REACT_APP_BEE_DESKTOP_URL') || window.location.origin
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,73 @@
|
|||||||
|
import { renderHook } from '@testing-library/react-hooks'
|
||||||
|
import express from 'express'
|
||||||
|
import cors from 'cors'
|
||||||
|
import type { Server } from 'http'
|
||||||
|
import { useIsBeeDesktop } from './apiHooks'
|
||||||
|
|
||||||
|
interface AddressInfo {
|
||||||
|
address: string
|
||||||
|
family: string
|
||||||
|
port: number
|
||||||
|
}
|
||||||
|
|
||||||
|
export function mockServer(data: Record<string | number | symbol, string>): Promise<Server> {
|
||||||
|
const app = express()
|
||||||
|
app.use(cors())
|
||||||
|
|
||||||
|
app.get('/info', (req, res) => {
|
||||||
|
res.send(data)
|
||||||
|
})
|
||||||
|
|
||||||
|
return new Promise(resolve => {
|
||||||
|
const server = app.listen(() => {
|
||||||
|
resolve(server)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
let serverCorrect: Server
|
||||||
|
let serverWrong: Server
|
||||||
|
|
||||||
|
let serverCorrectURL: string
|
||||||
|
let serverWrongURL: string
|
||||||
|
|
||||||
|
beforeAll(async () => {
|
||||||
|
serverCorrect = await mockServer({ name: 'bee-desktop' })
|
||||||
|
const portServerCorrect = (serverCorrect.address() as AddressInfo).port
|
||||||
|
serverCorrectURL = `http://localhost:${portServerCorrect}`
|
||||||
|
|
||||||
|
serverWrong = await mockServer({ foo: 'bar' })
|
||||||
|
const portServerWrong = (serverWrong.address() as AddressInfo).port
|
||||||
|
serverWrongURL = `http://localhost:${portServerWrong}`
|
||||||
|
})
|
||||||
|
|
||||||
|
afterAll(async () => {
|
||||||
|
await new Promise(resolve => serverCorrect.close(resolve))
|
||||||
|
await new Promise(resolve => serverWrong.close(resolve))
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('useIsBeeDesktop', () => {
|
||||||
|
it('should fail when connected to wrong server', async () => {
|
||||||
|
const { result, waitFor } = renderHook(() => useIsBeeDesktop({ BEE_DESKTOP_URL: serverWrongURL }))
|
||||||
|
|
||||||
|
expect(result.current.isLoading).toBe(true)
|
||||||
|
expect(result.current.isBeeDesktop).toBe(false)
|
||||||
|
|
||||||
|
await waitFor(() => {
|
||||||
|
expect(result.current.isLoading).toBe(false)
|
||||||
|
})
|
||||||
|
expect(result.current.isBeeDesktop).toBe(false)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should return isBeeDesktop true when connected to bee-desktop', async () => {
|
||||||
|
const { result, waitFor } = renderHook(() => useIsBeeDesktop({ BEE_DESKTOP_URL: serverCorrectURL }))
|
||||||
|
|
||||||
|
expect(result.current.isLoading).toBe(true)
|
||||||
|
expect(result.current.isBeeDesktop).toBe(false)
|
||||||
|
|
||||||
|
await waitFor(() => {
|
||||||
|
expect(result.current.isLoading).toBe(false)
|
||||||
|
})
|
||||||
|
expect(result.current.isBeeDesktop).toBe(true)
|
||||||
|
})
|
||||||
|
})
|
||||||
@@ -8,6 +8,42 @@ export interface LatestBeeReleaseHook {
|
|||||||
error: Error | null
|
error: Error | null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface IsBeeDesktopHook {
|
||||||
|
isBeeDesktop: boolean
|
||||||
|
isLoading: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Config {
|
||||||
|
BEE_DESKTOP_URL: string
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detect if the dashboard is run within bee-desktop
|
||||||
|
*
|
||||||
|
* @returns isBeeDesktop true if this is run within bee-desktop
|
||||||
|
*/
|
||||||
|
export const useIsBeeDesktop = (conf: Config = config): IsBeeDesktopHook => {
|
||||||
|
const [isBeeDesktop, setIsBeeDesktop] = useState<boolean>(false)
|
||||||
|
const [isLoading, setLoading] = useState<boolean>(true)
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
axios
|
||||||
|
.get(`${conf.BEE_DESKTOP_URL}/info`)
|
||||||
|
.then(res => {
|
||||||
|
if (res.data?.name === 'bee-desktop') setIsBeeDesktop(true)
|
||||||
|
else setIsBeeDesktop(false)
|
||||||
|
})
|
||||||
|
.catch(() => {
|
||||||
|
setIsBeeDesktop(false)
|
||||||
|
})
|
||||||
|
.finally(() => {
|
||||||
|
setLoading(false)
|
||||||
|
})
|
||||||
|
}, [conf])
|
||||||
|
|
||||||
|
return { isBeeDesktop, isLoading }
|
||||||
|
}
|
||||||
|
|
||||||
export const useLatestBeeRelease = (): LatestBeeReleaseHook => {
|
export const useLatestBeeRelease = (): LatestBeeReleaseHook => {
|
||||||
const [latestBeeRelease, setLatestBeeRelease] = useState<LatestBeeRelease | null>(null)
|
const [latestBeeRelease, setLatestBeeRelease] = useState<LatestBeeRelease | null>(null)
|
||||||
const [isLoadingLatestBeeRelease, setLoading] = useState<boolean>(false)
|
const [isLoadingLatestBeeRelease, setLoading] = useState<boolean>(false)
|
||||||
|
|||||||
Reference in New Issue
Block a user