refactor: extract scope logic into shared module

This commit is contained in:
Oneric 2025-05-18 20:56:31 +02:00
parent 9787f43343
commit 4734e9668d
3 changed files with 52 additions and 30 deletions

View file

@ -10,6 +10,7 @@ import fileTypeService from '../../services/file_type/file_type.service.js'
import { findOffset } from '../../services/offset_finder/offset_finder.service.js' import { findOffset } from '../../services/offset_finder/offset_finder.service.js'
import { reject, map, uniqBy, debounce } from 'lodash' import { reject, map, uniqBy, debounce } from 'lodash'
import { usePostLanguageOptions } from 'src/lib/post_language' import { usePostLanguageOptions } from 'src/lib/post_language'
import scopeUtils from 'src/lib/scope_utils.js'
import suggestor from '../emoji_input/suggestor.js' import suggestor from '../emoji_input/suggestor.js'
import { mapGetters, mapState } from 'vuex' import { mapGetters, mapState } from 'vuex'
import Checkbox from '../checkbox/checkbox.vue' import Checkbox from '../checkbox/checkbox.vue'
@ -762,15 +763,9 @@ const PostStatusForm = {
this.$store.dispatch('openSettingsModalTab', 'profile') this.$store.dispatch('openSettingsModalTab', 'profile')
}, },
suggestedVisibility () { suggestedVisibility () {
if (this.copyMessageScope) { const maxScope = this.copyMessageScope
if (this.copyMessageScope === 'direct') { const defaultScope = this.$store.state.users.currentUser.default_scope
return this.copyMessageScope return scopeUtils.negotiate(defaultScope, maxScope)
}
if (this.copyMessageScope !== 'public' && this.$store.state.users.currentUser.default_scope !== 'private') {
return this.copyMessageScope
}
}
return this.$store.state.users.currentUser.default_scope
} }
} }
} }

View file

@ -6,6 +6,8 @@ import {
faGlobe faGlobe
} from '@fortawesome/free-solid-svg-icons' } from '@fortawesome/free-solid-svg-icons'
import scopeUtils from 'src/lib/scope_utils.js'
library.add( library.add(
faEnvelope, faEnvelope,
faGlobe, faGlobe,
@ -13,25 +15,18 @@ library.add(
faLockOpen faLockOpen
) )
const SCOPE_LEVELS = {
'direct': 0,
'private': 1,
'local': 2,
'unlisted': 2,
'public': 3
}
const ScopeSelector = { const ScopeSelector = {
props: [ props: [
'showAll', 'showAll',
'userDefault', 'userDefault',
// scope of parent object
'originalScope', 'originalScope',
'initialScope', 'initialScope',
'onScopeChange' 'onScopeChange'
], ],
data () { data () {
return { return {
currentScope: this.initialScope currentScope: this.initialscope;
} }
}, },
computed: { computed: {
@ -39,16 +34,16 @@ const ScopeSelector = {
return !this.showPublic && !this.showUnlisted && !this.showPrivate && !this.showDirect return !this.showPublic && !this.showUnlisted && !this.showPrivate && !this.showDirect
}, },
showPublic () { showPublic () {
return this.originalScope !== 'direct' && this.shouldShow('public') return this.shouldShow('public')
}, },
showLocal () { showLocal () {
return this.originalScope !== 'direct' && this.shouldShow('local') return this.shouldShow('local')
}, },
showUnlisted () { showUnlisted () {
return this.originalScope !== 'direct' && this.shouldShow('unlisted') return this.shouldShow('unlisted')
}, },
showPrivate () { showPrivate () {
return this.originalScope !== 'direct' && this.shouldShow('private') return this.shouldShow('private')
}, },
showDirect () { showDirect () {
return this.shouldShow('direct') return this.shouldShow('direct')
@ -65,15 +60,10 @@ const ScopeSelector = {
}, },
methods: { methods: {
shouldShow (scope) { shouldShow (scope) {
if (!this.originalScope) { if (!this.originalScope)
return true return true
} else
return scopeUtils.compare(scope, this.originalScope) <= 0
if (this.originalScope === 'local') {
return scope === 'direct' || scope === 'local'
}
return SCOPE_LEVELS[scope] <= SCOPE_LEVELS[this.originalScope]
}, },
changeVis (scope) { changeVis (scope) {
this.currentScope = scope this.currentScope = scope

37
src/lib/scope_utils.js Normal file
View file

@ -0,0 +1,37 @@
const SCOPE_LEVELS = {
'direct': 0,
'private': 1,
'unlisted': 2,
'local': 3,
'public': 3
}
export default {
negotiate: (defaultScope, maxScope) => {
if (!maxScope)
return defaultScope;
if (maxScope === 'local')
return defaultScope === 'direct' ? defaultScope : 'local';
if (SCOPE_LEVELS[defaultScope] <= SCOPE_LEVELS[maxScope])
return defaultScope;
else
return maxScope;
},
compare: (sa, sb) => {
if (sa === 'local') {
if (sb === 'direct')
return 1;
else if (sb === sa)
return 0;
else
return -1;
}
if (sa === sb)
return 0;
return SCOPE_LEVELS[sa] < SCOPE_LEVELS[sb] ? -1 : 1;
}
}