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.
		
		
		
		
		
			
		
			
				
	
	
		
			205 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			TypeScript
		
	
			
		
		
	
	
			205 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			TypeScript
		
	
| import React from 'react';
 | |
| import ReactDOM from 'react-dom';
 | |
| import { padStart, sample } from 'lodash';
 | |
| 
 | |
| import _ from 'lodash';
 | |
| import moment from 'moment';
 | |
| import qs from 'qs';
 | |
| 
 | |
| export { _ };
 | |
| 
 | |
| // Helper components used in the Style Guide, exposed at 'util' in the global scope via
 | |
| //   the 'context' option in react-styleguidist.
 | |
| 
 | |
| export { ConversationContext } from './ConversationContext';
 | |
| export { BackboneWrapper } from '../components/utility/BackboneWrapper';
 | |
| 
 | |
| // Here we can make things inside Webpack available to Backbone views like preload.js.
 | |
| 
 | |
| import { Quote } from '../components/conversation/Quote';
 | |
| import * as HTML from '../html';
 | |
| 
 | |
| import * as MIME from '../../ts/types/MIME';
 | |
| 
 | |
| // TypeScript wants two things when you import:
 | |
| //   1) a normal typescript file
 | |
| //   2) a javascript file with type definitions
 | |
| // Anything else will raise an error, that it can't find the module. And so, we ignore...
 | |
| 
 | |
| // @ts-ignore
 | |
| import gif from '../../fixtures/giphy-GVNvOUpeYmI7e.gif';
 | |
| const gifObjectUrl = makeObjectUrl(gif, 'image/gif');
 | |
| // @ts-ignore
 | |
| import mp3 from '../../fixtures/incompetech-com-Agnus-Dei-X.mp3';
 | |
| const mp3ObjectUrl = makeObjectUrl(mp3, 'audio/mp3');
 | |
| // @ts-ignore
 | |
| import txt from '../../fixtures/lorem-ipsum.txt';
 | |
| const txtObjectUrl = makeObjectUrl(txt, 'text/plain');
 | |
| // @ts-ignore
 | |
| import mp4 from '../../fixtures/pixabay-Soap-Bubble-7141.mp4';
 | |
| const mp4ObjectUrl = makeObjectUrl(mp4, 'video/mp4');
 | |
| 
 | |
| // @ts-ignore
 | |
| import landscapeGreen from '../../fixtures/1000x50-green.jpeg';
 | |
| const landscapeGreenObjectUrl = makeObjectUrl(landscapeGreen, 'image/jpeg');
 | |
| // @ts-ignore
 | |
| import landscapePurple from '../../fixtures/200x50-purple.png';
 | |
| const landscapePurpleObjectUrl = makeObjectUrl(landscapePurple, 'image/png');
 | |
| // @ts-ignore
 | |
| import portraitYellow from '../../fixtures/20x200-yellow.png';
 | |
| const portraitYellowObjectUrl = makeObjectUrl(portraitYellow, 'image/png');
 | |
| // @ts-ignore
 | |
| import landscapeRed from '../../fixtures/300x1-red.jpeg';
 | |
| const landscapeRedObjectUrl = makeObjectUrl(landscapeRed, 'image/png');
 | |
| // @ts-ignore
 | |
| import portraitTeal from '../../fixtures/50x1000-teal.jpeg';
 | |
| const portraitTealObjectUrl = makeObjectUrl(portraitTeal, 'image/png');
 | |
| 
 | |
| function makeObjectUrl(data: ArrayBuffer, contentType: string): string {
 | |
|   const blob = new Blob([data], {
 | |
|     type: contentType,
 | |
|   });
 | |
|   return URL.createObjectURL(blob);
 | |
| }
 | |
| 
 | |
| const ourNumber = '+12025559999';
 | |
| const groupNumber = '+12025550099';
 | |
| 
 | |
| export {
 | |
|   mp3,
 | |
|   mp3ObjectUrl,
 | |
|   gif,
 | |
|   gifObjectUrl,
 | |
|   mp4,
 | |
|   mp4ObjectUrl,
 | |
|   txt,
 | |
|   txtObjectUrl,
 | |
|   landscapeGreen,
 | |
|   landscapeGreenObjectUrl,
 | |
|   landscapePurple,
 | |
|   landscapePurpleObjectUrl,
 | |
|   portraitYellow,
 | |
|   portraitYellowObjectUrl,
 | |
|   landscapeRed,
 | |
|   landscapeRedObjectUrl,
 | |
|   portraitTeal,
 | |
|   portraitTealObjectUrl,
 | |
|   ourNumber,
 | |
|   groupNumber,
 | |
| };
 | |
| 
 | |
| // Required, or TypeScript complains about adding keys to window
 | |
| const parent = window as any;
 | |
| 
 | |
| const query = window.location.search.replace(/^\?/, '');
 | |
| const urlOptions = qs.parse(query);
 | |
| const theme = urlOptions.theme || 'android';
 | |
| const locale = urlOptions.locale || 'en';
 | |
| 
 | |
| // @ts-ignore
 | |
| import localeMessages from '../../_locales/en/messages.json';
 | |
| 
 | |
| // @ts-ignore
 | |
| import { setup } from '../../js/modules/i18n';
 | |
| import * as Util from '../util';
 | |
| import filesize from 'filesize';
 | |
| 
 | |
| const i18n = setup(locale, localeMessages);
 | |
| 
 | |
| export { theme, locale, i18n };
 | |
| 
 | |
| parent.i18n = i18n;
 | |
| parent.moment = moment;
 | |
| 
 | |
| parent.moment.updateLocale(locale, {
 | |
|   relativeTime: {
 | |
|     h: parent.i18n('timestamp_h'),
 | |
|     m: parent.i18n('timestamp_m'),
 | |
|     s: parent.i18n('timestamp_s'),
 | |
|   },
 | |
| });
 | |
| parent.moment.locale(locale);
 | |
| 
 | |
| parent.React = React;
 | |
| parent.ReactDOM = ReactDOM;
 | |
| 
 | |
| parent.Signal.HTML = HTML;
 | |
| parent.Signal.Types.MIME = MIME;
 | |
| parent.Signal.Components = {
 | |
|   Quote,
 | |
| };
 | |
| parent.Signal.Util = Util;
 | |
| parent.filesize = filesize;
 | |
| 
 | |
| parent.ConversationController._initialFetchComplete = true;
 | |
| parent.ConversationController._initialPromise = Promise.resolve();
 | |
| 
 | |
| const COLORS = [
 | |
|   'red',
 | |
|   'pink',
 | |
|   'purple',
 | |
|   'deep_purple',
 | |
|   'indigo',
 | |
|   'blue',
 | |
|   'light_blue',
 | |
|   'cyan',
 | |
|   'teal',
 | |
|   'green',
 | |
|   'light_green',
 | |
|   'orange',
 | |
|   'deep_orange',
 | |
|   'amber',
 | |
|   'blue_grey',
 | |
|   'grey',
 | |
|   'default',
 | |
| ];
 | |
| 
 | |
| const CONTACTS = COLORS.map((color, index) => {
 | |
|   const title = `${sample(['Mr.', 'Mrs.', 'Ms.', 'Unknown'])} ${color}`;
 | |
|   const key = sample(['name', 'profileName']) as string;
 | |
|   const id = `+1202555${padStart(index.toString(), 4, '0')}`;
 | |
| 
 | |
|   const contact = {
 | |
|     color,
 | |
|     [key]: title,
 | |
|     id,
 | |
|     type: 'private',
 | |
|   };
 | |
| 
 | |
|   return parent.ConversationController.dangerouslyCreateAndAdd(contact);
 | |
| });
 | |
| 
 | |
| const me = parent.ConversationController.dangerouslyCreateAndAdd({
 | |
|   id: ourNumber,
 | |
|   name: 'Me!',
 | |
|   type: 'private',
 | |
|   color: 'light_blue',
 | |
| });
 | |
| 
 | |
| const group = parent.ConversationController.dangerouslyCreateAndAdd({
 | |
|   id: groupNumber,
 | |
|   name: 'A place for sharing cats',
 | |
|   type: 'group',
 | |
| });
 | |
| 
 | |
| group.contactCollection.add(me);
 | |
| group.contactCollection.add(CONTACTS[0]);
 | |
| group.contactCollection.add(CONTACTS[1]);
 | |
| group.contactCollection.add(CONTACTS[2]);
 | |
| 
 | |
| export { COLORS, CONTACTS, me, group };
 | |
| 
 | |
| parent.textsecure.storage.user.getNumber = () => ourNumber;
 | |
| 
 | |
| // Telling Lodash to relinquish _ for use by underscore
 | |
| // @ts-ignore
 | |
| _.noConflict();
 | |
| 
 | |
| parent.emoji.signalReplace = (html: string): string => {
 | |
|   return html.replace(
 | |
|     /🔥/g,
 | |
|     '<img src="node_modules/emoji-datasource-apple/img/apple/64/1f525.png"' +
 | |
|       'class="emoji" data-codepoints="1f525" title=":fire:">'
 | |
|   );
 | |
| };
 |