Files
Nitro-V3/src/hooks/navigator/navigatorFavouritesStore.ts
T
simoleo89 e610cfeef4 feat(navigator): reactive favourites via fine-grained store (P3)
Move favourite room ids out of the useBetween navigator store into a
dedicated Zustand store. useNavigatorFavourite(roomId) subscribes only
to s.ids.has(roomId) (a boolean), so a FavouriteChangedEvent for one
room no longer re-renders every favourite-aware view. apply() returns
the same state reference when membership is unchanged.
2026-05-31 01:03:31 +02:00

26 lines
768 B
TypeScript

import { createNitroStore } from '../../state/createNitroStore';
export type NavigatorFavouritesState = {
ids: Set<number>;
};
export type NavigatorFavouritesActions = {
setAll(roomIds: number[]): void;
apply(roomId: number, added: boolean): void;
};
export const useNavigatorFavouritesStore = createNitroStore<NavigatorFavouritesState & NavigatorFavouritesActions>()((set) => ({
ids: new Set<number>(),
setAll: (roomIds) => set({ ids: new Set(roomIds.map(Number)) }),
apply: (roomId, added) => set((s) =>
{
const id = Number(roomId);
if(added ? s.ids.has(id) : !s.ids.has(id)) return s;
const ids = new Set(s.ids);
if(added) ids.add(id);
else ids.delete(id);
return { ids };
})
}));