1 | import React, { useRef } from 'react'
|
2 | import { observer, useComponentId, useBind, useLocal, useDidUpdate } from 'startupjs'
|
3 | import { ScrollView, StyleSheet } from 'react-native'
|
4 | import propTypes from 'prop-types'
|
5 | import DrawerLayout from 'react-native-drawer-layout-polyfill'
|
6 | import config from '../../config/rootConfig'
|
7 | import './index.styl'
|
8 |
|
9 | function DrawerSidebar ({
|
10 | style,
|
11 | forceClosed,
|
12 | defaultOpen,
|
13 | backgroundColor,
|
14 | children,
|
15 | path,
|
16 | $open,
|
17 | position,
|
18 | width,
|
19 | renderContent,
|
20 | ...props
|
21 | }) {
|
22 | if (path) {
|
23 | console.warn('[@startupjs/ui] Sidebar: path is DEPRECATED, use $open instead.')
|
24 | }
|
25 |
|
26 | if (/^#|rgb/.test(backgroundColor)) {
|
27 | console.warn('[@startupjs/ui] Sidebar:: Hex color for backgroundColor property is deprecated. Use style instead')
|
28 | }
|
29 |
|
30 | const componentId = useComponentId()
|
31 | if (!$open) {
|
32 | [, $open] = useLocal(path || `_session.DrawerSidebar.${componentId}`)
|
33 | }
|
34 |
|
35 | ;({ backgroundColor = config.colors.white, ...style } = StyleSheet.flatten([
|
36 | { backgroundColor: config.colors[backgroundColor] || backgroundColor },
|
37 | style
|
38 | ]))
|
39 |
|
40 | let open
|
41 | let onChange
|
42 | ;({ open, onChange } = useBind({
|
43 | $open,
|
44 | open,
|
45 | onChange,
|
46 | default: defaultOpen
|
47 | }))
|
48 |
|
49 | let drawerExtraProps = {}
|
50 | if (forceClosed) {
|
51 | drawerExtraProps.drawerLockMode = 'locked-closed'
|
52 | }
|
53 |
|
54 | let drawerRef = useRef()
|
55 |
|
56 | useDidUpdate(() => {
|
57 | let drawer = drawerRef.current
|
58 | if (!drawer) return
|
59 | if (forceClosed && !open) return
|
60 | if (open && !forceClosed) {
|
61 | drawer.openDrawer()
|
62 | } else {
|
63 | drawer.closeDrawer()
|
64 | }
|
65 | }, [!!forceClosed, !!open])
|
66 |
|
67 | const _renderContent = () => {
|
68 | return pug`
|
69 | ScrollView(contentContainerStyle={flex: 1})
|
70 | = renderContent && renderContent()
|
71 | `
|
72 | }
|
73 | return pug`
|
74 | DrawerLayout.root(
|
75 | style=style
|
76 | drawerPosition=position
|
77 | drawerWidth=width
|
78 | drawerBackgroundColor=backgroundColor
|
79 | ref=drawerRef
|
80 | renderNavigationView=_renderContent
|
81 | onDrawerClose=() => onChange(false)
|
82 | onDrawerOpen=() => onChange(true)
|
83 | ...props
|
84 | ...drawerExtraProps
|
85 | )= children
|
86 | `
|
87 | }
|
88 |
|
89 | DrawerSidebar.defaultProps = {
|
90 | defaultOpen: false,
|
91 | forceClosed: false,
|
92 | position: 'left',
|
93 | width: 264
|
94 | }
|
95 |
|
96 | DrawerSidebar.propTypes = {
|
97 | style: propTypes.oneOfType([propTypes.object, propTypes.array]),
|
98 | children: propTypes.node,
|
99 | $open: propTypes.object,
|
100 | defaultOpen: propTypes.bool,
|
101 | forceClosed: propTypes.bool,
|
102 | position: propTypes.oneOf(Object.values(DrawerLayout.positions)),
|
103 | width: propTypes.number,
|
104 | renderContent: propTypes.func
|
105 | }
|
106 |
|
107 | export default observer(DrawerSidebar)
|