This commit is contained in:
toom1996
2026-09-13 21:39:50 +08:00
parent c85c561a99
commit d6cb616337
24 changed files with 1076 additions and 813 deletions

View File

@ -181,7 +181,8 @@ const browseLabel = t("browse the archive")
</style>
<script>
import { getUser, toAbs } from "@/lib/api"
import { toAbs } from "@/lib/api"
import { getUser } from "@/lib/auth"
import { getFavorites, removeFavorite, fetchFavoritesPage } from "@/lib/favorites"
import { fetchHistoryPage, removeHistory, clearHistory } from "@/lib/history"
import { clientHref, ROUTES } from "@/lib/routes"

View File

@ -73,8 +73,8 @@ const savedLabel = t("saved")
{/* 注意:不能用 define:vars 传 meta —— 它会把脚本包成内联 IIFE 并把 import 塞进函数体内,
导致 SyntaxError(import 只能在模块顶层)。故改由 data-* 属性透传,脚本自行读取。 */}
<script>
import { getUser } from "@/lib/api"
import { isFavorited, toggleFavorite, checkFavorited, hydrateFavorited } from "@/lib/favorites"
import { getUser } from "@/lib/auth"
import { isFavorited, toggleFavorite, hydrateFavorited } from "@/lib/favorites"
import { recordHistory } from "@/lib/history"
const btn = document.getElementById("fav-fab")
@ -101,15 +101,17 @@ const savedLabel = t("saved")
}
sync()
// 登录态:异步问服务端当前篇是否已收藏并写回本地(换浏览器/设备后,爱心状态与服务端一致)
if (getUser()) {
checkFavorited([meta.id])
.then((set) => {
if (set.has(meta.id)) hydrateFavorited(meta.id, meta.type as "runway" | "street", meta.title, meta.cover, meta.brand)
sync()
})
.catch(() => {})
}
// 登录态收藏校正已合并进详情接口:articleView / streetSnapView 取到服务端收藏态后,
// 通过 fav:set 事件广播当前图集是否已收藏;此处监听并写回本地(换设备后与服务端一致)。
// 不再单独请求 /me/favorites/checks。
window.addEventListener("fav:set", (e: Event) => {
const detail = (e as CustomEvent<{ id: string; fav: boolean }>).detail
if (!detail || detail.id !== meta.id) return
if (detail.fav) {
hydrateFavorited(meta.id, meta.type as "runway" | "street", meta.title, meta.cover, meta.brand)
}
sync()
})
btn.addEventListener("click", () => {
toggleFavorite({

View File

@ -124,7 +124,7 @@ const pageTitle = `${loginLabel} — Portfolio Studio`
</main>
<script>
import { login, getUser } from "@/lib/api"
import { login, getUser } from "@/lib/auth"
import { clientHref, ROUTES } from "@/lib/routes"
document.addEventListener("alpine:init", () => {

View File

@ -182,7 +182,8 @@ const browseLabel = t("browse the archive")
</style>
<script>
import { getUser, toAbs } from "@/lib/api"
import { toAbs } from "@/lib/api"
import { getUser } from "@/lib/auth"
import { getFavorites, removeFavorite, fetchFavoritesPage } from "@/lib/favorites"
import { fetchHistoryPage, removeHistory, clearHistory } from "@/lib/history"
import { clientHref, ROUTES } from "@/lib/routes"

View File

@ -73,8 +73,8 @@ const savedLabel = t("saved")
{/* 注意:不能用 define:vars 传 meta —— 它会把脚本包成内联 IIFE 并把 import 塞进函数体内,
导致 SyntaxError(import 只能在模块顶层)。故改由 data-* 属性透传,脚本自行读取。 */}
<script>
import { getUser } from "@/lib/api"
import { isFavorited, toggleFavorite, checkFavorited, hydrateFavorited } from "@/lib/favorites"
import { getUser } from "@/lib/auth"
import { isFavorited, toggleFavorite, hydrateFavorited } from "@/lib/favorites"
import { recordHistory } from "@/lib/history"
const btn = document.getElementById("fav-fab")
@ -101,15 +101,17 @@ const savedLabel = t("saved")
}
sync()
// 登录态:异步问服务端当前篇是否已收藏并写回本地(换浏览器/设备后,爱心状态与服务端一致)
if (getUser()) {
checkFavorited([meta.id])
.then((set) => {
if (set.has(meta.id)) hydrateFavorited(meta.id, meta.type as "runway" | "street", meta.title, meta.cover, meta.brand)
sync()
})
.catch(() => {})
}
// 登录态收藏校正已合并进详情接口:articleView / streetSnapView 取到服务端收藏态后,
// 通过 fav:set 事件广播当前图集是否已收藏;此处监听并写回本地(换设备后与服务端一致)。
// 不再单独请求 /me/favorites/checks。
window.addEventListener("fav:set", (e: Event) => {
const detail = (e as CustomEvent<{ id: string; fav: boolean }>).detail
if (!detail || detail.id !== meta.id) return
if (detail.fav) {
hydrateFavorited(meta.id, meta.type as "runway" | "street", meta.title, meta.cover, meta.brand)
}
sync()
})
btn.addEventListener("click", () => {
toggleFavorite({

View File

@ -124,7 +124,7 @@ const pageTitle = `${loginLabel} — Portfolio Studio`
</main>
<script>
import { login, getUser } from "@/lib/api"
import { login, getUser } from "@/lib/auth"
import { clientHref, ROUTES } from "@/lib/routes"
document.addEventListener("alpine:init", () => {