1 line
18 KiB
Plaintext
1 line
18 KiB
Plaintext
{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/flavours/glitch/features/ui/components/onboarding_modal.js"],"names":["noop","messages","defineMessages","home_title","notifications_title","local_title","federated_title","PageOne","acct","domain","className","style","flex","id","defaultMessage","values","handle","PageTwo","intl","myAccount","account","privacy","text","spoilerText","suggestions","PageThree","value","onChange","onSubmit","onClear","onShow","illustration","to","href","introductions","PageFour","icon","type","formatMessage","marginBottom","PageSix","admin","adminSection","get","guidelines","target","fork","rel","Mastodon","github","apps","OnboardingModal","connect","state","getIn","me","injectIntl","currentIndex","e","preventDefault","props","onClose","i","Number","currentTarget","getAttribute","setState","Math","max","pages","min","length","index","key","handlePrev","handleNext","componentWillMount","this","componentDidMount","window","addEventListener","handleKeyUp","componentWillUnmount","render","nextOrDoneBtn","onClick","handleClose","onChangeIndex","handleSwipe","map","page","classNames","handleSkip","_","active","role","tabIndex","data-index","handleDot","React","PureComponent"],"mappings":"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","file":"flavours/glitch/async/onboarding_modal.js","sourcesContent":["import React from 'react';\nimport { connect } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport ReactSwipeableViews from 'react-swipeable-views';\nimport classNames from 'classnames';\nimport Permalink from 'flavours/glitch/components/permalink';\nimport ComposeForm from 'flavours/glitch/features/compose/components/compose_form';\nimport DrawerAccount from 'flavours/glitch/features/compose/components/navigation_bar';\nimport Search from 'flavours/glitch/features/compose/components/search';\nimport ColumnHeader from './column_header';\nimport { me } from 'flavours/glitch/util/initial_state';\n\nconst noop = () => { };\n\nconst messages = defineMessages({\n home_title: { id: 'column.home', defaultMessage: 'Home' },\n notifications_title: { id: 'column.notifications', defaultMessage: 'Notifications' },\n local_title: { id: 'column.community', defaultMessage: 'Local timeline' },\n federated_title: { id: 'column.public', defaultMessage: 'Federated timeline' },\n});\n\nconst PageOne = ({ acct, domain }) => (\n <div className='onboarding-modal__page onboarding-modal__page-one'>\n <div style={{ flex: '0 0 auto' }}>\n <div className='onboarding-modal__page-one__elephant-friend' />\n </div>\n\n <div>\n <h1><FormattedMessage id='onboarding.page_one.welcome' defaultMessage='Welcome to {domain}!' values={{ domain }} /></h1>\n <p><FormattedMessage id='onboarding.page_one.federation' defaultMessage='{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.' values={{ domain }} /></p>\n <p><FormattedMessage id='onboarding.page_one.handle' defaultMessage='You are on {domain}, so your full handle is {handle}' values={{ domain, handle: <strong>@{acct}@{domain}</strong> }} /></p>\n </div>\n </div>\n);\n\nPageOne.propTypes = {\n acct: PropTypes.string.isRequired,\n domain: PropTypes.string.isRequired,\n};\n\nconst PageTwo = ({ intl, myAccount }) => (\n <div className='onboarding-modal__page onboarding-modal__page-two'>\n <div className='figure non-interactive'>\n <div className='pseudo-drawer'>\n <DrawerAccount account={myAccount} />\n <ComposeForm\n privacy='public'\n text='Awoo! #introductions'\n spoilerText=''\n suggestions={ [] }\n />\n </div>\n </div>\n\n <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>\n </div>\n);\n\nPageTwo.propTypes = {\n intl: PropTypes.object.isRequired,\n myAccount: ImmutablePropTypes.map.isRequired,\n};\n\nconst PageThree = ({ intl, myAccount }) => (\n <div className='onboarding-modal__page onboarding-modal__page-three'>\n <div className='figure non-interactive'>\n <Search\n value=''\n onChange={noop}\n onSubmit={noop}\n onClear={noop}\n onShow={noop}\n />\n\n <div className='pseudo-drawer'>\n <DrawerAccount account={myAccount} />\n </div>\n </div>\n\n <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>\n <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>\n </div>\n);\n\nPageThree.propTypes = {\n intl: PropTypes.object.isRequired,\n myAccount: ImmutablePropTypes.map.isRequired,\n};\n\nconst PageFour = ({ domain, intl }) => (\n <div className='onboarding-modal__page onboarding-modal__page-four'>\n <div className='onboarding-modal__page-four__columns'>\n <div className='row'>\n <div>\n <div className='figure non-interactive'><ColumnHeader icon='home' type={intl.formatMessage(messages.home_title)} /></div>\n <p><FormattedMessage id='onboarding.page_four.home' defaultMessage='The home timeline shows posts from people you follow.' /></p>\n </div>\n\n <div>\n <div className='figure non-interactive'><ColumnHeader icon='bell' type={intl.formatMessage(messages.notifications_title)} /></div>\n <p><FormattedMessage id='onboarding.page_four.notifications' defaultMessage='The notifications column shows when someone interacts with you.' /></p>\n </div>\n </div>\n\n <div className='row'>\n <div>\n <div className='figure non-interactive' style={{ marginBottom: 0 }}><ColumnHeader icon='users' type={intl.formatMessage(messages.local_title)} /></div>\n </div>\n\n <div>\n <div className='figure non-interactive' style={{ marginBottom: 0 }}><ColumnHeader icon='globe' type={intl.formatMessage(messages.federated_title)} /></div>\n </div>\n </div>\n\n <p><FormattedMessage id='onboarding.page_five.public_timelines' defaultMessage='The local timeline shows public posts from everyone on {domain}. The federated timeline shows public posts from everyone who people on {domain} follow. These are the Public Timelines, a great way to discover new people.' values={{ domain }} /></p>\n </div>\n </div>\n);\n\nPageFour.propTypes = {\n domain: PropTypes.string.isRequired,\n intl: PropTypes.object.isRequired,\n};\n\nconst PageSix = ({ admin, domain }) => {\n let adminSection = '';\n\n if (admin) {\n adminSection = (\n <p>\n <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> }} />\n <br />\n <FormattedMessage id='onboarding.page_six.read_guidelines' defaultMessage=\"Please read {domain}'s {guidelines}!\" values={{ domain, guidelines: <a href='/about/more' target='_blank'><FormattedMessage id='onboarding.page_six.guidelines' defaultMessage='community guidelines' /></a> }} />\n </p>\n );\n }\n\n return (\n <div className='onboarding-modal__page onboarding-modal__page-six'>\n <h1><FormattedMessage id='onboarding.page_six.almost_done' defaultMessage='Almost done...' /></h1>\n {adminSection}\n <p><FormattedMessage id='onboarding.page_six.github' defaultMessage='{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.' values={{ domain, fork: <a href='https://en.wikipedia.org/wiki/Fork_(software_development)' target='_blank' rel='noopener'>fork</a>, Mastodon: <a href='https://github.com/tootsuite/mastodon' target='_blank' rel='noopener'>Mastodon</a>, github: <a href='https://github.com/glitch-soc/mastodon' target='_blank' rel='noopener'>GitHub</a> }} /></p>\n <p><FormattedMessage id='onboarding.page_six.apps_available' defaultMessage='There are {apps} available for iOS, Android and other platforms.' values={{ domain, apps: <a href='https://joinmastodon.org/apps' target='_blank' rel='noopener'><FormattedMessage id='onboarding.page_six.various_app' defaultMessage='mobile apps' /></a> }} /></p>\n <p><em><FormattedMessage id='onboarding.page_six.appetoot' defaultMessage='Bon Appetoot!' /></em></p>\n </div>\n );\n};\n\nPageSix.propTypes = {\n admin: ImmutablePropTypes.map,\n domain: PropTypes.string.isRequired,\n};\n\nconst mapStateToProps = state => ({\n myAccount: state.getIn(['accounts', me]),\n admin: state.getIn(['accounts', state.getIn(['meta', 'admin'])]),\n domain: state.getIn(['meta', 'domain']),\n});\n\nexport default @connect(mapStateToProps)\n@injectIntl\nclass OnboardingModal extends React.PureComponent {\n\n static propTypes = {\n onClose: PropTypes.func.isRequired,\n intl: PropTypes.object.isRequired,\n myAccount: ImmutablePropTypes.map.isRequired,\n domain: PropTypes.string.isRequired,\n admin: ImmutablePropTypes.map,\n };\n\n state = {\n currentIndex: 0,\n };\n\n componentWillMount() {\n const { myAccount, admin, domain, intl } = this.props;\n this.pages = [\n <PageOne acct={myAccount.get('acct')} domain={domain} />,\n <PageTwo myAccount={myAccount} intl={intl} />,\n <PageThree myAccount={myAccount} intl={intl} />,\n <PageFour domain={domain} intl={intl} />,\n <PageSix admin={admin} domain={domain} />,\n ];\n };\n\n componentDidMount() {\n window.addEventListener('keyup', this.handleKeyUp);\n }\n\n componentWillUnmount() {\n window.addEventListener('keyup', this.handleKeyUp);\n }\n\n handleSkip = (e) => {\n e.preventDefault();\n this.props.onClose();\n }\n\n handleDot = (e) => {\n const i = Number(e.currentTarget.getAttribute('data-index'));\n e.preventDefault();\n this.setState({ currentIndex: i });\n }\n\n handlePrev = () => {\n this.setState(({ currentIndex }) => ({\n currentIndex: Math.max(0, currentIndex - 1),\n }));\n }\n\n handleNext = () => {\n const { pages } = this;\n this.setState(({ currentIndex }) => ({\n currentIndex: Math.min(currentIndex + 1, pages.length - 1),\n }));\n }\n\n handleSwipe = (index) => {\n this.setState({ currentIndex: index });\n }\n\n handleKeyUp = ({ key }) => {\n switch (key) {\n case 'ArrowLeft':\n this.handlePrev();\n break;\n case 'ArrowRight':\n this.handleNext();\n break;\n }\n }\n\n handleClose = () => {\n this.props.onClose();\n }\n\n render () {\n const { pages } = this;\n const { currentIndex } = this.state;\n const hasMore = currentIndex < pages.length - 1;\n\n const nextOrDoneBtn = hasMore ? (\n <button\n onClick={this.handleNext}\n className='onboarding-modal__nav onboarding-modal__next'\n >\n <FormattedMessage id='onboarding.next' defaultMessage='Next' />\n </button>\n ) : (\n <button\n onClick={this.handleClose}\n className='onboarding-modal__nav onboarding-modal__done'\n >\n <FormattedMessage id='onboarding.done' defaultMessage='Done' />\n </button>\n );\n\n return (\n <div className='modal-root__modal onboarding-modal'>\n <ReactSwipeableViews index={currentIndex} onChangeIndex={this.handleSwipe} className='onboarding-modal__pager'>\n {pages.map((page, i) => {\n const className = classNames('onboarding-modal__page__wrapper', {\n 'onboarding-modal__page__wrapper--active': i === currentIndex,\n });\n return (\n <div key={i} className={className}>{page}</div>\n );\n })}\n </ReactSwipeableViews>\n\n <div className='onboarding-modal__paginator'>\n <div>\n <button\n onClick={this.handleSkip}\n className='onboarding-modal__nav onboarding-modal__skip'\n >\n <FormattedMessage id='onboarding.skip' defaultMessage='Skip' />\n </button>\n </div>\n\n <div className='onboarding-modal__dots'>\n {pages.map((_, i) => {\n const className = classNames('onboarding-modal__dot', {\n active: i === currentIndex,\n });\n return (\n <div\n key={`dot-${i}`}\n role='button'\n tabIndex='0'\n data-index={i}\n onClick={this.handleDot}\n className={className}\n />\n );\n })}\n </div>\n\n <div>\n {nextOrDoneBtn}\n </div>\n </div>\n </div>\n );\n }\n\n}\n"],"sourceRoot":""} |