| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- /*
- Copyright (C) 2017 Cloudbase Solutions SRL
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Affero General Public License as
- published by the Free Software Foundation, either version 3 of the
- License, or (at your option) any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Affero General Public License for more details.
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
- import React from 'react'
- import { observer } from 'mobx-react'
- import styled from 'styled-components'
- import Modal from '@src/components/ui/Modal'
- import Button from '@src/components/ui/Button'
- import StatusImage from '@src/components/ui/StatusComponents/StatusImage'
- import { ThemePalette } from '@src/components/Theme'
- import KeyboardManager from '@src/utils/KeyboardManager'
- const Wrapper = styled.div<any>`
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- padding: 48px;
- `
- const Message = styled.div<any>`
- font-size: 18px;
- text-align: center;
- margin-top: 48px;
- `
- const ExtraMessage = styled.div<any>`
- color: ${ThemePalette.grayscale[4]};
- margin: 11px 0 48px 0;
- text-align: center;
- `
- const Buttons = styled.div<any>`
- display: flex;
- justify-content: ${props => (props.centered ? 'center' : 'space-between')};
- width: 100%;
- `
- type AlertType = 'error' | 'confirmation' | 'loading'
- type Props = {
- message?: string,
- extraMessage?: string,
- type?: AlertType,
- isOpen?: boolean,
- title?: string,
- onRequestClose?: () => void,
- onConfirmation?: () => void,
- }
- @observer
- class AlertModal extends React.Component<Props> {
- static defaultProps = {
- type: 'confirmation',
- }
- id: string | undefined
- componentDidMount() {
- this.id = `${new Date().getTime().toString()}-${Math.random()}`
- KeyboardManager.onEnter(`alert-${this.id}`, () => {
- if (this.props.isOpen && this.props.onConfirmation) {
- this.props.onConfirmation()
- }
- }, 2)
- }
- componentWillUnmount() {
- KeyboardManager.removeKeyDown(`alert-${this.id}`)
- }
- renderDismissButton() {
- if (this.props.type !== 'error') {
- return null
- }
- return (
- <Buttons centered>
- <Button secondary onClick={this.props.onRequestClose} data-test-id="aModal-dismissButton">Dismiss</Button>
- </Buttons>
- )
- }
- renderConfirmationButtons() {
- if (this.props.type !== 'confirmation') {
- return null
- }
- return (
- <Buttons>
- <Button secondary onClick={this.props.onRequestClose} data-test-id="aModal-noButton">No</Button>
- <Button onClick={this.props.onConfirmation} data-test-id="aModal-yesButton">Yes</Button>
- </Buttons>
- )
- }
- render() {
- const status = this.props.type === 'loading' ? 'RUNNING' : (this.props.type || 'confirmation')
- return (
- // eslint-disable-next-line react/jsx-props-no-spreading
- <Modal {...this.props} isOpen={this.props.isOpen || false}>
- <Wrapper data-test-id="alertModal">
- <StatusImage status={status} data-test-id="aModal-status" />
- {this.props.message ? <Message data-test-id="aModal-message">{this.props.message}</Message> : null}
- {this.props.extraMessage ? <ExtraMessage data-test-id="aModal-extraMessage">{this.props.extraMessage}</ExtraMessage> : null}
- {this.renderConfirmationButtons()}
- {this.renderDismissButton()}
- </Wrapper>
- </Modal>
- )
- }
- }
- export default AlertModal
|