refactor: notification setting window composition API (#8860)
* refactor: notification setting window composition API * fix lint vue/require-valid-default-prop * fix type
This commit is contained in:
		
							parent
							
								
									126011c1a7
								
							
						
					
					
						commit
						d5ef68336a
					
				
					 1 changed files with 57 additions and 71 deletions
				
			
		|  | @ -6,95 +6,81 @@ | |||
| 	:with-ok-button="true" | ||||
| 	:ok-button-disabled="false" | ||||
| 	@ok="ok()" | ||||
| 	@close="$refs.dialog.close()" | ||||
| 	@closed="$emit('closed')" | ||||
| 	@close="dialog.close()" | ||||
| 	@closed="emit('closed')" | ||||
| > | ||||
| 	<template #header>{{ $ts.notificationSetting }}</template> | ||||
| 	<template #header>{{ i18n.ts.notificationSetting }}</template> | ||||
| 	<div class="_monolithic_"> | ||||
| 		<div v-if="showGlobalToggle" class="_section"> | ||||
| 			<MkSwitch v-model="useGlobalSetting"> | ||||
| 				{{ $ts.useGlobalSetting }} | ||||
| 				<template #caption>{{ $ts.useGlobalSettingDesc }}</template> | ||||
| 				{{ i18n.ts.useGlobalSetting }} | ||||
| 				<template #caption>{{ i18n.ts.useGlobalSettingDesc }}</template> | ||||
| 			</MkSwitch> | ||||
| 		</div> | ||||
| 		<div v-if="!useGlobalSetting" class="_section"> | ||||
| 			<MkInfo>{{ $ts.notificationSettingDesc }}</MkInfo> | ||||
| 			<MkButton inline @click="disableAll">{{ $ts.disableAll }}</MkButton> | ||||
| 			<MkButton inline @click="enableAll">{{ $ts.enableAll }}</MkButton> | ||||
| 			<MkSwitch v-for="type in notificationTypes" :key="type" v-model="typesMap[type]">{{ $t(`_notification._types.${type}`) }}</MkSwitch> | ||||
| 			<MkInfo>{{ i18n.ts.notificationSettingDesc }}</MkInfo> | ||||
| 			<MkButton inline @click="disableAll">{{ i18n.ts.disableAll }}</MkButton> | ||||
| 			<MkButton inline @click="enableAll">{{ i18n.ts.enableAll }}</MkButton> | ||||
| 			<MkSwitch v-for="type in notificationTypes" :key="type" v-model="typesMap[type]">{{ i18n.t(`_notification._types.${type}`) }}</MkSwitch> | ||||
| 		</div> | ||||
| 	</div> | ||||
| </XModalWindow> | ||||
| </template> | ||||
| 
 | ||||
| <script lang="ts"> | ||||
| import { defineComponent, PropType } from 'vue'; | ||||
| <script lang="ts" setup> | ||||
| import { PropType } from 'vue'; | ||||
| import { notificationTypes } from 'misskey-js'; | ||||
| import MkSwitch from './form/switch.vue'; | ||||
| import MkInfo from './ui/info.vue'; | ||||
| import MkButton from './ui/button.vue'; | ||||
| import XModalWindow from '@/components/ui/modal-window.vue'; | ||||
| import { i18n } from '@/i18n'; | ||||
| 
 | ||||
| export default defineComponent({ | ||||
| 	components: { | ||||
| 		XModalWindow, | ||||
| 		MkSwitch, | ||||
| 		MkInfo, | ||||
| 		MkButton, | ||||
| 	}, | ||||
| const emit = defineEmits<{ | ||||
| 	(ev: 'done', v: { includingTypes: string[] | null }): void, | ||||
| 	(ev: 'closed'): void, | ||||
| }>(); | ||||
| 
 | ||||
| 	props: { | ||||
| 		includingTypes: { | ||||
| 			// TODO: これで型に合わないものを弾いてくれるのかどうか要調査 | ||||
| 			type: Array as PropType<typeof notificationTypes[number][]>, | ||||
| 			required: false, | ||||
| 			default: null, | ||||
| 		}, | ||||
| 		showGlobalToggle: { | ||||
| 			type: Boolean, | ||||
| 			required: false, | ||||
| 			default: true, | ||||
| 		}, | ||||
| 	}, | ||||
| 
 | ||||
| 	emits: ['done', 'closed'], | ||||
| 
 | ||||
| 	data() { | ||||
| 		return { | ||||
| 			typesMap: {} as Record<typeof notificationTypes[number], boolean>, | ||||
| 			useGlobalSetting: false, | ||||
| 			notificationTypes, | ||||
| 		}; | ||||
| 	}, | ||||
| 
 | ||||
| 	created() { | ||||
| 		this.useGlobalSetting = this.includingTypes === null && this.showGlobalToggle; | ||||
| 
 | ||||
| 		for (const type of this.notificationTypes) { | ||||
| 			this.typesMap[type] = this.includingTypes === null || this.includingTypes.includes(type); | ||||
| 		} | ||||
| 	}, | ||||
| 
 | ||||
| 	methods: { | ||||
| 		ok() { | ||||
| 			const includingTypes = this.useGlobalSetting ? null : (Object.keys(this.typesMap) as typeof notificationTypes[number][]) | ||||
| 				.filter(type => this.typesMap[type]); | ||||
| 
 | ||||
| 			this.$emit('done', { includingTypes }); | ||||
| 			this.$refs.dialog.close(); | ||||
| 		}, | ||||
| 
 | ||||
| 		disableAll() { | ||||
| 			for (const type in this.typesMap) { | ||||
| 				this.typesMap[type as typeof notificationTypes[number]] = false; | ||||
| 			} | ||||
| 		}, | ||||
| 
 | ||||
| 		enableAll() { | ||||
| 			for (const type in this.typesMap) { | ||||
| 				this.typesMap[type as typeof notificationTypes[number]] = true; | ||||
| 			} | ||||
| 		}, | ||||
| 	}, | ||||
| const props = withDefaults(defineProps<{ | ||||
| 	// TODO: これで型に合わないものを弾いてくれるのかどうか要調査 | ||||
| 	includingTypes?: typeof notificationTypes[number][]; | ||||
| 	showGlobalToggle?: boolean; | ||||
| }>(), { | ||||
| 	includingTypes: () => [], | ||||
| 	showGlobalToggle: true, | ||||
| }); | ||||
| 
 | ||||
| const dialog = $ref<InstanceType<typeof XModalWindow>>(); | ||||
| 
 | ||||
| let typesMap = $ref<Record<typeof notificationTypes[number], boolean>>({}); | ||||
| let useGlobalSetting = $ref(props.includingTypes === [] && props.showGlobalToggle); | ||||
| 
 | ||||
| for (const type of notificationTypes) { | ||||
| 	typesMap[type] = props.includingTypes.includes(type); | ||||
| } | ||||
| 
 | ||||
| function ok() { | ||||
| 	if (useGlobalSetting) { | ||||
| 		emit('done', { includingTypes: null }); | ||||
| 	} else { | ||||
| 		emit('done', { | ||||
| 			includingTypes: (Object.keys(typesMap) as typeof notificationTypes[number][]) | ||||
| 				.filter(type => typesMap[type]), | ||||
| 		}); | ||||
| 	} | ||||
| 
 | ||||
| 	dialog.close(); | ||||
| } | ||||
| 
 | ||||
| function disableAll() { | ||||
| 	for (const type in typesMap) { | ||||
| 		typesMap[type as typeof notificationTypes[number]] = false; | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| function enableAll() { | ||||
| 	for (const type in typesMap) { | ||||
| 		typesMap[type as typeof notificationTypes[number]] = true; | ||||
| 	} | ||||
| } | ||||
| </script> | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue