From ac89ec72a8e946acc780155d7953051bdc5b90d0 Mon Sep 17 00:00:00 2001 From: syuilo <4439005+syuilo@users.noreply.github.com> Date: Sun, 1 Sep 2024 08:44:55 +0900 Subject: [PATCH 01/18] wip (cherry picked from commit aab1c769814b08c257cad3025422a0eea3bfba4f) --- .../src/components/EmInstanceTicker.vue | 2 +- packages/frontend-shared/js/const.ts | 4 -- packages/frontend/src/boot/common.ts | 33 ++++++++-------- packages/frontend/src/boot/main-boot.ts | 5 ++- .../frontend/src/components/MkChannelList.vue | 6 ++- .../src/components/MkCropperDialog.vue | 7 ++-- .../src/components/MkDonation.stories.impl.ts | 2 +- .../frontend/src/components/MkDonation.vue | 6 ++- .../src/components/MkFeaturedPhotos.vue | 5 ++- .../src/components/MkForgotPassword.vue | 7 ++-- .../frontend/src/components/MkFormDialog.vue | 5 ++- .../src/components/MkInstanceCardMini.vue | 7 ++-- .../src/components/MkInstanceTicker.vue | 10 ++--- packages/frontend/src/components/MkLink.vue | 7 ++-- .../frontend/src/components/MkMediaImage.vue | 7 ++-- .../frontend/src/components/MkMention.vue | 7 ++-- packages/frontend/src/components/MkNote.vue | 9 +++-- .../src/components/MkNoteDetailed.vue | 9 +++-- packages/frontend/src/components/MkNotes.vue | 5 ++- .../src/components/MkNotification.vue | 3 +- .../src/components/MkNotifications.vue | 7 ++-- .../frontend/src/components/MkPagination.vue | 5 ++- .../frontend/src/components/MkPostForm.vue | 5 ++- .../MkPushNotificationAllowButton.vue | 11 +++--- .../src/components/MkSignupDialog.form.vue | 29 +++++++------- .../MkSignupDialog.rules.stories.impl.ts | 2 +- .../src/components/MkSignupDialog.rules.vue | 19 +++++----- .../components/MkSourceCodeAvailablePopup.vue | 8 ++-- .../frontend/src/components/MkTimeline.vue | 5 ++- .../src/components/MkTutorialDialog.vue | 7 ++-- .../frontend/src/components/MkUserInfo.vue | 6 ++- .../frontend/src/components/MkUserList.vue | 6 ++- .../frontend/src/components/MkUserPopup.vue | 10 +++-- .../src/components/MkUserSetupDialog.vue | 10 ++--- .../src/components/MkVisitorDashboard.vue | 16 ++++---- .../frontend/src/components/global/MkAd.vue | 9 +++-- .../src/components/global/MkAvatar.vue | 9 +++-- .../src/components/global/MkCustomEmoji.vue | 7 ++-- .../src/components/global/MkError.vue | 6 ++- .../frontend/src/components/global/MkUrl.vue | 7 ++-- .../src/components/page/page.text.vue | 7 ++-- packages/frontend/src/local-storage.ts | 1 - packages/frontend/src/pages/_error_.vue | 7 ++-- packages/frontend/src/pages/about-misskey.vue | 15 ++++---- .../frontend/src/pages/about.overview.vue | 38 ++++++++++--------- .../src/pages/admin/bot-protection.vue | 4 +- .../frontend/src/pages/admin/branding.vue | 4 +- .../src/pages/admin/email-settings.vue | 7 ++-- .../src/pages/admin/external-services.vue | 4 +- packages/frontend/src/pages/admin/index.vue | 17 +++++---- .../src/pages/admin/instance-block.vue | 4 +- .../frontend/src/pages/admin/moderation.vue | 4 +- .../src/pages/admin/object-storage.vue | 4 +- .../src/pages/admin/other-settings.vue | 4 +- .../src/pages/admin/proxy-account.vue | 4 +- .../frontend/src/pages/admin/roles.editor.vue | 7 ++-- .../frontend/src/pages/admin/roles.role.vue | 5 ++- packages/frontend/src/pages/admin/roles.vue | 4 +- .../frontend/src/pages/admin/security.vue | 4 +- .../frontend/src/pages/admin/server-rules.vue | 10 +++-- .../frontend/src/pages/admin/settings.vue | 10 +++-- packages/frontend/src/pages/ads.vue | 6 ++- packages/frontend/src/pages/contact.vue | 16 ++++---- .../frontend/src/pages/drive.file.info.vue | 5 ++- packages/frontend/src/pages/favorites.vue | 5 ++- .../frontend/src/pages/follow-requests.vue | 5 ++- packages/frontend/src/pages/instance-info.vue | 7 ++-- packages/frontend/src/pages/invite.vue | 13 ++++--- packages/frontend/src/pages/list.vue | 7 ++-- .../frontend/src/pages/my-antennas/index.vue | 5 ++- .../frontend/src/pages/my-lists/index.vue | 5 ++- packages/frontend/src/pages/not-found.vue | 7 ++-- packages/frontend/src/pages/page.vue | 9 +++-- packages/frontend/src/pages/role.vue | 9 +++-- packages/frontend/src/pages/search.note.vue | 9 +++-- packages/frontend/src/pages/search.vue | 8 ++-- packages/frontend/src/pages/settings/apps.vue | 5 ++- .../frontend/src/pages/settings/email.vue | 9 +++-- .../frontend/src/pages/settings/index.vue | 5 ++- .../src/pages/settings/mute-block.vue | 9 +++-- .../frontend/src/pages/settings/theme.vue | 9 +++-- packages/frontend/src/pages/timeline.vue | 18 +++++---- packages/frontend/src/pages/user/home.vue | 12 +++--- .../frontend/src/pages/user/index.files.vue | 7 ++-- .../frontend/src/pages/welcome.entrance.a.vue | 11 +++--- packages/frontend/src/pages/welcome.vue | 4 +- .../frontend/src/scripts/check-permissions.ts | 18 ++++----- packages/frontend/src/scripts/clear-cache.ts | 4 +- .../frontend/src/scripts/get-note-menu.ts | 21 +++++----- .../frontend/src/scripts/get-user-menu.ts | 6 +-- packages/frontend/src/scripts/upload.ts | 22 +++++------ .../src/{instance.ts => server-metadata.ts} | 34 +++++------------ packages/frontend/src/timelines.ts | 12 +++--- packages/frontend/src/ui/_common_/common.ts | 23 +++++------ .../src/ui/_common_/navbar-for-mobile.vue | 9 +++-- packages/frontend/src/ui/_common_/navbar.vue | 11 +++--- .../src/ui/_common_/statusbar-federation.vue | 9 +++-- packages/frontend/src/ui/classic.header.vue | 7 ++-- packages/frontend/src/ui/classic.sidebar.vue | 7 ++-- packages/frontend/src/ui/deck/tl-column.vue | 7 ++-- packages/frontend/src/ui/visitor.vue | 9 +++-- .../src/widgets/WidgetBirthdayFollowings.vue | 5 ++- .../frontend/src/widgets/WidgetFederation.vue | 9 +++-- .../src/widgets/WidgetInstanceCloud.vue | 9 +++-- .../src/widgets/WidgetInstanceInfo.vue | 10 +++-- .../frontend/src/widgets/WidgetPhotos.vue | 7 ++-- packages/frontend/src/widgets/WidgetRss.vue | 5 ++- .../frontend/src/widgets/WidgetTimeline.vue | 8 ++-- 108 files changed, 512 insertions(+), 439 deletions(-) rename packages/frontend/src/{instance.ts => server-metadata.ts} (51%) diff --git a/packages/frontend-embed/src/components/EmInstanceTicker.vue b/packages/frontend-embed/src/components/EmInstanceTicker.vue index eeeaee528e..480b77a30c 100644 --- a/packages/frontend-embed/src/components/EmInstanceTicker.vue +++ b/packages/frontend-embed/src/components/EmInstanceTicker.vue @@ -19,7 +19,7 @@ const serverMetadata = inject(DI.serverMetadata)!; const mediaProxy = inject(DI.mediaProxy)!; const props = defineProps<{ - instance?: { + instance: { faviconUrl?: string | null name?: string | null themeColor?: string | null diff --git a/packages/frontend-shared/js/const.ts b/packages/frontend-shared/js/const.ts index 8391fb638c..7f56f673c4 100644 --- a/packages/frontend-shared/js/const.ts +++ b/packages/frontend-shared/js/const.ts @@ -106,10 +106,6 @@ export const ROLE_POLICIES = [ export const CURRENT_STICKY_TOP = 'CURRENT_STICKY_TOP'; export const CURRENT_STICKY_BOTTOM = 'CURRENT_STICKY_BOTTOM'; -export const DEFAULT_SERVER_ERROR_IMAGE_URL = 'https://xn--931a.moe/assets/error.jpg'; -export const DEFAULT_NOT_FOUND_IMAGE_URL = 'https://xn--931a.moe/assets/not-found.jpg'; -export const DEFAULT_INFO_IMAGE_URL = 'https://xn--931a.moe/assets/info.jpg'; - export const MFM_TAGS = ['tada', 'jelly', 'twitch', 'shake', 'spin', 'jump', 'bounce', 'flip', 'x2', 'x3', 'x4', 'scale', 'position', 'fg', 'bg', 'border', 'font', 'blur', 'rainbow', 'sparkle', 'rotate', 'ruby', 'unixtime']; export const MFM_PARAMS: Record = { tada: ['speed=', 'delay='], diff --git a/packages/frontend/src/boot/common.ts b/packages/frontend/src/boot/common.ts index 287788bc8e..e631e0f922 100644 --- a/packages/frontend/src/boot/common.ts +++ b/packages/frontend/src/boot/common.ts @@ -5,16 +5,17 @@ import { computed, watch, version as vueVersion, App } from 'vue'; import { compareVersions } from 'compare-versions'; +import { MediaProxy } from '@@/js/media-proxy.js'; import widgets from '@/widgets/index.js'; import directives from '@/directives/index.js'; import components from '@/components/index.js'; -import { version, lang, updateLocale, locale } from '@@/js/config.js'; +import { version, lang, updateLocale, locale, url } from '@@/js/config.js'; import { applyTheme } from '@/scripts/theme.js'; import { isDeviceDarkmode } from '@/scripts/is-device-darkmode.js'; import { updateI18n } from '@/i18n.js'; import { $i, refreshAccount, login } from '@/account.js'; import { defaultStore, ColdDeviceStorage } from '@/store.js'; -import { fetchInstance, instance } from '@/instance.js'; +import { fetchServerMetadata } from '@/server-metadata.js'; import { deviceKind } from '@/scripts/device-kind.js'; import { reloadChannel } from '@/scripts/unison-reload.js'; import { getUrlWithoutLoginId } from '@/scripts/login-id.js'; @@ -119,11 +120,7 @@ export async function common(createVue: () => App) { await defaultStore.ready; await deckStore.ready; - const fetchInstanceMetaPromise = fetchInstance(); - - fetchInstanceMetaPromise.then(() => { - miLocalStorage.setItem('v', instance.version); - }); + const serverMetadata = await fetchServerMetadata(); //#region loginId const params = new URLSearchParams(location.search); @@ -178,19 +175,17 @@ export async function common(createVue: () => App) { }); //#endregion - fetchInstanceMetaPromise.then(() => { - if (defaultStore.state.themeInitial) { - if (instance.defaultLightTheme != null) ColdDeviceStorage.set('lightTheme', JSON.parse(instance.defaultLightTheme)); - if (instance.defaultDarkTheme != null) ColdDeviceStorage.set('darkTheme', JSON.parse(instance.defaultDarkTheme)); - defaultStore.set('themeInitial', false); + if (defaultStore.state.themeInitial) { + if (serverMetadata.defaultLightTheme != null) ColdDeviceStorage.set('lightTheme', JSON.parse(serverMetadata.defaultLightTheme)); + if (serverMetadata.defaultDarkTheme != null) ColdDeviceStorage.set('darkTheme', JSON.parse(serverMetadata.defaultDarkTheme)); + defaultStore.set('themeInitial', false); + } else { + if (defaultStore.state.darkMode) { + applyTheme(darkTheme.value); } else { - if (defaultStore.state.darkMode) { - applyTheme(darkTheme.value); - } else { - applyTheme(lightTheme.value); - } + applyTheme(lightTheme.value); } - }); + } watch(defaultStore.reactiveState.useBlurEffectForModal, v => { document.documentElement.style.setProperty('--modalBgFilter', v ? 'blur(4px)' : 'none'); @@ -239,6 +234,8 @@ export async function common(createVue: () => App) { } catch (err) { /* empty */ } const app = createVue(); + app.provide('serverMetadata', serverMetadata); + app.provide('mediaProxy', new MediaProxy(serverMetadata, url)); setupRouter(app, createMainRouter); diff --git a/packages/frontend/src/boot/main-boot.ts b/packages/frontend/src/boot/main-boot.ts index ddd47ca448..3789f895fc 100644 --- a/packages/frontend/src/boot/main-boot.ts +++ b/packages/frontend/src/boot/main-boot.ts @@ -12,7 +12,6 @@ import { alert, confirm, popup, post, toast } from '@/os.js'; import { useStream } from '@/stream.js'; import * as sound from '@/scripts/sound.js'; import { $i, signout, updateAccount } from '@/account.js'; -import { instance } from '@/instance.js'; import { ColdDeviceStorage, defaultStore } from '@/store.js'; import { reactionPicker } from '@/scripts/reaction-picker.js'; import { miLocalStorage } from '@/local-storage.js'; @@ -23,6 +22,7 @@ import { emojiPicker } from '@/scripts/emoji-picker.js'; import { mainRouter } from '@/router/main.js'; import { type Keymap, makeHotkey } from '@/scripts/hotkey.js'; import { addCustomEmoji, removeCustomEmojis, updateCustomEmojis } from '@/custom-emojis.js'; +import { fetchServerMetadata } from '@/server-metadata.js'; export async function mainBoot() { const { isClientUpdated } = await common(() => createApp( @@ -267,8 +267,9 @@ export async function mainBoot() { } } + const serverMetadata = await fetchServerMetadata(); const modifiedVersionMustProminentlyOfferInAgplV3Section13Read = miLocalStorage.getItem('modifiedVersionMustProminentlyOfferInAgplV3Section13Read'); - if (modifiedVersionMustProminentlyOfferInAgplV3Section13Read !== 'true' && instance.repositoryUrl !== 'https://github.com/misskey-dev/misskey') { + if (modifiedVersionMustProminentlyOfferInAgplV3Section13Read !== 'true' && serverMetadata.repositoryUrl !== 'https://github.com/misskey-dev/misskey') { const { dispose } = popup(defineAsyncComponent(() => import('@/components/MkSourceCodeAvailablePopup.vue')), {}, { closed: () => dispose(), }); diff --git a/packages/frontend/src/components/MkChannelList.vue b/packages/frontend/src/components/MkChannelList.vue index 2850ecca16..725bdc53e0 100644 --- a/packages/frontend/src/components/MkChannelList.vue +++ b/packages/frontend/src/components/MkChannelList.vue @@ -7,7 +7,7 @@ SPDX-License-Identifier: AGPL-3.0-only @@ -19,10 +19,12 @@ SPDX-License-Identifier: AGPL-3.0-only