🐛 fix: show empty world favorites instead of a stuck skeleton

This commit is contained in:
2026-06-30 05:45:10 +07:00
parent d7e89c2133
commit 5bbef18fdf
2 changed files with 12 additions and 2 deletions
@@ -17,7 +17,9 @@ import { api } from "../../lib/api";
import { useT } from "../../lib/i18n"; import { useT } from "../../lib/i18n";
import { import {
useFavoriteWorldFolders, useFavoriteWorldFolders,
useWorldFavorites,
useWorldFavoriteLimits, useWorldFavoriteLimits,
useWorldFavoritesLoaded,
type FavoriteFolder, type FavoriteFolder,
} from "../../store/worldFavorites"; } from "../../store/worldFavorites";
import { useSocial } from "../../store/social"; import { useSocial } from "../../store/social";
@@ -35,6 +37,7 @@ export function MyFavoriteWorldsSection({ filter }: { filter?: WorldFilter }) {
const selfId = useSocial((s) => s.selfId); const selfId = useSocial((s) => s.selfId);
const folders = useFavoriteWorldFolders(); const folders = useFavoriteWorldFolders();
const { maxPerGroup } = useWorldFavoriteLimits(); const { maxPerGroup } = useWorldFavoriteLimits();
const loaded = useWorldFavoritesLoaded();
const searching = Boolean(filter); const searching = Boolean(filter);
const [editFolder, setEditFolder] = useState<FavoriteFolder | null>(null); const [editFolder, setEditFolder] = useState<FavoriteFolder | null>(null);
@@ -50,10 +53,11 @@ export function MyFavoriteWorldsSection({ filter }: { filter?: WorldFilter }) {
const [selected, setSelected] = useState<Set<string>>(() => new Set()); const [selected, setSelected] = useState<Set<string>>(() => new Set());
useEffect(() => { useEffect(() => {
useWorldFavorites.getState().markStale();
void api.world.loadFavorites(); void api.world.loadFavorites();
}, [selfId]); }, [selfId]);
if (!folders.length) return <SkeletonGrid count={3} />; if (!loaded && !folders.length) return <SkeletonGrid count={3} />;
const filtered = filter const filtered = filter
? folders.map((f) => ({ ...f, worlds: f.worlds.filter(filter) })) ? folders.map((f) => ({ ...f, worlds: f.worlds.filter(filter) }))
+7 -1
View File
@@ -14,13 +14,17 @@ const DEFAULT_LIMITS: FavoriteLimits = { maxGroups: 4, maxPerGroup: 64 };
interface WorldFavoritesState { interface WorldFavoritesState {
groups: FavoriteWorldGroup[]; groups: FavoriteWorldGroup[];
limits: FavoriteLimits; limits: FavoriteLimits;
loaded: boolean;
seed: (s: WorldFavoritesSnapshot) => void; seed: (s: WorldFavoritesSnapshot) => void;
markStale: () => void;
} }
export const useWorldFavorites = create<WorldFavoritesState>((set) => ({ export const useWorldFavorites = create<WorldFavoritesState>((set) => ({
groups: [], groups: [],
limits: DEFAULT_LIMITS, limits: DEFAULT_LIMITS,
seed: (s) => set({ groups: s.groups, limits: s.limits }), loaded: false,
seed: (s) => set({ groups: s.groups, limits: s.limits, loaded: true }),
markStale: () => set({ loaded: false }),
})); }));
events.on("world:favorites:seed", (s) => useWorldFavorites.getState().seed(s)); events.on("world:favorites:seed", (s) => useWorldFavorites.getState().seed(s));
@@ -66,6 +70,8 @@ function toFolder(
export const useWorldFavoriteLimits = (): FavoriteLimits => export const useWorldFavoriteLimits = (): FavoriteLimits =>
useWorldFavorites((s) => s.limits); useWorldFavorites((s) => s.limits);
export const useWorldFavoritesLoaded = (): boolean => useWorldFavorites((s) => s.loaded);
export function useWorldFolder(worldId: string): string | undefined { export function useWorldFolder(worldId: string): string | undefined {
return useWorldFavorites((s) => s.groups.find((g) => g.worldIds.includes(worldId))?.name); return useWorldFavorites((s) => s.groups.find((g) => g.worldIds.includes(worldId))?.name);
} }