diff --git a/packages/react-dom/index.js b/packages/react-dom/index.js
new file mode 100644
index 0000000..8681d19
--- /dev/null
+++ b/packages/react-dom/index.js
@@ -0,0 +1,5 @@
+import preact from 'preact'
+
+export default {
+ render: preact.render,
+}
diff --git a/packages/react/index.js b/packages/react/index.js
new file mode 100644
index 0000000..003a8d1
--- /dev/null
+++ b/packages/react/index.js
@@ -0,0 +1,31 @@
+import preact from 'preact'
+/** @jsx preact.h */
+
+function shallowEqual(a, b) {
+ if (a === b) return true
+ if (typeof a === 'object' && typeof a === typeof b) {
+ if (a === null || b === null) return false
+ for (const key in a) {
+ if (a[key] !== b[key]) return false
+ }
+ for (const key in b) {
+ if (!Object.prototype.hasOwnProperty.call(a, key)) return false
+ }
+ return true
+ }
+ return false
+}
+
+class PureComponent extends preact.Component {
+ shouldComponentUpdate(nextProps, nextState) {
+ return !shallowEqual(this.props, nextProps) || !shallowEqual(this.state, nextState)
+ }
+}
+
+const React = {
+ ...preact,
+ PureComponent,
+ createElement: preact.h,
+}
+
+export default React
diff --git a/src/components/FileExplorer.js b/src/components/FileExplorer.js
index dc1b32f..499547b 100644
--- a/src/components/FileExplorer.js
+++ b/src/components/FileExplorer.js
@@ -1,5 +1,4 @@
-import preact from 'preact'
-/** @jsx preact.h */
+import React from 'react'
import SearchBar from './SearchBar'
import Node from './Node'
@@ -9,18 +8,18 @@ import treeParser from '../utils/treeParser'
import URLHelper from '../utils/URLHelper'
import VisibleNodesGenerator from '../utils/VisibleNodesGenerator'
-export default class List extends preact.Component {
- state = {
- // generated by this.visibleNodesGenerator
- visibleNodes: null,
- }
-
- props = {
+export default class List extends React.Component {
+ static defaultProps = {
treeData: null,
metaData: null,
freeze: false,
}
+ state = {
+ // generated by this.visibleNodesGenerator
+ visibleNodes: null,
+ }
+
tasksAfterRender = []
visibleNodesGenerator = new VisibleNodesGenerator()
diff --git a/src/components/Icon.js b/src/components/Icon.js
index ca64f43..2673590 100644
--- a/src/components/Icon.js
+++ b/src/components/Icon.js
@@ -1,5 +1,4 @@
-import preact from 'preact'
-/** @jsx preact.h */
+import React from 'react'
import Grabber from '../assets/icons/octicons/grabber.svg?svgr'
import Octoface from '../assets/icons/octicons/octoface.svg?svgr'
@@ -71,7 +70,7 @@ function getSVGIconComponent(type) {
export default function Icon({ type, className, ...otherProps }) {
return (
- {preact.h(getSVGIconComponent(type), { width: '100%', height: '100%' })}
+ {React.createElement(getSVGIconComponent(type), { width: '100%', height: '100%' })}
)
}
diff --git a/src/components/MetaBar.js b/src/components/MetaBar.js
index eee74dd..740c4d0 100644
--- a/src/components/MetaBar.js
+++ b/src/components/MetaBar.js
@@ -1,5 +1,4 @@
-import preact from 'preact'
-/** @jsx preact.h */
+import React from 'react'
export default function MetaBar({ metaData }) {
const userUrl = metaData ? metaData.api && metaData.api.owner.html_url : undefined
diff --git a/src/components/Node.js b/src/components/Node.js
index 0db724b..0395d3f 100644
--- a/src/components/Node.js
+++ b/src/components/Node.js
@@ -1,5 +1,4 @@
-import preact from 'preact'
-/** @jsx preact.h */
+import React from 'react'
import PJAX from 'pjax'
import Icon from './Icon'
@@ -17,11 +16,7 @@ function getIconType(node) {
}
}
-export default class Node extends preact.Component {
- shouldComponentUpdate(nextProps) {
- return !general.shallowEqual(this.props, nextProps)
- }
-
+export default class Node extends React.PureComponent {
onNodeClick = (...args) => {
const { node, toggleExpand } = this.props
if (node.type === 'tree') {
@@ -36,14 +31,14 @@ export default class Node extends preact.Component {
const { name, path } = node
return (
)
}
diff --git a/src/components/PJAXLink.js b/src/components/PJAXLink.js
index 79eaa0b..6d4c723 100644
--- a/src/components/PJAXLink.js
+++ b/src/components/PJAXLink.js
@@ -1,9 +1,8 @@
-import preact from 'preact'
-/** @jsx preact.h */
+import React from 'react'
import DOMHelper from '../utils/DOMHelper'
export default function PJAXLink({ to, children }) {
- return preact.cloneElement(children, {
+ return React.cloneElement(children, {
onClick: () => DOMHelper.loadWithPJAX(to),
})
}
diff --git a/src/components/Portal.js b/src/components/Portal.js
new file mode 100644
index 0000000..2ac09ea
--- /dev/null
+++ b/src/components/Portal.js
@@ -0,0 +1,3 @@
+import Portal from 'preact-portal'
+
+export default Portal
diff --git a/src/components/ResizeHandler.js b/src/components/ResizeHandler.js
index b95b5b0..4fac68d 100644
--- a/src/components/ResizeHandler.js
+++ b/src/components/ResizeHandler.js
@@ -1,9 +1,8 @@
-import preact from 'preact'
-/** @jsx preact.h */
+import React from 'react'
import Icon from './Icon'
-export default class ResizeHandler extends preact.Component {
+export default class ResizeHandler extends React.Component {
pointerDown = false
startX = 0
delta = 0
diff --git a/src/components/SearchBar.js b/src/components/SearchBar.js
index bd50951..9b8508e 100644
--- a/src/components/SearchBar.js
+++ b/src/components/SearchBar.js
@@ -1,5 +1,4 @@
-import preact from 'preact'
-/** @jsx preact.h */
+import React from 'react'
export default function SearchBar({ onSearchKeyChange }) {
return (
diff --git a/src/components/SettingsBar.js b/src/components/SettingsBar.js
index 97b4737..2cae7b8 100644
--- a/src/components/SettingsBar.js
+++ b/src/components/SettingsBar.js
@@ -1,6 +1,4 @@
-import preact from 'preact'
-/** @jsx preact.h */
-
+import React from 'react'
import Icon from './Icon'
import storageHelper from '../utils/storageHelper'
import keyHelper from '../utils/keyHelper'
@@ -39,7 +37,7 @@ function friendlyFormatShortcut(shortcut) {
}
}
-export default class SettingsBar extends preact.Component {
+export default class SettingsBar extends React.Component {
state = {
accessTokenHint: null,
accessToken: '',
diff --git a/src/components/SideBar.js b/src/components/SideBar.js
index e0ea8e0..ed561ef 100644
--- a/src/components/SideBar.js
+++ b/src/components/SideBar.js
@@ -1,13 +1,12 @@
-import preact from 'preact'
-import Portal from 'preact-portal'
+import React from 'react'
import NProgress from 'nprogress'
-/** @jsx preact.h */
import FileExplorer from './FileExplorer'
import ToggleShowButton from './ToggleShowButton'
import MetaBar from './MetaBar'
import SettingsBar from './SettingsBar'
import ResizeHandler from './ResizeHandler'
+import Portal from './Portal'
import cx from '../utils/cx'
import DOMHelper, { REPO_TYPE_PRIVATE } from '../utils/DOMHelper'
@@ -18,7 +17,7 @@ import keyHelper from '../utils/keyHelper'
// initial width of side bar
const baseSize = 260
-export default class SideBar extends preact.Component {
+export default class SideBar extends React.Component {
state = {
// current width of side bar
size: 260,
@@ -58,8 +57,8 @@ export default class SideBar extends preact.Component {
NProgress.start()
}
const treeData = await GitHubHelper.getTreeData({ ...metaData, accessToken })
- this.setState({ treeData })
this.logoContainerElement = DOMHelper.insertLogo()
+ this.setState({ treeData })
if (shouldShow) {
NProgress.done()
}
diff --git a/src/components/ToggleShowButton.js b/src/components/ToggleShowButton.js
index a38a445..8d46312 100644
--- a/src/components/ToggleShowButton.js
+++ b/src/components/ToggleShowButton.js
@@ -1,5 +1,4 @@
-import preact from 'preact'
-/** @jsx preact.h */
+import React from 'react'
import Icon from './Icon'
import cx from '../utils/cx'
diff --git a/src/content.js b/src/content.js
index ad6f38b..8fecdf4 100644
--- a/src/content.js
+++ b/src/content.js
@@ -1,5 +1,5 @@
-import preact from 'preact'
-/** @jsx preact.h */
+import React from 'react'
+import ReactDOM from 'react-dom'
import './content.less'
@@ -7,4 +7,4 @@ import SideBar from './components/SideBar'
const SideBarElement = document.createElement('div')
document.body.appendChild(SideBarElement)
-preact.render(, SideBarElement)
+ReactDOM.render(, SideBarElement)
diff --git a/src/utils/general.js b/src/utils/general.js
index 27f4b95..b1c6ea4 100644
--- a/src/utils/general.js
+++ b/src/utils/general.js
@@ -1,18 +1 @@
-function shallowEqual(a, b) {
- if (a === b) return true
- if (typeof a === 'object' && typeof a === typeof b) {
- if (a === null || b === null) return false
- for (const key in a) {
- if (a[key] !== b[key]) return false
- }
- for (const key in b) {
- if (!Object.prototype.hasOwnProperty.call(a, key)) return false
- }
- return true
- }
- return false
-}
-
-export default {
- shallowEqual,
-}
+export default {}
diff --git a/webpack.config.js b/webpack.config.js
index fb31c6f..33d2ef8 100644
--- a/webpack.config.js
+++ b/webpack.config.js
@@ -4,6 +4,7 @@ const CopyWebpackPlugin = require('copy-webpack-plugin')
const UglifyJSWebpackPlugin = require('uglifyjs-webpack-plugin')
const srcPath = path.resolve(__dirname, 'src')
+const packagesPath = path.resolve(__dirname, 'packages')
const plugins = [
new CopyWebpackPlugin([
@@ -46,9 +47,6 @@ module.exports = {
filename: '[name].js',
},
resolve: {
- alias: {
- react: 'preact', // for svgr
- },
modules: ['packages', 'node_modules']
},
module: {
@@ -59,7 +57,7 @@ module.exports = {
options: {
cacheDirectory: true,
},
- include: [srcPath],
+ include: [srcPath, packagesPath],
},
{
test: /\.less$/,