├── LICENSE ├── README.md └── app ├── .DS_Store ├── .htaccess ├── .nginx.conf ├── app.js ├── components ├── A │ ├── index.js │ └── tests │ │ └── index.test.js ├── AddContactModal │ ├── index.js │ └── tests │ │ └── index.test.js ├── Button │ ├── A.js │ ├── StyledButton.js │ ├── Wrapper.js │ ├── buttonStyles.js │ ├── index.js │ └── tests │ │ ├── A.test.js │ │ ├── StyledButton.test.js │ │ ├── Wrapper.test.js │ │ └── index.test.js ├── DeleteContactModal │ ├── index.js │ └── tests │ │ └── index.test.js ├── DeveloperSignUp │ ├── index.js │ └── tests │ │ └── index.test.js ├── EmailSignUp │ ├── index.js │ └── tests │ │ └── index.test.js ├── Faq │ ├── index.js │ └── tests │ │ └── index.test.js ├── Footer │ ├── Wrapper.js │ ├── index.js │ ├── messages.js │ └── tests │ │ ├── Wrapper.test.js │ │ └── index.test.js ├── H1 │ ├── index.js │ └── tests │ │ └── index.test.js ├── H2 │ ├── index.js │ └── tests │ │ └── index.test.js ├── H3 │ ├── index.js │ └── tests │ │ └── index.test.js ├── Header │ ├── A.js │ ├── HeaderLink.js │ ├── Img.js │ ├── NavBar.js │ ├── banner.jpg │ ├── index.js │ ├── messages.js │ └── tests │ │ ├── A.test.js │ │ ├── Img.test.js │ │ └── index.test.js ├── HomePageLayout │ ├── index.js │ └── tests │ │ └── index.test.js ├── Img │ ├── index.js │ └── tests │ │ └── index.test.js ├── IntroCarousel │ ├── index.js │ └── tests │ │ └── index.test.js ├── IssueIcon │ ├── index.js │ └── tests │ │ └── index.test.js ├── List │ ├── Ul.js │ ├── Wrapper.js │ ├── index.js │ └── tests │ │ ├── Ul.test.js │ │ ├── Wrapper.test.js │ │ └── index.test.js ├── ListItem │ ├── Item.js │ ├── Wrapper.js │ ├── index.js │ └── tests │ │ ├── Item.test.js │ │ ├── Wrapper.test.js │ │ └── index.test.js ├── LoadingIndicator │ ├── Circle.js │ ├── Wrapper.js │ ├── index.js │ └── tests │ │ ├── Circle.test.js │ │ ├── Wrapper.test.js │ │ └── index.test.js ├── Message │ ├── index.js │ └── tests │ │ └── index.test.js ├── MessageForm │ ├── index.js │ └── tests │ │ └── index.test.js ├── SettingsModal │ ├── index.js │ └── tests │ │ └── index.test.js ├── ShareModal │ ├── index.js │ └── tests │ │ └── index.test.js ├── Toggle │ ├── Select.js │ ├── index.js │ └── tests │ │ ├── Select.test.js │ │ └── index.test.js ├── ToggleOption │ ├── index.js │ └── tests │ │ └── index.test.js ├── TransactionModal │ ├── index.js │ └── tests │ │ └── index.test.js ├── UserInfo │ ├── index.js │ └── tests │ │ └── index.test.js ├── VideoChatModal │ ├── index.js │ └── tests │ │ └── index.test.js └── VideoInviteModal │ ├── index.js │ └── tests │ └── index.test.js ├── configureStore.js ├── constants.js ├── contactManager.js ├── containers ├── App │ ├── actions.js │ ├── constants.js │ ├── index.js │ ├── reducer.js │ ├── selectors.js │ └── tests │ │ ├── actions.test.js │ │ ├── index.test.js │ │ ├── reducer.test.js │ │ └── selectors.test.js ├── BlockPage │ ├── Loadable.js │ ├── actions.js │ ├── constants.js │ ├── index.css │ ├── index.js │ ├── reducer.js │ ├── saga.js │ ├── selectors.js │ └── tests │ │ ├── actions.test.js │ │ ├── index.test.js │ │ ├── reducer.test.js │ │ ├── saga.test.js │ │ └── selectors.test.js ├── ContactList │ ├── Loadable.js │ ├── actions.js │ ├── constants.js │ ├── index.js │ ├── reducer.js │ ├── saga.js │ ├── selectors.js │ └── tests │ │ ├── actions.test.js │ │ ├── index.test.js │ │ ├── reducer.test.js │ │ ├── saga.test.js │ │ └── selectors.test.js ├── FeaturePage │ ├── List.js │ ├── ListItem.js │ ├── ListItemTitle.js │ ├── Loadable.js │ ├── index.js │ ├── messages.js │ └── tests │ │ ├── List.test.js │ │ ├── ListItem.test.js │ │ ├── ListItemTitle.test.js │ │ └── index.test.js ├── HomePage │ ├── AtPrefix.js │ ├── CenteredSection.js │ ├── Form.js │ ├── Input.js │ ├── Loadable.js │ ├── Section.js │ ├── actions.js │ ├── constants.js │ ├── index.js │ ├── messages.js │ ├── reducer.js │ ├── saga.js │ ├── selectors.js │ └── tests │ │ ├── AtPrefix.test.js │ │ ├── CenteredSection.test.js │ │ ├── Form.test.js │ │ ├── Input.test.js │ │ ├── Section.test.js │ │ ├── __snapshots__ │ │ └── saga.test.js.snap │ │ ├── actions.test.js │ │ ├── index.test.js │ │ ├── reducer.test.js │ │ ├── saga.test.js │ │ └── selectors.test.js ├── LanguageProvider │ ├── actions.js │ ├── constants.js │ ├── index.js │ ├── reducer.js │ ├── selectors.js │ └── tests │ │ ├── actions.test.js │ │ ├── index.test.js │ │ ├── reducer.test.js │ │ └── selectors.test.js ├── LocaleToggle │ ├── Wrapper.js │ ├── index.js │ ├── messages.js │ └── tests │ │ ├── Wrapper.test.js │ │ └── index.test.js ├── MessageList │ ├── Loadable.js │ ├── actions.js │ ├── constants.js │ ├── index.js │ ├── reducer.js │ ├── saga.js │ ├── selectors.js │ ├── tests │ │ ├── actions.test.js │ │ ├── index.test.js │ │ ├── reducer.test.js │ │ ├── saga.test.js │ │ └── selectors.test.js │ └── workers.js ├── MessagePage │ ├── Loadable.js │ ├── actions.js │ ├── constants.js │ ├── index.js │ ├── reducer.js │ ├── saga.js │ ├── selectors.js │ ├── tests │ │ ├── actions.test.js │ │ ├── index.test.js │ │ ├── reducer.test.js │ │ ├── saga.test.js │ │ └── selectors.test.js │ └── workers.js ├── NotFoundPage │ ├── Loadable.js │ ├── index.js │ ├── messages.js │ └── tests │ │ └── index.test.js ├── ToolBar │ ├── Loadable.js │ ├── actions.js │ ├── constants.js │ ├── index.js │ ├── reducer.js │ ├── saga.js │ ├── selectors.js │ ├── tests │ │ ├── actions.test.js │ │ ├── index.test.js │ │ ├── reducer.test.js │ │ ├── saga.test.js │ │ └── selectors.test.js │ └── workers.js └── UserIdForm │ ├── Loadable.js │ ├── actions.js │ ├── constants.js │ ├── index.js │ ├── reducer.js │ ├── saga.js │ ├── selectors.js │ └── tests │ ├── actions.test.js │ ├── index.test.js │ ├── reducer.test.js │ ├── saga.test.js │ └── selectors.test.js ├── devices.min.css ├── ext └── Screen-Capturing.js ├── filesystem ├── baseIO.js ├── firebaseIO.js ├── gaiaIO.js └── indexedIO.js ├── global-styles.js ├── i18n.js ├── images ├── AppTray.png ├── AppTray.svg ├── SharedIndexDataFlow.png ├── SharedIndexDataFlow.svg ├── SharedIndexFlow.png ├── SharedIndexFlow.svg ├── SharedIndexFuture.png ├── SharedIndexFuture.svg ├── StealthyV1.png ├── appleStore.svg ├── blue128.png ├── blue256.png ├── blue512.png ├── custom.png ├── dappstore.png ├── defaultProfile.png ├── elliot.jpg ├── elliot.png ├── favicon.ico ├── googlePlay.svg ├── homePage.png ├── image16x9.png ├── laptop.svg ├── laptopChat.png ├── msgBack.png ├── plugin.jpg ├── rStealthyFlow.jpg ├── snowden.jpg ├── stealthyFlow.png ├── stealthyMobileFlow2.mp4 ├── stealthy_plane.svg ├── stock │ ├── blank.jpg │ └── bug.png ├── videoPoster.png └── whit.png ├── index.html ├── manifest.json ├── messaging ├── chatMessage.js ├── conversationManager.js └── offlineMessagingServices.js ├── network ├── PeerManager.js ├── avPeerMgr.js ├── connectionManager.js ├── heartBeat.js ├── polling.js ├── sdpManager.js └── utils.js ├── redirect.html ├── reducers.js ├── robots.txt ├── tests ├── i18n.test.js └── store.test.js ├── translations ├── de.json └── en.json ├── utils.js └── utils ├── anonalytics.js ├── checkStore.js ├── common.js ├── constants.js ├── cryptoUtils.js ├── getQueryString.js ├── injectReducer.js ├── injectSaga.js ├── notification.js ├── reducerInjectors.js ├── request.js ├── sagaInjectors.js └── tests ├── checkStore.test.js ├── injectReducer.test.js ├── injectSaga.test.js ├── reducerInjectors.test.js ├── request.test.js └── sagaInjectors.test.js /README.md: -------------------------------------------------------------------------------- 1 | # website 2 | 3 | Learn More: https://www.web.stealthy.im 4 | -------------------------------------------------------------------------------- /app/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stealthyinc/webapp/e0d4a8e411d488fac8b440dcebb0c6922057b75c/app/.DS_Store -------------------------------------------------------------------------------- /app/.htaccess: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | ####################################################################### 5 | # GENERAL # 6 | ####################################################################### 7 | 8 | # Make apache follow sym links to files 9 | Options +FollowSymLinks 10 | # If somebody opens a folder, hide all files from the resulting folder list 11 | IndexIgnore */* 12 | 13 | 14 | ####################################################################### 15 | # REWRITING # 16 | ####################################################################### 17 | 18 | # Enable rewriting 19 | RewriteEngine On 20 | 21 | # If its not HTTPS 22 | RewriteCond %{HTTPS} off 23 | 24 | # Comment out the RewriteCond above, and uncomment the RewriteCond below if you're using a load balancer (e.g. CloudFlare) for SSL 25 | # RewriteCond %{HTTP:X-Forwarded-Proto} !https 26 | 27 | # Redirect to the same URL with https://, ignoring all further rules if this one is in effect 28 | RewriteRule ^(.*) https://%{HTTP_HOST}/$1 [R,L] 29 | 30 | # If we get to here, it means we are on https:// 31 | 32 | # If the file with the specified name in the browser doesn't exist 33 | RewriteCond %{REQUEST_FILENAME} !-f 34 | 35 | # and the directory with the specified name in the browser doesn't exist 36 | RewriteCond %{REQUEST_FILENAME} !-d 37 | 38 | # and we are not opening the root already (otherwise we get a redirect loop) 39 | RewriteCond %{REQUEST_FILENAME} !\/$ 40 | 41 | # Rewrite all requests to the root 42 | RewriteRule ^(.*) / 43 | 44 | 45 | 46 | 47 | # Do not cache sw.js, required for offline-first updates. 48 | 49 | Header set Cache-Control "private, no-cache, no-store, proxy-revalidate, no-transform" 50 | Header set Pragma "no-cache" 51 | 52 | 53 | -------------------------------------------------------------------------------- /app/components/A/index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * A link to a certain page, an anchor tag 3 | */ 4 | 5 | import styled from 'styled-components'; 6 | 7 | const A = styled.a` 8 | color: #41addd; 9 | 10 | &:hover { 11 | color: #6cc0e5; 12 | } 13 | `; 14 | 15 | export default A; 16 | -------------------------------------------------------------------------------- /app/components/A/tests/index.test.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Testing our link component 3 | */ 4 | 5 | import React from 'react'; 6 | import { shallow } from 'enzyme'; 7 | 8 | import A from '../index'; 9 | 10 | const href = 'http://mxstbr.com/'; 11 | const children = (

Test

); 12 | const renderComponent = (props = {}) => shallow( 13 | 14 | {children} 15 | 16 | ); 17 | 18 | describe('', () => { 19 | it('should render an tag', () => { 20 | const renderedComponent = renderComponent(); 21 | expect(renderedComponent.type()).toEqual('a'); 22 | }); 23 | 24 | it('should have an href attribute', () => { 25 | const renderedComponent = renderComponent(); 26 | expect(renderedComponent.prop('href')).toEqual(href); 27 | }); 28 | 29 | it('should have children', () => { 30 | const renderedComponent = renderComponent(); 31 | expect(renderedComponent.contains(children)).toEqual(true); 32 | }); 33 | 34 | it('should have a className attribute', () => { 35 | const className = 'test'; 36 | const renderedComponent = renderComponent({ className }); 37 | expect(renderedComponent.find('a').hasClass(className)).toEqual(true); 38 | }); 39 | 40 | it('should adopt a target attribute', () => { 41 | const target = '_blank'; 42 | const renderedComponent = renderComponent({ target }); 43 | expect(renderedComponent.prop('target')).toEqual(target); 44 | }); 45 | 46 | it('should adopt a type attribute', () => { 47 | const type = 'text/html'; 48 | const renderedComponent = renderComponent({ type }); 49 | expect(renderedComponent.prop('type')).toEqual(type); 50 | }); 51 | }); 52 | -------------------------------------------------------------------------------- /app/components/AddContactModal/index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * AddContactModal 4 | * 5 | */ 6 | 7 | import React from 'react'; 8 | import PropTypes from 'prop-types'; 9 | 10 | import { 11 | Button, 12 | Header, 13 | Icon, 14 | Image, 15 | Modal, 16 | } from 'semantic-ui-react'; 17 | 18 | 19 | class AddContactModal extends React.PureComponent { // eslint-disable-line react/prefer-stateless-function 20 | render() { 21 | const { 22 | showAdd, 23 | addContact, 24 | addContactInfo, 25 | handleAddClose, 26 | } = this.props; 27 | const name = (addContactInfo && addContactInfo.title) ? addContactInfo.title : (addContactInfo && addContactInfo.id) ? addContactInfo.id : ''; 28 | const image = (addContactInfo && addContactInfo.image) ? : null; 29 | const modalContent = `Would you like to add contact: ${name}?`; 30 | return ( 31 |
32 | 38 |
39 | 40 | {image} 41 | 42 | 43 | 46 | 49 | 50 | 51 |
52 | ); 53 | } 54 | } 55 | 56 | AddContactModal.propTypes = { 57 | showAdd: PropTypes.bool, 58 | handleClose: PropTypes.func, 59 | addContact: PropTypes.func, 60 | }; 61 | 62 | export default AddContactModal; 63 | -------------------------------------------------------------------------------- /app/components/AddContactModal/tests/index.test.js: -------------------------------------------------------------------------------- 1 | // import React from 'react'; 2 | // import { shallow } from 'enzyme'; 3 | 4 | // import AddContactModal from '../index'; 5 | 6 | describe('', () => { 7 | it('Expect to have unit tests specified', () => { 8 | expect(true).toEqual(false); 9 | }); 10 | }); 11 | -------------------------------------------------------------------------------- /app/components/Button/A.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | import buttonStyles from './buttonStyles'; 4 | 5 | const A = styled.a`${buttonStyles}`; 6 | 7 | export default A; 8 | -------------------------------------------------------------------------------- /app/components/Button/StyledButton.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | import buttonStyles from './buttonStyles'; 4 | 5 | const StyledButton = styled.button`${buttonStyles}`; 6 | 7 | export default StyledButton; 8 | -------------------------------------------------------------------------------- /app/components/Button/Wrapper.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | const Wrapper = styled.div` 4 | width: 100%; 5 | text-align: center; 6 | margin: 4em 0; 7 | `; 8 | 9 | export default Wrapper; 10 | -------------------------------------------------------------------------------- /app/components/Button/buttonStyles.js: -------------------------------------------------------------------------------- 1 | import { css } from 'styled-components'; 2 | 3 | const buttonStyles = css` 4 | display: inline-block; 5 | box-sizing: border-box; 6 | padding: 0.25em 2em; 7 | text-decoration: none; 8 | border-radius: 4px; 9 | -webkit-font-smoothing: antialiased; 10 | -webkit-touch-callout: none; 11 | user-select: none; 12 | cursor: pointer; 13 | outline: 0; 14 | font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; 15 | font-weight: bold; 16 | font-size: 16px; 17 | border: 2px solid #41addd; 18 | color: #41addd; 19 | 20 | &:active { 21 | background: #41addd; 22 | color: #fff; 23 | } 24 | `; 25 | 26 | export default buttonStyles; 27 | -------------------------------------------------------------------------------- /app/components/Button/index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * Button.js 4 | * 5 | * A common button, if you pass it a prop "route" it'll render a link to a react-router route 6 | * otherwise it'll render a link with an onclick 7 | */ 8 | 9 | import React, { Children } from 'react'; 10 | import PropTypes from 'prop-types'; 11 | 12 | import A from './A'; 13 | import StyledButton from './StyledButton'; 14 | import Wrapper from './Wrapper'; 15 | 16 | function Button(props) { 17 | // Render an anchor tag 18 | let button = ( 19 |
20 | {Children.toArray(props.children)} 21 | 22 | ); 23 | 24 | // If the Button has a handleRoute prop, we want to render a button 25 | if (props.handleRoute) { 26 | button = ( 27 | 28 | {Children.toArray(props.children)} 29 | 30 | ); 31 | } 32 | 33 | return ( 34 | 35 | {button} 36 | 37 | ); 38 | } 39 | 40 | Button.propTypes = { 41 | handleRoute: PropTypes.func, 42 | href: PropTypes.string, 43 | onClick: PropTypes.func, 44 | children: PropTypes.node.isRequired, 45 | }; 46 | 47 | export default Button; 48 | -------------------------------------------------------------------------------- /app/components/Button/tests/A.test.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { shallow } from 'enzyme'; 3 | 4 | import A from '../A'; 5 | 6 | describe('', () => { 7 | it('should render an tag', () => { 8 | const renderedComponent = shallow(); 9 | expect(renderedComponent.type()).toEqual('a'); 10 | }); 11 | 12 | it('should have a className attribute', () => { 13 | const renderedComponent = shallow(); 14 | expect(renderedComponent.prop('className')).toBeDefined(); 15 | }); 16 | 17 | it('should adopt a valid attribute', () => { 18 | const id = 'test'; 19 | const renderedComponent = shallow(); 20 | expect(renderedComponent.prop('id')).toEqual(id); 21 | }); 22 | 23 | it('should not adopt an invalid attribute', () => { 24 | const renderedComponent = shallow(); 25 | expect(renderedComponent.prop('attribute')).toBeUndefined(); 26 | }); 27 | }); 28 | -------------------------------------------------------------------------------- /app/components/Button/tests/StyledButton.test.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { shallow } from 'enzyme'; 3 | 4 | import StyledButton from '../StyledButton'; 5 | 6 | describe('', () => { 7 | it('should render an 17 | ); 18 | 19 | describe(' 42 | 45 | 46 | 47 | 48 | ); 49 | } 50 | } 51 | 52 | DeleteContactModal.propTypes = { 53 | showDelete: PropTypes.bool, 54 | handleClose: PropTypes.func, 55 | deleteContact: PropTypes.func, 56 | activeContact: PropTypes.object, 57 | }; 58 | 59 | export default DeleteContactModal; 60 | -------------------------------------------------------------------------------- /app/components/DeleteContactModal/tests/index.test.js: -------------------------------------------------------------------------------- 1 | // import React from 'react'; 2 | // import { shallow } from 'enzyme'; 3 | 4 | // import DeleteContactModal from '../index'; 5 | 6 | describe('', () => { 7 | it('Expect to have unit tests specified', () => { 8 | expect(true).toEqual(false); 9 | }); 10 | }); 11 | -------------------------------------------------------------------------------- /app/components/DeveloperSignUp/tests/index.test.js: -------------------------------------------------------------------------------- 1 | // import React from 'react'; 2 | // import { shallow } from 'enzyme'; 3 | 4 | // import DeveloperSignUp from '../index'; 5 | 6 | describe('', () => { 7 | it('Expect to have unit tests specified', () => { 8 | expect(true).toEqual(false); 9 | }); 10 | }); 11 | -------------------------------------------------------------------------------- /app/components/EmailSignUp/tests/index.test.js: -------------------------------------------------------------------------------- 1 | // import React from 'react'; 2 | // import { shallow } from 'enzyme'; 3 | 4 | // import EmailSignUp from '../index'; 5 | 6 | describe('', () => { 7 | it('Expect to have unit tests specified', () => { 8 | expect(true).toEqual(false); 9 | }); 10 | }); 11 | -------------------------------------------------------------------------------- /app/components/Faq/tests/index.test.js: -------------------------------------------------------------------------------- 1 | // import React from 'react'; 2 | // import { shallow } from 'enzyme'; 3 | 4 | // import Faq from '../index'; 5 | 6 | describe('', () => { 7 | // it('Expect to have unit tests specified', () => { 8 | // expect(true).toEqual(false); 9 | // }); 10 | }); 11 | -------------------------------------------------------------------------------- /app/components/Footer/Wrapper.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | const Wrapper = styled.footer` 4 | display: flex; 5 | justify-content: space-between; 6 | padding: 3em 0; 7 | border-top: 1px solid #666; 8 | `; 9 | 10 | export default Wrapper; 11 | -------------------------------------------------------------------------------- /app/components/Footer/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { FormattedMessage } from 'react-intl'; 3 | 4 | import A from 'components/A'; 5 | import LocaleToggle from 'containers/LocaleToggle'; 6 | import Wrapper from './Wrapper'; 7 | import messages from './messages'; 8 | 9 | function Footer() { 10 | return ( 11 | 12 |
13 | 14 |
15 |
16 | 17 |
18 |
19 | Max Stoiber, 23 | }} 24 | /> 25 |
26 | 27 | ); 28 | } 29 | 30 | export default Footer; 31 | -------------------------------------------------------------------------------- /app/components/Footer/messages.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Footer Messages 3 | * 4 | * This contains all the text for the Footer component. 5 | */ 6 | import { defineMessages } from 'react-intl'; 7 | 8 | export default defineMessages({ 9 | licenseMessage: { 10 | id: 'boilerplate.components.Footer.license.message', 11 | defaultMessage: 'This project is licensed under the MIT license.', 12 | }, 13 | authorMessage: { 14 | id: 'boilerplate.components.Footer.author.message', 15 | defaultMessage: ` 16 | Made with love by {author}. 17 | `, 18 | }, 19 | }); 20 | -------------------------------------------------------------------------------- /app/components/Footer/tests/Wrapper.test.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { shallow } from 'enzyme'; 3 | 4 | import Wrapper from '../Wrapper'; 5 | 6 | describe('', () => { 7 | it('should render an