'use strict' import React from 'react' import PropTypes from 'prop-types' import { connect } from 'react-redux' import { Provider } from 'react-redux' import configureStore from '../store/configureStore' import { BrowserRouter, Route } from 'react-router-dom' import moment from 'moment-mini' import { ScrollContext } from 'react-router-scroll-4' import { IntlProvider, addLocaleData } from 'react-intl' import { fetchCustomEmojis } from '../actions/custom_emojis' import { fetchPromotions } from '../actions/promotions' import { fetchChatConversationUnreadCount } from '../actions/chat_conversations' import { hydrateStore } from '../actions/store' import { MIN_ACCOUNT_CREATED_AT_ONBOARDING } from '../constants' import { connectUserStream, connectStatusUpdateStream, connectChatMessagesStream, } from '../actions/streaming' import { saveWindowDimensions } from '../actions/settings' import { getLocale } from '../locales' import initialState from '../initial_state' import { me, isFirstSession } from '../initial_state' import UI from '../features/ui' import IntroductionPage from '../pages/introduction_page' import ErrorBoundary from '../components/error_boundary' import Display from './display' const { localeData, messages } = getLocale() addLocaleData(localeData) export const store = configureStore() const hydrateAction = hydrateStore(initialState) store.dispatch(hydrateAction) store.dispatch(fetchCustomEmojis()) store.dispatch(fetchPromotions()) store.dispatch(fetchChatConversationUnreadCount()) store.dispatch(saveWindowDimensions()) const mapStateToProps = (state) => ({ accountCreatedAt: !!me ? state.getIn(['accounts', me, 'created_at']) : undefined, shownOnboarding: state.getIn(['settings', 'shownOnboarding']), }) @connect(mapStateToProps) class GabSocialMount extends React.PureComponent { static propTypes = { shownOnboarding: PropTypes.bool.isRequired, accountCreatedAt: PropTypes.string, } state = { shownOnboarding: this.props.shownOnboarding, shouldShow: false, } componentDidMount() { if (!!me && this.props.accountCreatedAt) { //If first time opening app, and is new user, show onboarding const accountCreatedAtValue = moment(this.props.accountCreatedAt).valueOf() const shouldShow = isFirstSession && !this.state.shownOnboarding && accountCreatedAtValue > MIN_ACCOUNT_CREATED_AT_ONBOARDING if (shouldShow) this.setState({ shouldShow }) } this.handleResize() window.addEventListener('resize', this.handleResize, false) } componentWillUnmount () { window.removeEventListener('resize', this.handleResize, false) } handleResize = () => { this.props.dispatch(saveWindowDimensions()) } render () { const { shownOnboarding, shouldShow } = this.state if (!shownOnboarding && shouldShow) { return ( ) } return ( ) } } export default class GabSocial extends React.PureComponent { static propTypes = { locale: PropTypes.string.isRequired, } componentDidMount() { if (!!me) { this.disconnect = store.dispatch(connectUserStream()) store.dispatch(connectStatusUpdateStream()) store.dispatch(connectChatMessagesStream(me)) } console.log('%cGab Social ', [ , 'color: #30CE7D' , 'display: block' , 'line-height: 80px' , 'font-family: system-ui, -apple-system, BlinkMacSystemFont, Roboto, Ubuntu, "Helvetica Neue", sans-serif' , 'font-size: 36px' , 'text-align: left' , 'font-weight: 800' ].join(';')) console.log('%cThis is a browser feature intended for developers.\nIf someone told you to copy and paste something here it is a scam and will give them access to your Gab account. ', [ , 'color: #000' , 'display: block' , 'line-height: 30px' , 'font-family: system-ui, -apple-system, BlinkMacSystemFont, Roboto, Ubuntu, "Helvetica Neue", sans-serif' , 'font-size: 20px' , 'text-align: left' , 'font-weight: 600' ].join(';')) } componentWillUnmount () { if (this.disconnect) { this.disconnect() this.disconnect = null } } render () { const { locale } = this.props return ( ) } }