mirror of
https://github.com/YuzuZensai/VRC-Circle.git
synced 2026-09-13 19:08:52 +00:00
🐛 fix: show empty world favorites instead of a stuck skeleton
This commit is contained in:
@@ -17,7 +17,9 @@ import { api } from "../../lib/api";
|
||||
import { useT } from "../../lib/i18n";
|
||||
import {
|
||||
useFavoriteWorldFolders,
|
||||
useWorldFavorites,
|
||||
useWorldFavoriteLimits,
|
||||
useWorldFavoritesLoaded,
|
||||
type FavoriteFolder,
|
||||
} from "../../store/worldFavorites";
|
||||
import { useSocial } from "../../store/social";
|
||||
@@ -35,6 +37,7 @@ export function MyFavoriteWorldsSection({ filter }: { filter?: WorldFilter }) {
|
||||
const selfId = useSocial((s) => s.selfId);
|
||||
const folders = useFavoriteWorldFolders();
|
||||
const { maxPerGroup } = useWorldFavoriteLimits();
|
||||
const loaded = useWorldFavoritesLoaded();
|
||||
const searching = Boolean(filter);
|
||||
|
||||
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());
|
||||
|
||||
useEffect(() => {
|
||||
useWorldFavorites.getState().markStale();
|
||||
void api.world.loadFavorites();
|
||||
}, [selfId]);
|
||||
|
||||
if (!folders.length) return <SkeletonGrid count={3} />;
|
||||
if (!loaded && !folders.length) return <SkeletonGrid count={3} />;
|
||||
|
||||
const filtered = filter
|
||||
? folders.map((f) => ({ ...f, worlds: f.worlds.filter(filter) }))
|
||||
|
||||
@@ -14,13 +14,17 @@ const DEFAULT_LIMITS: FavoriteLimits = { maxGroups: 4, maxPerGroup: 64 };
|
||||
interface WorldFavoritesState {
|
||||
groups: FavoriteWorldGroup[];
|
||||
limits: FavoriteLimits;
|
||||
loaded: boolean;
|
||||
seed: (s: WorldFavoritesSnapshot) => void;
|
||||
markStale: () => void;
|
||||
}
|
||||
|
||||
export const useWorldFavorites = create<WorldFavoritesState>((set) => ({
|
||||
groups: [],
|
||||
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));
|
||||
@@ -66,6 +70,8 @@ function toFolder(
|
||||
export const useWorldFavoriteLimits = (): FavoriteLimits =>
|
||||
useWorldFavorites((s) => s.limits);
|
||||
|
||||
export const useWorldFavoritesLoaded = (): boolean => useWorldFavorites((s) => s.loaded);
|
||||
|
||||
export function useWorldFolder(worldId: string): string | undefined {
|
||||
return useWorldFavorites((s) => s.groups.find((g) => g.worldIds.includes(worldId))?.name);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user