fix(frontend): 設定変更時のリロード確認ダイアログが複数個表示されることがある問題を修正 (#14543)
* fix(frontend): reloadAskが同時に複数実行されないように * Update Changelog * fix * フラグ解除が確実に行われるように * reloadAskを汎用化、理由を受け取るように * fix
This commit is contained in:
		
							parent
							
								
									ce95323e49
								
							
						
					
					
						commit
						3bf63dd9c5
					
				|  | @ -14,6 +14,7 @@ | |||
| - Fix: 月の違う同じ日はセパレータが表示されないのを修正 | ||||
| - Fix: 縦横比が極端なカスタム絵文字を表示する際にレイアウトが崩れる箇所があるのを修正   | ||||
|   (Cherry-picked from https://github.com/MisskeyIO/misskey/pull/725) | ||||
| - Fix: 設定変更時のリロード確認ダイアログが複数個表示されることがある問題を修正 | ||||
| 
 | ||||
| ### Server | ||||
| - Fix: アンテナの書き込み時にキーワードが与えられなかった場合のエラーをApiErrorとして投げるように | ||||
|  |  | |||
|  | @ -3121,7 +3121,7 @@ export interface Locale extends ILocale { | |||
|      */ | ||||
|     "narrow": string; | ||||
|     /** | ||||
|      * 設定はページリロード後に反映されます。今すぐリロードしますか? | ||||
|      * 設定はページリロード後に反映されます。 | ||||
|      */ | ||||
|     "reloadToApplySetting": string; | ||||
|     /** | ||||
|  |  | |||
|  | @ -778,7 +778,7 @@ left: "左" | |||
| center: "中央" | ||||
| wide: "広い" | ||||
| narrow: "狭い" | ||||
| reloadToApplySetting: "設定はページリロード後に反映されます。今すぐリロードしますか?" | ||||
| reloadToApplySetting: "設定はページリロード後に反映されます。" | ||||
| needReloadToApply: "反映には再起動が必要です。" | ||||
| showTitlebar: "タイトルバーを表示する" | ||||
| clearCache: "キャッシュをクリア" | ||||
|  |  | |||
|  | @ -258,7 +258,7 @@ import { langs } from '@@/js/config.js'; | |||
| import { defaultStore } from '@/store.js'; | ||||
| import * as os from '@/os.js'; | ||||
| import { misskeyApi } from '@/scripts/misskey-api.js'; | ||||
| import { unisonReload } from '@/scripts/unison-reload.js'; | ||||
| import { reloadAsk } from '@/scripts/reload-ask.js'; | ||||
| import { i18n } from '@/i18n.js'; | ||||
| import { definePageMetadata } from '@/scripts/page-metadata.js'; | ||||
| import { miLocalStorage } from '@/local-storage.js'; | ||||
|  | @ -270,16 +270,6 @@ const fontSize = ref(miLocalStorage.getItem('fontSize')); | |||
| const useSystemFont = ref(miLocalStorage.getItem('useSystemFont') != null); | ||||
| const dataSaver = ref(defaultStore.state.dataSaver); | ||||
| 
 | ||||
| async function reloadAsk() { | ||||
| 	const { canceled } = await os.confirm({ | ||||
| 		type: 'info', | ||||
| 		text: i18n.ts.reloadToApplySetting, | ||||
| 	}); | ||||
| 	if (canceled) return; | ||||
| 
 | ||||
| 	unisonReload(); | ||||
| } | ||||
| 
 | ||||
| const hemisphere = computed(defaultStore.makeGetterSetter('hemisphere')); | ||||
| const overridedDeviceKind = computed(defaultStore.makeGetterSetter('overridedDeviceKind')); | ||||
| const serverDisconnectedBehavior = computed(defaultStore.makeGetterSetter('serverDisconnectedBehavior')); | ||||
|  | @ -369,7 +359,7 @@ watch([ | |||
| 	confirmWhenRevealingSensitiveMedia, | ||||
| 	contextMenu, | ||||
| ], async () => { | ||||
| 	await reloadAsk(); | ||||
| 	await reloadAsk({ reason: i18n.ts.reloadToApplySetting, unison: true }); | ||||
| }); | ||||
| 
 | ||||
| const emojiIndexLangs = ['en-US', 'ja-JP', 'ja-JP_hira'] as const; | ||||
|  |  | |||
|  | @ -54,7 +54,7 @@ import MkContainer from '@/components/MkContainer.vue'; | |||
| import * as os from '@/os.js'; | ||||
| import { navbarItemDef } from '@/navbar.js'; | ||||
| import { defaultStore } from '@/store.js'; | ||||
| import { unisonReload } from '@/scripts/unison-reload.js'; | ||||
| import { reloadAsk } from '@/scripts/reload-ask.js'; | ||||
| import { i18n } from '@/i18n.js'; | ||||
| import { definePageMetadata } from '@/scripts/page-metadata.js'; | ||||
| 
 | ||||
|  | @ -67,16 +67,6 @@ const items = ref(defaultStore.state.menu.map(x => ({ | |||
| 
 | ||||
| const menuDisplay = computed(defaultStore.makeGetterSetter('menuDisplay')); | ||||
| 
 | ||||
| async function reloadAsk() { | ||||
| 	const { canceled } = await os.confirm({ | ||||
| 		type: 'info', | ||||
| 		text: i18n.ts.reloadToApplySetting, | ||||
| 	}); | ||||
| 	if (canceled) return; | ||||
| 
 | ||||
| 	unisonReload(); | ||||
| } | ||||
| 
 | ||||
| async function addItem() { | ||||
| 	const menu = Object.keys(navbarItemDef).filter(k => !defaultStore.state.menu.includes(k)); | ||||
| 	const { canceled, result: item } = await os.select({ | ||||
|  | @ -100,7 +90,7 @@ function removeItem(index: number) { | |||
| 
 | ||||
| async function save() { | ||||
| 	defaultStore.set('menu', items.value.map(x => x.type)); | ||||
| 	await reloadAsk(); | ||||
| 	await reloadAsk({ reason: i18n.ts.reloadToApplySetting, unison: true }); | ||||
| } | ||||
| 
 | ||||
| function reset() { | ||||
|  | @ -111,7 +101,7 @@ function reset() { | |||
| } | ||||
| 
 | ||||
| watch(menuDisplay, async () => { | ||||
| 	await reloadAsk(); | ||||
| 	await reloadAsk({ reason: i18n.ts.reloadToApplySetting, unison: true }); | ||||
| }); | ||||
| 
 | ||||
| const headerActions = computed(() => []); | ||||
|  |  | |||
|  | @ -98,7 +98,7 @@ import { defaultStore } from '@/store.js'; | |||
| import { signout, signinRequired } from '@/account.js'; | ||||
| import { i18n } from '@/i18n.js'; | ||||
| import { definePageMetadata } from '@/scripts/page-metadata.js'; | ||||
| import { unisonReload } from '@/scripts/unison-reload.js'; | ||||
| import { reloadAsk } from '@/scripts/reload-ask.js'; | ||||
| import FormSection from '@/components/form/section.vue'; | ||||
| 
 | ||||
| const $i = signinRequired(); | ||||
|  | @ -132,16 +132,6 @@ async function deleteAccount() { | |||
| 	await signout(); | ||||
| } | ||||
| 
 | ||||
| async function reloadAsk() { | ||||
| 	const { canceled } = await os.confirm({ | ||||
| 		type: 'info', | ||||
| 		text: i18n.ts.reloadToApplySetting, | ||||
| 	}); | ||||
| 	if (canceled) return; | ||||
| 
 | ||||
| 	unisonReload(); | ||||
| } | ||||
| 
 | ||||
| async function updateRepliesAll(withReplies: boolean) { | ||||
| 	const { canceled } = await os.confirm({ | ||||
| 		type: 'warning', | ||||
|  | @ -155,7 +145,7 @@ async function updateRepliesAll(withReplies: boolean) { | |||
| watch([ | ||||
| 	enableCondensedLineForAcct, | ||||
| ], async () => { | ||||
| 	await reloadAsk(); | ||||
| 	await reloadAsk({ reason: i18n.ts.reloadToApplySetting, unison: true }); | ||||
| }); | ||||
| 
 | ||||
| const headerActions = computed(() => []); | ||||
|  |  | |||
|  | @ -88,19 +88,9 @@ import { uniqueBy } from '@/scripts/array.js'; | |||
| import { fetchThemes, getThemes } from '@/theme-store.js'; | ||||
| import { definePageMetadata } from '@/scripts/page-metadata.js'; | ||||
| import { miLocalStorage } from '@/local-storage.js'; | ||||
| import { unisonReload } from '@/scripts/unison-reload.js'; | ||||
| import { reloadAsk } from '@/scripts/reload-ask.js'; | ||||
| import * as os from '@/os.js'; | ||||
| 
 | ||||
| async function reloadAsk() { | ||||
| 	const { canceled } = await os.confirm({ | ||||
| 		type: 'info', | ||||
| 		text: i18n.ts.reloadToApplySetting, | ||||
| 	}); | ||||
| 	if (canceled) return; | ||||
| 
 | ||||
| 	unisonReload(); | ||||
| } | ||||
| 
 | ||||
| const installedThemes = ref(getThemes()); | ||||
| const builtinThemes = getBuiltinThemesRef(); | ||||
| 
 | ||||
|  | @ -148,13 +138,13 @@ watch(syncDeviceDarkMode, () => { | |||
| 	} | ||||
| }); | ||||
| 
 | ||||
| watch(wallpaper, () => { | ||||
| watch(wallpaper, async () => { | ||||
| 	if (wallpaper.value == null) { | ||||
| 		miLocalStorage.removeItem('wallpaper'); | ||||
| 	} else { | ||||
| 		miLocalStorage.setItem('wallpaper', wallpaper.value); | ||||
| 	} | ||||
| 	reloadAsk(); | ||||
| 	await reloadAsk({ reason: i18n.ts.reloadToApplySetting, unison: true }); | ||||
| }); | ||||
| 
 | ||||
| onActivated(() => { | ||||
|  |  | |||
|  | @ -0,0 +1,40 @@ | |||
| /* | ||||
|  * SPDX-FileCopyrightText: syuilo and misskey-project | ||||
|  * SPDX-License-Identifier: AGPL-3.0-only | ||||
|  */ | ||||
| 
 | ||||
| import { i18n } from '@/i18n.js'; | ||||
| import * as os from '@/os.js'; | ||||
| import { unisonReload } from '@/scripts/unison-reload.js'; | ||||
| 
 | ||||
| let isReloadConfirming = false; | ||||
| 
 | ||||
| export async function reloadAsk(opts: { | ||||
| 	unison?: boolean; | ||||
| 	reason?: string; | ||||
| }) { | ||||
| 	if (isReloadConfirming) { | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	isReloadConfirming = true; | ||||
| 
 | ||||
| 	const { canceled } = await os.confirm(opts.reason == null ? { | ||||
| 		type: 'info', | ||||
| 		text: i18n.ts.reloadConfirm, | ||||
| 	} : { | ||||
| 		type: 'info', | ||||
| 		title: i18n.ts.reloadConfirm, | ||||
| 		text: opts.reason, | ||||
| 	}).finally(() => { | ||||
| 		isReloadConfirming = false; | ||||
| 	}); | ||||
| 
 | ||||
| 	if (canceled) return; | ||||
| 
 | ||||
| 	if (opts.unison) { | ||||
| 		unisonReload(); | ||||
| 	} else { | ||||
| 		location.reload(); | ||||
| 	} | ||||
| } | ||||
		Loading…
	
		Reference in New Issue