You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			188 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			TypeScript
		
	
			
		
		
	
	
			188 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			TypeScript
		
	
import React from 'react';
 | 
						|
import ReactDOM from 'react-dom';
 | 
						|
 | 
						|
import {
 | 
						|
  SessionSettingCategory,
 | 
						|
  SettingsView,
 | 
						|
} from './session/settings/SessionSettings';
 | 
						|
 | 
						|
export const MainViewController = {
 | 
						|
  joinChannelStateManager,
 | 
						|
  createClosedGroup,
 | 
						|
  renderMessageView,
 | 
						|
  renderSettingsView,
 | 
						|
};
 | 
						|
 | 
						|
import { ContactType } from './session/SessionMemberListItem';
 | 
						|
 | 
						|
export class MessageView extends React.Component {
 | 
						|
  public render() {
 | 
						|
    return (
 | 
						|
      <div className="conversation-stack">
 | 
						|
        <div className="conversation placeholder">
 | 
						|
          <div className="conversation-header" />
 | 
						|
          <div className="container">
 | 
						|
            <div className="content">
 | 
						|
              <img
 | 
						|
                src="images/session/full-logo.svg"
 | 
						|
                className="session-full-logo"
 | 
						|
                alt="full-brand-logo"
 | 
						|
              />
 | 
						|
            </div>
 | 
						|
          </div>
 | 
						|
        </div>
 | 
						|
      </div>
 | 
						|
    );
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
// /////////////////////////////////////
 | 
						|
// //////////// Management /////////////
 | 
						|
// /////////////////////////////////////
 | 
						|
 | 
						|
function joinChannelStateManager(
 | 
						|
  thisRef: any,
 | 
						|
  serverURL: string,
 | 
						|
  onSuccess?: any
 | 
						|
) {
 | 
						|
  // Any component that uses this function MUST have the keys [loading, connectSuccess]
 | 
						|
  // in their State
 | 
						|
 | 
						|
  // TODO: Make this not hard coded
 | 
						|
  const channelId = 1;
 | 
						|
  thisRef.setState({ loading: true });
 | 
						|
  const connectionResult = window.attemptConnection(serverURL, channelId);
 | 
						|
 | 
						|
  // Give 5s maximum for promise to revole. Else, throw error.
 | 
						|
  const connectionTimeout = setTimeout(() => {
 | 
						|
    if (!thisRef.state.connectSuccess) {
 | 
						|
      thisRef.setState({ loading: false });
 | 
						|
      window.pushToast({
 | 
						|
        title: window.i18n('connectToServerFail'),
 | 
						|
        type: 'error',
 | 
						|
        id: 'connectToServerFail',
 | 
						|
      });
 | 
						|
 | 
						|
      return;
 | 
						|
    }
 | 
						|
  }, window.CONSTANTS.MAX_CONNECTION_DURATION);
 | 
						|
 | 
						|
  connectionResult
 | 
						|
    .then(() => {
 | 
						|
      clearTimeout(connectionTimeout);
 | 
						|
 | 
						|
      if (thisRef.state.loading) {
 | 
						|
        thisRef.setState({
 | 
						|
          connectSuccess: true,
 | 
						|
          loading: false,
 | 
						|
        });
 | 
						|
        window.pushToast({
 | 
						|
          title: window.i18n('connectToServerSuccess'),
 | 
						|
          id: 'connectToServerSuccess',
 | 
						|
          type: 'success',
 | 
						|
        });
 | 
						|
 | 
						|
        if (onSuccess) {
 | 
						|
          onSuccess();
 | 
						|
        }
 | 
						|
      }
 | 
						|
    })
 | 
						|
    .catch((connectionError: string) => {
 | 
						|
      clearTimeout(connectionTimeout);
 | 
						|
      thisRef.setState({
 | 
						|
        connectSuccess: true,
 | 
						|
        loading: false,
 | 
						|
      });
 | 
						|
      window.pushToast({
 | 
						|
        title: connectionError,
 | 
						|
        id: 'connectToServerFail',
 | 
						|
        type: 'error',
 | 
						|
      });
 | 
						|
 | 
						|
      return false;
 | 
						|
    });
 | 
						|
 | 
						|
  return true;
 | 
						|
}
 | 
						|
 | 
						|
async function createClosedGroup(
 | 
						|
  groupName: string,
 | 
						|
  groupMembers: Array<ContactType>,
 | 
						|
  senderKeys: boolean,
 | 
						|
  onSuccess: any
 | 
						|
) {
 | 
						|
  // Validate groupName and groupMembers length
 | 
						|
  if (
 | 
						|
    groupName.length === 0 ||
 | 
						|
    groupName.length > window.CONSTANTS.MAX_GROUP_NAME_LENGTH
 | 
						|
  ) {
 | 
						|
    window.pushToast({
 | 
						|
      title: window.i18n(
 | 
						|
        'invalidGroupName',
 | 
						|
        window.CONSTANTS.MAX_GROUP_NAME_LENGTH
 | 
						|
      ),
 | 
						|
      type: 'error',
 | 
						|
      id: 'invalidGroupName',
 | 
						|
    });
 | 
						|
 | 
						|
    return;
 | 
						|
  }
 | 
						|
 | 
						|
  // >= because we add ourself as a member after this. so a 10 group is already invalid as it will be 11 with ourself
 | 
						|
  if (
 | 
						|
    groupMembers.length === 0 ||
 | 
						|
    groupMembers.length >= window.CONSTANTS.SMALL_GROUP_SIZE_LIMIT
 | 
						|
  ) {
 | 
						|
    window.pushToast({
 | 
						|
      title: window.i18n(
 | 
						|
        'invalidGroupSize',
 | 
						|
        window.CONSTANTS.SMALL_GROUP_SIZE_LIMIT
 | 
						|
      ),
 | 
						|
      type: 'error',
 | 
						|
      id: 'invalidGroupSize',
 | 
						|
    });
 | 
						|
 | 
						|
    return;
 | 
						|
  }
 | 
						|
 | 
						|
  const groupMemberIds = groupMembers.map(m => m.id);
 | 
						|
 | 
						|
  if (senderKeys) {
 | 
						|
    await window.createMediumSizeGroup(groupName, groupMemberIds);
 | 
						|
  } else {
 | 
						|
    await window.doCreateGroup(groupName, groupMemberIds);
 | 
						|
  }
 | 
						|
 | 
						|
  if (onSuccess) {
 | 
						|
    onSuccess();
 | 
						|
  }
 | 
						|
 | 
						|
  return true;
 | 
						|
}
 | 
						|
 | 
						|
// /////////////////////////////////////
 | 
						|
// ///////////// Rendering /////////////
 | 
						|
// /////////////////////////////////////
 | 
						|
 | 
						|
function renderMessageView() {
 | 
						|
  if (document.getElementById('main-view')) {
 | 
						|
    ReactDOM.render(<MessageView />, document.getElementById('main-view'));
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
function renderSettingsView(category: SessionSettingCategory) {
 | 
						|
  // tslint:disable-next-line: no-backbone-get-set-outside-model
 | 
						|
  const isSecondaryDevice = !!window.textsecure.storage.get(
 | 
						|
    'isSecondaryDevice'
 | 
						|
  );
 | 
						|
  if (document.getElementById('main-view')) {
 | 
						|
    ReactDOM.render(
 | 
						|
      <SettingsView
 | 
						|
        category={category}
 | 
						|
        isSecondaryDevice={isSecondaryDevice}
 | 
						|
      />,
 | 
						|
      document.getElementById('main-view')
 | 
						|
    );
 | 
						|
  }
 | 
						|
}
 |