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'
|
2026-02-05 00:28:45 +02:00
|
|
|
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(),
|
2026-02-05 00:28:45 +02:00
|
|
|
...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
|