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.
		
		
		
		
		
			
		
			
	
	
		
			102 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			TypeScript
		
	
		
		
			
		
	
	
			102 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			TypeScript
		
	
| 
											4 years ago
										 | import React, { useState } from 'react'; | ||
|  | // tslint:disable: use-simple-attributes no-submodule-imports
 | ||
|  | 
 | ||
|  | import { useDispatch } from 'react-redux'; | ||
|  | import { SessionButton, SessionButtonColor, SessionButtonType } from '../../basic/SessionButton'; | ||
|  | import { SessionIdEditable } from '../../basic/SessionIdEditable'; | ||
|  | import { SessionSpinner } from '../../basic/SessionSpinner'; | ||
|  | import { OverlayHeader } from './OverlayHeader'; | ||
|  | import { setOverlayMode } from '../../../state/ducks/section'; | ||
|  | import { PubKey } from '../../../session/types'; | ||
|  | import { ConversationTypeEnum } from '../../../models/conversation'; | ||
|  | import { SNodeAPI } from '../../../session/apis/snode_api'; | ||
|  | import { onsNameRegex } from '../../../session/apis/snode_api/SNodeAPI'; | ||
|  | import { getConversationController } from '../../../session/conversations'; | ||
|  | import { ToastUtils } from '../../../session/utils'; | ||
|  | import { openConversationWithMessages } from '../../../state/ducks/conversations'; | ||
|  | import useKey from 'react-use/lib/useKey'; | ||
|  | 
 | ||
|  | export const OverlayMessage = () => { | ||
|  |   const dispatch = useDispatch(); | ||
|  | 
 | ||
|  |   function closeOverlay() { | ||
|  |     dispatch(setOverlayMode(undefined)); | ||
|  |   } | ||
|  | 
 | ||
|  |   useKey('Escape', closeOverlay); | ||
|  |   const [pubkeyOrOns, setPubkeyOrOns] = useState(''); | ||
|  |   const [loading, setLoading] = useState(false); | ||
|  | 
 | ||
|  |   const title = window.i18n('newSession'); | ||
|  |   const buttonText = window.i18n('next'); | ||
|  |   const descriptionLong = window.i18n('usersCanShareTheir...'); | ||
|  |   const subtitle = window.i18n('enterSessionIDOrONSName'); | ||
|  |   const placeholder = window.i18n('enterSessionIDOfRecipient'); | ||
|  | 
 | ||
|  |   async function handleMessageButtonClick() { | ||
|  |     if ((!pubkeyOrOns && !pubkeyOrOns.length) || !pubkeyOrOns.trim().length) { | ||
|  |       ToastUtils.pushToastError('invalidPubKey', window.i18n('invalidNumberError')); // or ons name
 | ||
|  |       return; | ||
|  |     } | ||
|  |     const pubkeyorOnsTrimmed = pubkeyOrOns.trim(); | ||
|  | 
 | ||
|  |     if (!PubKey.validateWithError(pubkeyorOnsTrimmed)) { | ||
|  |       // this is a pubkey
 | ||
|  |       await getConversationController().getOrCreateAndWait( | ||
|  |         pubkeyorOnsTrimmed, | ||
|  |         ConversationTypeEnum.PRIVATE | ||
|  |       ); | ||
|  | 
 | ||
|  |       await openConversationWithMessages({ conversationKey: pubkeyorOnsTrimmed }); | ||
|  |       closeOverlay(); | ||
|  |     } else { | ||
|  |       // this might be an ONS, validate the regex first
 | ||
|  |       const mightBeOnsName = new RegExp(onsNameRegex, 'g').test(pubkeyorOnsTrimmed); | ||
|  |       if (!mightBeOnsName) { | ||
|  |         ToastUtils.pushToastError('invalidPubKey', window.i18n('invalidNumberError')); | ||
|  |         return; | ||
|  |       } | ||
|  |       setLoading(true); | ||
|  |       try { | ||
|  |         const resolvedSessionID = await SNodeAPI.getSessionIDForOnsName(pubkeyorOnsTrimmed); | ||
|  |         if (PubKey.validateWithError(resolvedSessionID)) { | ||
|  |           throw new Error('Got a resolved ONS but the returned entry is not a vlaid SessionID'); | ||
|  |         } | ||
|  |         // this is a pubkey
 | ||
|  |         await getConversationController().getOrCreateAndWait( | ||
|  |           resolvedSessionID, | ||
|  |           ConversationTypeEnum.PRIVATE | ||
|  |         ); | ||
|  | 
 | ||
|  |         await openConversationWithMessages({ conversationKey: resolvedSessionID }); | ||
|  | 
 | ||
|  |         closeOverlay(); | ||
|  |       } catch (e) { | ||
|  |         window?.log?.warn('failed to resolve ons name', pubkeyorOnsTrimmed, e); | ||
|  |         ToastUtils.pushToastError('invalidPubKey', window.i18n('failedResolveOns')); | ||
|  |       } finally { | ||
|  |         setLoading(false); | ||
|  |       } | ||
|  |     } | ||
|  |   } | ||
|  | 
 | ||
|  |   return ( | ||
|  |     <div className="module-left-pane-overlay"> | ||
|  |       <OverlayHeader title={title} subtitle={subtitle} /> | ||
|  | 
 | ||
|  |       <SessionIdEditable editable={!loading} placeholder={placeholder} onChange={setPubkeyOrOns} /> | ||
|  | 
 | ||
|  |       <SessionSpinner loading={loading} /> | ||
|  | 
 | ||
|  |       <div className="session-description-long">{descriptionLong}</div> | ||
|  |       <SessionButton | ||
|  |         buttonColor={SessionButtonColor.Green} | ||
|  |         buttonType={SessionButtonType.BrandOutline} | ||
|  |         text={buttonText} | ||
|  |         disabled={false} | ||
|  |         onClick={handleMessageButtonClick} | ||
|  |       /> | ||
|  |     </div> | ||
|  |   ); | ||
|  | }; |