diff --git a/app/composables/usePublicHomeLayout.ts b/app/composables/usePublicHomeLayout.ts index 33e6fd7..0503c0b 100644 --- a/app/composables/usePublicHomeLayout.ts +++ b/app/composables/usePublicHomeLayout.ts @@ -2,10 +2,6 @@ import type { InjectionKey, Ref } from 'vue' export type PublicHomeLayoutMode = 'showcase' | 'detailed' -export function publicHomeLayoutStorageKey(slug: string) { - return `public-home-layout:${slug}` -} - /** 由 `layouts/public.vue` provide,公开主页 `inject` 读取 */ export const publicHomeLayoutModeKey: InjectionKey> = Symbol('publicHomeLayoutMode') diff --git a/app/layouts/public.vue b/app/layouts/public.vue index 70db257..38dbb92 100644 --- a/app/layouts/public.vue +++ b/app/layouts/public.vue @@ -2,7 +2,6 @@ import { useAuthSession } from '../composables/useAuthSession' import { publicHomeLayoutModeKey, - publicHomeLayoutStorageKey, type PublicHomeLayoutMode, } from '../composables/usePublicHomeLayout' import { unwrapApiBody, type ApiResponse } from '../utils/http/factory' @@ -50,35 +49,41 @@ const headerBrandIconUrl = computed(() => profileSlug.value ? publicHomeHeader.value?.iconUrl ?? null : null, ) +type LayoutBySlug = Record + +const layoutBySlug = useCookie('public_home_layout', { + default: () => ({}), + maxAge: 60 * 60 * 24 * 400, + sameSite: 'lax', +}) + +function cookieModeForSlug(slug: string): PublicHomeLayoutMode { + const m = layoutBySlug.value[slug] + return m === 'detailed' || m === 'showcase' ? m : 'showcase' +} + const publicLayoutMode = ref('showcase') provide(publicHomeLayoutModeKey, publicLayoutMode) -function syncModeFromStorage() { - if (!import.meta.client) { - return - } +function syncModeFromCookie() { if (!showPublicLayoutToggle.value || !profileSlug.value) { return } - const raw = localStorage.getItem(publicHomeLayoutStorageKey(profileSlug.value)) - publicLayoutMode.value = raw === 'detailed' || raw === 'showcase' ? raw : 'showcase' + publicLayoutMode.value = cookieModeForSlug(profileSlug.value) } -onMounted(() => { - refresh().catch(() => {}) - syncModeFromStorage() -}) - -watch([profileSlug, showPublicLayoutToggle], syncModeFromStorage) +syncModeFromCookie() +watch([profileSlug, showPublicLayoutToggle, layoutBySlug], syncModeFromCookie) watch(publicLayoutMode, (m) => { - if (!import.meta.client) { - return - } if (!showPublicLayoutToggle.value || !profileSlug.value) { return } - localStorage.setItem(publicHomeLayoutStorageKey(profileSlug.value), m) + layoutBySlug.value = { ...layoutBySlug.value, [profileSlug.value]: m } +}) + +onMounted(() => { + refresh().catch(() => {}) }) diff --git a/app/pages/me/index.vue b/app/pages/me/index.vue index db0507c..34a8d01 100644 --- a/app/pages/me/index.vue +++ b/app/pages/me/index.vue @@ -69,17 +69,6 @@ onMounted(async () => {
- 文章媒体清理 -
-

- 孤儿图片审查与清理 -

- - 打开 - -
- -
时光机
@@ -113,9 +102,20 @@ onMounted(async () => { 打开
+ +
+ 文章媒体清理 +
+

+ 孤儿图片审查与清理 +

+ + 打开 + +
- 媒体存储校验 + 文章媒体存储校验

磁盘与 media_assets 一致性 diff --git a/packages/drizzle-pkg/db.sqlite b/packages/drizzle-pkg/db.sqlite index cf29ea9..ca5e6ac 100644 Binary files a/packages/drizzle-pkg/db.sqlite and b/packages/drizzle-pkg/db.sqlite differ