Added error, loading modal and popover components
• Added: - error, loading modal components - error, loading popover components • Removed: - ModalLoading from async_components • Updated: - ModalRoot to use new components
This commit is contained in:
parent
7ea07d4a2b
commit
87f85131b7
@ -1,51 +0,0 @@
|
|||||||
import { defineMessages, injectIntl } from 'react-intl';
|
|
||||||
import Button from './button';
|
|
||||||
|
|
||||||
const messages = defineMessages({
|
|
||||||
error: { id: 'bundle_modal_error.message', defaultMessage: 'Something went wrong while loading this component.' },
|
|
||||||
retry: { id: 'bundle_modal_error.retry', defaultMessage: 'Try again' },
|
|
||||||
close: { id: 'bundle_modal_error.close', defaultMessage: 'Close' },
|
|
||||||
});
|
|
||||||
|
|
||||||
export default
|
|
||||||
@injectIntl
|
|
||||||
class BundleModalError extends PureComponent {
|
|
||||||
|
|
||||||
static propTypes = {
|
|
||||||
onRetry: PropTypes.func.isRequired,
|
|
||||||
onClose: PropTypes.func.isRequired,
|
|
||||||
intl: PropTypes.object.isRequired,
|
|
||||||
}
|
|
||||||
|
|
||||||
handleRetry = () => {
|
|
||||||
this.props.onRetry();
|
|
||||||
}
|
|
||||||
|
|
||||||
render () {
|
|
||||||
const { onClose, intl: { formatMessage } } = this.props;
|
|
||||||
|
|
||||||
// Keep the markup in sync with <ModalLoading />
|
|
||||||
// (make sure they have the same dimensions)
|
|
||||||
return (
|
|
||||||
<div className='modal-root__modal error-modal'>
|
|
||||||
<div className='error-modal__body'>
|
|
||||||
<Button title={formatMessage(messages.retry)} icon='refresh' onClick={this.handleRetry} size={64} />
|
|
||||||
{formatMessage(messages.error)}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className='error-modal__footer'>
|
|
||||||
<div>
|
|
||||||
<button
|
|
||||||
onClick={onClose}
|
|
||||||
className='error-modal__nav onboarding-modal__skip'
|
|
||||||
>
|
|
||||||
{formatMessage(messages.close)}
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -0,0 +1,39 @@
|
|||||||
|
import { defineMessages, injectIntl } from 'react-intl'
|
||||||
|
import ConfirmationModal from './confirmation_modal'
|
||||||
|
|
||||||
|
const messages = defineMessages({
|
||||||
|
error: { id: 'bundle_modal_error.message', defaultMessage: 'Something went wrong while loading this component.' },
|
||||||
|
retry: { id: 'bundle_modal_error.retry', defaultMessage: 'Try again' },
|
||||||
|
title: { id: 'bundle_modal_error.error', defaultMessage: 'Error' },
|
||||||
|
})
|
||||||
|
|
||||||
|
export default
|
||||||
|
@injectIntl
|
||||||
|
class BundleErrorModal extends PureComponent {
|
||||||
|
|
||||||
|
static propTypes = {
|
||||||
|
onRetry: PropTypes.func.isRequired,
|
||||||
|
onClose: PropTypes.func.isRequired,
|
||||||
|
intl: PropTypes.object.isRequired,
|
||||||
|
}
|
||||||
|
|
||||||
|
handleRetry = () => {
|
||||||
|
this.props.onRetry()
|
||||||
|
}
|
||||||
|
|
||||||
|
render () {
|
||||||
|
const { onClose, intl } = this.props
|
||||||
|
|
||||||
|
return (
|
||||||
|
<ConfirmationModal
|
||||||
|
title={intl.formatMessage(messages.title)}
|
||||||
|
message={intl.formatMessage(messages.error)}
|
||||||
|
confirm={intl.formatMessage(messages.retry)}
|
||||||
|
onConfirm={this.handleRetry}
|
||||||
|
onClose={onClose}
|
||||||
|
/>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
22
app/javascript/gabsocial/components/modal/loading_modal.js
Normal file
22
app/javascript/gabsocial/components/modal/loading_modal.js
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
import Block from '../block'
|
||||||
|
import ColumnIndicator from '../column_indicator'
|
||||||
|
|
||||||
|
export default class LoadingModal extends PureComponent {
|
||||||
|
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<div className={_s.width330PX}>
|
||||||
|
<Block>
|
||||||
|
<div className={[_s.default, _s.px15, _s.py15, _s.mt15, _s.mb15].join(' ')}>
|
||||||
|
<div className={[_s.default, _s.px15, _s.py15, _s.mt15, _s.mb15, _s.alignItemsCenter, _s.justifyContentCenter].join(' ')}>
|
||||||
|
|
||||||
|
<ColumnIndicator type='loading' />
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Block>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,20 +0,0 @@
|
|||||||
import ColumnIndicator from '../column_indicator';
|
|
||||||
|
|
||||||
// Keep the markup in sync with <BundleModalError />
|
|
||||||
// (make sure they have the same dimensions)
|
|
||||||
export default class ModalLoading extends PureComponent {
|
|
||||||
render() {
|
|
||||||
return (
|
|
||||||
<div className='modal-root__modal error-modal'>
|
|
||||||
<div className='error-modal__body'>
|
|
||||||
<ColumnIndicator type='loading' />
|
|
||||||
</div>
|
|
||||||
<div className='error-modal__footer'>
|
|
||||||
<div>
|
|
||||||
<button className='error-modal__nav onboarding-modal__skip' />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,9 +1,9 @@
|
|||||||
import { Fragment } from 'react'
|
|
||||||
import { closeModal } from '../../actions/modal'
|
import { closeModal } from '../../actions/modal'
|
||||||
import { cancelReplyCompose } from '../../actions/compose'
|
import { cancelReplyCompose } from '../../actions/compose'
|
||||||
import Bundle from '../../features/ui/util/bundle'
|
import Bundle from '../../features/ui/util/bundle'
|
||||||
import ModalBase from './modal_base'
|
import ModalBase from './modal_base'
|
||||||
import BundleModalError from '../bundle_modal_error'
|
import BundleErrorModal from './bundle_error_modal'
|
||||||
|
import LoadingModal from './loading_modal'
|
||||||
import {
|
import {
|
||||||
MODAL_BLOCK_ACCOUNT,
|
MODAL_BLOCK_ACCOUNT,
|
||||||
MODAL_BOOST,
|
MODAL_BOOST,
|
||||||
@ -152,11 +152,11 @@ class ModalRoot extends PureComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
renderLoading = () => {
|
renderLoading = () => {
|
||||||
return null
|
return <LoadingModal />
|
||||||
}
|
}
|
||||||
|
|
||||||
renderError = () => {
|
renderError = () => {
|
||||||
return <BundleModalError {...this.props} onClose={this.onClickClose} />
|
return <BundleErrorModal {...this.props} onClose={this.onClickClose} />
|
||||||
}
|
}
|
||||||
|
|
||||||
onClickClose = () => {
|
onClickClose = () => {
|
||||||
@ -179,7 +179,7 @@ class ModalRoot extends PureComponent {
|
|||||||
fetchComponent={MODAL_COMPONENTS[type]}
|
fetchComponent={MODAL_COMPONENTS[type]}
|
||||||
loading={this.renderLoading}
|
loading={this.renderLoading}
|
||||||
error={this.renderError}
|
error={this.renderError}
|
||||||
renderDelay={200}
|
renderDelay={150}
|
||||||
>
|
>
|
||||||
{
|
{
|
||||||
(Component) => <Component {...props} onClose={this.onClickClose} />
|
(Component) => <Component {...props} onClose={this.onClickClose} />
|
||||||
|
22
app/javascript/gabsocial/components/popover/error_popover.js
Normal file
22
app/javascript/gabsocial/components/popover/error_popover.js
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
import Block from '../block'
|
||||||
|
import ColumnIndicator from '../column_indicator'
|
||||||
|
|
||||||
|
export default class ErrorPopover extends PureComponent {
|
||||||
|
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<div className={_s.width250PX}>
|
||||||
|
<Block>
|
||||||
|
<div className={[_s.default, _s.px15, _s.py15, _s.mt15, _s.mb15].join(' ')}>
|
||||||
|
<div className={[_s.default, _s.px15, _s.py15, _s.mt15, _s.mb15, _s.alignItemsCenter, _s.justifyContentCenter].join(' ')}>
|
||||||
|
|
||||||
|
<ColumnIndicator type='error' message='Error loading popover' />
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Block>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
import Block from '../block'
|
||||||
|
import ColumnIndicator from '../column_indicator'
|
||||||
|
|
||||||
|
export default class LoadingPopover extends PureComponent {
|
||||||
|
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<div className={_s.width250PX}>
|
||||||
|
<Block>
|
||||||
|
<div className={[_s.default, _s.px15, _s.py15, _s.mt15, _s.mb15].join(' ')}>
|
||||||
|
<div className={[_s.default, _s.px15, _s.py15, _s.mt15, _s.mb15, _s.alignItemsCenter, _s.justifyContentCenter].join(' ')}>
|
||||||
|
|
||||||
|
<ColumnIndicator type='loading' />
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Block>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -35,6 +35,8 @@ import { getWindowDimension } from '../../utils/is_mobile'
|
|||||||
import Bundle from '../../features/ui/util/bundle'
|
import Bundle from '../../features/ui/util/bundle'
|
||||||
import ModalBase from '../modal/modal_base'
|
import ModalBase from '../modal/modal_base'
|
||||||
import PopoverBase from './popover_base'
|
import PopoverBase from './popover_base'
|
||||||
|
import ErrorPopover from './error_popover'
|
||||||
|
import LoadingPopover from './loading_popover'
|
||||||
|
|
||||||
const initialState = getWindowDimension()
|
const initialState = getWindowDimension()
|
||||||
|
|
||||||
@ -102,8 +104,12 @@ class PopoverRoot extends PureComponent {
|
|||||||
this.setState({ width })
|
this.setState({ width })
|
||||||
}
|
}
|
||||||
|
|
||||||
renderEmpty = () => {
|
renderLoading = () => {
|
||||||
return <div />
|
return <LoadingPopover />
|
||||||
|
}
|
||||||
|
|
||||||
|
renderError = () => {
|
||||||
|
return <ErrorPopover />
|
||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
@ -130,9 +136,9 @@ class PopoverRoot extends PureComponent {
|
|||||||
visible &&
|
visible &&
|
||||||
<Bundle
|
<Bundle
|
||||||
fetchComponent={POPOVER_COMPONENTS[type]}
|
fetchComponent={POPOVER_COMPONENTS[type]}
|
||||||
loading={this.renderEmpty}
|
loading={this.renderLoading}
|
||||||
error={this.renderEmpty}
|
error={this.renderError}
|
||||||
renderDelay={200}
|
renderDelay={150}
|
||||||
>
|
>
|
||||||
{
|
{
|
||||||
(Component) => <Component isXS={isXS} {...props} />
|
(Component) => <Component isXS={isXS} {...props} />
|
||||||
|
@ -54,7 +54,6 @@ export function ListTimeline() { return import(/* webpackChunkName: "features/li
|
|||||||
export function ListTimelineSettingsModal() { return import(/* webpackChunkName: "components/list_timeline_settings_modal" */'../../../components/modal/list_timeline_settings_modal') }
|
export function ListTimelineSettingsModal() { return import(/* webpackChunkName: "components/list_timeline_settings_modal" */'../../../components/modal/list_timeline_settings_modal') }
|
||||||
export function MediaGallery() { return import(/* webpackChunkName: "components/media_gallery" */'../../../components/media_gallery') }
|
export function MediaGallery() { return import(/* webpackChunkName: "components/media_gallery" */'../../../components/media_gallery') }
|
||||||
export function MediaModal() { return import(/* webpackChunkName: "components/media_modal" */'../../../components/modal/media_modal') }
|
export function MediaModal() { return import(/* webpackChunkName: "components/media_modal" */'../../../components/modal/media_modal') }
|
||||||
export function ModalLoading() { return import(/* webpackChunkName: "components/modal_loading" */'../../../components/modal/modal_loading') }
|
|
||||||
export function Mutes() { return import(/* webpackChunkName: "features/mutes" */'../../mutes') }
|
export function Mutes() { return import(/* webpackChunkName: "features/mutes" */'../../mutes') }
|
||||||
export function MuteModal() { return import(/* webpackChunkName: "modals/mute_modal" */'../../../components/modal/mute_modal') }
|
export function MuteModal() { return import(/* webpackChunkName: "modals/mute_modal" */'../../../components/modal/mute_modal') }
|
||||||
export function NavSettingsPopover() { return import(/* webpackChunkName: "modals/nav_settings_popover" */'../../../components/popover/nav_settings_popover') }
|
export function NavSettingsPopover() { return import(/* webpackChunkName: "modals/nav_settings_popover" */'../../../components/popover/nav_settings_popover') }
|
||||||
|
Loading…
x
Reference in New Issue
Block a user