@magicbell/react-headless
Version:
Hooks to build a notification inbox
49 lines • 1.92 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
const zustand_1 = require("zustand");
const NotificationPreferencesRepository_js_1 = tslib_1.__importDefault(require("./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 = (0, zustand_1.create)((set, get) => ({
categories: [],
_repository: new NotificationPreferencesRepository_js_1.default(),
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() });
}
},
}));
exports.default = useNotificationPreferences;
//# sourceMappingURL=useNotificationPreferences.js.map