diff --git a/src/renderer/src/features/world/MyFavoriteWorldsSection.tsx b/src/renderer/src/features/world/MyFavoriteWorldsSection.tsx index f825038..8241907 100644 --- a/src/renderer/src/features/world/MyFavoriteWorldsSection.tsx +++ b/src/renderer/src/features/world/MyFavoriteWorldsSection.tsx @@ -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(null); @@ -50,10 +53,11 @@ export function MyFavoriteWorldsSection({ filter }: { filter?: WorldFilter }) { const [selected, setSelected] = useState>(() => new Set()); useEffect(() => { + useWorldFavorites.getState().markStale(); void api.world.loadFavorites(); }, [selfId]); - if (!folders.length) return ; + if (!loaded && !folders.length) return ; const filtered = filter ? folders.map((f) => ({ ...f, worlds: f.worlds.filter(filter) })) diff --git a/src/renderer/src/store/worldFavorites.ts b/src/renderer/src/store/worldFavorites.ts index e003983..e9b5ad5 100644 --- a/src/renderer/src/store/worldFavorites.ts +++ b/src/renderer/src/store/worldFavorites.ts @@ -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((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); }