UNPKG

2.61 kBJavaScriptView Raw
1import React, { useRef } from 'react'
2import { observer, useComponentId, useBind, useLocal, useDidUpdate } from 'startupjs'
3import { ScrollView, StyleSheet } from 'react-native'
4import propTypes from 'prop-types'
5import DrawerLayout from 'react-native-drawer-layout-polyfill'
6import config from '../../config/rootConfig'
7import './index.styl'
8
9function 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
89DrawerSidebar.defaultProps = {
90 defaultOpen: false,
91 forceClosed: false,
92 position: 'left',
93 width: 264
94}
95
96DrawerSidebar.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
107export default observer(DrawerSidebar)