@pubsweet/ui
Version:
React component library for use in pubsweet apps
116 lines (100 loc) • 2.32 kB
JavaScript
import React from 'react'
import styled from 'styled-components'
import { Button } from '../atoms'
import { ModalProvider, Modal, useModal, withModal } from './modal'
function HooksComponent({ hideModal }) {
const customLogic = () => {
hideModal()
}
return (
<Root>
<Title>Hooks implementation</Title>
<Buttons>
<Button onClick={hideModal}>Close</Button>
<Button onClick={customLogic}>Agree</Button>
</Buttons>
</Root>
)
}
function HigherOrderComponent({ hideModal }) {
const customLogic = () => {
hideModal()
}
return (
<Root>
<Title>HOCs implementation</Title>
<Buttons>
<Button onClick={hideModal}>Close</Button>
<Button onClick={customLogic}>Agree</Button>
</Buttons>
</Root>
)
}
function ExampleComponent({ hideModal, title }) {
const customLogic = () => {
hideModal()
}
return (
<Root>
<Title>{title}</Title>
<Buttons>
<Button onClick={hideModal}>Close</Button>
<Button onClick={customLogic}>Agree</Button>
</Buttons>
</Root>
)
}
const ModalExamples = withModal({
component: HigherOrderComponent,
})(props => {
const ctx = useModal({
component: HooksComponent,
})
return (
<div>
<h2>Using hooks</h2>
<Button onClick={ctx.showModal}>Open with hooks</Button>
<hr />
<h2>Using render props</h2>
<Modal component={ExampleComponent} title="Render props implementation">
{showModal => (
<Button onClick={showModal}>Open with render props</Button>
)}
</Modal>
<hr />
<h2>Using the higher order component</h2>
<Button onClick={props.showModal}>Open with HOCs!</Button>
</div>
)
})
const Modals = () => (
<ModalProvider>
<h2>Modal examples</h2>
<ModalExamples />
</ModalProvider>
)
export default Modals
// #region styles
const Root = styled.div`
align-items: center;
border-radius: 5px;
background-color: #fff;
display: flex;
flex-direction: column;
padding-bottom: 16px;
width: 400px;
`
const Title = styled.h2`
font-weight: 700;
`
const Buttons = styled.div`
align-items: center;
display: flex;
justify-content: space-around;
width: 100%;
button {
height: 40px;
width: 120px;
}
`
// #endregion