diff --git a/packages/frontend/src/components/MkEmojiPicker.vue b/packages/frontend/src/components/MkEmojiPicker.vue index 880f12f3fb..6b1add81bc 100644 --- a/packages/frontend/src/components/MkEmojiPicker.vue +++ b/packages/frontend/src/components/MkEmojiPicker.vue @@ -190,7 +190,7 @@ function parseAndMergeCategories(input: string, root: CustomEmojiFolderTree): Cu const parts = input.split('/').map(p => p.trim()); let currentNode: CustomEmojiFolderTree = root; - const currentPath = []; + const currentPath = [] as string[]; for (const part of parts) { currentPath.push(part); let existingNode = currentNode.children.find((node) => node.value === part); diff --git a/packages/frontend/src/components/SkOldNoteWindow.vue b/packages/frontend/src/components/SkOldNoteWindow.vue index 463a71ccd0..bd5368351b 100644 --- a/packages/frontend/src/components/SkOldNoteWindow.vue +++ b/packages/frontend/src/components/SkOldNoteWindow.vue @@ -34,25 +34,25 @@ SPDX-License-Identifier: AGPL-3.0-only

- +

({{ i18n.ts.private }}) - + RN:
{{ i18n.t('translatedFrom', { x: translation.sourceLang }) }}: - +
-
+
- +
@@ -117,11 +117,18 @@ let note = ref(deepClone(props.note)); const noteViewInterruptors = getPluginHandlers('note_view_interruptor'); if (noteViewInterruptors.length > 0) { onMounted(async () => { - let result = deepClone(note.value); + let result: Misskey.entities.Note | null = deepClone(note.value); for (const interruptor of noteViewInterruptors) { - result = await interruptor.handler(result); + try { + result = await interruptor.handler(result!) as Misskey.entities.Note | null; + if (result === null) { + return; + } + } catch (err) { + console.error(err); + } } - note.value = result; + note.value = result as Misskey.entities.Note; }); } diff --git a/packages/frontend/src/pages/settings/other.vue b/packages/frontend/src/pages/settings/other.vue index d1b972fe55..0b01300e9b 100644 --- a/packages/frontend/src/pages/settings/other.vue +++ b/packages/frontend/src/pages/settings/other.vue @@ -70,7 +70,7 @@ SPDX-License-Identifier: AGPL-3.0-only - +
{{ i18n.ts._dataRequest.warn }} @@ -133,13 +133,15 @@ SPDX-License-Identifier: AGPL-3.0-only
- -
- {{ i18n.ts.withRepliesByDefaultForNewlyFollowed }} - {{ i18n.ts.showRepliesToOthersInTimelineAll }} - {{ i18n.ts.hideRepliesToOthersInTimelineAll }} -
-
+ + +
+ {{ i18n.ts.withRepliesByDefaultForNewlyFollowed }} + {{ i18n.ts.showRepliesToOthersInTimelineAll }} + {{ i18n.ts.hideRepliesToOthersInTimelineAll }} +
+
+

diff --git a/packages/frontend/src/pages/settings/preferences.vue b/packages/frontend/src/pages/settings/preferences.vue index 782eb47729..6b82a16a75 100644 --- a/packages/frontend/src/pages/settings/preferences.vue +++ b/packages/frontend/src/pages/settings/preferences.vue @@ -141,21 +141,35 @@ SPDX-License-Identifier: AGPL-3.0-only - - - + + + + + - - - + + + + + + + + + + + + + - - - + + + + + @@ -184,40 +198,48 @@ SPDX-License-Identifier: AGPL-3.0-only - - - + + + + + - - - + + + + + - - - - - - - - + + + + + + + + + + - - - - - + + + + + + +
@@ -327,11 +349,21 @@ SPDX-License-Identifier: AGPL-3.0-only
+ + + + + + + + - - - - + + + + + +
@@ -415,22 +447,26 @@ SPDX-License-Identifier: AGPL-3.0-only - - - + + + + + - - - + + {{ i18n.ts.verifyNotificationDotWorkingButton }} @@ -570,6 +606,14 @@ SPDX-License-Identifier: AGPL-3.0-only + + + + + + + + @@ -715,15 +759,19 @@ SPDX-License-Identifier: AGPL-3.0-only - - - + + + + + - - - + + + + + @@ -763,25 +811,27 @@ SPDX-License-Identifier: AGPL-3.0-only - - -
- - - - - - - - - - - - - - -
-
+ + + +
+ + + + + + + + + + + + + + +
+
+
@@ -792,9 +842,11 @@ SPDX-License-Identifier: AGPL-3.0-only - - - + + + + + @@ -937,18 +989,20 @@ const showTickerOnReplies = prefer.model('showTickerOnReplies'); const searchEngine = prefer.model('searchEngine'); const noteDesign = prefer.model('noteDesign'); const uncollapseCW = prefer.model('uncollapseCW'); +const collapseFiles = prefer.model('collapseFiles'); const expandLongNote = prefer.model('expandLongNote'); const disableCatSpeak = prefer.model('disableCatSpeak'); -const enableFaviconNotificationDot = computed(store.makeGetterSetter('enableFaviconNotificationDot')); +const enableFaviconNotificationDot = prefer.model('enableFaviconNotificationDot'); const warnMissingAltText = prefer.model('warnMissingAltText'); -const notificationClickable = computed(store.makeGetterSetter('notificationClickable')); +const notificationClickable = prefer.model('notificationClickable'); const warnExternalUrl = prefer.model('warnExternalUrl'); const showVisibilitySelectorOnBoost = prefer.model('showVisibilitySelectorOnBoost'); const visibilityOnBoost = prefer.model('visibilityOnBoost'); -const cornerRadius = computed(store.makeGetterSetter('cornerRadius')); -const oneko = computed(store.makeGetterSetter('oneko')); -const numberOfReplies = computed(store.makeGetterSetter('numberOfReplies')); - +const cornerRadius = ref(miLocalStorage.getItem('cornerRadius')); +const oneko = prefer.model('oneko'); +const numberOfReplies = prefer.model('numberOfReplies'); +const autoloadConversation = prefer.model('autoloadConversation'); +const clickToOpen = prefer.model('clickToOpen'); const useCustomSearchEngine = computed(() => !Object.keys(searchEngineMap).includes(searchEngine.value)); watch(lang, () => { @@ -973,6 +1027,14 @@ watch(useSystemFont, () => { } }); +watch(cornerRadius, () => { + if (cornerRadius.value == null) { + miLocalStorage.removeItem('cornerRadius'); + } else { + miLocalStorage.setItem('cornerRadius', cornerRadius.value); + } +}); + watch([ hemisphere, lang, diff --git a/packages/frontend/src/pages/settings/privacy.vue b/packages/frontend/src/pages/settings/privacy.vue index 84f13b2afc..91071a55d3 100644 --- a/packages/frontend/src/pages/settings/privacy.vue +++ b/packages/frontend/src/pages/settings/privacy.vue @@ -64,10 +64,17 @@ SPDX-License-Identifier: AGPL-3.0-only + + + + + + + - {{ i18n.ts.makeIndexable }} - + + @@ -80,15 +87,8 @@ SPDX-License-Identifier: AGPL-3.0-only - {{ i18n.ts.enableRss }} - - - - - - - - + + @@ -205,12 +205,12 @@ SPDX-License-Identifier: AGPL-3.0-only - + - - + + @@ -221,9 +221,9 @@ SPDX-License-Identifier: AGPL-3.0-only
- {{ i18n.ts.rememberNoteVisibility }} + {{ i18n.ts.rememberNoteVisibility }} - + @@ -244,16 +244,16 @@ SPDX-License-Identifier: AGPL-3.0-only
- {{ i18n.ts.keepCw }} + {{ i18n.ts.keepCw }} - - + + - - + + @@ -296,6 +296,7 @@ const $i = ensureSignin(); const isLocked = ref($i.isLocked); const autoAcceptFollowed = ref($i.autoAcceptFollowed); const noCrawle = ref($i.noCrawle); +const preventAiLearning = ref($i.preventAiLearning); const noindex = ref($i.noindex); const enableRss = ref($i.enableRss); const isExplorable = ref($i.isExplorable); @@ -316,8 +317,6 @@ const computedAllowUnsignedFetch = computed(() => { } return instance.allowUnsignedFetch; }); - -const preventAiLearning = ref($i.preventAiLearning); const defaultNoteVisibility = prefer.model('defaultNoteVisibility'); const defaultNoteLocalOnly = prefer.model('defaultNoteLocalOnly'); const rememberNoteVisibility = prefer.model('rememberNoteVisibility'); @@ -365,6 +364,7 @@ function save() { isLocked: !!isLocked.value, autoAcceptFollowed: !!autoAcceptFollowed.value, noCrawle: !!noCrawle.value, + preventAiLearning: !!preventAiLearning.value, noindex: !!noindex.value, enableRss: !!enableRss.value, isExplorable: !!isExplorable.value, diff --git a/packages/frontend/src/pref-migrate.ts b/packages/frontend/src/pref-migrate.ts index 0ed8b4e33d..a7bb82a5f0 100644 --- a/packages/frontend/src/pref-migrate.ts +++ b/packages/frontend/src/pref-migrate.ts @@ -139,23 +139,30 @@ export function migrateOldSettings() { prefer.commit('sound.on.reaction', store.s.sound_reaction as any); prefer.commit('defaultNoteVisibility', store.s.defaultNoteVisibility); prefer.commit('defaultNoteLocalOnly', store.s.defaultNoteLocalOnly); - // Sharkey migrations - prefer.commit('collapseNotesRepliedTo', store.s.collapseNotesRepliedTo); - prefer.commit('collapseFiles', store.s.collapseFiles); - prefer.commit('uncollapseCW', store.s.uncollapseCW); - prefer.commit('expandLongNote', store.s.expandLongNote); - prefer.commit('like', store.s.like); + + //#region Sharkey migrations prefer.commit('autoloadConversation', store.s.autoloadConversation); - prefer.commit('showVisibilitySelectorOnBoost', store.s.showVisibilitySelectorOnBoost); - prefer.commit('visibilityOnBoost', store.s.visibilityOnBoost); - prefer.commit('trustedDomains', store.s.trustedDomains); - prefer.commit('warnExternalUrl', store.s.warnExternalUrl); - prefer.commit('followingFeed', store.s.followingFeed); - prefer.commit('warnMissingAltText', store.s.warnMissingAltText); + prefer.commit('clickToOpen', store.s.clickToOpen); + prefer.commit('collapseFiles', store.s.collapseFiles); + prefer.commit('collapseNotesRepliedTo', store.s.collapseNotesRepliedTo); prefer.commit('disableCatSpeak', store.s.disableCatSpeak); - prefer.commit('showTickerOnReplies', store.s.showTickerOnReplies); - prefer.commit('searchEngine', store.s.searchEngine); + prefer.commit('enableFaviconNotificationDot', store.s.enableFaviconNotificationDot); + prefer.commit('expandLongNote', store.s.expandLongNote); + prefer.commit('followingFeed', store.s.followingFeed); + prefer.commit('like', store.s.like); prefer.commit('noteDesign', store.s.noteDesign); + prefer.commit('notificationClickable', store.s.notificationClickable); + prefer.commit('numberOfReplies', store.s.numberOfReplies); + prefer.commit('oneko', store.s.oneko); + prefer.commit('searchEngine', store.s.searchEngine); + prefer.commit('showTickerOnReplies', store.s.showTickerOnReplies); + prefer.commit('showVisibilitySelectorOnBoost', store.s.showVisibilitySelectorOnBoost); + prefer.commit('trustedDomains', store.s.trustedDomains); + prefer.commit('uncollapseCW', store.s.uncollapseCW); + prefer.commit('visibilityOnBoost', store.s.visibilityOnBoost); + prefer.commit('warnExternalUrl', store.s.warnExternalUrl); + prefer.commit('warnMissingAltText', store.s.warnMissingAltText); + //#endregion window.setTimeout(() => { unisonReload(); diff --git a/packages/frontend/src/preferences/def.ts b/packages/frontend/src/preferences/def.ts index 110d454df9..063f3b60b8 100644 --- a/packages/frontend/src/preferences/def.ts +++ b/packages/frontend/src/preferences/def.ts @@ -130,54 +130,6 @@ export const PREF_DEF = { collapseRenotes: { default: false, }, - collapseNotesRepliedTo: { - default: false, - }, - collapseFiles: { - default: false, - }, - uncollapseCW: { - default: false, - }, - expandLongNote: { - default: false, - }, - like: { - default: null as string | null, - }, - autoloadConversation: { - default: true, - }, - showVisibilitySelectorOnBoost: { - default: true, - }, - visibilityOnBoost: { - default: 'public' as 'public' | 'home' | 'followers', - }, - trustedDomains: { - default: [] as string[], - }, - warnExternalUrl: { - default: true, - }, - followingFeed: { - default: defaultFollowingFeedState as Partial, - }, - warnMissingAltText: { - default: true, - }, - disableCatSpeak: { - default: false, - }, - showTickerOnReplies: { - default: false, - }, - searchEngine: { - default: Object.keys(searchEngineMap)[0], - }, - noteDesign: { - default: 'sharkey' as 'sharkey' | 'misskey', - }, menu: { default: [ 'notifications', @@ -452,4 +404,70 @@ export const PREF_DEF = { 'experimental.stackingRouterView': { default: false, }, + + //#region Sharkey + autoloadConversation: { + default: true, + }, + clickToOpen: { + default: true, + }, + collapseFiles: { + default: false, + }, + collapseNotesRepliedTo: { + default: false, + }, + disableCatSpeak: { + default: false, + }, + enableFaviconNotificationDot: { + default: true, + }, + expandLongNote: { + default: false, + }, + followingFeed: { + default: defaultFollowingFeedState as Partial, + }, + like: { + default: null as string | null, + }, + noteDesign: { + default: 'sharkey' as 'sharkey' | 'misskey', + }, + notificationClickable: { + default: false, + }, + numberOfReplies: { + default: 5, + }, + oneko: { + default: false, + }, + searchEngine: { + default: Object.keys(searchEngineMap)[0], + }, + showTickerOnReplies: { + default: false, + }, + showVisibilitySelectorOnBoost: { + default: true, + }, + trustedDomains: { + default: [] as string[], + }, + uncollapseCW: { + default: false, + }, + visibilityOnBoost: { + default: 'public' as 'public' | 'home' | 'followers', + }, + warnExternalUrl: { + default: true, + }, + warnMissingAltText: { + default: true, + }, + //#endregion } satisfies PreferencesDefinition; diff --git a/packages/frontend/src/store.ts b/packages/frontend/src/store.ts index 245833fb43..32acaeaf99 100644 --- a/packages/frontend/src/store.ts +++ b/packages/frontend/src/store.ts @@ -470,95 +470,94 @@ export const store = markRaw(new Pizzax('base', { sfxVolume: 1, }, }, - collapseNotesRepliedTo: { + //#endregion + + //#region Sharkey + autoloadConversation: { + where: 'account', + default: true, + }, + clickToOpen: { where: 'device', - default: false, + default: true, }, collapseFiles: { - where: 'device', + where: 'account', default: false, }, - uncollapseCW: { - where: 'device', + collapseNotesRepliedTo: { + where: 'account', default: false, }, - expandLongNote: { - where: 'device', - default: false, - }, - like: { - where: 'device', - default: null as string | null, - }, - autoloadConversation: { - where: 'device', - default: true, - }, - showVisibilitySelectorOnBoost: { - where: 'device', - default: true, - }, - visibilityOnBoost: { - where: 'device', - default: 'public' as 'public' | 'home' | 'followers', - }, - trustedDomains: { - where: 'device', - default: [] as string[], - }, - warnExternalUrl: { - where: 'device', - default: true, - }, - followingFeed: { - where: 'device', - default: defaultFollowingFeedState as Partial, - }, - warnMissingAltText: { - where: 'device', - default: true, - }, disableCatSpeak: { - where: 'device', - default: false, - }, - showTickerOnReplies: { - where: 'device', - default: false, - }, - searchEngine: { - where: 'device', - default: Object.keys(searchEngineMap)[0], - }, - noteDesign: { - where: 'device', - default: 'sharkey' as 'sharkey' | 'misskey', - }, - //#endregion - oneko: { - where: 'device', + where: 'account', default: false, }, enableFaviconNotificationDot: { where: 'device', default: true, }, - numberOfReplies: { + expandLongNote: { where: 'device', - default: 5, + default: false, + }, + followingFeed: { + where: 'account', + default: defaultFollowingFeedState as Partial, + }, + like: { + where: 'account', + default: null as string | null, + }, + noteDesign: { + where: 'device', + default: 'sharkey' as 'sharkey' | 'misskey', }, notificationClickable: { where: 'device', default: false, }, - cornerRadius: { + numberOfReplies: { where: 'device', - default: null as 'Misskey' | null, + default: 5, }, - clickToOpen: { + oneko: { + where: 'device', + default: false, + }, + searchEngine: { + where: 'account', + default: Object.keys(searchEngineMap)[0], + }, + showTickerOnReplies: { + where: 'device', + default: false, + }, + showVisibilitySelectorOnBoost: { + where: 'account', + default: true, + }, + trustedDomains: { + where: 'account', + default: [] as string[], + }, + uncollapseCW: { + where: 'account', + default: false, + }, + visibilityOnBoost: { + where: 'account', + default: 'public' as 'public' | 'home' | 'followers', + }, + warnExternalUrl: { + where: 'account', + default: true, + }, + warnMissingAltText: { where: 'device', default: true, }, + //#endregion })); // TODO: 他のタブと永続化されたstateを同期