From 8a64406d3488e0d093abb3fa5d55a110f8266fbb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 6 Apr 2024 18:18:06 +0200 Subject: [PATCH 1/2] New Crowdin Translations (automated) (#2668) * New Crowdin translations * Fix bogus translation files --------- Co-authored-by: GitHub Actions Co-authored-by: Claire --- app/javascript/flavours/glitch/locales/de.json | 9 ++++++++- app/javascript/flavours/glitch/locales/es-AR.json | 4 ++++ app/javascript/flavours/glitch/locales/zh-CN.json | 4 ++++ app/javascript/flavours/glitch/locales/zh-TW.json | 4 ++++ config/locales-glitch/es-AR.yml | 2 +- config/locales-glitch/simple_form.es-AR.yml | 4 ++-- 6 files changed, 23 insertions(+), 4 deletions(-) diff --git a/app/javascript/flavours/glitch/locales/de.json b/app/javascript/flavours/glitch/locales/de.json index 11b04a919e..8fcd43aaa9 100644 --- a/app/javascript/flavours/glitch/locales/de.json +++ b/app/javascript/flavours/glitch/locales/de.json @@ -14,6 +14,7 @@ "column_subheading.lists": "Listen", "column_subheading.navigation": "Navigation", "community.column_settings.allow_local_only": "Nur-lokale Toots anzeigen", + "compose.attach.doodle": "Male etwas", "compose.change_federation": "Föderationseinstellungen ändern", "compose.content-type.change": "Erweiterte Formatierungsoptionen ändern", "compose.content-type.html": "HTML", @@ -22,6 +23,8 @@ "compose.content-type.markdown_meta": "Deine Beiträge mit Markdown formatieren", "compose.content-type.plain": "Unformatierter Text", "compose.content-type.plain_meta": "Ohne erweiterte Formatierung verfassen", + "compose.disable_threaded_mode": "Thread-Modus deaktivieren", + "compose.enable_threaded_mode": "Thread-Modus aktivieren", "compose_form.sensitive.hide": "{count, plural, one {Mit einer Inhaltswarnung versehen} other {Mit einer Inhaltswarnung versehen}}", "compose_form.sensitive.marked": "{count, plural, one {Medien-Datei ist mit einer Inhaltswarnung versehen} other {Medien-Dateien sind mit einer Inhaltswarnung versehen}}", "compose_form.sensitive.unmarked": "{count, plural, one {Medien-Datei ist nicht mit einer Inhaltswarnung versehen} other {Medien-Dateien sind nicht mit einer Inhaltswarnung versehen}}", @@ -61,6 +64,9 @@ "notification_purge.btn_invert": "Auswahl\numkehren", "notification_purge.btn_none": "Auswahl\naufheben", "notification_purge.start": "Benachrichtigungen-Aufräumen-Modus starten", + "notifications.column_settings.filter_bar.advanced": "Zeige alle Kategorien an", + "notifications.column_settings.filter_bar.category": "Schnellfilterleiste", + "notifications.column_settings.filter_bar.show_bar": "Filterleiste anzeigen", "notifications.marked_clear": "Ausgewählte Benachrichtigungen entfernen", "notifications.marked_clear_confirmation": "Möchtest du wirklich alle auswählten Benachrichtigungen für immer entfernen?", "settings.always_show_spoilers_field": "Das Inhaltswarnungs-Feld immer aktivieren", @@ -150,5 +156,6 @@ "status.in_reply_to": "Dieser Toot ist eine Antwort", "status.is_poll": "Dieser Toot ist eine Umfrage", "status.local_only": "Nur auf deiner Instanz sichtbar", - "status.uncollapse": "Ausklappen" + "status.uncollapse": "Ausklappen", + "suggestions.dismiss": "Vorschlag ablehnen" } diff --git a/app/javascript/flavours/glitch/locales/es-AR.json b/app/javascript/flavours/glitch/locales/es-AR.json index 3bba7f27cf..b82c1f384d 100644 --- a/app/javascript/flavours/glitch/locales/es-AR.json +++ b/app/javascript/flavours/glitch/locales/es-AR.json @@ -64,6 +64,9 @@ "notification_purge.btn_invert": "Invertir\nselección", "notification_purge.btn_none": "Seleccionar\nnada", "notification_purge.start": "Entrar en modo de limpieza de notificaciones", + "notifications.column_settings.filter_bar.advanced": "Mostrar todas las categorías", + "notifications.column_settings.filter_bar.category": "Barra de filtrado rápido", + "notifications.column_settings.filter_bar.show_bar": "Mostrar barra de filtros", "notifications.marked_clear": "Limpiar notificaciones seleccionadas", "notifications.marked_clear_confirmation": "¿Deseas borrar permanentemente todas las notificaciones seleccionadas?", "settings.always_show_spoilers_field": "Siempre mostrar el campo de advertencia de contenido", @@ -127,6 +130,7 @@ "settings.shared_settings_link": "preferencias de usuario", "settings.show_action_bar": "Mostrar botones de acción en toots colapsados", "settings.show_content_type_choice": "Mostrar selección de tipo de contenido al crear toots", + "settings.show_published_toast": "Mostrar brindis al enviar o guardar un mensaje", "settings.show_reply_counter": "Mostrar un conteo estimado de respuestas", "settings.side_arm": "Botón secundario:", "settings.side_arm.none": "Ninguno", diff --git a/app/javascript/flavours/glitch/locales/zh-CN.json b/app/javascript/flavours/glitch/locales/zh-CN.json index 49ef64a5e1..9a3dd7f191 100644 --- a/app/javascript/flavours/glitch/locales/zh-CN.json +++ b/app/javascript/flavours/glitch/locales/zh-CN.json @@ -64,6 +64,9 @@ "notification_purge.btn_invert": "反选", "notification_purge.btn_none": "取消全选", "notification_purge.start": "进入通知清理模式", + "notifications.column_settings.filter_bar.advanced": "显示所有类别", + "notifications.column_settings.filter_bar.category": "快速筛选栏", + "notifications.column_settings.filter_bar.show_bar": "显示筛选栏", "notifications.marked_clear": "清除选择的通知", "notifications.marked_clear_confirmation": "你确定要永久清除所有选择的通知吗?", "settings.always_show_spoilers_field": "始终显示内容警告框", @@ -127,6 +130,7 @@ "settings.shared_settings_link": "用户偏好设置", "settings.show_action_bar": "在折叠的嘟文中显示操作按钮", "settings.show_content_type_choice": "允许在发嘟时选择格式类型", + "settings.show_published_toast": "发布/保存嘟文时显示提示", "settings.show_reply_counter": "显示回复的大致数量", "settings.side_arm": "辅助发嘟按钮:", "settings.side_arm.none": "无", diff --git a/app/javascript/flavours/glitch/locales/zh-TW.json b/app/javascript/flavours/glitch/locales/zh-TW.json index 715bee8aef..2dfeed8c5c 100644 --- a/app/javascript/flavours/glitch/locales/zh-TW.json +++ b/app/javascript/flavours/glitch/locales/zh-TW.json @@ -60,6 +60,9 @@ "notification_purge.btn_invert": "反向選擇", "notification_purge.btn_none": "取消選取", "notification_purge.start": "進入通知清理模式", + "notifications.column_settings.filter_bar.advanced": "顯示所有分類", + "notifications.column_settings.filter_bar.category": "快速過濾欄", + "notifications.column_settings.filter_bar.show_bar": "顯示過濾器", "notifications.marked_clear": "清除被選取的通知訊息", "notifications.marked_clear_confirmation": "您確定要永久清除所有被選取的通知訊息嗎?", "settings.always_show_spoilers_field": "永遠啟用內容警告欄位", @@ -123,6 +126,7 @@ "settings.shared_settings_link": "使用者偏好設定", "settings.show_action_bar": "在折疊的貼文顯示操作按鈕", "settings.show_content_type_choice": "在編寫貼文時顯示內容類型選擇", + "settings.show_published_toast": "發布或儲存貼文時顯示提示", "settings.show_reply_counter": "顯示回覆數量的估計值", "settings.side_arm": "次要發出貼文按鈕", "settings.side_arm.none": "無", diff --git a/config/locales-glitch/es-AR.yml b/config/locales-glitch/es-AR.yml index fb90f56bb2..520f4f03a1 100644 --- a/config/locales-glitch/es-AR.yml +++ b/config/locales-glitch/es-AR.yml @@ -11,7 +11,7 @@ es-AR: flavour_and_skin: title: Sabor y apariencia hide_followers_count: - desc_html: No mostrar el conteo de seguidorxs en perfiles de usuarix + desc_html: No mostrar el conteo de seguidores en perfiles de usuario title: Ocultar conteo de seguidorxs other: preamble: Varias configuraciones de glitch-soc que no encajan en otras categorías. diff --git a/config/locales-glitch/simple_form.es-AR.yml b/config/locales-glitch/simple_form.es-AR.yml index 491ec7ce8c..b8e12c3cf9 100644 --- a/config/locales-glitch/simple_form.es-AR.yml +++ b/config/locales-glitch/simple_form.es-AR.yml @@ -16,8 +16,8 @@ es-AR: setting_default_content_type_html: HTML setting_default_content_type_markdown: Markdown setting_default_content_type_plain: Sin formato - setting_favourite_modal: Mostrar diálogo de confirmación antes de marcar como favorito (sólo aplica a la edición Glich) - setting_show_followers_count: Mostrá el conteo de tus seguidores + setting_favourite_modal: Mostrar diálogo de confirmación antes de marcar como favorito (solo aplica a la edición Glitch) + setting_show_followers_count: Mostrar el conteo de tus seguidores setting_skin: Diseño setting_system_emoji_font: Usar la fuente predeterminada del sistema para emojis (sólo aplica a la edición Glitch) notification_emails: From 9451997fa8909acd891188a1ceb8b01b75e78d47 Mon Sep 17 00:00:00 2001 From: Claire Date: Sat, 6 Apr 2024 19:34:30 +0200 Subject: [PATCH 2/2] Refactor notifications code to reduce differences with upstream (#2692) * Merge back `Follow` notification component * Merge back part of `FollowRequestContainer` notification container * Reduce differences with upstream in the `mention` case * Reduce differences with upstream in the `favourite` case * Reduce differences with upstream in the `reblog` case * Reduce differences with upstream in the `status` case * Reduce differences with upstream in the `update` case * Reduce differences with upstream in the `poll` case * Merge back `AdminSignup` notification component * Merge back `AdminReport` notification container --- .../notifications/components/admin_report.jsx | 114 ---- .../notifications/components/admin_signup.jsx | 107 ---- .../notifications/components/follow.jsx | 107 ---- .../components/follow_request.jsx | 104 +--- .../notifications/components/notification.jsx | 572 ++++++++++++------ .../containers/admin_report_container.js | 15 - .../containers/notification_container.js | 56 +- 7 files changed, 433 insertions(+), 642 deletions(-) delete mode 100644 app/javascript/flavours/glitch/features/notifications/components/admin_report.jsx delete mode 100644 app/javascript/flavours/glitch/features/notifications/components/admin_signup.jsx delete mode 100644 app/javascript/flavours/glitch/features/notifications/components/follow.jsx delete mode 100644 app/javascript/flavours/glitch/features/notifications/containers/admin_report_container.js diff --git a/app/javascript/flavours/glitch/features/notifications/components/admin_report.jsx b/app/javascript/flavours/glitch/features/notifications/components/admin_report.jsx deleted file mode 100644 index 5ca8b59a5e..0000000000 --- a/app/javascript/flavours/glitch/features/notifications/components/admin_report.jsx +++ /dev/null @@ -1,114 +0,0 @@ -import PropTypes from 'prop-types'; - -import { FormattedMessage } from 'react-intl'; - -import classNames from 'classnames'; -import { withRouter } from 'react-router-dom'; - -import ImmutablePropTypes from 'react-immutable-proptypes'; -import ImmutablePureComponent from 'react-immutable-pure-component'; - -import { HotKeys } from 'react-hotkeys'; - -import FlagIcon from '@/material-icons/400-24px/flag-fill.svg?react'; -import { Icon } from 'flavours/glitch/components/icon'; -import { Permalink } from 'flavours/glitch/components/permalink'; -import { WithRouterPropTypes } from 'flavours/glitch/utils/react_router'; - -import NotificationOverlayContainer from '../containers/overlay_container'; - -import Report from './report'; - -class AdminReport extends ImmutablePureComponent { - - static propTypes = { - hidden: PropTypes.bool, - id: PropTypes.string.isRequired, - account: ImmutablePropTypes.map.isRequired, - notification: ImmutablePropTypes.map.isRequired, - unread: PropTypes.bool, - report: ImmutablePropTypes.map.isRequired, - ...WithRouterPropTypes, - }; - - handleMoveUp = () => { - const { notification, onMoveUp } = this.props; - onMoveUp(notification.get('id')); - }; - - handleMoveDown = () => { - const { notification, onMoveDown } = this.props; - onMoveDown(notification.get('id')); - }; - - handleOpen = () => { - this.handleOpenProfile(); - }; - - handleOpenProfile = () => { - const { history, notification } = this.props; - history.push(`/@${notification.getIn(['account', 'acct'])}`); - }; - - handleMention = e => { - e.preventDefault(); - - const { history, notification, onMention } = this.props; - onMention(notification.get('account'), history); - }; - - getHandlers () { - return { - moveUp: this.handleMoveUp, - moveDown: this.handleMoveDown, - open: this.handleOpen, - openProfile: this.handleOpenProfile, - mention: this.handleMention, - reply: this.handleMention, - }; - } - - render () { - const { account, notification, unread, report } = this.props; - - if (!report) { - return null; - } - - // Links to the display name. - const displayName = account.get('display_name_html') || account.get('username'); - const link = ( - - ); - - const targetAccount = report.get('target_account'); - const targetDisplayNameHtml = { __html: targetAccount.get('display_name_html') }; - const targetLink = ; - - return ( - -
-
- - - - - -
- -
-
- ); - } - -} - -export default withRouter(AdminReport); diff --git a/app/javascript/flavours/glitch/features/notifications/components/admin_signup.jsx b/app/javascript/flavours/glitch/features/notifications/components/admin_signup.jsx deleted file mode 100644 index 4c815099b1..0000000000 --- a/app/javascript/flavours/glitch/features/notifications/components/admin_signup.jsx +++ /dev/null @@ -1,107 +0,0 @@ -import PropTypes from 'prop-types'; - -import { FormattedMessage } from 'react-intl'; - -import classNames from 'classnames'; -import { withRouter } from 'react-router-dom'; - -import ImmutablePropTypes from 'react-immutable-proptypes'; -import ImmutablePureComponent from 'react-immutable-pure-component'; - -import { HotKeys } from 'react-hotkeys'; - -import PersonAddIcon from '@/material-icons/400-24px/person_add-fill.svg?react'; -import { Icon } from 'flavours/glitch/components/icon'; -import { Permalink } from 'flavours/glitch/components/permalink'; -import AccountContainer from 'flavours/glitch/containers/account_container'; -import { WithRouterPropTypes } from 'flavours/glitch/utils/react_router'; - -import NotificationOverlayContainer from '../containers/overlay_container'; - -class NotificationAdminSignup extends ImmutablePureComponent { - - static propTypes = { - hidden: PropTypes.bool, - id: PropTypes.string.isRequired, - account: ImmutablePropTypes.map.isRequired, - notification: ImmutablePropTypes.map.isRequired, - unread: PropTypes.bool, - ...WithRouterPropTypes, - }; - - handleMoveUp = () => { - const { notification, onMoveUp } = this.props; - onMoveUp(notification.get('id')); - }; - - handleMoveDown = () => { - const { notification, onMoveDown } = this.props; - onMoveDown(notification.get('id')); - }; - - handleOpen = () => { - this.handleOpenProfile(); - }; - - handleOpenProfile = () => { - const { history, notification } = this.props; - history.push(`/@${notification.getIn(['account', 'acct'])}`); - }; - - handleMention = e => { - e.preventDefault(); - - const { history, notification, onMention } = this.props; - onMention(notification.get('account'), history); - }; - - getHandlers () { - return { - moveUp: this.handleMoveUp, - moveDown: this.handleMoveDown, - open: this.handleOpen, - openProfile: this.handleOpenProfile, - mention: this.handleMention, - reply: this.handleMention, - }; - } - - render () { - const { account, notification, hidden, unread } = this.props; - - // Links to the display name. - const displayName = account.get('display_name_html') || account.get('username'); - const link = ( - - ); - - // Renders. - return ( - -
-
- - - -
- -
-
- ); - } - -} - -export default withRouter(NotificationAdminSignup); diff --git a/app/javascript/flavours/glitch/features/notifications/components/follow.jsx b/app/javascript/flavours/glitch/features/notifications/components/follow.jsx deleted file mode 100644 index d26039fd5f..0000000000 --- a/app/javascript/flavours/glitch/features/notifications/components/follow.jsx +++ /dev/null @@ -1,107 +0,0 @@ -import PropTypes from 'prop-types'; - -import { FormattedMessage } from 'react-intl'; - -import classNames from 'classnames'; -import { withRouter } from 'react-router-dom'; - -import ImmutablePropTypes from 'react-immutable-proptypes'; -import ImmutablePureComponent from 'react-immutable-pure-component'; - -import { HotKeys } from 'react-hotkeys'; - -import PersonAddIcon from '@/material-icons/400-24px/person_add-fill.svg?react'; -import { Icon } from 'flavours/glitch/components/icon'; -import { Permalink } from 'flavours/glitch/components/permalink'; -import AccountContainer from 'flavours/glitch/containers/account_container'; -import { WithRouterPropTypes } from 'flavours/glitch/utils/react_router'; - -import NotificationOverlayContainer from '../containers/overlay_container'; - -class NotificationFollow extends ImmutablePureComponent { - - static propTypes = { - hidden: PropTypes.bool, - id: PropTypes.string.isRequired, - account: ImmutablePropTypes.map.isRequired, - notification: ImmutablePropTypes.map.isRequired, - unread: PropTypes.bool, - ...WithRouterPropTypes, - }; - - handleMoveUp = () => { - const { notification, onMoveUp } = this.props; - onMoveUp(notification.get('id')); - }; - - handleMoveDown = () => { - const { notification, onMoveDown } = this.props; - onMoveDown(notification.get('id')); - }; - - handleOpen = () => { - this.handleOpenProfile(); - }; - - handleOpenProfile = () => { - const { history, notification } = this.props; - history.push(`/@${notification.getIn(['account', 'acct'])}`); - }; - - handleMention = e => { - e.preventDefault(); - - const { history, notification, onMention } = this.props; - onMention(notification.get('account'), history); - }; - - getHandlers () { - return { - moveUp: this.handleMoveUp, - moveDown: this.handleMoveDown, - open: this.handleOpen, - openProfile: this.handleOpenProfile, - mention: this.handleMention, - reply: this.handleMention, - }; - } - - render () { - const { account, notification, hidden, unread } = this.props; - - // Links to the display name. - const displayName = account.get('display_name_html') || account.get('username'); - const link = ( - - ); - - // Renders. - return ( - -
-
- - - -
- -
-
- ); - } - -} - -export default withRouter(NotificationFollow); diff --git a/app/javascript/flavours/glitch/features/notifications/components/follow_request.jsx b/app/javascript/flavours/glitch/features/notifications/components/follow_request.jsx index 11aa343609..bd45e1f826 100644 --- a/app/javascript/flavours/glitch/features/notifications/components/follow_request.jsx +++ b/app/javascript/flavours/glitch/features/notifications/components/follow_request.jsx @@ -1,26 +1,16 @@ import PropTypes from 'prop-types'; -import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; - -import classNames from 'classnames'; -import { withRouter } from 'react-router-dom'; +import { defineMessages, injectIntl } from 'react-intl'; import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import { HotKeys } from 'react-hotkeys'; - import CheckIcon from '@/material-icons/400-24px/check.svg?react'; import CloseIcon from '@/material-icons/400-24px/close.svg?react'; -import PersonIcon from '@/material-icons/400-24px/person-fill.svg?react'; import { Avatar } from 'flavours/glitch/components/avatar'; import { DisplayName } from 'flavours/glitch/components/display_name'; -import { Icon } from 'flavours/glitch/components/icon'; import { IconButton } from 'flavours/glitch/components/icon_button'; import { Permalink } from 'flavours/glitch/components/permalink'; -import { WithRouterPropTypes } from 'flavours/glitch/utils/react_router'; - -import NotificationOverlayContainer from '../containers/overlay_container'; const messages = defineMessages({ authorize: { id: 'follow_request.authorize', defaultMessage: 'Authorize' }, @@ -34,50 +24,10 @@ class FollowRequest extends ImmutablePureComponent { onAuthorize: PropTypes.func.isRequired, onReject: PropTypes.func.isRequired, intl: PropTypes.object.isRequired, - notification: ImmutablePropTypes.map.isRequired, - unread: PropTypes.bool, - ...WithRouterPropTypes, }; - handleMoveUp = () => { - const { notification, onMoveUp } = this.props; - onMoveUp(notification.get('id')); - }; - - handleMoveDown = () => { - const { notification, onMoveDown } = this.props; - onMoveDown(notification.get('id')); - }; - - handleOpen = () => { - this.handleOpenProfile(); - }; - - handleOpenProfile = () => { - const { history, notification } = this.props; - history.push(`/@${notification.getIn(['account', 'acct'])}`); - }; - - handleMention = e => { - e.preventDefault(); - - const { history, notification, onMention } = this.props; - onMention(notification.get('account'), history); - }; - - getHandlers () { - return { - moveUp: this.handleMoveUp, - moveDown: this.handleMoveDown, - open: this.handleOpen, - openProfile: this.handleOpenProfile, - mention: this.handleMention, - reply: this.handleMention, - }; - } - render () { - const { intl, hidden, account, onAuthorize, onReject, notification, unread } = this.props; + const { intl, hidden, account, onAuthorize, onReject } = this.props; if (!account) { return
; @@ -92,51 +42,23 @@ class FollowRequest extends ImmutablePureComponent { ); } - // Links to the display name. - const displayName = account.get('display_name_html') || account.get('username'); - const link = ( - - ); - return ( - -
-
- +
+
+ +
+ +
- +
+ +
- -
-
- -
- -
- -
- - -
-
-
- -
- +
); } } -export default withRouter(injectIntl(FollowRequest)); +export default injectIntl(FollowRequest); diff --git a/app/javascript/flavours/glitch/features/notifications/components/notification.jsx b/app/javascript/flavours/glitch/features/notifications/components/notification.jsx index 1d476969cb..4aac5e8d6d 100644 --- a/app/javascript/flavours/glitch/features/notifications/components/notification.jsx +++ b/app/javascript/flavours/glitch/features/notifications/components/notification.jsx @@ -1,236 +1,410 @@ -// Package imports. import PropTypes from 'prop-types'; +import { injectIntl, FormattedMessage, defineMessages } from 'react-intl'; + +import classNames from 'classnames'; +import { withRouter } from 'react-router-dom'; + import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; -// Our imports, +import { HotKeys } from 'react-hotkeys'; + +import FlagIcon from '@/material-icons/400-24px/flag-fill.svg?react'; +import PersonIcon from '@/material-icons/400-24px/person-fill.svg?react'; +import PersonAddIcon from '@/material-icons/400-24px/person_add-fill.svg?react'; +import { Icon } from 'flavours/glitch/components/icon'; +import { Permalink } from 'flavours/glitch/components/permalink'; +import AccountContainer from 'flavours/glitch/containers/account_container'; import StatusContainer from 'flavours/glitch/containers/status_container'; +import { WithRouterPropTypes } from 'flavours/glitch/utils/react_router'; -import NotificationAdminReportContainer from '../containers/admin_report_container'; -import NotificationFollowRequestContainer from '../containers/follow_request_container'; +import FollowRequestContainer from '../containers/follow_request_container'; +import NotificationOverlayContainer from '../containers/overlay_container'; -import NotificationAdminSignup from './admin_signup'; -import NotificationFollow from './follow'; +import Report from './report'; -export default class Notification extends ImmutablePureComponent { +const messages = defineMessages({ + follow: { id: 'notification.follow', defaultMessage: '{name} followed you' }, + adminSignUp: { id: 'notification.admin.sign_up', defaultMessage: '{name} signed up' }, + adminReport: { id: 'notification.admin.report', defaultMessage: '{name} reported {target}' }, +}); +const notificationForScreenReader = (intl, message, timestamp) => { + const output = [message]; + + output.push(intl.formatDate(timestamp, { hour: '2-digit', minute: '2-digit', month: 'short', day: 'numeric' })); + + return output.join(', '); +}; + +class Notification extends ImmutablePureComponent { static propTypes = { notification: ImmutablePropTypes.map.isRequired, hidden: PropTypes.bool, onMoveUp: PropTypes.func.isRequired, onMoveDown: PropTypes.func.isRequired, onMention: PropTypes.func.isRequired, + onFavourite: PropTypes.func.isRequired, + onReblog: PropTypes.func.isRequired, + onToggleHidden: PropTypes.func.isRequired, + status: ImmutablePropTypes.map, + intl: PropTypes.object.isRequired, getScrollPosition: PropTypes.func, updateScrollBottom: PropTypes.func, cacheMediaWidth: PropTypes.func, cachedMediaWidth: PropTypes.number, onUnmount: PropTypes.func, unread: PropTypes.bool, + ...WithRouterPropTypes, }; + handleMoveUp = () => { + const { notification, onMoveUp } = this.props; + onMoveUp(notification.get('id')); + }; + + handleMoveDown = () => { + const { notification, onMoveDown } = this.props; + onMoveDown(notification.get('id')); + }; + + handleOpen = () => { + const { notification } = this.props; + + if (notification.get('status')) { + this.props.history.push(`/@${notification.getIn(['status', 'account', 'acct'])}/${notification.get('status')}`); + } else { + this.handleOpenProfile(); + } + }; + + handleOpenProfile = () => { + const { notification } = this.props; + this.props.history.push(`/@${notification.getIn(['account', 'acct'])}`); + }; + + handleMention = e => { + e.preventDefault(); + + const { notification, onMention } = this.props; + onMention(notification.get('account'), this.props.history); + }; + + handleHotkeyFavourite = () => { + const { status } = this.props; + if (status) this.props.onFavourite(status); + }; + + handleHotkeyBoost = e => { + const { status } = this.props; + if (status) this.props.onReblog(status, e); + }; + + getHandlers () { + return { + reply: this.handleMention, + favourite: this.handleHotkeyFavourite, + boost: this.handleHotkeyBoost, + mention: this.handleMention, + open: this.handleOpen, + openProfile: this.handleOpenProfile, + moveUp: this.handleMoveUp, + moveDown: this.handleMoveDown, + }; + } + + renderFollow (notification, account, link) { + const { intl, unread } = this.props; + + return ( + +
+
+ + + + + +
+ +
+
+ ); + } + + renderFollowRequest (notification, account, link) { + const { intl, unread } = this.props; + + return ( + +
+
+ + + + + +
+ +
+
+ ); + } + + renderMention (notification) { + return ( +