UNPKG

@magicbell/react-headless

Version:

Hooks to build a notification inbox

46 lines 1.74 kB
import { create } from 'zustand'; import NotificationPreferencesRepository from './NotificationPreferencesRepository.js'; function sortCategories(categories = []) { // sort categories and category channels, // so the preferences pane is stable after update categories.sort((a, b) => a.slug.localeCompare(b.slug)); for (const cat of categories) { cat.channels.sort((a, b) => a.slug.localeCompare(b.slug)); } return categories; } /** * Remote notification preferences store. It contains all preferences stored in MagicBell servers for this user. * * @example * const { fetch } = useNotificationPreferences(); * useEffect(() => fetch(), []); */ const useNotificationPreferences = create((set, get) => ({ categories: [], _repository: new NotificationPreferencesRepository(), fetch: async () => { const { _repository } = get(); try { const { notificationPreferences: json } = await _repository.get(); const categories = sortCategories(json.categories); set({ categories, lastFetchedAt: Date.now() }); } catch (error) { set({ categories: [], lastFetchedAt: Date.now() }); } }, save: async (preferences) => { const { _repository } = get(); try { const { notificationPreferences: json } = await _repository.update(preferences); const categories = sortCategories(json.categories); set({ categories, lastFetchedAt: Date.now() }); } catch (error) { set({ categories: [], lastFetchedAt: Date.now() }); } }, })); export default useNotificationPreferences; //# sourceMappingURL=useNotificationPreferences.js.map