import PropTypes from "prop-types"; import { defineMessages, injectIntl } from "react-intl"; import { Helmet } from "react-helmet"; import { List as ImmutableList } from "immutable"; import ImmutablePropTypes from "react-immutable-proptypes"; import ImmutablePureComponent from "react-immutable-pure-component"; import { connect } from "react-redux"; import { createSelector } from "reselect"; import { fetchFollowRequests } from "flavours/glitch/actions/accounts"; import { fetchBookmarkFolders } from "flavours/glitch/actions/bookmark_folders"; import { fetchLists } from "flavours/glitch/actions/lists"; import { openModal } from "flavours/glitch/actions/modal"; import Column from "flavours/glitch/features/ui/components/column"; import ColumnLink from "flavours/glitch/features/ui/components/column_link"; import ColumnSubheading from "flavours/glitch/features/ui/components/column_subheading"; import LinkFooter from "flavours/glitch/features/ui/components/link_footer"; import { me, showTrends } from "flavours/glitch/initial_state"; import { preferencesLink } from "flavours/glitch/utils/backend_links"; import NavigationBar from "../compose/components/navigation_bar"; import TrendsContainer from "./containers/trends_container"; const messages = defineMessages({ heading: { id: "getting_started.heading", defaultMessage: "Getting started" }, home_timeline: { id: "tabs_bar.home", defaultMessage: "Home" }, notifications: { id: "tabs_bar.notifications", defaultMessage: "Notifications" }, public_timeline: { id: "navigation_bar.public_timeline", defaultMessage: "Federated timeline" }, navigation_subheading: { id: "column_subheading.navigation", defaultMessage: "Navigation" }, settings_subheading: { id: "column_subheading.settings", defaultMessage: "Settings" }, community_timeline: { id: "navigation_bar.community_timeline", defaultMessage: "Local timeline" }, explore: { id: "navigation_bar.explore", defaultMessage: "Explore" }, direct: { id: "navigation_bar.direct", defaultMessage: "Private mentions" }, bookmarks: { id: "navigation_bar.bookmarks", defaultMessage: "Bookmarks" }, preferences: { id: "navigation_bar.preferences", defaultMessage: "Preferences" }, settings: { id: "navigation_bar.app_settings", defaultMessage: "App settings" }, follow_requests: { id: "navigation_bar.follow_requests", defaultMessage: "Follow requests" }, lists: { id: "navigation_bar.lists", defaultMessage: "Lists" }, keyboard_shortcuts: { id: "navigation_bar.keyboard_shortcuts", defaultMessage: "Keyboard shortcuts" }, lists_subheading: { id: "column_subheading.lists", defaultMessage: "Lists" }, misc: { id: "navigation_bar.misc", defaultMessage: "Misc" }, menu: { id: "getting_started.heading", defaultMessage: "Getting started" }, }); 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"]), unreadFollowRequests: state.getIn(["user_lists", "follow_requests", "items"], ImmutableList()).size, unreadNotifications: state.getIn(["notifications", "unread"]), }); return mapStateToProps; }; const mapDispatchToProps = dispatch => ({ fetchFollowRequests: () => dispatch(fetchFollowRequests()), fetchLists: () => dispatch(fetchLists()), fetchBookmarkFolders: () => dispatch(fetchBookmarkFolders()), openSettings: () => dispatch(openModal({ modalType: "SETTINGS", modalProps: {}, })), }); const badgeDisplay = (number, limit) => { if (number === 0) { return undefined; } else if (limit && number >= limit) { return `${limit}+`; } else { return number; } }; class GettingStarted extends ImmutablePureComponent { static contextTypes = { router: PropTypes.object.isRequired, identity: PropTypes.object, }; static propTypes = { intl: PropTypes.object.isRequired, myAccount: ImmutablePropTypes.map, columns: ImmutablePropTypes.list, multiColumn: PropTypes.bool, fetchFollowRequests: PropTypes.func.isRequired, unreadFollowRequests: PropTypes.number, unreadNotifications: PropTypes.number, lists: ImmutablePropTypes.list, fetchLists: PropTypes.func.isRequired, fetchBookmarkFolders: PropTypes.func.isRequired, openSettings: PropTypes.func.isRequired, }; UNSAFE_componentWillMount () { this.props.fetchLists(); this.props.fetchBookmarkFolders(); } componentDidMount () { const { fetchFollowRequests, fetchBookmarkFolders } = this.props; const { signedIn } = this.context.identity; if (!signedIn) { return; } fetchFollowRequests(); fetchBookmarkFolders(); } render () { const { intl, myAccount, columns, multiColumn, unreadFollowRequests, unreadNotifications, lists, openSettings } = this.props; const { signedIn } = this.context.identity; const navItems = []; let listItems = []; if (multiColumn) { if (signedIn && !columns.find(item => item.get("id") === "HOME")) { navItems.push(); } if (!columns.find(item => item.get("id") === "NOTIFICATIONS")) { navItems.push(); } if (!columns.find(item => item.get("id") === "COMMUNITY")) { navItems.push(); } if (!columns.find(item => item.get("id") === "PUBLIC")) { navItems.push(); } } if (showTrends) { navItems.push(); } if (signedIn) { if (!multiColumn || !columns.find(item => item.get("id") === "DIRECT")) { navItems.push(); } if (!multiColumn || !columns.find(item => item.get("id") === "BOOKMARKS")) { navItems.push(); } if (myAccount.get("locked") || unreadFollowRequests > 0) { navItems.push(); } navItems.push(); listItems = listItems.concat([
{lists.filter(list => !columns.find(item => item.get("id") === "LIST" && item.getIn(["params", "id"]) === list.get("id"))).map(list => , )}
, ]); } return (
{!multiColumn && signedIn && } {multiColumn && } {navItems} {signedIn && ( <> {listItems} { preferencesLink !== undefined && } )}
{(multiColumn && showTrends) && } {intl.formatMessage(messages.menu)}
); } } export default connect(makeMapStateToProps, mapDispatchToProps)(injectIntl(GettingStarted));