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')
 | |
|     );
 | |
|   }
 | |
| }
 |