diff --git a/frontend/src/components/dialog/confirm-unlink-device.js b/frontend/src/components/dialog/confirm-unlink-device.js new file mode 100644 index 0000000000..c38e52a4f2 --- /dev/null +++ b/frontend/src/components/dialog/confirm-unlink-device.js @@ -0,0 +1,59 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import { Modal, ModalHeader, ModalBody, ModalFooter, Button, FormGroup, Label, Input } from 'reactstrap'; +import { gettext } from '../../utils/constants'; + +const propTypes = { + executeOperation: PropTypes.func.isRequired, + toggleDialog: PropTypes.func.isRequired +}; + +class ConfirmUnlinkDevice extends Component { + + constructor(props) { + super(props); + this.state = { + isChecked: false + }; + } + + toggle = () => { + this.props.toggleDialog(); + } + + executeOperation = () => { + this.toggle(); + this.props.executeOperation(this.state.isChecked); + } + + onInputChange = (e) => { + this.setState({ + isChecked: e.target.checked + }); + } + + render() { + return ( + + {gettext('Unlink device')} + +

{gettext('Are you sure you want to unlink this device?')}

+ + + +
+ + + + +
+ ); + } +} + +ConfirmUnlinkDevice.propTypes = propTypes; + +export default ConfirmUnlinkDevice; diff --git a/frontend/src/pages/linked-devices/linked-devices.js b/frontend/src/pages/linked-devices/linked-devices.js index 524ea01faa..70f3654809 100644 --- a/frontend/src/pages/linked-devices/linked-devices.js +++ b/frontend/src/pages/linked-devices/linked-devices.js @@ -5,6 +5,7 @@ import { seafileAPI } from '../../utils/seafile-api'; import { gettext } from '../../utils/constants'; import toaster from '../../components/toast'; import EmptyTip from '../../components/empty-tip'; +import ConfirmUnlinkDeviceDialog from '../../components/dialog/confirm-unlink-device'; import { Utils } from '../../utils/utils'; class Content extends Component { @@ -65,8 +66,9 @@ class Item extends Component { super(props); this.state = { isOpMenuOpen: false, // for mobile - showOpIcon: false, - unlinked: false + isOpIconShown: false, + unlinked: false, + isConfirmUnlinkDialogOpen: false }; } @@ -78,13 +80,19 @@ class Item extends Component { handleMouseOver = () => { this.setState({ - showOpIcon: true + isOpIconShown: true }); } handleMouseOut = () => { this.setState({ - showOpIcon: false + isOpIconShown: false + }); + } + + toggleDialog = () => { + this.setState({ + isConfirmUnlinkDialogOpen: !this.state.isConfirmUnlinkDialogOpen }); } @@ -92,14 +100,23 @@ class Item extends Component { e.preventDefault(); const data = this.props.data; + if (data.is_desktop_client) { + this.toggleDialog(); + } else { + const wipeDevice = true; + this.unlinkDevice(wipeDevice); + } + } - seafileAPI.unlinkDevice(data.platform, data.device_id).then((res) => { + unlinkDevice = (wipeDevice) => { + const data = this.props.data; + seafileAPI.unlinkDevice(data.platform, data.device_id, wipeDevice).then((res) => { this.setState({ unlinked: true }); - let msg_s = gettext('Successfully unlinked %(name)s.'); - msg_s = msg_s.replace('%(name)s', data.device_name); - toaster.success(msg_s); + let msg = gettext('Successfully unlinked %(name)s.'); + msg = msg.replace('%(name)s', data.device_name); + toaster.success(msg); }).catch((error) => { let errMessage = Utils.getErrorMsg(error); toaster.danger(errMessage); @@ -114,7 +131,7 @@ class Item extends Component { const data = this.props.data; let opClasses = 'sf2-icon-delete unlink-device action-icon'; - opClasses += this.state.showOpIcon ? '' : ' invisible'; + opClasses += this.state.isOpIconShown ? '' : ' invisible'; const desktopItem = ( @@ -156,7 +173,17 @@ class Item extends Component { ); - return this.props.isDesktop ? desktopItem : mobileItem; + return ( + + {this.props.isDesktop ? desktopItem : mobileItem} + {this.state.isConfirmUnlinkDialogOpen && + + } + + ); } }