From dfbc2704d8ab7da4101ac8546bb33a21ddcdefe6 Mon Sep 17 00:00:00 2001 From: tusooa Date: Sat, 19 Oct 2024 13:42:04 -0400 Subject: [PATCH 01/16] Authenticate and subscribe to streaming after connection --- changelog.d/streaming-op-after-conn.change | 1 + src/modules/api.js | 3 + src/services/api/api.service.js | 80 +++++++++++++++---- .../backend_interactor_service.js | 4 +- 4 files changed, 70 insertions(+), 18 deletions(-) create mode 100644 changelog.d/streaming-op-after-conn.change diff --git a/changelog.d/streaming-op-after-conn.change b/changelog.d/streaming-op-after-conn.change new file mode 100644 index 000000000..73a79d843 --- /dev/null +++ b/changelog.d/streaming-op-after-conn.change @@ -0,0 +1 @@ +Authenticate and subscribe to streaming after connection diff --git a/src/modules/api.js b/src/modules/api.js index 23364fcd6..8dd8bc5fc 100644 --- a/src/modules/api.js +++ b/src/modules/api.js @@ -87,6 +87,9 @@ const api = { const { state, commit, dispatch, rootState } = store const timelineData = rootState.statuses.timelines.friends state.mastoUserSocket = state.backendInteractor.startUserSocket({ store }) + state.mastoUserSocket.addEventListener('pleroma:authenticated', () => { + state.mastoUserSocket.subscribe('user') + }) state.mastoUserSocket.addEventListener( 'message', ({ detail: message }) => { diff --git a/src/services/api/api.service.js b/src/services/api/api.service.js index 94c123601..f6a89bd27 100644 --- a/src/services/api/api.service.js +++ b/src/services/api/api.service.js @@ -1493,17 +1493,18 @@ const deleteAnnouncement = ({ id, credentials }) => { }) } -export const getMastodonSocketURI = ({ credentials, stream, args = {} }) => { - return Object.entries({ - ...(credentials - ? { access_token: credentials } - : {} - ), - stream, - ...args - }).reduce((acc, [key, val]) => { - return acc + `${key}=${val}&` - }, MASTODON_STREAMING + '?') +export const getMastodonSocketURI = ({ credentials, stream, args = {} }, base) => { + const url = new URL(MASTODON_STREAMING, base) + if (credentials) { + url.searchParams.append('access_token', credentials) + } + if (stream) { + url.searchParams.append('stream', stream) + } + Object.entries(args).forEach(([key, val]) => { + url.searchParams.append(key, val) + }) + return url } const MASTODON_STREAMING_EVENTS = new Set([ @@ -1515,7 +1516,8 @@ const MASTODON_STREAMING_EVENTS = new Set([ ]) const PLEROMA_STREAMING_EVENTS = new Set([ - 'pleroma:chat_update' + 'pleroma:chat_update', + 'pleroma:respond' ]) // A thin wrapper around WebSocket API that allows adding a pre-processor to it @@ -1523,7 +1525,8 @@ const PLEROMA_STREAMING_EVENTS = new Set([ export const ProcessedWS = ({ url, preprocessor = handleMastoWS, - id = 'Unknown' + id = 'Unknown', + credentials }) => { const eventTarget = new EventTarget() const socket = new WebSocket(url) @@ -1538,6 +1541,12 @@ export const ProcessedWS = ({ } socket.addEventListener('open', (wsEvent) => { console.debug(`[WS][${id}] Socket connected`, wsEvent) + if (credentials) { + socket.send(JSON.stringify({ + type: 'pleroma:authenticate', + token: credentials + })) + } }) socket.addEventListener('error', (wsEvent) => { console.debug(`[WS][${id}] Socket errored`, wsEvent) @@ -1558,19 +1567,47 @@ export const ProcessedWS = ({ }) /**/ + const onAuthenticated = () => { + eventTarget.dispatchEvent(new CustomEvent('pleroma:authenticated')) + } + proxy(socket, 'open') proxy(socket, 'close') - proxy(socket, 'message', preprocessor) + proxy(socket, 'message', (event) => preprocessor(event, { onAuthenticated })) proxy(socket, 'error') // 1000 = Normal Closure eventTarget.close = () => { socket.close(1000, 'Shutting down socket') } eventTarget.getState = () => socket.readyState + eventTarget.subscribe = (stream, args = {}) => { + console.debug( + `[WS][${id}] Subscribing to stream ${stream} with args`, + args + ) + socket.send(JSON.stringify({ + type: 'subscribe', + stream, + ...args + })) + } + eventTarget.unsubscribe = (stream, args = {}) => { + console.debug( + `[WS][${id}] Unsubscribing from stream ${stream} with args`, + args + ) + socket.send(JSON.stringify({ + type: 'unsubscribe', + stream, + ...args + })) + } return eventTarget } -export const handleMastoWS = (wsEvent) => { +export const handleMastoWS = (wsEvent, { + onAuthenticated = () => {} +} = {}) => { const { data } = wsEvent if (!data) return const parsedEvent = JSON.parse(data) @@ -1581,7 +1618,18 @@ export const handleMastoWS = (wsEvent) => { return { event, id: payload } } const data = payload ? JSON.parse(payload) : null - if (event === 'update') { + if (event === 'pleroma:respond') { + if (data.type === 'pleroma:authenticate') { + if (data.result === 'success') { + console.debug('[WS] Successfully authenticated') + onAuthenticated() + } else { + console.error('[WS] Unable to authenticate:', data.error) + wsEvent.target.close() + } + } + return null + } else if (event === 'update') { return { event, status: parseStatus(data) } } else if (event === 'status.update') { return { event, status: parseStatus(data) } diff --git a/src/services/backend_interactor_service/backend_interactor_service.js b/src/services/backend_interactor_service/backend_interactor_service.js index 49785d08e..ca3cac53d 100644 --- a/src/services/backend_interactor_service/backend_interactor_service.js +++ b/src/services/backend_interactor_service/backend_interactor_service.js @@ -36,8 +36,8 @@ const backendInteractorService = credentials => ({ startUserSocket ({ store }) { const serv = store.rootState.instance.server.replace('http', 'ws') - const url = serv + getMastodonSocketURI({ credentials, stream: 'user' }) - return ProcessedWS({ url, id: 'User' }) + const url = getMastodonSocketURI({}, serv) + return ProcessedWS({ url, id: 'Unified', credentials }) }, ...Object.entries(apiService).reduce((acc, [key, func]) => { From a00792a7750256ff5b95c0692d3ffce81219962f Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Tue, 31 Dec 2024 13:30:23 +0200 Subject: [PATCH 02/16] limit how dark/light can auto-contrast can get --- src/services/color_convert/color_convert.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/color_convert/color_convert.js b/src/services/color_convert/color_convert.js index aa7dc8b94..9e3560f57 100644 --- a/src/services/color_convert/color_convert.js +++ b/src/services/color_convert/color_convert.js @@ -210,7 +210,7 @@ export const getTextColor = function (bg, text, preserve) { const result = convert(rgb2hex(workColor)).hsl const delta = result.l > 50 ? 1 : -1 const multiplier = 10 - while (contrast < 4.5 && result.l > 0 && result.l < 100) { + while (contrast < 4.5 && result.l > 20 && result.l < 80) { result.l += delta * multiplier contrast = getContrastRatio(bg, convert(result).rgb) console.log(convert(result).hex, result.l, contrast) From 18aba1ebbc8904e0b39e8a386fb14df672401ce2 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Tue, 31 Dec 2024 13:31:37 +0200 Subject: [PATCH 03/16] clamp value --- src/services/color_convert/color_convert.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/services/color_convert/color_convert.js b/src/services/color_convert/color_convert.js index 9e3560f57..7659d89ef 100644 --- a/src/services/color_convert/color_convert.js +++ b/src/services/color_convert/color_convert.js @@ -212,6 +212,7 @@ export const getTextColor = function (bg, text, preserve) { const multiplier = 10 while (contrast < 4.5 && result.l > 20 && result.l < 80) { result.l += delta * multiplier + result.l = Math.min(100, Math.max(0, result.l)) contrast = getContrastRatio(bg, convert(result).rgb) console.log(convert(result).hex, result.l, contrast) } From 09956cad2f13a667885ca5e63f29c101f6eb9f4a Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Tue, 31 Dec 2024 13:52:32 +0200 Subject: [PATCH 04/16] cleanup --- src/services/color_convert/color_convert.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/services/color_convert/color_convert.js b/src/services/color_convert/color_convert.js index 7659d89ef..dbe834937 100644 --- a/src/services/color_convert/color_convert.js +++ b/src/services/color_convert/color_convert.js @@ -214,7 +214,6 @@ export const getTextColor = function (bg, text, preserve) { result.l += delta * multiplier result.l = Math.min(100, Math.max(0, result.l)) contrast = getContrastRatio(bg, convert(result).rgb) - console.log(convert(result).hex, result.l, contrast) } const base = typeof text.a !== 'undefined' ? { a: text.a } : {} From afa3410f467891514965bd029620154712cc2877 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Tue, 31 Dec 2024 13:52:40 +0200 Subject: [PATCH 05/16] fix firefox palettes --- .../settings_modal/tabs/appearance_tab.scss | 12 ++- .../settings_modal/tabs/appearance_tab.vue | 94 ++++++++++--------- 2 files changed, 56 insertions(+), 50 deletions(-) diff --git a/src/components/settings_modal/tabs/appearance_tab.scss b/src/components/settings_modal/tabs/appearance_tab.scss index 1ba9c01d5..eff5438a7 100644 --- a/src/components/settings_modal/tabs/appearance_tab.scss +++ b/src/components/settings_modal/tabs/appearance_tab.scss @@ -24,10 +24,7 @@ margin: 0.5em 0; } - .palettes { - display: grid; - grid-template-columns: 1fr 1fr; - grid-gap: 0.5em; + .palettes-container { height: 15em; overflow-y: auto; overflow-x: hidden; @@ -35,7 +32,14 @@ border-radius: var(--roundness); border: 1px solid var(--border); margin: -0.5em; + } + + .palettes { + display: grid; + grid-template-columns: 1fr 1fr; + grid-gap: 0.5em; padding: 0.5em; + width: 100%; h4 { margin: 0; diff --git a/src/components/settings_modal/tabs/appearance_tab.vue b/src/components/settings_modal/tabs/appearance_tab.vue index bd82643f5..bda0ab144 100644 --- a/src/components/settings_modal/tabs/appearance_tab.vue +++ b/src/components/settings_modal/tabs/appearance_tab.vue @@ -93,56 +93,58 @@

{{ $t('settings.style.themes3.palette.label') }}

{{ $t('settings.style.themes3.palette.style') }}

- -

{{ $t('settings.style.themes3.palette.bundled') }}

- +
+ +

{{ $t('settings.style.themes3.palette.bundled') }}

+ +
diff --git a/src/components/emoji_input/emoji_input.js b/src/components/emoji_input/emoji_input.js index 9baf63f22..09d44b0bd 100644 --- a/src/components/emoji_input/emoji_input.js +++ b/src/components/emoji_input/emoji_input.js @@ -293,9 +293,12 @@ const EmojiInput = { })) this.highlighted = this.defaultCandidateIndex this.$refs.screenReaderNotice.announce( - this.$tc('tool_tip.autocomplete_available', - this.suggestions.length, - { number: this.suggestions.length })) + this.$t( + 'tool_tip.autocomplete_available', + { number: this.suggestions.length }, + this.suggestions.length + ) + ) } }, methods: { diff --git a/src/components/emoji_reactions/emoji_reactions.js b/src/components/emoji_reactions/emoji_reactions.js index 77f8ecbb2..861fbe542 100644 --- a/src/components/emoji_reactions/emoji_reactions.js +++ b/src/components/emoji_reactions/emoji_reactions.js @@ -92,7 +92,7 @@ const EmojiReactions = { toggled: this.reactedWith(reaction.name) } ], - 'aria-label': this.$tc('status.reaction_count_label', reaction.count, { num: reaction.count }) + 'aria-label': this.$t('status.reaction_count_label', { num: reaction.count }, reaction.count) } } } diff --git a/src/components/extra_notifications/extra_notifications.vue b/src/components/extra_notifications/extra_notifications.vue index ffbb43eb3..5728dc98f 100644 --- a/src/components/extra_notifications/extra_notifications.vue +++ b/src/components/extra_notifications/extra_notifications.vue @@ -14,7 +14,7 @@ class="fa-scale-110 icon" icon="comments" /> - {{ $tc('notifications.unread_chats', unreadChatCount, { num: unreadChatCount }) }} + {{ $t('notifications.unread_chats', { num: unreadChatCount }, unreadChatCount) }}
- {{ $tc('notifications.unread_announcements', unreadAnnouncementCount, { num: unreadAnnouncementCount }) }} + {{ $t('notifications.unread_announcements', { num: unreadAnnouncementCount }, unreadAnnouncementCount) }}
- {{ $tc('notifications.unread_follow_requests', followRequestCount, { num: followRequestCount }) }} + {{ $t('notifications.unread_follow_requests', { num: followRequestCount }, followRequestCount) }}
@@ -108,7 +108,7 @@ From 32d07606ba0c97aed8250f62fb9c0a5e1b65edea Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Thu, 2 Jan 2025 23:02:11 +0200 Subject: [PATCH 16/16] changelog --- changelog.d/mutes.change | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/mutes.change diff --git a/changelog.d/mutes.change b/changelog.d/mutes.change new file mode 100644 index 000000000..f55a8abbf --- /dev/null +++ b/changelog.d/mutes.change @@ -0,0 +1 @@ +better display of mutes