import React from 'react'; import { Provider } from 'react-redux'; import { bindActionCreators } from 'redux'; import { getConversationController } from '../../session/conversations'; import { UserUtils } from '../../session/utils'; import { createStore } from '../../state/createStore'; import { actions as conversationActions, getEmptyConversationState, openConversationWithMessages, } from '../../state/ducks/conversations'; import { initialDefaultRoomState } from '../../state/ducks/defaultRooms'; import { initialModalState } from '../../state/ducks/modalDialog'; import { initialOnionPathState } from '../../state/ducks/onion'; import { initialSearchState } from '../../state/ducks/search'; import { initialSectionState } from '../../state/ducks/section'; import { initialThemeState } from '../../state/ducks/theme'; import { initialUserConfigState } from '../../state/ducks/userConfig'; import { StateType } from '../../state/reducer'; import { makeLookup } from '../../util'; import { LeftPane } from '../LeftPane'; import { SessionMainPanel } from '../SessionMainPanel'; // tslint:disable-next-line: no-submodule-imports import { PersistGate } from 'redux-persist/integration/react'; import { persistStore } from 'redux-persist'; import { TimerOptionsArray } from '../../state/ducks/timerOptions'; import { getEmptyStagedAttachmentsState } from '../../state/ducks/stagedAttachments'; // Workaround: A react component's required properties are filtering up through connect() // https://github.com/DefinitelyTyped/DefinitelyTyped/issues/31363 type State = { isInitialLoadComplete: boolean; }; export class SessionInboxView extends React.Component { private store: any; constructor(props: any) { super(props); this.state = { isInitialLoadComplete: false, }; } public componentDidMount() { this.setupLeftPane(); } public render() { if (!this.state.isInitialLoadComplete) { return <>; } const persistor = persistStore(this.store); window.persistStore = persistor; return (
{this.renderLeftPane()}
); } private renderLeftPane() { return ; } private setupLeftPane() { // Here we set up a full redux store with initial state for our LeftPane Root const conversations = getConversationController() .getConversations() .map(conversation => conversation.getConversationModelProps()); const timerOptions: TimerOptionsArray = window.Whisper.ExpirationTimerOptions.map( (item: any) => ({ name: item.getName(), value: item.get('seconds'), }) ); const initialState: StateType = { conversations: { ...getEmptyConversationState(), conversationLookup: makeLookup(conversations, 'id'), }, user: { ourNumber: UserUtils.getOurPubKeyStrFromCache(), }, section: initialSectionState, defaultRooms: initialDefaultRoomState, search: initialSearchState, theme: initialThemeState, onionPaths: initialOnionPathState, modals: initialModalState, userConfig: initialUserConfigState, timerOptions: { timerOptions, }, stagedAttachments: getEmptyStagedAttachmentsState(), }; this.store = createStore(initialState); window.inboxStore = this.store; // Enables our redux store to be updated by backbone events in the outside world const { messageExpired } = bindActionCreators(conversationActions, this.store.dispatch); window.openConversationWithMessages = openConversationWithMessages; // messageExpired is currently inboked fropm js. So we link it to Redux that way window.Whisper.events.on('messageExpired', messageExpired); this.setState({ isInitialLoadComplete: true }); } }