devtools/chrome-extension/src/extension/devpanel.tsx (44 lines of code) (raw):
import React, { useEffect, useState } from 'react'
import ReactDOM from 'react-dom'
import App from '../app'
const backgroundPageConnection = chrome.runtime.connect({
name: '@formily-devtools-panel-script',
})
backgroundPageConnection.postMessage({
name: 'init',
tabId: chrome.devtools.inspectedWindow.tabId,
})
chrome.devtools.inspectedWindow.eval(
'window.__FORMILY_DEV_TOOLS_HOOK__.openDevtools()'
)
const Devtools = () => {
const [state, setState] = useState([])
useEffect(() => {
let store = {}
const update = () => {
setState(
Object.keys(store).map((key) => {
return store[key]
})
)
}
chrome.devtools.inspectedWindow.eval(
'window.__FORMILY_DEV_TOOLS_HOOK__.update()'
)
backgroundPageConnection.onMessage.addListener(({ type, id, graph }) => {
if (type === 'init') {
store = {}
chrome.devtools.inspectedWindow.eval(
'window.__FORMILY_DEV_TOOLS_HOOK__.openDevtools()'
)
} else if (type !== 'uninstall') {
store[id] = JSON.parse(graph)
} else {
delete store[id]
}
update()
})
}, [])
return <App dataSource={state} />
}
ReactDOM.render(<Devtools />, document.getElementById('root'))