gab-social/app/javascript/gabsocial/components/popover/popover_root.js

196 lines
5.7 KiB
JavaScript
Raw Normal View History

2020-04-28 06:33:58 +01:00
import {
BREAKPOINT_EXTRA_SMALL,
POPOVER_CHAT_CONVERSATION_EXPIRATION_OPTIONS,
2020-12-03 22:13:11 +00:00
POPOVER_CHAT_CONVERSATION_OPTIONS,
2020-12-16 00:31:30 +00:00
POPOVER_CHAT_MESSAGE_OPTIONS,
POPOVER_CHAT_SETTINGS,
POPOVER_COMMENT_SORTING_OPTIONS,
2020-12-16 00:31:30 +00:00
POPOVER_COMPOSE_POST_DESTINATION,
2020-04-28 06:33:58 +01:00
POPOVER_DATE_PICKER,
POPOVER_EMOJI_PICKER,
POPOVER_GROUP_LIST_SORT_OPTIONS,
POPOVER_GROUP_MEMBER_OPTIONS,
2020-05-07 06:55:24 +01:00
POPOVER_GROUP_OPTIONS,
POPOVER_GROUP_TIMELINE_SORT_OPTIONS,
POPOVER_GROUP_TIMELINE_SORT_TOP_OPTIONS,
2020-05-15 04:17:31 +01:00
POPOVER_NAV_SETTINGS,
2020-04-28 06:33:58 +01:00
POPOVER_PROFILE_OPTIONS,
POPOVER_SIDEBAR_MORE,
POPOVER_STATUS_OPTIONS,
POPOVER_STATUS_EXPIRATION_OPTIONS,
POPOVER_SHARE,
2020-04-28 06:33:58 +01:00
POPOVER_STATUS_VISIBILITY,
POPOVER_TIMELINE_INJECTION_OPTIONS,
2020-04-28 06:33:58 +01:00
POPOVER_USER_INFO,
POPOVER_VIDEO_STATS,
2020-04-28 06:33:58 +01:00
} from '../../constants'
import {
ChatConversationExpirationOptionsPopover,
2020-12-03 22:13:11 +00:00
ChatConversationOptionsPopover,
2020-12-16 00:31:30 +00:00
ChatMessageOptionsPopover,
ChatSettingsPopover,
CommentSortingOptionsPopover,
2020-12-16 00:31:30 +00:00
ComposePostDesinationPopover,
2020-04-28 06:33:58 +01:00
DatePickerPopover,
EmojiPickerPopover,
GroupListSortOptionsPopover,
GroupMemberOptionsPopover,
2020-05-07 06:55:24 +01:00
GroupOptionsPopover,
GroupTimelineSortOptionsPopover,
GroupTimelineSortTopOptionsPopover,
2020-05-15 04:17:31 +01:00
NavSettingsPopover,
2020-04-28 06:33:58 +01:00
ProfileOptionsPopover,
SidebarMorePopover,
StatusExpirationOptionsPopover,
2020-04-28 06:33:58 +01:00
StatusOptionsPopover,
SharePopover,
2020-04-28 06:33:58 +01:00
StatusVisibilityPopover,
TimelineInjectionOptionsPopover,
2020-04-28 06:33:58 +01:00
UserInfoPopover,
VideoStatsPopover,
2020-04-28 06:33:58 +01:00
} from '../../features/ui/util/async_components'
import React from 'react'
import PropTypes from 'prop-types'
import { connect } from 'react-redux'
import { closePopover } from '../../actions/popover'
import { getWindowDimension } from '../../utils/is_mobile'
2020-02-28 15:20:47 +00:00
import Bundle from '../../features/ui/util/bundle'
import ModalBase from '../modal/modal_base'
2020-02-28 15:20:47 +00:00
import PopoverBase from './popover_base'
import ErrorPopover from './error_popover'
import LoadingPopover from './loading_popover'
2020-02-28 15:20:47 +00:00
const initialState = getWindowDimension()
2020-12-03 22:13:11 +00:00
const POPOVER_COMPONENTS = {
[POPOVER_CHAT_CONVERSATION_EXPIRATION_OPTIONS]: ChatConversationExpirationOptionsPopover,
2020-12-03 22:13:11 +00:00
[POPOVER_CHAT_CONVERSATION_OPTIONS]: ChatConversationOptionsPopover,
2020-12-16 00:31:30 +00:00
[POPOVER_CHAT_MESSAGE_OPTIONS]: ChatMessageOptionsPopover,
[POPOVER_CHAT_SETTINGS]: ChatSettingsPopover,
2020-12-03 22:13:11 +00:00
[POPOVER_COMMENT_SORTING_OPTIONS]: CommentSortingOptionsPopover,
2020-12-16 00:31:30 +00:00
[POPOVER_COMPOSE_POST_DESTINATION]: ComposePostDesinationPopover,
2020-12-03 22:13:11 +00:00
[POPOVER_DATE_PICKER]: DatePickerPopover,
[POPOVER_EMOJI_PICKER]: EmojiPickerPopover,
[POPOVER_GROUP_LIST_SORT_OPTIONS]: GroupListSortOptionsPopover,
[POPOVER_GROUP_MEMBER_OPTIONS]: GroupMemberOptionsPopover,
[POPOVER_GROUP_OPTIONS]: GroupOptionsPopover,
[POPOVER_GROUP_TIMELINE_SORT_OPTIONS]: GroupTimelineSortOptionsPopover,
[POPOVER_GROUP_TIMELINE_SORT_TOP_OPTIONS]: GroupTimelineSortTopOptionsPopover,
[POPOVER_NAV_SETTINGS]: NavSettingsPopover,
[POPOVER_PROFILE_OPTIONS]: ProfileOptionsPopover,
[POPOVER_SIDEBAR_MORE]: SidebarMorePopover,
[POPOVER_STATUS_OPTIONS]: StatusOptionsPopover,
[POPOVER_STATUS_EXPIRATION_OPTIONS]: StatusExpirationOptionsPopover,
[POPOVER_SHARE]: SharePopover,
2020-12-03 22:13:11 +00:00
[POPOVER_STATUS_VISIBILITY]: StatusVisibilityPopover,
[POPOVER_TIMELINE_INJECTION_OPTIONS]: TimelineInjectionOptionsPopover,
[POPOVER_USER_INFO]: UserInfoPopover,
[POPOVER_VIDEO_STATS]: VideoStatsPopover,
}
2020-02-28 15:20:47 +00:00
class PopoverRoot extends React.PureComponent {
2020-04-08 02:06:59 +01:00
state = {
width: initialState.width,
}
componentDidMount() {
this.handleResize()
window.addEventListener('resize', this.handleResize, false)
}
componentWillUnmount() {
window.removeEventListener('resize', this.handleResize, false)
}
2020-05-14 07:03:22 +01:00
componentDidUpdate() {
const { type } = this.props
const { width } = this.state
if (width <= BREAKPOINT_EXTRA_SMALL && !!type) {
document.body.classList.add(_s.overflowYHidden)
} else {
document.body.classList.remove(_s.overflowYHidden)
}
}
handleResize = () => {
const { width } = getWindowDimension()
this.setState({ width })
2020-02-28 15:20:47 +00:00
}
renderLoading = () => {
const { width } = this.state
const isXS = width <= BREAKPOINT_EXTRA_SMALL
return <LoadingPopover isXS={isXS} onClose={this.props.onClose} />
}
renderError = () => {
const { width } = this.state
const isXS = width <= BREAKPOINT_EXTRA_SMALL
return <ErrorPopover isXS={isXS} onClose={this.props.onClose} />
2020-02-28 15:20:47 +00:00
}
setRef = () => {
// : todo : ?
}
2020-02-28 15:20:47 +00:00
render() {
const { type, props, onClose } = this.props
const { width } = this.state
2020-02-28 15:20:47 +00:00
const visible = !!type
const isXS = width <= BREAKPOINT_EXTRA_SMALL
const Wrapper = isXS ? ModalBase : PopoverBase
//If is XS and popover is user info, dont show
//Since on mobile this should not be visible
if (isXS && type === POPOVER_USER_INFO) return null
2020-02-28 15:20:47 +00:00
return (
<Wrapper
onClose={onClose}
2020-03-11 23:56:18 +00:00
visible={visible}
2020-03-14 17:31:29 +00:00
innerRef={this.setRef}
2020-03-11 23:56:18 +00:00
{...props}
>
{
visible &&
<Bundle
fetchComponent={POPOVER_COMPONENTS[type]}
loading={this.renderLoading}
error={this.renderError}
renderDelay={150}
2020-03-11 23:56:18 +00:00
>
{
(Component) => <Component innerRef={this.setRef} isXS={isXS} onClose={onClose} {...props} />
2020-03-11 23:56:18 +00:00
}
</Bundle>
}
</Wrapper>
2020-02-28 15:20:47 +00:00
)
}
2020-04-08 02:06:59 +01:00
}
const mapStateToProps = (state) => ({
type: state.getIn(['popover', 'popoverType']),
props: state.getIn(['popover', 'popoverProps'], {}),
})
const mapDispatchToProps = (dispatch) => ({
onClose: (type) => dispatch(closePopover(type)),
})
PopoverRoot.propTypes = {
type: PropTypes.string,
props: PropTypes.object,
onClose: PropTypes.func.isRequired,
}
export default connect(mapStateToProps, mapDispatchToProps)(PopoverRoot)