From 1946661911c97651ba5356db22a0ddd00ba04864 Mon Sep 17 00:00:00 2001 From: Ariadne Conill Date: Sat, 9 Nov 2019 00:27:09 -0600 Subject: [PATCH 001/462] update terms of service instructions --- static/terms-of-service.html | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/static/terms-of-service.html b/static/terms-of-service.html index c02cb719..c880b72c 100644 --- a/static/terms-of-service.html +++ b/static/terms-of-service.html @@ -1,7 +1,8 @@

Terms of Service

-

This is a placeholder ToS.

+

This is the default placeholder ToS. You should change it to fit the needs of your instance.

-

Edit "/static/terms-of-service.html" to make it fit the needs of your instance.

+

To do so, place a file at "/instance/static/terms-of-service.html" in your + Pleroma install containing the real ToS for your instance.


- + From 621ac0bdc76ef1f38b227ede9200a947bbbc8073 Mon Sep 17 00:00:00 2001 From: Ariadne Conill Date: Sat, 9 Nov 2019 19:49:50 -0600 Subject: [PATCH 002/462] docs: document FE interaction with the BE private setting --- docs/CONFIGURATION.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/CONFIGURATION.md b/docs/CONFIGURATION.md index 35363537..f7397a55 100644 --- a/docs/CONFIGURATION.md +++ b/docs/CONFIGURATION.md @@ -96,3 +96,6 @@ Setting this will change the warning text that is displayed for direct messages. ATTENTION: If you actually want the behavior to change. You will need to set the appropriate option at the backend. See the backend documentation for information about that. DO NOT activate this without checking the backend configuration first! + +### Private Mode +If the `private` instance setting is enabled in the backend, features that are not accessible without authentication, such as the timelines and search will be disabled for unauthenticated users. From 99fd096ddd1cc657a86c41e7e96344b8bb1dc4de Mon Sep 17 00:00:00 2001 From: Ariadne Conill Date: Sat, 9 Nov 2019 19:53:03 -0600 Subject: [PATCH 003/462] boot: track whether private mode is enabled or not --- src/boot/after_store.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/boot/after_store.js b/src/boot/after_store.js index 226b67d8..cbe0c330 100644 --- a/src/boot/after_store.js +++ b/src/boot/after_store.js @@ -218,6 +218,9 @@ const getNodeInfo = async ({ store }) => { store.dispatch('setInstanceOption', { name: 'backendVersion', value: software.version }) store.dispatch('setInstanceOption', { name: 'pleromaBackend', value: software.name === 'pleroma' }) + const priv = metadata.private + store.dispatch('setInstanceOption', { name: 'private', value: priv }) + const frontendVersion = window.___pleromafe_commit_hash store.dispatch('setInstanceOption', { name: 'frontendVersion', value: frontendVersion }) store.dispatch('setInstanceOption', { name: 'tagPolicyAvailable', value: metadata.federation.mrf_policies.includes('TagPolicy') }) From 21f1637e437398ec56b6078cf28b58bd4a0299ba Mon Sep 17 00:00:00 2001 From: Ariadne Conill Date: Mon, 11 Nov 2019 14:14:44 -0600 Subject: [PATCH 004/462] nav panel: refactor to use vuex mapState --- src/components/nav_panel/nav_panel.js | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/src/components/nav_panel/nav_panel.js b/src/components/nav_panel/nav_panel.js index aa3f7605..bfcab62e 100644 --- a/src/components/nav_panel/nav_panel.js +++ b/src/components/nav_panel/nav_panel.js @@ -1,4 +1,5 @@ import followRequestFetcher from '../../services/follow_request_fetcher/follow_request_fetcher.service' +import { mapState } from 'vuex' const NavPanel = { created () { @@ -9,17 +10,11 @@ const NavPanel = { followRequestFetcher.startFetching({ store, credentials }) } }, - computed: { - currentUser () { - return this.$store.state.users.currentUser - }, - chat () { - return this.$store.state.chat.channel - }, - followRequestCount () { - return this.$store.state.api.followRequests.length - } - } + computed: mapState({ + currentUser: state => state.users.currentUser, + chat: state => state.chat.channel, + followRequestCount: state => state.api.followRequests.length + }) } export default NavPanel From 1f9674350cdf7455fe5540d377eb327edf1336ce Mon Sep 17 00:00:00 2001 From: Ariadne Conill Date: Mon, 11 Nov 2019 14:18:36 -0600 Subject: [PATCH 005/462] nav panel: disable TWKN if federation disabled, disable Public and TWKN if privateMode is enabled --- src/components/nav_panel/nav_panel.js | 4 +++- src/components/nav_panel/nav_panel.vue | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/components/nav_panel/nav_panel.js b/src/components/nav_panel/nav_panel.js index bfcab62e..a6426d13 100644 --- a/src/components/nav_panel/nav_panel.js +++ b/src/components/nav_panel/nav_panel.js @@ -13,7 +13,9 @@ const NavPanel = { computed: mapState({ currentUser: state => state.users.currentUser, chat: state => state.chat.channel, - followRequestCount: state => state.api.followRequests.length + followRequestCount: state => state.api.followRequests.length, + privateMode: state => state.instance.private, + federating: state => state.instance.federationPolicy.federating || true }) } diff --git a/src/components/nav_panel/nav_panel.vue b/src/components/nav_panel/nav_panel.vue index 28589bb1..d85c28bd 100644 --- a/src/components/nav_panel/nav_panel.vue +++ b/src/components/nav_panel/nav_panel.vue @@ -28,12 +28,12 @@ -
  • +
  • {{ $t("nav.public_tl") }}
  • -
  • +
  • {{ $t("nav.twkn") }} From cb5f73148a2dc9341d16326ed606d74e818fb61d Mon Sep 17 00:00:00 2001 From: Ariadne Conill Date: Mon, 11 Nov 2019 14:25:38 -0600 Subject: [PATCH 006/462] app: search API is not available in private mode so disable it --- src/App.js | 3 ++- src/App.vue | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/App.js b/src/App.js index 04a40e30..e2b0e6db 100644 --- a/src/App.js +++ b/src/App.js @@ -97,7 +97,8 @@ export default { this.$store.state.instance.instanceSpecificPanelContent }, showFeaturesPanel () { return this.$store.state.instance.showFeaturesPanel }, - isMobileLayout () { return this.$store.state.interface.mobileLayout } + isMobileLayout () { return this.$store.state.interface.mobileLayout }, + privateMode () { return this.$store.state.instance.private } }, methods: { scrollToTop () { diff --git a/src/App.vue b/src/App.vue index dbe842ec..1f244b56 100644 --- a/src/App.vue +++ b/src/App.vue @@ -43,6 +43,7 @@ class="nav-icon mobile-hidden" @toggled="onSearchBarToggled" @click.stop.native + v-if="currentUser || !privateMode" /> Date: Mon, 11 Nov 2019 14:37:14 -0600 Subject: [PATCH 007/462] side drawer: same treatment --- src/components/side_drawer/side_drawer.js | 6 ++++++ src/components/side_drawer/side_drawer.vue | 6 +++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/components/side_drawer/side_drawer.js b/src/components/side_drawer/side_drawer.js index 567d2e5e..2725d43a 100644 --- a/src/components/side_drawer/side_drawer.js +++ b/src/components/side_drawer/side_drawer.js @@ -34,6 +34,12 @@ const SideDrawer = { }, followRequestCount () { return this.$store.state.api.followRequests.length + }, + privateMode () { + return this.$store.state.instance.private + }, + federating () { + return this.$store.state.instance.federationPolicy.federating || true } }, methods: { diff --git a/src/components/side_drawer/side_drawer.vue b/src/components/side_drawer/side_drawer.vue index 214b8e0c..be18a5d7 100644 --- a/src/components/side_drawer/side_drawer.vue +++ b/src/components/side_drawer/side_drawer.vue @@ -79,12 +79,12 @@
  • -
  • +
  • {{ $t("nav.public_tl") }}
  • -
  • +
  • {{ $t("nav.twkn") }} @@ -99,7 +99,7 @@
    • -
    • +
    • {{ $t("nav.search") }} From d0075026290c90d8406c7ac81413259a8ae58ec7 Mon Sep 17 00:00:00 2001 From: Shpuld Shpuldson Date: Fri, 15 Nov 2019 08:39:21 +0200 Subject: [PATCH 008/462] add fetching for emoji reactions, draft design --- src/components/conversation/conversation.js | 1 + src/components/status/status.js | 6 ++++ src/components/status/status.vue | 28 +++++++++++++++++++ src/modules/statuses.js | 14 +++++++++- src/services/api/api.service.js | 6 ++++ .../backend_interactor_service.js | 2 ++ 6 files changed, 56 insertions(+), 1 deletion(-) diff --git a/src/components/conversation/conversation.js b/src/components/conversation/conversation.js index 72ee9c39..715804ff 100644 --- a/src/components/conversation/conversation.js +++ b/src/components/conversation/conversation.js @@ -149,6 +149,7 @@ const conversation = { if (!id) return this.highlight = id this.$store.dispatch('fetchFavsAndRepeats', id) + this.$store.dispatch('fetchEmojiReactions', id) }, getHighlight () { return this.isExpanded ? this.highlight : null diff --git a/src/components/status/status.js b/src/components/status/status.js index 4fbd5ac3..8268e615 100644 --- a/src/components/status/status.js +++ b/src/components/status/status.js @@ -278,6 +278,12 @@ const Status = { hidePostStats () { return this.mergedConfig.hidePostStats }, + emojiReactions () { + return { + '🤔': [{ 'id': 'xyz..' }, { 'id': 'zyx...' }], + '🐻': [{ 'id': 'abc...' }] + } + }, ...mapGetters(['mergedConfig']) }, components: { diff --git a/src/components/status/status.vue b/src/components/status/status.vue index 65778b2e..aae58a5e 100644 --- a/src/components/status/status.vue +++ b/src/components/status/status.vue @@ -354,6 +354,17 @@ +
      + +
      +
      currentUser.id === id) }, + addEmojiReactions (state, { id, emojiReactions, currentUser }) { + const status = state.allStatusesObject[id] + status.emojiReactions = emojiReactions + status.reactedWithEmoji = findKey(emojiReactions, { id: currentUser.id }) + }, updateStatusWithPoll (state, { id, poll }) { const status = state.allStatusesObject[id] status.poll = poll @@ -611,6 +616,13 @@ const statuses = { commit('addRepeats', { id, rebloggedByUsers, currentUser: rootState.users.currentUser }) }) }, + fetchEmojiReactions ({ rootState, commit }, id) { + rootState.api.backendInteractor.fetchEmojiReactions(id).then( + emojiReactions => { + commit('addEmojiReactions', { id, emojiReactions, currentUser: rootState.users.currentUser }) + } + ) + }, fetchFavs ({ rootState, commit }, id) { rootState.api.backendInteractor.fetchFavoritedByUsers(id) .then(favoritedByUsers => commit('addFavs', { id, favoritedByUsers, currentUser: rootState.users.currentUser })) diff --git a/src/services/api/api.service.js b/src/services/api/api.service.js index 8f5eb416..7ef4b74a 100644 --- a/src/services/api/api.service.js +++ b/src/services/api/api.service.js @@ -71,6 +71,7 @@ const MASTODON_MUTE_CONVERSATION = id => `/api/v1/statuses/${id}/mute` const MASTODON_UNMUTE_CONVERSATION = id => `/api/v1/statuses/${id}/unmute` const MASTODON_SEARCH_2 = `/api/v2/search` const MASTODON_USER_SEARCH_URL = '/api/v1/accounts/search' +const PLEROMA_EMOJI_REACTIONS_URL = id => `/api/v1/pleroma/statuses/${id}/emoji_reactions_by` const oldfetch = window.fetch @@ -864,6 +865,10 @@ const fetchRebloggedByUsers = ({ id }) => { return promisedRequest({ url: MASTODON_STATUS_REBLOGGEDBY_URL(id) }).then((users) => users.map(parseUser)) } +const fetchEmojiReactions = ({ id }) => { + return promisedRequest({ url: PLEROMA_EMOJI_REACTIONS_URL(id) }) +} + const reportUser = ({ credentials, userId, statusIds, comment, forward }) => { return promisedRequest({ url: MASTODON_REPORT_USER_URL, @@ -997,6 +1002,7 @@ const apiService = { fetchPoll, fetchFavoritedByUsers, fetchRebloggedByUsers, + fetchEmojiReactions, reportUser, updateNotificationSettings, search2, diff --git a/src/services/backend_interactor_service/backend_interactor_service.js b/src/services/backend_interactor_service/backend_interactor_service.js index d6617276..52234fcc 100644 --- a/src/services/backend_interactor_service/backend_interactor_service.js +++ b/src/services/backend_interactor_service/backend_interactor_service.js @@ -143,6 +143,7 @@ const backendInteractorService = credentials => { const fetchFavoritedByUsers = (id) => apiService.fetchFavoritedByUsers({ id }) const fetchRebloggedByUsers = (id) => apiService.fetchRebloggedByUsers({ id }) + const fetchEmojiReactions = (id) => apiService.fetchEmojiReactions({ id }) const reportUser = (params) => apiService.reportUser({ credentials, ...params }) const favorite = (id) => apiService.favorite({ id, credentials }) @@ -210,6 +211,7 @@ const backendInteractorService = credentials => { fetchPoll, fetchFavoritedByUsers, fetchRebloggedByUsers, + fetchEmojiReactions, reportUser, favorite, unfavorite, From de945ba3e9470b28dd010fb32f658b42053f19d3 Mon Sep 17 00:00:00 2001 From: Shpuld Shpuldson Date: Fri, 15 Nov 2019 16:29:25 +0200 Subject: [PATCH 009/462] wip commit, add basic popover for emoji reaction select --- src/components/react_button/react_button.js | 50 +++++++++++++ src/components/react_button/react_button.vue | 78 ++++++++++++++++++++ src/components/status/status.js | 2 + src/components/status/status.vue | 10 ++- src/i18n/en.json | 1 + 5 files changed, 138 insertions(+), 3 deletions(-) create mode 100644 src/components/react_button/react_button.js create mode 100644 src/components/react_button/react_button.vue diff --git a/src/components/react_button/react_button.js b/src/components/react_button/react_button.js new file mode 100644 index 00000000..d1d15d93 --- /dev/null +++ b/src/components/react_button/react_button.js @@ -0,0 +1,50 @@ +import { mapGetters } from 'vuex' + +const ReactButton = { + props: ['status', 'loggedIn'], + data () { + return { + animated: false, + showTooltip: false, + popperOptions: { + modifiers: { + preventOverflow: { padding: { top: 50 }, boundariesElement: 'viewport' } + } + } + } + }, + methods: { + openReactionSelect () { + console.log('test') + this.showTooltip = true + }, + closeReactionSelect () { + this.showTooltip = false + }, + favorite () { + if (!this.status.favorited) { + this.$store.dispatch('favorite', { id: this.status.id }) + } else { + this.$store.dispatch('unfavorite', { id: this.status.id }) + } + this.animated = true + setTimeout(() => { + this.animated = false + }, 500) + } + }, + computed: { + emojis () { + return this.$store.state.instance.emoji || [] + }, + classes () { + return { + 'icon-smile': true, + 'animate-spin': this.animated + } + }, + ...mapGetters(['mergedConfig']) + } +} + +export default ReactButton diff --git a/src/components/react_button/react_button.vue b/src/components/react_button/react_button.vue new file mode 100644 index 00000000..93638770 --- /dev/null +++ b/src/components/react_button/react_button.vue @@ -0,0 +1,78 @@ + + + + + diff --git a/src/components/status/status.js b/src/components/status/status.js index 8268e615..8c6fc0cf 100644 --- a/src/components/status/status.js +++ b/src/components/status/status.js @@ -1,5 +1,6 @@ import Attachment from '../attachment/attachment.vue' import FavoriteButton from '../favorite_button/favorite_button.vue' +import ReactButton from '../react_button/react_button.vue' import RetweetButton from '../retweet_button/retweet_button.vue' import Poll from '../poll/poll.vue' import ExtraButtons from '../extra_buttons/extra_buttons.vue' @@ -289,6 +290,7 @@ const Status = { components: { Attachment, FavoriteButton, + ReactButton, RetweetButton, ExtraButtons, PostStatusForm, diff --git a/src/components/status/status.vue b/src/components/status/status.vue index aae58a5e..d455ccf6 100644 --- a/src/components/status/status.vue +++ b/src/components/status/status.vue @@ -356,12 +356,12 @@
      @@ -393,6 +393,10 @@ :logged-in="loggedIn" :status="status" /> + Date: Tue, 19 Nov 2019 17:02:45 +0000 Subject: [PATCH 010/462] [i18n] Improve easy/pedantic Japanese switching --- src/i18n/{ja.json => ja_pedantic.json} | 0 src/i18n/messages.js | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename src/i18n/{ja.json => ja_pedantic.json} (100%) diff --git a/src/i18n/ja.json b/src/i18n/ja_pedantic.json similarity index 100% rename from src/i18n/ja.json rename to src/i18n/ja_pedantic.json diff --git a/src/i18n/messages.js b/src/i18n/messages.js index 774a48e0..c56ae205 100644 --- a/src/i18n/messages.js +++ b/src/i18n/messages.js @@ -23,7 +23,7 @@ const messages = { he: require('./he.json'), hu: require('./hu.json'), it: require('./it.json'), - ja: require('./ja.json'), + ja: require('./ja_pedantic.json'), ja_easy: require('./ja_easy.json'), ko: require('./ko.json'), nb: require('./nb.json'), From ddb6fb9217789e90490a4ec1ce7a2dd9ced67631 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Sun, 24 Nov 2019 13:57:46 +0200 Subject: [PATCH 011/462] Backend Interactor service overhaul, removed the need for copypasting --- .../follow_request_card.js | 4 +- .../moderation_tools/moderation_tools.js | 16 +- .../user_reporting_modal.js | 2 +- src/components/user_settings/user_settings.js | 8 +- src/modules/oauth_tokens.js | 2 +- src/modules/polls.js | 4 +- src/modules/statuses.js | 26 +- src/modules/users.js | 16 +- .../backend_interactor_service.js | 231 ++---------------- .../follow_manipulate/follow_manipulate.js | 2 +- 10 files changed, 55 insertions(+), 256 deletions(-) diff --git a/src/components/follow_request_card/follow_request_card.js b/src/components/follow_request_card/follow_request_card.js index 1a00a1c1..a8931787 100644 --- a/src/components/follow_request_card/follow_request_card.js +++ b/src/components/follow_request_card/follow_request_card.js @@ -7,11 +7,11 @@ const FollowRequestCard = { }, methods: { approveUser () { - this.$store.state.api.backendInteractor.approveUser(this.user.id) + this.$store.state.api.backendInteractor.approveUser({ id: this.user.id }) this.$store.dispatch('removeFollowRequest', this.user) }, denyUser () { - this.$store.state.api.backendInteractor.denyUser(this.user.id) + this.$store.state.api.backendInteractor.denyUser({ id: this.user.id }) this.$store.dispatch('removeFollowRequest', this.user) } } diff --git a/src/components/moderation_tools/moderation_tools.js b/src/components/moderation_tools/moderation_tools.js index 8aadc8c5..5bb76497 100644 --- a/src/components/moderation_tools/moderation_tools.js +++ b/src/components/moderation_tools/moderation_tools.js @@ -45,12 +45,12 @@ const ModerationTools = { toggleTag (tag) { const store = this.$store if (this.tagsSet.has(tag)) { - store.state.api.backendInteractor.untagUser(this.user, tag).then(response => { + store.state.api.backendInteractor.untagUser({ user: this.user, tag }).then(response => { if (!response.ok) { return } store.commit('untagUser', { user: this.user, tag }) }) } else { - store.state.api.backendInteractor.tagUser(this.user, tag).then(response => { + store.state.api.backendInteractor.tagUser({ user: this.user, tag }).then(response => { if (!response.ok) { return } store.commit('tagUser', { user: this.user, tag }) }) @@ -59,21 +59,21 @@ const ModerationTools = { toggleRight (right) { const store = this.$store if (this.user.rights[right]) { - store.state.api.backendInteractor.deleteRight(this.user, right).then(response => { + store.state.api.backendInteractor.deleteRight({ user: this.user, right }).then(response => { if (!response.ok) { return } - store.commit('updateRight', { user: this.user, right: right, value: false }) + store.commit('updateRight', { user: this.user, right, value: false }) }) } else { - store.state.api.backendInteractor.addRight(this.user, right).then(response => { + store.state.api.backendInteractor.addRight({ user: this.user, right }).then(response => { if (!response.ok) { return } - store.commit('updateRight', { user: this.user, right: right, value: true }) + store.commit('updateRight', { user: this.user, right, value: true }) }) } }, toggleActivationStatus () { const store = this.$store const status = !!this.user.deactivated - store.state.api.backendInteractor.setActivationStatus(this.user, status).then(response => { + store.state.api.backendInteractor.setActivationStatus({ user: this.user, status }).then(response => { if (!response.ok) { return } store.commit('updateActivationStatus', { user: this.user, status: status }) }) @@ -85,7 +85,7 @@ const ModerationTools = { const store = this.$store const user = this.user const { id, name } = user - store.state.api.backendInteractor.deleteUser(user) + store.state.api.backendInteractor.deleteUser({ user }) .then(e => { this.$store.dispatch('markStatusesAsDeleted', status => user.id === status.user.id) const isProfile = this.$route.name === 'external-user-profile' || this.$route.name === 'user-profile' diff --git a/src/components/user_reporting_modal/user_reporting_modal.js b/src/components/user_reporting_modal/user_reporting_modal.js index 833fa98a..38cf117b 100644 --- a/src/components/user_reporting_modal/user_reporting_modal.js +++ b/src/components/user_reporting_modal/user_reporting_modal.js @@ -64,7 +64,7 @@ const UserReportingModal = { forward: this.forward, statusIds: this.statusIdsToReport } - this.$store.state.api.backendInteractor.reportUser(params) + this.$store.state.api.backendInteractor.reportUser({ ...params }) .then(() => { this.processing = false this.resetState() diff --git a/src/components/user_settings/user_settings.js b/src/components/user_settings/user_settings.js index 3fdc5340..d5d671e4 100644 --- a/src/components/user_settings/user_settings.js +++ b/src/components/user_settings/user_settings.js @@ -242,7 +242,7 @@ const UserSettings = { }) }, importFollows (file) { - return this.$store.state.api.backendInteractor.importFollows(file) + return this.$store.state.api.backendInteractor.importFollows({ file }) .then((status) => { if (!status) { throw new Error('failed') @@ -250,7 +250,7 @@ const UserSettings = { }) }, importBlocks (file) { - return this.$store.state.api.backendInteractor.importBlocks(file) + return this.$store.state.api.backendInteractor.importBlocks({ file }) .then((status) => { if (!status) { throw new Error('failed') @@ -297,7 +297,7 @@ const UserSettings = { newPassword: this.changePasswordInputs[1], newPasswordConfirmation: this.changePasswordInputs[2] } - this.$store.state.api.backendInteractor.changePassword(params) + this.$store.state.api.backendInteractor.changePassword({ params }) .then((res) => { if (res.status === 'success') { this.changedPassword = true @@ -314,7 +314,7 @@ const UserSettings = { email: this.newEmail, password: this.changeEmailPassword } - this.$store.state.api.backendInteractor.changeEmail(params) + this.$store.state.api.backendInteractor.changeEmail({ params }) .then((res) => { if (res.status === 'success') { this.changedEmail = true diff --git a/src/modules/oauth_tokens.js b/src/modules/oauth_tokens.js index 0159a3f1..907cae4a 100644 --- a/src/modules/oauth_tokens.js +++ b/src/modules/oauth_tokens.js @@ -9,7 +9,7 @@ const oauthTokens = { }) }, revokeToken ({ rootState, commit, state }, id) { - rootState.api.backendInteractor.revokeOAuthToken(id).then((response) => { + rootState.api.backendInteractor.revokeOAuthToken({ id }).then((response) => { if (response.status === 201) { commit('swapTokens', state.tokens.filter(token => token.id !== id)) } diff --git a/src/modules/polls.js b/src/modules/polls.js index e6158b63..92b89a06 100644 --- a/src/modules/polls.js +++ b/src/modules/polls.js @@ -40,7 +40,7 @@ const polls = { commit('mergeOrAddPoll', poll) }, updateTrackedPoll ({ rootState, dispatch, commit }, pollId) { - rootState.api.backendInteractor.fetchPoll(pollId).then(poll => { + rootState.api.backendInteractor.fetchPoll({ pollId }).then(poll => { setTimeout(() => { if (rootState.polls.trackedPolls[pollId]) { dispatch('updateTrackedPoll', pollId) @@ -59,7 +59,7 @@ const polls = { commit('untrackPoll', pollId) }, votePoll ({ rootState, commit }, { id, pollId, choices }) { - return rootState.api.backendInteractor.vote(pollId, choices).then(poll => { + return rootState.api.backendInteractor.vote({ pollId, choices }).then(poll => { commit('mergeOrAddPoll', poll) return poll }) diff --git a/src/modules/statuses.js b/src/modules/statuses.js index f11ffdcd..6a743a4a 100644 --- a/src/modules/statuses.js +++ b/src/modules/statuses.js @@ -551,45 +551,45 @@ const statuses = { favorite ({ rootState, commit }, status) { // Optimistic favoriting... commit('setFavorited', { status, value: true }) - rootState.api.backendInteractor.favorite(status.id) + rootState.api.backendInteractor.favorite({ id: status.id }) .then(status => commit('setFavoritedConfirm', { status, user: rootState.users.currentUser })) }, unfavorite ({ rootState, commit }, status) { // Optimistic unfavoriting... commit('setFavorited', { status, value: false }) - rootState.api.backendInteractor.unfavorite(status.id) + rootState.api.backendInteractor.unfavorite({ id: status.id }) .then(status => commit('setFavoritedConfirm', { status, user: rootState.users.currentUser })) }, fetchPinnedStatuses ({ rootState, dispatch }, userId) { - rootState.api.backendInteractor.fetchPinnedStatuses(userId) + rootState.api.backendInteractor.fetchPinnedStatuses({ id: userId }) .then(statuses => dispatch('addNewStatuses', { statuses, timeline: 'user', userId, showImmediately: true, noIdUpdate: true })) }, pinStatus ({ rootState, dispatch }, statusId) { - return rootState.api.backendInteractor.pinOwnStatus(statusId) + return rootState.api.backendInteractor.pinOwnStatus({ id: statusId }) .then((status) => dispatch('addNewStatuses', { statuses: [status] })) }, unpinStatus ({ rootState, dispatch }, statusId) { - rootState.api.backendInteractor.unpinOwnStatus(statusId) + rootState.api.backendInteractor.unpinOwnStatus({ id: statusId }) .then((status) => dispatch('addNewStatuses', { statuses: [status] })) }, muteConversation ({ rootState, commit }, statusId) { - return rootState.api.backendInteractor.muteConversation(statusId) + return rootState.api.backendInteractor.muteConversation({ id: statusId }) .then((status) => commit('setMutedStatus', status)) }, unmuteConversation ({ rootState, commit }, statusId) { - return rootState.api.backendInteractor.unmuteConversation(statusId) + return rootState.api.backendInteractor.unmuteConversation({ id: statusId }) .then((status) => commit('setMutedStatus', status)) }, retweet ({ rootState, commit }, status) { // Optimistic retweeting... commit('setRetweeted', { status, value: true }) - rootState.api.backendInteractor.retweet(status.id) + rootState.api.backendInteractor.retweet({ id: status.id }) .then(status => commit('setRetweetedConfirm', { status: status.retweeted_status, user: rootState.users.currentUser })) }, unretweet ({ rootState, commit }, status) { // Optimistic unretweeting... commit('setRetweeted', { status, value: false }) - rootState.api.backendInteractor.unretweet(status.id) + rootState.api.backendInteractor.unretweet({ id: status.id }) .then(status => commit('setRetweetedConfirm', { status, user: rootState.users.currentUser })) }, queueFlush ({ rootState, commit }, { timeline, id }) { @@ -604,19 +604,19 @@ const statuses = { }, fetchFavsAndRepeats ({ rootState, commit }, id) { Promise.all([ - rootState.api.backendInteractor.fetchFavoritedByUsers(id), - rootState.api.backendInteractor.fetchRebloggedByUsers(id) + rootState.api.backendInteractor.fetchFavoritedByUsers({ id }), + rootState.api.backendInteractor.fetchRebloggedByUsers({ id }) ]).then(([favoritedByUsers, rebloggedByUsers]) => { commit('addFavs', { id, favoritedByUsers, currentUser: rootState.users.currentUser }) commit('addRepeats', { id, rebloggedByUsers, currentUser: rootState.users.currentUser }) }) }, fetchFavs ({ rootState, commit }, id) { - rootState.api.backendInteractor.fetchFavoritedByUsers(id) + rootState.api.backendInteractor.fetchFavoritedByUsers({ id }) .then(favoritedByUsers => commit('addFavs', { id, favoritedByUsers, currentUser: rootState.users.currentUser })) }, fetchRepeats ({ rootState, commit }, id) { - rootState.api.backendInteractor.fetchRebloggedByUsers(id) + rootState.api.backendInteractor.fetchRebloggedByUsers({ id }) .then(rebloggedByUsers => commit('addRepeats', { id, rebloggedByUsers, currentUser: rootState.users.currentUser })) }, search (store, { q, resolve, limit, offset, following }) { diff --git a/src/modules/users.js b/src/modules/users.js index 14b2d8b5..e1373220 100644 --- a/src/modules/users.js +++ b/src/modules/users.js @@ -32,7 +32,7 @@ const getNotificationPermission = () => { } const blockUser = (store, id) => { - return store.rootState.api.backendInteractor.blockUser(id) + return store.rootState.api.backendInteractor.blockUser({ id }) .then((relationship) => { store.commit('updateUserRelationship', [relationship]) store.commit('addBlockId', id) @@ -43,12 +43,12 @@ const blockUser = (store, id) => { } const unblockUser = (store, id) => { - return store.rootState.api.backendInteractor.unblockUser(id) + return store.rootState.api.backendInteractor.unblockUser({ id }) .then((relationship) => store.commit('updateUserRelationship', [relationship])) } const muteUser = (store, id) => { - return store.rootState.api.backendInteractor.muteUser(id) + return store.rootState.api.backendInteractor.muteUser({ id }) .then((relationship) => { store.commit('updateUserRelationship', [relationship]) store.commit('addMuteId', id) @@ -56,7 +56,7 @@ const muteUser = (store, id) => { } const unmuteUser = (store, id) => { - return store.rootState.api.backendInteractor.unmuteUser(id) + return store.rootState.api.backendInteractor.unmuteUser({ id }) .then((relationship) => store.commit('updateUserRelationship', [relationship])) } @@ -324,11 +324,11 @@ const users = { commit('clearFollowers', userId) }, subscribeUser ({ rootState, commit }, id) { - return rootState.api.backendInteractor.subscribeUser(id) + return rootState.api.backendInteractor.subscribeUser({ id }) .then((relationship) => commit('updateUserRelationship', [relationship])) }, unsubscribeUser ({ rootState, commit }, id) { - return rootState.api.backendInteractor.unsubscribeUser(id) + return rootState.api.backendInteractor.unsubscribeUser({ id }) .then((relationship) => commit('updateUserRelationship', [relationship])) }, registerPushNotifications (store) { @@ -382,7 +382,7 @@ const users = { }) }, searchUsers (store, query) { - return store.rootState.api.backendInteractor.searchUsers(query) + return store.rootState.api.backendInteractor.searchUsers({ query }) .then((users) => { store.commit('addNewUsers', users) return users @@ -394,7 +394,7 @@ const users = { let rootState = store.rootState try { - let data = await rootState.api.backendInteractor.register(userInfo) + let data = await rootState.api.backendInteractor.register({ ...userInfo }) store.commit('signUpSuccess') store.commit('setToken', data.access_token) store.dispatch('loginUser', data.access_token) diff --git a/src/services/backend_interactor_service/backend_interactor_service.js b/src/services/backend_interactor_service/backend_interactor_service.js index c16bd1f1..57fdccde 100644 --- a/src/services/backend_interactor_service/backend_interactor_service.js +++ b/src/services/backend_interactor_service/backend_interactor_service.js @@ -3,228 +3,27 @@ import timelineFetcherService from '../timeline_fetcher/timeline_fetcher.service import notificationsFetcher from '../notifications_fetcher/notifications_fetcher.service.js' import followRequestFetcher from '../../services/follow_request_fetcher/follow_request_fetcher.service' -const backendInteractorService = credentials => { - const fetchStatus = ({ id }) => { - return apiService.fetchStatus({ id, credentials }) - } - - const fetchConversation = ({ id }) => { - return apiService.fetchConversation({ id, credentials }) - } - - const fetchFriends = ({ id, maxId, sinceId, limit }) => { - return apiService.fetchFriends({ id, maxId, sinceId, limit, credentials }) - } - - const exportFriends = ({ id }) => { - return apiService.exportFriends({ id, credentials }) - } - - const fetchFollowers = ({ id, maxId, sinceId, limit }) => { - return apiService.fetchFollowers({ id, maxId, sinceId, limit, credentials }) - } - - const fetchUser = ({ id }) => { - return apiService.fetchUser({ id, credentials }) - } - - const fetchUserRelationship = ({ id }) => { - return apiService.fetchUserRelationship({ id, credentials }) - } - - const followUser = ({ id, reblogs }) => { - return apiService.followUser({ credentials, id, reblogs }) - } - - const unfollowUser = (id) => { - return apiService.unfollowUser({ credentials, id }) - } - - const blockUser = (id) => { - return apiService.blockUser({ credentials, id }) - } - - const unblockUser = (id) => { - return apiService.unblockUser({ credentials, id }) - } - - const approveUser = (id) => { - return apiService.approveUser({ credentials, id }) - } - - const denyUser = (id) => { - return apiService.denyUser({ credentials, id }) - } - - const startFetchingTimeline = ({ timeline, store, userId = false, tag }) => { +const backendInteractorService = credentials => ({ + startFetchingTimeline ({ timeline, store, userId = false, tag }) { return timelineFetcherService.startFetching({ timeline, store, credentials, userId, tag }) - } + }, - const startFetchingNotifications = ({ store }) => { + startFetchingNotifications ({ store }) { return notificationsFetcher.startFetching({ store, credentials }) - } + }, - const startFetchingFollowRequest = ({ store }) => { + startFetchingFollowRequest ({ store }) { return followRequestFetcher.startFetching({ store, credentials }) - } + }, - // eslint-disable-next-line camelcase - const tagUser = ({ screen_name }, tag) => { - return apiService.tagUser({ screen_name, tag, credentials }) - } + ...Object.entries(apiService).reduce((acc, [key, func]) => { + return { + ...acc, + [key]: (args) => func({ credentials, ...args }) + } + }, {}), - // eslint-disable-next-line camelcase - const untagUser = ({ screen_name }, tag) => { - return apiService.untagUser({ screen_name, tag, credentials }) - } - - // eslint-disable-next-line camelcase - const addRight = ({ screen_name }, right) => { - return apiService.addRight({ screen_name, right, credentials }) - } - - // eslint-disable-next-line camelcase - const deleteRight = ({ screen_name }, right) => { - return apiService.deleteRight({ screen_name, right, credentials }) - } - - // eslint-disable-next-line camelcase - const setActivationStatus = ({ screen_name }, status) => { - return apiService.setActivationStatus({ screen_name, status, credentials }) - } - - // eslint-disable-next-line camelcase - const deleteUser = ({ screen_name }) => { - return apiService.deleteUser({ screen_name, credentials }) - } - - const vote = (pollId, choices) => { - return apiService.vote({ credentials, pollId, choices }) - } - - const fetchPoll = (pollId) => { - return apiService.fetchPoll({ credentials, pollId }) - } - - const updateNotificationSettings = ({ settings }) => { - return apiService.updateNotificationSettings({ credentials, settings }) - } - - const fetchMutes = () => apiService.fetchMutes({ credentials }) - const muteUser = (id) => apiService.muteUser({ credentials, id }) - const unmuteUser = (id) => apiService.unmuteUser({ credentials, id }) - const subscribeUser = (id) => apiService.subscribeUser({ credentials, id }) - const unsubscribeUser = (id) => apiService.unsubscribeUser({ credentials, id }) - const fetchBlocks = () => apiService.fetchBlocks({ credentials }) - const fetchOAuthTokens = () => apiService.fetchOAuthTokens({ credentials }) - const revokeOAuthToken = (id) => apiService.revokeOAuthToken({ id, credentials }) - const fetchPinnedStatuses = (id) => apiService.fetchPinnedStatuses({ credentials, id }) - const pinOwnStatus = (id) => apiService.pinOwnStatus({ credentials, id }) - const unpinOwnStatus = (id) => apiService.unpinOwnStatus({ credentials, id }) - const muteConversation = (id) => apiService.muteConversation({ credentials, id }) - const unmuteConversation = (id) => apiService.unmuteConversation({ credentials, id }) - - const getCaptcha = () => apiService.getCaptcha() - const register = (params) => apiService.register({ credentials, params }) - const updateAvatar = ({ avatar }) => apiService.updateAvatar({ credentials, avatar }) - const updateBg = ({ background }) => apiService.updateBg({ credentials, background }) - const updateBanner = ({ banner }) => apiService.updateBanner({ credentials, banner }) - const updateProfile = ({ params }) => apiService.updateProfile({ credentials, params }) - - const importBlocks = (file) => apiService.importBlocks({ file, credentials }) - const importFollows = (file) => apiService.importFollows({ file, credentials }) - - const deleteAccount = ({ password }) => apiService.deleteAccount({ credentials, password }) - const changeEmail = ({ email, password }) => apiService.changeEmail({ credentials, email, password }) - const changePassword = ({ password, newPassword, newPasswordConfirmation }) => - apiService.changePassword({ credentials, password, newPassword, newPasswordConfirmation }) - - const fetchSettingsMFA = () => apiService.settingsMFA({ credentials }) - const generateMfaBackupCodes = () => apiService.generateMfaBackupCodes({ credentials }) - const mfaSetupOTP = () => apiService.mfaSetupOTP({ credentials }) - const mfaConfirmOTP = ({ password, token }) => apiService.mfaConfirmOTP({ credentials, password, token }) - const mfaDisableOTP = ({ password }) => apiService.mfaDisableOTP({ credentials, password }) - - const fetchFavoritedByUsers = (id) => apiService.fetchFavoritedByUsers({ id }) - const fetchRebloggedByUsers = (id) => apiService.fetchRebloggedByUsers({ id }) - const reportUser = (params) => apiService.reportUser({ credentials, ...params }) - - const favorite = (id) => apiService.favorite({ id, credentials }) - const unfavorite = (id) => apiService.unfavorite({ id, credentials }) - const retweet = (id) => apiService.retweet({ id, credentials }) - const unretweet = (id) => apiService.unretweet({ id, credentials }) - const search2 = ({ q, resolve, limit, offset, following }) => - apiService.search2({ credentials, q, resolve, limit, offset, following }) - const searchUsers = (query) => apiService.searchUsers({ query, credentials }) - - const backendInteractorServiceInstance = { - fetchStatus, - fetchConversation, - fetchFriends, - exportFriends, - fetchFollowers, - followUser, - unfollowUser, - blockUser, - unblockUser, - fetchUser, - fetchUserRelationship, - verifyCredentials: apiService.verifyCredentials, - startFetchingTimeline, - startFetchingNotifications, - startFetchingFollowRequest, - fetchMutes, - muteUser, - unmuteUser, - subscribeUser, - unsubscribeUser, - fetchBlocks, - fetchOAuthTokens, - revokeOAuthToken, - fetchPinnedStatuses, - pinOwnStatus, - unpinOwnStatus, - muteConversation, - unmuteConversation, - tagUser, - untagUser, - addRight, - deleteRight, - deleteUser, - setActivationStatus, - register, - getCaptcha, - updateAvatar, - updateBg, - updateBanner, - updateProfile, - importBlocks, - importFollows, - deleteAccount, - changeEmail, - changePassword, - fetchSettingsMFA, - generateMfaBackupCodes, - mfaSetupOTP, - mfaConfirmOTP, - mfaDisableOTP, - approveUser, - denyUser, - vote, - fetchPoll, - fetchFavoritedByUsers, - fetchRebloggedByUsers, - reportUser, - favorite, - unfavorite, - retweet, - unretweet, - updateNotificationSettings, - search2, - searchUsers - } - - return backendInteractorServiceInstance -} + verifyCredentials: apiService.verifyCredentials +}) export default backendInteractorService diff --git a/src/services/follow_manipulate/follow_manipulate.js b/src/services/follow_manipulate/follow_manipulate.js index 598cb5f7..29b38a0f 100644 --- a/src/services/follow_manipulate/follow_manipulate.js +++ b/src/services/follow_manipulate/follow_manipulate.js @@ -39,7 +39,7 @@ export const requestFollow = (user, store) => new Promise((resolve, reject) => { }) export const requestUnfollow = (user, store) => new Promise((resolve, reject) => { - store.state.api.backendInteractor.unfollowUser(user.id) + store.state.api.backendInteractor.unfollowUser({ id: user.id }) .then((updated) => { store.commit('updateUserRelationship', [updated]) resolve({ From 319bb4ac2895b8eb62da42e3f95addc9bb67b1a0 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Sun, 24 Nov 2019 18:50:28 +0200 Subject: [PATCH 012/462] initial streaming work --- src/modules/api.js | 15 +++++++ src/modules/users.js | 11 +++-- src/services/api/api.service.js | 40 +++++++++++++++++++ .../backend_interactor_service.js | 15 ++++++- 4 files changed, 76 insertions(+), 5 deletions(-) diff --git a/src/modules/api.js b/src/modules/api.js index 1293e3c8..1bf65db5 100644 --- a/src/modules/api.js +++ b/src/modules/api.js @@ -6,6 +6,7 @@ const api = { backendInteractor: backendInteractorService(), fetchers: {}, socket: null, + mastoSocket: null, followRequests: [] }, mutations: { @@ -29,6 +30,20 @@ const api = { } }, actions: { + startMastoSocket (store) { + store.state.mastoSocket = store.state.backendInteractor + .startUserSocket({ + store, + onMessage: (message) => { + if (!message) return + if (message.event === 'notification') { + store.dispatch('addNewNotifications', { notifications: [message.notification], older: false }) + } else if (message.event === 'update') { + store.dispatch('addNewStatuses', { statuses: [message.status], userId: false, showImmediately: false, timeline: 'friends' }) + } + } + }) + }, startFetchingTimeline (store, { timeline = 'friends', tag = false, userId = false }) { // Don't start fetching if we already are. if (store.state.fetchers[timeline]) return diff --git a/src/modules/users.js b/src/modules/users.js index e1373220..861a2f4f 100644 --- a/src/modules/users.js +++ b/src/modules/users.js @@ -469,11 +469,14 @@ const users = { store.dispatch('initializeSocket') } - // Start getting fresh posts. - store.dispatch('startFetchingTimeline', { timeline: 'friends' }) + store.dispatch('startMastoSocket').catch((error) => { + console.error(error) + // Start getting fresh posts. + store.dispatch('startFetchingTimeline', { timeline: 'friends' }) - // Start fetching notifications - store.dispatch('startFetchingNotifications') + // Start fetching notifications + store.dispatch('startFetchingNotifications') + }) // Get user mutes store.dispatch('fetchMutes') diff --git a/src/services/api/api.service.js b/src/services/api/api.service.js index 8f5eb416..7f27564f 100644 --- a/src/services/api/api.service.js +++ b/src/services/api/api.service.js @@ -71,6 +71,7 @@ const MASTODON_MUTE_CONVERSATION = id => `/api/v1/statuses/${id}/mute` const MASTODON_UNMUTE_CONVERSATION = id => `/api/v1/statuses/${id}/unmute` const MASTODON_SEARCH_2 = `/api/v2/search` const MASTODON_USER_SEARCH_URL = '/api/v1/accounts/search' +const MASTODON_STREAMING = '/api/v1/streaming' const oldfetch = window.fetch @@ -932,6 +933,45 @@ const search2 = ({ credentials, q, resolve, limit, offset, following }) => { }) } +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 + '?') +} + +const MASTODON_STREAMING_EVENTS = new Set([ + 'update', + 'notification', + 'delete', + 'filters_changed' +]) + +export const handleMastoWS = (wsEvent) => { + console.debug('Event', wsEvent) + const { data } = wsEvent + if (!data) return + const parsedEvent = JSON.parse(data) + const { event, payload } = parsedEvent + if (MASTODON_STREAMING_EVENTS.has(event)) { + const data = payload ? JSON.parse(payload) : null + if (event === 'update') { + return { event, status: parseStatus(data) } + } else if (event === 'notification') { + return { event, notification: parseNotification(data) } + } + } else { + console.warn('Unknown event', wsEvent) + return null + } +} + const apiService = { verifyCredentials, fetchTimeline, diff --git a/src/services/backend_interactor_service/backend_interactor_service.js b/src/services/backend_interactor_service/backend_interactor_service.js index 57fdccde..0cef4640 100644 --- a/src/services/backend_interactor_service/backend_interactor_service.js +++ b/src/services/backend_interactor_service/backend_interactor_service.js @@ -1,4 +1,4 @@ -import apiService from '../api/api.service.js' +import apiService, { getMastodonSocketURI, handleMastoWS } from '../api/api.service.js' import timelineFetcherService from '../timeline_fetcher/timeline_fetcher.service.js' import notificationsFetcher from '../notifications_fetcher/notifications_fetcher.service.js' import followRequestFetcher from '../../services/follow_request_fetcher/follow_request_fetcher.service' @@ -16,6 +16,19 @@ const backendInteractorService = credentials => ({ return followRequestFetcher.startFetching({ store, credentials }) }, + startUserSocket ({ store, onMessage }) { + const serv = store.rootState.instance.server.replace('https', 'wss') + // const serb = 'ws://localhost:8080/' + const url = serv + getMastodonSocketURI({ credentials, stream: 'user' }) + const socket = new WebSocket(url) + console.log(socket) + if (socket) { + socket.addEventListener('message', (wsEvent) => onMessage(handleMastoWS(wsEvent))) + } else { + throw new Error('failed to connect to socket') + } + }, + ...Object.entries(apiService).reduce((acc, [key, func]) => { return { ...acc, From 172ebaf4e67358852bfaafd8f069763ca5e602b1 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Sun, 24 Nov 2019 22:01:12 +0200 Subject: [PATCH 013/462] improved initial notifications fetching --- src/components/notifications/notifications.js | 5 ++++ src/modules/api.js | 23 ++++++++++++++++--- src/modules/users.js | 2 +- .../backend_interactor_service.js | 9 ++++++-- 4 files changed, 33 insertions(+), 6 deletions(-) diff --git a/src/components/notifications/notifications.js b/src/components/notifications/notifications.js index 6c4054fd..a89c0cdc 100644 --- a/src/components/notifications/notifications.js +++ b/src/components/notifications/notifications.js @@ -47,6 +47,11 @@ const Notifications = { components: { Notification }, + created () { + const { dispatch } = this.$store + + dispatch('fetchAndUpdateNotifications') + }, watch: { unseenCount (count) { if (count > 0) { diff --git a/src/modules/api.js b/src/modules/api.js index 1bf65db5..0e7e5e19 100644 --- a/src/modules/api.js +++ b/src/modules/api.js @@ -31,18 +31,32 @@ const api = { }, actions: { startMastoSocket (store) { - store.state.mastoSocket = store.state.backendInteractor + const { state, dispatch } = store + state.mastoSocket = state.backendInteractor .startUserSocket({ store, onMessage: (message) => { if (!message) return if (message.event === 'notification') { - store.dispatch('addNewNotifications', { notifications: [message.notification], older: false }) + dispatch('addNewNotifications', { + notifications: [message.notification], + older: false + }) } else if (message.event === 'update') { - store.dispatch('addNewStatuses', { statuses: [message.status], userId: false, showImmediately: false, timeline: 'friends' }) + dispatch('addNewStatuses', { + statuses: [message.status], + userId: false, + showImmediately: false, + timeline: 'friends' + }) } } }) + state.mastoSocket.addEventListener('error', error => { + console.error('Error with MastoAPI websocket:', error) + dispatch('startFetchingTimeline', { timeline: 'friends' }) + dispatch('startFetchingNotifications') + }) }, startFetchingTimeline (store, { timeline = 'friends', tag = false, userId = false }) { // Don't start fetching if we already are. @@ -58,6 +72,9 @@ const api = { const fetcher = store.state.backendInteractor.startFetchingNotifications({ store }) store.commit('addFetcher', { fetcherName: 'notifications', fetcher }) }, + fetchAndUpdateNotifications (store) { + store.state.backendInteractor.fetchAndUpdateNotifications({ store }) + }, startFetchingFollowRequest (store) { // Don't start fetching if we already are. if (store.state.fetchers['followRequest']) return diff --git a/src/modules/users.js b/src/modules/users.js index 861a2f4f..eff0c5d5 100644 --- a/src/modules/users.js +++ b/src/modules/users.js @@ -470,7 +470,7 @@ const users = { } store.dispatch('startMastoSocket').catch((error) => { - console.error(error) + console.error('Failed initializing MastoAPI Streaming socket', error) // Start getting fresh posts. store.dispatch('startFetchingTimeline', { timeline: 'friends' }) diff --git a/src/services/backend_interactor_service/backend_interactor_service.js b/src/services/backend_interactor_service/backend_interactor_service.js index 0cef4640..850b7867 100644 --- a/src/services/backend_interactor_service/backend_interactor_service.js +++ b/src/services/backend_interactor_service/backend_interactor_service.js @@ -12,18 +12,23 @@ const backendInteractorService = credentials => ({ return notificationsFetcher.startFetching({ store, credentials }) }, + fetchAndUpdateNotifications ({ store }) { + return notificationsFetcher.fetchAndUpdate({ store, credentials }) + }, + startFetchingFollowRequest ({ store }) { return followRequestFetcher.startFetching({ store, credentials }) }, startUserSocket ({ store, onMessage }) { - const serv = store.rootState.instance.server.replace('https', 'wss') - // const serb = 'ws://localhost:8080/' + const serv = store.rootState.instance.server.replace('http', 'ws') const url = serv + getMastodonSocketURI({ credentials, stream: 'user' }) const socket = new WebSocket(url) console.log(socket) if (socket) { socket.addEventListener('message', (wsEvent) => onMessage(handleMastoWS(wsEvent))) + socket.addEventListener('error', (error) => console.error('WebSocket Error:', error)) + return socket } else { throw new Error('failed to connect to socket') } From 40e774e05abfce6da3c558c09ce1750c132a580f Mon Sep 17 00:00:00 2001 From: taehoon Date: Mon, 25 Nov 2019 12:25:01 -0500 Subject: [PATCH 014/462] =?UTF-8?q?restore=20muted=20users=20collapsing=20?= =?UTF-8?q?logic=20on=20other=20user=E2=80=99s=20profiles?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/conversation/conversation.js | 3 ++- src/components/conversation/conversation.vue | 1 + src/components/status/status.js | 5 +++-- src/components/timeline/timeline.vue | 2 ++ 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/components/conversation/conversation.js b/src/components/conversation/conversation.js index 72ee9c39..08283fff 100644 --- a/src/components/conversation/conversation.js +++ b/src/components/conversation/conversation.js @@ -43,7 +43,8 @@ const conversation = { 'collapsable', 'isPage', 'pinnedStatusIdsObject', - 'inProfile' + 'inProfile', + 'profileUserId' ], created () { if (this.isPage) { diff --git a/src/components/conversation/conversation.vue b/src/components/conversation/conversation.vue index 0f1de55f..2e48240a 100644 --- a/src/components/conversation/conversation.vue +++ b/src/components/conversation/conversation.vue @@ -27,6 +27,7 @@ :highlight="getHighlight()" :replies="getReplies(status.id)" :in-profile="inProfile" + :profile-user-id="profileUserId" class="status-fadein panel-body" @goto="setHighlight" @toggleExpanded="toggleExpanded" diff --git a/src/components/status/status.js b/src/components/status/status.js index 714ea6d2..c49e729c 100644 --- a/src/components/status/status.js +++ b/src/components/status/status.js @@ -33,7 +33,8 @@ const Status = { 'noHeading', 'inlineExpanded', 'showPinned', - 'inProfile' + 'inProfile', + 'profileUserId' ], data () { return { @@ -115,7 +116,7 @@ const Status = { return hits }, - muted () { return !this.unmuted && ((!this.inProfile && this.status.user.muted) || (!this.inConversation && this.status.thread_muted) || this.muteWordHits.length > 0) }, + muted () { return !this.unmuted && ((!(this.inProfile && this.status.user.id === this.profileUserId) && this.status.user.muted) || (!this.inConversation && this.status.thread_muted) || this.muteWordHits.length > 0) }, hideFilteredStatuses () { return this.mergedConfig.hideFilteredStatuses }, diff --git a/src/components/timeline/timeline.vue b/src/components/timeline/timeline.vue index f1d3903a..93f6f570 100644 --- a/src/components/timeline/timeline.vue +++ b/src/components/timeline/timeline.vue @@ -37,6 +37,7 @@ :collapsable="true" :pinned-status-ids-object="pinnedStatusIdsObject" :in-profile="inProfile" + :profile-user-id="userId" />
      From 7ebf3602d5d9a8630ffbe239bfe4431655046821 Mon Sep 17 00:00:00 2001 From: taehoon Date: Tue, 26 Nov 2019 19:57:27 -0500 Subject: [PATCH 015/462] move mention button right next to mute button --- .../account_actions/account_actions.js | 3 --- .../account_actions/account_actions.vue | 18 ++++-------------- src/components/user_card/user_card.js | 3 +++ src/components/user_card/user_card.vue | 8 ++++++++ 4 files changed, 15 insertions(+), 17 deletions(-) diff --git a/src/components/account_actions/account_actions.js b/src/components/account_actions/account_actions.js index 204d506a..d2153680 100644 --- a/src/components/account_actions/account_actions.js +++ b/src/components/account_actions/account_actions.js @@ -25,9 +25,6 @@ const AccountActions = { }, reportUser () { this.$store.dispatch('openUserReportingModal', this.user.id) - }, - mentionUser () { - this.$store.dispatch('openPostStatusModal', { replyTo: true, repliedUser: this.user }) } } } diff --git a/src/components/account_actions/account_actions.vue b/src/components/account_actions/account_actions.vue index 046cba93..d3235be1 100644 --- a/src/components/account_actions/account_actions.vue +++ b/src/components/account_actions/account_actions.vue @@ -9,17 +9,7 @@ >
    -

    {{ $t("about.mrf_policy_simple") }}

    +

    + {{ $t("about.mrf_policy_simple") }} +

    {{ $t("about.mrf_policy_simple_accept") }}

    From 0082ed837ed0b4b9a047520460782562bad0d8aa Mon Sep 17 00:00:00 2001 From: taehoon Date: Sun, 1 Dec 2019 12:56:53 -0500 Subject: [PATCH 017/462] versioning the font resources through webpack --- index.html | 2 -- {static => src}/font/LICENSE.txt | 0 {static => src}/font/README.txt | 0 {static => src}/font/config.json | 0 {static => src}/font/css/animation.css | 0 {static => src}/font/css/fontello-codes.css | 0 {static => src}/font/css/fontello-embedded.css | 0 {static => src}/font/css/fontello-ie7-codes.css | 0 {static => src}/font/css/fontello-ie7.css | 0 {static => src}/font/css/fontello.css | 0 {static => src}/font/demo.html | 0 {static => src}/font/font/fontello.eot | Bin {static => src}/font/font/fontello.svg | 0 {static => src}/font/font/fontello.ttf | Bin {static => src}/font/font/fontello.woff | Bin {static => src}/font/font/fontello.woff2 | Bin src/main.js | 3 +++ 17 files changed, 3 insertions(+), 2 deletions(-) rename {static => src}/font/LICENSE.txt (100%) rename {static => src}/font/README.txt (100%) rename {static => src}/font/config.json (100%) rename {static => src}/font/css/animation.css (100%) rename {static => src}/font/css/fontello-codes.css (100%) rename {static => src}/font/css/fontello-embedded.css (100%) rename {static => src}/font/css/fontello-ie7-codes.css (100%) rename {static => src}/font/css/fontello-ie7.css (100%) rename {static => src}/font/css/fontello.css (100%) rename {static => src}/font/demo.html (100%) rename {static => src}/font/font/fontello.eot (100%) rename {static => src}/font/font/fontello.svg (100%) rename {static => src}/font/font/fontello.ttf (100%) rename {static => src}/font/font/fontello.woff (100%) rename {static => src}/font/font/fontello.woff2 (100%) diff --git a/index.html b/index.html index fd4e795e..1ff944d9 100644 --- a/index.html +++ b/index.html @@ -6,8 +6,6 @@ Pleroma - - diff --git a/static/font/LICENSE.txt b/src/font/LICENSE.txt similarity index 100% rename from static/font/LICENSE.txt rename to src/font/LICENSE.txt diff --git a/static/font/README.txt b/src/font/README.txt similarity index 100% rename from static/font/README.txt rename to src/font/README.txt diff --git a/static/font/config.json b/src/font/config.json similarity index 100% rename from static/font/config.json rename to src/font/config.json diff --git a/static/font/css/animation.css b/src/font/css/animation.css similarity index 100% rename from static/font/css/animation.css rename to src/font/css/animation.css diff --git a/static/font/css/fontello-codes.css b/src/font/css/fontello-codes.css similarity index 100% rename from static/font/css/fontello-codes.css rename to src/font/css/fontello-codes.css diff --git a/static/font/css/fontello-embedded.css b/src/font/css/fontello-embedded.css similarity index 100% rename from static/font/css/fontello-embedded.css rename to src/font/css/fontello-embedded.css diff --git a/static/font/css/fontello-ie7-codes.css b/src/font/css/fontello-ie7-codes.css similarity index 100% rename from static/font/css/fontello-ie7-codes.css rename to src/font/css/fontello-ie7-codes.css diff --git a/static/font/css/fontello-ie7.css b/src/font/css/fontello-ie7.css similarity index 100% rename from static/font/css/fontello-ie7.css rename to src/font/css/fontello-ie7.css diff --git a/static/font/css/fontello.css b/src/font/css/fontello.css similarity index 100% rename from static/font/css/fontello.css rename to src/font/css/fontello.css diff --git a/static/font/demo.html b/src/font/demo.html similarity index 100% rename from static/font/demo.html rename to src/font/demo.html diff --git a/static/font/font/fontello.eot b/src/font/font/fontello.eot similarity index 100% rename from static/font/font/fontello.eot rename to src/font/font/fontello.eot diff --git a/static/font/font/fontello.svg b/src/font/font/fontello.svg similarity index 100% rename from static/font/font/fontello.svg rename to src/font/font/fontello.svg diff --git a/static/font/font/fontello.ttf b/src/font/font/fontello.ttf similarity index 100% rename from static/font/font/fontello.ttf rename to src/font/font/fontello.ttf diff --git a/static/font/font/fontello.woff b/src/font/font/fontello.woff similarity index 100% rename from static/font/font/fontello.woff rename to src/font/font/fontello.woff diff --git a/static/font/font/fontello.woff2 b/src/font/font/fontello.woff2 similarity index 100% rename from static/font/font/fontello.woff2 rename to src/font/font/fontello.woff2 diff --git a/src/main.js b/src/main.js index a9db1cff..6469ba5c 100644 --- a/src/main.js +++ b/src/main.js @@ -32,6 +32,9 @@ import VTooltip from 'v-tooltip' import afterStoreSetup from './boot/after_store.js' +import './font/css/fontello.css' +import './font/css/animation.css' + const currentLocale = (window.navigator.language || 'en').split('-')[0] Vue.use(Vuex) From afd4524c3920f8426051e0673b42f022cb3627fe Mon Sep 17 00:00:00 2001 From: taehoon Date: Tue, 3 Dec 2019 10:32:46 -0500 Subject: [PATCH 018/462] use another approach for versioning font files --- build/webpack.base.conf.js | 11 + package.json | 1 + src/font/LICENSE.txt | 39 -- src/font/README.txt | 75 ---- src/font/css/animation.css | 85 ----- src/font/css/fontello-codes.css | 48 --- src/font/css/fontello-embedded.css | 101 ----- src/font/css/fontello-ie7-codes.css | 48 --- src/font/css/fontello-ie7.css | 59 --- src/font/css/fontello.css | 104 ------ src/font/demo.html | 374 ------------------- src/font/font/fontello.eot | Bin 20152 -> 0 bytes src/font/font/fontello.svg | 104 ------ src/font/font/fontello.ttf | Bin 19984 -> 0 bytes src/font/font/fontello.woff | Bin 12248 -> 0 bytes src/font/font/fontello.woff2 | Bin 10392 -> 0 bytes src/main.js | 4 +- src/font/config.json => static/fontello.json | 0 yarn.lock | 191 +++++++++- 19 files changed, 198 insertions(+), 1046 deletions(-) delete mode 100755 src/font/LICENSE.txt delete mode 100755 src/font/README.txt delete mode 100755 src/font/css/animation.css delete mode 100755 src/font/css/fontello-codes.css delete mode 100755 src/font/css/fontello-embedded.css delete mode 100755 src/font/css/fontello-ie7-codes.css delete mode 100755 src/font/css/fontello-ie7.css delete mode 100755 src/font/css/fontello.css delete mode 100755 src/font/demo.html delete mode 100755 src/font/font/fontello.eot delete mode 100755 src/font/font/fontello.svg delete mode 100755 src/font/font/fontello.ttf delete mode 100755 src/font/font/fontello.woff delete mode 100755 src/font/font/fontello.woff2 rename src/font/config.json => static/fontello.json (100%) diff --git a/build/webpack.base.conf.js b/build/webpack.base.conf.js index f8968966..9313ec20 100644 --- a/build/webpack.base.conf.js +++ b/build/webpack.base.conf.js @@ -3,6 +3,7 @@ var config = require('../config') var utils = require('./utils') var projectRoot = path.resolve(__dirname, '../') var ServiceWorkerWebpackPlugin = require('serviceworker-webpack-plugin') +var FontelloPlugin = require("fontello-webpack-plugin") var env = process.env.NODE_ENV // check env & config/index.js to decide weither to enable CSS Sourcemaps for the @@ -11,6 +12,8 @@ var cssSourceMapDev = (env === 'development' && config.dev.cssSourceMap) var cssSourceMapProd = (env === 'production' && config.build.productionSourceMap) var useCssSourceMap = cssSourceMapDev || cssSourceMapProd +var now = Date.now() + module.exports = { entry: { app: './src/main.js' @@ -90,6 +93,14 @@ module.exports = { new ServiceWorkerWebpackPlugin({ entry: path.join(__dirname, '..', 'src/sw.js'), filename: 'sw-pleroma.js' + }), + new FontelloPlugin({ + config: require('../static/fontello.json'), + name: 'fontello', + output: { + css: '[name].' + now + '.css', // [hash] is not supported. Use the current timestamp instead for versioning. + font: 'font/[name].' + now + '.[ext]' + } }) ] } diff --git a/package.json b/package.json index f039d412..648ffbdb 100644 --- a/package.json +++ b/package.json @@ -72,6 +72,7 @@ "eventsource-polyfill": "^0.9.6", "express": "^4.13.3", "file-loader": "^3.0.1", + "fontello-webpack-plugin": "https://github.com/sypl/fontello-webpack-plugin.git#35dac8cfd851bc1b3be19fd97e361516a1be6633", "function-bind": "^1.0.2", "html-webpack-plugin": "^3.0.0", "http-proxy-middleware": "^0.17.2", diff --git a/src/font/LICENSE.txt b/src/font/LICENSE.txt deleted file mode 100755 index 95966f00..00000000 --- a/src/font/LICENSE.txt +++ /dev/null @@ -1,39 +0,0 @@ -Font license info - - -## Font Awesome - - Copyright (C) 2016 by Dave Gandy - - Author: Dave Gandy - License: SIL () - Homepage: http://fortawesome.github.com/Font-Awesome/ - - -## Entypo - - Copyright (C) 2012 by Daniel Bruce - - Author: Daniel Bruce - License: SIL (http://scripts.sil.org/OFL) - Homepage: http://www.entypo.com - - -## Iconic - - Copyright (C) 2012 by P.J. Onori - - Author: P.J. Onori - License: SIL (http://scripts.sil.org/OFL) - Homepage: http://somerandomdude.com/work/iconic/ - - -## Fontelico - - Copyright (C) 2012 by Fontello project - - Author: Crowdsourced, for Fontello project - License: SIL (http://scripts.sil.org/OFL) - Homepage: http://fontello.com - - diff --git a/src/font/README.txt b/src/font/README.txt deleted file mode 100755 index beaab336..00000000 --- a/src/font/README.txt +++ /dev/null @@ -1,75 +0,0 @@ -This webfont is generated by http://fontello.com open source project. - - -================================================================================ -Please, note, that you should obey original font licenses, used to make this -webfont pack. Details available in LICENSE.txt file. - -- Usually, it's enough to publish content of LICENSE.txt file somewhere on your - site in "About" section. - -- If your project is open-source, usually, it will be ok to make LICENSE.txt - file publicly available in your repository. - -- Fonts, used in Fontello, don't require a clickable link on your site. - But any kind of additional authors crediting is welcome. -================================================================================ - - -Comments on archive content ---------------------------- - -- /font/* - fonts in different formats - -- /css/* - different kinds of css, for all situations. Should be ok with - twitter bootstrap. Also, you can skip style and assign icon classes - directly to text elements, if you don't mind about IE7. - -- demo.html - demo file, to show your webfont content - -- LICENSE.txt - license info about source fonts, used to build your one. - -- config.json - keeps your settings. You can import it back into fontello - anytime, to continue your work - - -Why so many CSS files ? ------------------------ - -Because we like to fit all your needs :) - -- basic file, .css - is usually enough, it contains @font-face - and character code definitions - -- *-ie7.css - if you need IE7 support, but still don't wish to put char codes - directly into html - -- *-codes.css and *-ie7-codes.css - if you like to use your own @font-face - rules, but still wish to benefit from css generation. That can be very - convenient for automated asset build systems. When you need to update font - - no need to manually edit files, just override old version with archive - content. See fontello source code for examples. - -- *-embedded.css - basic css file, but with embedded WOFF font, to avoid - CORS issues in Firefox and IE9+, when fonts are hosted on the separate domain. - We strongly recommend to resolve this issue by `Access-Control-Allow-Origin` - server headers. But if you ok with dirty hack - this file is for you. Note, - that data url moved to separate @font-face to avoid problems with - - - - - - - -
    -

    fontello font demo

    - -
    -
    -
    -
    icon-cancel0xe800
    -
    icon-upload0xe801
    -
    icon-star0xe802
    -
    icon-star-empty0xe803
    -
    -
    -
    icon-retweet0xe804
    -
    icon-eye-off0xe805
    -
    icon-search0xe806
    -
    icon-cog0xe807
    -
    -
    -
    icon-logout0xe808
    -
    icon-down-open0xe809
    -
    icon-attach0xe80a
    -
    icon-picture0xe80b
    -
    -
    -
    icon-video0xe80c
    -
    icon-right-open0xe80d
    -
    icon-left-open0xe80e
    -
    icon-up-open0xe80f
    -
    -
    -
    icon-bell-ringing-o0xe810
    -
    icon-lock0xe811
    -
    icon-globe0xe812
    -
    icon-brush0xe813
    -
    -
    -
    icon-attention0xe814
    -
    icon-plus0xe815
    -
    icon-adjust0xe816
    -
    icon-edit0xe817
    -
    -
    -
    icon-pencil0xe818
    -
    icon-pin0xe819
    -
    icon-wrench0xe81a
    -
    icon-chart-bar0xe81b
    -
    -
    -
    icon-zoom-in0xe81c
    -
    icon-spin30xe832
    -
    icon-spin40xe834
    -
    icon-link-ext0xf08e
    -
    -
    -
    icon-link-ext-alt0xf08f
    -
    icon-menu0xf0c9
    -
    icon-mail-alt0xf0e0
    -
    icon-gauge0xf0e4
    -
    -
    -
    icon-comment-empty0xf0e5
    -
    icon-bell-alt0xf0f3
    -
    icon-plus-squared0xf0fe
    -
    icon-reply0xf112
    -
    -
    -
    icon-smile0xf118
    -
    icon-lock-open-alt0xf13e
    -
    icon-ellipsis0xf141
    -
    icon-play-circled0xf144
    -
    -
    -
    icon-thumbs-up-alt0xf164
    -
    icon-binoculars0xf1e5
    -
    icon-user-plus0xf234
    -
    -
    - - - \ No newline at end of file diff --git a/src/font/font/fontello.eot b/src/font/font/fontello.eot deleted file mode 100755 index 1703fd97fce7f856264563cd89df72928771f153..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20152 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 asz5j%zT^_PtM)R#@xH9|0WgXl#{M^F&HPgU diff --git a/src/font/font/fontello.svg b/src/font/font/fontello.svg deleted file mode 100755 index f5e497ce..00000000 --- a/src/font/font/fontello.svg +++ /dev/null @@ -1,104 +0,0 @@ - - - -Copyright (C) 2019 by original authors @ fontello.com - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/font/font/fontello.ttf b/src/font/font/fontello.ttf deleted file mode 100755 index e9ed780311d58bedd808d37acfe47495fbb9ba0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19984 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 MveE}2D0&$C-+|xh?*IS* diff --git a/src/font/font/fontello.woff b/src/font/font/fontello.woff deleted file mode 100755 index 1d5025d3cccf300b56cdcea3fb71b091fdbf3bdb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12248 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 C)akbX diff --git a/src/main.js b/src/main.js index 6469ba5c..fe0fed94 100644 --- a/src/main.js +++ b/src/main.js @@ -32,8 +32,8 @@ import VTooltip from 'v-tooltip' import afterStoreSetup from './boot/after_store.js' -import './font/css/fontello.css' -import './font/css/animation.css' +// import './font/css/fontello.css' +// import './font/css/animation.css' const currentLocale = (window.navigator.language || 'en').split('-')[0] diff --git a/src/font/config.json b/static/fontello.json similarity index 100% rename from src/font/config.json rename to static/fontello.json diff --git a/yarn.lock b/yarn.lock index 4e0d9a22..31209805 100644 --- a/yarn.lock +++ b/yarn.lock @@ -227,6 +227,13 @@ agent-base@2: extend "~3.0.0" semver "~5.0.1" +agent-base@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" + integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg== + dependencies: + es6-promisify "^5.0.0" + ajv-errors@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" @@ -1165,6 +1172,14 @@ binary-extensions@^1.0.0: version "1.12.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.12.0.tgz#c2d780f53d45bba8317a8902d4ceeaf3a6385b14" +"binary@>= 0.3.0 < 1": + version "0.3.0" + resolved "https://registry.yarnpkg.com/binary/-/binary-0.3.0.tgz#9f60553bc5ce8c3386f3b553cff47462adecaa79" + integrity sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk= + dependencies: + buffers "~0.1.1" + chainsaw "~0.1.0" + blob@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683" @@ -1347,6 +1362,11 @@ buffer@^4.3.0: ieee754 "^1.1.4" isarray "^1.0.0" +buffers@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/buffers/-/buffers-0.1.1.tgz#b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb" + integrity sha1-skV5w77U1tOWru5tmorn9Ugqt7s= + builtin-modules@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" @@ -1483,6 +1503,13 @@ chai@^3.5.0: deep-eql "^0.1.3" type-detect "^1.0.0" +chainsaw@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/chainsaw/-/chainsaw-0.1.0.tgz#5eab50b28afe58074d0d58291388828b5e5fbc98" + integrity sha1-XqtQsor+WAdNDVgpE4iCi15fvJg= + dependencies: + traverse ">=0.3.0 <0.4" + chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" @@ -2359,6 +2386,13 @@ encodeurl@~1.0.1, encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" +encoding@^0.1.11: + version "0.1.12" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" + integrity sha1-U4tm8+5izRq1HsMjgp0flIDHS+s= + dependencies: + iconv-lite "~0.4.13" + end-of-stream@^1.0.0, end-of-stream@^1.1.0: version "1.4.1" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" @@ -2449,6 +2483,18 @@ es-to-primitive@^1.2.0: is-date-object "^1.0.1" is-symbol "^1.0.2" +es6-promise@^4.0.3: + version "4.2.8" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + +es6-promisify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= + dependencies: + es6-promise "^4.0.3" + escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" @@ -3010,6 +3056,18 @@ follow-redirects@^1.0.0: dependencies: debug "=3.1.0" +"fontello-webpack-plugin@https://github.com/sypl/fontello-webpack-plugin.git#35dac8cfd851bc1b3be19fd97e361516a1be6633": + version "0.4.8" + resolved "https://github.com/sypl/fontello-webpack-plugin.git#35dac8cfd851bc1b3be19fd97e361516a1be6633" + dependencies: + form-data "^2.1.2" + html-webpack-plugin "^3.2.0" + https-proxy-agent "^2.1.1" + lodash "^4.17.4" + node-fetch "^1.6.3" + unzip "^0.1.11" + webpack-sources "^0.2.0" + for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" @@ -3024,6 +3082,15 @@ forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" +form-data@^2.1.2: + version "2.5.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4" + integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + form-data@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" @@ -3085,6 +3152,16 @@ fsevents@^1.2.7: nan "^2.12.1" node-pre-gyp "^0.12.0" +"fstream@>= 0.1.30 < 1": + version "0.1.31" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-0.1.31.tgz#7337f058fbbbbefa8c9f561a28cab0849202c988" + integrity sha1-czfwWPu7vvqMn1YaKMqwhJICyYg= + dependencies: + graceful-fs "~3.0.2" + inherits "~2.0.0" + mkdirp "0.5" + rimraf "2" + ftp@~0.3.10: version "0.3.10" resolved "https://registry.yarnpkg.com/ftp/-/ftp-0.3.10.tgz#9197d861ad8142f3e63d5a83bfe4c59f7330885d" @@ -3244,6 +3321,13 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2: version "4.1.15" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" +graceful-fs@~3.0.2: + version "3.0.12" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.12.tgz#0034947ce9ed695ec8ab0b854bc919e82b1ffaef" + integrity sha512-J55gaCS4iTTJfTXIxSVw3EMQckcqkpdRv3IR7gu6sq0+tbC363Zx6KH/SEwXASK9JRbhyZmVjJEVJIOxYsB3Qg== + dependencies: + natives "^1.1.3" + "graceful-readlink@>= 1.0.0": version "1.0.1" resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" @@ -3407,7 +3491,7 @@ html-minifier@^3.2.3: relateurl "0.2.x" uglify-js "3.4.x" -html-webpack-plugin@^3.0.0: +html-webpack-plugin@^3.0.0, html-webpack-plugin@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz#b01abbd723acaaa7b37b6af4492ebda03d9dd37b" dependencies: @@ -3493,13 +3577,21 @@ https-proxy-agent@1: debug "2" extend "3" +https-proxy-agent@^2.1.1: + version "2.2.4" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b" + integrity sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg== + dependencies: + agent-base "^4.3.0" + debug "^3.1.0" + iconv-lite@0.4.23, iconv-lite@^0.4.4: version "0.4.23" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@^0.4.24: +iconv-lite@^0.4.24, iconv-lite@~0.4.13: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" dependencies: @@ -3599,6 +3691,11 @@ inherits@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" +inherits@~2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + ini@~1.3.0: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" @@ -3859,7 +3956,7 @@ is-regex@^1.0.4: dependencies: has "^1.0.1" -is-stream@^1.1.0: +is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" @@ -4622,6 +4719,14 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" +"match-stream@>= 0.0.2 < 1": + version "0.0.2" + resolved "https://registry.yarnpkg.com/match-stream/-/match-stream-0.0.2.tgz#99eb050093b34dffade421b9ac0b410a9cfa17cf" + integrity sha1-mesFAJOzTf+t5CG5rAtBCpz6F88= + dependencies: + buffers "~0.1.1" + readable-stream "~1.0.0" + math-expression-evaluator@^1.2.14: version "1.2.17" resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac" @@ -4826,7 +4931,7 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: +mkdirp@0.5, mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" dependencies: @@ -4920,6 +5025,11 @@ native-promise-only@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/native-promise-only/-/native-promise-only-0.8.1.tgz#20a318c30cb45f71fe7adfbf7b21c99c1472ef11" +natives@^1.1.3: + version "1.1.6" + resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.6.tgz#a603b4a498ab77173612b9ea1acdec4d980f00bb" + integrity sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -4973,6 +5083,14 @@ no-case@^2.2.0: dependencies: lower-case "^1.1.1" +node-fetch@^1.6.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" + integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + node-libs-browser@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.0.tgz#c72f60d9d46de08a940dedbb25f3ffa2f9bbaa77" @@ -5249,6 +5367,11 @@ osenv@^0.1.4: os-homedir "^1.0.0" os-tmpdir "^1.0.0" +"over@>= 0.0.5 < 1": + version "0.0.5" + resolved "https://registry.yarnpkg.com/over/-/over-0.0.5.tgz#f29852e70fd7e25f360e013a8ec44c82aedb5708" + integrity sha1-8phS5w/X4l82DgE6jsRMgq7bVwg= + p-defer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" @@ -5925,6 +6048,16 @@ public-encrypt@^4.0.0: randombytes "^2.0.1" safe-buffer "^5.1.2" +"pullstream@>= 0.4.1 < 1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/pullstream/-/pullstream-0.4.1.tgz#d6fb3bf5aed697e831150eb1002c25a3f8ae1314" + integrity sha1-1vs79a7Wl+gxFQ6xACwlo/iuExQ= + dependencies: + over ">= 0.0.5 < 1" + readable-stream "~1.0.31" + setimmediate ">= 1.0.2 < 2" + slice-stream ">= 1.0.0 < 2" + pump@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" @@ -6089,7 +6222,7 @@ read-pkg@^2.0.0: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@1.0: +readable-stream@1.0, readable-stream@~1.0.0, readable-stream@~1.0.31: version "1.0.34" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" dependencies: @@ -6339,6 +6472,13 @@ rfdc@^1.1.2: version "1.1.4" resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.1.4.tgz#ba72cc1367a0ccd9cf81a870b3b58bd3ad07f8c2" +rimraf@2: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + rimraf@2.6.3, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.0, rimraf@^2.6.1, rimraf@^2.6.2: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" @@ -6507,7 +6647,7 @@ set-value@^2.0.0: is-plain-object "^2.0.3" split-string "^3.0.1" -setimmediate@^1.0.4: +"setimmediate@>= 1.0.1 < 2", "setimmediate@>= 1.0.2 < 2", setimmediate@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" @@ -6579,6 +6719,13 @@ slice-ansi@^2.1.0: astral-regex "^1.0.0" is-fullwidth-code-point "^2.0.0" +"slice-stream@>= 1.0.0 < 2": + version "1.0.0" + resolved "https://registry.yarnpkg.com/slice-stream/-/slice-stream-1.0.0.tgz#5b33bd66f013b1a7f86460b03d463dec39ad3ea0" + integrity sha1-WzO9ZvATsaf4ZGCwPUY97DmtPqA= + dependencies: + readable-stream "~1.0.31" + smart-buffer@^1.0.13: version "1.1.15" resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-1.1.15.tgz#7f114b5b65fab3e2a35aa775bb12f0d1c649bf16" @@ -6673,6 +6820,11 @@ sort-keys@^1.0.0: dependencies: is-plain-obj "^1.0.0" +source-list-map@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-1.1.2.tgz#9889019d1024cce55cdc069498337ef6186a11a1" + integrity sha1-mIkBnRAkzOVc3AaUmDN+9hhqEaE= + source-list-map@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" @@ -6704,7 +6856,7 @@ source-map-url@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" -source-map@^0.5.0, source-map@^0.5.1, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7: +source-map@^0.5.0, source-map@^0.5.1, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.3: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" @@ -7102,6 +7254,11 @@ tough-cookie@~2.4.3: psl "^1.1.24" punycode "^1.4.1" +"traverse@>=0.3.0 <0.4": + version "0.3.9" + resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.3.9.tgz#717b8f220cc0bb7b44e40514c22b2e8bbc70d8b9" + integrity sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk= + trim-newlines@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" @@ -7212,6 +7369,18 @@ unset-value@^1.0.0: has-value "^0.3.1" isobject "^3.0.0" +unzip@^0.1.11: + version "0.1.11" + resolved "https://registry.yarnpkg.com/unzip/-/unzip-0.1.11.tgz#89749c63b058d7d90d619f86b98aa1535d3b97f0" + integrity sha1-iXScY7BY19kNYZ+GuYqhU107l/A= + dependencies: + binary ">= 0.3.0 < 1" + fstream ">= 0.1.30 < 1" + match-stream ">= 0.0.2 < 1" + pullstream ">= 0.4.1 < 1" + readable-stream "~1.0.31" + setimmediate ">= 1.0.1 < 2" + upath@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068" @@ -7459,6 +7628,14 @@ webpack-merge@^0.14.1: lodash.isplainobject "^3.2.0" lodash.merge "^3.3.2" +webpack-sources@^0.2.0: + version "0.2.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-0.2.3.tgz#17c62bfaf13c707f9d02c479e0dcdde8380697fb" + integrity sha1-F8Yr+vE8cH+dAsR54Nzd6DgGl/s= + dependencies: + source-list-map "^1.1.1" + source-map "~0.5.3" + webpack-sources@^1.1.0, webpack-sources@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85" From 57f46e68e4a0d137e8cb65ba603dfe4b8114ebbf Mon Sep 17 00:00:00 2001 From: taehoon Date: Tue, 3 Dec 2019 10:34:17 -0500 Subject: [PATCH 019/462] remove needless code --- src/main.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main.js b/src/main.js index fe0fed94..a9db1cff 100644 --- a/src/main.js +++ b/src/main.js @@ -32,9 +32,6 @@ import VTooltip from 'v-tooltip' import afterStoreSetup from './boot/after_store.js' -// import './font/css/fontello.css' -// import './font/css/animation.css' - const currentLocale = (window.navigator.language || 'en').split('-')[0] Vue.use(Vuex) From 9d44015ab477634d6b1e42cb096a58453b8d0914 Mon Sep 17 00:00:00 2001 From: taehoon Date: Tue, 3 Dec 2019 11:16:38 -0500 Subject: [PATCH 020/462] add animate-spin class --- src/App.scss | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/App.scss b/src/App.scss index 310962b8..925913f2 100644 --- a/src/App.scss +++ b/src/App.scss @@ -855,3 +855,18 @@ nav { .btn.btn-default { min-height: 28px; } + +.animate-spin { + animation: spin 2s infinite linear; + display: inline-block; +} + +@keyframes spin { + 0% { + transform: rotate(0deg); + } + + 100% { + transform: rotate(359deg); + } +} From 36589f32d1b2bfd8cb4a1f446909aa2c7287410f Mon Sep 17 00:00:00 2001 From: taehoon Date: Tue, 3 Dec 2019 13:26:00 -0500 Subject: [PATCH 021/462] use another fork of fontello-webpack-plugin --- package.json | 2 +- yarn.lock | 123 ++++++++++++++++++++++++--------------------------- 2 files changed, 60 insertions(+), 65 deletions(-) diff --git a/package.json b/package.json index 648ffbdb..3c9598eb 100644 --- a/package.json +++ b/package.json @@ -72,7 +72,7 @@ "eventsource-polyfill": "^0.9.6", "express": "^4.13.3", "file-loader": "^3.0.1", - "fontello-webpack-plugin": "https://github.com/sypl/fontello-webpack-plugin.git#35dac8cfd851bc1b3be19fd97e361516a1be6633", + "fontello-webpack-plugin": "https://github.com/w3geo/fontello-webpack-plugin.git#6149eac8f2672ab6da089e8802fbfcac98487186", "function-bind": "^1.0.2", "html-webpack-plugin": "^3.0.0", "http-proxy-middleware": "^0.17.2", diff --git a/yarn.lock b/yarn.lock index 31209805..44473c94 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1160,6 +1160,11 @@ better-assert@~1.0.0: dependencies: callsite "1.0.0" +big-integer@^1.6.17: + version "1.6.48" + resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.48.tgz#8fd88bd1632cba4a1c8c3e3d7159f08bb95b4b9e" + integrity sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w== + big.js@^3.1.3: version "3.2.0" resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" @@ -1172,7 +1177,7 @@ binary-extensions@^1.0.0: version "1.12.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.12.0.tgz#c2d780f53d45bba8317a8902d4ceeaf3a6385b14" -"binary@>= 0.3.0 < 1": +binary@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/binary/-/binary-0.3.0.tgz#9f60553bc5ce8c3386f3b553cff47462adecaa79" integrity sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk= @@ -1192,6 +1197,11 @@ bluebird@^3.5.3: version "3.5.4" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.4.tgz#d6cc661595de30d5b3af5fcedd3c0b3ef6ec5714" +bluebird@~3.4.1: + version "3.4.7" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3" + integrity sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM= + bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: version "4.11.8" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" @@ -1350,6 +1360,11 @@ buffer-from@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" +buffer-indexof-polyfill@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.1.tgz#a9fb806ce8145d5428510ce72f278bb363a638bf" + integrity sha1-qfuAbOgUXVQoUQznLyeLs2OmOL8= + buffer-xor@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" @@ -2334,6 +2349,13 @@ domutils@^1.5.1: dom-serializer "0" domelementtype "1" +duplexer2@~0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" + integrity sha1-ixLauHjA1p4+eJEFFmKjL8a93ME= + dependencies: + readable-stream "^2.0.2" + duplexify@^3.4.2, duplexify@^3.6.0: version "3.7.1" resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" @@ -3056,16 +3078,16 @@ follow-redirects@^1.0.0: dependencies: debug "=3.1.0" -"fontello-webpack-plugin@https://github.com/sypl/fontello-webpack-plugin.git#35dac8cfd851bc1b3be19fd97e361516a1be6633": +"fontello-webpack-plugin@https://github.com/w3geo/fontello-webpack-plugin.git#6149eac8f2672ab6da089e8802fbfcac98487186": version "0.4.8" - resolved "https://github.com/sypl/fontello-webpack-plugin.git#35dac8cfd851bc1b3be19fd97e361516a1be6633" + resolved "https://github.com/w3geo/fontello-webpack-plugin.git#6149eac8f2672ab6da089e8802fbfcac98487186" dependencies: form-data "^2.1.2" html-webpack-plugin "^3.2.0" https-proxy-agent "^2.1.1" lodash "^4.17.4" node-fetch "^1.6.3" - unzip "^0.1.11" + unzipper "^0.10.5" webpack-sources "^0.2.0" for-in@^1.0.1, for-in@^1.0.2: @@ -3152,14 +3174,14 @@ fsevents@^1.2.7: nan "^2.12.1" node-pre-gyp "^0.12.0" -"fstream@>= 0.1.30 < 1": - version "0.1.31" - resolved "https://registry.yarnpkg.com/fstream/-/fstream-0.1.31.tgz#7337f058fbbbbefa8c9f561a28cab0849202c988" - integrity sha1-czfwWPu7vvqMn1YaKMqwhJICyYg= +fstream@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" + integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== dependencies: - graceful-fs "~3.0.2" + graceful-fs "^4.1.2" inherits "~2.0.0" - mkdirp "0.5" + mkdirp ">=0.5 0" rimraf "2" ftp@~0.3.10: @@ -3321,12 +3343,10 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2: version "4.1.15" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" -graceful-fs@~3.0.2: - version "3.0.12" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.12.tgz#0034947ce9ed695ec8ab0b854bc919e82b1ffaef" - integrity sha512-J55gaCS4iTTJfTXIxSVw3EMQckcqkpdRv3IR7gu6sq0+tbC363Zx6KH/SEwXASK9JRbhyZmVjJEVJIOxYsB3Qg== - dependencies: - natives "^1.1.3" +graceful-fs@^4.2.2: + version "4.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" + integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== "graceful-readlink@>= 1.0.0": version "1.0.1" @@ -4300,6 +4320,11 @@ lie@3.1.1: dependencies: immediate "~3.0.5" +listenercount@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/listenercount/-/listenercount-1.0.1.tgz#84c8a72ab59c4725321480c975e6508342e70937" + integrity sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc= + load-json-file@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" @@ -4719,14 +4744,6 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" -"match-stream@>= 0.0.2 < 1": - version "0.0.2" - resolved "https://registry.yarnpkg.com/match-stream/-/match-stream-0.0.2.tgz#99eb050093b34dffade421b9ac0b410a9cfa17cf" - integrity sha1-mesFAJOzTf+t5CG5rAtBCpz6F88= - dependencies: - buffers "~0.1.1" - readable-stream "~1.0.0" - math-expression-evaluator@^1.2.14: version "1.2.17" resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac" @@ -4931,7 +4948,7 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@0.5, mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: +mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" dependencies: @@ -5025,11 +5042,6 @@ native-promise-only@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/native-promise-only/-/native-promise-only-0.8.1.tgz#20a318c30cb45f71fe7adfbf7b21c99c1472ef11" -natives@^1.1.3: - version "1.1.6" - resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.6.tgz#a603b4a498ab77173612b9ea1acdec4d980f00bb" - integrity sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA== - natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -5367,11 +5379,6 @@ osenv@^0.1.4: os-homedir "^1.0.0" os-tmpdir "^1.0.0" -"over@>= 0.0.5 < 1": - version "0.0.5" - resolved "https://registry.yarnpkg.com/over/-/over-0.0.5.tgz#f29852e70fd7e25f360e013a8ec44c82aedb5708" - integrity sha1-8phS5w/X4l82DgE6jsRMgq7bVwg= - p-defer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" @@ -6048,16 +6055,6 @@ public-encrypt@^4.0.0: randombytes "^2.0.1" safe-buffer "^5.1.2" -"pullstream@>= 0.4.1 < 1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/pullstream/-/pullstream-0.4.1.tgz#d6fb3bf5aed697e831150eb1002c25a3f8ae1314" - integrity sha1-1vs79a7Wl+gxFQ6xACwlo/iuExQ= - dependencies: - over ">= 0.0.5 < 1" - readable-stream "~1.0.31" - setimmediate ">= 1.0.2 < 2" - slice-stream ">= 1.0.0 < 2" - pump@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" @@ -6222,7 +6219,7 @@ read-pkg@^2.0.0: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@1.0, readable-stream@~1.0.0, readable-stream@~1.0.31: +readable-stream@1.0: version "1.0.34" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" dependencies: @@ -6647,9 +6644,10 @@ set-value@^2.0.0: is-plain-object "^2.0.3" split-string "^3.0.1" -"setimmediate@>= 1.0.1 < 2", "setimmediate@>= 1.0.2 < 2", setimmediate@^1.0.4: +setimmediate@^1.0.4, setimmediate@~1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= setprototypeof@1.1.0: version "1.1.0" @@ -6719,13 +6717,6 @@ slice-ansi@^2.1.0: astral-regex "^1.0.0" is-fullwidth-code-point "^2.0.0" -"slice-stream@>= 1.0.0 < 2": - version "1.0.0" - resolved "https://registry.yarnpkg.com/slice-stream/-/slice-stream-1.0.0.tgz#5b33bd66f013b1a7f86460b03d463dec39ad3ea0" - integrity sha1-WzO9ZvATsaf4ZGCwPUY97DmtPqA= - dependencies: - readable-stream "~1.0.31" - smart-buffer@^1.0.13: version "1.1.15" resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-1.1.15.tgz#7f114b5b65fab3e2a35aa775bb12f0d1c649bf16" @@ -7369,17 +7360,21 @@ unset-value@^1.0.0: has-value "^0.3.1" isobject "^3.0.0" -unzip@^0.1.11: - version "0.1.11" - resolved "https://registry.yarnpkg.com/unzip/-/unzip-0.1.11.tgz#89749c63b058d7d90d619f86b98aa1535d3b97f0" - integrity sha1-iXScY7BY19kNYZ+GuYqhU107l/A= +unzipper@^0.10.5: + version "0.10.5" + resolved "https://registry.yarnpkg.com/unzipper/-/unzipper-0.10.5.tgz#4d189ae6f8af634b26efe1a1817c399e0dd4a1a0" + integrity sha512-i5ufkXNjWZYxU/0nKKf6LkvW8kn9YzRvfwuPWjXP+JTFce/8bqeR0gEfbiN2IDdJa6ZU6/2IzFRLK0z1v0uptw== dependencies: - binary ">= 0.3.0 < 1" - fstream ">= 0.1.30 < 1" - match-stream ">= 0.0.2 < 1" - pullstream ">= 0.4.1 < 1" - readable-stream "~1.0.31" - setimmediate ">= 1.0.1 < 2" + big-integer "^1.6.17" + binary "~0.3.0" + bluebird "~3.4.1" + buffer-indexof-polyfill "~1.0.0" + duplexer2 "~0.1.4" + fstream "^1.0.12" + graceful-fs "^4.2.2" + listenercount "~1.0.1" + readable-stream "~2.3.6" + setimmediate "~1.0.4" upath@^1.1.1: version "1.1.2" From d37caeeded0ebe90a2e922205eed94b5cc4fcca4 Mon Sep 17 00:00:00 2001 From: taehoon Date: Tue, 3 Dec 2019 14:40:51 -0500 Subject: [PATCH 022/462] add html-webpack-plugin to karma config --- test/unit/karma.conf.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/unit/karma.conf.js b/test/unit/karma.conf.js index 8af05c24..45d74f14 100644 --- a/test/unit/karma.conf.js +++ b/test/unit/karma.conf.js @@ -5,6 +5,7 @@ // var path = require('path') var merge = require('webpack-merge') +var HtmlWebpackPlugin = require('html-webpack-plugin') var baseConfig = require('../../build/webpack.base.conf') var utils = require('../../build/utils') var webpack = require('webpack') @@ -24,6 +25,11 @@ var webpackConfig = merge(baseConfig, { plugins: [ new webpack.DefinePlugin({ 'process.env': require('../../config/test.env') + }), + new HtmlWebpackPlugin({ + filename: 'index.html', + template: 'index.html', + inject: true }) ] }) From 13fc2612ae388dec682829ae2b6211bb3cb8ccb3 Mon Sep 17 00:00:00 2001 From: Wyatt Benno Date: Thu, 5 Dec 2019 11:48:37 +0900 Subject: [PATCH 023/462] Change 403 messaging --- src/components/timeline/timeline.js | 7 ++++++- src/components/timeline/timeline.vue | 19 ++++++++++++++++--- src/i18n/en.json | 2 ++ src/modules/statuses.js | 7 +++++++ src/services/api/api.service.js | 10 ++++++++-- .../timeline_fetcher.service.js | 6 ++++++ 6 files changed, 45 insertions(+), 6 deletions(-) diff --git a/src/components/timeline/timeline.js b/src/components/timeline/timeline.js index 27a9a55e..6086336c 100644 --- a/src/components/timeline/timeline.js +++ b/src/components/timeline/timeline.js @@ -36,7 +36,12 @@ const Timeline = { } }, computed: { - timelineError () { return this.$store.state.statuses.error }, + timelineError () { + return this.$store.state.statuses.error + }, + error403 () { + return this.$store.state.statuses.error403 + }, newStatusCount () { return this.timeline.newStatusCount }, diff --git a/src/components/timeline/timeline.vue b/src/components/timeline/timeline.vue index 93f6f570..1c45d0f6 100644 --- a/src/components/timeline/timeline.vue +++ b/src/components/timeline/timeline.vue @@ -11,15 +11,22 @@ > {{ $t('timeline.error_fetching') }}
    +
    + {{ $t('timeline.error_403') }} +
    @@ -67,12 +74,18 @@ {{ $t('timeline.no_more_statuses') }}
    + + +