diff --git a/app/controllers/intents_controller.rb b/app/controllers/intents_controller.rb index 41f13486..9f41cf48 100644 --- a/app/controllers/intents_controller.rb +++ b/app/controllers/intents_controller.rb @@ -5,7 +5,7 @@ class IntentsController < ApplicationController rescue_from Addressable::URI::InvalidURIError, with: :handle_invalid_uri def show - if uri.scheme == 'web+gabsocial' + if uri.scheme == 'web+mastodon' case uri.host when 'follow' return redirect_to authorize_interaction_path(uri: uri.query_values['uri'].gsub(/\Aacct:/, '')) diff --git a/app/javascript/gabsocial/actions/columns.js b/app/javascript/gabsocial/actions/columns.js deleted file mode 100644 index 36be749d..00000000 --- a/app/javascript/gabsocial/actions/columns.js +++ /dev/null @@ -1,16 +0,0 @@ -import { saveSettings } from './settings'; - -export const COLUMN_PARAMS_CHANGE = 'COLUMN_PARAMS_CHANGE'; - -export function changeColumnParams(uuid, path, value) { - return dispatch => { - dispatch({ - type: COLUMN_PARAMS_CHANGE, - uuid, - path, - value, - }); - - dispatch(saveSettings()); - }; -} diff --git a/app/javascript/gabsocial/actions/compose.js b/app/javascript/gabsocial/actions/compose.js index fa995182..579292d5 100644 --- a/app/javascript/gabsocial/actions/compose.js +++ b/app/javascript/gabsocial/actions/compose.js @@ -6,7 +6,7 @@ import { tagHistory } from '../settings'; import { useEmoji } from './emojis'; import resizeImage from '../utils/resize_image'; import { importFetchedAccounts } from './importer'; -import { updateTimeline } from './timelines'; +import { updateTimeline, dequeueTimeline } from './timelines'; import { showAlertForError } from './alerts'; import { showAlert } from './alerts'; import { defineMessages } from 'react-intl'; @@ -169,6 +169,10 @@ export function submitCompose(routerHistory, group) { const timeline = getState().getIn(['timelines', timelineId]); if (timeline && timeline.get('items').size > 0 && timeline.getIn(['items', 0]) !== null && timeline.get('online')) { + let dequeueArgs = {}; + if (timelineId === 'community') dequeueArgs.onlyMedia = getState().getIn(['settings', 'community', 'other', 'onlyMedia']), + + dispatch(dequeueTimeline(timelineId, null, dequeueArgs)); dispatch(updateTimeline(timelineId, { ...response.data })); } }; diff --git a/app/javascript/gabsocial/actions/notifications.js b/app/javascript/gabsocial/actions/notifications.js index 8266ac55..21b1cf3f 100644 --- a/app/javascript/gabsocial/actions/notifications.js +++ b/app/javascript/gabsocial/actions/notifications.js @@ -16,6 +16,8 @@ import { me } from 'gabsocial/initial_state'; export const NOTIFICATIONS_UPDATE = 'NOTIFICATIONS_UPDATE'; export const NOTIFICATIONS_UPDATE_NOOP = 'NOTIFICATIONS_UPDATE_NOOP'; +export const NOTIFICATIONS_UPDATE_QUEUE = 'NOTIFICATIONS_UPDATE_QUEUE'; +export const NOTIFICATIONS_DEQUEUE = 'NOTIFICATIONS_DEQUEUE'; export const NOTIFICATIONS_EXPAND_REQUEST = 'NOTIFICATIONS_EXPAND_REQUEST'; export const NOTIFICATIONS_EXPAND_SUCCESS = 'NOTIFICATIONS_EXPAND_SUCCESS'; @@ -26,6 +28,8 @@ export const NOTIFICATIONS_FILTER_SET = 'NOTIFICATIONS_FILTER_SET'; export const NOTIFICATIONS_CLEAR = 'NOTIFICATIONS_CLEAR'; export const NOTIFICATIONS_SCROLL_TOP = 'NOTIFICATIONS_SCROLL_TOP'; +export const MAX_QUEUED_NOTIFICATIONS = 40; + defineMessages({ mention: { id: 'notification.mention', defaultMessage: '{name} mentioned you' }, group: { id: 'notifications.group', defaultMessage: '{count} notifications' }, @@ -42,18 +46,6 @@ const fetchRelatedRelationships = (dispatch, notifications) => { export function updateNotifications(notification, intlMessages, intlLocale) { return (dispatch, getState) => { const showInColumn = getState().getIn(['settings', 'notifications', 'shows', notification.type], true); - const showAlert = getState().getIn(['settings', 'notifications', 'alerts', notification.type], true); - const playSound = getState().getIn(['settings', 'notifications', 'sounds', notification.type], true); - const filters = getFilters(getState(), { contextType: 'notifications' }); - - let filtered = false; - - if (notification.type === 'mention') { - const regex = regexFromFilters(filters); - const searchIndex = notification.status.spoiler_text + '\n' + unescapeHTML(notification.status.content); - - filtered = regex && regex.test(searchIndex); - } if (showInColumn) { dispatch(importFetchedAccount(notification.account)); @@ -65,21 +57,33 @@ export function updateNotifications(notification, intlMessages, intlLocale) { dispatch({ type: NOTIFICATIONS_UPDATE, notification, - meta: (playSound && !filtered) ? { sound: 'ribbit' } : undefined, }); fetchRelatedRelationships(dispatch, [notification]); - } else if (playSound && !filtered) { - dispatch({ - type: NOTIFICATIONS_UPDATE_NOOP, - meta: { sound: 'ribbit' }, - }); + } + }; +}; + +export function updateNotificationsQueue(notification, intlMessages, intlLocale, curPath) { + return (dispatch, getState) => { + const showAlert = getState().getIn(['settings', 'notifications', 'alerts', notification.type], true); + const filters = getFilters(getState(), { contextType: 'notifications' }); + const playSound = getState().getIn(['settings', 'notifications', 'sounds', notification.type], true); + + let filtered = false; + + const isOnNotificationsPage = curPath === '/notifications'; + + if (notification.type === 'mention') { + const regex = regexFromFilters(filters); + const searchIndex = notification.status.spoiler_text + '\n' + unescapeHTML(notification.status.content); + filtered = regex && regex.test(searchIndex); } // Desktop notifications if (typeof window.Notification !== 'undefined' && showAlert && !filtered) { const title = new IntlMessageFormat(intlMessages[`notification.${notification.type}`], intlLocale).format({ name: notification.account.display_name.length > 0 ? notification.account.display_name : notification.account.username }); - const body = (notification.status && notification.status.spoiler_text.length > 0) ? notification.status.spoiler_text : unescapeHTML(notification.status ? notification.status.content : ''); + const body = (notification.status && notification.status.spoiler_text.length > 0) ? notification.status.spoiler_text : unescapeHTML(notification.status ? notification.status.content : ''); const notify = new Notification(title, { body, icon: notification.account.avatar, tag: notification.id }); @@ -88,7 +92,49 @@ export function updateNotifications(notification, intlMessages, intlLocale) { notify.close(); }); } - }; + + if (playSound && !filtered) { + dispatch({ + type: NOTIFICATIONS_UPDATE_NOOP, + meta: { sound: 'ribbit' }, + }); + } + + if (isOnNotificationsPage) { + dispatch({ + type: NOTIFICATIONS_UPDATE_QUEUE, + notification, + intlMessages, + intlLocale, + }); + } + else { + dispatch(updateNotifications(notification, intlMessages, intlLocale)); + } + } +}; + +export function dequeueNotifications() { + return (dispatch, getState) => { + const queuedNotifications = getState().getIn(['notifications', 'queuedNotifications'], ImmutableList()); + const totalQueuedNotificationsCount = getState().getIn(['notifications', 'totalQueuedNotificationsCount'], 0); + + if (totalQueuedNotificationsCount == 0) { + return; + } + else if (totalQueuedNotificationsCount > 0 && totalQueuedNotificationsCount <= MAX_QUEUED_NOTIFICATIONS) { + queuedNotifications.forEach(block => { + dispatch(updateNotifications(block.notification, block.intlMessages, block.intlLocale)); + }); + } + else { + dispatch(expandNotifications()); + } + + dispatch({ + type: NOTIFICATIONS_DEQUEUE, + }); + } }; const excludeTypesFromSettings = state => state.getIn(['settings', 'notifications', 'shows']).filter(enabled => !enabled).keySeq().toJS(); @@ -169,7 +215,7 @@ export function expandNotificationsFail(error, isLoadingMore) { export function clearNotifications() { return (dispatch, getState) => { if (!me) return; - + dispatch({ type: NOTIFICATIONS_CLEAR, }); diff --git a/app/javascript/gabsocial/actions/streaming.js b/app/javascript/gabsocial/actions/streaming.js index 3876a4f5..e599805e 100644 --- a/app/javascript/gabsocial/actions/streaming.js +++ b/app/javascript/gabsocial/actions/streaming.js @@ -1,12 +1,12 @@ import { connectStream } from '../stream'; import { - updateTimeline, deleteFromTimelines, expandHomeTimeline, connectTimeline, disconnectTimeline, + updateTimelineQueue, } from './timelines'; -import { updateNotifications, expandNotifications } from './notifications'; +import { updateNotificationsQueue, expandNotifications } from './notifications'; import { updateConversations } from './conversations'; import { fetchFilters } from './filters'; import { getLocale } from '../locales'; @@ -30,13 +30,13 @@ export function connectTimelineStream (timelineId, path, pollingRefresh = null, onReceive (data) { switch(data.event) { case 'update': - dispatch(updateTimeline(timelineId, JSON.parse(data.payload), accept)); + dispatch(updateTimelineQueue(timelineId, JSON.parse(data.payload), accept)); break; case 'delete': dispatch(deleteFromTimelines(data.payload)); break; case 'notification': - dispatch(updateNotifications(JSON.parse(data.payload), messages, locale)); + dispatch(updateNotificationsQueue(JSON.parse(data.payload), messages, locale, window.location.pathname)); break; case 'conversation': dispatch(updateConversations(JSON.parse(data.payload))); diff --git a/app/javascript/gabsocial/actions/timelines.js b/app/javascript/gabsocial/actions/timelines.js index ee57145e..4214cbde 100644 --- a/app/javascript/gabsocial/actions/timelines.js +++ b/app/javascript/gabsocial/actions/timelines.js @@ -1,10 +1,12 @@ import { importFetchedStatus, importFetchedStatuses } from './importer'; import api, { getLinks } from '../api'; -import { Map as ImmutableMap, List as ImmutableList } from 'immutable'; +import { Map as ImmutableMap, List as ImmutableList, toJS } from 'immutable'; export const TIMELINE_UPDATE = 'TIMELINE_UPDATE'; export const TIMELINE_DELETE = 'TIMELINE_DELETE'; export const TIMELINE_CLEAR = 'TIMELINE_CLEAR'; +export const TIMELINE_UPDATE_QUEUE = 'TIMELINE_UPDATE_QUEUE'; +export const TIMELINE_DEQUEUE = 'TIMELINE_DEQUEUE'; export const TIMELINE_EXPAND_REQUEST = 'TIMELINE_EXPAND_REQUEST'; export const TIMELINE_EXPAND_SUCCESS = 'TIMELINE_EXPAND_SUCCESS'; @@ -13,6 +15,8 @@ export const TIMELINE_EXPAND_FAIL = 'TIMELINE_EXPAND_FAIL'; export const TIMELINE_CONNECT = 'TIMELINE_CONNECT'; export const TIMELINE_DISCONNECT = 'TIMELINE_DISCONNECT'; +export const MAX_QUEUED_ITEMS = 40; + export function updateTimeline(timeline, status, accept) { return dispatch => { if (typeof accept === 'function' && !accept(status)) { @@ -29,6 +33,64 @@ export function updateTimeline(timeline, status, accept) { }; }; +export function updateTimelineQueue(timeline, status, accept) { + return dispatch => { + if (typeof accept === 'function' && !accept(status)) { + return; + } + + dispatch({ + type: TIMELINE_UPDATE_QUEUE, + timeline, + status, + }); + } +}; + +export function dequeueTimeline(timeline, expandFunc, optionalExpandArgs) { + return (dispatch, getState) => { + const queuedItems = getState().getIn(['timelines', timeline, 'queuedItems'], ImmutableList()); + const totalQueuedItemsCount = getState().getIn(['timelines', timeline, 'totalQueuedItemsCount'], 0); + + let shouldDispatchDequeue = true; + + if (totalQueuedItemsCount == 0) { + return; + } + else if (totalQueuedItemsCount > 0 && totalQueuedItemsCount <= MAX_QUEUED_ITEMS) { + queuedItems.forEach(status => { + dispatch(updateTimeline(timeline, status.toJS(), null)); + }); + } + else { + if (typeof expandFunc === 'function') { + dispatch(clearTimeline(timeline)); + expandFunc(); + } + else { + if (timeline === 'home') { + dispatch(clearTimeline(timeline)); + dispatch(expandHomeTimeline(optionalExpandArgs)); + } + else if (timeline === 'community') { + dispatch(clearTimeline(timeline)); + dispatch(expandCommunityTimeline(optionalExpandArgs)); + } + else { + shouldDispatchDequeue = false; + } + } + } + + if (!shouldDispatchDequeue) return; + + dispatch({ + type: TIMELINE_DEQUEUE, + timeline, + }); + } +}; + export function deleteFromTimelines(id) { return (dispatch, getState) => { const accountId = getState().getIn(['statuses', id, 'account']); diff --git a/app/javascript/gabsocial/components/scrollable_list.js b/app/javascript/gabsocial/components/scrollable_list.js index 2a94fa04..33662df8 100644 --- a/app/javascript/gabsocial/components/scrollable_list.js +++ b/app/javascript/gabsocial/components/scrollable_list.js @@ -1,5 +1,4 @@ import React, { PureComponent } from 'react'; -import { ScrollContainer } from 'react-router-scroll-4'; import PropTypes from 'prop-types'; import IntersectionObserverArticleContainer from '../containers/intersection_observer_article_container'; import LoadMore from './load_more'; diff --git a/app/javascript/gabsocial/components/status_list.js b/app/javascript/gabsocial/components/status_list.js index 7bbe01cc..91bbc511 100644 --- a/app/javascript/gabsocial/components/status_list.js +++ b/app/javascript/gabsocial/components/status_list.js @@ -7,6 +7,7 @@ import StatusContainer from '../containers/status_container'; import ImmutablePureComponent from 'react-immutable-pure-component'; import LoadGap from './load_gap'; import ScrollableList from './scrollable_list'; +import TimelineQueueButtonHeader from './timeline_queue_button_header'; export default class StatusList extends ImmutablePureComponent { @@ -22,6 +23,12 @@ export default class StatusList extends ImmutablePureComponent { emptyMessage: PropTypes.node, alwaysPrepend: PropTypes.bool, timelineId: PropTypes.string, + queuedItemSize: PropTypes.number, + onDequeueTimeline: PropTypes.func, + }; + + componentDidMount() { + this.handleDequeueTimeline(); }; getFeaturedStatusCount = () => { @@ -64,13 +71,18 @@ export default class StatusList extends ImmutablePureComponent { } } + handleDequeueTimeline = () => { + const { onDequeueTimeline, timelineId } = this.props; + if (!onDequeueTimeline || !timelineId) return; + onDequeueTimeline(timelineId); + } + setRef = c => { this.node = c; } render () { - const { statusIds, featuredStatusIds, onLoadMore, timelineId, ...other } = this.props; - const { isLoading, isPartial } = other; + const { statusIds, featuredStatusIds, onLoadMore, timelineId, totalQueuedItemsCount, isLoading, isPartial, ...other } = this.props; if (isPartial) { return ( @@ -119,11 +131,12 @@ export default class StatusList extends ImmutablePureComponent { )).concat(scrollableContent); } - return ( - + return [ + , + {scrollableContent} - ); + ]; } } diff --git a/app/javascript/gabsocial/components/timeline_queue_button_header.js b/app/javascript/gabsocial/components/timeline_queue_button_header.js new file mode 100644 index 00000000..e1bfe6d0 --- /dev/null +++ b/app/javascript/gabsocial/components/timeline_queue_button_header.js @@ -0,0 +1,38 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { FormattedMessage } from 'react-intl'; +import { shortNumberFormat } from '../utils/numbers'; + +export default class TimelineQueueButtonHeader extends React.PureComponent { + static propTypes = { + onClick: PropTypes.func.isRequired, + count: PropTypes.number, + itemType: PropTypes.string, + }; + + static defaultProps = { + count: 0, + itemType: 'item', + }; + + render () { + const { count, itemType, onClick } = this.props; + + if (count <= 0) return null; + + return ( +
+ + + +
+ ); + } +} diff --git a/app/javascript/gabsocial/features/account/components/header.js b/app/javascript/gabsocial/features/account/components/header.js index 9affdb9f..4bc88f2a 100644 --- a/app/javascript/gabsocial/features/account/components/header.js +++ b/app/javascript/gabsocial/features/account/components/header.js @@ -24,7 +24,7 @@ const messages = defineMessages({ edit_profile: { id: 'account.edit_profile', defaultMessage: 'Edit profile' }, linkVerifiedOn: { id: 'account.link_verified_on', defaultMessage: 'Ownership of this link was checked on {date}' }, account_locked: { id: 'account.locked_info', defaultMessage: 'This account privacy status is set to locked. The owner manually reviews who can follow them.' }, - mention: { id: 'account.mention', defaultMessage: 'Mention @{name}' }, + mention: { id: 'account.mention', defaultMessage: 'Mention' }, unmute: { id: 'account.unmute', defaultMessage: 'Unmute @{name}' }, block: { id: 'account.block', defaultMessage: 'Block @{name}' }, mute: { id: 'account.mute', defaultMessage: 'Mute @{name}' }, @@ -311,7 +311,7 @@ class Header extends ImmutablePureComponent { {actionBtn} {account.get('id') !== me && diff --git a/app/javascript/gabsocial/features/account_gallery/index.js b/app/javascript/gabsocial/features/account_gallery/index.js index 08151214..8d77b27c 100644 --- a/app/javascript/gabsocial/features/account_gallery/index.js +++ b/app/javascript/gabsocial/features/account_gallery/index.js @@ -212,6 +212,13 @@ class AccountGallery extends ImmutablePureComponent { ))} + { + attachments.size == 0 && +
+ +
+ } + {loadOlder} diff --git a/app/javascript/gabsocial/features/account_timeline/index.js b/app/javascript/gabsocial/features/account_timeline/index.js index ed133f49..6a2aad89 100644 --- a/app/javascript/gabsocial/features/account_timeline/index.js +++ b/app/javascript/gabsocial/features/account_timeline/index.js @@ -93,7 +93,7 @@ class AccountTimeline extends ImmutablePureComponent { this.props.dispatch(expandAccountFeaturedTimeline(nextProps.accountId)); } - this.props.dispatch(expandAccountTimeline(nextProps.accountId, { withReplies: nextProps.params.withReplies })); + this.props.dispatch(expandAccountTimeline(nextProps.accountId, { withReplies: nextProps.withReplies })); } } diff --git a/app/javascript/gabsocial/features/community_timeline/components/column_settings.js b/app/javascript/gabsocial/features/community_timeline/components/column_settings.js index 8250190a..66e9269f 100644 --- a/app/javascript/gabsocial/features/community_timeline/components/column_settings.js +++ b/app/javascript/gabsocial/features/community_timeline/components/column_settings.js @@ -11,7 +11,6 @@ class ColumnSettings extends React.PureComponent { settings: ImmutablePropTypes.map.isRequired, onChange: PropTypes.func.isRequired, intl: PropTypes.object.isRequired, - columnId: PropTypes.string, }; render () { @@ -21,6 +20,7 @@ class ColumnSettings extends React.PureComponent {
} /> + } />
); diff --git a/app/javascript/gabsocial/features/community_timeline/containers/column_settings_container.js b/app/javascript/gabsocial/features/community_timeline/containers/column_settings_container.js index 405064c3..0a756197 100644 --- a/app/javascript/gabsocial/features/community_timeline/containers/column_settings_container.js +++ b/app/javascript/gabsocial/features/community_timeline/containers/column_settings_container.js @@ -1,26 +1,15 @@ import { connect } from 'react-redux'; import ColumnSettings from '../components/column_settings'; import { changeSetting } from '../../../actions/settings'; -import { changeColumnParams } from '../../../actions/columns'; -const mapStateToProps = (state, { columnId }) => { - const uuid = columnId; - const columns = state.getIn(['settings', 'columns']); - const index = columns.findIndex(c => c.get('uuid') === uuid); +const mapStateToProps = state => ({ + settings: state.getIn(['settings', 'community']), +}); - return { - settings: (uuid && index >= 0) ? columns.get(index).get('params') : state.getIn(['settings', 'community']), - }; -}; - -const mapDispatchToProps = (dispatch, { columnId }) => { +const mapDispatchToProps = (dispatch) => { return { onChange (key, checked) { - if (columnId) { - dispatch(changeColumnParams(columnId, key, checked)); - } else { - dispatch(changeSetting(['community', ...key], checked)); - } + dispatch(changeSetting(['community', ...key], checked)); }, }; }; diff --git a/app/javascript/gabsocial/features/community_timeline/index.js b/app/javascript/gabsocial/features/community_timeline/index.js index cb8ae3d3..6b59339c 100644 --- a/app/javascript/gabsocial/features/community_timeline/index.js +++ b/app/javascript/gabsocial/features/community_timeline/index.js @@ -4,23 +4,32 @@ import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import PropTypes from 'prop-types'; import StatusListContainer from '../ui/containers/status_list_container'; import Column from '../../components/column'; -import { expandCommunityTimeline } from '../../actions/timelines'; import ColumnSettingsContainer from './containers/column_settings_container'; -import { connectCommunityStream } from '../../actions/streaming'; import HomeColumnHeader from '../../components/home_column_header'; +import { + expandCommunityTimeline, + expandPublicTimeline, +} from '../../actions/timelines'; +import { + connectCommunityStream, + connectPublicStream, +} from '../../actions/streaming'; const messages = defineMessages({ - title: { id: 'column.community', defaultMessage: 'Local timeline' }, + title: { id: 'column.community', defaultMessage: 'Community timeline' }, }); -const mapStateToProps = (state, { onlyMedia, columnId }) => { - const uuid = columnId; - const columns = state.getIn(['settings', 'columns']); - const index = columns.findIndex(c => c.get('uuid') === uuid); +const mapStateToProps = state => { + const allFediverse = state.getIn(['settings', 'community', 'other', 'allFediverse']); + const onlyMedia = state.getIn(['settings', 'community', 'other', 'onlyMedia']); + + const timelineId = allFediverse ? 'public' : 'community'; return { - hasUnread: state.getIn(['timelines', `community${onlyMedia ? ':media' : ''}`, 'unread']) > 0, - onlyMedia: (columnId && index >= 0) ? columns.get(index).getIn(['params', 'other', 'onlyMedia']) : state.getIn(['settings', 'community', 'other', 'onlyMedia']), + timelineId, + allFediverse, + onlyMedia, + hasUnread: state.getIn(['timelines', `${timelineId}${onlyMedia ? ':media' : ''}`, 'unread']) > 0, }; }; @@ -34,30 +43,45 @@ class CommunityTimeline extends React.PureComponent { static defaultProps = { onlyMedia: false, + allFediverse: false, }; static propTypes = { dispatch: PropTypes.func.isRequired, - columnId: PropTypes.string, intl: PropTypes.object.isRequired, hasUnread: PropTypes.bool, onlyMedia: PropTypes.bool, + allFediverse: PropTypes.bool, + timelineId: PropTypes.string, }; componentDidMount () { - const { dispatch, onlyMedia } = this.props; + const { dispatch, onlyMedia, allFediverse } = this.props; - dispatch(expandCommunityTimeline({ onlyMedia })); - this.disconnect = dispatch(connectCommunityStream({ onlyMedia })); + if (allFediverse) { + dispatch(expandPublicTimeline({ onlyMedia })); + this.disconnect = dispatch(connectPublicStream({ onlyMedia })); + } + else { + dispatch(expandCommunityTimeline({ onlyMedia })); + this.disconnect = dispatch(connectCommunityStream({ onlyMedia })); + } } componentDidUpdate (prevProps) { - if (prevProps.onlyMedia !== this.props.onlyMedia) { - const { dispatch, onlyMedia } = this.props; + if (prevProps.onlyMedia !== this.props.onlyMedia || prevProps.allFediverse !== this.props.allFediverse) { + const { dispatch, onlyMedia, allFediverse } = this.props; this.disconnect(); - dispatch(expandCommunityTimeline({ onlyMedia })); - this.disconnect = dispatch(connectCommunityStream({ onlyMedia })); + + if (allFediverse) { + dispatch(expandPublicTimeline({ onlyMedia })); + this.disconnect = dispatch(connectPublicStream({ onlyMedia })); + } + else { + dispatch(expandCommunityTimeline({ onlyMedia })); + this.disconnect = dispatch(connectCommunityStream({ onlyMedia })); + } } } @@ -69,27 +93,29 @@ class CommunityTimeline extends React.PureComponent { } handleLoadMore = maxId => { - const { dispatch, onlyMedia } = this.props; + const { dispatch, onlyMedia, allFediverse } = this.props; - dispatch(expandCommunityTimeline({ maxId, onlyMedia })); + if (allFediverse) { + dispatch(expandPublicTimeline({ maxId, onlyMedia })); + } + else { + dispatch(expandCommunityTimeline({ maxId, onlyMedia })); + } } render () { - const { intl, hasUnread, columnId, onlyMedia } = this.props; + const { intl, hasUnread, onlyMedia, timelineId, allFediverse } = this.props; return ( - + } + emptyMessage={} /> ); diff --git a/app/javascript/gabsocial/features/compose/components/compose_form.js b/app/javascript/gabsocial/features/compose/components/compose_form.js index 5d6a677f..bd0734dc 100644 --- a/app/javascript/gabsocial/features/compose/components/compose_form.js +++ b/app/javascript/gabsocial/features/compose/components/compose_form.js @@ -69,6 +69,7 @@ class ComposeForm extends ImmutablePureComponent { shouldCondense: PropTypes.bool, autoFocus: PropTypes.bool, group: ImmutablePropTypes.map, + isModalOpen: PropTypes.bool, }; static defaultProps = { @@ -151,6 +152,8 @@ class ComposeForm extends ImmutablePureComponent { } componentDidUpdate (prevProps) { + if (!this.autosuggestTextarea) return; + // This statement does several things: // - If we're beginning a reply, and, // - Replying to zero or one users, places the cursor at the end of the textbox. @@ -204,7 +207,7 @@ class ComposeForm extends ImmutablePureComponent { } render () { - const { intl, onPaste, showSearch, anyMedia, shouldCondense, autoFocus } = this.props; + const { intl, onPaste, showSearch, anyMedia, shouldCondense, autoFocus, isModalOpen } = this.props; const condensed = shouldCondense && !this.props.text && !this.state.composeFocused; const disabled = this.props.isSubmitting; const text = [this.props.spoilerText, countableText(this.props.text)].join(''); @@ -253,7 +256,7 @@ class ComposeForm extends ImmutablePureComponent { ({ isUploading: state.getIn(['compose', 'is_uploading']), showSearch: state.getIn(['search', 'submitted']) && !state.getIn(['search', 'hidden']), anyMedia: state.getIn(['compose', 'media_attachments']).size > 0, + isModalOpen: state.get('modal').modalType === 'COMPOSE', }); const mapDispatchToProps = (dispatch) => ({ diff --git a/app/javascript/gabsocial/features/direct_timeline/index.js b/app/javascript/gabsocial/features/direct_timeline/index.js index 9eab561e..1b82ae30 100644 --- a/app/javascript/gabsocial/features/direct_timeline/index.js +++ b/app/javascript/gabsocial/features/direct_timeline/index.js @@ -18,7 +18,6 @@ class DirectTimeline extends React.PureComponent { static propTypes = { dispatch: PropTypes.func.isRequired, - columnId: PropTypes.string, intl: PropTypes.object.isRequired, hasUnread: PropTypes.bool, }; @@ -45,14 +44,14 @@ class DirectTimeline extends React.PureComponent { } render () { - const { intl, hasUnread, columnId } = this.props; + const { intl, hasUnread } = this.props; return ( } diff --git a/app/javascript/gabsocial/features/favourited_statuses/index.js b/app/javascript/gabsocial/features/favourited_statuses/index.js index 81505629..439898aa 100644 --- a/app/javascript/gabsocial/features/favourited_statuses/index.js +++ b/app/javascript/gabsocial/features/favourited_statuses/index.js @@ -29,7 +29,6 @@ class Favourites extends ImmutablePureComponent { dispatch: PropTypes.func.isRequired, statusIds: ImmutablePropTypes.list.isRequired, intl: PropTypes.object.isRequired, - columnId: PropTypes.string, hasMore: PropTypes.bool, isLoading: PropTypes.bool, isMyAccount: PropTypes.bool.isRequired, @@ -44,7 +43,7 @@ class Favourites extends ImmutablePureComponent { }, 300, { leading: true }) render () { - const { intl, statusIds, columnId, hasMore, isLoading, isMyAccount } = this.props; + const { intl, statusIds, hasMore, isLoading, isMyAccount } = this.props; if (!isMyAccount) { return ( @@ -60,7 +59,7 @@ class Favourites extends ImmutablePureComponent { )} -
- } - /> -
+
+ } + /> +
); } diff --git a/app/javascript/gabsocial/features/hashtag_timeline/components/column_settings.js b/app/javascript/gabsocial/features/hashtag_timeline/components/column_settings.js deleted file mode 100644 index cdc138c8..00000000 --- a/app/javascript/gabsocial/features/hashtag_timeline/components/column_settings.js +++ /dev/null @@ -1,113 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; -import ImmutablePropTypes from 'react-immutable-proptypes'; -import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; -import Toggle from 'react-toggle'; -import AsyncSelect from 'react-select/lib/Async'; - -const messages = defineMessages({ - placeholder: { id: 'hashtag.column_settings.select.placeholder', defaultMessage: 'Enter hashtags…' }, - noOptions: { id: 'hashtag.column_settings.select.no_options_message', defaultMessage: 'No suggestions found' }, -}); - -export default @injectIntl -class ColumnSettings extends React.PureComponent { - - static propTypes = { - settings: ImmutablePropTypes.map.isRequired, - onChange: PropTypes.func.isRequired, - onLoad: PropTypes.func.isRequired, - intl: PropTypes.object.isRequired, - }; - - state = { - open: this.hasTags(), - }; - - hasTags () { - return ['all', 'any', 'none'].map(mode => this.tags(mode).length > 0).includes(true); - } - - tags (mode) { - let tags = this.props.settings.getIn(['tags', mode]) || []; - - if (tags.toJSON) { - return tags.toJSON(); - } else { - return tags; - } - }; - - onSelect = mode => value => this.props.onChange(['tags', mode], value); - - onToggle = () => { - if (this.state.open && this.hasTags()) { - this.props.onChange('tags', {}); - } - - this.setState({ open: !this.state.open }); - }; - - noOptionsMessage = () => this.props.intl.formatMessage(messages.noOptions); - - modeSelect (mode) { - return ( -
- - {this.modeLabel(mode)} - - - -
- ); - } - - modeLabel (mode) { - switch(mode) { - case 'any': - return ; - case 'all': - return ; - case 'none': - return ; - default: - return ''; - } - }; - - render () { - return ( -
-
-
- - - - - -
-
- - {this.state.open && ( -
- {this.modeSelect('any')} - {this.modeSelect('all')} - {this.modeSelect('none')} -
- )} -
- ); - } - -} diff --git a/app/javascript/gabsocial/features/hashtag_timeline/containers/column_settings_container.js b/app/javascript/gabsocial/features/hashtag_timeline/containers/column_settings_container.js deleted file mode 100644 index c5098052..00000000 --- a/app/javascript/gabsocial/features/hashtag_timeline/containers/column_settings_container.js +++ /dev/null @@ -1,31 +0,0 @@ -import { connect } from 'react-redux'; -import ColumnSettings from '../components/column_settings'; -import { changeColumnParams } from '../../../actions/columns'; -import api from '../../../api'; - -const mapStateToProps = (state, { columnId }) => { - const columns = state.getIn(['settings', 'columns']); - const index = columns.findIndex(c => c.get('uuid') === columnId); - - if (!(columnId && index >= 0)) { - return {}; - } - - return { settings: columns.get(index).get('params') }; -}; - -const mapDispatchToProps = (dispatch, { columnId }) => ({ - onChange (key, value) { - dispatch(changeColumnParams(columnId, key, value)); - }, - - onLoad (value) { - return api().get('/api/v2/search', { params: { q: value } }).then(response => { - return (response.data.hashtags || []).map((tag) => { - return { value: tag.name, label: `#${tag.name}` }; - }); - }); - }, -}); - -export default connect(mapStateToProps, mapDispatchToProps)(ColumnSettings); diff --git a/app/javascript/gabsocial/features/hashtag_timeline/index.js b/app/javascript/gabsocial/features/hashtag_timeline/index.js index 5948af79..edca2c1d 100644 --- a/app/javascript/gabsocial/features/hashtag_timeline/index.js +++ b/app/javascript/gabsocial/features/hashtag_timeline/index.js @@ -4,7 +4,6 @@ import PropTypes from 'prop-types'; import StatusListContainer from '../ui/containers/status_list_container'; import Column from '../../components/column'; import ColumnHeader from '../../components/column_header'; -import ColumnSettingsContainer from './containers/column_settings_container'; import { expandHashtagTimeline, clearTimeline } from '../../actions/timelines'; import { FormattedMessage } from 'react-intl'; import { connectHashtagStream } from '../../actions/streaming'; @@ -21,7 +20,6 @@ class HashtagTimeline extends React.PureComponent { static propTypes = { params: PropTypes.object.isRequired, - columnId: PropTypes.string, dispatch: PropTypes.func.isRequired, hasUnread: PropTypes.bool, }; @@ -104,17 +102,14 @@ class HashtagTimeline extends React.PureComponent { } render () { - const { hasUnread, columnId } = this.props; + const { hasUnread } = this.props; const { id } = this.props.params; return ( - - {columnId && } - - + } diff --git a/app/javascript/gabsocial/features/home_timeline/index.js b/app/javascript/gabsocial/features/home_timeline/index.js index b4a375b8..1448d44f 100644 --- a/app/javascript/gabsocial/features/home_timeline/index.js +++ b/app/javascript/gabsocial/features/home_timeline/index.js @@ -26,7 +26,6 @@ class HomeTimeline extends React.PureComponent { intl: PropTypes.object.isRequired, hasUnread: PropTypes.bool, isPartial: PropTypes.bool, - columnId: PropTypes.string, }; handleLoadMore = maxId => { @@ -67,7 +66,7 @@ class HomeTimeline extends React.PureComponent { } render () { - const { intl, hasUnread, columnId } = this.props; + const { intl, hasUnread } = this.props; return ( @@ -78,7 +77,7 @@ class HomeTimeline extends React.PureComponent { } diff --git a/app/javascript/gabsocial/features/list_timeline/index.js b/app/javascript/gabsocial/features/list_timeline/index.js index bd873b21..0dcb7662 100644 --- a/app/javascript/gabsocial/features/list_timeline/index.js +++ b/app/javascript/gabsocial/features/list_timeline/index.js @@ -36,7 +36,6 @@ class ListTimeline extends React.PureComponent { static propTypes = { params: PropTypes.object.isRequired, dispatch: PropTypes.func.isRequired, - columnId: PropTypes.string, hasUnread: PropTypes.bool, list: PropTypes.oneOfType([ImmutablePropTypes.map, PropTypes.bool]), intl: PropTypes.object.isRequired, @@ -69,7 +68,7 @@ class ListTimeline extends React.PureComponent { } handleDeleteClick = () => { - const { dispatch, columnId, intl } = this.props; + const { dispatch, intl } = this.props; const { id } = this.props.params; dispatch(openModal('CONFIRM', { @@ -77,18 +76,13 @@ class ListTimeline extends React.PureComponent { confirm: intl.formatMessage(messages.deleteConfirm), onConfirm: () => { dispatch(deleteList(id)); - - if (!!columnId) { - // - } else { - this.context.router.history.push('/lists'); - } + this.context.router.history.push('/lists'); }, })); } render () { - const { hasUnread, columnId, list } = this.props; + const { hasUnread, list } = this.props; const { id } = this.props.params; const title = list ? list.get('title') : id; @@ -126,7 +120,7 @@ class ListTimeline extends React.PureComponent { } diff --git a/app/javascript/gabsocial/features/notifications/index.js b/app/javascript/gabsocial/features/notifications/index.js index 011c6ecb..0f932627 100644 --- a/app/javascript/gabsocial/features/notifications/index.js +++ b/app/javascript/gabsocial/features/notifications/index.js @@ -4,7 +4,11 @@ import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; import Column from '../../components/column'; import ColumnHeader from '../../components/column_header'; -import { expandNotifications, scrollTopNotifications } from '../../actions/notifications'; +import { + expandNotifications, + scrollTopNotifications, + dequeueNotifications, +} from '../../actions/notifications'; import NotificationContainer from './containers/notification_container'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import ColumnSettingsContainer from './containers/column_settings_container'; @@ -14,6 +18,7 @@ import { List as ImmutableList } from 'immutable'; import { debounce } from 'lodash'; import ScrollableList from '../../components/scrollable_list'; import LoadGap from '../../components/load_gap'; +import TimelineQueueButtonHeader from '../../components/timeline_queue_button_header'; const messages = defineMessages({ title: { id: 'column.notifications', defaultMessage: 'Notifications' }, @@ -40,6 +45,7 @@ const mapStateToProps = state => ({ isLoading: state.getIn(['notifications', 'isLoading'], true), isUnread: state.getIn(['notifications', 'unread']) > 0, hasMore: state.getIn(['notifications', 'hasMore']), + totalQueuedNotificationsCount: state.getIn(['notifications', 'totalQueuedNotificationsCount'], 0), }); export default @connect(mapStateToProps) @@ -47,7 +53,6 @@ export default @connect(mapStateToProps) class Notifications extends React.PureComponent { static propTypes = { - columnId: PropTypes.string, notifications: ImmutablePropTypes.list.isRequired, showFilterBar: PropTypes.bool.isRequired, dispatch: PropTypes.func.isRequired, @@ -55,6 +60,8 @@ class Notifications extends React.PureComponent { isLoading: PropTypes.bool, isUnread: PropTypes.bool, hasMore: PropTypes.bool, + dequeueNotifications: PropTypes.func, + totalQueuedNotificationsCount: PropTypes.number, }; componentWillUnmount () { @@ -65,6 +72,7 @@ class Notifications extends React.PureComponent { } componentDidMount() { + this.handleDequeueNotifications(); this.props.dispatch(scrollTopNotifications(true)); } @@ -113,8 +121,12 @@ class Notifications extends React.PureComponent { } } + handleDequeueNotifications = () => { + this.props.dispatch(dequeueNotifications()); + }; + render () { - const { intl, notifications, isLoading, isUnread, columnId, hasMore, showFilterBar } = this.props; + const { intl, notifications, isLoading, isUnread, hasMore, showFilterBar, totalQueuedNotificationsCount } = this.props; const emptyMessage = ; let scrollableContent = null; @@ -150,7 +162,7 @@ class Notifications extends React.PureComponent { const scrollContainer = (
{filterBarContainer} + {scrollContainer}
); diff --git a/app/javascript/gabsocial/features/pinned_statuses/index.js b/app/javascript/gabsocial/features/pinned_statuses/index.js index e8180191..85a0e5d2 100644 --- a/app/javascript/gabsocial/features/pinned_statuses/index.js +++ b/app/javascript/gabsocial/features/pinned_statuses/index.js @@ -5,7 +5,7 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import { fetchPinnedStatuses } from '../../actions/pin_statuses'; import Column from '../ui/components/column'; import StatusList from '../../components/status_list'; -import { injectIntl } from 'react-intl'; +import { injectIntl, FormattedMessage } from 'react-intl'; import ImmutablePureComponent from 'react-immutable-pure-component'; import { meUsername } from 'gabsocial/initial_state'; import MissingIndicator from 'gabsocial/components/missing_indicator'; @@ -51,6 +51,7 @@ class PinnedStatuses extends ImmutablePureComponent { statusIds={statusIds} scrollKey='pinned_statuses' hasMore={hasMore} + emptyMessage={} /> ); diff --git a/app/javascript/gabsocial/features/public_timeline/containers/column_settings_container.js b/app/javascript/gabsocial/features/public_timeline/containers/column_settings_container.js deleted file mode 100644 index c56caa59..00000000 --- a/app/javascript/gabsocial/features/public_timeline/containers/column_settings_container.js +++ /dev/null @@ -1,28 +0,0 @@ -import { connect } from 'react-redux'; -import ColumnSettings from '../../community_timeline/components/column_settings'; -import { changeSetting } from '../../../actions/settings'; -import { changeColumnParams } from '../../../actions/columns'; - -const mapStateToProps = (state, { columnId }) => { - const uuid = columnId; - const columns = state.getIn(['settings', 'columns']); - const index = columns.findIndex(c => c.get('uuid') === uuid); - - return { - settings: (uuid && index >= 0) ? columns.get(index).get('params') : state.getIn(['settings', 'public']), - }; -}; - -const mapDispatchToProps = (dispatch, { columnId }) => { - return { - onChange (key, checked) { - if (columnId) { - dispatch(changeColumnParams(columnId, key, checked)); - } else { - dispatch(changeSetting(['public', ...key], checked)); - } - }, - }; -}; - -export default connect(mapStateToProps, mapDispatchToProps)(ColumnSettings); diff --git a/app/javascript/gabsocial/features/public_timeline/index.js b/app/javascript/gabsocial/features/public_timeline/index.js deleted file mode 100644 index 99949244..00000000 --- a/app/javascript/gabsocial/features/public_timeline/index.js +++ /dev/null @@ -1,96 +0,0 @@ -import React from 'react'; -import { connect } from 'react-redux'; -import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; -import PropTypes from 'prop-types'; -import StatusListContainer from '../ui/containers/status_list_container'; -import Column from '../../components/column'; -import ColumnHeader from '../../components/column_header'; -import { expandPublicTimeline } from '../../actions/timelines'; -import ColumnSettingsContainer from './containers/column_settings_container'; -import { connectPublicStream } from '../../actions/streaming'; - -const messages = defineMessages({ - title: { id: 'column.public', defaultMessage: 'Federated timeline' }, -}); - -const mapStateToProps = (state, { onlyMedia, columnId }) => { - const uuid = columnId; - const columns = state.getIn(['settings', 'columns']); - const index = columns.findIndex(c => c.get('uuid') === uuid); - - return { - hasUnread: state.getIn(['timelines', `public${onlyMedia ? ':media' : ''}`, 'unread']) > 0, - onlyMedia: (columnId && index >= 0) ? columns.get(index).getIn(['params', 'other', 'onlyMedia']) : state.getIn(['settings', 'public', 'other', 'onlyMedia']), - }; -}; - -export default @connect(mapStateToProps) -@injectIntl -class PublicTimeline extends React.PureComponent { - - static contextTypes = { - router: PropTypes.object, - }; - - static defaultProps = { - onlyMedia: false, - }; - - static propTypes = { - dispatch: PropTypes.func.isRequired, - intl: PropTypes.object.isRequired, - columnId: PropTypes.string, - hasUnread: PropTypes.bool, - onlyMedia: PropTypes.bool, - }; - - componentDidMount () { - const { dispatch, onlyMedia } = this.props; - - dispatch(expandPublicTimeline({ onlyMedia })); - this.disconnect = dispatch(connectPublicStream({ onlyMedia })); - } - - componentDidUpdate (prevProps) { - if (prevProps.onlyMedia !== this.props.onlyMedia) { - const { dispatch, onlyMedia } = this.props; - - this.disconnect(); - dispatch(expandPublicTimeline({ onlyMedia })); - this.disconnect = dispatch(connectPublicStream({ onlyMedia })); - } - } - - componentWillUnmount () { - if (this.disconnect) { - this.disconnect(); - this.disconnect = null; - } - } - - handleLoadMore = maxId => { - const { dispatch, onlyMedia } = this.props; - - dispatch(expandPublicTimeline({ maxId, onlyMedia })); - } - - render () { - const { intl, hasUnread, onlyMedia } = this.props; - - return ( - - - - - - } - /> - - ); - } - -} diff --git a/app/javascript/gabsocial/features/ui/components/columns_area.js b/app/javascript/gabsocial/features/ui/components/columns_area.js index 318d3392..361291ef 100644 --- a/app/javascript/gabsocial/features/ui/components/columns_area.js +++ b/app/javascript/gabsocial/features/ui/components/columns_area.js @@ -12,7 +12,7 @@ import BundleContainer from '../containers/bundle_container'; import ColumnLoading from './column_loading'; import DrawerLoading from './drawer_loading'; import BundleColumnError from './bundle_column_error'; -import { Compose, Notifications, HomeTimeline, CommunityTimeline, PublicTimeline, HashtagTimeline, DirectTimeline, FavouritedStatuses, ListTimeline } from '../../ui/util/async-components'; +import { Compose, Notifications, HomeTimeline, CommunityTimeline, HashtagTimeline, DirectTimeline, FavouritedStatuses, ListTimeline } from '../../ui/util/async-components'; import Icon from 'gabsocial/components/icon'; const messages = defineMessages({ diff --git a/app/javascript/gabsocial/features/ui/components/tabs_bar.js b/app/javascript/gabsocial/features/ui/components/tabs_bar.js index 5f8d932f..fd0ba2a6 100644 --- a/app/javascript/gabsocial/features/ui/components/tabs_bar.js +++ b/app/javascript/gabsocial/features/ui/components/tabs_bar.js @@ -27,9 +27,6 @@ export const privateLinks = [ , - // - // - // , , diff --git a/app/javascript/gabsocial/features/ui/components/unauthorized_modal.js b/app/javascript/gabsocial/features/ui/components/unauthorized_modal.js index 91cd49c9..adedd595 100644 --- a/app/javascript/gabsocial/features/ui/components/unauthorized_modal.js +++ b/app/javascript/gabsocial/features/ui/components/unauthorized_modal.js @@ -6,7 +6,6 @@ import { me } from '../../../initial_state'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import Avatar from '../../../components/avatar'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import ComposeFormContainer from '../../compose/containers/compose_form_container'; import IconButton from 'gabsocial/components/icon_button'; const messages = defineMessages({ diff --git a/app/javascript/gabsocial/features/ui/containers/status_list_container.js b/app/javascript/gabsocial/features/ui/containers/status_list_container.js index baa0f901..ee58b9ed 100644 --- a/app/javascript/gabsocial/features/ui/containers/status_list_container.js +++ b/app/javascript/gabsocial/features/ui/containers/status_list_container.js @@ -4,6 +4,7 @@ import { Map as ImmutableMap, List as ImmutableList } from 'immutable'; import { createSelector } from 'reselect'; import { debounce } from 'lodash'; import { me } from '../../../initial_state'; +import { dequeueTimeline } from 'gabsocial/actions/timelines'; const makeGetStatusIds = () => createSelector([ (state, { type }) => state.getIn(['settings', type], ImmutableMap()), @@ -28,17 +29,22 @@ const makeGetStatusIds = () => createSelector([ }); }); -const makeMapStateToProps = () => { +const mapStateToProps = (state, {timelineId}) => { const getStatusIds = makeGetStatusIds(); - const mapStateToProps = (state, { timelineId }) => ({ + return { statusIds: getStatusIds(state, { type: timelineId }), isLoading: state.getIn(['timelines', timelineId, 'isLoading'], true), isPartial: state.getIn(['timelines', timelineId, 'isPartial'], false), hasMore: state.getIn(['timelines', timelineId, 'hasMore']), - }); - - return mapStateToProps; + totalQueuedItemsCount: state.getIn(['timelines', timelineId, 'totalQueuedItemsCount']), + }; }; -export default connect(makeMapStateToProps)(StatusList); +const mapDispatchToProps = (dispatch, ownProps) => ({ + onDequeueTimeline(timelineId) { + dispatch(dequeueTimeline(timelineId, ownProps.onLoadMore)); + }, +}); + +export default connect(mapStateToProps, mapDispatchToProps)(StatusList); diff --git a/app/javascript/gabsocial/features/ui/index.js b/app/javascript/gabsocial/features/ui/index.js index 084bd584..952ba43e 100644 --- a/app/javascript/gabsocial/features/ui/index.js +++ b/app/javascript/gabsocial/features/ui/index.js @@ -31,7 +31,6 @@ import SearchPage from 'gabsocial/pages/search_page'; import HomePage from 'gabsocial/pages/home_page'; import { - Compose, Status, GettingStarted, CommunityTimeline, diff --git a/app/javascript/gabsocial/features/ui/util/async-components.js b/app/javascript/gabsocial/features/ui/util/async-components.js index b3525461..9eb368c0 100644 --- a/app/javascript/gabsocial/features/ui/util/async-components.js +++ b/app/javascript/gabsocial/features/ui/util/async-components.js @@ -14,10 +14,6 @@ export function HomeTimeline () { return import(/* webpackChunkName: "features/home_timeline" */'../../home_timeline'); } -export function PublicTimeline () { - return import(/* webpackChunkName: "features/public_timeline" */'../../public_timeline'); -} - export function CommunityTimeline () { return import(/* webpackChunkName: "features/community_timeline" */'../../community_timeline'); } diff --git a/app/javascript/gabsocial/locales/ar.json b/app/javascript/gabsocial/locales/ar.json index 738bb3ec..76b6126a 100644 --- a/app/javascript/gabsocial/locales/ar.json +++ b/app/javascript/gabsocial/locales/ar.json @@ -18,7 +18,7 @@ "account.link_verified_on": "تم التحقق مِن مِلْكية هذا الرابط بتاريخ {date}", "account.locked_info": "تم تأمين خصوصية هذا الحساب عبر قفل. صاحب الحساب يُراجِع يدويا طلبات المتابَعة و الاشتراك بحسابه.", "account.media": "وسائط", - "account.mention": "أُذكُر/ي @{name}", + "account.mention": "أُذكُر/ي", "account.moved_to": "{name} إنتقل إلى :", "account.mute": "كتم @{name}", "account.mute_notifications": "كتم الإخطارات من @{name}", diff --git a/app/javascript/gabsocial/locales/ast.json b/app/javascript/gabsocial/locales/ast.json index 44b664cf..cf9d67b9 100644 --- a/app/javascript/gabsocial/locales/ast.json +++ b/app/javascript/gabsocial/locales/ast.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Media", - "account.mention": "Mentar a @{name}", + "account.mention": "Mentar", "account.moved_to": "{name} has moved to:", "account.mute": "Silenciar a @{name}", "account.mute_notifications": "Mute notifications from @{name}", diff --git a/app/javascript/gabsocial/locales/bn.json b/app/javascript/gabsocial/locales/bn.json index a72e4e59..9436093e 100644 --- a/app/javascript/gabsocial/locales/bn.json +++ b/app/javascript/gabsocial/locales/bn.json @@ -18,7 +18,7 @@ "account.link_verified_on": "এই লিংকের মালিকানা চেক করা হয়েছে {date} তারিকে", "account.locked_info": "এই নিবন্ধনের গোপনীয়তার ক্ষেত্র তালা দেওয়া আছে। নিবন্ধনকারী অনুসরণ করার অনুমতি যাদেরকে দেবেন, শুধু তারাই অনুসরণ করতে পারবেন।", "account.media": "ছবি বা ভিডিও", - "account.mention": "@{name} কে উল্লেখ করুন", + "account.mention": "কে উল্লেখ করুন", "account.moved_to": "{name} চলে গেছে এখানে:", "account.mute": "@{name}র কার্যক্রম সরিয়ে ফেলুন", "account.mute_notifications": "@{name}র প্রজ্ঞাপন আপনার কাছ থেকে সরিয়ে ফেলুন", diff --git a/app/javascript/gabsocial/locales/ca.json b/app/javascript/gabsocial/locales/ca.json index 66fbd4ee..74a37559 100644 --- a/app/javascript/gabsocial/locales/ca.json +++ b/app/javascript/gabsocial/locales/ca.json @@ -18,7 +18,7 @@ "account.link_verified_on": "La propietat d'aquest enllaç es va verificar el dia {date}", "account.locked_info": "Aquest estat de privadesa del compte està definit com a bloquejat. El propietari revisa manualment qui pot seguir-lo.", "account.media": "Mèdia", - "account.mention": "Esmentar @{name}", + "account.mention": "Esmentar", "account.moved_to": "{name} s'ha mogut a:", "account.mute": "Silencia @{name}", "account.mute_notifications": "Notificacions desactivades de @{name}", diff --git a/app/javascript/gabsocial/locales/co.json b/app/javascript/gabsocial/locales/co.json index e7a42884..f64f92a8 100644 --- a/app/javascript/gabsocial/locales/co.json +++ b/app/javascript/gabsocial/locales/co.json @@ -18,7 +18,7 @@ "account.link_verified_on": "A prupietà di stu ligame hè stata verificata u {date}", "account.locked_info": "U statutu di vita privata di u contu hè chjosu. U pruprietariu esamina manualmente e dumande d'abbunamentu.", "account.media": "Media", - "account.mention": "Mintuvà @{name}", + "account.mention": "Mintuvà", "account.moved_to": "{name} hè partutu nant'à:", "account.mute": "Piattà @{name}", "account.mute_notifications": "Piattà nutificazione da @{name}", diff --git a/app/javascript/gabsocial/locales/cs.json b/app/javascript/gabsocial/locales/cs.json index b4ee8a14..5a95cc5a 100644 --- a/app/javascript/gabsocial/locales/cs.json +++ b/app/javascript/gabsocial/locales/cs.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Vlastnictví tohoto odkazu bylo zkontrolováno {date}", "account.locked_info": "Stav soukromí tohoto účtu je nastaven na zamčeno. Jeho vlastník ručně posuzuje, kdo ho může sledovat.", "account.media": "Média", - "account.mention": "Zmínit uživatele @{name}", + "account.mention": "Zmínit uživatele", "account.moved_to": "{name} se přesunul/a na:", "account.mute": "Skrýt uživatele @{name}", "account.mute_notifications": "Skrýt oznámení od uživatele @{name}", diff --git a/app/javascript/gabsocial/locales/cy.json b/app/javascript/gabsocial/locales/cy.json index 815e1b4a..73773b78 100644 --- a/app/javascript/gabsocial/locales/cy.json +++ b/app/javascript/gabsocial/locales/cy.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Gwiriwyd perchnogaeth y ddolen yma ar {date}", "account.locked_info": "Mae'r statws preifatrwydd cyfrif hwn wedi'i osod i gloi. Mae'r perchennog yn adolygu'r sawl sy'n gallu eu dilyn.", "account.media": "Cyfryngau", - "account.mention": "Crybwyll @{name}", + "account.mention": "Crybwyll", "account.moved_to": "Mae @{name} wedi symud i:", "account.mute": "Tawelu @{name}", "account.mute_notifications": "Cuddio hysbysiadau o @{name}", diff --git a/app/javascript/gabsocial/locales/da.json b/app/javascript/gabsocial/locales/da.json index 540efba8..679b1e8b 100644 --- a/app/javascript/gabsocial/locales/da.json +++ b/app/javascript/gabsocial/locales/da.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Ejerskabet af dette link blev tjekket den %{date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Medie", - "account.mention": "Nævn @{name}", + "account.mention": "Nævn", "account.moved_to": "{name} er flyttet til:", "account.mute": "Dæmp @{name}", "account.mute_notifications": "Dæmp notifikationer fra @{name}", diff --git a/app/javascript/gabsocial/locales/de.json b/app/javascript/gabsocial/locales/de.json index a64d19f6..ad422781 100644 --- a/app/javascript/gabsocial/locales/de.json +++ b/app/javascript/gabsocial/locales/de.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Besitz dieses Links wurde geprüft am {date}", "account.locked_info": "Der Privatsphärenstatus dieses Accounts wurde auf gesperrt gesetzt. Die Person bestimmt manuell wer ihm/ihr folgen darf.", "account.media": "Medien", - "account.mention": "@{name} erwähnen", + "account.mention": "erwähnen", "account.moved_to": "{name} ist umgezogen auf:", "account.mute": "@{name} stummschalten", "account.mute_notifications": "Benachrichtigungen von @{name} verbergen", diff --git a/app/javascript/gabsocial/locales/el.json b/app/javascript/gabsocial/locales/el.json index 4937d6c8..3d007ad2 100644 --- a/app/javascript/gabsocial/locales/el.json +++ b/app/javascript/gabsocial/locales/el.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Η ιδιοκτησία αυτού του συνδέσμου εκλέχθηκε την {date}", "account.locked_info": "Η κατάσταση απορρήτου αυτού του λογαριασμού είναι κλειδωμένη. Ο ιδιοκτήτης επιβεβαιώνει χειροκίνητα ποιος μπορεί να τον ακολουθήσει.", "account.media": "Πολυμέσα", - "account.mention": "Ανάφερε @{name}", + "account.mention": "Ανάφερε", "account.moved_to": "{name} μεταφέρθηκε στο:", "account.mute": "Σώπασε τον/την @{name}", "account.mute_notifications": "Σώπασε τις ειδοποιήσεις από τον/την @{name}", diff --git a/app/javascript/gabsocial/locales/en.json b/app/javascript/gabsocial/locales/en.json index a0cd2298..66365f4b 100644 --- a/app/javascript/gabsocial/locales/en.json +++ b/app/javascript/gabsocial/locales/en.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Media", - "account.mention": "Mention @{name}", + "account.mention": "Mention", "account.moved_to": "{name} has moved to:", "account.mute": "Mute @{name}", "account.mute_notifications": "Mute notifications from @{name}", diff --git a/app/javascript/gabsocial/locales/eo.json b/app/javascript/gabsocial/locales/eo.json index 4c952673..739e0f49 100644 --- a/app/javascript/gabsocial/locales/eo.json +++ b/app/javascript/gabsocial/locales/eo.json @@ -18,7 +18,7 @@ "account.link_verified_on": "La posedanto de tiu ligilo estis kontrolita je {date}", "account.locked_info": "La privateco de tiu konto estas elektita kiel fermita. La posedanto povas mane akcepti tiun, kiu povas sekvi rin.", "account.media": "Aŭdovidaĵoj", - "account.mention": "Mencii @{name}", + "account.mention": "Mencii", "account.moved_to": "{name} moviĝis al:", "account.mute": "Silentigi @{name}", "account.mute_notifications": "Silentigi sciigojn el @{name}", diff --git a/app/javascript/gabsocial/locales/es.json b/app/javascript/gabsocial/locales/es.json index 92ec4889..c2325ce3 100644 --- a/app/javascript/gabsocial/locales/es.json +++ b/app/javascript/gabsocial/locales/es.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Media", - "account.mention": "Mencionar a @{name}", + "account.mention": "Mencionar", "account.moved_to": "{name} se ha mudado a:", "account.mute": "Silenciar a @{name}", "account.mute_notifications": "Silenciar notificaciones de @{name}", diff --git a/app/javascript/gabsocial/locales/eu.json b/app/javascript/gabsocial/locales/eu.json index d553d76c..0e55c7b1 100644 --- a/app/javascript/gabsocial/locales/eu.json +++ b/app/javascript/gabsocial/locales/eu.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Esteka honen jabetzaren egiaztaketa data: {date}", "account.locked_info": "Kontu honen pribatutasun egoera blokeatuta gisa ezarri da. Jabeak eskuz erabakitzen du nork jarraitu diezaioken.", "account.media": "Media", - "account.mention": "Aipatu @{name}", + "account.mention": "Aipatu", "account.moved_to": "{name} hona lekualdatu da:", "account.mute": "Mututu @{name}", "account.mute_notifications": "Mututu @{name}(r)en jakinarazpenak", diff --git a/app/javascript/gabsocial/locales/fa.json b/app/javascript/gabsocial/locales/fa.json index bbbbf599..7bc637cb 100644 --- a/app/javascript/gabsocial/locales/fa.json +++ b/app/javascript/gabsocial/locales/fa.json @@ -18,7 +18,7 @@ "account.link_verified_on": "مالکیت این نشانی در تایخ {date} بررسی شد", "account.locked_info": "این حساب خصوصی است. صاحب این حساب تصمیم می‌گیرد که چه کسی می‌تواند پیگیرش باشد.", "account.media": "عکس و ویدیو", - "account.mention": "نام‌بردن از @{name}", + "account.mention": "نام‌بردن از", "account.moved_to": "{name} منتقل شده است به:", "account.mute": "بی‌صدا کردن @{name}", "account.mute_notifications": "بی‌صداکردن اعلان‌ها از طرف @{name}", diff --git a/app/javascript/gabsocial/locales/fi.json b/app/javascript/gabsocial/locales/fi.json index 28dc7e81..44b8ca1b 100644 --- a/app/javascript/gabsocial/locales/fi.json +++ b/app/javascript/gabsocial/locales/fi.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Tämän linkin omistaja tarkistettiin {date}", "account.locked_info": "Tämän tili on yksityinen. Käyttäjä vahvistaa itse kuka voi seurata häntä.", "account.media": "Media", - "account.mention": "Mainitse @{name}", + "account.mention": "Mainitse", "account.moved_to": "{name} on muuttanut instanssiin:", "account.mute": "Mykistä @{name}", "account.mute_notifications": "Mykistä ilmoitukset käyttäjältä @{name}", diff --git a/app/javascript/gabsocial/locales/fr.json b/app/javascript/gabsocial/locales/fr.json index 1cf66198..52916ab4 100644 --- a/app/javascript/gabsocial/locales/fr.json +++ b/app/javascript/gabsocial/locales/fr.json @@ -18,7 +18,7 @@ "account.link_verified_on": "La propriété de ce lien a été vérifiée le {date}", "account.locked_info": "Ce compte est verrouillé. Son propriétaire approuve manuellement qui peut le ou la suivre.", "account.media": "Média", - "account.mention": "Mentionner @{name}", + "account.mention": "Mentionner", "account.moved_to": "{name} a déménagé vers :", "account.mute": "Masquer @{name}", "account.mute_notifications": "Ignorer les notifications de @{name}", diff --git a/app/javascript/gabsocial/locales/gl.json b/app/javascript/gabsocial/locales/gl.json index ce1a22e5..6f78f6aa 100644 --- a/app/javascript/gabsocial/locales/gl.json +++ b/app/javascript/gabsocial/locales/gl.json @@ -18,7 +18,7 @@ "account.link_verified_on": "A propiedade de esta ligazón foi comprobada en {date}", "account.locked_info": "O estado da intimidade de esta conta estableceuse en pechado. A persoa dona da conta revisa quen pode seguila.", "account.media": "Medios", - "account.mention": "Mencionar @{name}", + "account.mention": "Mencionar", "account.moved_to": "{name} marchou a:", "account.mute": "Acalar @{name}", "account.mute_notifications": "Acalar as notificacións de @{name}", diff --git a/app/javascript/gabsocial/locales/he.json b/app/javascript/gabsocial/locales/he.json index 1465b090..888b3760 100644 --- a/app/javascript/gabsocial/locales/he.json +++ b/app/javascript/gabsocial/locales/he.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "מדיה", - "account.mention": "אזכור של @{name}", + "account.mention": "אזכור של", "account.moved_to": "החשבון {name} הועבר אל:", "account.mute": "להשתיק את @{name}", "account.mute_notifications": "להסתיר התראות מאת @{name}", diff --git a/app/javascript/gabsocial/locales/hi.json b/app/javascript/gabsocial/locales/hi.json index 42ceed33..3c53a68b 100644 --- a/app/javascript/gabsocial/locales/hi.json +++ b/app/javascript/gabsocial/locales/hi.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Media", - "account.mention": "Mention @{name}", + "account.mention": "Mention", "account.moved_to": "{name} has moved to:", "account.mute": "Mute @{name}", "account.mute_notifications": "Mute notifications from @{name}", diff --git a/app/javascript/gabsocial/locales/hr.json b/app/javascript/gabsocial/locales/hr.json index 5f00a7f1..677e6d29 100644 --- a/app/javascript/gabsocial/locales/hr.json +++ b/app/javascript/gabsocial/locales/hr.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Media", - "account.mention": "Spomeni @{name}", + "account.mention": "Spomeni", "account.moved_to": "{name} has moved to:", "account.mute": "Utišaj @{name}", "account.mute_notifications": "Mute notifications from @{name}", diff --git a/app/javascript/gabsocial/locales/hu.json b/app/javascript/gabsocial/locales/hu.json index a3a95223..1fc83213 100644 --- a/app/javascript/gabsocial/locales/hu.json +++ b/app/javascript/gabsocial/locales/hu.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Média", - "account.mention": "@{name} említése", + "account.mention": "említése", "account.moved_to": "{name} átköltözött:", "account.mute": "@{name} némítása", "account.mute_notifications": "@{name} értesítések némítása", diff --git a/app/javascript/gabsocial/locales/hy.json b/app/javascript/gabsocial/locales/hy.json index 35b0dedf..3187ad41 100644 --- a/app/javascript/gabsocial/locales/hy.json +++ b/app/javascript/gabsocial/locales/hy.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Մեդիա", - "account.mention": "Նշել @{name}֊ին", + "account.mention": "Նշել", "account.moved_to": "{name}֊ը տեղափոխվել է՝", "account.mute": "Լռեցնել @{name}֊ին", "account.mute_notifications": "Անջատել ծանուցումները @{name}֊ից", diff --git a/app/javascript/gabsocial/locales/id.json b/app/javascript/gabsocial/locales/id.json index e0006a2b..e9c99f53 100644 --- a/app/javascript/gabsocial/locales/id.json +++ b/app/javascript/gabsocial/locales/id.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Media", - "account.mention": "Balasan @{name}", + "account.mention": "Balasan", "account.moved_to": "{name} telah pindah ke:", "account.mute": "Bisukan @{name}", "account.mute_notifications": "Sembunyikan notifikasi dari @{name}", diff --git a/app/javascript/gabsocial/locales/io.json b/app/javascript/gabsocial/locales/io.json index 04bc4587..ca9d7091 100644 --- a/app/javascript/gabsocial/locales/io.json +++ b/app/javascript/gabsocial/locales/io.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Media", - "account.mention": "Mencionar @{name}", + "account.mention": "Mencionar", "account.moved_to": "{name} has moved to:", "account.mute": "Celar @{name}", "account.mute_notifications": "Mute notifications from @{name}", diff --git a/app/javascript/gabsocial/locales/it.json b/app/javascript/gabsocial/locales/it.json index f7668c6e..92d19efa 100644 --- a/app/javascript/gabsocial/locales/it.json +++ b/app/javascript/gabsocial/locales/it.json @@ -18,7 +18,7 @@ "account.link_verified_on": "La proprietà di questo link è stata controllata il {date}", "account.locked_info": "Il livello di privacy di questo account è impostato a \"bloccato\". Il proprietario esamina manualmente le richieste di seguirlo.", "account.media": "Media", - "account.mention": "Menziona @{name}", + "account.mention": "Menziona", "account.moved_to": "{name} si è trasferito su:", "account.mute": "Silenzia @{name}", "account.mute_notifications": "Silenzia notifiche da @{name}", diff --git a/app/javascript/gabsocial/locales/ja.json b/app/javascript/gabsocial/locales/ja.json index a7e9b1ef..7885c94e 100644 --- a/app/javascript/gabsocial/locales/ja.json +++ b/app/javascript/gabsocial/locales/ja.json @@ -18,7 +18,7 @@ "account.link_verified_on": "このリンクの所有権は{date}に確認されました", "account.locked_info": "このアカウントは承認制アカウントです。相手が承認するまでフォローは完了しません。", "account.media": "メディア", - "account.mention": "@{name}さんにトゥート", + "account.mention": "さんにトゥート", "account.moved_to": "{name}さんは引っ越しました:", "account.mute": "@{name}さんをミュート", "account.mute_notifications": "@{name}さんからの通知を受け取らない", diff --git a/app/javascript/gabsocial/locales/ka.json b/app/javascript/gabsocial/locales/ka.json index 36557efd..d53ab849 100644 --- a/app/javascript/gabsocial/locales/ka.json +++ b/app/javascript/gabsocial/locales/ka.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "მედია", - "account.mention": "ასახელეთ @{name}", + "account.mention": "ასახელეთ", "account.moved_to": "{name} გადავიდა:", "account.mute": "გააჩუმე @{name}", "account.mute_notifications": "გააჩუმე შეტყობინებები @{name}-სგან", diff --git a/app/javascript/gabsocial/locales/kk.json b/app/javascript/gabsocial/locales/kk.json index adbe9d5e..11260e2d 100644 --- a/app/javascript/gabsocial/locales/kk.json +++ b/app/javascript/gabsocial/locales/kk.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Сілтеме меншігі расталған күн {date}", "account.locked_info": "Бұл қолданушы өзі туралы мәліметтерді жасырған. Тек жазылғандар ғана көре алады.", "account.media": "Медиа", - "account.mention": "Аталым @{name}", + "account.mention": "Аталым", "account.moved_to": "{name} көшіп кетті:", "account.mute": "Үнсіз қылу @{name}", "account.mute_notifications": "@{name} туралы ескертпелерді жасыру", diff --git a/app/javascript/gabsocial/locales/ko.json b/app/javascript/gabsocial/locales/ko.json index 7f56eb77..157fee01 100644 --- a/app/javascript/gabsocial/locales/ko.json +++ b/app/javascript/gabsocial/locales/ko.json @@ -18,7 +18,7 @@ "account.link_verified_on": "{date}에 이 링크의 소유권이 확인 됨", "account.locked_info": "이 계정의 프라이버시 설정은 잠금으로 설정되어 있습니다. 계정 소유자가 수동으로 팔로어를 승인합니다.", "account.media": "미디어", - "account.mention": "@{name}에게 글쓰기", + "account.mention": "에게 글쓰기", "account.moved_to": "{name}는 계정을 이동했습니다:", "account.mute": "@{name} 뮤트", "account.mute_notifications": "@{name}의 알림을 뮤트", diff --git a/app/javascript/gabsocial/locales/lv.json b/app/javascript/gabsocial/locales/lv.json index 832acc6d..55ec186c 100644 --- a/app/javascript/gabsocial/locales/lv.json +++ b/app/javascript/gabsocial/locales/lv.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Šīs saites piederība ir pārbaudīta {date}", "account.locked_info": "Šī konta privātuma status ir iestatīts slēgts. Īpašnieks izskatīs un izvēlēsies kas viņam drīkst sekot.", "account.media": "Mēdiji", - "account.mention": "Piemin @{name}", + "account.mention": "Piemin", "account.moved_to": "{name} ir pārvācies uz:", "account.mute": "Apklusināt @{name}", "account.mute_notifications": "Nerādīt paziņojumus no @{name}", diff --git a/app/javascript/gabsocial/locales/ms.json b/app/javascript/gabsocial/locales/ms.json index 5884c9a5..4b0adf09 100644 --- a/app/javascript/gabsocial/locales/ms.json +++ b/app/javascript/gabsocial/locales/ms.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Media", - "account.mention": "Mention @{name}", + "account.mention": "Mention", "account.moved_to": "{name} has moved to:", "account.mute": "Mute @{name}", "account.mute_notifications": "Mute notifications from @{name}", diff --git a/app/javascript/gabsocial/locales/nl.json b/app/javascript/gabsocial/locales/nl.json index 2f4b41dd..0b091125 100644 --- a/app/javascript/gabsocial/locales/nl.json +++ b/app/javascript/gabsocial/locales/nl.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Eigendom van deze link is gecontroleerd op {date}", "account.locked_info": "De privacystatus van dit account is op besloten gezet. De eigenaar bepaalt handmatig wie hen kan volgen.", "account.media": "Media", - "account.mention": "Vermeld @{name}", + "account.mention": "Vermeld", "account.moved_to": "{name} is verhuisd naar:", "account.mute": "Negeer @{name}", "account.mute_notifications": "Negeer meldingen van @{name}", diff --git a/app/javascript/gabsocial/locales/no.json b/app/javascript/gabsocial/locales/no.json index 4967e486..bbd72bbe 100644 --- a/app/javascript/gabsocial/locales/no.json +++ b/app/javascript/gabsocial/locales/no.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Media", - "account.mention": "Nevn @{name}", + "account.mention": "Nevn", "account.moved_to": "{name} har flyttet til:", "account.mute": "Demp @{name}", "account.mute_notifications": "Ignorer varsler fra @{name}", diff --git a/app/javascript/gabsocial/locales/oc.json b/app/javascript/gabsocial/locales/oc.json index 59d9b2d1..2101bfc8 100644 --- a/app/javascript/gabsocial/locales/oc.json +++ b/app/javascript/gabsocial/locales/oc.json @@ -18,7 +18,7 @@ "account.link_verified_on": "La proprietat d’aqueste ligam foguèt verificada lo {date}", "account.locked_info": "L’estatut de privacitat del compte es configurat sus clavat. Lo proprietari causís qual pòt sègre son compte.", "account.media": "Mèdias", - "account.mention": "Mencionar @{name}", + "account.mention": "Mencionar", "account.moved_to": "{name} a mudat los catons a :", "account.mute": "Rescondre @{name}", "account.mute_notifications": "Rescondre las notificacions de @{name}", diff --git a/app/javascript/gabsocial/locales/pl.json b/app/javascript/gabsocial/locales/pl.json index 9f620bcf..156c43bf 100644 --- a/app/javascript/gabsocial/locales/pl.json +++ b/app/javascript/gabsocial/locales/pl.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Własność tego odnośnika została potwierdzona {date}", "account.locked_info": "To konto jest prywatne. Właściciel ręcznie wybiera kto może go śledzić.", "account.media": "Zawartość multimedialna", - "account.mention": "Wspomnij o @{name}", + "account.mention": "Wspomnij", "account.moved_to": "{name} przeniósł(-osła) się do:", "account.mute": "Wycisz @{name}", "account.mute_notifications": "Wycisz powiadomienia o @{name}", diff --git a/app/javascript/gabsocial/locales/pt-BR.json b/app/javascript/gabsocial/locales/pt-BR.json index c06f6da4..a118b1d9 100644 --- a/app/javascript/gabsocial/locales/pt-BR.json +++ b/app/javascript/gabsocial/locales/pt-BR.json @@ -18,7 +18,7 @@ "account.link_verified_on": "A posse desse link foi verificada em {date}", "account.locked_info": "Essa conta está trancada. Se você a seguir sua solicitação será revisada manualmente.", "account.media": "Mídia", - "account.mention": "Mencionar @{name}", + "account.mention": "Mencionar", "account.moved_to": "{name} se mudou para:", "account.mute": "Silenciar @{name}", "account.mute_notifications": "Silenciar notificações de @{name}", diff --git a/app/javascript/gabsocial/locales/pt.json b/app/javascript/gabsocial/locales/pt.json index 70c31ad8..9576b79a 100644 --- a/app/javascript/gabsocial/locales/pt.json +++ b/app/javascript/gabsocial/locales/pt.json @@ -18,7 +18,7 @@ "account.link_verified_on": "A posse deste link foi verificada em {date}", "account.locked_info": "O estatuto de privacidade desta conta é fechado. O dono revê manualmente que a pode seguir.", "account.media": "Media", - "account.mention": "Mencionar @{name}", + "account.mention": "Mencionar", "account.moved_to": "{name} mudou a sua conta para:", "account.mute": "Silenciar @{name}", "account.mute_notifications": "Silenciar notificações de @{name}", diff --git a/app/javascript/gabsocial/locales/ro.json b/app/javascript/gabsocial/locales/ro.json index 6c1d4e27..ee783117 100644 --- a/app/javascript/gabsocial/locales/ro.json +++ b/app/javascript/gabsocial/locales/ro.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Deținerea acestui link a fost verificată la {date}", "account.locked_info": "Acest profil este privat. Această persoană gestioneaz manual cine o urmărește.", "account.media": "Media", - "account.mention": "Menționează @{name}", + "account.mention": "Menționează", "account.moved_to": "{name} a fost mutat la:", "account.mute": "Oprește @{name}", "account.mute_notifications": "Oprește notificările de la @{name}", diff --git a/app/javascript/gabsocial/locales/sk.json b/app/javascript/gabsocial/locales/sk.json index 568443e3..5a5fa21f 100644 --- a/app/javascript/gabsocial/locales/sk.json +++ b/app/javascript/gabsocial/locales/sk.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Vlastníctvo tohto odkazu bolo skontrolované {date}", "account.locked_info": "Stav súkromia pre tento účet je nastavený na zamknutý. Jeho vlastník sám prehodnocuje, kto ho môže sledovať.", "account.media": "Médiá", - "account.mention": "Spomeň @{name}", + "account.mention": "Spomeň", "account.moved_to": "{name} sa presunul/a na:", "account.mute": "Ignorovať @{name}", "account.mute_notifications": "Stĺm oboznámenia od @{name}", diff --git a/app/javascript/gabsocial/locales/sl.json b/app/javascript/gabsocial/locales/sl.json index 0587aa0d..dcd88c14 100644 --- a/app/javascript/gabsocial/locales/sl.json +++ b/app/javascript/gabsocial/locales/sl.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Lastništvo te povezave je bilo preverjeno {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Mediji", - "account.mention": "Omeni @{name}", + "account.mention": "Omeni", "account.moved_to": "{name} se je premaknil na:", "account.mute": "Utišaj @{name}", "account.mute_notifications": "Utišaj obvestila od @{name}", diff --git a/app/javascript/gabsocial/locales/sq.json b/app/javascript/gabsocial/locales/sq.json index b77597a9..bbedaa6e 100644 --- a/app/javascript/gabsocial/locales/sq.json +++ b/app/javascript/gabsocial/locales/sq.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Pronësia e kësaj lidhjeje qe kontrolluar më {date}", "account.locked_info": "Gjendja e privatësisë së kësaj llogarie është caktuar si e kyçur. I zoti merr dorazi në shqyrtim cilët mund ta ndjekin.", "account.media": "Media", - "account.mention": "Përmendni @{name}", + "account.mention": "Përmendni", "account.moved_to": "{name} ka kaluar te:", "account.mute": "Heshtoni @{name}", "account.mute_notifications": "Heshtoji njoftimet prej @{name}", diff --git a/app/javascript/gabsocial/locales/sr.json b/app/javascript/gabsocial/locales/sr.json index 4f94b914..81f671a9 100644 --- a/app/javascript/gabsocial/locales/sr.json +++ b/app/javascript/gabsocial/locales/sr.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Медији", - "account.mention": "Помени корисника @{name}", + "account.mention": "Помени корисника", "account.moved_to": "{name} се померио на:", "account.mute": "Ућуткај корисника @{name}", "account.mute_notifications": "Искључи обавештења од корисника @{name}", diff --git a/app/javascript/gabsocial/locales/sv.json b/app/javascript/gabsocial/locales/sv.json index 8960fe25..1ae7c06a 100644 --- a/app/javascript/gabsocial/locales/sv.json +++ b/app/javascript/gabsocial/locales/sv.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Media", - "account.mention": "Nämna @{name}", + "account.mention": "Nämna", "account.moved_to": "{name} har flyttat till:", "account.mute": "Tysta @{name}", "account.mute_notifications": "Stäng av notifieringar från @{name}", diff --git a/app/javascript/gabsocial/locales/ta.json b/app/javascript/gabsocial/locales/ta.json index ef04e94e..bf26aaf7 100644 --- a/app/javascript/gabsocial/locales/ta.json +++ b/app/javascript/gabsocial/locales/ta.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Media", - "account.mention": "Mention @{name}", + "account.mention": "Mention", "account.moved_to": "{name} has moved to:", "account.mute": "Mute @{name}", "account.mute_notifications": "Mute notifications from @{name}", diff --git a/app/javascript/gabsocial/locales/te.json b/app/javascript/gabsocial/locales/te.json index 629fa620..841ada12 100644 --- a/app/javascript/gabsocial/locales/te.json +++ b/app/javascript/gabsocial/locales/te.json @@ -18,7 +18,7 @@ "account.link_verified_on": "ఈ లంకె యొక్క యాజమాన్యం {date}న పరీక్షించబడింది", "account.locked_info": "ఈ ఖాతా యొక్క గోప్యత స్థితి లాక్ చేయబడి వుంది. ఈ ఖాతాను ఎవరు అనుసరించవచ్చో యజమానే నిర్ణయం తీసుకుంటారు.", "account.media": "మీడియా", - "account.mention": "@{name}ను ప్రస్తావించు", + "account.mention": "ప్రస్తావించు", "account.moved_to": "{name} ఇక్కడికి మారారు:", "account.mute": "@{name}ను మ్యూట్ చెయ్యి", "account.mute_notifications": "@{name}నుంచి ప్రకటనలను మ్యూట్ చెయ్యి", diff --git a/app/javascript/gabsocial/locales/th.json b/app/javascript/gabsocial/locales/th.json index db22d646..268d0a7a 100644 --- a/app/javascript/gabsocial/locales/th.json +++ b/app/javascript/gabsocial/locales/th.json @@ -18,7 +18,7 @@ "account.link_verified_on": "ตรวจสอบความเป็นเจ้าของของลิงก์นี้เมื่อ {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "สื่อ", - "account.mention": "กล่าวถึง @{name}", + "account.mention": "กล่าวถึง", "account.moved_to": "{name} ได้ย้ายไปยัง:", "account.mute": "ปิดเสียง @{name}", "account.mute_notifications": "ปิดเสียงการแจ้งเตือนจาก @{name}", diff --git a/app/javascript/gabsocial/locales/tr.json b/app/javascript/gabsocial/locales/tr.json index 0c6d735f..e6585083 100644 --- a/app/javascript/gabsocial/locales/tr.json +++ b/app/javascript/gabsocial/locales/tr.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Bu bağlantının mülkiyeti {date} tarihinde kontrol edildi", "account.locked_info": "Bu hesabın gizlilik durumu kilitli olarak ayarlanmış. Sahibi, onu kimin takip edebileceğini elle inceler.", "account.media": "Medya", - "account.mention": "@{name} kullanıcısından bahset", + "account.mention": "kullanıcısından bahset", "account.moved_to": "{name} şuraya taşındı:", "account.mute": "@{name} kullanıcısını sessize al", "account.mute_notifications": "@{name} kullanıcısının bildirimlerini kapat", diff --git a/app/javascript/gabsocial/locales/uk.json b/app/javascript/gabsocial/locales/uk.json index 416b2535..d4d61042 100644 --- a/app/javascript/gabsocial/locales/uk.json +++ b/app/javascript/gabsocial/locales/uk.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "Медіа", - "account.mention": "Згадати @{name}", + "account.mention": "Згадати", "account.moved_to": "{name} переїхав на:", "account.mute": "Заглушити @{name}", "account.mute_notifications": "Не показувати сповіщення від @{name}", diff --git a/app/javascript/gabsocial/locales/zh-CN.json b/app/javascript/gabsocial/locales/zh-CN.json index bd53d86b..766161ff 100644 --- a/app/javascript/gabsocial/locales/zh-CN.json +++ b/app/javascript/gabsocial/locales/zh-CN.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "媒体", - "account.mention": "提及 @{name}", + "account.mention": "提及", "account.moved_to": "{name} 已经迁移到:", "account.mute": "隐藏 @{name}", "account.mute_notifications": "隐藏来自 @{name} 的通知", diff --git a/app/javascript/gabsocial/locales/zh-HK.json b/app/javascript/gabsocial/locales/zh-HK.json index e51f197c..f3fb9db2 100644 --- a/app/javascript/gabsocial/locales/zh-HK.json +++ b/app/javascript/gabsocial/locales/zh-HK.json @@ -18,7 +18,7 @@ "account.link_verified_on": "Ownership of this link was checked on {date}", "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", "account.media": "媒體", - "account.mention": "提及 @{name}", + "account.mention": "提及", "account.moved_to": "{name} 已經遷移到:", "account.mute": "將 @{name} 靜音", "account.mute_notifications": "將來自 @{name} 的通知靜音", diff --git a/app/javascript/gabsocial/locales/zh-TW.json b/app/javascript/gabsocial/locales/zh-TW.json index fa27485f..1e9161da 100644 --- a/app/javascript/gabsocial/locales/zh-TW.json +++ b/app/javascript/gabsocial/locales/zh-TW.json @@ -18,7 +18,7 @@ "account.link_verified_on": "此連結的所有權已在 {date} 檢查", "account.locked_info": "此帳號的隱私狀態被設為鎖定,擁有者將手動審核可關注此帳號的人。", "account.media": "媒體", - "account.mention": "提及 @{name}", + "account.mention": "提及", "account.moved_to": "{name} 已遷移至:", "account.mute": "靜音 @{name}", "account.mute_notifications": "靜音來自 @{name} 的通知", diff --git a/app/javascript/gabsocial/reducers/notifications.js b/app/javascript/gabsocial/reducers/notifications.js index 4d9604de..7531165f 100644 --- a/app/javascript/gabsocial/reducers/notifications.js +++ b/app/javascript/gabsocial/reducers/notifications.js @@ -6,6 +6,9 @@ import { NOTIFICATIONS_FILTER_SET, NOTIFICATIONS_CLEAR, NOTIFICATIONS_SCROLL_TOP, + NOTIFICATIONS_UPDATE_QUEUE, + NOTIFICATIONS_DEQUEUE, + MAX_QUEUED_NOTIFICATIONS, } from '../actions/notifications'; import { ACCOUNT_BLOCK_SUCCESS, @@ -21,6 +24,8 @@ const initialState = ImmutableMap({ top: false, unread: 0, isLoading: false, + queuedNotifications: ImmutableList(), //max = MAX_QUEUED_NOTIFICATIONS + totalQueuedNotificationsCount: 0, //used for queuedItems overflow for MAX_QUEUED_NOTIFICATIONS+ }); const notificationToMap = notification => ImmutableMap({ @@ -93,6 +98,32 @@ const deleteByStatus = (state, statusId) => { return state.update('items', list => list.filterNot(item => item !== null && item.get('status') === statusId)); }; +const updateNotificationsQueue = (state, notification, intlMessages, intlLocale) => { + const queuedNotifications = state.getIn(['queuedNotifications'], ImmutableList()); + const listedNotifications = state.getIn(['items'], ImmutableList()); + const totalQueuedNotificationsCount = state.getIn(['totalQueuedNotificationsCount'], 0); + + let alreadyExists = queuedNotifications.find(existingQueuedNotification => existingQueuedNotification.id === notification.id); + if (!alreadyExists) alreadyExists = listedNotifications.find(existingListedNotification => existingListedNotification.get('id') === notification.id); + + if (alreadyExists) { + return state; + } + + let newQueuedNotifications = queuedNotifications; + + return state.withMutations(mutable => { + if (totalQueuedNotificationsCount <= MAX_QUEUED_NOTIFICATIONS) { + mutable.set('queuedNotifications', newQueuedNotifications.push({ + notification, + intlMessages, + intlLocale, + })); + } + mutable.set('totalQueuedNotificationsCount', totalQueuedNotificationsCount + 1); + }); +}; + export default function notifications(state = initialState, action) { switch(action.type) { case NOTIFICATIONS_EXPAND_REQUEST: @@ -105,6 +136,13 @@ export default function notifications(state = initialState, action) { return updateTop(state, action.top); case NOTIFICATIONS_UPDATE: return normalizeNotification(state, action.notification); + case NOTIFICATIONS_UPDATE_QUEUE: + return updateNotificationsQueue(state, action.notification, action.intlMessages, action.intlLocale); + case NOTIFICATIONS_DEQUEUE: + return state.withMutations(mutable => { + mutable.set('queuedNotifications', ImmutableList()) + mutable.set('totalQueuedNotificationsCount', 0) + }); case NOTIFICATIONS_EXPAND_SUCCESS: return expandNormalizedNotifications(state, action.notifications, action.next); case ACCOUNT_BLOCK_SUCCESS: diff --git a/app/javascript/gabsocial/reducers/settings.js b/app/javascript/gabsocial/reducers/settings.js index 558180f8..99f0c718 100644 --- a/app/javascript/gabsocial/reducers/settings.js +++ b/app/javascript/gabsocial/reducers/settings.js @@ -1,6 +1,5 @@ import { SETTING_CHANGE, SETTING_SAVE } from '../actions/settings'; import { NOTIFICATIONS_FILTER_SET } from '../actions/notifications'; -import { COLUMN_PARAMS_CHANGE } from '../actions/columns'; import { STORE_HYDRATE } from '../actions/store'; import { EMOJI_USE } from '../actions/emojis'; import { LIST_DELETE_SUCCESS, LIST_FETCH_FAIL } from '../actions/lists'; @@ -88,17 +87,6 @@ const defaultColumns = fromJS([ const hydrate = (state, settings) => state.mergeDeep(settings).update('columns', (val = defaultColumns) => val); -const changeColumnParams = (state, uuid, path, value) => { - const columns = state.get('columns'); - const index = columns.findIndex(item => item.get('uuid') === uuid); - - const newColumns = columns.update(index, column => column.updateIn(['params', ...path], () => value)); - - return state - .set('columns', newColumns) - .set('saved', false); -}; - const updateFrequentEmojis = (state, emoji) => state.update('frequentlyUsedEmojis', ImmutableMap(), map => map.update(emoji.id, 0, count => count + 1)).set('saved', false); const filterDeadListColumns = (state, listId) => state.update('columns', columns => columns.filterNot(column => column.get('id') === 'LIST' && column.get('params').get('id') === listId)); @@ -112,8 +100,6 @@ export default function settings(state = initialState, action) { return state .setIn(action.path, action.value) .set('saved', false); - case COLUMN_PARAMS_CHANGE: - return changeColumnParams(state, action.uuid, action.path, action.value); case EMOJI_USE: return updateFrequentEmojis(state, action.emoji); case SETTING_SAVE: diff --git a/app/javascript/gabsocial/reducers/timelines.js b/app/javascript/gabsocial/reducers/timelines.js index 8e20bdf3..b0c1babf 100644 --- a/app/javascript/gabsocial/reducers/timelines.js +++ b/app/javascript/gabsocial/reducers/timelines.js @@ -7,6 +7,9 @@ import { TIMELINE_EXPAND_FAIL, TIMELINE_CONNECT, TIMELINE_DISCONNECT, + TIMELINE_UPDATE_QUEUE, + TIMELINE_DEQUEUE, + MAX_QUEUED_ITEMS, } from '../actions/timelines'; import { ACCOUNT_BLOCK_SUCCESS, @@ -25,6 +28,8 @@ const initialTimeline = ImmutableMap({ isLoading: false, hasMore: true, items: ImmutableList(), + queuedItems: ImmutableList(), //max= MAX_QUEUED_ITEMS + totalQueuedItemsCount: 0, //used for queuedItems overflow for MAX_QUEUED_ITEMS+ }); const expandNormalizedTimeline = (state, timeline, statuses, next, isPartial, isLoadingRecent) => { @@ -77,6 +82,28 @@ const updateTimeline = (state, timeline, status) => { })); }; +const updateTimelineQueue = (state, timeline, status) => { + const queuedStatuses = state.getIn([timeline, 'queuedItems'], ImmutableList()); + const listedStatuses = state.getIn([timeline, 'items'], ImmutableList()); + const totalQueuedItemsCount = state.getIn([timeline, 'totalQueuedItemsCount'], 0); + + let alreadyExists = queuedStatuses.find(existingQueuedStatus => existingQueuedStatus.get('id') === status.get('id')); + if (!alreadyExists) alreadyExists = listedStatuses.find(existingListedStatusId => existingListedStatusId === status.get('id')); + + if (alreadyExists) { + return state; + } + + let newQueuedStatuses = queuedStatuses; + + return state.update(timeline, initialTimeline, map => map.withMutations(mMap => { + if (totalQueuedItemsCount <= MAX_QUEUED_ITEMS) { + mMap.set('queuedItems', newQueuedStatuses.push(status)); + } + mMap.set('totalQueuedItemsCount', totalQueuedItemsCount + 1); + })); +}; + const deleteStatus = (state, id, accountId, references, exclude_account = null) => { state.keySeq().forEach(timeline => { if (exclude_account === null || (timeline !== `account:${exclude_account}` && !timeline.startsWith(`account:${exclude_account}:`))) @@ -126,6 +153,13 @@ export default function timelines(state = initialState, action) { return expandNormalizedTimeline(state, action.timeline, fromJS(action.statuses), action.next, action.partial, action.isLoadingRecent); case TIMELINE_UPDATE: return updateTimeline(state, action.timeline, fromJS(action.status)); + case TIMELINE_UPDATE_QUEUE: + return updateTimelineQueue(state, action.timeline, fromJS(action.status)); + case TIMELINE_DEQUEUE: + return state.update(action.timeline, initialTimeline, map => map.withMutations(mMap => { + mMap.set('queuedItems', ImmutableList()) + mMap.set('totalQueuedItemsCount', 0) + })); case TIMELINE_DELETE: return deleteStatus(state, action.id, action.accountId, action.references, action.reblogOf); case TIMELINE_CLEAR: diff --git a/app/javascript/images/gab-icons/icon-explore-00d177.svg b/app/javascript/images/gab-icons/icon-explore-00d177.svg deleted file mode 100644 index 4d38ecfb..00000000 --- a/app/javascript/images/gab-icons/icon-explore-00d177.svg +++ /dev/null @@ -1 +0,0 @@ -icon-explore-00d177 \ No newline at end of file diff --git a/app/javascript/images/gab-icons/icon-explore-d8d8d8.svg b/app/javascript/images/gab-icons/icon-explore-d8d8d8.svg deleted file mode 100644 index 8b168c5b..00000000 --- a/app/javascript/images/gab-icons/icon-explore-d8d8d8.svg +++ /dev/null @@ -1 +0,0 @@ -icon-explore-d8d8d8 \ No newline at end of file diff --git a/app/javascript/images/gab-icons/icon-explore-sprite.svg b/app/javascript/images/gab-icons/icon-explore-sprite.svg deleted file mode 100644 index e078899b..00000000 --- a/app/javascript/images/gab-icons/icon-explore-sprite.svg +++ /dev/null @@ -1 +0,0 @@ -icon-explore-sprite \ No newline at end of file diff --git a/app/javascript/images/gab-icons/icon-home-00d177.svg b/app/javascript/images/gab-icons/icon-home-00d177.svg deleted file mode 100644 index a6472761..00000000 --- a/app/javascript/images/gab-icons/icon-home-00d177.svg +++ /dev/null @@ -1 +0,0 @@ -navigation-icon-master \ No newline at end of file diff --git a/app/javascript/images/gab-icons/icon-home-d8d8d8.svg b/app/javascript/images/gab-icons/icon-home-d8d8d8.svg deleted file mode 100644 index 0f9f8556..00000000 --- a/app/javascript/images/gab-icons/icon-home-d8d8d8.svg +++ /dev/null @@ -1 +0,0 @@ -navigation-icon-master \ No newline at end of file diff --git a/app/javascript/images/gab-icons/icon-home-sprite.svg b/app/javascript/images/gab-icons/icon-home-sprite.svg deleted file mode 100644 index a4dfeb04..00000000 --- a/app/javascript/images/gab-icons/icon-home-sprite.svg +++ /dev/null @@ -1 +0,0 @@ -icon-home-sprite \ No newline at end of file diff --git a/app/javascript/images/gab-icons/icon-messages-00d177.svg b/app/javascript/images/gab-icons/icon-messages-00d177.svg deleted file mode 100644 index a14e271e..00000000 --- a/app/javascript/images/gab-icons/icon-messages-00d177.svg +++ /dev/null @@ -1 +0,0 @@ -icon-messages-00d177 \ No newline at end of file diff --git a/app/javascript/images/gab-icons/icon-messages-d8d8d8.svg b/app/javascript/images/gab-icons/icon-messages-d8d8d8.svg deleted file mode 100644 index 6adca67c..00000000 --- a/app/javascript/images/gab-icons/icon-messages-d8d8d8.svg +++ /dev/null @@ -1 +0,0 @@ -icon-messages-d8d8d8 \ No newline at end of file diff --git a/app/javascript/images/gab-icons/icon-messages-sprite.svg b/app/javascript/images/gab-icons/icon-messages-sprite.svg deleted file mode 100644 index 29a12ed0..00000000 --- a/app/javascript/images/gab-icons/icon-messages-sprite.svg +++ /dev/null @@ -1 +0,0 @@ -icon-messages-sprite \ No newline at end of file diff --git a/app/javascript/images/gab-icons/icon-new-gab.svg b/app/javascript/images/gab-icons/icon-new-gab.svg deleted file mode 100644 index 1eb8be5a..00000000 --- a/app/javascript/images/gab-icons/icon-new-gab.svg +++ /dev/null @@ -1 +0,0 @@ -icon-new-gab \ No newline at end of file diff --git a/app/javascript/images/gab-icons/icon-notifications-00d177.svg b/app/javascript/images/gab-icons/icon-notifications-00d177.svg deleted file mode 100644 index df635d7d..00000000 --- a/app/javascript/images/gab-icons/icon-notifications-00d177.svg +++ /dev/null @@ -1 +0,0 @@ -icon-notifications-00d177 \ No newline at end of file diff --git a/app/javascript/images/gab-icons/icon-notifications-d8d8d8.svg b/app/javascript/images/gab-icons/icon-notifications-d8d8d8.svg deleted file mode 100644 index 0f4ee958..00000000 --- a/app/javascript/images/gab-icons/icon-notifications-d8d8d8.svg +++ /dev/null @@ -1 +0,0 @@ -icon-notifications-d8d8d8 \ No newline at end of file diff --git a/app/javascript/images/gab-icons/icon-notifications-sprite.svg b/app/javascript/images/gab-icons/icon-notifications-sprite.svg deleted file mode 100644 index c2fd0061..00000000 --- a/app/javascript/images/gab-icons/icon-notifications-sprite.svg +++ /dev/null @@ -1 +0,0 @@ -icon-notifications-sprite \ No newline at end of file diff --git a/app/javascript/images/gab-icons/icon-search-sprite.svg b/app/javascript/images/gab-icons/icon-search-sprite.svg deleted file mode 100644 index e18d4c18..00000000 --- a/app/javascript/images/gab-icons/icon-search-sprite.svg +++ /dev/null @@ -1 +0,0 @@ -icon-search-sprite \ No newline at end of file diff --git a/app/javascript/images/sprite-main-navigation-links.png b/app/javascript/images/sprite-main-navigation-links.png new file mode 100644 index 00000000..9e871b70 Binary files /dev/null and b/app/javascript/images/sprite-main-navigation-links.png differ diff --git a/app/javascript/styles/gabsocial/components.scss b/app/javascript/styles/gabsocial/components.scss index 2dce18e5..11373a5a 100644 --- a/app/javascript/styles/gabsocial/components.scss +++ b/app/javascript/styles/gabsocial/components.scss @@ -1380,6 +1380,7 @@ a.account__display-name { .ui { display: block; width: 100%; + padding: 0 0 100px 0; .page { display: flex; @@ -5103,3 +5104,25 @@ noscript { } } } + +.timeline-queue-header { + display: block; + width: 100%; + height: 52px; + position: relative; + background-color: darken($ui-base-color, 8%); + border-bottom: 1px solid; + border-top: 1px solid; + border-color: darken($ui-base-color, 4%); + + &__btn { + display: block; + width: 100%; + height: 100%; + text-align: center; + line-height: 52px; + font-size: 14px; + cursor: pointer; + color: $secondary-text-color; + } +} diff --git a/app/javascript/styles/gabsocial/components/tabs-bar.scss b/app/javascript/styles/gabsocial/components/tabs-bar.scss index 3ed4d1a8..1fcae0d4 100644 --- a/app/javascript/styles/gabsocial/components/tabs-bar.scss +++ b/app/javascript/styles/gabsocial/components/tabs-bar.scss @@ -116,7 +116,7 @@ } } - +////////////////////////////////////////////////////////////////////////////////////////// .tabs-bar__link { display: flex; @@ -126,72 +126,101 @@ text-decoration: none; text-align: center; background-repeat: no-repeat; - - // NOTE - Explore not using SVG for the navigation icons. - // The icon pixels shift around too much on crappy screens in certain situations - // If switched to an @2x png sprite, subtle shading and color can be introduced - + background-image: url('../images/sprite-main-navigation-links.png'); + background-size: auto 84px; + @media screen and (max-width: $nav-breakpoint-1) { + background-size: auto 120px; + width: 46px; + height: 42px; + margin: 4px 0 0 0; + padding: 0 !important; + &.active { + height: 38px; + border-bottom: 4px solid $gab-default-text-light; + } + & span {display: none;} + } &.home { padding: 16px 0 0 25px; - background-image: url('../images/gab-icons/icon-home-sprite.svg'); - background-size: 17px 114px; - background-position: 0 -82px; - &.active{background-position: 0 18px;} + background-position: 0 18px; + &.active {background-position: 0 -52px;} @media screen and (max-width: $nav-breakpoint-1) { - background-size: 24px 160.94px; - @-moz-document url-prefix() { - &.active{background-position: center 10px !important;} - } + background-position: 11px 11px; + &.active {background-position: 11px -89px;} } } - &.explore, - &.notifications, - &.messages, - &.groups, - &.optional { + &.notifications { padding: 16px 0 0 23px; - background-size: 14px 114px; + background-position: -140px 18px; + &.active {background-position: -140px -52px;} @media screen and (max-width: $nav-breakpoint-1) { - background-size: 20px 160.94px; + background-position: -186px 11px; + &.active {background-position: -186px -89px;} + } + } + &.groups { + padding: 16px 0 0 28px; + background-position: -280px 18px; + &.active {background-position: -280px -52px;} + @media screen and (max-width: $nav-breakpoint-1) { + background-position: -390px 11px; + &.active {background-position: -390px -89px;} } - - background-position: 0 -82px; - &.active{background-position: 0 18px;} } - &.explore {background-image: url('../images/gab-icons/icon-explore-sprite.svg');} - &.notifications {background-image: url('../images/gab-icons/icon-notifications-sprite.svg');} - &.messages {background-image: url('../images/gab-icons/icon-messages-sprite.svg');} - &.optional {background-image: url('../images/gab-icons/icon-search-sprite.svg');} - &.groups {background-image: url('../images/gab-icons/icon-explore-sprite.svg');} - - &.optional { display: none; - @media screen and (max-width: $nav-breakpoint-2) {display: flex;} + @media screen and (max-width: $nav-breakpoint-2) { + display: flex; + background-position: -987px 11px; + &.active {background-position: -987px -89px;} + } } + + // &.notifications, + // &.explore, + // &.messages, + // &.optional { + // padding: 16px 0 0 23px; + // background-size: 14px 114px; + // @media screen and (max-width: $nav-breakpoint-1) {background-size: 20px 160.94px;} + // background-position: 0 -82px; + // &.active{background-position: 0 18px;} + // } + // &.explore {background-image: url('../images/gab-icons/icon-explore-sprite.svg');} + // &.notifications {background-image: url('../images/gab-icons/icon-notifications-sprite.svg');} + // &.messages {background-image: url('../images/gab-icons/icon-messages-sprite.svg');} + // &.groups {background-image: url('../images/gab-icons/icon-groups-sprite.svg');} + // &.optional {background-image: url('../images/gab-icons/icon-search-sprite.svg');} + // &.optional { + // display: none; + // @media screen and (max-width: $nav-breakpoint-2) {display: flex;} + // } + + // REWORK THIS BECAUSE OF FIREFOX BUGS - @media screen and (max-width: $nav-breakpoint-1) { - &.home, - &.explore, - &.notifications, - &.messages, - &.optional { - width: 46px; - height: 42px; - margin: 4px 0 0 0; - padding: 0; - background-position: center -130px; - &.active { - height: 38px; - border-bottom: 4px solid $gab-default-text-light; - background-position: center 11px; - } - } - & span {display: none;} - } + // @media screen and (max-width: $nav-breakpoint-1) { + // &.home, + // &.notifications, + // &.groups, + // &.explore, + // &.messages, + // &.optional { + // width: 46px; + // height: 42px; + // margin: 4px 0 0 0; + // padding: 0; + // background-position: center -130px; + // &.active { + // height: 38px; + // border-bottom: 4px solid $gab-default-text-light; + // background-position: center 11px; + // } + // } + // & span {display: none;} + // } // END REWORK diff --git a/app/javascript/styles/gabsocial/polls.scss b/app/javascript/styles/gabsocial/polls.scss index 0d55afda..b1cc6017 100644 --- a/app/javascript/styles/gabsocial/polls.scss +++ b/app/javascript/styles/gabsocial/polls.scss @@ -15,11 +15,8 @@ height: 100%; display: inline-block; border-radius: 4px; - background: darken($ui-primary-color, 14%); - - &.leading { - background: $ui-highlight-color; - } + background: rgba($gab-placeholder-accent, .3); + &.leading {background: rgba($gab-placeholder-accent, .6);} } &__text { @@ -31,7 +28,7 @@ white-space: nowrap; overflow: hidden; text-overflow: ellipsis; - + color: #fff; input[type=radio], input[type=checkbox] { display: none; diff --git a/app/javascript/styles/gabsocial/scrollbars.scss b/app/javascript/styles/gabsocial/scrollbars.scss index 203068e6..88216f89 100644 --- a/app/javascript/styles/gabsocial/scrollbars.scss +++ b/app/javascript/styles/gabsocial/scrollbars.scss @@ -2,41 +2,35 @@ // Content containers are meant to behave much differently than the mastodon default UI // For now linking default gab colors to replace the base UI colors and formulas -html { - scrollbar-color: lighten($gab-background-container, 4%) $gab-background-container; -} - +html {scrollbar-color: lighten($gab-background-container, 4%) $gab-background-container;} ::-webkit-scrollbar { - width: 12px; - height: 12px; + width: 12px; + height: 12px; } - ::-webkit-scrollbar-thumb { - background: lighten($gab-background-container, 4%); - border: none; + border: none; + background: rgba($gab-placeholder-accent, .5); + @at-root body.theme-gabsocial-light#{&} {background: rgba($gab-background-container-light, .3);} } - ::-webkit-scrollbar-thumb:hover { - background: lighten($gab-background-container, 6%); + background: rgba($gab-placeholder-accent, .75); + @at-root body.theme-gabsocial-light#{&} {background: rgba($gab-background-container-light, .4);} } - ::-webkit-scrollbar-thumb:active { - background: lighten($gab-background-container, 4%); + background: $gab-placeholder-accent; + @at-root body.theme-gabsocial-light#{&} {background: rgba($gab-background-container-light, .5);} } - ::-webkit-scrollbar-track { - border: none; - background: $gab-background-container; + border: none; + background: rgba($gab-background-container, .5); + @at-root body.theme-gabsocial-light#{&} {background: rgba($gab-background-base, .3);} } - ::-webkit-scrollbar-track:hover { - background: lighten($gab-background-container, 4%); + background: rgba($gab-background-container, .75); + @at-root body.theme-gabsocial-light#{&} {background: rgba($gab-background-base, .4);} } - ::-webkit-scrollbar-track:active { - background: $gab-background-container; + background: $gab-background-container; + @at-root body.theme-gabsocial-light#{&} {background: rgba($gab-background-base, .5);} } - -::-webkit-scrollbar-corner { - background: transparent; -} \ No newline at end of file +::-webkit-scrollbar-corner {background: transparent;} \ No newline at end of file diff --git a/app/lib/feed_manager.rb b/app/lib/feed_manager.rb index 02e9cb64..c903f9d1 100644 --- a/app/lib/feed_manager.rb +++ b/app/lib/feed_manager.rb @@ -30,7 +30,7 @@ class FeedManager def push_to_home(account, status) return false unless add_to_feed(:home, account.id, status, account.user&.aggregates_reblogs?) trim(:home, account.id) - #PushUpdateWorker.perform_async(account.id, status.id, "timeline:#{account.id}") if push_update_required?("timeline:#{account.id}") + PushUpdateWorker.perform_async(account.id, status.id, "timeline:#{account.id}") if push_update_required?("timeline:#{account.id}") true end @@ -48,7 +48,7 @@ class FeedManager end return false unless add_to_feed(:list, list.id, status, list.account.user&.aggregates_reblogs?) trim(:list, list.id) - #PushUpdateWorker.perform_async(list.account_id, status.id, "timeline:list:#{list.id}") if push_update_required?("timeline:list:#{list.id}") + PushUpdateWorker.perform_async(list.account_id, status.id, "timeline:list:#{list.id}") if push_update_required?("timeline:list:#{list.id}") true end diff --git a/app/lib/ostatus/activity/creation.rb b/app/lib/ostatus/activity/creation.rb index cede5750..2b258afe 100644 --- a/app/lib/ostatus/activity/creation.rb +++ b/app/lib/ostatus/activity/creation.rb @@ -90,7 +90,7 @@ class OStatus::Activity::Creation < OStatus::Activity::Base end def visibility_scope - @xml.at_xpath('./gabsocial:scope', gabsocial: OStatus::TagManager::MTDN_XMLNS)&.content&.to_sym || :public + @xml.at_xpath('./mastodon:scope', mastodon: OStatus::TagManager::MTDN_XMLNS)&.content&.to_sym || :public end def published diff --git a/app/lib/ostatus/atom_serializer.rb b/app/lib/ostatus/atom_serializer.rb index 1967dcb1..17115444 100644 --- a/app/lib/ostatus/atom_serializer.rb +++ b/app/lib/ostatus/atom_serializer.rb @@ -32,7 +32,7 @@ class OStatus::AtomSerializer append_element(author, 'poco:preferredUsername', account.username) append_element(author, 'poco:displayName', account.display_name) if account.display_name? append_element(author, 'poco:note', account.local? ? account.note : strip_tags(account.note)) if account.note? - append_element(author, 'gabsocial:scope', account.locked? ? :private : :public) + append_element(author, 'mastodon:scope', account.locked? ? :private : :public) author end @@ -345,7 +345,7 @@ class OStatus::AtomSerializer parent['xmlns:poco'] = OStatus::TagManager::POCO_XMLNS parent['xmlns:media'] = OStatus::TagManager::MEDIA_XMLNS parent['xmlns:ostatus'] = OStatus::TagManager::OS_XMLNS - parent['xmlns:gabsocial'] = OStatus::TagManager::MTDN_XMLNS + parent['xmlns:mastodon'] = OStatus::TagManager::MTDN_XMLNS end def serialize_status_attributes(entry, status) @@ -369,7 +369,7 @@ class OStatus::AtomSerializer end append_element(entry, 'category', nil, term: 'nsfw') if status.sensitive? && status.media_attachments.any? - append_element(entry, 'gabsocial:scope', status.visibility) + append_element(entry, 'mastodon:scope', status.visibility) status.emojis.each do |emoji| append_element(entry, 'link', nil, rel: :emoji, href: full_asset_url(emoji.image.url), name: emoji.shortcode) diff --git a/app/models/remote_profile.rb b/app/models/remote_profile.rb index d79b8eb8..742d2b56 100644 --- a/app/models/remote_profile.rb +++ b/app/models/remote_profile.rb @@ -30,7 +30,7 @@ class RemoteProfile end def scope - @scope ||= author.at_xpath('./gabsocial:scope', gabsocial: OStatus::TagManager::MTDN_XMLNS)&.content + @scope ||= author.at_xpath('./mastodon:scope', mastodon: OStatus::TagManager::MTDN_XMLNS)&.content end def avatar diff --git a/app/services/fan_out_on_write_service.rb b/app/services/fan_out_on_write_service.rb index fa0267ad..f62fa66d 100644 --- a/app/services/fan_out_on_write_service.rb +++ b/app/services/fan_out_on_write_service.rb @@ -89,15 +89,15 @@ class FanOutOnWriteService < BaseService def deliver_to_public(status) Rails.logger.debug "Delivering status #{status.id} to public timeline" - # Redis.current.publish('timeline:public', @payload) - # Redis.current.publish('timeline:public:local', @payload) if status.local? + Redis.current.publish('timeline:public', @payload) + Redis.current.publish('timeline:public:local', @payload) if status.local? end def deliver_to_media(status) Rails.logger.debug "Delivering status #{status.id} to media timeline" - # Redis.current.publish('timeline:public:media', @payload) - # Redis.current.publish('timeline:public:local:media', @payload) if status.local? + Redis.current.publish('timeline:public:media', @payload) + Redis.current.publish('timeline:public:local:media', @payload) if status.local? end def deliver_to_own_conversation(status) diff --git a/app/views/about/_registration.html.haml b/app/views/about/_registration.html.haml index 0f7bd4d0..8f63f91a 100644 --- a/app/views/about/_registration.html.haml +++ b/app/views/about/_registration.html.haml @@ -16,7 +16,7 @@ = invite_request_fields.input :text, as: :text, wrapper: :with_block_label, required: false .fields-group - = f.input :agreement, as: :boolean, wrapper: :with_label, label: t('auth.checkbox_agreement_html', rules_path: homepage_path, about_tos_path: about_tos_path), disabled: closed_registrations? + = f.input :agreement, as: :boolean, wrapper: :with_label, label: t('auth.checkbox_agreement_html', about_tos_path: about_tos_path), disabled: closed_registrations? .actions = f.button :button, sign_up_message, type: :submit, class: 'button button-primary', disabled: closed_registrations? diff --git a/app/views/auth/registrations/new.html.haml b/app/views/auth/registrations/new.html.haml index f3d27cee..40d57b67 100644 --- a/app/views/auth/registrations/new.html.haml +++ b/app/views/auth/registrations/new.html.haml @@ -33,7 +33,7 @@ = f.input :invite_code, as: :hidden .fields-group - = f.input :agreement, as: :boolean, wrapper: :with_label, label: t('auth.checkbox_agreement_html', rules_path: about_privacy_path, about_tos_path: about_tos_path) + = f.input :agreement, as: :boolean, wrapper: :with_label, label: t('auth.checkbox_agreement_html', about_tos_path: about_tos_path) .actions = f.button :button, @invite.present? ? t('auth.register') : sign_up_message, type: :submit diff --git a/app/workers/push_conversation_worker.rb b/app/workers/push_conversation_worker.rb index f7a1c7a1..77f5895c 100644 --- a/app/workers/push_conversation_worker.rb +++ b/app/workers/push_conversation_worker.rb @@ -7,7 +7,7 @@ class PushConversationWorker conversation = AccountConversation.find(conversation_account_id) message = InlineRenderer.render(conversation, conversation.account, :conversation) timeline_id = "timeline:direct:#{conversation.account_id}" - # Redis.current.publish(timeline_id, Oj.dump(event: :conversation, payload: message, queued_at: (Time.now.to_f * 1000.0).to_i)) + Redis.current.publish(timeline_id, Oj.dump(event: :conversation, payload: message, queued_at: (Time.now.to_f * 1000.0).to_i)) true rescue ActiveRecord::RecordNotFound true diff --git a/app/workers/push_update_worker.rb b/app/workers/push_update_worker.rb index 6ed4906b..a491848e 100644 --- a/app/workers/push_update_worker.rb +++ b/app/workers/push_update_worker.rb @@ -9,7 +9,7 @@ class PushUpdateWorker message = InlineRenderer.render(status, account, :status) timeline_id = "timeline:#{account.id}" if timeline_id.nil? - # Redis.current.publish(timeline_id, Oj.dump(event: :update, payload: message, queued_at: (Time.now.to_f * 1000.0).to_i)) + Redis.current.publish(timeline_id, Oj.dump(event: :update, payload: message, queued_at: (Time.now.to_f * 1000.0).to_i)) true rescue ActiveRecord::RecordNotFound true diff --git a/config/locales/ca.yml b/config/locales/ca.yml index bfa7f176..0f6d5c0d 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -515,7 +515,7 @@ ca: auth: apply_for_account: Demana una invitació change_password: Contrasenya - checkbox_agreement_html: Estic d'acord amb les normes del servidor i els termes del servei + checkbox_agreement_html: Estic d’acord amb els termes del servei. confirm_email: Confirmar correu electrònic delete_account: Suprimeix el compte delete_account_html: Si vols suprimir el compte pots fer-ho aquí. Se't demanarà confirmació. diff --git a/config/locales/co.yml b/config/locales/co.yml index e6caa923..e60bf696 100644 --- a/config/locales/co.yml +++ b/config/locales/co.yml @@ -515,7 +515,7 @@ co: auth: apply_for_account: Dumandà un'invitazione change_password: Chjave d’accessu - checkbox_agreement_html: Sò d'accunsentu cù e regule di u servore è i termini di u serviziu + checkbox_agreement_html: Sò in conformità à a termina di u serviziu confirm_email: Cunfirmà l’e-mail delete_account: Sguassà u contu delete_account_html: S’è voi vulete toglie u vostru contu ghjè quì. Duverete cunfirmà a vostra scelta. diff --git a/config/locales/cs.yml b/config/locales/cs.yml index ecde64a1..04df996c 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -521,7 +521,7 @@ cs: auth: apply_for_account: Vyžádat si pozvánku change_password: Heslo - checkbox_agreement_html: Souhlasím s pravidly serveru a podmínkami používání + checkbox_agreement_html: Souhlasím s Smluvními podmínkami confirm_email: Potvrdit e-mail delete_account: Odstranit účet delete_account_html: Chcete-li odstranit svůj účet, pokračujte zde. Budete požádán/a o potvrzení. diff --git a/config/locales/de.yml b/config/locales/de.yml index d2b64a3b..d5c77be3 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -515,7 +515,7 @@ de: auth: apply_for_account: Eine Einladung anfragen change_password: Passwort - checkbox_agreement_html: Ich akzeptiere die Server-Regeln und die Nutzungsbedingungen + checkbox_agreement_html: Ich akzeptiere die Nutzungsbedingungen confirm_email: E-Mail bestätigen delete_account: Konto löschen delete_account_html: Falls du dein Konto löschen willst, kannst du hier damit fortfahren. Du wirst um Bestätigung gebeten werden. diff --git a/config/locales/el.yml b/config/locales/el.yml index af6a88e4..56fdc013 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -508,7 +508,7 @@ el: auth: apply_for_account: Αίτηση πρόσκλησης change_password: Συνθηματικό - checkbox_agreement_html: Συμφωνώ με τους κανονισμούς του κόμβου και τους όρους χρήσης + checkbox_agreement_html: Συμφωνώ με τους όρους χρήσης confirm_email: Επιβεβαίωση email delete_account: Διαγραφή email delete_account_html: Αν θέλεις να διαγράψεις το λογαριασμό σου, μπορείς να συνεχίσεις εδώ. Θα σου ζητηθεί επιβεβαίωση. diff --git a/config/locales/en.yml b/config/locales/en.yml index ae3484c0..56a785c8 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -523,7 +523,7 @@ en: auth: apply_for_account: Request an invite change_password: Password - checkbox_agreement_html: I agree to the server rules and terms of service + checkbox_agreement_html: I agree to the Terms of Service. confirm_email: Confirm email delete_account: Delete account delete_account_html: If you wish to delete your account, you can proceed here. You will be asked for confirmation. diff --git a/config/locales/en_GB.yml b/config/locales/en_GB.yml index 0c2625bb..ccc2017f 100644 --- a/config/locales/en_GB.yml +++ b/config/locales/en_GB.yml @@ -508,7 +508,7 @@ en_GB: auth: apply_for_account: Request an invite change_password: Password - checkbox_agreement_html: I agree to the Terms of Service + checkbox_agreement_html: I agree to the Terms of Service. confirm_email: Confirm email delete_account: Delete account delete_account_html: If you wish to delete your account, you can proceed here. You will be asked for confirmation. diff --git a/config/locales/eo.yml b/config/locales/eo.yml index ac4a8f9f..be2779b1 100644 --- a/config/locales/eo.yml +++ b/config/locales/eo.yml @@ -509,7 +509,7 @@ eo: auth: apply_for_account: Peti inviton change_password: Pasvorto - checkbox_agreement_html: Mi samopinii al la Servo reguloj kaj kondiĉo al servadon + checkbox_agreement_html: Mi konsentas kun la kondiĉoj de servo confirm_email: Konfirmi retadreson delete_account: Forigi konton delete_account_html: Se vi deziras forigi vian konton, vi povas fari tion ĉi tie. Vi bezonos konfirmi vian peton. diff --git a/config/locales/fa.yml b/config/locales/fa.yml index 8fda7d98..8b6115e2 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -508,7 +508,7 @@ fa: auth: apply_for_account: درخواست دعوت‌نامه change_password: رمز - checkbox_agreement_html: من قانون‌های این سرور و شرایط کاربری را می‌پذیرم + checkbox_agreement_html: من شرایط استفاده را قبول میکنم. confirm_email: تأیید ایمیل delete_account: پاک‌کردن حساب delete_account_html: اگر می‌خواهید حساب خود را پاک کنید، از این‌جا پیش بروید. از شما درخواست تأیید خواهد شد. diff --git a/config/locales/gl.yml b/config/locales/gl.yml index 5ff3b976..3b29db9e 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -508,7 +508,7 @@ gl: auth: apply_for_account: Solicite un convite change_password: Contrasinal - checkbox_agreement_html: Acepto as regras do servidor e os termos do servizo + checkbox_agreement_html: Acepto as termos do servizo confirm_email: Confirmar correo-e delete_account: Eliminar conta delete_account_html: Se desexa eliminar a súa conta, pode facelo aquí. Pediráselle confirmación. diff --git a/config/locales/ja.yml b/config/locales/ja.yml index c5fa19f4..1943f0c5 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -515,7 +515,7 @@ ja: auth: apply_for_account: 登録を申請する change_password: パスワード - checkbox_agreement_html: サーバーのルールプライバシーポリシー に同意します + checkbox_agreement_html: 利用規約に同意します confirm_email: メールアドレスの確認 delete_account: アカウントの削除 delete_account_html: アカウントを削除したい場合、こちら から手続きが行えます。削除する前に、確認画面があります。 diff --git a/config/locales/ko.yml b/config/locales/ko.yml index 4f81ddb3..ec21c538 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -517,7 +517,7 @@ ko: auth: apply_for_account: 가입 요청하기 change_password: 패스워드 - checkbox_agreement_html: 서버 규칙이용약관에 동의합니다 + checkbox_agreement_html: 이용 약관 에 동의합니다. confirm_email: 확인 메일 승인 delete_account: 계정 삭제 delete_account_html: 계정을 삭제하고 싶은 경우, 여기서 삭제할 수 있습니다. 삭제 전 확인 화면이 표시됩니다. diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 257b88b8..d8b990d5 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -515,7 +515,7 @@ nl: auth: apply_for_account: Een uitnodiging aanvragen change_password: Wachtwoord - checkbox_agreement_html: Ik ga akkoord met de regels van deze server en de gebruiksvoorwaarden + checkbox_agreement_html: Ik ga akkoord met de Servicevoorwaarden confirm_email: E-mail bevestigen delete_account: Account verwijderen delete_account_html: Wanneer je jouw account graag wilt verwijderen, kun je dat hier doen. We vragen jou daar om een bevestiging. diff --git a/config/locales/oc.yml b/config/locales/oc.yml index 64bfb485..17a988ec 100644 --- a/config/locales/oc.yml +++ b/config/locales/oc.yml @@ -500,7 +500,7 @@ oc: auth: apply_for_account: Demandar una invitacion change_password: Senhal - checkbox_agreement_html: Accepti las règlas del servidor e los tèrmes del servici + checkbox_agreement_html: Accepti la los tèrmes del servici confirm_email: Confirmar lo corrièl delete_account: Suprimir lo compte delete_account_html: Se volètz suprimir vòstre compte, podètz o far aquí. Vos demandarem que confirmetz. diff --git a/config/locales/pl.yml b/config/locales/pl.yml index cd77ee85..332a84e8 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -521,7 +521,7 @@ pl: auth: apply_for_account: Poproś o zaproszenie change_password: Hasło - checkbox_agreement_html: Zgadzam się z regułami serwera i zasadami korzystania z usługi + checkbox_agreement_html: Zgadzam się z Warunkami korzystania z usługi confirm_email: Potwierdź adres e-mail delete_account: Usunięcie konta delete_account_html: Jeżeli chcesz usunąć konto, przejdź tutaj. Otrzymasz prośbę o potwierdzenie. diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index 9abbd016..08d06f89 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -515,7 +515,7 @@ pt-BR: auth: apply_for_account: Pedir um convite change_password: Senha - checkbox_agreement_html: Eu concordo com as regras do servidor e com os termos de serviço + checkbox_agreement_html: Concordo com os Termos de Serviço confirm_email: Confirmar e-mail delete_account: Excluir conta delete_account_html: Se você deseja excluir a sua conta, você pode prosseguir para cá. Uma confirmação será requisitada. diff --git a/config/locales/ru.yml b/config/locales/ru.yml index a1eeb5f4..8bbebd2f 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -527,7 +527,7 @@ ru: auth: apply_for_account: Запросить приглашение change_password: Пароль - checkbox_agreement_html: Я соглашаюсь с правилами сервера и Условиями использования + checkbox_agreement_html: Я согласен с Условиями использования confirm_email: Подтвердите email delete_account: Удалить аккаунт delete_account_html: Если Вы хотите удалить свой аккаунт, вы можете перейти сюда. У Вас будет запрошено подтверждение. diff --git a/config/locales/sk.yml b/config/locales/sk.yml index 1dc8910e..1d725b3b 100644 --- a/config/locales/sk.yml +++ b/config/locales/sk.yml @@ -517,7 +517,7 @@ sk: auth: apply_for_account: Vyžiadaj si pozvánku change_password: Heslo - checkbox_agreement_html: Súhlasím s pravidlami servera, aj s prevoznými podmienkami + checkbox_agreement_html: Súhlasím s Zmluvnými podmienkami confirm_email: Potvrď email delete_account: Vymaž účet delete_account_html: Pokiaľ chceš svoj účet odtiaľto vymazať, môžeš tak urobiť tu. Budeš požiadaný/á o potvrdenie tohto kroku.