Skip to content
This repository was archived by the owner on Jun 20, 2022. It is now read-only.

Commit eef5b6e

Browse files
authored
feat(Modal): add persistent option to modal (#48)
1 parent 4cbeee0 commit eef5b6e

File tree

6 files changed

+111
-21
lines changed

6 files changed

+111
-21
lines changed

config/rollup.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,5 +79,9 @@ export const getRollupConfig = ({ pkg, pwd, buildName }) => {
7979
],
8080
})
8181

82+
if (process.env.WATCH_MODE) {
83+
return [esConfig]
84+
}
85+
8286
return [esConfig, cjsConfig, umdConfig, minConfig]
8387
}

docs/components/Modal.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,27 @@
1+
import React from 'react'
12
import { ModalDialog } from '@smooth-ui/core-sc'
23

34
export const ModalDialogExample = ModalDialog.extend`
45
left: auto;
56
margin-right: auto;
67
margin-left: auto;
78
`
9+
10+
export class Counter extends React.Component {
11+
state = { count: 0 }
12+
13+
componentDidMount() {
14+
this.interval = setInterval(
15+
() => this.setState(({ count }) => ({ count: count + 1 })),
16+
1000,
17+
)
18+
}
19+
20+
componentWillUnmount() {
21+
clearInterval(this.interval)
22+
}
23+
24+
render() {
25+
return this.state.count
26+
}
27+
}

docs/components/Modal.mdx

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import {
1616
Button,
1717
Toggler,
1818
} from '@smooth-ui/core-sc'
19-
import { ModalDialogExample } from './Modal'
19+
import { ModalDialogExample, Counter } from './Modal'
2020

2121
# Modal
2222

@@ -157,6 +157,54 @@ When modals become too long for the user’s viewport or device, they scroll ind
157157
</Toggler>
158158
</Playground>
159159

160+
## Persistent
161+
162+
Set `persistent` to `true` to keep the modal mounted even if closed.
163+
164+
<Playground>
165+
<BlockList>
166+
<Toggler>
167+
{({ toggled, onToggle }) => (
168+
<div>
169+
<Button variant="primary" onClick={() => onToggle(true)}>
170+
Open non-persistent
171+
</Button>
172+
<Modal persistent={false} opened={toggled} onClose={() => onToggle(false)}>
173+
<ModalDialog>
174+
<ModalContent>
175+
<ModalBody>
176+
Counter is resetted each time you open it <br />
177+
<Counter />
178+
</ModalBody>
179+
</ModalContent>
180+
</ModalDialog>
181+
</Modal>
182+
</div>
183+
)}
184+
</Toggler>
185+
<Toggler>
186+
{({ toggled, onToggle }) => (
187+
<div>
188+
<Button variant="primary" onClick={() => onToggle(true)}>
189+
Open persistent modal (default)
190+
</Button>
191+
<Modal opened={toggled} onClose={() => onToggle(false)}>
192+
<ModalDialog>
193+
<ModalContent>
194+
<ModalBody>
195+
Counter continue in background <br />
196+
<Counter />
197+
</ModalBody>
198+
</ModalContent>
199+
</ModalDialog>
200+
</Modal>
201+
</div>
202+
)}
203+
</Toggler>
204+
</BlockList>
205+
</Playground>
206+
207+
160208
## API
161209

162210
### Modal
@@ -166,6 +214,7 @@ When modals become too long for the user’s viewport or device, they scroll ind
166214
children: PropDesc.node,
167215
onClose: PropDesc.func,
168216
opened: PropDesc.bool,
217+
persistent: PropDesc.bool.defaultTo(true).desc('Set "persistent" to `true` to keep modal mounted when closed'),
169218
...getSystemPropDesc(Modal),
170219
})}
171220
/>

docs/utils/PropDesc.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ const createType = typeDesc => {
88
},
99
defaultTo: {
1010
get() {
11-
return value => createType({ ...typeDesc, defaultValue: { value } })
11+
return value =>
12+
createType({ ...typeDesc, defaultValue: { value: String(value) } })
1213
},
1314
},
1415
desc: {

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
"scripts": {
77
"build": "lerna run build",
88
"build:docs": "yarn build && docz build && cp _redirects .docz/dist",
9+
"build:watch": "WATCH_MODE=true lerna run --parallel build -- --watch",
910
"ci": "yarn lint && yarn test && yarn build && bundlesize",
1011
"dev": "docz dev",
1112
"lint": "eslint .",

packages/shared/core/Modal.js

Lines changed: 34 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ class ModalComponent extends React.Component {
5454
opened,
5555
onClose,
5656
children,
57+
persistent,
5758
...props
5859
} = this.props
5960
if (!this.container) return null
@@ -62,25 +63,35 @@ class ModalComponent extends React.Component {
6263
timeout={theme ? theme.modalTransitionDuration : 300}
6364
in={this.props.opened}
6465
>
65-
{transitionState => (
66-
<div
67-
role="dialog"
68-
tabIndex="-1"
69-
className={classNames(
70-
'sui-modal',
71-
{
72-
'sui-modal-opened': opened || transitionState === 'exiting',
73-
[`sui-modal-transition-${transitionState}`]: transitionState,
74-
},
75-
className,
76-
)}
77-
ref={baseRef}
78-
{...props}
79-
>
80-
<div className="sui-modal-backdrop" onClick={onClose} />
81-
{children}
82-
</div>
83-
)}
66+
{transitionState => {
67+
const visible =
68+
opened ||
69+
transitionState === 'entered' ||
70+
transitionState === 'exiting' ||
71+
transitionState === 'entering'
72+
const mounted = persistent || visible
73+
return (
74+
<div
75+
role="dialog"
76+
tabIndex="-1"
77+
className={classNames(
78+
'sui-modal',
79+
{
80+
'sui-modal-opened': visible,
81+
[`sui-modal-transition-${transitionState}`]: transitionState,
82+
},
83+
className,
84+
)}
85+
ref={baseRef}
86+
{...props}
87+
>
88+
{mounted && (
89+
<div className="sui-modal-backdrop" onClick={onClose} />
90+
)}
91+
{mounted && children}
92+
</div>
93+
)
94+
}}
8495
</Transition>,
8596
this.container,
8697
)
@@ -141,8 +152,12 @@ const Modal = createComponent(() => ({
141152
propTypes: {
142153
children: PropTypes.node,
143154
opened: PropTypes.bool,
155+
persistent: PropTypes.bool,
144156
onClose: PropTypes.func,
145157
},
158+
defaultProps: {
159+
persistent: true,
160+
},
146161
}))
147162

148163
export default Modal

0 commit comments

Comments
 (0)