Files
mattermost/webapp/components/tutorial/tutorial_intro_screens.jsx

263 lines
8.6 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved.
// See License.txt for license information.
import UserStore from 'stores/user_store.jsx';
import TeamStore from 'stores/team_store.jsx';
import PreferenceStore from 'stores/preference_store.jsx';
import * as Utils from 'utils/utils.jsx';
import * as AsyncClient from 'utils/async_client.jsx';
import Constants from 'utils/constants.jsx';
import {FormattedMessage, FormattedHTMLMessage} from 'react-intl';
import {browserHistory} from 'react-router';
const Preferences = Constants.Preferences;
const NUM_SCREENS = 3;
import React from 'react';
export default class TutorialIntroScreens extends React.Component {
static get propTypes() {
return {
townSquare: React.PropTypes.object,
offTopic: React.PropTypes.object
};
}
constructor(props) {
super(props);
this.handleNext = this.handleNext.bind(this);
this.createScreen = this.createScreen.bind(this);
this.createCircles = this.createCircles.bind(this);
this.state = {currentScreen: 0};
}
handleNext() {
if (this.state.currentScreen < 2) {
this.setState({currentScreen: this.state.currentScreen + 1});
return;
}
browserHistory.push(TeamStore.getCurrentTeamUrl() + '/channels/town-square');
const step = PreferenceStore.getInt(Preferences.TUTORIAL_STEP, UserStore.getCurrentId(), 0);
AsyncClient.savePreference(
Preferences.TUTORIAL_STEP,
UserStore.getCurrentId(),
(step + 1).toString()
);
}
skipTutorial(e) {
e.preventDefault();
AsyncClient.savePreference(
Preferences.TUTORIAL_STEP,
UserStore.getCurrentId(),
'999'
);
browserHistory.push(TeamStore.getCurrentTeamUrl() + '/channels/town-square');
}
createScreen() {
switch (this.state.currentScreen) {
case 0:
return this.createScreenOne();
case 1:
return this.createScreenTwo();
case 2:
return this.createScreenThree();
}
return null;
}
createScreenOne() {
const circles = this.createCircles();
return (
<div>
<FormattedHTMLMessage
id='tutorial_intro.screenOne'
defaultMessage='<h3>Welcome to:</h3>
<h1>Mattermost</h1>
<p>Your team communication all in one place, instantly searchable and available anywhere</p>
<p>Keep your team connected to help them achieve what matters most.</p>'
/>
{circles}
</div>
);
}
createScreenTwo() {
const circles = this.createCircles();
return (
<div>
<FormattedHTMLMessage
id='tutorial_intro.screenTwo'
defaultMessage='<h3>How Mattermost works:</h3>
<p>Communication happens in public discussion channels, private groups and direct messages.</p>
<p>Everything is archived and searchable from any web-enabled desktop, laptop or phone.</p>'
/>
{circles}
</div>
);
}
createScreenThree() {
const team = TeamStore.getCurrent();
let inviteModalLink;
if (team.type === Constants.INVITE_TEAM) {
inviteModalLink = (
<a
className='intro-links'
href='#'
data-toggle='modal'
data-target='#invite_member'
>
<FormattedMessage
id='tutorial_intro.invite'
defaultMessage='Invite teammates'
/>
</a>
);
} else {
inviteModalLink = (
<a
className='intro-links'
href='#'
data-toggle='modal'
data-target='#get_link'
data-title='Team Invite'
data-value={Utils.getWindowLocationOrigin() + '/signup_user_complete/?id=' + team.id}
>
<FormattedMessage
id='tutorial_intro.teamInvite'
defaultMessage='Team Invite'
/>
</a>
);
}
const circles = this.createCircles();
let supportInfo = null;
if (global.window.mm_config.SupportEmail) {
supportInfo = (
<p>
<FormattedMessage
id='tutorial_intro.support'
defaultMessage='Need anything, just email us at '
/>
<a
href={'mailto:' + global.window.mm_config.SupportEmail}
target='_blank'
>
{global.window.mm_config.SupportEmail}
</a>
{'.'}
</p>
);
}
let townSquareDisplayName = Constants.DEFAULT_CHANNEL_UI_NAME;
if (this.props.townSquare) {
townSquareDisplayName = this.props.townSquare.display_name;
}
return (
<div>
<h3>
<FormattedMessage
id='tutorial_intro.allSet'
defaultMessage='Youre all set'
/>
</h3>
<p>
{inviteModalLink}
<FormattedMessage
id='tutorial_intro.whenReady'
defaultMessage=' when youre ready.'
/>
</p>
{supportInfo}
<FormattedMessage
id='tutorial_intro.end'
defaultMessage='Click “Next” to enter {channel}. This is the first channel teammates see when they sign up. Use it for posting updates everyone needs to know.'
values={{
channel: townSquareDisplayName
}}
/>
{circles}
</div>
);
}
createCircles() {
const circles = [];
for (let i = 0; i < NUM_SCREENS; i++) {
let className = 'circle';
if (i === this.state.currentScreen) {
className += ' active';
}
circles.push(
<a
href='#'
key={'circle' + i}
className={className}
onClick={(e) => { //eslint-disable-line no-loop-func
e.preventDefault();
this.setState({currentScreen: i});
}}
/>
);
}
return (
<div className='tutorial__circles'>
{circles}
</div>
);
}
render() {
const height = Utils.windowHeight() - 100;
const screen = this.createScreen();
return (
<div
className='tutorials__scroll'
style={{height}}
>
<div className='tutorial-steps__container'>
<div className='tutorial__content'>
<div className='tutorial__steps'>
{screen}
<div className='tutorial__footer'>
<button
className='btn btn-primary'
tabIndex='1'
onClick={this.handleNext}
>
<FormattedMessage
id='tutorial_intro.next'
defaultMessage='Next'
/>
</button>
<a
className='tutorial-skip'
href='#'
onClick={this.skipTutorial}
>
<FormattedMessage
id='tutorial_intro.skip'
defaultMessage='Skip tutorial'
/>
</a>
</div>
</div>
</div>
</div>
</div>
);
}
}