react-toastify
Version:
React notification made easy
3 lines (2 loc) • 1.71 kB
JavaScript
import{useRef as r,useState as t,useEffect as e}from"react";import{toast as n}from"react-toastify";function d(d){void 0===d&&(d={});const u=r(d.sort||a),c=r(d.filter||null),[o,s]=t(()=>d.data?c.current?d.data.filter(c.current).sort(u.current):[...d.data].sort(u.current):[]),l=r(o);return e(()=>{l.current=o},[o]),e(()=>n.onChange(r=>{if("added"===r.status||"updated"===r.status){const t=i(r);if(c.current&&!c.current(t))return;s(r=>{let e=[];const n=r.findIndex(r=>r.id===t.id);return-1!==n?(e=r.slice(),Object.assign(e[n],t,{createdAt:Date.now()})):e=0===r.length?[t]:[t,...r],e.sort(u.current)})}}),[]),{notifications:o,clear:()=>{s([])},markAllAsRead:function(r){void 0===r&&(r=!0),s(t=>t.map(t=>(t.read=r,t)))},markAsRead:function(r,t){void 0===t&&(t=!0);let e=e=>(e.id===r&&(e.read=t),e);Array.isArray(r)&&(e=e=>(r.includes(e.id)&&(e.read=t),e)),s(r=>r.map(e))},add:r=>{if(l.current.find(t=>t.id===r.id))return null;const t=i(r);return s(r=>[...r,t].sort(u.current)),t.id},update:(r,t)=>{const e=l.current.findIndex(t=>t.id===r);return-1!==e?(s(r=>{const n=[...r];return Object.assign(n[e],t,{createdAt:t.createdAt||Date.now()}),n.sort(u.current)}),t.id):null},remove:r=>{s(t=>t.filter(Array.isArray(r)?t=>!r.includes(t.id):t=>t.id!==r))},find:r=>Array.isArray(r)?l.current.filter(t=>r.includes(t.id)):l.current.find(t=>t.id===r),sort:r=>{u.current=r,s(t=>t.slice().sort(r))},get unreadCount(){return o.reduce((r,t)=>t.read?r:r+1,0)}}}function i(r){return null==r.id&&(r.id=Date.now().toString(36).substring(2,9)),r.createdAt||(r.createdAt=Date.now()),null==r.read&&(r.read=!1),r}function a(r,t){return t.createdAt-r.createdAt}export{d as useNotificationCenter};
//# sourceMappingURL=index.esm.mjs.map