diff --git a/app/javascript/flavours/glitch/features/getting_started/index.js b/app/javascript/flavours/glitch/features/getting_started/index.js
index 47142fdd12b..89c77b507c9 100644
--- a/app/javascript/flavours/glitch/features/getting_started/index.js
+++ b/app/javascript/flavours/glitch/features/getting_started/index.js
@@ -9,6 +9,8 @@ import PropTypes from 'prop-types';
import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
import { me } from 'flavours/glitch/util/initial_state';
+import { createSelector } from 'reselect';
+import { fetchLists } from 'flavours/glitch/actions/lists';
const messages = defineMessages({
heading: { id: 'getting_started.heading', defaultMessage: 'Getting started' },
@@ -23,23 +25,33 @@ const messages = defineMessages({
settings: { id: 'navigation_bar.app_settings', defaultMessage: 'App settings' },
follow_requests: { id: 'navigation_bar.follow_requests', defaultMessage: 'Follow requests' },
sign_out: { id: 'navigation_bar.logout', defaultMessage: 'Logout' },
- favourites: { id: 'navigation_bar.favourites', defaultMessage: 'Favourites' },
- blocks: { id: 'navigation_bar.blocks', defaultMessage: 'Blocked users' },
- mutes: { id: 'navigation_bar.mutes', defaultMessage: 'Muted users' },
- info: { id: 'navigation_bar.info', defaultMessage: 'Extended information' },
- show_me_around: { id: 'getting_started.onboarding', defaultMessage: 'Show me around' },
- pins: { id: 'navigation_bar.pins', defaultMessage: 'Pinned toots' },
lists: { id: 'navigation_bar.lists', defaultMessage: 'Lists' },
keyboard_shortcuts: { id: 'navigation_bar.keyboard_shortcuts', defaultMessage: 'Keyboard shortcuts' },
+ lists: { id: 'navigation_bar.lists', defaultMessage: 'Lists' },
+ lists_subheading: { id: 'column_subheading.lists', defaultMessage: 'Lists' },
+ misc: { id: 'navigation_bar.misc', defaultMessage: 'Misc' },
});
-const mapStateToProps = state => ({
- myAccount: state.getIn(['accounts', me]),
- columns: state.getIn(['settings', 'columns']),
-});
+const makeMapStateToProps = () => {
+ const getOrderedLists = createSelector([state => state.get('lists')], lists => {
+ if (!lists) {
+ return lists;
+ }
+
+ return lists.toList().filter(item => !!item).sort((a, b) => a.get('title').localeCompare(b.get('title')));
+ });
+
+ const mapStateToProps = state => ({
+ lists: getOrderedLists(state),
+ myAccount: state.getIn(['accounts', me]),
+ columns: state.getIn(['settings', 'columns']),
+ });
+
+ return mapStateToProps;
+};
-@connect(mapStateToProps)
@injectIntl
+@connect(makeMapStateToProps)
export default class GettingStarted extends ImmutablePureComponent {
static propTypes = {
@@ -48,6 +60,7 @@ export default class GettingStarted extends ImmutablePureComponent {
columns: ImmutablePropTypes.list,
multiColumn: PropTypes.bool,
dispatch: PropTypes.func.isRequired,
+ lists: ImmutablePropTypes.list,
};
openSettings = () => {
@@ -59,10 +72,15 @@ export default class GettingStarted extends ImmutablePureComponent {
this.props.dispatch(openModal('ONBOARDING'));
}
+ componentWillMount () {
+ this.props.dispatch(fetchLists());
+ }
+
render () {
- const { intl, myAccount, columns, multiColumn } = this.props;
+ const { intl, myAccount, columns, multiColumn, lists } = this.props;
let navItems = [];
+ let listItems = [];
if (multiColumn) {
if (!columns.find(item => item.get('id') === 'HOME')) {
@@ -86,19 +104,19 @@ export default class GettingStarted extends ImmutablePureComponent {
navItems.push();
}
- navItems = navItems.concat([
- ,
- ,
- ,
- ]);
-
if (myAccount.get('locked')) {
- navItems.push();
+ navItems.push();
}
- navItems = navItems.concat([
- ,
- ,
+ navItems.push();
+
+ listItems = listItems.concat([
+
+
+ {lists.map(list =>
+
+ )}
+
,
]);
return (
@@ -107,9 +125,9 @@ export default class GettingStarted extends ImmutablePureComponent {
{navItems}
+
+ {listItems}
-
-
diff --git a/app/javascript/flavours/glitch/features/getting_started_misc/index.js b/app/javascript/flavours/glitch/features/getting_started_misc/index.js
new file mode 100644
index 00000000000..9cf7ddff931
--- /dev/null
+++ b/app/javascript/flavours/glitch/features/getting_started_misc/index.js
@@ -0,0 +1,60 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import Column from 'flavours/glitch/features/ui/components/column';
+import ColumnBackButtonSlim from 'flavours/glitch/components/column_back_button_slim';
+import { defineMessages, injectIntl } from 'react-intl';
+import ImmutablePureComponent from 'react-immutable-pure-component';
+import ColumnLink from 'flavours/glitch/features/ui/components/column_link';
+import ColumnSubheading from 'flavours/glitch/features/ui/components/column_subheading';
+import { openModal } from 'flavours/glitch/actions/modal';
+import { connect } from 'react-redux';
+
+const messages = defineMessages({
+ heading: { id: 'column.heading', defaultMessage: 'Misc' },
+ subheading: { id: 'column.subheading', defaultMessage: 'Miscellaneous options' },
+ favourites: { id: 'navigation_bar.favourites', defaultMessage: 'Favourites' },
+ blocks: { id: 'navigation_bar.blocks', defaultMessage: 'Blocked users' },
+ mutes: { id: 'navigation_bar.mutes', defaultMessage: 'Muted users' },
+ info: { id: 'navigation_bar.info', defaultMessage: 'Extended information' },
+ show_me_around: { id: 'getting_started.onboarding', defaultMessage: 'Show me around' },
+ pins: { id: 'navigation_bar.pins', defaultMessage: 'Pinned toots' },
+ info: { id: 'navigation_bar.info', defaultMessage: 'Extended information' },
+ keyboard_shortcuts: { id: 'navigation_bar.keyboard_shortcuts', defaultMessage: 'Keyboard shortcuts' },
+});
+
+@connect()
+@injectIntl
+export default class gettingStartedMisc extends ImmutablePureComponent {
+
+ static propTypes = {
+ intl: PropTypes.object.isRequired,
+ dispatch: PropTypes.func.isRequired,
+ };
+
+ openOnboardingModal = (e) => {
+ e.preventDefault();
+ this.props.dispatch(openModal('ONBOARDING'));
+ }
+
+ render () {
+ const { intl } = this.props;
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+
+}
diff --git a/app/javascript/flavours/glitch/features/keyboard_shortcuts/index.js b/app/javascript/flavours/glitch/features/keyboard_shortcuts/index.js
new file mode 100644
index 00000000000..8aed471f27a
--- /dev/null
+++ b/app/javascript/flavours/glitch/features/keyboard_shortcuts/index.js
@@ -0,0 +1,102 @@
+import React from 'react';
+import Column from 'flavours/glitch/features/ui/components/column';
+import ColumnBackButtonSlim from 'flavours/glitch/components/column_back_button_slim';
+import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
+import PropTypes from 'prop-types';
+import ImmutablePureComponent from 'react-immutable-pure-component';
+
+const messages = defineMessages({
+ heading: { id: 'keyboard_shortcuts.heading', defaultMessage: 'Keyboard Shortcuts' },
+});
+
+@injectIntl
+export default class KeyboardShortcuts extends ImmutablePureComponent {
+
+ static propTypes = {
+ intl: PropTypes.object.isRequired,
+ multiColumn: PropTypes.bool,
+ };
+
+ render () {
+ const { intl } = this.props;
+
+ return (
+
+
+
+
+
+
+ |
+ |
+
+
+
+
+ r |
+ |
+
+
+ m |
+ |
+
+
+ f |
+ |
+
+
+ b |
+ |
+
+
+ enter |
+ |
+
+
+ up |
+ |
+
+
+ down |
+ |
+
+
+ 1-9 |
+ |
+
+
+ n |
+ |
+
+
+ alt+n |
+ |
+
+
+ backspace |
+ |
+
+
+ s |
+ |
+
+
+ esc |
+ |
+
+
+ x |
+ |
+
+
+ ? |
+ |
+
+
+
+
+
+ );
+ }
+
+}
diff --git a/app/javascript/flavours/glitch/features/list_timeline/index.js b/app/javascript/flavours/glitch/features/list_timeline/index.js
index bcc752d34f1..c6a89a92022 100644
--- a/app/javascript/flavours/glitch/features/list_timeline/index.js
+++ b/app/javascript/flavours/glitch/features/list_timeline/index.js
@@ -134,7 +134,7 @@ export default class ListTimeline extends React.PureComponent {
return (
{lists.map(list =>
-
+
)}
diff --git a/app/javascript/flavours/glitch/features/ui/index.js b/app/javascript/flavours/glitch/features/ui/index.js
index 698ae996c2e..5c80ea07bb5 100644
--- a/app/javascript/flavours/glitch/features/ui/index.js
+++ b/app/javascript/flavours/glitch/features/ui/index.js
@@ -20,6 +20,7 @@ import {
Compose,
Status,
GettingStarted,
+ KeyboardShortcuts,
PublicTimeline,
CommunityTimeline,
AccountTimeline,
@@ -40,6 +41,7 @@ import {
Mutes,
PinnedStatuses,
Lists,
+ GettingStartedMisc,
} from 'flavours/glitch/util/async-components';
import { HotKeys } from 'react-hotkeys';
import { me } from 'flavours/glitch/util/initial_state';
@@ -62,6 +64,7 @@ const mapStateToProps = state => ({
});
const keyMap = {
+ help: '?',
new: 'n',
search: 's',
forceNew: 'option+n',
@@ -311,6 +314,14 @@ export default class UI extends React.Component {
this.hotkeys = c;
}
+ handleHotkeyToggleHelp = () => {
+ if (this.props.location.pathname === '/keyboard-shortcuts') {
+ this.context.router.history.goBack();
+ } else {
+ this.context.router.history.push('/keyboard-shortcuts');
+ }
+ }
+
handleHotkeyGoToHome = () => {
this.context.router.history.push('/timelines/home');
}
@@ -377,6 +388,7 @@ export default class UI extends React.Component {
});
const handlers = {
+ help: this.handleHotkeyToggleHelp,
new: this.handleHotkeyNew,
search: this.handleHotkeySearch,
forceNew: this.handleHotkeyForceNew,
@@ -404,6 +416,7 @@ export default class UI extends React.Component {
+
@@ -428,6 +441,7 @@ export default class UI extends React.Component {
+
diff --git a/app/javascript/flavours/glitch/styles/components/index.scss b/app/javascript/flavours/glitch/styles/components/index.scss
index bef2825609d..7dc95b474a7 100644
--- a/app/javascript/flavours/glitch/styles/components/index.scss
+++ b/app/javascript/flavours/glitch/styles/components/index.scss
@@ -2306,6 +2306,27 @@
}
}
+.keyboard-shortcuts {
+ padding: 8px 0 0;
+ overflow: hidden;
+
+ thead {
+ position: absolute;
+ left: -9999px;
+ }
+
+ td {
+ padding: 0 10px 8px;
+ }
+
+ kbd {
+ display: inline-block;
+ padding: 3px 5px;
+ background-color: lighten($ui-base-color, 8%);
+ border: 1px solid darken($ui-base-color, 4%);
+ }
+}
+
.setting-text {
color: $ui-primary-color;
background: transparent;
diff --git a/app/javascript/flavours/glitch/util/async-components.js b/app/javascript/flavours/glitch/util/async-components.js
index e4c991f011c..5d21ccca2a6 100644
--- a/app/javascript/flavours/glitch/util/async-components.js
+++ b/app/javascript/flavours/glitch/util/async-components.js
@@ -50,6 +50,10 @@ export function GettingStarted () {
return import(/* webpackChunkName: "flavours/glitch/async/getting_started" */'flavours/glitch/features/getting_started');
}
+export function KeyboardShortcuts () {
+ return import(/* webpackChunkName: "features/keyboard_shortcuts" */'flavours/glitch/features/keyboard_shortcuts');
+}
+
export function PinnedStatuses () {
return import(/* webpackChunkName: "flavours/glitch/async/pinned_statuses" */'flavours/glitch/features/pinned_statuses');
}
@@ -125,3 +129,7 @@ export function Video () {
export function EmbedModal () {
return import(/* webpackChunkName: "flavours/glitch/async/embed_modal" */'flavours/glitch/features/ui/components/embed_modal');
}
+
+export function GettingStartedMisc () {
+ return import(/* webpackChunkName: "flavours/glitch/async/getting_started_misc" */'flavours/glitch/features/getting_started_misc');
+}