commit: 547e85c7c6f9bf8779cc06344c4eebaaa8f9d775
parent b7af37fce8bf11492681f206cfc2afcf00ff5ded
Author: Tusooa Zhu <tusooa@kazv.moe>
Date: Tue, 7 Jun 2022 12:37:16 -0400
Add confirm dialogs for accept & deny follow requests
Diffstat:
7 files changed, 147 insertions(+), 3 deletions(-)
diff --git a/src/components/follow_request_card/follow_request_card.js b/src/components/follow_request_card/follow_request_card.js
@@ -1,10 +1,18 @@
import BasicUserCard from '../basic_user_card/basic_user_card.vue'
+import ConfirmModal from '../confirm_modal/confirm_modal.vue'
import { notificationsFromStore } from '../../services/notification_utils/notification_utils.js'
const FollowRequestCard = {
props: ['user'],
components: {
- BasicUserCard
+ BasicUserCard,
+ ConfirmModal
+ },
+ data () {
+ return {
+ showingApproveConfirmDialog: false,
+ showingDenyConfirmDialog: false
+ }
},
methods: {
findFollowRequestNotificationId () {
@@ -13,7 +21,26 @@ const FollowRequestCard = {
)
return notif && notif.id
},
+ showApproveConfirmDialog () {
+ this.showingApproveConfirmDialog = true
+ },
+ hideApproveConfirmDialog () {
+ this.showingApproveConfirmDialog = false
+ },
+ showDenyConfirmDialog () {
+ this.showingDenyConfirmDialog = true
+ },
+ hideDenyConfirmDialog () {
+ this.showingDenyConfirmDialog = false
+ },
approveUser () {
+ if (this.shouldConfirmApprove) {
+ this.showApproveConfirmDialog()
+ } else {
+ this.doApprove()
+ }
+ },
+ doApprove () {
this.$store.state.api.backendInteractor.approveUser({ id: this.user.id })
this.$store.dispatch('removeFollowRequest', this.user)
@@ -25,14 +52,34 @@ const FollowRequestCard = {
notification.type = 'follow'
}
})
+ this.hideApproveConfirmDialog()
},
denyUser () {
+ if (this.shouldConfirmDeny) {
+ this.showDenyConfirmDialog()
+ } else {
+ this.doDeny()
+ }
+ },
+ doDeny () {
const notifId = this.findFollowRequestNotificationId()
this.$store.state.api.backendInteractor.denyUser({ id: this.user.id })
.then(() => {
this.$store.dispatch('dismissNotificationLocal', { id: notifId })
this.$store.dispatch('removeFollowRequest', this.user)
})
+ this.hideDenyConfirmDialog()
+ }
+ },
+ computed: {
+ mergedConfig () {
+ return this.$store.getters.mergedConfig
+ },
+ shouldConfirmApprove () {
+ return this.mergedConfig.modalOnApproveFollow
+ },
+ shouldConfirmDeny () {
+ return this.mergedConfig.modalOnDenyFollow
}
}
}
diff --git a/src/components/follow_request_card/follow_request_card.vue b/src/components/follow_request_card/follow_request_card.vue
@@ -14,6 +14,28 @@
{{ $t('user_card.deny') }}
</button>
</div>
+ <teleport to="#modal">
+ <confirm-modal
+ v-if="showingApproveConfirmDialog"
+ :title="$t('user_card.approve_confirm_title')"
+ :confirm-text="$t('user_card.approve_confirm_accept_button')"
+ :cancel-text="$t('user_card.approve_confirm_cancel_button')"
+ @accepted="doApprove"
+ @cancelled="hideApproveConfirmDialog"
+ >
+ {{ $t('user_card.approve_confirm', { user: user.screen_name_ui }) }}
+ </confirm-modal>
+ <confirm-modal
+ v-if="showingDenyConfirmDialog"
+ :title="$t('user_card.deny_confirm_title')"
+ :confirm-text="$t('user_card.deny_confirm_accept_button')"
+ :cancel-text="$t('user_card.deny_confirm_cancel_button')"
+ @accepted="doDeny"
+ @cancelled="hideDenyConfirmDialog"
+ >
+ {{ $t('user_card.deny_confirm', { user: user.screen_name_ui }) }}
+ </confirm-modal>
+ </teleport>
</basic-user-card>
</template>
diff --git a/src/components/notification/notification.js b/src/components/notification/notification.js
@@ -8,6 +8,7 @@ import Report from '../report/report.vue'
import UserLink from '../user_link/user_link.vue'
import RichContent from 'src/components/rich_content/rich_content.jsx'
import UserPopover from '../user_popover/user_popover.vue'
+import ConfirmModal from '../confirm_modal/confirm_modal.vue'
import { isStatusNotification } from '../../services/notification_utils/notification_utils.js'
import { highlightClass, highlightStyle } from '../../services/user_highlighter/user_highlighter.js'
import generateProfileLink from 'src/services/user_profile_link_generator/user_profile_link_generator'
@@ -43,7 +44,9 @@ const Notification = {
return {
statusExpanded: false,
betterShadow: this.$store.state.interface.browserSupport.cssFilter,
- unmuted: false
+ unmuted: false,
+ showingApproveConfirmDialog: false,
+ showingDenyConfirmDialog: false
}
},
props: ['notification'],
@@ -56,7 +59,8 @@ const Notification = {
Report,
RichContent,
UserPopover,
- UserLink
+ UserLink,
+ ConfirmModal
},
methods: {
toggleStatusExpanded () {
@@ -71,7 +75,26 @@ const Notification = {
toggleMute () {
this.unmuted = !this.unmuted
},
+ showApproveConfirmDialog () {
+ this.showingApproveConfirmDialog = true
+ },
+ hideApproveConfirmDialog () {
+ this.showingApproveConfirmDialog = false
+ },
+ showDenyConfirmDialog () {
+ this.showingDenyConfirmDialog = true
+ },
+ hideDenyConfirmDialog () {
+ this.showingDenyConfirmDialog = false
+ },
approveUser () {
+ if (this.shouldConfirmApprove) {
+ this.showApproveConfirmDialog()
+ } else {
+ this.doApprove()
+ }
+ },
+ doApprove () {
this.$store.state.api.backendInteractor.approveUser({ id: this.user.id })
this.$store.dispatch('removeFollowRequest', this.user)
this.$store.dispatch('markSingleNotificationAsSeen', { id: this.notification.id })
@@ -83,6 +106,13 @@ const Notification = {
})
},
denyUser () {
+ if (this.shouldConfirmDeny) {
+ this.showDenyConfirmDialog()
+ } else {
+ this.doDeny()
+ }
+ },
+ doDeny () {
this.$store.state.api.backendInteractor.denyUser({ id: this.user.id })
.then(() => {
this.$store.dispatch('dismissNotificationLocal', { id: this.notification.id })
@@ -117,6 +147,15 @@ const Notification = {
isStatusNotification () {
return isStatusNotification(this.notification.type)
},
+ mergedConfig () {
+ return this.$store.getters.mergedConfig
+ },
+ shouldConfirmApprove () {
+ return this.mergedConfig.modalOnApproveFollow
+ },
+ shouldConfirmDeny () {
+ return this.mergedConfig.modalOnDenyFollow
+ },
...mapState({
currentUser: state => state.users.currentUser
})
diff --git a/src/components/notification/notification.vue b/src/components/notification/notification.vue
@@ -243,6 +243,28 @@
</template>
</div>
</div>
+ <teleport to="#modal">
+ <confirm-modal
+ v-if="showingApproveConfirmDialog"
+ :title="$t('user_card.approve_confirm_title')"
+ :confirm-text="$t('user_card.approve_confirm_accept_button')"
+ :cancel-text="$t('user_card.approve_confirm_cancel_button')"
+ @accepted="doApprove"
+ @cancelled="hideApproveConfirmDialog"
+ >
+ {{ $t('user_card.approve_confirm', { user: user.screen_name_ui }) }}
+ </confirm-modal>
+ <confirm-modal
+ v-if="showingDenyConfirmDialog"
+ :title="$t('user_card.deny_confirm_title')"
+ :confirm-text="$t('user_card.deny_confirm_accept_button')"
+ :cancel-text="$t('user_card.deny_confirm_cancel_button')"
+ @accepted="doDeny"
+ @cancelled="hideDenyConfirmDialog"
+ >
+ {{ $t('user_card.deny_confirm', { user: user.screen_name_ui }) }}
+ </confirm-modal>
+ </teleport>
</article>
</template>
diff --git a/src/components/settings_modal/tabs/general_tab.vue b/src/components/settings_modal/tabs/general_tab.vue
@@ -181,6 +181,16 @@
{{ $t('settings.confirm_dialogs_logout') }}
</BooleanSetting>
</li>
+ <li>
+ <BooleanSetting path="modalOnApproveFollow">
+ {{ $t('settings.confirm_dialogs_approve_follow') }}
+ </BooleanSetting>
+ </li>
+ <li>
+ <BooleanSetting path="modalOnDenyFollow">
+ {{ $t('settings.confirm_dialogs_deny_follow') }}
+ </BooleanSetting>
+ </li>
</ul>
</li>
</ul>
diff --git a/src/modules/config.js b/src/modules/config.js
@@ -84,6 +84,8 @@ export const defaultState = {
modalOnMute: undefined, // instance default
modalOnDelete: undefined, // instance default
modalOnLogout: undefined, // instance default
+ modalOnApproveFollow: undefined, // instance default
+ modalOnDenyFollow: undefined, // instance default
playVideosInModal: false,
useOneClickNsfw: false,
useContainFit: true,
diff --git a/src/modules/instance.js b/src/modules/instance.js
@@ -77,6 +77,8 @@ const defaultState = {
modalOnMute: false,
modalOnDelete: true,
modalOnLogout: true,
+ modalOnApproveFollow: false,
+ modalOnDenyFollow: false,
loginMethod: 'password',
logo: '/static/logo.svg',
logoMargin: '.2em',