From 6d70a8026309c2d41e2402ec84875ced8e181105 Mon Sep 17 00:00:00 2001
From: Eugen <eugen@zeonfederated.com>
Date: Sun, 16 Apr 2017 20:32:00 +0200
Subject: [PATCH] Onboarding modal (#1883)

* Basic onboarding modal that's shown to users once

* Lay out pages 2 through 5, add images, style modals (#1509)

* Lay out pages 2 through 5

Added images and laid out pages 2 through 5 in the jsx file. SCSS will
come, still working on just seeing if this works at all.

* Fix jsx errors, add images to modal pages, style modal pages

* Add animations to onboarding pager changes, improve wording and styling

* Finishing touches on the onboarding

* Add missing propTypes

* Update wording
---
 app/assets/images/elephant-friend.png         | Bin 0 -> 24466 bytes
 .../components/actions/onboarding.jsx         |  14 +
 .../components/containers/mastodon.jsx        |   3 +
 .../features/ui/components/modal_root.jsx     |   2 +
 .../ui/components/onboarding_modal.jsx        | 251 ++++++++++++++++++
 .../components/reducers/settings.jsx          |   2 +
 app/assets/stylesheets/components.scss        | 238 +++++++++++++++++
 app/controllers/home_controller.rb            |   1 +
 app/views/home/initial_state.json.rabl        |   9 +-
 9 files changed, 517 insertions(+), 3 deletions(-)
 create mode 100644 app/assets/images/elephant-friend.png
 create mode 100644 app/assets/javascripts/components/actions/onboarding.jsx
 create mode 100644 app/assets/javascripts/components/features/ui/components/onboarding_modal.jsx

diff --git a/app/assets/images/elephant-friend.png b/app/assets/images/elephant-friend.png
new file mode 100644
index 0000000000000000000000000000000000000000..3c5145ba987ff14621d0632cec74e02eb3886d8b
GIT binary patch
literal 24466
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
T?k;9vU|{fc^>bP0l+XkKljJZB

literal 0
HcmV?d00001

diff --git a/app/assets/javascripts/components/actions/onboarding.jsx b/app/assets/javascripts/components/actions/onboarding.jsx
new file mode 100644
index 0000000000..a161c50efe
--- /dev/null
+++ b/app/assets/javascripts/components/actions/onboarding.jsx
@@ -0,0 +1,14 @@
+import { openModal } from './modal';
+import { changeSetting, saveSettings } from './settings';
+
+export function showOnboardingOnce() {
+  return (dispatch, getState) => {
+    const alreadySeen = getState().getIn(['settings', 'onboarded']);
+
+    if (!alreadySeen) {
+      dispatch(openModal('ONBOARDING'));
+      dispatch(changeSetting(['onboarded'], true));
+      dispatch(saveSettings());
+    }
+  };
+};
diff --git a/app/assets/javascripts/components/containers/mastodon.jsx b/app/assets/javascripts/components/containers/mastodon.jsx
index a771d12696..08576913e3 100644
--- a/app/assets/javascripts/components/containers/mastodon.jsx
+++ b/app/assets/javascripts/components/containers/mastodon.jsx
@@ -8,6 +8,7 @@ import {
   connectTimeline,
   disconnectTimeline
 } from '../actions/timelines';
+import { showOnboardingOnce } from '../actions/onboarding';
 import { updateNotifications, refreshNotifications } from '../actions/notifications';
 import createBrowserHistory from 'history/lib/createBrowserHistory';
 import {
@@ -134,6 +135,8 @@ const Mastodon = React.createClass({
     if (typeof window.Notification !== 'undefined' && Notification.permission === 'default') {
       Notification.requestPermission();
     }
+
+    store.dispatch(showOnboardingOnce());
   },
 
   componentWillUnmount () {
diff --git a/app/assets/javascripts/components/features/ui/components/modal_root.jsx b/app/assets/javascripts/components/features/ui/components/modal_root.jsx
index a1ed8fd882..ace3e085f5 100644
--- a/app/assets/javascripts/components/features/ui/components/modal_root.jsx
+++ b/app/assets/javascripts/components/features/ui/components/modal_root.jsx
@@ -1,11 +1,13 @@
 import PureRenderMixin from 'react-addons-pure-render-mixin';
 import MediaModal from './media_modal';
+import OnboardingModal from './onboarding_modal';
 import VideoModal from './video_modal';
 import BoostModal from './boost_modal';
 import { TransitionMotion, spring } from 'react-motion';
 
 const MODAL_COMPONENTS = {
   'MEDIA': MediaModal,
+  'ONBOARDING': OnboardingModal,
   'VIDEO': VideoModal,
   'BOOST': BoostModal
 };
diff --git a/app/assets/javascripts/components/features/ui/components/onboarding_modal.jsx b/app/assets/javascripts/components/features/ui/components/onboarding_modal.jsx
new file mode 100644
index 0000000000..8d5132ea25
--- /dev/null
+++ b/app/assets/javascripts/components/features/ui/components/onboarding_modal.jsx
@@ -0,0 +1,251 @@
+import { connect } from 'react-redux';
+import PureRenderMixin from 'react-addons-pure-render-mixin';
+import ImmutablePropTypes from 'react-immutable-proptypes';
+import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
+import Permalink from '../../../components/permalink';
+import { TransitionMotion, spring } from 'react-motion';
+import ComposeForm from '../../compose/components/compose_form';
+import Search from '../../compose/components/search';
+import NavigationBar from '../../compose/components/navigation_bar';
+import ColumnHeader from './column_header';
+import Immutable from 'immutable';
+
+const messages = defineMessages({
+  home_title: { id: 'column.home', defaultMessage: 'Home' },
+  notifications_title: { id: 'column.notifications', defaultMessage: 'Notifications' },
+  local_title: { id: 'column.community', defaultMessage: 'Local timeline' },
+  federated_title: { id: 'column.public', defaultMessage: 'Federated timeline' }
+});
+
+const PageOne = ({ acct, domain }) => (
+  <div className='onboarding-modal__page onboarding-modal__page-one'>
+    <div style={{ flex: '0 0 auto' }}>
+      <div className='onboarding-modal__page-one__elephant-friend' />
+    </div>
+
+    <div>
+      <h1><FormattedMessage id='onboarding.page_one.welcome' defaultMessage='Welcome to Mastodon!' /></h1>
+      <p><FormattedMessage id='onboarding.page_one.federation' defaultMessage='Mastodon is a social network that belongs to everyone.' /></p>
+      <p><FormattedMessage id='onboarding.page_one.handle' defaultMessage='You are on {domain}, one of many independent Mastodon instances. Your full handle is {handle}' values={{ domain, handle: <strong>{acct}@{domain}</strong> }}/></p>
+    </div>
+  </div>
+);
+
+PageOne.propTypes = {
+  acct: React.PropTypes.string.isRequired,
+  domain: React.PropTypes.string.isRequired
+};
+
+const PageTwo = () => (
+  <div className='onboarding-modal__page onboarding-modal__page-two'>
+    <div className='figure non-interactive'>
+      <ComposeForm
+        text='Awoo! #introductions'
+        suggestions={Immutable.List()}
+        mentionedDomains={[]}
+        onChange={() => {}}
+        onSubmit={() => {}}
+        onPaste={() => {}}
+        onPickEmoji={() => {}}
+        onChangeSpoilerText={() => {}}
+        onClearSuggestions={() => {}}
+        onFetchSuggestions={() => {}}
+        onSuggestionSelected={() => {}}
+      />
+    </div>
+
+    <p><FormattedMessage id='onboarding.page_two.compose' defaultMessage='Write posts from the compose column. You can upload images, change privacy settings, and add content warnings with the icons below.' /></p>
+  </div>
+);
+
+const PageThree = ({ me, domain }) => (
+  <div className='onboarding-modal__page onboarding-modal__page-three'>
+    <div className='figure non-interactive'>
+      <Search
+        value=''
+        onChange={() => {}}
+        onSubmit={() => {}}
+        onClear={() => {}}
+        onShow={() => {}}
+      />
+
+      <div className='pseudo-drawer'>
+        <NavigationBar account={me} />
+      </div>
+    </div>
+
+    <p><FormattedMessage id='onboarding.page_three.search' defaultMessage='Use the search bar to find people and look at hashtags, such as {illustration} and {introductions}. To look for a person who is not on this instance, use their full handle.' values={{ illustration: <Permalink to='/timelines/tag/illustration' href='/tags/illustration'>#illustration</Permalink>, introductions: <Permalink to='/timelines/tag/introductions' href='/tags/introductions'>#introductions</Permalink> }}/></p>
+    <p><FormattedMessage id='onboarding.page_three.profile' defaultMessage='Edit your profile to change your avatar, bio, and display name. There, you will also find other preferences.' /></p>
+  </div>
+);
+
+PageThree.propTypes = {
+  me: ImmutablePropTypes.map.isRequired,
+  domain: React.PropTypes.string.isRequired
+};
+
+const PageFour = ({ domain, intl }) => (
+  <div className='onboarding-modal__page onboarding-modal__page-four'>
+    <div className='onboarding-modal__page-four__columns'>
+      <div className='row'>
+        <div>
+          <div className='figure non-interactive'><ColumnHeader icon='home' type={intl.formatMessage(messages.home_title)} /></div>
+          <p><FormattedMessage id='onboarding.page_four.home' defaultMessage='Home timeline shows posts from people you follow'/></p>
+        </div>
+
+        <div>
+          <div className='figure non-interactive'><ColumnHeader icon='bell' type={intl.formatMessage(messages.notifications_title)} /></div>
+          <p><FormattedMessage id='onboarding.page_four.notifications' defaultMessage='Notifications show when someone interacts with you' /></p>
+        </div>
+      </div>
+
+      <div className='row'>
+        <div>
+          <div className='figure non-interactive' style={{ marginBottom: 0 }}><ColumnHeader icon='globe' type={intl.formatMessage(messages.federated_title)} /></div>
+        </div>
+
+        <div>
+          <div className='figure non-interactive' style={{ marginBottom: 0 }}><ColumnHeader icon='users' type={intl.formatMessage(messages.local_title)} /></div>
+        </div>
+      </div>
+
+      <p><FormattedMessage id='onboarding.page_five.public_timelines' defaultMessage='Federated timeline lists public posts from everyone who people on {domain} follow. Local timeline is the same, but limited to people on {domain}.' values={{ domain }} /></p>
+    </div>
+  </div>
+);
+
+PageFour.propTypes = {
+  domain: React.PropTypes.string.isRequired,
+  intl: React.PropTypes.object.isRequired
+};
+
+const PageSix = ({ admin }) => {
+  let adminSection = '';
+
+  if (admin) {
+    adminSection = (
+      <p>
+        <FormattedMessage id='onboarding.page_six.admin' defaultMessage="Your instance's admin is {admin}." values={{ admin: <Permalink href={admin.get('url')} to={`/accounts/${admin.get('id')}`}>@{admin.get('acct')}</Permalink> }} />
+        <br />
+        <FormattedMessage id='onboarding.page_six.read_guidelines' defaultMessage='Please, do not forget to read the {guidelines}!' values={{ guidelines: <a href='/about/more' target='_blank'><FormattedMessage id='onboarding.page_six.guidelines' defaultMessage='community guidelines' /></a> }}/>
+      </p>
+    );
+  }
+
+  return (
+    <div className='onboarding-modal__page onboarding-modal__page-six'>
+      <h1><FormattedMessage id='onboarding.page_six.almost_done' defaultMessage='Almost done...' /></h1>
+      {adminSection}
+      <p><FormattedMessage id='onboarding.page_six.github' defaultMessage='Mastodon is free open-source software. You can report bugs, request features, or contribute to the code on {github}.' values={{ github: <a href='https://github.com/tootsuite/mastodon' target='_blank' rel='noopener'>GitHub</a> }} /></p>
+      <p><FormattedMessage id='onboarding.page_six.apps_available' defaultMessage='There are {apps} available for iOS, Android and other platforms. And now... Bon Appetoot!' values={{ apps: <a href='https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/Apps.md' target='_blank' rel='noopener'><FormattedMessage id='onboarding.page_six.various_app' defaultMessage='various mobile apps' /></a> }} /></p>
+    </div>
+  );
+};
+
+PageSix.propTypes = {
+  admin: ImmutablePropTypes.map
+};
+
+const mapStateToProps = state => ({
+  me: state.getIn(['accounts', state.getIn(['meta', 'me'])]),
+  admin: state.getIn(['accounts', state.getIn(['meta', 'admin'])]),
+  domain: state.getIn(['meta', 'domain'])
+});
+
+const OnboardingModal = React.createClass({
+
+  propTypes: {
+    onClose: React.PropTypes.func.isRequired,
+    intl: React.PropTypes.object.isRequired,
+    me: ImmutablePropTypes.map.isRequired,
+    domain: React.PropTypes.string.isRequired,
+    admin: ImmutablePropTypes.map
+  },
+
+  getInitialState () {
+    return {
+      currentIndex: 0
+    };
+  },
+
+  mixins: [PureRenderMixin],
+
+  handleSkip (e) {
+    e.preventDefault();
+    this.props.onClose();
+  },
+
+  handleDot (i, e) {
+    e.preventDefault();
+    this.setState({ currentIndex: i });
+  },
+
+  handleNext (maxNum, e) {
+    e.preventDefault();
+
+    if (this.state.currentIndex < maxNum - 1) {
+      this.setState({ currentIndex: this.state.currentIndex + 1 });
+    } else {
+      this.props.onClose();
+    }
+  },
+
+  render () {
+    const { me, admin, domain, intl } = this.props;
+
+    const pages = [
+      <PageOne acct={me.get('acct')} domain={domain} />,
+      <PageTwo />,
+      <PageThree me={me} domain={domain} />,
+      <PageFour domain={domain} intl={intl} />,
+      <PageSix admin={admin} />
+    ];
+
+    const { currentIndex } = this.state;
+    const hasMore = currentIndex < pages.length - 1;
+
+    let nextOrDoneBtn;
+
+    if(hasMore) {
+      nextOrDoneBtn = <a href='#' onClick={this.handleNext.bind(null, pages.length)} className='onboarding-modal__nav onboarding-modal__next'><FormattedMessage id='onboarding.next' defaultMessage='Next' /></a>;
+    } else {
+      nextOrDoneBtn = <a href='#' onClick={this.handleNext.bind(null, pages.length)} className='onboarding-modal__nav onboarding-modal__done'><FormattedMessage id='onboarding.next' defaultMessage='Done' /></a>;
+    }
+
+    const styles = pages.map((page, i) => ({
+      key: i,
+      style: { opacity: spring(i === currentIndex ? 1 : 0) }
+    }));
+
+    return (
+      <div className='modal-root__modal onboarding-modal'>
+        <TransitionMotion styles={styles}>
+          {interpolatedStyles =>
+            <div className='onboarding-modal__pager'>
+              {pages.map((page, i) =>
+                <div key={i} style={{ opacity: interpolatedStyles[i].style.opacity, pointerEvents: i === currentIndex ? 'auto' : 'none' }}>{page}</div>
+              )}
+            </div>
+          }
+        </TransitionMotion>
+
+        <div className='onboarding-modal__paginator'>
+          <div>
+            <a href='#' className='onboarding-modal__skip' onClick={this.handleSkip}><FormattedMessage id='onboarding.skip' defaultMessage='Skip' /></a>
+          </div>
+
+          <div className='onboarding-modal__dots'>
+            {pages.map((_, i) => <div key={i} onClick={this.handleDot.bind(null, i)} className={`onboarding-modal__dot ${i === currentIndex ? 'active' : ''}`} />)}
+          </div>
+
+          <div>
+            {nextOrDoneBtn}
+          </div>
+        </div>
+      </div>
+    );
+  }
+
+});
+
+export default connect(mapStateToProps)(injectIntl(OnboardingModal));
diff --git a/app/assets/javascripts/components/reducers/settings.jsx b/app/assets/javascripts/components/reducers/settings.jsx
index 8acc3facaf..820af99edb 100644
--- a/app/assets/javascripts/components/reducers/settings.jsx
+++ b/app/assets/javascripts/components/reducers/settings.jsx
@@ -3,6 +3,8 @@ import { STORE_HYDRATE } from '../actions/store';
 import Immutable from 'immutable';
 
 const initialState = Immutable.Map({
+  onboarded: false,
+
   home: Immutable.Map({
     shows: Immutable.Map({
       reblog: true,
diff --git a/app/assets/stylesheets/components.scss b/app/assets/stylesheets/components.scss
index 8bd35819a9..84344e94d4 100644
--- a/app/assets/stylesheets/components.scss
+++ b/app/assets/stylesheets/components.scss
@@ -932,6 +932,12 @@ a.status__content__spoiler-link {
   }
 }
 
+.pseudo-drawer {
+  background: lighten($color1, 13%);
+  font-size: 13px;
+  text-align: left;
+}
+
 .drawer__header {
   flex: 0 0 auto;
   font-size: 16px;
@@ -2018,6 +2024,7 @@ button.icon-button.active i.fa-retweet {
 .modal-root__modal {
   pointer-events: auto;
   display: flex;
+  z-index: 9999;
 }
 
 .media-modal {
@@ -2031,6 +2038,237 @@ button.icon-button.active i.fa-retweet {
   }
 }
 
+.onboarding-modal {
+  background: $color2;
+  color: $color1;
+  border-radius: 8px;
+  overflow: hidden;
+  display: flex;
+  flex-direction: column;
+}
+
+.onboarding-modal__pager {
+  height: 80vh;
+  width: 80vw;
+  max-width: 500px;
+  max-height: 350px;
+  position: relative;
+
+  & > div {
+    position: absolute;
+    top: 0;
+    left: 0;
+    width: 100%;
+    height: 100%;
+    box-sizing: border-box;
+    padding: 25px;
+    display: none;
+    flex-direction: column;
+    align-items: center;
+    justify-content: center;
+    display: flex;
+    opacity: 0;
+    user-select: text;
+  }
+}
+
+@media screen and (max-width: 550px) {
+  .onboarding-modal {
+    width: 100%;
+    height: 100%;
+    border-radius: 0;
+  }
+
+  .onboarding-modal__pager {
+    width: 100%;
+    height: auto;
+    max-width: none;
+    max-height: none;
+    flex: 1 1 auto;
+  }
+}
+
+.onboarding-modal__paginator {
+  flex: 0 0 auto;
+  background: darken($color2, 8%);
+  display: flex;
+  padding: 25px;
+
+  & > div {
+    min-width: 33px;
+  }
+
+  a {
+    color: darken($color2, 34%);
+    text-decoration: none;
+    font-size: 14px;
+    font-weight: 500;
+
+    &:hover, &:focus, &:active {
+      color: darken($color2, 38%);
+    }
+
+    &.onboarding-modal__done, &.onboarding-modal__next {
+      color: $color4;
+    }
+  }
+}
+
+.onboarding-modal__dots {
+  flex: 1 1 auto;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+
+.onboarding-modal__dot {
+  width: 14px;
+  height: 14px;
+  border-radius: 14px;
+  background: darken($color2, 16%);
+  margin: 0 3px;
+  cursor: pointer;
+
+  &:hover {
+    background: darken($color2, 18%);
+  }
+
+  &.active {
+    cursor: default;
+    background: darken($color2, 24%);
+  }
+}
+
+.onboarding-modal__page {
+  cursor: default;
+  line-height: 21px;
+
+  h1 {
+    font-size: 18px;
+    font-weight: 500;
+    color: $color1;
+    margin-bottom: 20px;
+  }
+
+  a {
+    color: $color4;
+
+    &:hover, &:focus, &:active {
+      color: lighten($color4, 4%);
+    }
+  }
+
+  p {
+    font-size: 16px;
+    color: lighten($color1, 8%);
+    margin-top: 10px;
+    margin-bottom: 10px;
+
+    &:last-child {
+      margin-bottom: 0;
+    }
+
+    strong {
+      font-weight: 500;
+      background: $color1;
+      color: $color2;
+      border-radius: 4px;
+      font-size: 14px;
+      padding: 3px 6px;
+    }
+  }
+}
+
+.onboarding-modal__page-one {
+  display: flex;
+}
+
+.onboarding-modal__page-one__elephant-friend {
+  background: image-url('elephant-friend.png') no-repeat 0 0;
+  width: 147px;
+  height: 160px;
+  margin-right: 10px;
+}
+
+.onboarding-modal__page-two,
+.onboarding-modal__page-three,
+.onboarding-modal__page-four,
+.onboarding-modal__page-five {
+  p {
+    text-align: left;
+  }
+
+  .figure {
+    background: darken($color1, 8%);
+    color: $color2;
+    margin-bottom: 20px;
+    border-radius: 4px;
+    padding: 10px;
+    text-align: center;
+    font-size: 14px;
+    box-shadow: 1px 2px 6px rgba($color8, 0.3);
+
+    .onboarding-modal__image {
+      border-radius: 4px;
+      margin-bottom: 10px;
+    }
+
+    &.non-interactive {
+      pointer-events: none;
+      text-align: left;
+    }
+  }
+}
+
+.onboarding-modal__page-four__columns {
+  .row {
+    display: flex;
+    margin-bottom: 20px;
+
+    & > div {
+      flex: 1 1 0;
+      margin: 0 10px;
+
+      &:first-child {
+        margin-left: 0;
+      }
+
+      &:last-child {
+        margin-right: 0;
+      }
+
+      p {
+        text-align: center;
+      }
+    }
+
+    &:last-child {
+      margin-bottom: 0;
+    }
+  }
+
+  .column-header {
+    color: $color5;
+  }
+}
+
+.onboarding-modal__image {
+  border-radius: 8px;
+  width: 70vw;
+  max-width: 450px;
+  max-height: auto;
+  display: block;
+  margin: auto;
+  margin-bottom: 20px;
+}
+
+.onboard-sliders {
+  display: inline-block;
+  max-width: 30px;
+  max-height: auto;
+  margin-left: 10px;
+}
+
 .boost-modal {
   background: lighten($color2, 8%);
   color: $color1;
diff --git a/app/controllers/home_controller.rb b/app/controllers/home_controller.rb
index 2d1cf74f03..0a25b52aa3 100644
--- a/app/controllers/home_controller.rb
+++ b/app/controllers/home_controller.rb
@@ -7,6 +7,7 @@ class HomeController < ApplicationController
     @body_classes           = 'app-body'
     @token                  = find_or_create_access_token.token
     @web_settings           = Web::Setting.find_by(user: current_user)&.data || {}
+    @admin                  = Account.find_local(Setting.site_contact_username)
     @streaming_api_base_url = Rails.configuration.x.streaming_api_base_url
   end
 
diff --git a/app/views/home/initial_state.json.rabl b/app/views/home/initial_state.json.rabl
index 9f94e6141d..ce7bfbd44c 100644
--- a/app/views/home/initial_state.json.rabl
+++ b/app/views/home/initial_state.json.rabl
@@ -5,7 +5,9 @@ node(:meta) do
     streaming_api_base_url: @streaming_api_base_url,
     access_token: @token,
     locale: I18n.locale,
+    domain: Rails.configuration.x.local_domain,
     me: current_account.id,
+    admin: @admin.try(:id),
     boost_modal: current_account.user.setting_boost_modal,
   }
 end
@@ -18,9 +20,10 @@ node(:compose) do
 end
 
 node(:accounts) do
-  {
-    current_account.id => partial('api/v1/accounts/show', object: current_account),
-  }
+  store = {}
+  store[current_account.id] = partial('api/v1/accounts/show', object: current_account)
+  store[@admin.id] = partial('api/v1/accounts/show', object: @admin) unless @admin.nil?
+  store
 end
 
 node(:settings) { @web_settings }
-- 
GitLab