From 89f43c3b8bca6614e9ad622bd3053d48ad9ba7ba Mon Sep 17 00:00:00 2001 From: Curtis ROck Date: Thu, 3 Sep 2020 21:51:54 -0500 Subject: [PATCH 01/17] add chat sounds to middleware, expecting meta value of chat --- app/soapbox/middleware/sounds.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/soapbox/middleware/sounds.js b/app/soapbox/middleware/sounds.js index 032bc804b..e819a02ee 100644 --- a/app/soapbox/middleware/sounds.js +++ b/app/soapbox/middleware/sounds.js @@ -36,6 +36,16 @@ export default function soundsMiddleware() { type: 'audio/mpeg', }, ]), + chat: createAudio([ + { + src: '/sounds/chat.oga', + type: 'audio/ogg', + }, + { + src: '/sounds/chat.mp3', + type: 'audio/mpeg', + }, + ]), }; return () => next => action => { From d29d35fe4d832891505f9c2834d3d8eae10477bb Mon Sep 17 00:00:00 2001 From: Curtis Date: Fri, 4 Sep 2020 15:36:07 +0000 Subject: [PATCH 02/17] Upload New File --- static/sounds/chat.mp3 | Bin 0 -> 3383 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 static/sounds/chat.mp3 diff --git a/static/sounds/chat.mp3 b/static/sounds/chat.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..c86114292fd4a8a27442c768fe3a6b7d5a1e7e2e GIT binary patch literal 3383 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 BvFQK+ literal 0 HcmV?d00001 From 73e61bec06417615c451f383775f0aa49a9af324 Mon Sep 17 00:00:00 2001 From: Curtis Date: Fri, 4 Sep 2020 15:37:17 +0000 Subject: [PATCH 03/17] Upload New File --- static/sounds/chat.oga | Bin 0 -> 7009 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 static/sounds/chat.oga diff --git a/static/sounds/chat.oga b/static/sounds/chat.oga new file mode 100644 index 0000000000000000000000000000000000000000..76d4bda7a0748c0788c3d5501b04ce7a392bfff7 GIT binary patch literal 7009 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 literal 0 HcmV?d00001 From cf93733076a6ffad7af127afcebe76fd17d68195 Mon Sep 17 00:00:00 2001 From: Curtis ROck Date: Fri, 4 Sep 2020 21:43:14 -0500 Subject: [PATCH 04/17] Rough in support for chat sound and flash notification --- app/soapbox/actions/chats.js | 54 ++++++++++++++++++++++ app/soapbox/actions/settings.js | 2 + app/soapbox/actions/streaming.js | 6 ++- app/soapbox/reducers/accounts.js | 2 +- app/soapbox/reducers/chat_message_lists.js | 2 +- app/soapbox/reducers/chat_messages.js | 2 +- app/soapbox/reducers/chats.js | 2 +- 7 files changed, 64 insertions(+), 6 deletions(-) diff --git a/app/soapbox/actions/chats.js b/app/soapbox/actions/chats.js index 729dc128e..79d7e25ea 100644 --- a/app/soapbox/actions/chats.js +++ b/app/soapbox/actions/chats.js @@ -23,6 +23,8 @@ export const CHAT_READ_REQUEST = 'CHAT_READ_REQUEST'; export const CHAT_READ_SUCCESS = 'CHAT_READ_SUCCESS'; export const CHAT_READ_FAIL = 'CHAT_READ_FAIL'; +export const STREAMING_CHAT_UPDATE = 'STREAMING_CHAT_UPDATE'; + export function fetchChats() { return (dispatch, getState) => { dispatch({ type: CHATS_FETCH_REQUEST }); @@ -150,3 +152,55 @@ export function markChatRead(chatId, lastReadId) { }); }; } + +export function updateChatsQueue(chat) { + return (dispatch, getState) => { + if (chat.type === 'pleroma:chat_mention') return; // Drop chat notifications, handle them per-chat + + // const showAlert = getSettings(getState()).getIn(['notifications', 'alerts', chat.type]); + // const filters = getFilters(getState(), { contextType: 'notifications' }); + // const playSound = getSettings(getState()).getIn(['notifications', 'sounds', chat.type]); + // + // let filtered = false; + // + // const isOnNotificationsPage = curPath === '/notifications'; + // + // if (chat.type === 'mention') { + // const regex = regexFromFilters(filters); + // const searchIndex = chat.status.spoiler_text + '\n' + unescapeHTML(chat.status.content); + // filtered = regex && regex.test(searchIndex); + // } + // + // // Desktop notifications + // if (typeof window.Notification !== 'undefined' && showAlert && !filtered) { + // const title = new IntlMessageFormat(intlMessages[`notification.${chat.type}`], intlLocale).format({ name: chat.account.display_name.length > 0 ? chat.account.display_name : notification.account.username }); + // const body = (chat.status && chat.status.spoiler_text.length > 0) ? chat.status.spoiler_text : unescapeHTML(chat.status ? chat.status.content : ''); + // + // const notify = new Notification(title, { body, icon: chat.account.avatar, tag: chat.id }); + // + // notify.addEventListener('click', () => { + // window.focus(); + // notify.close(); + // }); + // } + + // if (playSound && !filtered) { + // dispatch({ + // type: CHATS_UPDATE_NOOP, + // meta: { sound: 'boop' }, + // }); + // } + + dispatch({ type: STREAMING_CHAT_UPDATE, chat: chat, me: getState().get('me') }); + // if (isOnNotificationsPage) { + // dispatch({ + // type: CHATS_UPDATE_QUEUE, + // chat, + // intlMessages, + // intlLocale, + // }); + // } else { + // dispatch(updateChats(chat, intlMessages, intlLocale)); + // } + }; +}; diff --git a/app/soapbox/actions/settings.js b/app/soapbox/actions/settings.js index 4432fa6e0..7d330219f 100644 --- a/app/soapbox/actions/settings.js +++ b/app/soapbox/actions/settings.js @@ -32,6 +32,8 @@ const defaultSettings = ImmutableMap({ chats: ImmutableMap({ panes: ImmutableList(), mainWindow: 'minimized', + sound: true, + flash: true, }), home: ImmutableMap({ diff --git a/app/soapbox/actions/streaming.js b/app/soapbox/actions/streaming.js index a581ae0fe..c3e4363da 100644 --- a/app/soapbox/actions/streaming.js +++ b/app/soapbox/actions/streaming.js @@ -7,12 +7,13 @@ import { processTimelineUpdate, } from './timelines'; import { updateNotificationsQueue, expandNotifications } from './notifications'; +import { updateChatsQueue } from './chats'; import { updateConversations } from './conversations'; import { fetchFilters } from './filters'; import { getSettings } from 'soapbox/actions/settings'; import messages from 'soapbox/locales/messages'; -export const STREAMING_CHAT_UPDATE = 'STREAMING_CHAT_UPDATE'; +// export const STREAMING_CHAT_UPDATE = 'STREAMING_CHAT_UPDATE'; const validLocale = locale => Object.keys(messages).includes(locale); @@ -55,7 +56,8 @@ export function connectTimelineStream(timelineId, path, pollingRefresh = null, a dispatch(fetchFilters()); break; case 'pleroma:chat_update': - dispatch({ type: STREAMING_CHAT_UPDATE, chat: JSON.parse(data.payload), me: getState().get('me') }); + dispatch(updateChatsQueue(JSON.parse(data.payload))); + // dispatch({ type: STREAMING_CHAT_UPDATE, chat: JSON.parse(data.payload), me: getState().get('me') }); break; } }, diff --git a/app/soapbox/reducers/accounts.js b/app/soapbox/reducers/accounts.js index b02ef763f..ae565d782 100644 --- a/app/soapbox/reducers/accounts.js +++ b/app/soapbox/reducers/accounts.js @@ -4,7 +4,7 @@ import { ACCOUNT_FETCH_FAIL_FOR_USERNAME_LOOKUP, } from '../actions/importer'; import { CHATS_FETCH_SUCCESS, CHAT_FETCH_SUCCESS } from 'soapbox/actions/chats'; -import { STREAMING_CHAT_UPDATE } from 'soapbox/actions/streaming'; +import { STREAMING_CHAT_UPDATE } from 'soapbox/actions/chats'; import { normalizeAccount as normalizeAccount2 } from 'soapbox/actions/importer/normalizer'; import { Map as ImmutableMap, fromJS } from 'immutable'; diff --git a/app/soapbox/reducers/chat_message_lists.js b/app/soapbox/reducers/chat_message_lists.js index b584dca72..b1cfcd0a4 100644 --- a/app/soapbox/reducers/chat_message_lists.js +++ b/app/soapbox/reducers/chat_message_lists.js @@ -4,7 +4,7 @@ import { CHAT_MESSAGE_SEND_REQUEST, CHAT_MESSAGE_SEND_SUCCESS, } from 'soapbox/actions/chats'; -import { STREAMING_CHAT_UPDATE } from 'soapbox/actions/streaming'; +import { STREAMING_CHAT_UPDATE } from 'soapbox/actions/chats'; import { Map as ImmutableMap, OrderedSet as ImmutableOrderedSet } from 'immutable'; const initialState = ImmutableMap(); diff --git a/app/soapbox/reducers/chat_messages.js b/app/soapbox/reducers/chat_messages.js index 74d83ef79..b44a1e6e5 100644 --- a/app/soapbox/reducers/chat_messages.js +++ b/app/soapbox/reducers/chat_messages.js @@ -4,7 +4,7 @@ import { CHAT_MESSAGE_SEND_REQUEST, CHAT_MESSAGE_SEND_SUCCESS, } from 'soapbox/actions/chats'; -import { STREAMING_CHAT_UPDATE } from 'soapbox/actions/streaming'; +import { STREAMING_CHAT_UPDATE } from 'soapbox/actions/chats'; import { Map as ImmutableMap, fromJS } from 'immutable'; const initialState = ImmutableMap(); diff --git a/app/soapbox/reducers/chats.js b/app/soapbox/reducers/chats.js index 0efb5361f..745a7acf7 100644 --- a/app/soapbox/reducers/chats.js +++ b/app/soapbox/reducers/chats.js @@ -4,7 +4,7 @@ import { CHAT_READ_SUCCESS, CHAT_READ_REQUEST, } from 'soapbox/actions/chats'; -import { STREAMING_CHAT_UPDATE } from 'soapbox/actions/streaming'; +import { STREAMING_CHAT_UPDATE } from 'soapbox/actions/chats'; import { normalizeChat } from 'soapbox/actions/importer/normalizer'; import { Map as ImmutableMap, fromJS } from 'immutable'; From ca9be1ed05fcc166009a933eec383d99797fdc2b Mon Sep 17 00:00:00 2001 From: Curtis ROck Date: Sat, 5 Sep 2020 16:50:33 -0500 Subject: [PATCH 05/17] Audio notification on chat. Currently hardcoded on in store/settings --- app/soapbox/actions/chats.js | 53 ++++++------------------------------ 1 file changed, 9 insertions(+), 44 deletions(-) diff --git a/app/soapbox/actions/chats.js b/app/soapbox/actions/chats.js index 79d7e25ea..4e89d4ad6 100644 --- a/app/soapbox/actions/chats.js +++ b/app/soapbox/actions/chats.js @@ -24,6 +24,7 @@ export const CHAT_READ_SUCCESS = 'CHAT_READ_SUCCESS'; export const CHAT_READ_FAIL = 'CHAT_READ_FAIL'; export const STREAMING_CHAT_UPDATE = 'STREAMING_CHAT_UPDATE'; +export const CHATS_UPDATE_NOOP = 'CHATS_UPDATE_NOOP'; export function fetchChats() { return (dispatch, getState) => { @@ -155,52 +156,16 @@ export function markChatRead(chatId, lastReadId) { export function updateChatsQueue(chat) { return (dispatch, getState) => { - if (chat.type === 'pleroma:chat_mention') return; // Drop chat notifications, handle them per-chat + const playSound = getSettings(getState()).getIn(['chats', 'sound']); + // const flashWindow = getSettings(getState()).getIn(['chats', 'flash']); - // const showAlert = getSettings(getState()).getIn(['notifications', 'alerts', chat.type]); - // const filters = getFilters(getState(), { contextType: 'notifications' }); - // const playSound = getSettings(getState()).getIn(['notifications', 'sounds', chat.type]); - // - // let filtered = false; - // - // const isOnNotificationsPage = curPath === '/notifications'; - // - // if (chat.type === 'mention') { - // const regex = regexFromFilters(filters); - // const searchIndex = chat.status.spoiler_text + '\n' + unescapeHTML(chat.status.content); - // filtered = regex && regex.test(searchIndex); - // } - // - // // Desktop notifications - // if (typeof window.Notification !== 'undefined' && showAlert && !filtered) { - // const title = new IntlMessageFormat(intlMessages[`notification.${chat.type}`], intlLocale).format({ name: chat.account.display_name.length > 0 ? chat.account.display_name : notification.account.username }); - // const body = (chat.status && chat.status.spoiler_text.length > 0) ? chat.status.spoiler_text : unescapeHTML(chat.status ? chat.status.content : ''); - // - // const notify = new Notification(title, { body, icon: chat.account.avatar, tag: chat.id }); - // - // notify.addEventListener('click', () => { - // window.focus(); - // notify.close(); - // }); - // } - - // if (playSound && !filtered) { - // dispatch({ - // type: CHATS_UPDATE_NOOP, - // meta: { sound: 'boop' }, - // }); - // } + if (playSound) { + dispatch({ + type: CHATS_UPDATE_NOOP, + meta: { sound: 'chat' }, + }); + } dispatch({ type: STREAMING_CHAT_UPDATE, chat: chat, me: getState().get('me') }); - // if (isOnNotificationsPage) { - // dispatch({ - // type: CHATS_UPDATE_QUEUE, - // chat, - // intlMessages, - // intlLocale, - // }); - // } else { - // dispatch(updateChats(chat, intlMessages, intlLocale)); - // } }; }; From e1577541167bb7e174012bdad3027361273dfb11 Mon Sep 17 00:00:00 2001 From: Curtis ROck Date: Sat, 5 Sep 2020 19:36:28 -0500 Subject: [PATCH 06/17] Fix chat audio filtering bug --- app/soapbox/actions/chats.js | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/app/soapbox/actions/chats.js b/app/soapbox/actions/chats.js index 4e89d4ad6..2b3a9450a 100644 --- a/app/soapbox/actions/chats.js +++ b/app/soapbox/actions/chats.js @@ -160,10 +160,13 @@ export function updateChatsQueue(chat) { // const flashWindow = getSettings(getState()).getIn(['chats', 'flash']); if (playSound) { - dispatch({ - type: CHATS_UPDATE_NOOP, - meta: { sound: 'chat' }, - }); + if (chat.last_message && + chat.last_message.account_id !== getState().get('me')) { + dispatch({ + type: CHATS_UPDATE_NOOP, + meta: { sound: 'chat' }, + }); + } } dispatch({ type: STREAMING_CHAT_UPDATE, chat: chat, me: getState().get('me') }); From f3b44c556017121e743a46140382e00492e2df8e Mon Sep 17 00:00:00 2001 From: Curtis ROck Date: Sat, 5 Sep 2020 21:16:14 -0500 Subject: [PATCH 07/17] Render toggle for chats audio notifications --- .../features/chats/components/audio_toggle.js | 61 +++++++++++++++++++ .../features/chats/components/chat_panes.js | 2 + 2 files changed, 63 insertions(+) create mode 100644 app/soapbox/features/chats/components/audio_toggle.js diff --git a/app/soapbox/features/chats/components/audio_toggle.js b/app/soapbox/features/chats/components/audio_toggle.js new file mode 100644 index 000000000..5c1d82e33 --- /dev/null +++ b/app/soapbox/features/chats/components/audio_toggle.js @@ -0,0 +1,61 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { connect } from 'react-redux'; +import { injectIntl, defineMessages } from 'react-intl'; +import ImmutablePropTypes from 'react-immutable-proptypes'; +import Icon from 'soapbox/components/icon'; +import { changeSetting, getSettings } from 'soapbox/actions/settings'; +import SettingToggle from 'soapbox/features/notifications/components/setting_toggle'; + +const messages = defineMessages({ + switchToOn: { id: 'chats.audio_toggle_on', defaultMessage: 'Audio notification on' }, + switchToOff: { id: 'chats.audio_toggle_off', defaultMessage: 'Audio notification off' }, +}); + +const mapStateToProps = state => { + return { + settings: getSettings(state), + }; +}; + +const mapDispatchToProps = (dispatch) => ({ + toggleAudio(setting) { + dispatch(changeSetting(['chats', 'sound'], setting)); + }, +}); + +export default @connect(mapStateToProps, mapDispatchToProps) +@injectIntl +class AudioToggle extends React.PureComponent { + + static propTypes = { + intl: PropTypes.object.isRequired, + settings: ImmutablePropTypes.map.isRequired, + toggleAudio: PropTypes.func, + showLabel: PropTypes.bool, + }; + + handleToggleAudio = () => { + this.props.toggleAudio(this.props.settings.get('chats', 'sound') === true ? false : true); + } + + render() { + const { intl, settings, showLabel } = this.props; + let toggle = ( + , unchecked: }} ariaLabel={settings.get('chats', 'sound') === 'light' ? intl.formatMessage(messages.switchToOff) : intl.formatMessage(messages.switchToOn)} /> + ); + + if (showLabel) { + toggle = ( + , unchecked: }} label={settings.get('chats', 'sound') === 'light' ? intl.formatMessage(messages.switchToOff) : intl.formatMessage(messages.switchToOn)} /> + ); + } + + return ( +
+ {toggle} +
+ ); + } + +} diff --git a/app/soapbox/features/chats/components/chat_panes.js b/app/soapbox/features/chats/components/chat_panes.js index 1bd7167bd..876ff9666 100644 --- a/app/soapbox/features/chats/components/chat_panes.js +++ b/app/soapbox/features/chats/components/chat_panes.js @@ -11,6 +11,7 @@ import { makeGetChat } from 'soapbox/selectors'; import { openChat, toggleMainWindow } from 'soapbox/actions/chats'; import ChatWindow from './chat_window'; import { shortNumberFormat } from 'soapbox/utils/numbers'; +import AudioToggle from 'soapbox/features/chats/components/audio_toggle'; const addChatsToPanes = (state, panesData) => { const getChat = makeGetChat(); @@ -62,6 +63,7 @@ class ChatPanes extends ImmutablePureComponent { +
Date: Sun, 6 Sep 2020 05:13:44 -0500 Subject: [PATCH 08/17] fixed toggle click state change bug --- app/soapbox/actions/settings.js | 1 - app/soapbox/features/chats/components/audio_toggle.js | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/app/soapbox/actions/settings.js b/app/soapbox/actions/settings.js index 7d330219f..097265814 100644 --- a/app/soapbox/actions/settings.js +++ b/app/soapbox/actions/settings.js @@ -33,7 +33,6 @@ const defaultSettings = ImmutableMap({ panes: ImmutableList(), mainWindow: 'minimized', sound: true, - flash: true, }), home: ImmutableMap({ diff --git a/app/soapbox/features/chats/components/audio_toggle.js b/app/soapbox/features/chats/components/audio_toggle.js index 5c1d82e33..9b207273a 100644 --- a/app/soapbox/features/chats/components/audio_toggle.js +++ b/app/soapbox/features/chats/components/audio_toggle.js @@ -36,18 +36,18 @@ class AudioToggle extends React.PureComponent { }; handleToggleAudio = () => { - this.props.toggleAudio(this.props.settings.get('chats', 'sound') === true ? false : true); + this.props.toggleAudio(this.props.settings.getIn(['chats', 'sound']) === true ? false : true); } render() { const { intl, settings, showLabel } = this.props; let toggle = ( - , unchecked: }} ariaLabel={settings.get('chats', 'sound') === 'light' ? intl.formatMessage(messages.switchToOff) : intl.formatMessage(messages.switchToOn)} /> + , unchecked: }} ariaLabel={settings.get('chats', 'sound') === true ? intl.formatMessage(messages.switchToOff) : intl.formatMessage(messages.switchToOn)} /> ); if (showLabel) { toggle = ( - , unchecked: }} label={settings.get('chats', 'sound') === 'light' ? intl.formatMessage(messages.switchToOff) : intl.formatMessage(messages.switchToOn)} /> + , unchecked: }} label={settings.get('chats', 'sound') === true ? intl.formatMessage(messages.switchToOff) : intl.formatMessage(messages.switchToOn)} /> ); } From ba5cab89aafd4c5477a707a92075572f36313b26 Mon Sep 17 00:00:00 2001 From: Curtis ROck Date: Sun, 6 Sep 2020 16:54:45 -0500 Subject: [PATCH 09/17] styling for audio chat notifications --- app/styles/chats.scss | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/app/styles/chats.scss b/app/styles/chats.scss index 38550ac3b..299eb2c13 100644 --- a/app/styles/chats.scss +++ b/app/styles/chats.scss @@ -94,6 +94,29 @@ overflow: hidden; } } + + .audio-toggle .react-toggle-thumb { + height: 21px; + width: 21px; + } + + .audio-toggle .react-toggle { + height: 23px; + top: 4px; + } + + .audio-toggle .react-toggle-track { + height: 23px; + } + + .audio-toggle .react-toggle-track-check { + bottom: 4px; + } + + .audio-toggle .react-toggle-track-x { + bottom: 4px; + } + } .chat-messages { From 9103797de4c4568699133d70bffff17b392c7ff4 Mon Sep 17 00:00:00 2001 From: Curtis ROck Date: Sun, 6 Sep 2020 17:39:38 -0500 Subject: [PATCH 10/17] improve styling on chats audio toggle --- app/styles/chats.scss | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/styles/chats.scss b/app/styles/chats.scss index 299eb2c13..11e328c75 100644 --- a/app/styles/chats.scss +++ b/app/styles/chats.scss @@ -98,6 +98,7 @@ .audio-toggle .react-toggle-thumb { height: 21px; width: 21px; + border: 1px solid var(--brand-color--med); } .audio-toggle .react-toggle { @@ -107,6 +108,7 @@ .audio-toggle .react-toggle-track { height: 23px; + background-color: var(--accent-color); } .audio-toggle .react-toggle-track-check { From 76f8e02fb9748bc43d34e0f166b937a0932bd6b6 Mon Sep 17 00:00:00 2001 From: crockwave Date: Mon, 7 Sep 2020 16:52:45 -0500 Subject: [PATCH 11/17] Refactor --- app/soapbox/actions/chats.js | 11 ++++------- app/soapbox/actions/streaming.js | 8 ++++---- app/soapbox/reducers/accounts.js | 2 +- app/soapbox/reducers/chat_message_lists.js | 2 +- app/soapbox/reducers/chat_messages.js | 2 +- app/soapbox/reducers/chats.js | 2 +- 6 files changed, 12 insertions(+), 15 deletions(-) diff --git a/app/soapbox/actions/chats.js b/app/soapbox/actions/chats.js index 2b3a9450a..30558368c 100644 --- a/app/soapbox/actions/chats.js +++ b/app/soapbox/actions/chats.js @@ -23,8 +23,7 @@ export const CHAT_READ_REQUEST = 'CHAT_READ_REQUEST'; export const CHAT_READ_SUCCESS = 'CHAT_READ_SUCCESS'; export const CHAT_READ_FAIL = 'CHAT_READ_FAIL'; -export const STREAMING_CHAT_UPDATE = 'STREAMING_CHAT_UPDATE'; -export const CHATS_UPDATE_NOOP = 'CHATS_UPDATE_NOOP'; +export const CHAT_NOTIFICATION = 'CHAT_NOTIFICATION'; export function fetchChats() { return (dispatch, getState) => { @@ -154,21 +153,19 @@ export function markChatRead(chatId, lastReadId) { }; } -export function updateChatsQueue(chat) { +export function chatsNotification(chat) { return (dispatch, getState) => { const playSound = getSettings(getState()).getIn(['chats', 'sound']); - // const flashWindow = getSettings(getState()).getIn(['chats', 'flash']); + // const flashWindow = getSettings(getState()).getIn(['chats', 'flash']); // implement when developing chat window flashing notification if (playSound) { if (chat.last_message && chat.last_message.account_id !== getState().get('me')) { dispatch({ - type: CHATS_UPDATE_NOOP, + type: CHAT_NOTIFICATION, meta: { sound: 'chat' }, }); } } - - dispatch({ type: STREAMING_CHAT_UPDATE, chat: chat, me: getState().get('me') }); }; }; diff --git a/app/soapbox/actions/streaming.js b/app/soapbox/actions/streaming.js index c3e4363da..523c7e56d 100644 --- a/app/soapbox/actions/streaming.js +++ b/app/soapbox/actions/streaming.js @@ -7,13 +7,13 @@ import { processTimelineUpdate, } from './timelines'; import { updateNotificationsQueue, expandNotifications } from './notifications'; -import { updateChatsQueue } from './chats'; +import { chatsNotification } from './chats'; import { updateConversations } from './conversations'; import { fetchFilters } from './filters'; import { getSettings } from 'soapbox/actions/settings'; import messages from 'soapbox/locales/messages'; -// export const STREAMING_CHAT_UPDATE = 'STREAMING_CHAT_UPDATE'; +export const STREAMING_CHAT_UPDATE = 'STREAMING_CHAT_UPDATE'; const validLocale = locale => Object.keys(messages).includes(locale); @@ -56,8 +56,8 @@ export function connectTimelineStream(timelineId, path, pollingRefresh = null, a dispatch(fetchFilters()); break; case 'pleroma:chat_update': - dispatch(updateChatsQueue(JSON.parse(data.payload))); - // dispatch({ type: STREAMING_CHAT_UPDATE, chat: JSON.parse(data.payload), me: getState().get('me') }); + dispatch(chatsNotification(JSON.parse(data.payload))); + dispatch({ type: STREAMING_CHAT_UPDATE, chat: JSON.parse(data.payload), me: getState().get('me') }); break; } }, diff --git a/app/soapbox/reducers/accounts.js b/app/soapbox/reducers/accounts.js index ae565d782..b02ef763f 100644 --- a/app/soapbox/reducers/accounts.js +++ b/app/soapbox/reducers/accounts.js @@ -4,7 +4,7 @@ import { ACCOUNT_FETCH_FAIL_FOR_USERNAME_LOOKUP, } from '../actions/importer'; import { CHATS_FETCH_SUCCESS, CHAT_FETCH_SUCCESS } from 'soapbox/actions/chats'; -import { STREAMING_CHAT_UPDATE } from 'soapbox/actions/chats'; +import { STREAMING_CHAT_UPDATE } from 'soapbox/actions/streaming'; import { normalizeAccount as normalizeAccount2 } from 'soapbox/actions/importer/normalizer'; import { Map as ImmutableMap, fromJS } from 'immutable'; diff --git a/app/soapbox/reducers/chat_message_lists.js b/app/soapbox/reducers/chat_message_lists.js index b1cfcd0a4..b584dca72 100644 --- a/app/soapbox/reducers/chat_message_lists.js +++ b/app/soapbox/reducers/chat_message_lists.js @@ -4,7 +4,7 @@ import { CHAT_MESSAGE_SEND_REQUEST, CHAT_MESSAGE_SEND_SUCCESS, } from 'soapbox/actions/chats'; -import { STREAMING_CHAT_UPDATE } from 'soapbox/actions/chats'; +import { STREAMING_CHAT_UPDATE } from 'soapbox/actions/streaming'; import { Map as ImmutableMap, OrderedSet as ImmutableOrderedSet } from 'immutable'; const initialState = ImmutableMap(); diff --git a/app/soapbox/reducers/chat_messages.js b/app/soapbox/reducers/chat_messages.js index b44a1e6e5..74d83ef79 100644 --- a/app/soapbox/reducers/chat_messages.js +++ b/app/soapbox/reducers/chat_messages.js @@ -4,7 +4,7 @@ import { CHAT_MESSAGE_SEND_REQUEST, CHAT_MESSAGE_SEND_SUCCESS, } from 'soapbox/actions/chats'; -import { STREAMING_CHAT_UPDATE } from 'soapbox/actions/chats'; +import { STREAMING_CHAT_UPDATE } from 'soapbox/actions/streaming'; import { Map as ImmutableMap, fromJS } from 'immutable'; const initialState = ImmutableMap(); diff --git a/app/soapbox/reducers/chats.js b/app/soapbox/reducers/chats.js index 745a7acf7..0efb5361f 100644 --- a/app/soapbox/reducers/chats.js +++ b/app/soapbox/reducers/chats.js @@ -4,7 +4,7 @@ import { CHAT_READ_SUCCESS, CHAT_READ_REQUEST, } from 'soapbox/actions/chats'; -import { STREAMING_CHAT_UPDATE } from 'soapbox/actions/chats'; +import { STREAMING_CHAT_UPDATE } from 'soapbox/actions/streaming'; import { normalizeChat } from 'soapbox/actions/importer/normalizer'; import { Map as ImmutableMap, fromJS } from 'immutable'; From fa606b8040d58a3d17a465951db89fe6ee6c3a76 Mon Sep 17 00:00:00 2001 From: crockwave Date: Wed, 9 Sep 2020 19:01:25 -0500 Subject: [PATCH 12/17] Render chat unread count update in tab even when tab doesn't have focus Render chat unread count update even when chat box has focus Render chat unread count update on page load --- app/soapbox/actions/chats.js | 1 + app/soapbox/components/helmet.js | 1 + .../features/chats/components/chat_box.js | 20 +++++++++---------- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/app/soapbox/actions/chats.js b/app/soapbox/actions/chats.js index 30558368c..4e51d776a 100644 --- a/app/soapbox/actions/chats.js +++ b/app/soapbox/actions/chats.js @@ -30,6 +30,7 @@ export function fetchChats() { dispatch({ type: CHATS_FETCH_REQUEST }); return api(getState).get('/api/v1/pleroma/chats').then(({ data }) => { dispatch({ type: CHATS_FETCH_SUCCESS, chats: data }); + chatsNotification(data); }).catch(error => { dispatch({ type: CHATS_FETCH_FAIL, error }); }); diff --git a/app/soapbox/components/helmet.js b/app/soapbox/components/helmet.js index f3bff8740..c9c1eb5a6 100644 --- a/app/soapbox/components/helmet.js +++ b/app/soapbox/components/helmet.js @@ -36,6 +36,7 @@ class SoapboxHelmet extends React.Component { {children} diff --git a/app/soapbox/features/chats/components/chat_box.js b/app/soapbox/features/chats/components/chat_box.js index 12b28d513..b09e1eb94 100644 --- a/app/soapbox/features/chats/components/chat_box.js +++ b/app/soapbox/features/chats/components/chat_box.js @@ -80,16 +80,16 @@ class ChatBox extends ImmutablePureComponent { onSetInputRef(el); }; - componentDidUpdate(prevProps) { - const markReadConditions = [ - () => this.props.chat !== undefined, - () => document.activeElement === this.inputElem, - () => this.props.chat.get('unread') > 0, - ]; - - if (markReadConditions.every(c => c() === true)) - this.markRead(); - } + // componentDidUpdate(prevProps) { + // const markReadConditions = [ + // () => this.props.chat !== undefined, + // () => document.activeElement === this.inputElem, + // () => this.props.chat.get('unread') > 0, + // ]; + // + // if (markReadConditions.every(c => c() === true)) + // this.markRead(); + // } render() { const { chatMessageIds, chatId, intl } = this.props; From 16eab5c5f1dde68f1a051dacf406137a93e67dc8 Mon Sep 17 00:00:00 2001 From: Curtis ROck Date: Wed, 9 Sep 2020 21:37:35 -0500 Subject: [PATCH 13/17] Added keystroke triggered marking of chats as read in chatbox --- app/soapbox/features/chats/components/chat_box.js | 1 + 1 file changed, 1 insertion(+) diff --git a/app/soapbox/features/chats/components/chat_box.js b/app/soapbox/features/chats/components/chat_box.js index b09e1eb94..960b2e66c 100644 --- a/app/soapbox/features/chats/components/chat_box.js +++ b/app/soapbox/features/chats/components/chat_box.js @@ -52,6 +52,7 @@ class ChatBox extends ImmutablePureComponent { } handleKeyDown = (e) => { + this.markRead(); if (e.key === 'Enter' && e.shiftKey) { this.insertLine(); e.preventDefault(); From e60457dd0107e96caff3861198f70720b5a76a2d Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Thu, 17 Sep 2020 22:59:23 -0500 Subject: [PATCH 14/17] Chat notifs: shrink toggle --- app/styles/chats.scss | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/app/styles/chats.scss b/app/styles/chats.scss index aced3d0a7..6cb6ef929 100644 --- a/app/styles/chats.scss +++ b/app/styles/chats.scss @@ -96,29 +96,39 @@ } .audio-toggle .react-toggle-thumb { - height: 21px; - width: 21px; + height: 14px; + width: 14px; border: 1px solid var(--brand-color--med); } .audio-toggle .react-toggle { - height: 23px; + height: 16px; top: 4px; } .audio-toggle .react-toggle-track { - height: 23px; + height: 16px; + width: 34px; background-color: var(--accent-color); } .audio-toggle .react-toggle-track-check { + left: 4px; bottom: 4px; } + .react-toggle--checked .react-toggle-thumb { + left: 19px; + } + .audio-toggle .react-toggle-track-x { + right: 4px; bottom: 4px; } + .fa { + font-size: 14px; + } } .chat-messages { From d77ee9fec22e65a98897709365ac04d526745940 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Thu, 17 Sep 2020 23:06:54 -0500 Subject: [PATCH 15/17] Chat notifs: refactor actions --- app/soapbox/actions/chats.js | 20 ------------------- app/soapbox/actions/streaming.js | 9 ++++++--- .../features/chats/components/chat_box.js | 11 ---------- 3 files changed, 6 insertions(+), 34 deletions(-) diff --git a/app/soapbox/actions/chats.js b/app/soapbox/actions/chats.js index 4e51d776a..729dc128e 100644 --- a/app/soapbox/actions/chats.js +++ b/app/soapbox/actions/chats.js @@ -23,14 +23,11 @@ export const CHAT_READ_REQUEST = 'CHAT_READ_REQUEST'; export const CHAT_READ_SUCCESS = 'CHAT_READ_SUCCESS'; export const CHAT_READ_FAIL = 'CHAT_READ_FAIL'; -export const CHAT_NOTIFICATION = 'CHAT_NOTIFICATION'; - export function fetchChats() { return (dispatch, getState) => { dispatch({ type: CHATS_FETCH_REQUEST }); return api(getState).get('/api/v1/pleroma/chats').then(({ data }) => { dispatch({ type: CHATS_FETCH_SUCCESS, chats: data }); - chatsNotification(data); }).catch(error => { dispatch({ type: CHATS_FETCH_FAIL, error }); }); @@ -153,20 +150,3 @@ export function markChatRead(chatId, lastReadId) { }); }; } - -export function chatsNotification(chat) { - return (dispatch, getState) => { - const playSound = getSettings(getState()).getIn(['chats', 'sound']); - // const flashWindow = getSettings(getState()).getIn(['chats', 'flash']); // implement when developing chat window flashing notification - - if (playSound) { - if (chat.last_message && - chat.last_message.account_id !== getState().get('me')) { - dispatch({ - type: CHAT_NOTIFICATION, - meta: { sound: 'chat' }, - }); - } - } - }; -}; diff --git a/app/soapbox/actions/streaming.js b/app/soapbox/actions/streaming.js index 523c7e56d..5fe687878 100644 --- a/app/soapbox/actions/streaming.js +++ b/app/soapbox/actions/streaming.js @@ -7,7 +7,6 @@ import { processTimelineUpdate, } from './timelines'; import { updateNotificationsQueue, expandNotifications } from './notifications'; -import { chatsNotification } from './chats'; import { updateConversations } from './conversations'; import { fetchFilters } from './filters'; import { getSettings } from 'soapbox/actions/settings'; @@ -56,8 +55,12 @@ export function connectTimelineStream(timelineId, path, pollingRefresh = null, a dispatch(fetchFilters()); break; case 'pleroma:chat_update': - dispatch(chatsNotification(JSON.parse(data.payload))); - dispatch({ type: STREAMING_CHAT_UPDATE, chat: JSON.parse(data.payload), me: getState().get('me') }); + dispatch({ + type: STREAMING_CHAT_UPDATE, + chat: JSON.parse(data.payload), + me: getState().get('me'), + meta: getSettings(getState()).getIn(['chats', 'sound']) && { sound: 'chat' }, + }); break; } }, diff --git a/app/soapbox/features/chats/components/chat_box.js b/app/soapbox/features/chats/components/chat_box.js index ef7b85bf8..cded7fd70 100644 --- a/app/soapbox/features/chats/components/chat_box.js +++ b/app/soapbox/features/chats/components/chat_box.js @@ -123,17 +123,6 @@ class ChatBox extends ImmutablePureComponent { onSetInputRef(el); }; - // componentDidUpdate(prevProps) { - // const markReadConditions = [ - // () => this.props.chat !== undefined, - // () => document.activeElement === this.inputElem, - // () => this.props.chat.get('unread') > 0, - // ]; - // - // if (markReadConditions.every(c => c() === true)) - // this.markRead(); - // } - handleRemoveFile = (e) => { this.setState({ attachment: undefined, resetFileKey: fileKeyGen() }); } From b49c3ad13e617f27f1d137ece5c27a7c800428f3 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Thu, 17 Sep 2020 23:10:58 -0500 Subject: [PATCH 16/17] Chat notifs: add licensing info --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 4538075ee..584868d7c 100644 --- a/README.md +++ b/README.md @@ -188,6 +188,8 @@ Customization details can be found in the [Customization doc](docs/customization Soapbox FE is based on [Gab Social](https://code.gab.com/gab/social/gab-social)'s frontend which is in turn based on [Mastodon](https://github.com/tootsuite/mastodon/)'s frontend. +- `static/sounds/chat.mp3` and `static/sounds/chat.oga` are from [notificationsounds.com](https://notificationsounds.com/notification-sounds/intuition-561) licensed under CC BY 4.0. + Soapbox FE is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or From f643863eccc77cda886b94c20e27b5eaa09f3216 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Thu, 17 Sep 2020 23:27:57 -0500 Subject: [PATCH 17/17] Chat notifs: only play sound for recipient message --- app/soapbox/actions/streaming.js | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/app/soapbox/actions/streaming.js b/app/soapbox/actions/streaming.js index 5fe687878..b3ca60fb3 100644 --- a/app/soapbox/actions/streaming.js +++ b/app/soapbox/actions/streaming.js @@ -55,11 +55,16 @@ export function connectTimelineStream(timelineId, path, pollingRefresh = null, a dispatch(fetchFilters()); break; case 'pleroma:chat_update': - dispatch({ - type: STREAMING_CHAT_UPDATE, - chat: JSON.parse(data.payload), - me: getState().get('me'), - meta: getSettings(getState()).getIn(['chats', 'sound']) && { sound: 'chat' }, + dispatch((dispatch, getState) => { + const chat = JSON.parse(data.payload); + const messageOwned = !(chat.last_message && chat.last_message.account_id !== getState().get('me')); + + dispatch({ + type: STREAMING_CHAT_UPDATE, + chat, + // Only play sounds for recipient messages + meta: !messageOwned && getSettings(getState()).getIn(['chats', 'sound']) && { sound: 'chat' }, + }); }); break; }