From 350eb489c22e6bac20de92284193a87af63c52a9 Mon Sep 17 00:00:00 2001 From: Shpuld Shpuldson Date: Mon, 2 Nov 2020 15:46:49 +0200 Subject: [PATCH 01/23] add favicon badge for unread notifs --- CHANGELOG.md | 1 + index.html | 2 +- src/boot/after_store.js | 3 + src/components/notifications/notifications.js | 3 + .../favicon_service/favicon_service.js | 56 ++++++++++++++++++ static/dev_favicon.png | Bin 0 -> 7528 bytes 6 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 src/services/favicon_service/favicon_service.js create mode 100644 static/dev_favicon.png diff --git a/CHANGELOG.md b/CHANGELOG.md index 68cab40c..997889fe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Import/export a muted users - Proper handling of deletes when using websocket streaming - Added optimistic chat message sending, so you can start writing next message before the previous one has been sent +- Added a small red badge to the favicon when there's unread notifications ### Fixed - Fixed chats list not updating its order when new messages come in diff --git a/index.html b/index.html index 1ff944d9..9ac0cfe9 100644 --- a/index.html +++ b/index.html @@ -5,7 +5,7 @@ Pleroma - + diff --git a/src/boot/after_store.js b/src/boot/after_store.js index 3cbbf020..b472fcf6 100644 --- a/src/boot/after_store.js +++ b/src/boot/after_store.js @@ -7,6 +7,7 @@ import { getOrCreateApp, getClientToken } from '../services/new_api/oauth.js' import backendInteractorService from '../services/backend_interactor_service/backend_interactor_service.js' import { CURRENT_VERSION } from '../services/theme_data/theme_data.service.js' import { applyTheme } from '../services/style_setter/style_setter.js' +import FaviconService from '../services/favicon_service/favicon_service.js' let staticInitialResults = null @@ -326,6 +327,8 @@ const afterStoreSetup = async ({ store, i18n }) => { const width = windowWidth() store.dispatch('setMobileLayout', width <= 800) + FaviconService.initFaviconService() + const overrides = window.___pleromafe_dev_overrides || {} const server = (typeof overrides.target !== 'undefined') ? overrides.target : window.location.origin store.dispatch('setInstanceOption', { name: 'server', value: server }) diff --git a/src/components/notifications/notifications.js b/src/components/notifications/notifications.js index 4b479e13..49258563 100644 --- a/src/components/notifications/notifications.js +++ b/src/components/notifications/notifications.js @@ -6,6 +6,7 @@ import { filteredNotificationsFromStore, unseenNotificationsFromStore } from '../../services/notification_utils/notification_utils.js' +import FaviconService from '../../services/favicon_service/favicon_service.js' import { library } from '@fortawesome/fontawesome-svg-core' import { faCircleNotch } from '@fortawesome/free-solid-svg-icons' @@ -75,8 +76,10 @@ const Notifications = { watch: { unseenCountTitle (count) { if (count > 0) { + FaviconService.drawFaviconBadge() this.$store.dispatch('setPageTitle', `(${count})`) } else { + FaviconService.clearFaviconBadge() this.$store.dispatch('setPageTitle', '') } } diff --git a/src/services/favicon_service/favicon_service.js b/src/services/favicon_service/favicon_service.js new file mode 100644 index 00000000..8e3f1170 --- /dev/null +++ b/src/services/favicon_service/favicon_service.js @@ -0,0 +1,56 @@ +import { find } from 'lodash' + +const createFaviconService = () => { + let favimg, favcanvas, favcontext, favicon + const faviconWidth = 48 + const faviconHeight = 48 + const strokeColor = 'rgb(200, 0, 0)' + const fillColor = 'rgb(255, 90, 90)' + const badgeRadius = 12 + + const initFaviconService = () => { + const nodes = document.getElementsByTagName('link') + favicon = find(nodes, node => node.rel === 'icon') + if (favicon) { + favcanvas = document.createElement('canvas') + favcanvas.width = faviconWidth + favcanvas.height = faviconHeight + favimg = new Image() + favimg.src = favicon.href + favcontext = favcanvas.getContext('2d') + } + } + + const clearFaviconBadge = () => { + if (!favimg || !favcontext || !favicon) return + + favcontext.clearRect(0, 0, faviconWidth, faviconHeight) + favcontext.drawImage(favimg, 0, 0, favimg.width, favimg.height, 0, 0, faviconWidth, faviconHeight) + favicon.href = favcanvas.toDataURL('image/png') + } + + const drawFaviconBadge = () => { + if (!favimg || !favcontext || !favcontext) return + + clearFaviconBadge() + + favcontext.drawImage(favimg, 0, 0, favimg.width, favimg.height, 0, 0, faviconWidth, faviconHeight) + favcontext.fillStyle = fillColor + favcontext.strokeStyle = strokeColor + favcontext.beginPath() + favcontext.arc(faviconWidth - badgeRadius, faviconHeight - badgeRadius, badgeRadius, 0, 2 * Math.PI, false) + favcontext.fill() + favcontext.stroke() + favicon.href = favcanvas.toDataURL('image/png') + } + + return { + initFaviconService, + clearFaviconBadge, + drawFaviconBadge + } +} + +const FaviconService = createFaviconService() + +export default FaviconService diff --git a/static/dev_favicon.png b/static/dev_favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..8b53d74622460511095714ec2893eda11b2c0063 GIT binary patch literal 7528 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 literal 0 HcmV?d00001 From 1fa046126eb8a048440ff97be8febe3a8c6e6e58 Mon Sep 17 00:00:00 2001 From: Shpuld Shpuldson Date: Mon, 2 Nov 2020 16:45:15 +0200 Subject: [PATCH 02/23] make badge just a ball, make it use theming --- .../favicon_service/favicon_service.js | 13 ++++++------- static/dev_favicon.png | Bin 7528 -> 13331 bytes static/favicon.png | Bin 0 -> 12920 bytes 3 files changed, 6 insertions(+), 7 deletions(-) create mode 100644 static/favicon.png diff --git a/src/services/favicon_service/favicon_service.js b/src/services/favicon_service/favicon_service.js index 8e3f1170..5fa8e5c3 100644 --- a/src/services/favicon_service/favicon_service.js +++ b/src/services/favicon_service/favicon_service.js @@ -4,9 +4,7 @@ const createFaviconService = () => { let favimg, favcanvas, favcontext, favicon const faviconWidth = 48 const faviconHeight = 48 - const strokeColor = 'rgb(200, 0, 0)' - const fillColor = 'rgb(255, 90, 90)' - const badgeRadius = 12 + const badgeRadius = 14 const initFaviconService = () => { const nodes = document.getElementsByTagName('link') @@ -34,13 +32,14 @@ const createFaviconService = () => { clearFaviconBadge() + const style = getComputedStyle(document.body) + const badgeColor = `${style.getPropertyValue('--badgeNotification') || 'rgb(240, 100, 100)'}` + favcontext.drawImage(favimg, 0, 0, favimg.width, favimg.height, 0, 0, faviconWidth, faviconHeight) - favcontext.fillStyle = fillColor - favcontext.strokeStyle = strokeColor + favcontext.fillStyle = badgeColor favcontext.beginPath() - favcontext.arc(faviconWidth - badgeRadius, faviconHeight - badgeRadius, badgeRadius, 0, 2 * Math.PI, false) + favcontext.arc(faviconWidth - badgeRadius, badgeRadius, badgeRadius, 0, 2 * Math.PI, false) favcontext.fill() - favcontext.stroke() favicon.href = favcanvas.toDataURL('image/png') } diff --git a/static/dev_favicon.png b/static/dev_favicon.png index 8b53d74622460511095714ec2893eda11b2c0063..4223d5ca8c14fe460e3b92c5bf78309aa98639e0 100644 GIT binary patch delta 9186 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 delta 3341 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 XXVX>od0Ez~00000NkvXXu0mjfYYRhH diff --git a/static/favicon.png b/static/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..d1206dc51c3d859fcbac4cc50e62991632147d24 GIT binary patch literal 12920 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 f%3`l`KcFiKT2iZ=QaQbS8?B Date: Tue, 3 Nov 2020 10:29:03 +0200 Subject: [PATCH 03/23] remove the favicon changes --- index.html | 2 +- static/dev_favicon.png | Bin 13331 -> 0 bytes static/favicon.png | Bin 12920 -> 0 bytes 3 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 static/dev_favicon.png delete mode 100644 static/favicon.png diff --git a/index.html b/index.html index 9ac0cfe9..1ff944d9 100644 --- a/index.html +++ b/index.html @@ -5,7 +5,7 @@ Pleroma - + diff --git a/static/dev_favicon.png b/static/dev_favicon.png deleted file mode 100644 index 4223d5ca8c14fe460e3b92c5bf78309aa98639e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13331 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 f%3`l`KcFiKT2iZ=QaQbS8?B Date: Tue, 3 Nov 2020 11:55:29 +0200 Subject: [PATCH 04/23] change favicon dimensions for high res, add handling when favicon isn't available --- src/services/favicon_service/favicon_service.js | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/services/favicon_service/favicon_service.js b/src/services/favicon_service/favicon_service.js index 5fa8e5c3..d1ddee41 100644 --- a/src/services/favicon_service/favicon_service.js +++ b/src/services/favicon_service/favicon_service.js @@ -2,9 +2,9 @@ import { find } from 'lodash' const createFaviconService = () => { let favimg, favcanvas, favcontext, favicon - const faviconWidth = 48 - const faviconHeight = 48 - const badgeRadius = 14 + const faviconWidth = 128 + const faviconHeight = 128 + const badgeRadius = 32 const initFaviconService = () => { const nodes = document.getElementsByTagName('link') @@ -19,11 +19,15 @@ const createFaviconService = () => { } } + const isImageLoaded = (img) => img.complete && img.naturalHeight !== 0 + const clearFaviconBadge = () => { if (!favimg || !favcontext || !favicon) return favcontext.clearRect(0, 0, faviconWidth, faviconHeight) - favcontext.drawImage(favimg, 0, 0, favimg.width, favimg.height, 0, 0, faviconWidth, faviconHeight) + if (isImageLoaded(favimg)) { + favcontext.drawImage(favimg, 0, 0, favimg.width, favimg.height, 0, 0, faviconWidth, faviconHeight) + } favicon.href = favcanvas.toDataURL('image/png') } @@ -35,7 +39,9 @@ const createFaviconService = () => { const style = getComputedStyle(document.body) const badgeColor = `${style.getPropertyValue('--badgeNotification') || 'rgb(240, 100, 100)'}` - favcontext.drawImage(favimg, 0, 0, favimg.width, favimg.height, 0, 0, faviconWidth, faviconHeight) + if (isImageLoaded(favimg)) { + favcontext.drawImage(favimg, 0, 0, favimg.width, favimg.height, 0, 0, faviconWidth, faviconHeight) + } favcontext.fillStyle = badgeColor favcontext.beginPath() favcontext.arc(faviconWidth - badgeRadius, badgeRadius, badgeRadius, 0, 2 * Math.PI, false) From 82f17961d1c8f092453adb0b6c42b38157a63677 Mon Sep 17 00:00:00 2001 From: Shpuld Shpludson Date: Fri, 6 Nov 2020 17:36:43 +0000 Subject: [PATCH 05/23] Update CHANGELOG.md to match master --- CHANGELOG.md | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 056a0881..5feafcaa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,8 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). -## [Unreleased] + +## [2.2.0] - 2020-11-06 ### Added - New option to optimize timeline rendering to make the site more responsive (enabled by default) - New instance option `logoLeft` to move logo to the left side in desktop nav bar @@ -12,8 +13,6 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Added optimistic chat message sending, so you can start writing next message before the previous one has been sent ### Fixed -- Fixed chats list not updating its order when new messages come in -- Fixed chat messages sometimes getting lost when you receive a message at the same time - Fixed clicking NSFW hider through status popover - Fixed chat-view back button being hard to click - Fixed fresh chat notifications being cleared immediately while leaving the chat view and not having time to actually see the messages @@ -29,6 +28,13 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Logo is now clickable - Changed default logo to SVG version + +## [2.1.2] - 2020-09-17 +### Fixed +- Fixed chats list not updating its order when new messages come in +- Fixed chat messages sometimes getting lost when you receive a message at the same time + + ## [2.1.1] - 2020-09-08 ### Changed - Polls will be hidden with status content if "Collapse posts with subjects" is enabled and the post is collapsed. @@ -154,8 +160,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Ability to change user's email - About page - Added remote user redirect -- Bookmarks + ### Changed - changed the way fading effects for user profile/long statuses works, now uses css-mask instead of gradient background hacks which weren't exactly compatible with semi-transparent themes + ### Fixed - improved hotkey behavior on autocomplete popup From 9f96b592d4c1e0d68910307a296cf5536cb373a4 Mon Sep 17 00:00:00 2001 From: Shpuld Shpuldson Date: Mon, 9 Nov 2020 09:40:20 +0200 Subject: [PATCH 06/23] wrap react button icon to a span to fix popover overflow --- src/components/react_button/react_button.vue | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/components/react_button/react_button.vue b/src/components/react_button/react_button.vue index 95d95b11..e508a3e9 100644 --- a/src/components/react_button/react_button.vue +++ b/src/components/react_button/react_button.vue @@ -4,6 +4,7 @@ placement="top" :offset="{ y: 5 }" class="react-button-popover" + :bound-to="{ x: 'container' }" >
- + + + From 9ff48b88bfc652b031786a9dea0f22b4f347c01b Mon Sep 17 00:00:00 2001 From: Shpuld Shpludson Date: Mon, 9 Nov 2020 09:01:16 +0000 Subject: [PATCH 07/23] Update CHANGELOG.md --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5feafcaa..3bf8fa84 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,11 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## [Unreleased] +### Fixed +- Fixed regression in react popup alignment and overflowing + + ## [2.2.0] - 2020-11-06 ### Added - New option to optimize timeline rendering to make the site more responsive (enabled by default) From 553155fc490d289242a0e57efab8de2834278959 Mon Sep 17 00:00:00 2001 From: Shpuld Shpuldson Date: Mon, 9 Nov 2020 14:42:16 +0200 Subject: [PATCH 08/23] prevent call to scroll if the value doesn't change because firefox is stupid --- src/components/post_status_form/post_status_form.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/components/post_status_form/post_status_form.js b/src/components/post_status_form/post_status_form.js index de583269..6a4efc2c 100644 --- a/src/components/post_status_form/post_status_form.js +++ b/src/components/post_status_form/post_status_form.js @@ -533,10 +533,12 @@ const PostStatusForm = { const totalDelta = shouldScrollToBottom ? bottomChangeDelta : 0 const targetScroll = currentScroll + totalDelta - if (scrollerRef === window) { - scrollerRef.scroll(0, targetScroll) - } else { - scrollerRef.scrollTop = targetScroll + if (totalDelta >= 1) { + if (scrollerRef === window) { + scrollerRef.scroll(0, targetScroll) + } else { + scrollerRef.scrollTop = targetScroll + } } this.$refs['emoji-input'].resize() From fb80dbbc77f25cdae818994a6d4828fa0d237504 Mon Sep 17 00:00:00 2001 From: Shpuld Shpuldson Date: Mon, 9 Nov 2020 14:47:42 +0200 Subject: [PATCH 09/23] changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3bf8fa84..8f14bc59 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## [Unreleased] ### Fixed - Fixed regression in react popup alignment and overflowing +- Fixed the occasional bug where screen would scroll 1px when typing into a reply form ## [2.2.0] - 2020-11-06 From c1c207788a3599602888a9c5cadedd99561266af Mon Sep 17 00:00:00 2001 From: Shpuld Shpuldson Date: Mon, 9 Nov 2020 15:02:48 +0200 Subject: [PATCH 10/23] change method of fix to rounding --- src/components/post_status_form/post_status_form.js | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/components/post_status_form/post_status_form.js b/src/components/post_status_form/post_status_form.js index 6a4efc2c..3ff4a3c8 100644 --- a/src/components/post_status_form/post_status_form.js +++ b/src/components/post_status_form/post_status_form.js @@ -531,14 +531,12 @@ const PostStatusForm = { !(isFormBiggerThanScroller && this.$refs.textarea.selectionStart !== this.$refs.textarea.value.length) const totalDelta = shouldScrollToBottom ? bottomChangeDelta : 0 - const targetScroll = currentScroll + totalDelta + const targetScroll = Math.round(currentScroll + totalDelta) - if (totalDelta >= 1) { - if (scrollerRef === window) { - scrollerRef.scroll(0, targetScroll) - } else { - scrollerRef.scrollTop = targetScroll - } + if (scrollerRef === window) { + scrollerRef.scroll(0, targetScroll) + } else { + scrollerRef.scrollTop = targetScroll } this.$refs['emoji-input'].resize() From d150dae5d156416351312f25b06de0013ee0a95d Mon Sep 17 00:00:00 2001 From: Shpuld Shpuldson Date: Tue, 10 Nov 2020 12:52:54 +0200 Subject: [PATCH 11/23] fixes to timeline error handling --- src/components/timeline/timeline.js | 12 +++------- src/components/timeline/timeline.vue | 24 ++----------------- src/components/timeline_menu/timeline_menu.js | 5 ++-- src/i18n/en.json | 2 +- src/modules/statuses.js | 2 -- src/services/api/api.service.js | 2 +- .../timeline_fetcher.service.js | 15 ++++++++---- 7 files changed, 20 insertions(+), 42 deletions(-) diff --git a/src/components/timeline/timeline.js b/src/components/timeline/timeline.js index cba46daf..665d195e 100644 --- a/src/components/timeline/timeline.js +++ b/src/components/timeline/timeline.js @@ -50,17 +50,10 @@ const Timeline = { TimelineMenu }, computed: { - timelineError () { - return this.$store.state.statuses.error - }, - errorData () { - return this.$store.state.statuses.errorData - }, newStatusCount () { return this.timeline.newStatusCount }, showLoadButton () { - if (this.timelineError || this.errorData) return false return this.timeline.newStatusCount > 0 || this.timeline.flushMarker !== 0 }, loadButtonString () { @@ -171,11 +164,12 @@ const Timeline = { userId: this.userId, tag: this.tag }).then(({ statuses }) => { - store.commit('setLoading', { timeline: this.timelineName, value: false }) if (statuses && statuses.length === 0) { this.bottomedOut = true } - }) + }).finally(() => + store.commit('setLoading', { timeline: this.timelineName, value: false }) + ) }, 1000, this), determineVisibleStatuses () { if (!this.$refs.timeline) return diff --git a/src/components/timeline/timeline.vue b/src/components/timeline/timeline.vue index 04859852..d4da2a87 100644 --- a/src/components/timeline/timeline.vue +++ b/src/components/timeline/timeline.vue @@ -2,22 +2,8 @@
-
- {{ $t('timeline.error_fetching') }} -
-
- {{ errorData.statusText }} -
- - - -
- {{ $t('timeline.error_fetching') }} -