pleroma-fe/src/components/settings_modal/tabs/clutter_tab.js

157 lines
4.8 KiB
JavaScript
Raw Normal View History

2026-01-06 16:23:17 +02:00
import { mapActions, mapState } from 'pinia'
2026-01-08 17:26:52 +02:00
import { v4 as uuidv4 } from 'uuid'
2026-01-06 16:23:17 +02:00
import Checkbox from 'src/components/checkbox/checkbox.vue'
import Select from 'src/components/select/select.vue'
2025-11-24 17:06:55 +02:00
import BooleanSetting from '../helpers/boolean_setting.vue'
import ChoiceSetting from '../helpers/choice_setting.vue'
import HelpIndicator from '../helpers/help_indicator.vue'
2026-01-06 16:23:17 +02:00
import IntegerSetting from '../helpers/integer_setting.vue'
2025-11-24 17:06:55 +02:00
import SharedComputedObject from '../helpers/shared_computed_object.js'
2026-01-06 16:23:17 +02:00
import UnitSetting from '../helpers/unit_setting.vue'
2025-11-24 17:06:55 +02:00
2026-02-05 01:17:20 +02:00
import { useInstanceStore } from 'src/stores/instance.js'
import { useInstanceCapabilitiesStore } from 'src/stores/instance_capabilities.js'
2026-02-13 13:59:00 +02:00
import { useSyncConfigStore } from 'src/stores/sync_config.js'
2026-01-29 20:40:00 +02:00
2025-11-24 17:06:55 +02:00
const ClutterTab = {
components: {
BooleanSetting,
ChoiceSetting,
UnitSetting,
IntegerSetting,
Checkbox,
Select,
2026-01-06 16:22:52 +02:00
HelpIndicator,
2025-11-24 17:06:55 +02:00
},
computed: {
...SharedComputedObject(),
...mapState(useInstanceCapabilitiesStore, ['shoutAvailable']),
2026-02-05 01:17:20 +02:00
...mapState(useInstanceStore, {
showFeaturesPanel: (store) => store.instanceIdentity.showFeaturesPanel,
instanceSpecificPanelPresent: (store) =>
store.instanceIdentity.showInstanceSpecificPanel &&
store.instanceIdentity.instanceSpecificPanelContent,
}),
2026-02-13 13:59:00 +02:00
...mapState(useSyncConfigStore, {
2026-01-06 16:22:52 +02:00
muteFilters: (store) =>
Object.entries(store.prefsStorage.simple.muteFilters),
muteFiltersObject: (store) => store.prefsStorage.simple.muteFilters,
}),
2025-11-24 17:06:55 +02:00
},
methods: {
2026-02-13 13:59:00 +02:00
...mapActions(useSyncConfigStore, [
2026-02-16 16:58:11 +02:00
'setSimplePrefAndSave',
'unsetSimplePrefAndSave',
2026-02-13 13:59:00 +02:00
'pushSyncConfig',
2026-01-06 16:22:52 +02:00
]),
getDatetimeLocal(timestamp) {
2025-11-24 17:06:55 +02:00
const date = new Date(timestamp)
2026-01-06 16:22:52 +02:00
const fmt = new Intl.NumberFormat('en-US', { minimumIntegerDigits: 2 })
2025-11-24 17:06:55 +02:00
const datetime = [
date.getFullYear(),
'-',
fmt.format(date.getMonth() + 1),
'-',
fmt.format(date.getDate()),
'T',
fmt.format(date.getHours()),
':',
2026-01-06 16:22:52 +02:00
fmt.format(date.getMinutes()),
2025-11-24 17:06:55 +02:00
].join('')
return datetime
},
2026-01-06 16:22:52 +02:00
checkRegexValid(id) {
2025-11-24 17:06:55 +02:00
const filter = this.muteFiltersObject[id]
if (filter.type !== 'regexp') return true
if (filter.type !== 'user_regexp') return true
const { value } = filter
let valid = true
try {
new RegExp(value)
} catch {
valid = false
console.error('Invalid RegExp: ' + value)
}
return valid
},
2026-08-04 20:16:29 +03:00
createFilter({
type = 'word',
value = '',
name = 'New Filter',
enabled = true,
expires = null,
hide = false,
}) {
2025-11-24 17:06:55 +02:00
const newId = uuidv4()
filter.order = this.muteFilters.length + 2
this.muteFiltersDraftObject[newId] = filter
2026-02-16 16:58:11 +02:00
this.setSimplePrefAndSave({ path: 'muteFilters.' + newId, value: filter })
2026-02-13 13:59:00 +02:00
this.pushSyncConfig()
2025-11-24 17:06:55 +02:00
},
exportFilter(id) {
this.exportedFilter = { ...this.muteFiltersDraftObject[id] }
delete this.exportedFilter.order
this.filterExporter.exportData()
},
importFilter() {
this.filterImporter.importData()
},
2026-01-06 16:22:52 +02:00
copyFilter(id) {
2025-11-24 17:06:55 +02:00
const filter = { ...this.muteFiltersDraftObject[id] }
const newId = uuidv4()
this.muteFiltersDraftObject[newId] = filter
2026-02-16 16:58:11 +02:00
this.setSimplePrefAndSave({ path: 'muteFilters.' + newId, value: filter })
2026-02-13 13:59:00 +02:00
this.pushSyncConfig()
2025-11-24 17:06:55 +02:00
},
2026-01-06 16:22:52 +02:00
deleteFilter(id) {
2025-11-24 17:06:55 +02:00
delete this.muteFiltersDraftObject[id]
2026-02-16 16:58:11 +02:00
this.unsetSimplePrefAndSave({ path: 'muteFilters.' + id, value: null })
2026-02-13 13:59:00 +02:00
this.pushSyncConfig()
2025-11-24 17:06:55 +02:00
},
2026-01-06 16:22:52 +02:00
purgeExpiredFilters() {
2025-11-24 17:06:55 +02:00
this.muteFiltersExpired.forEach(([id]) => {
delete this.muteFiltersDraftObject[id]
2026-02-16 16:58:11 +02:00
this.unsetSimplePrefAndSave({ path: 'muteFilters.' + id, value: null })
2025-11-24 17:06:55 +02:00
})
2026-02-13 13:59:00 +02:00
this.pushSyncConfig()
2025-11-24 17:06:55 +02:00
},
updateFilter(id, field, value) {
const filter = { ...this.muteFiltersDraftObject[id] }
if (field === 'expires-never') {
if (!value) {
const offset = 1000 * 60 * 60 * 24 * 14 // 2 weeks
const date = Date.now() + offset
filter.expires = date
} else {
filter.expires = null
}
} else if (field === 'expires') {
const parsed = Date.parse(value)
filter.expires = parsed.valueOf()
} else {
filter[field] = value
}
this.muteFiltersDraftObject[id] = filter
this.muteFiltersDraftDirty[id] = true
},
saveFilter(id) {
2026-02-16 16:58:11 +02:00
this.setSimplePrefAndSave({
path: 'muteFilters.' + id,
2026-01-06 16:22:52 +02:00
value: this.muteFiltersDraftObject[id],
})
2026-02-13 13:59:00 +02:00
this.pushSyncConfig()
2025-11-24 17:06:55 +02:00
this.muteFiltersDraftDirty[id] = false
},
},
// Updating nested properties
watch: {
2026-01-06 16:22:52 +02:00
replyVisibility() {
2025-11-24 17:06:55 +02:00
this.$store.dispatch('queueFlushAll')
2026-01-06 16:22:52 +02:00
},
},
2025-11-24 17:06:55 +02:00
}
export default ClutterTab