summaryrefslogtreecommitdiff
path: root/packages/frontend/src/pages
diff options
context:
space:
mode:
authorHazelnoot <acomputerdog@gmail.com>2025-03-31 14:53:02 -0400
committerHazelnoot <acomputerdog@gmail.com>2025-03-31 14:53:02 -0400
commitc371af34e877845e01cd92683aca0ff3334e314a (patch)
treee34c80fc5c134a87f6ce01cbd93d6163c08c0a7d /packages/frontend/src/pages
parentregenerate misskey-js (diff)
downloadsharkey-c371af34e877845e01cd92683aca0ff3334e314a.tar.gz
sharkey-c371af34e877845e01cd92683aca0ff3334e314a.tar.bz2
sharkey-c371af34e877845e01cd92683aca0ff3334e314a.zip
copy sharkey settings into new frontend preferences model
Diffstat (limited to 'packages/frontend/src/pages')
-rw-r--r--packages/frontend/src/pages/about-sharkey.vue25
-rw-r--r--packages/frontend/src/pages/admin/users.vue2
-rw-r--r--packages/frontend/src/pages/channel.vue10
-rw-r--r--packages/frontend/src/pages/favorites.vue11
-rw-r--r--packages/frontend/src/pages/note.vue3
-rw-r--r--packages/frontend/src/pages/settings/preferences.vue10
-rw-r--r--packages/frontend/src/pages/settings/profile.vue12
-rw-r--r--packages/frontend/src/pages/user-list-timeline.vue13
-rw-r--r--packages/frontend/src/pages/user/home.vue13
-rw-r--r--packages/frontend/src/pages/user/index.timeline.vue12
10 files changed, 47 insertions, 64 deletions
diff --git a/packages/frontend/src/pages/about-sharkey.vue b/packages/frontend/src/pages/about-sharkey.vue
index 23e75ed7f1..833aed2c89 100644
--- a/packages/frontend/src/pages/about-sharkey.vue
+++ b/packages/frontend/src/pages/about-sharkey.vue
@@ -30,7 +30,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<FormSection v-if="instance.repositoryUrl !== 'https://activitypub.software/TransFem-org/Sharkey/'">
<div class="_gaps_s">
<MkInfo>
- {{ i18n.tsx._aboutMisskey.thisIsModifiedVersion({ name: instance.name }) }}
+ {{ i18n.tsx._aboutMisskey.thisIsModifiedVersion({ name: instance.name ?? '' }) }}
</MkInfo>
<FormLink v-if="instance.repositoryUrl" :to="instance.repositoryUrl" external>
<template #icon><i class="ti ti-code"></i></template>
@@ -91,7 +91,7 @@ SPDX-License-Identifier: AGPL-3.0-only
</template>
<script lang="ts" setup>
-import { nextTick, onBeforeUnmount, ref, shallowRef, computed } from 'vue';
+import { nextTick, onBeforeUnmount, ref, computed, useTemplateRef } from 'vue';
import { version } from '@@/js/config.js';
import FormLink from '@/components/form/link.vue';
import FormSection from '@/components/form/section.vue';
@@ -101,12 +101,12 @@ import MkInfo from '@/components/MkInfo.vue';
import { physics } from '@/utility/physics.js';
import { i18n } from '@/i18n.js';
import { instance } from '@/instance.js';
-import { defaultStore } from '@/store.js';
import * as os from '@/os.js';
import { misskeyApi } from '@/utility/misskey-api.js';
-import { definePageMetadata } from '@/utility/page-metadata.js';
import { claimAchievement, claimedAchievements } from '@/utility/achievements.js';
-import { $i } from '@/account.js';
+import { $i } from '@/i';
+import { definePage } from '@/page';
+import { store } from '@/store.js';
type Section = {
heading: string,
@@ -124,8 +124,13 @@ type Section = {
const thereIsTreasure = ref($i && !claimedAchievements.includes('foundTreasure'));
let easterEggReady = false;
-const easterEggEmojis = ref([]);
-const easterEggEngine = ref(null);
+const easterEggEmojis = ref<{
+ id: string,
+ top: number,
+ left: number,
+ emoji: string
+}[]>([]);
+const easterEggEngine = ref<{ stop: () => void } | null>(null);
const everyone = ref<Section[]>([
{
heading: i18n.ts._aboutMisskey.projectMembers,
@@ -262,7 +267,7 @@ const everyone = ref<Section[]>([
],
},
]);
-const containerEl = shallowRef<HTMLElement>();
+const containerEl = useTemplateRef('containerEl');
await misskeyApi('sponsors', { forceUpdate: false }).then((res) => {
const section: Section = {
@@ -293,7 +298,7 @@ function fisher_yates<T>(array: T[]): T[] {
}
function iconLoaded() {
- const emojis = defaultStore.state.reactions;
+ const emojis = store.s.reactions;
const containerWidth = containerEl.value.offsetWidth;
for (let i = 0; i < 32; i++) {
easterEggEmojis.value.push({
@@ -337,7 +342,7 @@ const headerActions = computed(() => []);
const headerTabs = computed(() => []);
-definePageMetadata(() => ({
+definePage(() => ({
title: i18n.ts.aboutMisskey,
icon: null,
}));
diff --git a/packages/frontend/src/pages/admin/users.vue b/packages/frontend/src/pages/admin/users.vue
index e33ec8a1e6..3b95b78c72 100644
--- a/packages/frontend/src/pages/admin/users.vue
+++ b/packages/frontend/src/pages/admin/users.vue
@@ -63,7 +63,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<script lang="ts" setup>
import { computed, useTemplateRef, ref, watchEffect } from 'vue';
import XHeader from './_header_.vue';
-import { defaultMemoryStorage } from '@/memory-storage';
+import { defaultMemoryStorage } from '@/memory-storage.js';
import MkButton from '@/components/MkButton.vue';
import MkInput from '@/components/MkInput.vue';
import MkSelect from '@/components/MkSelect.vue';
diff --git a/packages/frontend/src/pages/channel.vue b/packages/frontend/src/pages/channel.vue
index 303558a621..f08c9c8916 100644
--- a/packages/frontend/src/pages/channel.vue
+++ b/packages/frontend/src/pages/channel.vue
@@ -100,6 +100,7 @@ import { notesSearchAvailable } from '@/utility/check-permissions.js';
import { miLocalStorage } from '@/local-storage.js';
import { useRouter } from '@/router.js';
import { deepMerge } from '@/utility/merge.js';
+import { store } from '@/store.js';
const router = useRouter();
@@ -122,12 +123,12 @@ const featuredPagination = computed(() => ({
},
}));
const withRenotes = computed<boolean>({
- get: () => defaultStore.reactiveState.tl.value.filter.withRenotes,
+ get: () => store.r.tl.value.filter.withRenotes,
set: (x) => saveTlFilter('withRenotes', x),
});
const onlyFiles = computed<boolean>({
- get: () => defaultStore.reactiveState.tl.value.filter.onlyFiles,
+ get: () => store.r.tl.value.filter.onlyFiles,
set: (x) => saveTlFilter('onlyFiles', x),
});
@@ -150,10 +151,9 @@ watch(() => props.channelId, async () => {
}
}, { immediate: true });
-function saveTlFilter(key: keyof typeof defaultStore.state.tl.filter, newValue: boolean) {
+function saveTlFilter(key: keyof typeof store.s.tl.filter, newValue: boolean) {
if (key !== 'withReplies' || $i) {
- const out = deepMerge({ filter: { [key]: newValue } }, defaultStore.state.tl);
- defaultStore.set('tl', out);
+ store.r.tl.value = deepMerge({ filter: { [key]: newValue } }, store.s.tl);
}
}
diff --git a/packages/frontend/src/pages/favorites.vue b/packages/frontend/src/pages/favorites.vue
index 456f7800f7..b9f1cbf38e 100644
--- a/packages/frontend/src/pages/favorites.vue
+++ b/packages/frontend/src/pages/favorites.vue
@@ -16,7 +16,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<template #default="{ items }">
<MkDateSeparatedList v-slot="{ item }" :items="items" :direction="'down'" :noGap="false" :ad="false">
- <MkNote :key="item.id" :note="item.note" :class="$style.note"/>
+ <DynamicNote :key="item.id" :note="item.note" :class="$style.note"/>
</MkDateSeparatedList>
</template>
</MkPagination>
@@ -27,17 +27,10 @@ SPDX-License-Identifier: AGPL-3.0-only
<script lang="ts" setup>
import MkPagination from '@/components/MkPagination.vue';
import MkDateSeparatedList from '@/components/MkDateSeparatedList.vue';
-import { defineAsyncComponent } from 'vue';
import { i18n } from '@/i18n.js';
import { definePage } from '@/page.js';
import { infoImageUrl } from '@/instance.js';
-import { defaultStore } from '@/store.js';
-
-const MkNote = defineAsyncComponent(() =>
- (defaultStore.state.noteDesign === 'misskey') ? import('@/components/MkNote.vue') :
- (defaultStore.state.noteDesign === 'sharkey') ? import('@/components/SkNote.vue') :
- null
-);
+import DynamicNote from '@/components/DynamicNote.vue';
const pagination = {
endpoint: 'i/favorites' as const,
diff --git a/packages/frontend/src/pages/note.vue b/packages/frontend/src/pages/note.vue
index dece69bfc8..cd3da94375 100644
--- a/packages/frontend/src/pages/note.vue
+++ b/packages/frontend/src/pages/note.vue
@@ -70,8 +70,9 @@ import { $i } from '@/i.js';
// contextは非ログイン状態の情報しかないためログイン時は利用できない
const CTX_NOTE = !$i && assertServerContext(serverContext, 'note') ? serverContext.note : null;
+// TODO DynamicNoteDetailed
const MkNoteDetailed = defineAsyncComponent(() =>
- (defaultStore.state.noteDesign === 'misskey')
+ (prefer.s.noteDesign === 'misskey')
? import('@/components/MkNoteDetailed.vue')
: import('@/components/SkNoteDetailed.vue'),
);
diff --git a/packages/frontend/src/pages/settings/preferences.vue b/packages/frontend/src/pages/settings/preferences.vue
index 9de03ceec5..1b364bdba3 100644
--- a/packages/frontend/src/pages/settings/preferences.vue
+++ b/packages/frontend/src/pages/settings/preferences.vue
@@ -936,15 +936,15 @@ const noteDesign = prefer.model('noteDesign');
const uncollapseCW = prefer.model('uncollapseCW');
const expandLongNote = prefer.model('expandLongNote');
const disableCatSpeak = prefer.model('disableCatSpeak');
-const enableFaviconNotificationDot = prefer.model('enableFaviconNotificationDot');
+const enableFaviconNotificationDot = computed(store.makeGetterSetter('enableFaviconNotificationDot'));
const warnMissingAltText = prefer.model('warnMissingAltText');
-const notificationClickable = prefer.model('notificationClickable');
+const notificationClickable = computed(store.makeGetterSetter('notificationClickable'));
const warnExternalUrl = prefer.model('warnExternalUrl');
const showVisibilitySelectorOnBoost = prefer.model('showVisibilitySelectorOnBoost');
const visibilityOnBoost = prefer.model('visibilityOnBoost');
-const cornerRadius = prefer.model('cornerRadius');
-const oneko = prefer.model('oneko');
-const numberOfReplies = prefer.model('numberOfReplies');
+const cornerRadius = computed(store.makeGetterSetter('cornerRadius'));
+const oneko = computed(store.makeGetterSetter('oneko'));
+const numberOfReplies = computed(store.makeGetterSetter('numberOfReplies'));
const useCustomSearchEngine = computed(() => !Object.keys(searchEngineMap).includes(searchEngine.value));
diff --git a/packages/frontend/src/pages/settings/profile.vue b/packages/frontend/src/pages/settings/profile.vue
index fc2743df0f..cbb0889acf 100644
--- a/packages/frontend/src/pages/settings/profile.vue
+++ b/packages/frontend/src/pages/settings/profile.vue
@@ -7,15 +7,15 @@ SPDX-License-Identifier: AGPL-3.0-only
<SearchMarker path="/settings/profile" :label="i18n.ts.profile" :keywords="['profile']" icon="ti ti-user">
<div class="_gaps_m">
<div class="_panel">
- <div :class="$style.banner" :style="{ backgroundImage: $i.bannerUrl ? `url(${ $i.bannerUrl })` : null }">
+ <div :class="$style.banner" :style="{ backgroundImage: $i.bannerUrl ? `url(${ $i.bannerUrl })` : '' }">
<div :class="$style.bannerEdit">
<SearchMarker :keywords="['banner', 'change', 'remove']">
- <MkButton primary rounded @click="changeOrRemoveBanner">{{ <SearchLabel>{{ i18n.ts._profile.changeBanner }}</SearchLabel> }}</MkButton>
+ <MkButton primary rounded @click="changeOrRemoveBanner"><SearchLabel>{{ i18n.ts._profile.changeBanner }}</SearchLabel></MkButton>
</SearchMarker>
</div>
<div :class="$style.backgroundEdit">
<SearchMarker :keywords="['background', 'change', 'remove']">
- <MkButton primary rounded @click="changeOrRemoveBackground">{{ <SearchLabel>{{ i18n.ts._profile.changeBackground }}</SearchLabel> }}</MkButton>
+ <MkButton primary rounded @click="changeOrRemoveBackground"><SearchLabel>{{ i18n.ts._profile.changeBackground }}</SearchLabel></MkButton>
</SearchMarker>
</div>
</div>
@@ -187,6 +187,7 @@ import { claimAchievement } from '@/utility/achievements.js';
import { store } from '@/store.js';
import MkInfo from '@/components/MkInfo.vue';
import MkTextarea from '@/components/MkTextarea.vue';
+import { globalEvents } from '@/events.js';
const $i = ensureSignin();
@@ -314,7 +315,6 @@ function changeAvatar(ev) {
$i.avatarId = i.avatarId;
$i.avatarUrl = i.avatarUrl;
claimAchievement('profileFilled');
- globalEvents.emit('requestClearPageCache');
});
}
@@ -365,7 +365,6 @@ function changeBackground(ev) {
});
$i.backgroundId = i.backgroundId;
$i.backgroundUrl = i.backgroundUrl;
- globalEvents.emit('requestClearPageCache');
});
}
@@ -382,7 +381,6 @@ function changeOrRemoveAvatar(ev) {
});
$i.avatarId = i.avatarId;
$i.avatarUrl = i.avatarUrl;
- globalEvents.emit('requestClearPageCache');
},
}], ev.currentTarget ?? ev.target);
} else {
@@ -404,7 +402,6 @@ function changeOrRemoveBanner(ev) {
});
$i.bannerId = i.bannerId;
$i.bannerUrl = i.bannerUrl;
- globalEvents.emit('requestClearPageCache');
},
}], ev.currentTarget ?? ev.target);
} else {
@@ -426,7 +423,6 @@ function changeOrRemoveBackground(ev) {
});
$i.backgroundId = i.backgroundId;
$i.backgroundUrl = i.backgroundUrl;
- globalEvents.emit('requestClearPageCache');
},
}], ev.currentTarget ?? ev.target);
} else {
diff --git a/packages/frontend/src/pages/user-list-timeline.vue b/packages/frontend/src/pages/user-list-timeline.vue
index 45fe53328a..754ae2467e 100644
--- a/packages/frontend/src/pages/user-list-timeline.vue
+++ b/packages/frontend/src/pages/user-list-timeline.vue
@@ -33,10 +33,10 @@ import { misskeyApi } from '@/utility/misskey-api.js';
import { definePage } from '@/page.js';
import { i18n } from '@/i18n.js';
import { useRouter } from '@/router.js';
-import { defaultStore } from '@/store.js';
+import { store } from '@/store.js';
import { deepMerge } from '@/utility/merge.js';
import * as os from '@/os.js';
-import { $i } from '@/account.js';
+import { $i } from '@/i.js';
const router = useRouter();
@@ -50,19 +50,18 @@ const tlEl = useTemplateRef('tlEl');
const rootEl = useTemplateRef('rootEl');
const withRenotes = computed<boolean>({
- get: () => defaultStore.reactiveState.tl.value.filter.withRenotes,
+ get: () => store.r.tl.value.filter.withRenotes,
set: (x) => saveTlFilter('withRenotes', x),
});
const onlyFiles = computed<boolean>({
- get: () => defaultStore.reactiveState.tl.value.filter.onlyFiles,
+ get: () => store.r.tl.value.filter.onlyFiles,
set: (x) => saveTlFilter('onlyFiles', x),
});
-function saveTlFilter(key: keyof typeof defaultStore.state.tl.filter, newValue: boolean) {
+function saveTlFilter(key: keyof typeof store.s.tl.filter, newValue: boolean) {
if (key !== 'withReplies' || $i) {
- const out = deepMerge({ filter: { [key]: newValue } }, defaultStore.state.tl);
- defaultStore.set('tl', out);
+ store.r.tl.value = deepMerge({ filter: { [key]: newValue } }, store.s.tl);
}
}
diff --git a/packages/frontend/src/pages/user/home.vue b/packages/frontend/src/pages/user/home.vue
index 802de9778c..9f2b3f3585 100644
--- a/packages/frontend/src/pages/user/home.vue
+++ b/packages/frontend/src/pages/user/home.vue
@@ -175,7 +175,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<div>{{ i18n.ts.noNotes }}</div>
</div>
<div v-else class="_panel">
- <MkNote v-for="note of user.pinnedNotes" :key="note.id" class="note" :class="$style.pinnedNote" :note="note" :pinned="true"/>
+ <DynamicNote v-for="note of user.pinnedNotes" :key="note.id" class="note" :class="$style.pinnedNote" :note="note" :pinned="true"/>
</div>
</div>
<MkNotes v-else :class="$style.tl" :noGap="true" :pagination="AllPagination"/>
@@ -221,12 +221,7 @@ import { getStaticImageUrl } from '@/utility/media-proxy.js';
import { infoImageUrl } from '@/instance.js';
import MkSparkle from '@/components/MkSparkle.vue';
import { prefer } from '@/preferences.js';
-
-const MkNote = defineAsyncComponent(() =>
- defaultStore.state.noteDesign === 'sharkey'
- ? import('@/components/SkNote.vue')
- : import('@/components/MkNote.vue'),
-);
+import DynamicNote from '@/components/DynamicNote.vue';
function calcAge(birthdate: string): number {
const date = new Date(birthdate);
@@ -277,7 +272,7 @@ const listenbrainzdata = ref(false);
if (props.user.listenbrainz) {
(async function() {
try {
- const response = await fetch(`https://api.listenbrainz.org/1/user/${props.user.listenbrainz}/playing-now`, {
+ const response = await window.fetch(`https://api.listenbrainz.org/1/user/${props.user.listenbrainz}/playing-now`, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
@@ -295,7 +290,7 @@ if (props.user.listenbrainz) {
const background = computed(() => {
if (props.user.backgroundUrl == null) return {};
- if (defaultStore.state.disableShowingAnimatedImages) {
+ if (prefer.s.disableShowingAnimatedImages) {
return {
'--backgroundImageStatic': `url('${getStaticImageUrl(props.user.backgroundUrl)}')`,
};
diff --git a/packages/frontend/src/pages/user/index.timeline.vue b/packages/frontend/src/pages/user/index.timeline.vue
index 3aa9b10214..eebdebc8e4 100644
--- a/packages/frontend/src/pages/user/index.timeline.vue
+++ b/packages/frontend/src/pages/user/index.timeline.vue
@@ -20,7 +20,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<div>{{ i18n.ts.noNotes }}</div>
</div>
<div v-else class="_panel">
- <MkNote v-for="note of user.pinnedNotes" :key="note.id" class="note" :class="$style.pinnedNote" :note="note" :pinned="true"/>
+ <DynamicNote v-for="note of user.pinnedNotes" :key="note.id" class="note" :class="$style.pinnedNote" :note="note" :pinned="true"/>
</div>
</div>
<MkNotes v-else :noGap="true" :pagination="pagination" :class="$style.tl"/>
@@ -28,19 +28,13 @@ SPDX-License-Identifier: AGPL-3.0-only
</template>
<script lang="ts" setup>
-import { ref, computed, defineAsyncComponent } from 'vue';
+import { ref, computed } from 'vue';
import * as Misskey from 'misskey-js';
import MkNotes from '@/components/MkNotes.vue';
import MkTab from '@/components/MkTab.vue';
import { i18n } from '@/i18n.js';
import { infoImageUrl } from '@/instance.js';
-import { defaultStore } from '@/store.js';
-
-const MkNote = defineAsyncComponent(() =>
- defaultStore.state.noteDesign === 'sharkey'
- ? import('@/components/SkNote.vue')
- : import('@/components/MkNote.vue'),
-);
+import DynamicNote from '@/components/DynamicNote.vue';
const props = defineProps<{
user: Misskey.entities.UserDetailed;