diff options
| author | syuilo <Syuilotan@yahoo.co.jp> | 2023-10-04 20:03:52 +0900 |
|---|---|---|
| committer | syuilo <Syuilotan@yahoo.co.jp> | 2023-10-04 20:03:52 +0900 |
| commit | 89e4f28d06f8efe140601beb7c6d088051c6ded0 (patch) | |
| tree | 234c452979f5a059b50f24a1f5babe63456e9fb2 /packages/frontend/src/pages/settings/mute-block.word-mute.vue | |
| parent | enhance: improve moderation log (diff) | |
| download | misskey-89e4f28d06f8efe140601beb7c6d088051c6ded0.tar.gz misskey-89e4f28d06f8efe140601beb7c6d088051c6ded0.tar.bz2 misskey-89e4f28d06f8efe140601beb7c6d088051c6ded0.zip | |
enhance(frontend): tweak ui
Diffstat (limited to 'packages/frontend/src/pages/settings/mute-block.word-mute.vue')
| -rw-r--r-- | packages/frontend/src/pages/settings/mute-block.word-mute.vue | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/packages/frontend/src/pages/settings/mute-block.word-mute.vue b/packages/frontend/src/pages/settings/mute-block.word-mute.vue new file mode 100644 index 0000000000..25a836ea55 --- /dev/null +++ b/packages/frontend/src/pages/settings/mute-block.word-mute.vue @@ -0,0 +1,94 @@ +<!-- +SPDX-FileCopyrightText: syuilo and other misskey contributors +SPDX-License-Identifier: AGPL-3.0-only +--> + +<template> +<div class="_gaps_m"> + <div> + <MkTextarea v-model="mutedWords"> + <span>{{ i18n.ts._wordMute.muteWords }}</span> + <template #caption>{{ i18n.ts._wordMute.muteWordsDescription }}<br>{{ i18n.ts._wordMute.muteWordsDescription2 }}</template> + </MkTextarea> + </div> + <MkButton primary inline :disabled="!changed" @click="save()"><i class="ti ti-device-floppy"></i> {{ i18n.ts.save }}</MkButton> +</div> +</template> + +<script lang="ts" setup> +import { ref, watch } from 'vue'; +import MkTextarea from '@/components/MkTextarea.vue'; +import MkKeyValue from '@/components/MkKeyValue.vue'; +import MkButton from '@/components/MkButton.vue'; +import MkInfo from '@/components/MkInfo.vue'; +import MkTab from '@/components/MkTab.vue'; +import * as os from '@/os.js'; +import number from '@/filters/number.js'; +import { defaultStore } from '@/store.js'; +import { $i } from '@/account.js'; +import { i18n } from '@/i18n.js'; +import { definePageMetadata } from '@/scripts/page-metadata.js'; + +const render = (mutedWords) => mutedWords.map(x => { + if (Array.isArray(x)) { + return x.join(' '); + } else { + return x; + } +}).join('\n'); + +const tab = ref('soft'); +const mutedWords = ref(render($i!.mutedWords)); +const changed = ref(false); + +watch(mutedWords, () => { + changed.value = true; +}); + +async function save() { + const parseMutes = (mutes) => { + // split into lines, remove empty lines and unnecessary whitespace + let lines = mutes.trim().split('\n').map(line => line.trim()).filter(line => line !== ''); + + // check each line if it is a RegExp or not + for (let i = 0; i < lines.length; i++) { + const line = lines[i]; + const regexp = line.match(/^\/(.+)\/(.*)$/); + if (regexp) { + // check that the RegExp is valid + try { + new RegExp(regexp[1], regexp[2]); + // note that regex lines will not be split by spaces! + } catch (err: any) { + // invalid syntax: do not save, do not reset changed flag + os.alert({ + type: 'error', + title: i18n.ts.regexpError, + text: i18n.t('regexpErrorDescription', { tab: 'word mute', line: i + 1 }) + '\n' + err.toString(), + }); + // re-throw error so these invalid settings are not saved + throw err; + } + } else { + lines[i] = line.split(' '); + } + } + + return lines; + }; + + let parsed; + try { + parsed = parseMutes(mutedWords.value); + } catch (err) { + // already displayed error message in parseMutes + return; + } + + await os.api('i/update', { + mutedWords: parsed, + }); + + changed.value = false; +} +</script> |