diff options
Diffstat (limited to 'packages/frontend/src/components/MkNotificationSelectWindow.vue')
| -rw-r--r-- | packages/frontend/src/components/MkNotificationSelectWindow.vue | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/packages/frontend/src/components/MkNotificationSelectWindow.vue b/packages/frontend/src/components/MkNotificationSelectWindow.vue new file mode 100644 index 0000000000..3d5a56975b --- /dev/null +++ b/packages/frontend/src/components/MkNotificationSelectWindow.vue @@ -0,0 +1,78 @@ +<!-- +SPDX-FileCopyrightText: syuilo and other misskey contributors +SPDX-License-Identifier: AGPL-3.0-only +--> + +<template> +<MkModalWindow + ref="dialog" + :width="400" + :height="450" + :withOkButton="true" + :okButtonDisabled="false" + @ok="ok()" + @close="dialog?.close()" + @closed="emit('closed')" +> + <template #header>{{ i18n.ts.notificationSetting }}</template> + + <MkSpacer :marginMin="20" :marginMax="28"> + <div class="_gaps_m"> + <MkInfo>{{ i18n.ts.notificationSettingDesc }}</MkInfo> + <div class="_buttons"> + <MkButton inline @click="disableAll">{{ i18n.ts.disableAll }}</MkButton> + <MkButton inline @click="enableAll">{{ i18n.ts.enableAll }}</MkButton> + </div> + <MkSwitch v-for="ntype in notificationTypes" :key="ntype" v-model="typesMap[ntype].value">{{ i18n.t(`_notification._types.${ntype}`) }}</MkSwitch> + </div> + </MkSpacer> +</MkModalWindow> +</template> + +<script lang="ts" setup> +import { ref, Ref } from 'vue'; +import MkSwitch from './MkSwitch.vue'; +import MkInfo from './MkInfo.vue'; +import MkButton from './MkButton.vue'; +import MkModalWindow from '@/components/MkModalWindow.vue'; +import { notificationTypes } from '@/const.js'; +import { i18n } from '@/i18n.js'; + +type TypesMap = Record<typeof notificationTypes[number], Ref<boolean>> + +const emit = defineEmits<{ + (ev: 'done', v: { excludeTypes: string[] }): void, + (ev: 'closed'): void, +}>(); + +const props = withDefaults(defineProps<{ + excludeTypes?: typeof notificationTypes[number][]; +}>(), { + excludeTypes: () => [], +}); + +const dialog = $shallowRef<InstanceType<typeof MkModalWindow>>(); + +const typesMap: TypesMap = notificationTypes.reduce((p, t) => ({ ...p, [t]: ref<boolean>(!props.excludeTypes.includes(t)) }), {} as any); + +function ok() { + emit('done', { + excludeTypes: (Object.keys(typesMap) as typeof notificationTypes[number][]) + .filter(type => !typesMap[type].value), + }); + + if (dialog) dialog.close(); +} + +function disableAll() { + for (const type of notificationTypes) { + typesMap[type].value = false; + } +} + +function enableAll() { + for (const type of notificationTypes) { + typesMap[type].value = true; + } +} +</script> |