@magicbell/react-headless
Version:
Hooks to build a notification inbox
46 lines • 1.74 kB
JavaScript
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