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 { 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) }))
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user