add share modal

This commit is contained in:
catarak 2016-09-06 22:37:29 -04:00
parent 207bab20eb
commit 14a51b6332
8 changed files with 119 additions and 7 deletions

View file

@ -47,9 +47,9 @@ function Nav(props) {
if (props.project.id) { if (props.project.id) {
return ( return (
<li className="nav__item"> <li className="nav__item">
<Link to={`/full/${props.project.id}`} target="_blank"> <a onClick={props.showShareModal}>
Fullscreen Share
</Link> </a>
</li> </li>
); );
} }
@ -134,7 +134,8 @@ Nav.propTypes = {
id: PropTypes.string id: PropTypes.string
}), }),
logoutUser: PropTypes.func.isRequired, logoutUser: PropTypes.func.isRequired,
stopSketch: PropTypes.func.isRequired stopSketch: PropTypes.func.isRequired,
showShareModal: PropTypes.func.isRequired
}; };
export default Nav; export default Nav;

View file

@ -72,5 +72,8 @@ export const CLOSE_NEW_FOLDER_MODAL = 'CLOSE_NEW_FOLDER_MODAL';
export const SHOW_FOLDER_CHILDREN = 'SHOW_FOLDER_CHILDREN'; export const SHOW_FOLDER_CHILDREN = 'SHOW_FOLDER_CHILDREN';
export const HIDE_FOLDER_CHILDREN = 'HIDE_FOLDER_CHILDREN'; export const HIDE_FOLDER_CHILDREN = 'HIDE_FOLDER_CHILDREN';
export const SHOW_SHARE_MODAL = 'SHOW_SHARE_MODAL';
export const CLOSE_SHARE_MODAL = 'CLOSE_SHARE_MODAL';
// eventually, handle errors more specifically and better // eventually, handle errors more specifically and better
export const ERROR = 'ERROR'; export const ERROR = 'ERROR';

View file

@ -126,3 +126,15 @@ export function closeNewFolderModal() {
type: ActionTypes.CLOSE_NEW_FOLDER_MODAL type: ActionTypes.CLOSE_NEW_FOLDER_MODAL
}; };
} }
export function showShareModal() {
return {
type: ActionTypes.SHOW_SHARE_MODAL
};
}
export function closeShareModal() {
return {
type: ActionTypes.CLOSE_SHARE_MODAL
};
}

View file

@ -148,7 +148,7 @@ class PreviewFrame extends React.Component {
// one level down... // one level down...
htmlFile = hijackConsoleLogsScript() + htmlFile; htmlFile = hijackConsoleLogsScript() + htmlFile;
const mediaFiles = this.props.files.filder(file => file.url); const mediaFiles = this.props.files.filter(file => file.url);
const jsFiles = []; const jsFiles = [];
this.props.jsFiles.forEach(jsFile => { this.props.jsFiles.forEach(jsFile => {

View file

@ -0,0 +1,48 @@
import React, { PropTypes } from 'react';
import InlineSVG from 'react-inlinesvg';
const exitUrl = require('../../../images/exit.svg');
function ShareModal(props) {
const hostname = window.location.origin;
return (
<section className="share-modal">
<header className="share-modal__header">
<h2>Share Sketch</h2>
<button className="about__exit-button" onClick={props.closeShareModal}>
<InlineSVG src={exitUrl} alt="Close Share Overlay" />
</button>
</header>
<div className="share-modal__section">
<label className="share-modal__label">Embed</label>
<input
type="text"
className="share-modal__input"
value={`<iframe src="${hostname}/embed/${props.projectId}"></iframe>`}
/>
</div>
<div className="share-modal__section">
<label className="share-modal__label">Fullscreen</label>
<input
type="text"
className="share-modal__input"
value={`${hostname}/full/${props.projectId}`}
/>
</div>
<div className="share-modal__section">
<label className="share-modal__label">Edit</label>
<input
type="text"
className="share-modal__input"
value={`${hostname}/projects/${props.projectId}`}
/>
</div>
</section>
);
}
ShareModal.propTypes = {
projectId: PropTypes.string.isRequired,
closeShareModal: PropTypes.func.isRequired
};
export default ShareModal;

View file

@ -7,6 +7,7 @@ import TextOutput from '../components/TextOutput';
import Preferences from '../components/Preferences'; import Preferences from '../components/Preferences';
import NewFileModal from '../components/NewFileModal'; import NewFileModal from '../components/NewFileModal';
import NewFolderModal from '../components/NewFolderModal'; import NewFolderModal from '../components/NewFolderModal';
import ShareModal from '../components/ShareModal';
import Nav from '../../../components/Nav'; import Nav from '../../../components/Nav';
import Console from '../components/Console'; import Console from '../components/Console';
import { bindActionCreators } from 'redux'; import { bindActionCreators } from 'redux';
@ -121,6 +122,7 @@ class IDEView extends React.Component {
project={this.props.project} project={this.props.project}
logoutUser={this.props.logoutUser} logoutUser={this.props.logoutUser}
stopSketch={this.props.stopSketch} stopSketch={this.props.stopSketch}
showShareModal={this.props.showShareModal}
/> />
<Toolbar <Toolbar
className="Toolbar" className="Toolbar"
@ -293,6 +295,18 @@ class IDEView extends React.Component {
); );
} }
})()} })()}
{(() => { // eslint-disable-line
if (this.props.ide.shareModalVisible) {
return (
<Overlay>
<ShareModal
projectId={this.props.project.id}
closeShareModal={this.props.closeShareModal}
/>
</Overlay>
);
}
})()}
</div> </div>
); );
@ -323,7 +337,8 @@ IDEView.propTypes = {
consoleIsExpanded: PropTypes.bool.isRequired, consoleIsExpanded: PropTypes.bool.isRequired,
preferencesIsVisible: PropTypes.bool.isRequired, preferencesIsVisible: PropTypes.bool.isRequired,
projectOptionsVisible: PropTypes.bool.isRequired, projectOptionsVisible: PropTypes.bool.isRequired,
newFolderModalVisible: PropTypes.bool.isRequired newFolderModalVisible: PropTypes.bool.isRequired,
shareModalVisible: PropTypes.bool.isRequired
}).isRequired, }).isRequired,
startSketch: PropTypes.func.isRequired, startSketch: PropTypes.func.isRequired,
stopSketch: PropTypes.func.isRequired, stopSketch: PropTypes.func.isRequired,
@ -396,6 +411,8 @@ IDEView.propTypes = {
closeNewFolderModal: PropTypes.func.isRequired, closeNewFolderModal: PropTypes.func.isRequired,
createFolder: PropTypes.func.isRequired, createFolder: PropTypes.func.isRequired,
createFile: PropTypes.func.isRequired, createFile: PropTypes.func.isRequired,
showShareModal: PropTypes.func.isRequired,
closeShareModal: PropTypes.func.isRequired
}; };
function mapStateToProps(state) { function mapStateToProps(state) {

View file

@ -12,7 +12,8 @@ const initialState = {
consoleIsExpanded: false, consoleIsExpanded: false,
preferencesIsVisible: false, preferencesIsVisible: false,
projectOptionsVisible: false, projectOptionsVisible: false,
newFolderModalVisible: false newFolderModalVisible: false,
shareModalVisible: false
}; };
const ide = (state = initialState, action) => { const ide = (state = initialState, action) => {
@ -55,6 +56,10 @@ const ide = (state = initialState, action) => {
return Object.assign({}, state, { newFolderModalVisible: true }); return Object.assign({}, state, { newFolderModalVisible: true });
case ActionTypes.CLOSE_NEW_FOLDER_MODAL: case ActionTypes.CLOSE_NEW_FOLDER_MODAL:
return Object.assign({}, state, { newFolderModalVisible: false }); return Object.assign({}, state, { newFolderModalVisible: false });
case ActionTypes.SHOW_SHARE_MODAL:
return Object.assign({}, state, { shareModalVisible: true });
case ActionTypes.CLOSE_SHARE_MODAL:
return Object.assign({}, state, { shareModalVisible: false });
default: default:
return state; return state;
} }

View file

@ -48,3 +48,29 @@
width: 100%; width: 100%;
text-align: center; text-align: center;
} }
.share-modal {
@extend %modal;
padding: #{20 / $base-font-size}rem;
width: #{500 / $base-font-size}rem;
}
.share-modal__header {
display: flex;
justify-content: space-between;
}
.share-modal__section {
width: 100%;
display: flex;
align-items: center;
padding: #{10 / $base-font-size}rem 0;
}
.share-modal__label {
width: #{86 / $base-font-size}rem;
}
.share-modal__input {
flex: 1;
}