@rpcbase/ui 0.181.0 → 0.183.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (618) hide show
  1. package/dist/helpers/index.d.ts +1 -0
  2. package/dist/helpers/index.d.ts.map +1 -1
  3. package/dist/helpers/useScrollPagination.d.ts +23 -0
  4. package/dist/helpers/useScrollPagination.d.ts.map +1 -0
  5. package/dist/helpers/useScrollPagination.test.d.ts +2 -0
  6. package/dist/helpers/useScrollPagination.test.d.ts.map +1 -0
  7. package/dist/index.js +62 -60
  8. package/dist/index.js.map +1 -1
  9. package/dist/index10.js +23 -69
  10. package/dist/index10.js.map +1 -1
  11. package/dist/index100.js +5 -4
  12. package/dist/index100.js.map +1 -1
  13. package/dist/index101.js +3 -3
  14. package/dist/index101.js.map +1 -1
  15. package/dist/index102.js +4 -6
  16. package/dist/index102.js.map +1 -1
  17. package/dist/index103.js +6 -145
  18. package/dist/index103.js.map +1 -1
  19. package/dist/index104.js +144 -38
  20. package/dist/index104.js.map +1 -1
  21. package/dist/index105.js +39 -4
  22. package/dist/index105.js.map +1 -1
  23. package/dist/index106.js +4 -7
  24. package/dist/index106.js.map +1 -1
  25. package/dist/index107.js +6 -12
  26. package/dist/index107.js.map +1 -1
  27. package/dist/index108.js +13 -13
  28. package/dist/index108.js.map +1 -1
  29. package/dist/index109.js +13 -7
  30. package/dist/index109.js.map +1 -1
  31. package/dist/index11.js +62 -544
  32. package/dist/index11.js.map +1 -1
  33. package/dist/index110.js +6 -30
  34. package/dist/index110.js.map +1 -1
  35. package/dist/index111.js +31 -10
  36. package/dist/index111.js.map +1 -1
  37. package/dist/index112.js +10 -10
  38. package/dist/index112.js.map +1 -1
  39. package/dist/index113.js +10 -8
  40. package/dist/index113.js.map +1 -1
  41. package/dist/index114.js +8 -13
  42. package/dist/index114.js.map +1 -1
  43. package/dist/index115.js +13 -101
  44. package/dist/index115.js.map +1 -1
  45. package/dist/index116.js +102 -20
  46. package/dist/index116.js.map +1 -1
  47. package/dist/index117.js +20 -54
  48. package/dist/index117.js.map +1 -1
  49. package/dist/index118.js +51 -70
  50. package/dist/index118.js.map +1 -1
  51. package/dist/index119.js +72 -9
  52. package/dist/index119.js.map +1 -1
  53. package/dist/index12.js +535 -110
  54. package/dist/index12.js.map +1 -1
  55. package/dist/index120.js +9 -20
  56. package/dist/index120.js.map +1 -1
  57. package/dist/index121.js +20 -16
  58. package/dist/index121.js.map +1 -1
  59. package/dist/index122.js +16 -23
  60. package/dist/index122.js.map +1 -1
  61. package/dist/index123.js +23 -6
  62. package/dist/index123.js.map +1 -1
  63. package/dist/index124.js +6 -5
  64. package/dist/index124.js.map +1 -1
  65. package/dist/index125.js +5 -23
  66. package/dist/index125.js.map +1 -1
  67. package/dist/index126.js +24 -35
  68. package/dist/index126.js.map +1 -1
  69. package/dist/index127.js +35 -16
  70. package/dist/index127.js.map +1 -1
  71. package/dist/index128.js +16 -7
  72. package/dist/index128.js.map +1 -1
  73. package/dist/index129.js +6 -4
  74. package/dist/index129.js.map +1 -1
  75. package/dist/index13.js +122 -71
  76. package/dist/index13.js.map +1 -1
  77. package/dist/index130.js +4 -4
  78. package/dist/index130.js.map +1 -1
  79. package/dist/index131.js +4 -4
  80. package/dist/index131.js.map +1 -1
  81. package/dist/index132.js +4 -4
  82. package/dist/index132.js.map +1 -1
  83. package/dist/index133.js +4 -3
  84. package/dist/index133.js.map +1 -1
  85. package/dist/index134.js +3 -6
  86. package/dist/index134.js.map +1 -1
  87. package/dist/index135.js +7 -24
  88. package/dist/index135.js.map +1 -1
  89. package/dist/index136.js +24 -8
  90. package/dist/index136.js.map +1 -1
  91. package/dist/index137.js +7 -6
  92. package/dist/index137.js.map +1 -1
  93. package/dist/index138.js +6 -5
  94. package/dist/index138.js.map +1 -1
  95. package/dist/index139.js +5 -3
  96. package/dist/index139.js.map +1 -1
  97. package/dist/index14.js +61 -717
  98. package/dist/index14.js.map +1 -1
  99. package/dist/index140.js +3 -3
  100. package/dist/index140.js.map +1 -1
  101. package/dist/index141.js +3 -4
  102. package/dist/index141.js.map +1 -1
  103. package/dist/index142.js +4 -3
  104. package/dist/index142.js.map +1 -1
  105. package/dist/index143.js +3 -4
  106. package/dist/index143.js.map +1 -1
  107. package/dist/index144.js +4 -3
  108. package/dist/index144.js.map +1 -1
  109. package/dist/index145.js +3 -3
  110. package/dist/index145.js.map +1 -1
  111. package/dist/index146.js +3 -3
  112. package/dist/index146.js.map +1 -1
  113. package/dist/index147.js +3 -46
  114. package/dist/index147.js.map +1 -1
  115. package/dist/index148.js +2 -2
  116. package/dist/index15.js +727 -18
  117. package/dist/index15.js.map +1 -1
  118. package/dist/index150.js +2 -2
  119. package/dist/index152.js +3 -3
  120. package/dist/index153.js +40 -599
  121. package/dist/index153.js.map +1 -1
  122. package/dist/index154.js +605 -5
  123. package/dist/index154.js.map +1 -1
  124. package/dist/index155.js +5 -68
  125. package/dist/index155.js.map +1 -1
  126. package/dist/index156.js +69 -2
  127. package/dist/index156.js.map +1 -1
  128. package/dist/index157.js +2 -364
  129. package/dist/index157.js.map +1 -1
  130. package/dist/index158.js +303 -201
  131. package/dist/index158.js.map +1 -1
  132. package/dist/index159.js +247 -46
  133. package/dist/index159.js.map +1 -1
  134. package/dist/index16.js +19 -14
  135. package/dist/index16.js.map +1 -1
  136. package/dist/index160.js +56 -42
  137. package/dist/index160.js.map +1 -1
  138. package/dist/index161.js +46 -169
  139. package/dist/index161.js.map +1 -1
  140. package/dist/index162.js +156 -96
  141. package/dist/index162.js.map +1 -1
  142. package/dist/index163.js +109 -24
  143. package/dist/index163.js.map +1 -1
  144. package/dist/index164.js +25 -8
  145. package/dist/index164.js.map +1 -1
  146. package/dist/index165.js +8 -5
  147. package/dist/index165.js.map +1 -1
  148. package/dist/index166.js +4 -5
  149. package/dist/index166.js.map +1 -1
  150. package/dist/index167.js +5 -4
  151. package/dist/index167.js.map +1 -1
  152. package/dist/index168.js +4 -466
  153. package/dist/index168.js.map +1 -1
  154. package/dist/index169.js +420 -139
  155. package/dist/index169.js.map +1 -1
  156. package/dist/index17.js +13 -382
  157. package/dist/index17.js.map +1 -1
  158. package/dist/index170.js +149 -71
  159. package/dist/index170.js.map +1 -1
  160. package/dist/index171.js +74 -229
  161. package/dist/index171.js.map +1 -1
  162. package/dist/index172.js +262 -9
  163. package/dist/index172.js.map +1 -1
  164. package/dist/index173.js +9 -42
  165. package/dist/index173.js.map +1 -1
  166. package/dist/index174.js +42 -4
  167. package/dist/index174.js.map +1 -1
  168. package/dist/index175.js +4 -16
  169. package/dist/index175.js.map +1 -1
  170. package/dist/index176.js +57 -4
  171. package/dist/index176.js.map +1 -1
  172. package/dist/index177.js +8 -5
  173. package/dist/index177.js.map +1 -1
  174. package/dist/index178.js +55 -47
  175. package/dist/index178.js.map +1 -1
  176. package/dist/index179.js +17 -64
  177. package/dist/index179.js.map +1 -1
  178. package/dist/index18.js +363 -695
  179. package/dist/index18.js.map +1 -1
  180. package/dist/index180.js +16 -6
  181. package/dist/index180.js.map +1 -1
  182. package/dist/index181.js +5 -4
  183. package/dist/index181.js.map +1 -1
  184. package/dist/index182.js +5 -7
  185. package/dist/index182.js.map +1 -1
  186. package/dist/index183.js +6 -17
  187. package/dist/index183.js.map +1 -1
  188. package/dist/index184.js +4 -5
  189. package/dist/index184.js.map +1 -1
  190. package/dist/index185.js +7 -5
  191. package/dist/index185.js.map +1 -1
  192. package/dist/index186.js +17 -13
  193. package/dist/index186.js.map +1 -1
  194. package/dist/index187.js +5 -10
  195. package/dist/index187.js.map +1 -1
  196. package/dist/index188.js +5 -14
  197. package/dist/index188.js.map +1 -1
  198. package/dist/index189.js +13 -14
  199. package/dist/index189.js.map +1 -1
  200. package/dist/index19.js +685 -624
  201. package/dist/index19.js.map +1 -1
  202. package/dist/index190.js +10 -5
  203. package/dist/index190.js.map +1 -1
  204. package/dist/index191.js +14 -6
  205. package/dist/index191.js.map +1 -1
  206. package/dist/index192.js +14 -7
  207. package/dist/index192.js.map +1 -1
  208. package/dist/index193.js +5 -6
  209. package/dist/index193.js.map +1 -1
  210. package/dist/index194.js +6 -9
  211. package/dist/index194.js.map +1 -1
  212. package/dist/index195.js +7 -5
  213. package/dist/index195.js.map +1 -1
  214. package/dist/index196.js +6 -5
  215. package/dist/index196.js.map +1 -1
  216. package/dist/index197.js +9 -9
  217. package/dist/index197.js.map +1 -1
  218. package/dist/index198.js +5 -5
  219. package/dist/index198.js.map +1 -1
  220. package/dist/index199.js +5 -5
  221. package/dist/index199.js.map +1 -1
  222. package/dist/index2.js +2 -2
  223. package/dist/index20.js +640 -191
  224. package/dist/index20.js.map +1 -1
  225. package/dist/index200.js +9 -4
  226. package/dist/index200.js.map +1 -1
  227. package/dist/index201.js +5 -11
  228. package/dist/index201.js.map +1 -1
  229. package/dist/index202.js +5 -10
  230. package/dist/index202.js.map +1 -1
  231. package/dist/index203.js +4 -10
  232. package/dist/index203.js.map +1 -1
  233. package/dist/index204.js +11 -11
  234. package/dist/index204.js.map +1 -1
  235. package/dist/index205.js +10 -11
  236. package/dist/index205.js.map +1 -1
  237. package/dist/index206.js +10 -10
  238. package/dist/index206.js.map +1 -1
  239. package/dist/index207.js +11 -7
  240. package/dist/index207.js.map +1 -1
  241. package/dist/index208.js +11 -6
  242. package/dist/index208.js.map +1 -1
  243. package/dist/index209.js +10 -5
  244. package/dist/index209.js.map +1 -1
  245. package/dist/index21.js +209 -5
  246. package/dist/index21.js.map +1 -1
  247. package/dist/index210.js +7 -6
  248. package/dist/index210.js.map +1 -1
  249. package/dist/index211.js +6 -7
  250. package/dist/index211.js.map +1 -1
  251. package/dist/index212.js +5 -6
  252. package/dist/index212.js.map +1 -1
  253. package/dist/index213.js +6 -55
  254. package/dist/index213.js.map +1 -1
  255. package/dist/index214.js +7 -8
  256. package/dist/index214.js.map +1 -1
  257. package/dist/index215.js +6 -19
  258. package/dist/index215.js.map +1 -1
  259. package/dist/index216.js +54 -15
  260. package/dist/index216.js.map +1 -1
  261. package/dist/index217.js +16 -7
  262. package/dist/index217.js.map +1 -1
  263. package/dist/index218.js +7 -10
  264. package/dist/index218.js.map +1 -1
  265. package/dist/index219.js +9 -9
  266. package/dist/index219.js.map +1 -1
  267. package/dist/index22.js +5 -35
  268. package/dist/index22.js.map +1 -1
  269. package/dist/index220.js +10 -21
  270. package/dist/index220.js.map +1 -1
  271. package/dist/index221.js +21 -10
  272. package/dist/index221.js.map +1 -1
  273. package/dist/index222.js +10 -9
  274. package/dist/index222.js.map +1 -1
  275. package/dist/index223.js +6 -6
  276. package/dist/index223.js.map +1 -1
  277. package/dist/index224.js +9 -4
  278. package/dist/index224.js.map +1 -1
  279. package/dist/index225.js +4 -5
  280. package/dist/index225.js.map +1 -1
  281. package/dist/index226.js +5 -16
  282. package/dist/index226.js.map +1 -1
  283. package/dist/index227.js +16 -9
  284. package/dist/index227.js.map +1 -1
  285. package/dist/index228.js +9 -18
  286. package/dist/index228.js.map +1 -1
  287. package/dist/index229.js +15 -12
  288. package/dist/index229.js.map +1 -1
  289. package/dist/index23.js +24 -258
  290. package/dist/index23.js.map +1 -1
  291. package/dist/index230.js +12 -9
  292. package/dist/index230.js.map +1 -1
  293. package/dist/index231.js +12 -29
  294. package/dist/index231.js.map +1 -1
  295. package/dist/index232.js +28 -11
  296. package/dist/index232.js.map +1 -1
  297. package/dist/index233.js +10 -23
  298. package/dist/index233.js.map +1 -1
  299. package/dist/index234.js +25 -5
  300. package/dist/index234.js.map +1 -1
  301. package/dist/index235.js +5 -24
  302. package/dist/index235.js.map +1 -1
  303. package/dist/index236.js +24 -28
  304. package/dist/index236.js.map +1 -1
  305. package/dist/index237.js +29 -5
  306. package/dist/index237.js.map +1 -1
  307. package/dist/index238.js +5 -68
  308. package/dist/index238.js.map +1 -1
  309. package/dist/index239.js +64 -177
  310. package/dist/index239.js.map +1 -1
  311. package/dist/index24.js +254 -166
  312. package/dist/index24.js.map +1 -1
  313. package/dist/index240.js +176 -42
  314. package/dist/index240.js.map +1 -1
  315. package/dist/index241.js +45 -12
  316. package/dist/index241.js.map +1 -1
  317. package/dist/index242.js +13 -154
  318. package/dist/index242.js.map +1 -1
  319. package/dist/index243.js +151 -27
  320. package/dist/index243.js.map +1 -1
  321. package/dist/index244.js +30 -9
  322. package/dist/index244.js.map +1 -1
  323. package/dist/index245.js +9 -47
  324. package/dist/index245.js.map +1 -1
  325. package/dist/index246.js +46 -10
  326. package/dist/index246.js.map +1 -1
  327. package/dist/index247.js +11 -44
  328. package/dist/index247.js.map +1 -1
  329. package/dist/index248.js +40 -91
  330. package/dist/index248.js.map +1 -1
  331. package/dist/index249.js +85 -76
  332. package/dist/index249.js.map +1 -1
  333. package/dist/index25.js +180 -14
  334. package/dist/index25.js.map +1 -1
  335. package/dist/index250.js +69 -88
  336. package/dist/index250.js.map +1 -1
  337. package/dist/index251.js +92 -39
  338. package/dist/index251.js.map +1 -1
  339. package/dist/index252.js +51 -10
  340. package/dist/index252.js.map +1 -1
  341. package/dist/index253.js +10 -36
  342. package/dist/index253.js.map +1 -1
  343. package/dist/index254.js +37 -8
  344. package/dist/index254.js.map +1 -1
  345. package/dist/index255.js +8 -116
  346. package/dist/index255.js.map +1 -1
  347. package/dist/index256.js +115 -16
  348. package/dist/index256.js.map +1 -1
  349. package/dist/index257.js +17 -15
  350. package/dist/index257.js.map +1 -1
  351. package/dist/index258.js +15 -3
  352. package/dist/index258.js.map +1 -1
  353. package/dist/index259.js +3 -36
  354. package/dist/index259.js.map +1 -1
  355. package/dist/index26.js +15 -2763
  356. package/dist/index26.js.map +1 -1
  357. package/dist/index260.js +35 -19
  358. package/dist/index260.js.map +1 -1
  359. package/dist/index261.js +20 -9
  360. package/dist/index261.js.map +1 -1
  361. package/dist/index262.js +8 -7
  362. package/dist/index262.js.map +1 -1
  363. package/dist/index263.js +8 -19
  364. package/dist/index263.js.map +1 -1
  365. package/dist/index264.js +14 -23
  366. package/dist/index264.js.map +1 -1
  367. package/dist/index265.js +26 -14
  368. package/dist/index265.js.map +1 -1
  369. package/dist/index266.js +16 -4
  370. package/dist/index266.js.map +1 -1
  371. package/dist/index267.js +5 -19
  372. package/dist/index267.js.map +1 -1
  373. package/dist/index268.js +19 -13
  374. package/dist/index268.js.map +1 -1
  375. package/dist/index269.js +13 -5
  376. package/dist/index269.js.map +1 -1
  377. package/dist/index27.js +2761 -35
  378. package/dist/index27.js.map +1 -1
  379. package/dist/index270.js +5 -3
  380. package/dist/index270.js.map +1 -1
  381. package/dist/index271.js +3 -24
  382. package/dist/index271.js.map +1 -1
  383. package/dist/index272.js +22 -111
  384. package/dist/index272.js.map +1 -1
  385. package/dist/index273.js +111 -14
  386. package/dist/index273.js.map +1 -1
  387. package/dist/index274.js +14 -523
  388. package/dist/index274.js.map +1 -1
  389. package/dist/index275.js +511 -114
  390. package/dist/index275.js.map +1 -1
  391. package/dist/index276.js +111 -117
  392. package/dist/index276.js.map +1 -1
  393. package/dist/index277.js +133 -20
  394. package/dist/index277.js.map +1 -1
  395. package/dist/index278.js +20 -5
  396. package/dist/index278.js.map +1 -1
  397. package/dist/index279.js +5 -5
  398. package/dist/index279.js.map +1 -1
  399. package/dist/index28.js +37 -3
  400. package/dist/index28.js.map +1 -1
  401. package/dist/index280.js +6 -4
  402. package/dist/index280.js.map +1 -1
  403. package/dist/index281.js +4 -16
  404. package/dist/index281.js.map +1 -1
  405. package/dist/index282.js +14 -7
  406. package/dist/index282.js.map +1 -1
  407. package/dist/index283.js +8 -5
  408. package/dist/index283.js.map +1 -1
  409. package/dist/index284.js +5 -4
  410. package/dist/index284.js.map +1 -1
  411. package/dist/index285.js +4 -545
  412. package/dist/index285.js.map +1 -1
  413. package/dist/index286.js +544 -45
  414. package/dist/index286.js.map +1 -1
  415. package/dist/index287.js +47 -18
  416. package/dist/index287.js.map +1 -1
  417. package/dist/index288.js +17 -6
  418. package/dist/index288.js.map +1 -1
  419. package/dist/index289.js +6 -8
  420. package/dist/index289.js.map +1 -1
  421. package/dist/index29.js +3 -125
  422. package/dist/index29.js.map +1 -1
  423. package/dist/index290.js +8 -7
  424. package/dist/index290.js.map +1 -1
  425. package/dist/index291.js +7 -8
  426. package/dist/index291.js.map +1 -1
  427. package/dist/index292.js +8 -12
  428. package/dist/index292.js.map +1 -1
  429. package/dist/index293.js +12 -9
  430. package/dist/index293.js.map +1 -1
  431. package/dist/index294.js +9 -13
  432. package/dist/index294.js.map +1 -1
  433. package/dist/index295.js +14 -69
  434. package/dist/index295.js.map +1 -1
  435. package/dist/index296.js +68 -8
  436. package/dist/index296.js.map +1 -1
  437. package/dist/index297.js +9 -14
  438. package/dist/index297.js.map +1 -1
  439. package/dist/index298.js +14 -66
  440. package/dist/index298.js.map +1 -1
  441. package/dist/index299.js +65 -64
  442. package/dist/index299.js.map +1 -1
  443. package/dist/index30.js +120 -227
  444. package/dist/index30.js.map +1 -1
  445. package/dist/index300.js +64 -4
  446. package/dist/index300.js.map +1 -1
  447. package/dist/index301.js +5 -56
  448. package/dist/index301.js.map +1 -1
  449. package/dist/index302.js +54 -66
  450. package/dist/index302.js.map +1 -1
  451. package/dist/index303.js +67 -30
  452. package/dist/index303.js.map +1 -1
  453. package/dist/index304.js +31 -9
  454. package/dist/index304.js.map +1 -1
  455. package/dist/index305.js +9 -153
  456. package/dist/index305.js.map +1 -1
  457. package/dist/index306.js +142 -97
  458. package/dist/index306.js.map +1 -1
  459. package/dist/index307.js +108 -4
  460. package/dist/index307.js.map +1 -1
  461. package/dist/index308.js +3 -22
  462. package/dist/index308.js.map +1 -1
  463. package/dist/index309.js +22 -15
  464. package/dist/index309.js.map +1 -1
  465. package/dist/index31.js +229 -21
  466. package/dist/index31.js.map +1 -1
  467. package/dist/index310.js +14 -27
  468. package/dist/index310.js.map +1 -1
  469. package/dist/index311.js +27 -11
  470. package/dist/index311.js.map +1 -1
  471. package/dist/index312.js +11 -5
  472. package/dist/index312.js.map +1 -1
  473. package/dist/index313.js +6 -12
  474. package/dist/index313.js.map +1 -1
  475. package/dist/index314.js +20 -25
  476. package/dist/index314.js.map +1 -1
  477. package/dist/index315.js +12 -4
  478. package/dist/index315.js.map +1 -1
  479. package/dist/index316.js +25 -20
  480. package/dist/index316.js.map +1 -1
  481. package/dist/index317.js +8 -0
  482. package/dist/index317.js.map +1 -0
  483. package/dist/index32.js +23 -50
  484. package/dist/index32.js.map +1 -1
  485. package/dist/index33.js +50 -2640
  486. package/dist/index33.js.map +1 -1
  487. package/dist/index34.js +2598 -351
  488. package/dist/index34.js.map +1 -1
  489. package/dist/index35.js +375 -214
  490. package/dist/index35.js.map +1 -1
  491. package/dist/index36.js +230 -19
  492. package/dist/index36.js.map +1 -1
  493. package/dist/index37.js +18 -138
  494. package/dist/index37.js.map +1 -1
  495. package/dist/index38.js +125 -170
  496. package/dist/index38.js.map +1 -1
  497. package/dist/index39.js +174 -64
  498. package/dist/index39.js.map +1 -1
  499. package/dist/index40.js +72 -94
  500. package/dist/index40.js.map +1 -1
  501. package/dist/index41.js +98 -5
  502. package/dist/index41.js.map +1 -1
  503. package/dist/index42.js +5 -843
  504. package/dist/index42.js.map +1 -1
  505. package/dist/index43.js +832 -54
  506. package/dist/index43.js.map +1 -1
  507. package/dist/index44.js +66 -8
  508. package/dist/index44.js.map +1 -1
  509. package/dist/index45.js +8 -2
  510. package/dist/index45.js.map +1 -1
  511. package/dist/index46.js +2 -24
  512. package/dist/index46.js.map +1 -1
  513. package/dist/index47.js +22 -232
  514. package/dist/index47.js.map +1 -1
  515. package/dist/index48.js +233 -6
  516. package/dist/index48.js.map +1 -1
  517. package/dist/index49.js +203 -32
  518. package/dist/index49.js.map +1 -1
  519. package/dist/index5.js +1 -1
  520. package/dist/index50.js +3 -26
  521. package/dist/index50.js.map +1 -1
  522. package/dist/index51.js +6 -7
  523. package/dist/index51.js.map +1 -1
  524. package/dist/index52.js +47 -11
  525. package/dist/index52.js.map +1 -1
  526. package/dist/index53.js +26 -204
  527. package/dist/index53.js.map +1 -1
  528. package/dist/index54.js +50 -3
  529. package/dist/index54.js.map +1 -1
  530. package/dist/index55.js +7 -47
  531. package/dist/index55.js.map +1 -1
  532. package/dist/index56.js +12 -48
  533. package/dist/index56.js.map +1 -1
  534. package/dist/index57.js +133 -7
  535. package/dist/index57.js.map +1 -1
  536. package/dist/index58.js +10 -14
  537. package/dist/index58.js.map +1 -1
  538. package/dist/index59.js +210 -127
  539. package/dist/index59.js.map +1 -1
  540. package/dist/index6.js +138 -25
  541. package/dist/index6.js.map +1 -1
  542. package/dist/index60.js +12 -10
  543. package/dist/index60.js.map +1 -1
  544. package/dist/index61.js +32 -215
  545. package/dist/index61.js.map +1 -1
  546. package/dist/index62.js +47 -13
  547. package/dist/index62.js.map +1 -1
  548. package/dist/index63.js +7 -46
  549. package/dist/index63.js.map +1 -1
  550. package/dist/index67.js +2 -2
  551. package/dist/index69.js +3 -3
  552. package/dist/index7.js +26 -29
  553. package/dist/index7.js.map +1 -1
  554. package/dist/index70.js +11 -53
  555. package/dist/index70.js.map +1 -1
  556. package/dist/index71.js +54 -2
  557. package/dist/index71.js.map +1 -1
  558. package/dist/index72.js +6 -2
  559. package/dist/index72.js.map +1 -1
  560. package/dist/index73.js +7 -5
  561. package/dist/index73.js.map +1 -1
  562. package/dist/index74.js +4 -6
  563. package/dist/index74.js.map +1 -1
  564. package/dist/index75.js +2 -6
  565. package/dist/index75.js.map +1 -1
  566. package/dist/index76.js +2 -52
  567. package/dist/index76.js.map +1 -1
  568. package/dist/index77.js +52 -5
  569. package/dist/index77.js.map +1 -1
  570. package/dist/index78.js +4 -4
  571. package/dist/index78.js.map +1 -1
  572. package/dist/index79.js +4 -15
  573. package/dist/index79.js.map +1 -1
  574. package/dist/index8.js +28 -222
  575. package/dist/index8.js.map +1 -1
  576. package/dist/index80.js +15 -5
  577. package/dist/index80.js.map +1 -1
  578. package/dist/index81.js +5 -7
  579. package/dist/index81.js.map +1 -1
  580. package/dist/index82.js +6 -15
  581. package/dist/index82.js.map +1 -1
  582. package/dist/index83.js +16 -4
  583. package/dist/index83.js.map +1 -1
  584. package/dist/index84.js +1 -1
  585. package/dist/index84.js.map +1 -1
  586. package/dist/index85.js +4 -5
  587. package/dist/index85.js.map +1 -1
  588. package/dist/index86.js +4 -4
  589. package/dist/index86.js.map +1 -1
  590. package/dist/index87.js +5 -4
  591. package/dist/index87.js.map +1 -1
  592. package/dist/index88.js +2 -2
  593. package/dist/index88.js.map +1 -1
  594. package/dist/index89.js +3 -5
  595. package/dist/index89.js.map +1 -1
  596. package/dist/index9.js +226 -23
  597. package/dist/index9.js.map +1 -1
  598. package/dist/index90.js +6 -24
  599. package/dist/index90.js.map +1 -1
  600. package/dist/index91.js +24 -6
  601. package/dist/index91.js.map +1 -1
  602. package/dist/index92.js +6 -4
  603. package/dist/index92.js.map +1 -1
  604. package/dist/index93.js +3 -5
  605. package/dist/index93.js.map +1 -1
  606. package/dist/index94.js +6 -5
  607. package/dist/index94.js.map +1 -1
  608. package/dist/index95.js +5 -4
  609. package/dist/index95.js.map +1 -1
  610. package/dist/index96.js +3 -4
  611. package/dist/index96.js.map +1 -1
  612. package/dist/index97.js +5 -4
  613. package/dist/index97.js.map +1 -1
  614. package/dist/index98.js +4 -8
  615. package/dist/index98.js.map +1 -1
  616. package/dist/index99.js +8 -5
  617. package/dist/index99.js.map +1 -1
  618. package/package.json +1 -1
package/dist/index24.js CHANGED
@@ -1,184 +1,272 @@
1
- import { j as e } from "./index28.js";
2
- import { useState as g, useMemo as A, useEffect as k } from "react";
3
- import { Loader2 as S } from "lucide-react";
1
+ import { j as e } from "./index29.js";
2
+ import { useContext as H, createContext as Q, useState as p, useMemo as y, useCallback as W, useEffect as L } from "react";
3
+ import * as b from "@radix-ui/react-dialog";
4
+ import { Root as Z, Trigger as _, Portal as ee, Content as te, Item as E } from "./index49.js";
5
+ import { X as ne, Loader2 as se, MoreVertical as re } from "lucide-react";
4
6
  import { cn as w } from "./index2.js";
5
- const D = [
6
- { value: "off", label: "Off" },
7
- { value: "daily", label: "Daily" },
8
- { value: "weekly", label: "Weekly" }
9
- ], f = (r) => {
10
- const o = r?.digestFrequency, s = o === "off" || o === "daily" || o === "weekly" ? o : "weekly", p = Array.isArray(r?.topicPreferences) ? r.topicPreferences.map((i) => ({
11
- topic: typeof i.topic == "string" ? i.topic.trim() : "",
12
- inApp: i.inApp === !0,
13
- emailDigest: i.emailDigest === !0,
14
- push: i.push === !0
15
- })).filter((i) => i.topic.length > 0) : [];
16
- return {
17
- digestFrequency: s,
18
- topicPreferences: p,
19
- ...typeof r?.lastDigestSentAt == "string" ? { lastDigestSentAt: r.lastDigestSentAt } : {}
20
- };
21
- }, T = (r) => {
22
- if (!Array.isArray(r)) return [];
23
- const o = /* @__PURE__ */ new Set();
24
- return r.map((s) => ({
25
- topic: typeof s.topic == "string" ? s.topic.trim() : "",
26
- title: typeof s.title == "string" ? s.title.trim() : "",
27
- description: typeof s.description == "string" ? s.description.trim() : void 0
28
- })).filter((s) => s.topic.length > 0).filter((s) => o.has(s.topic) ? !1 : (o.add(s.topic), !0));
29
- }, y = (r, o) => {
30
- const s = {
31
- topic: "",
32
- inApp: !0,
33
- emailDigest: !0,
34
- push: !1
35
- }, p = new Map(r.topicPreferences.map((i) => [i.topic, i]));
36
- return {
37
- ...r,
38
- topicPreferences: o.map((i) => {
39
- const d = p.get(i.topic);
40
- return d ? {
41
- topic: i.topic,
42
- inApp: d.inApp === !0,
43
- emailDigest: d.emailDigest === !0,
44
- push: d.push === !0
45
- } : {
46
- ...s,
47
- topic: i.topic
48
- };
49
- })
50
- };
51
- };
52
- function z({
53
- className: r,
54
- topics: o
7
+ const G = (t) => {
8
+ const s = Date.parse(t);
9
+ return Number.isFinite(s) ? s : 0;
10
+ }, oe = (t) => {
11
+ const s = new Date(G(t));
12
+ if (!Number.isFinite(s.getTime())) return "unknown";
13
+ const m = s.getFullYear(), o = String(s.getMonth() + 1).padStart(2, "0"), a = String(s.getDate()).padStart(2, "0");
14
+ return `${m}-${o}-${a}`;
15
+ }, ae = (t) => {
16
+ if (t === "unknown") return "Unknown date";
17
+ const [s, m, o] = t.split("-"), a = Number(s), x = Number(m), r = Number(o);
18
+ if (!Number.isFinite(a) || !Number.isFinite(x) || !Number.isFinite(r)) return "Unknown date";
19
+ const j = new Date(a, x - 1, r);
20
+ if (!Number.isFinite(j.getTime())) return "Unknown date";
21
+ const k = (/* @__PURE__ */ new Date()).getFullYear() !== a;
22
+ return j.toLocaleDateString(void 0, k ? { weekday: "short", month: "short", day: "numeric", year: "numeric" } : { weekday: "short", month: "short", day: "numeric" });
23
+ }, Y = (t) => {
24
+ const s = [];
25
+ let m = null;
26
+ for (const o of t) {
27
+ const a = oe(o.createdAt);
28
+ a !== m && (m = a, s.push({ key: a, label: ae(a), items: [] })), s[s.length - 1].items.push(o);
29
+ }
30
+ return s;
31
+ }, ie = Q(null);
32
+ function xe({
33
+ open: t,
34
+ onOpenChange: s,
35
+ className: m,
36
+ limit: o = 50,
37
+ defaultUnreadOnly: a = !1,
38
+ realtimeContext: x
55
39
  }) {
56
- const [s, p] = g(!0), [i, d] = g(!1), [j, u] = g(null), [m, h] = g(
57
- () => f({ digestFrequency: "weekly", topicPreferences: [] })
58
- ), a = A(() => T(o), [o]), P = async () => {
59
- p(!0), u(null);
40
+ const r = H(x ?? ie), [j, v] = p([]), [k, C] = p(0), [J, A] = p(0), [K, U] = p(!1), [V, S] = p(null), [f, X] = p(a), M = r?.notifications ?? j, D = r?.unreadCount ?? k, O = r?.unseenCount ?? J, q = r?.loading ?? K, R = r?.error ? r.error instanceof Error ? r.error.message : String(r.error) : V, g = y(() => M.slice(0, o), [o, M]), T = y(() => g.filter((n) => !n.readAt), [g]), F = y(() => g.filter((n) => !!n.readAt), [g]), I = y(() => Y(T), [T]), z = y(() => Y(F), [F]), N = W(async ({ unreadOnly: n, markSeen: d }) => {
41
+ U(!0), S(null);
60
42
  try {
61
- const t = await fetch("/api/rb/notifications/settings", {
62
- method: "GET",
63
- credentials: "include"
64
- }), c = await t.json().catch(() => null);
65
- if (!t.ok || !c?.ok) {
66
- u(c?.error || "Unable to load notification settings.");
43
+ const h = await fetch("/api/rb/notifications", {
44
+ method: "POST",
45
+ headers: { "Content-Type": "application/json" },
46
+ credentials: "include",
47
+ body: JSON.stringify({ limit: o, unreadOnly: n, markSeen: d })
48
+ }), i = await h.json().catch(() => null);
49
+ if (!h.ok || !i?.ok) {
50
+ S(i?.error || "Unable to load notifications.");
67
51
  return;
68
52
  }
69
- const n = f(c.settings);
70
- h(a.length > 0 ? y(n, a) : n);
53
+ const u = Array.isArray(i.notifications) ? i.notifications : [];
54
+ v(u), C(Number.isFinite(i.unreadCount) ? Math.max(0, Math.floor(i.unreadCount ?? 0)) : 0), A(Number.isFinite(i.unseenCount) ? Math.max(0, Math.floor(i.unseenCount ?? 0)) : 0);
71
55
  } catch {
72
- u("Unable to load notification settings.");
56
+ S("Unable to load notifications.");
73
57
  } finally {
74
- p(!1);
58
+ U(!1);
75
59
  }
76
- }, v = async (t) => {
77
- d(!0), u(null);
60
+ }, [o]);
61
+ L(() => {
62
+ if (t) {
63
+ if (r) {
64
+ (async () => {
65
+ try {
66
+ await fetch("/api/rb/notifications", {
67
+ method: "POST",
68
+ headers: { "Content-Type": "application/json" },
69
+ credentials: "include",
70
+ keepalive: !0,
71
+ body: JSON.stringify({ limit: 1, markSeen: !0 })
72
+ });
73
+ } catch {
74
+ return;
75
+ }
76
+ })();
77
+ return;
78
+ }
79
+ N({ unreadOnly: f, markSeen: !0 });
80
+ }
81
+ }, [t, r, N, f]), L(() => {
82
+ t && (r || N({ unreadOnly: f, markSeen: !1 }));
83
+ }, [t, r, N, f]);
84
+ const P = async (n) => {
78
85
  try {
79
- const c = await fetch("/api/rb/notifications/settings", {
80
- method: "PUT",
86
+ const d = await fetch(`/api/rb/notifications/${encodeURIComponent(n)}/read`, {
87
+ method: "POST",
81
88
  headers: { "Content-Type": "application/json" },
82
89
  credentials: "include",
83
- body: JSON.stringify({
84
- digestFrequency: t.digestFrequency,
85
- topicPreferences: t.topicPreferences
86
- })
87
- }), n = await c.json().catch(() => null);
88
- if (!c.ok || !n?.ok) {
89
- u(n?.error || "Unable to save notification settings.");
90
- return;
91
- }
92
- const l = f(n.settings);
93
- h(a.length > 0 ? y(l, a) : l);
90
+ keepalive: !0,
91
+ body: "{}"
92
+ }), h = await d.json().catch(() => null);
93
+ if (!d.ok || !h?.ok) return;
94
+ const i = (/* @__PURE__ */ new Date()).toISOString();
95
+ if (r) return;
96
+ v((u) => {
97
+ const c = u.find((l) => l.id === n);
98
+ return c && !c.readAt && C((l) => Math.max(0, l - 1)), c && !c.seenAt && A((l) => Math.max(0, l - 1)), u.map((l) => l.id === n && !l.readAt ? { ...l, readAt: i, ...l.seenAt ? {} : { seenAt: i } } : l);
99
+ });
94
100
  } catch {
95
- u("Unable to save notification settings.");
96
- } finally {
97
- d(!1);
101
+ return;
102
+ }
103
+ }, $ = async (n) => {
104
+ try {
105
+ const d = await fetch(`/api/rb/notifications/${encodeURIComponent(n)}/archive`, {
106
+ method: "POST",
107
+ headers: { "Content-Type": "application/json" },
108
+ credentials: "include",
109
+ body: "{}"
110
+ }), h = await d.json().catch(() => null);
111
+ if (!d.ok || !h?.ok || r) return;
112
+ v((i) => {
113
+ const u = i.find((c) => c.id === n);
114
+ return u && !u.readAt && C((c) => Math.max(0, c - 1)), u && !u.seenAt && A((c) => Math.max(0, c - 1)), i.filter((c) => c.id !== n);
115
+ });
116
+ } catch {
117
+ return;
98
118
  }
99
119
  };
100
- k(() => {
101
- P();
102
- }, []), k(() => {
103
- a.length !== 0 && h((t) => y(t, a));
104
- }, [a]);
105
- const N = (t, c) => {
106
- const l = m.topicPreferences.some((x) => x.topic === t) ? m.topicPreferences.map((x) => x.topic === t ? c(x) : x) : [...m.topicPreferences, c({ topic: t, inApp: !0, emailDigest: !0, push: !1 })], b = f({ ...m, topicPreferences: l });
107
- h(b), v(b);
108
- };
109
- return s ? /* @__PURE__ */ e.jsx("div", { className: w("flex items-center justify-center py-10 text-muted-foreground", r), children: /* @__PURE__ */ e.jsx(S, { className: "h-4 w-4 animate-spin" }) }) : /* @__PURE__ */ e.jsxs("div", { className: w("space-y-4", r), children: [
110
- /* @__PURE__ */ e.jsx("div", { className: "rounded-md border bg-background p-4", children: /* @__PURE__ */ e.jsxs("div", { className: "flex items-start justify-between gap-3", children: [
111
- /* @__PURE__ */ e.jsxs("div", { children: [
112
- /* @__PURE__ */ e.jsx("div", { className: "text-sm font-semibold", children: "Email digest" }),
113
- /* @__PURE__ */ e.jsx("div", { className: "mt-1 text-xs text-muted-foreground", children: "Choose how often we email you a summary." })
114
- ] }),
115
- /* @__PURE__ */ e.jsx(
116
- "select",
117
- {
118
- value: m.digestFrequency,
119
- onChange: (t) => {
120
- const c = t.target.value, n = f({ ...m, digestFrequency: c });
121
- h(n), v(n);
122
- },
123
- className: "h-9 rounded-md border bg-background px-2 text-sm",
124
- children: D.map((t) => /* @__PURE__ */ e.jsx("option", { value: t.value, children: t.label }, t.value))
125
- }
126
- )
127
- ] }) }),
128
- /* @__PURE__ */ e.jsxs("div", { className: "rounded-md border bg-background p-4", children: [
129
- /* @__PURE__ */ e.jsx("div", { className: "flex items-start justify-between gap-3", children: /* @__PURE__ */ e.jsxs("div", { children: [
130
- /* @__PURE__ */ e.jsx("div", { className: "text-sm font-semibold", children: "Topics" }),
131
- /* @__PURE__ */ e.jsx("div", { className: "mt-1 text-xs text-muted-foreground", children: "Choose where you receive each topic." })
132
- ] }) }),
133
- a.length === 0 ? /* @__PURE__ */ e.jsx("div", { className: "mt-4 text-sm text-muted-foreground", children: "No topics configured." }) : /* @__PURE__ */ e.jsx("div", { className: "mt-4 overflow-x-auto", children: /* @__PURE__ */ e.jsxs("table", { className: "w-full text-sm", children: [
134
- /* @__PURE__ */ e.jsx("thead", { children: /* @__PURE__ */ e.jsxs("tr", { className: "text-left text-xs text-muted-foreground", children: [
135
- /* @__PURE__ */ e.jsx("th", { className: "py-2 pr-4 font-medium", children: "Topic" }),
136
- /* @__PURE__ */ e.jsx("th", { className: "py-2 pr-4 font-medium", children: "In-app" }),
137
- /* @__PURE__ */ e.jsx("th", { className: "py-2 pr-4 font-medium", children: "Email digest" }),
138
- /* @__PURE__ */ e.jsx("th", { className: "py-2 pr-4 font-medium", children: "Push" })
139
- ] }) }),
140
- /* @__PURE__ */ e.jsx("tbody", { children: m.topicPreferences.map((t) => {
141
- const c = a.find((n) => n.topic === t.topic);
142
- return /* @__PURE__ */ e.jsxs("tr", { className: "border-t align-top", children: [
143
- /* @__PURE__ */ e.jsx("td", { className: "py-3 pr-4", children: /* @__PURE__ */ e.jsxs("div", { className: "flex flex-col gap-1", children: [
144
- /* @__PURE__ */ e.jsx("span", { className: "font-medium", children: c?.title || t.topic }),
145
- c?.description ? /* @__PURE__ */ e.jsx("span", { className: "text-xs text-muted-foreground", children: c.description }) : null,
146
- /* @__PURE__ */ e.jsx("span", { className: "text-[11px] text-muted-foreground", children: t.topic })
147
- ] }) }),
148
- /* @__PURE__ */ e.jsx("td", { className: "py-3 pr-4", children: /* @__PURE__ */ e.jsx(
149
- "input",
150
- {
151
- type: "checkbox",
152
- checked: t.inApp,
153
- onChange: (n) => N(t.topic, (l) => ({ ...l, inApp: n.target.checked }))
154
- }
155
- ) }),
156
- /* @__PURE__ */ e.jsx("td", { className: "py-3 pr-4", children: /* @__PURE__ */ e.jsx(
157
- "input",
158
- {
159
- type: "checkbox",
160
- checked: t.emailDigest,
161
- onChange: (n) => N(t.topic, (l) => ({ ...l, emailDigest: n.target.checked }))
162
- }
163
- ) }),
164
- /* @__PURE__ */ e.jsx("td", { className: "py-3 pr-4", children: /* @__PURE__ */ e.jsx(
165
- "input",
166
- {
167
- type: "checkbox",
168
- checked: t.push,
169
- disabled: !0,
170
- className: "opacity-50",
171
- "aria-label": "Push notifications (coming soon)"
172
- }
173
- ) })
174
- ] }, t.topic);
175
- }) })
176
- ] }) }),
177
- j ? /* @__PURE__ */ e.jsx("div", { className: "mt-3 text-sm text-destructive", children: j }) : i ? /* @__PURE__ */ e.jsx("div", { className: "mt-3 text-xs text-muted-foreground", children: "Saving…" }) : null
178
- ] })
179
- ] });
120
+ return /* @__PURE__ */ e.jsx(b.Root, { open: t, onOpenChange: s, children: /* @__PURE__ */ e.jsxs(b.Portal, { children: [
121
+ /* @__PURE__ */ e.jsx(b.Overlay, { className: "fixed inset-0 z-50 bg-black/50" }),
122
+ /* @__PURE__ */ e.jsxs(
123
+ b.Content,
124
+ {
125
+ className: w(
126
+ "fixed right-0 top-0 z-50 flex h-full w-full max-w-md flex-col border-l bg-background shadow-xl outline-none",
127
+ m
128
+ ),
129
+ children: [
130
+ /* @__PURE__ */ e.jsxs("header", { className: "flex items-center justify-between gap-2 border-b px-4 py-3", children: [
131
+ /* @__PURE__ */ e.jsxs("div", { className: "flex min-w-0 flex-col", children: [
132
+ /* @__PURE__ */ e.jsx(b.Title, { className: "text-sm font-semibold", children: "Notifications" }),
133
+ /* @__PURE__ */ e.jsx("span", { className: "text-xs text-muted-foreground", children: D > 0 ? `${D} unread` : O > 0 ? `${O} new` : "All caught up" })
134
+ ] }),
135
+ /* @__PURE__ */ e.jsxs("div", { className: "flex items-center gap-2", children: [
136
+ /* @__PURE__ */ e.jsx(
137
+ "button",
138
+ {
139
+ type: "button",
140
+ onClick: () => X((n) => !n),
141
+ className: w(
142
+ "rounded-md border px-2 py-1 text-xs",
143
+ f ? "bg-accent text-foreground" : "bg-background text-muted-foreground hover:bg-accent"
144
+ ),
145
+ children: f ? "Unread" : "All"
146
+ }
147
+ ),
148
+ /* @__PURE__ */ e.jsx(b.Close, { asChild: !0, children: /* @__PURE__ */ e.jsx("button", { type: "button", className: "inline-flex h-8 w-8 items-center justify-center rounded-md hover:bg-accent", children: /* @__PURE__ */ e.jsx(ne, { className: "h-4 w-4" }) }) })
149
+ ] })
150
+ ] }),
151
+ /* @__PURE__ */ e.jsx("div", { className: "flex-1 overflow-y-auto px-4 pb-3", children: q ? /* @__PURE__ */ e.jsx("div", { className: "flex items-center justify-center py-10 text-muted-foreground", children: /* @__PURE__ */ e.jsx(se, { className: "h-4 w-4 animate-spin" }) }) : R ? /* @__PURE__ */ e.jsx("div", { className: "py-10 text-center text-sm text-muted-foreground", children: R }) : g.length === 0 ? /* @__PURE__ */ e.jsx("div", { className: "py-10 text-center text-sm text-muted-foreground", children: "No notifications." }) : /* @__PURE__ */ e.jsxs("div", { className: "flex flex-col gap-4", children: [
152
+ /* @__PURE__ */ e.jsxs("div", { children: [
153
+ /* @__PURE__ */ e.jsx("div", { className: "sticky top-0 z-20 -mx-4 flex h-8 items-center border-b bg-background px-4 text-xs font-semibold text-muted-foreground", children: "Unread notifications" }),
154
+ I.length === 0 ? /* @__PURE__ */ e.jsx("div", { className: "py-6 text-center text-sm text-muted-foreground", children: "No unread notifications." }) : I.map((n) => /* @__PURE__ */ e.jsxs("div", { children: [
155
+ /* @__PURE__ */ e.jsx("div", { className: "sticky top-8 z-10 -mx-4 flex h-7 items-center bg-background px-4 text-[11px] font-semibold text-muted-foreground", children: n.label }),
156
+ /* @__PURE__ */ e.jsx("div", { className: "-mx-4 flex flex-col divide-y divide-border", children: n.items.map((d) => /* @__PURE__ */ e.jsx(
157
+ B,
158
+ {
159
+ notification: d,
160
+ onMarkRead: P,
161
+ onArchive: $
162
+ },
163
+ d.id
164
+ )) })
165
+ ] }, `unread:${n.key}`))
166
+ ] }),
167
+ f ? null : /* @__PURE__ */ e.jsxs("div", { children: [
168
+ /* @__PURE__ */ e.jsx("div", { className: "sticky top-0 z-20 -mx-4 flex h-8 items-center border-b bg-background px-4 text-xs font-semibold text-muted-foreground", children: "Previous notifications" }),
169
+ z.length === 0 ? /* @__PURE__ */ e.jsx("div", { className: "py-6 text-center text-sm text-muted-foreground", children: "No previous notifications." }) : z.map((n) => /* @__PURE__ */ e.jsxs("div", { children: [
170
+ /* @__PURE__ */ e.jsx("div", { className: "sticky top-8 z-10 -mx-4 flex h-7 items-center bg-background px-4 text-[11px] font-semibold text-muted-foreground", children: n.label }),
171
+ /* @__PURE__ */ e.jsx("div", { className: "-mx-4 flex flex-col divide-y divide-border", children: n.items.map((d) => /* @__PURE__ */ e.jsx(
172
+ B,
173
+ {
174
+ notification: d,
175
+ onMarkRead: P,
176
+ onArchive: $
177
+ },
178
+ d.id
179
+ )) })
180
+ ] }, `previous:${n.key}`))
181
+ ] })
182
+ ] }) })
183
+ ]
184
+ }
185
+ )
186
+ ] }) });
187
+ }
188
+ function B({
189
+ notification: t,
190
+ onMarkRead: s,
191
+ onArchive: m
192
+ }) {
193
+ const o = !t.readAt, a = (() => {
194
+ const x = new Date(G(t.createdAt));
195
+ return Number.isFinite(x.getTime()) ? x.toLocaleString() : "";
196
+ })();
197
+ return /* @__PURE__ */ e.jsxs(
198
+ "div",
199
+ {
200
+ className: w(
201
+ "group flex w-full gap-3 px-4 py-3 hover:bg-accent/40",
202
+ o ? "bg-primary/5" : "bg-background"
203
+ ),
204
+ children: [
205
+ /* @__PURE__ */ e.jsxs(
206
+ "button",
207
+ {
208
+ type: "button",
209
+ className: "min-w-0 flex-1 text-left",
210
+ onClick: () => {
211
+ o && s(t.id), t.url && (window.location.href = t.url);
212
+ },
213
+ children: [
214
+ /* @__PURE__ */ e.jsxs("div", { className: "min-w-0", children: [
215
+ /* @__PURE__ */ e.jsx("div", { className: "truncate text-sm font-semibold", children: t.title }),
216
+ t.body ? /* @__PURE__ */ e.jsx("div", { className: "mt-0.5 line-clamp-2 text-xs text-muted-foreground", children: t.body }) : null
217
+ ] }),
218
+ t.url ? /* @__PURE__ */ e.jsx("div", { className: "mt-2 truncate text-xs text-primary", children: t.url }) : null,
219
+ a ? /* @__PURE__ */ e.jsx("div", { className: "mt-2 text-[11px] text-muted-foreground", children: a }) : null
220
+ ]
221
+ }
222
+ ),
223
+ /* @__PURE__ */ e.jsx("div", { className: "flex items-start", children: /* @__PURE__ */ e.jsxs(Z, { children: [
224
+ /* @__PURE__ */ e.jsx(_, { asChild: !0, children: /* @__PURE__ */ e.jsx(
225
+ "button",
226
+ {
227
+ type: "button",
228
+ className: "inline-flex h-8 w-8 items-center justify-center rounded-md hover:bg-accent",
229
+ "aria-label": "Notification options",
230
+ children: /* @__PURE__ */ e.jsx(re, { className: "h-4 w-4" })
231
+ }
232
+ ) }),
233
+ /* @__PURE__ */ e.jsx(ee, { children: /* @__PURE__ */ e.jsxs(
234
+ te,
235
+ {
236
+ align: "end",
237
+ sideOffset: 6,
238
+ className: w(
239
+ "z-50 min-w-[10rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md",
240
+ "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
241
+ "data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2"
242
+ ),
243
+ children: [
244
+ /* @__PURE__ */ e.jsx(
245
+ E,
246
+ {
247
+ className: "relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
248
+ onSelect: () => m(t.id),
249
+ children: "Archive"
250
+ }
251
+ ),
252
+ /* @__PURE__ */ e.jsx(
253
+ E,
254
+ {
255
+ className: "relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
256
+ disabled: !o,
257
+ onSelect: () => s(t.id),
258
+ children: "Mark as read"
259
+ }
260
+ )
261
+ ]
262
+ }
263
+ ) })
264
+ ] }) })
265
+ ]
266
+ }
267
+ );
180
268
  }
181
269
  export {
182
- z as NotificationsSettings
270
+ xe as NotificationsDrawer
183
271
  };
184
272
  //# sourceMappingURL=index24.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index24.js","sources":["../src/components/Notifications/NotificationsSettings.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from \"react\"\nimport { Loader2 } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nimport type { NotificationDigestFrequency, NotificationSettings, NotificationTopicCatalogItem, NotificationTopicPreference } from \"./types\"\n\n\ntype SettingsResponse = {\n ok?: boolean\n error?: string\n settings?: NotificationSettings\n}\n\nconst digestValues: Array<{ value: NotificationDigestFrequency; label: string }> = [\n { value: \"off\", label: \"Off\" },\n { value: \"daily\", label: \"Daily\" },\n { value: \"weekly\", label: \"Weekly\" },\n]\n\nconst normalizeSettings = (settings: NotificationSettings | undefined): NotificationSettings => {\n const digestFrequency = settings?.digestFrequency\n const frequency: NotificationDigestFrequency =\n digestFrequency === \"off\" || digestFrequency === \"daily\" || digestFrequency === \"weekly\"\n ? digestFrequency\n : \"weekly\"\n\n const topicPreferences = Array.isArray(settings?.topicPreferences)\n ? settings!.topicPreferences\n .map((pref) => ({\n topic: typeof pref.topic === \"string\" ? pref.topic.trim() : \"\",\n inApp: pref.inApp === true,\n emailDigest: pref.emailDigest === true,\n push: pref.push === true,\n }))\n .filter((pref) => pref.topic.length > 0)\n : []\n\n return {\n digestFrequency: frequency,\n topicPreferences,\n ...(typeof settings?.lastDigestSentAt === \"string\" ? { lastDigestSentAt: settings.lastDigestSentAt } : {}),\n }\n}\n\nconst normalizeTopics = (topics: NotificationTopicCatalogItem[] | undefined): NotificationTopicCatalogItem[] => {\n if (!Array.isArray(topics)) return []\n\n const seen = new Set<string>()\n return topics\n .map((topic) => ({\n topic: typeof topic.topic === \"string\" ? topic.topic.trim() : \"\",\n title: typeof topic.title === \"string\" ? topic.title.trim() : \"\",\n description: typeof topic.description === \"string\" ? topic.description.trim() : undefined,\n }))\n .filter((topic) => topic.topic.length > 0)\n .filter((topic) => {\n if (seen.has(topic.topic)) return false\n seen.add(topic.topic)\n return true\n })\n}\n\nconst applyTopicsToSettings = (\n settings: NotificationSettings,\n topics: NotificationTopicCatalogItem[],\n): NotificationSettings => {\n const defaults: NotificationTopicPreference = {\n topic: \"\",\n inApp: true,\n emailDigest: true,\n push: false,\n }\n\n const byTopic = new Map(settings.topicPreferences.map((pref) => [pref.topic, pref]))\n return {\n ...settings,\n topicPreferences: topics.map((topic) => {\n const existing = byTopic.get(topic.topic)\n return existing\n ? {\n topic: topic.topic,\n inApp: existing.inApp === true,\n emailDigest: existing.emailDigest === true,\n push: existing.push === true,\n }\n : {\n ...defaults,\n topic: topic.topic,\n }\n }),\n }\n}\n\nexport function NotificationsSettings({\n className,\n topics,\n}: {\n className?: string\n topics?: NotificationTopicCatalogItem[]\n}) {\n const [loading, setLoading] = useState(true)\n const [saving, setSaving] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [settings, setSettings] = useState<NotificationSettings>(() =>\n normalizeSettings({ digestFrequency: \"weekly\", topicPreferences: [] }),\n )\n\n const normalizedTopics = useMemo(() => normalizeTopics(topics), [topics])\n\n const loadSettings = async () => {\n setLoading(true)\n setError(null)\n try {\n const res = await fetch(\"/api/rb/notifications/settings\", {\n method: \"GET\",\n credentials: \"include\",\n })\n const json = (await res.json().catch(() => null)) as SettingsResponse | null\n if (!res.ok || !json?.ok) {\n setError(json?.error || \"Unable to load notification settings.\")\n return\n }\n const normalized = normalizeSettings(json.settings)\n setSettings(normalizedTopics.length > 0 ? applyTopicsToSettings(normalized, normalizedTopics) : normalized)\n } catch {\n setError(\"Unable to load notification settings.\")\n } finally {\n setLoading(false)\n }\n }\n\n const saveSettings = async (next: NotificationSettings) => {\n setSaving(true)\n setError(null)\n try {\n const res = await fetch(\"/api/rb/notifications/settings\", {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n credentials: \"include\",\n body: JSON.stringify({\n digestFrequency: next.digestFrequency,\n topicPreferences: next.topicPreferences,\n }),\n })\n const json = (await res.json().catch(() => null)) as SettingsResponse | null\n if (!res.ok || !json?.ok) {\n setError(json?.error || \"Unable to save notification settings.\")\n return\n }\n const normalized = normalizeSettings(json.settings)\n setSettings(normalizedTopics.length > 0 ? applyTopicsToSettings(normalized, normalizedTopics) : normalized)\n } catch {\n setError(\"Unable to save notification settings.\")\n } finally {\n setSaving(false)\n }\n }\n\n useEffect(() => {\n void loadSettings()\n }, [])\n\n useEffect(() => {\n if (normalizedTopics.length === 0) return\n setSettings((current) => applyTopicsToSettings(current, normalizedTopics))\n }, [normalizedTopics])\n\n const updatePreference = (topic: string, update: (p: NotificationTopicPreference) => NotificationTopicPreference) => {\n const hasExisting = settings.topicPreferences.some((p) => p.topic === topic)\n const nextPrefs = hasExisting\n ? settings.topicPreferences.map((p) => (p.topic === topic ? update(p) : p))\n : [...settings.topicPreferences, update({ topic, inApp: true, emailDigest: true, push: false })]\n const next = normalizeSettings({ ...settings, topicPreferences: nextPrefs })\n setSettings(next)\n void saveSettings(next)\n }\n\n if (loading) {\n return (\n <div className={cn(\"flex items-center justify-center py-10 text-muted-foreground\", className)}>\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n </div>\n )\n }\n\n return (\n <div className={cn(\"space-y-4\", className)}>\n <div className=\"rounded-md border bg-background p-4\">\n <div className=\"flex items-start justify-between gap-3\">\n <div>\n <div className=\"text-sm font-semibold\">Email digest</div>\n <div className=\"mt-1 text-xs text-muted-foreground\">Choose how often we email you a summary.</div>\n </div>\n <select\n value={settings.digestFrequency}\n onChange={(e) => {\n const value = e.target.value as NotificationDigestFrequency\n const next = normalizeSettings({ ...settings, digestFrequency: value })\n setSettings(next)\n void saveSettings(next)\n }}\n className=\"h-9 rounded-md border bg-background px-2 text-sm\"\n >\n {digestValues.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n </div>\n </div>\n\n <div className=\"rounded-md border bg-background p-4\">\n <div className=\"flex items-start justify-between gap-3\">\n <div>\n <div className=\"text-sm font-semibold\">Topics</div>\n <div className=\"mt-1 text-xs text-muted-foreground\">Choose where you receive each topic.</div>\n </div>\n </div>\n\n {normalizedTopics.length === 0 ? (\n <div className=\"mt-4 text-sm text-muted-foreground\">No topics configured.</div>\n ) : (\n <div className=\"mt-4 overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"text-left text-xs text-muted-foreground\">\n <th className=\"py-2 pr-4 font-medium\">Topic</th>\n <th className=\"py-2 pr-4 font-medium\">In-app</th>\n <th className=\"py-2 pr-4 font-medium\">Email digest</th>\n <th className=\"py-2 pr-4 font-medium\">Push</th>\n </tr>\n </thead>\n <tbody>\n {settings.topicPreferences.map((pref) => {\n const meta = normalizedTopics.find((topic) => topic.topic === pref.topic)\n return (\n <tr key={pref.topic} className=\"border-t align-top\">\n <td className=\"py-3 pr-4\">\n <div className=\"flex flex-col gap-1\">\n <span className=\"font-medium\">{meta?.title || pref.topic}</span>\n {meta?.description ? (\n <span className=\"text-xs text-muted-foreground\">{meta.description}</span>\n ) : null}\n <span className=\"text-[11px] text-muted-foreground\">{pref.topic}</span>\n </div>\n </td>\n <td className=\"py-3 pr-4\">\n <input\n type=\"checkbox\"\n checked={pref.inApp}\n onChange={(e) =>\n updatePreference(pref.topic, (p) => ({ ...p, inApp: e.target.checked }))\n }\n />\n </td>\n <td className=\"py-3 pr-4\">\n <input\n type=\"checkbox\"\n checked={pref.emailDigest}\n onChange={(e) =>\n updatePreference(pref.topic, (p) => ({ ...p, emailDigest: e.target.checked }))\n }\n />\n </td>\n <td className=\"py-3 pr-4\">\n <input\n type=\"checkbox\"\n checked={pref.push}\n disabled\n className=\"opacity-50\"\n aria-label=\"Push notifications (coming soon)\"\n />\n </td>\n </tr>\n )\n })}\n </tbody>\n </table>\n </div>\n )}\n\n {error ? (\n <div className=\"mt-3 text-sm text-destructive\">{error}</div>\n ) : saving ? (\n <div className=\"mt-3 text-xs text-muted-foreground\">Saving…</div>\n ) : null}\n </div>\n </div>\n )\n}\n"],"names":["digestValues","normalizeSettings","settings","digestFrequency","frequency","topicPreferences","pref","normalizeTopics","topics","seen","topic","applyTopicsToSettings","defaults","byTopic","existing","NotificationsSettings","className","loading","setLoading","useState","saving","setSaving","error","setError","setSettings","normalizedTopics","useMemo","loadSettings","res","json","normalized","saveSettings","next","useEffect","current","updatePreference","update","nextPrefs","p","jsx","cn","Loader2","jsxs","e","value","opt","meta"],"mappings":";;;;AAcA,MAAMA,IAA6E;AAAA,EACjF,EAAE,OAAO,OAAO,OAAO,MAAA;AAAA,EACvB,EAAE,OAAO,SAAS,OAAO,QAAA;AAAA,EACzB,EAAE,OAAO,UAAU,OAAO,SAAA;AAC5B,GAEMC,IAAoB,CAACC,MAAqE;AAC9F,QAAMC,IAAkBD,GAAU,iBAC5BE,IACJD,MAAoB,SAASA,MAAoB,WAAWA,MAAoB,WAC5EA,IACA,UAEAE,IAAmB,MAAM,QAAQH,GAAU,gBAAgB,IAC7DA,EAAU,iBACT,IAAI,CAACI,OAAU;AAAA,IACd,OAAO,OAAOA,EAAK,SAAU,WAAWA,EAAK,MAAM,SAAS;AAAA,IAC5D,OAAOA,EAAK,UAAU;AAAA,IACtB,aAAaA,EAAK,gBAAgB;AAAA,IAClC,MAAMA,EAAK,SAAS;AAAA,EAAA,EACpB,EACD,OAAO,CAACA,MAASA,EAAK,MAAM,SAAS,CAAC,IACvC,CAAA;AAEJ,SAAO;AAAA,IACL,iBAAiBF;AAAA,IACjB,kBAAAC;AAAA,IACA,GAAI,OAAOH,GAAU,oBAAqB,WAAW,EAAE,kBAAkBA,EAAS,qBAAqB,CAAA;AAAA,EAAC;AAE5G,GAEMK,IAAkB,CAACC,MAAuF;AAC9G,MAAI,CAAC,MAAM,QAAQA,CAAM,UAAU,CAAA;AAEnC,QAAMC,wBAAW,IAAA;AACjB,SAAOD,EACJ,IAAI,CAACE,OAAW;AAAA,IACf,OAAO,OAAOA,EAAM,SAAU,WAAWA,EAAM,MAAM,SAAS;AAAA,IAC9D,OAAO,OAAOA,EAAM,SAAU,WAAWA,EAAM,MAAM,SAAS;AAAA,IAC9D,aAAa,OAAOA,EAAM,eAAgB,WAAWA,EAAM,YAAY,SAAS;AAAA,EAAA,EAChF,EACD,OAAO,CAACA,MAAUA,EAAM,MAAM,SAAS,CAAC,EACxC,OAAO,CAACA,MACHD,EAAK,IAAIC,EAAM,KAAK,IAAU,MAClCD,EAAK,IAAIC,EAAM,KAAK,GACb,GACR;AACL,GAEMC,IAAwB,CAC5BT,GACAM,MACyB;AACzB,QAAMI,IAAwC;AAAA,IAC5C,OAAO;AAAA,IACP,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM;AAAA,EAAA,GAGFC,IAAU,IAAI,IAAIX,EAAS,iBAAiB,IAAI,CAACI,MAAS,CAACA,EAAK,OAAOA,CAAI,CAAC,CAAC;AACnF,SAAO;AAAA,IACL,GAAGJ;AAAA,IACH,kBAAkBM,EAAO,IAAI,CAACE,MAAU;AACtC,YAAMI,IAAWD,EAAQ,IAAIH,EAAM,KAAK;AACxC,aAAOI,IACH;AAAA,QACA,OAAOJ,EAAM;AAAA,QACb,OAAOI,EAAS,UAAU;AAAA,QAC1B,aAAaA,EAAS,gBAAgB;AAAA,QACtC,MAAMA,EAAS,SAAS;AAAA,MAAA,IAExB;AAAA,QACA,GAAGF;AAAA,QACH,OAAOF,EAAM;AAAA,MAAA;AAAA,IAEnB,CAAC;AAAA,EAAA;AAEL;AAEO,SAASK,EAAsB;AAAA,EACpC,WAAAC;AAAA,EACA,QAAAR;AACF,GAGG;AACD,QAAM,CAACS,GAASC,CAAU,IAAIC,EAAS,EAAI,GACrC,CAACC,GAAQC,CAAS,IAAIF,EAAS,EAAK,GACpC,CAACG,GAAOC,CAAQ,IAAIJ,EAAwB,IAAI,GAChD,CAACjB,GAAUsB,CAAW,IAAIL;AAAA,IAA+B,MAC7DlB,EAAkB,EAAE,iBAAiB,UAAU,kBAAkB,CAAA,GAAI;AAAA,EAAA,GAGjEwB,IAAmBC,EAAQ,MAAMnB,EAAgBC,CAAM,GAAG,CAACA,CAAM,CAAC,GAElEmB,IAAe,YAAY;AAC/B,IAAAT,EAAW,EAAI,GACfK,EAAS,IAAI;AACb,QAAI;AACF,YAAMK,IAAM,MAAM,MAAM,kCAAkC;AAAA,QACxD,QAAQ;AAAA,QACR,aAAa;AAAA,MAAA,CACd,GACKC,IAAQ,MAAMD,EAAI,OAAO,MAAM,MAAM,IAAI;AAC/C,UAAI,CAACA,EAAI,MAAM,CAACC,GAAM,IAAI;AACxB,QAAAN,EAASM,GAAM,SAAS,uCAAuC;AAC/D;AAAA,MACF;AACA,YAAMC,IAAa7B,EAAkB4B,EAAK,QAAQ;AAClD,MAAAL,EAAYC,EAAiB,SAAS,IAAId,EAAsBmB,GAAYL,CAAgB,IAAIK,CAAU;AAAA,IAC5G,QAAQ;AACN,MAAAP,EAAS,uCAAuC;AAAA,IAClD,UAAA;AACE,MAAAL,EAAW,EAAK;AAAA,IAClB;AAAA,EACF,GAEMa,IAAe,OAAOC,MAA+B;AACzD,IAAAX,EAAU,EAAI,GACdE,EAAS,IAAI;AACb,QAAI;AACF,YAAMK,IAAM,MAAM,MAAM,kCAAkC;AAAA,QACxD,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,mBAAA;AAAA,QAC3B,aAAa;AAAA,QACb,MAAM,KAAK,UAAU;AAAA,UACnB,iBAAiBI,EAAK;AAAA,UACtB,kBAAkBA,EAAK;AAAA,QAAA,CACxB;AAAA,MAAA,CACF,GACKH,IAAQ,MAAMD,EAAI,OAAO,MAAM,MAAM,IAAI;AAC/C,UAAI,CAACA,EAAI,MAAM,CAACC,GAAM,IAAI;AACxB,QAAAN,EAASM,GAAM,SAAS,uCAAuC;AAC/D;AAAA,MACF;AACA,YAAMC,IAAa7B,EAAkB4B,EAAK,QAAQ;AAClD,MAAAL,EAAYC,EAAiB,SAAS,IAAId,EAAsBmB,GAAYL,CAAgB,IAAIK,CAAU;AAAA,IAC5G,QAAQ;AACN,MAAAP,EAAS,uCAAuC;AAAA,IAClD,UAAA;AACE,MAAAF,EAAU,EAAK;AAAA,IACjB;AAAA,EACF;AAEA,EAAAY,EAAU,MAAM;AACd,IAAKN,EAAA;AAAA,EACP,GAAG,CAAA,CAAE,GAELM,EAAU,MAAM;AACd,IAAIR,EAAiB,WAAW,KAChCD,EAAY,CAACU,MAAYvB,EAAsBuB,GAAST,CAAgB,CAAC;AAAA,EAC3E,GAAG,CAACA,CAAgB,CAAC;AAErB,QAAMU,IAAmB,CAACzB,GAAe0B,MAA4E;AAEnH,UAAMC,IADcnC,EAAS,iBAAiB,KAAK,CAACoC,MAAMA,EAAE,UAAU5B,CAAK,IAEvER,EAAS,iBAAiB,IAAI,CAACoC,MAAOA,EAAE,UAAU5B,IAAQ0B,EAAOE,CAAC,IAAIA,CAAE,IACxE,CAAC,GAAGpC,EAAS,kBAAkBkC,EAAO,EAAE,OAAA1B,GAAO,OAAO,IAAM,aAAa,IAAM,MAAM,GAAA,CAAO,CAAC,GAC3FsB,IAAO/B,EAAkB,EAAE,GAAGC,GAAU,kBAAkBmC,GAAW;AAC3E,IAAAb,EAAYQ,CAAI,GACXD,EAAaC,CAAI;AAAA,EACxB;AAEA,SAAIf,IAEAsB,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAWC,EAAG,gEAAgExB,CAAS,GAC1F,UAAAuB,gBAAAA,EAAAA,IAACE,GAAA,EAAQ,WAAU,uBAAA,CAAuB,EAAA,CAC5C,2BAKD,OAAA,EAAI,WAAWD,EAAG,aAAaxB,CAAS,GACvC,UAAA;AAAA,IAAAuB,gBAAAA,EAAAA,IAAC,SAAI,WAAU,uCACb,UAAAG,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,MAAAA,gBAAAA,OAAC,OAAA,EACC,UAAA;AAAA,QAAAH,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,yBAAwB,UAAA,gBAAY;AAAA,QACnDA,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,sCAAqC,UAAA,2CAAA,CAAwC;AAAA,MAAA,GAC9F;AAAA,MACAA,gBAAAA,EAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAOrC,EAAS;AAAA,UAChB,UAAU,CAACyC,MAAM;AACf,kBAAMC,IAAQD,EAAE,OAAO,OACjBX,IAAO/B,EAAkB,EAAE,GAAGC,GAAU,iBAAiB0C,GAAO;AACtE,YAAApB,EAAYQ,CAAI,GACXD,EAAaC,CAAI;AAAA,UACxB;AAAA,UACA,WAAU;AAAA,UAET,UAAAhC,EAAa,IAAI,CAAC6C,MACjBN,gBAAAA,EAAAA,IAAC,UAAA,EAAuB,OAAOM,EAAI,OAChC,UAAAA,EAAI,MAAA,GADMA,EAAI,KAEjB,CACD;AAAA,QAAA;AAAA,MAAA;AAAA,IACH,EAAA,CACF,EAAA,CACF;AAAA,IAEAH,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,uCACb,UAAA;AAAA,MAAAH,gBAAAA,MAAC,OAAA,EAAI,WAAU,0CACb,UAAAG,gBAAAA,EAAAA,KAAC,OAAA,EACC,UAAA;AAAA,QAAAH,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,yBAAwB,UAAA,UAAM;AAAA,QAC7CA,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,sCAAqC,UAAA,uCAAA,CAAoC;AAAA,MAAA,EAAA,CAC1F,EAAA,CACF;AAAA,MAECd,EAAiB,WAAW,IAC3Bc,gBAAAA,MAAC,OAAA,EAAI,WAAU,sCAAqC,UAAA,yBAAqB,IAEzEA,gBAAAA,EAAAA,IAAC,SAAI,WAAU,wBACb,UAAAG,gBAAAA,OAAC,SAAA,EAAM,WAAU,kBACf,UAAA;AAAA,QAAAH,gBAAAA,MAAC,SAAA,EACC,UAAAG,gBAAAA,EAAAA,KAAC,MAAA,EAAG,WAAU,2CACZ,UAAA;AAAA,UAAAH,gBAAAA,EAAAA,IAAC,MAAA,EAAG,WAAU,yBAAwB,UAAA,SAAK;AAAA,UAC3CA,gBAAAA,EAAAA,IAAC,MAAA,EAAG,WAAU,yBAAwB,UAAA,UAAM;AAAA,UAC5CA,gBAAAA,EAAAA,IAAC,MAAA,EAAG,WAAU,yBAAwB,UAAA,gBAAY;AAAA,UAClDA,gBAAAA,EAAAA,IAAC,MAAA,EAAG,WAAU,yBAAwB,UAAA,OAAA,CAAI;AAAA,QAAA,EAAA,CAC5C,EAAA,CACF;AAAA,8BACC,SAAA,EACE,UAAArC,EAAS,iBAAiB,IAAI,CAACI,MAAS;AACvC,gBAAMwC,IAAOrB,EAAiB,KAAK,CAACf,MAAUA,EAAM,UAAUJ,EAAK,KAAK;AACxE,iBACEoC,gBAAAA,EAAAA,KAAC,MAAA,EAAoB,WAAU,sBAC7B,UAAA;AAAA,YAAAH,gBAAAA,EAAAA,IAAC,QAAG,WAAU,aACZ,UAAAG,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,uBACb,UAAA;AAAA,cAAAH,gBAAAA,MAAC,UAAK,WAAU,eAAe,UAAAO,GAAM,SAASxC,EAAK,OAAM;AAAA,cACxDwC,GAAM,cACLP,gBAAAA,MAAC,QAAA,EAAK,WAAU,iCAAiC,UAAAO,EAAK,aAAY,IAChE;AAAA,cACJP,gBAAAA,EAAAA,IAAC,QAAA,EAAK,WAAU,qCAAqC,YAAK,MAAA,CAAM;AAAA,YAAA,EAAA,CAClE,EAAA,CACF;AAAA,YACAA,gBAAAA,EAAAA,IAAC,MAAA,EAAG,WAAU,aACZ,UAAAA,gBAAAA,EAAAA;AAAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAASjC,EAAK;AAAA,gBACd,UAAU,CAACqC,MACTR,EAAiB7B,EAAK,OAAO,CAACgC,OAAO,EAAE,GAAGA,GAAG,OAAOK,EAAE,OAAO,UAAU;AAAA,cAAA;AAAA,YAAA,GAG7E;AAAA,YACAJ,gBAAAA,EAAAA,IAAC,MAAA,EAAG,WAAU,aACZ,UAAAA,gBAAAA,EAAAA;AAAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAASjC,EAAK;AAAA,gBACd,UAAU,CAACqC,MACTR,EAAiB7B,EAAK,OAAO,CAACgC,OAAO,EAAE,GAAGA,GAAG,aAAaK,EAAE,OAAO,UAAU;AAAA,cAAA;AAAA,YAAA,GAGnF;AAAA,YACAJ,gBAAAA,EAAAA,IAAC,MAAA,EAAG,WAAU,aACZ,UAAAA,gBAAAA,EAAAA;AAAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAASjC,EAAK;AAAA,gBACd,UAAQ;AAAA,gBACR,WAAU;AAAA,gBACV,cAAW;AAAA,cAAA;AAAA,YAAA,EACb,CACF;AAAA,UAAA,EAAA,GApCOA,EAAK,KAqCd;AAAA,QAEJ,CAAC,EAAA,CACH;AAAA,MAAA,EAAA,CACF,EAAA,CACF;AAAA,MAGDgB,IACCiB,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,iCAAiC,UAAAjB,EAAA,CAAM,IACpDF,IACFmB,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,sCAAqC,qBAAO,IACzD;AAAA,IAAA,EAAA,CACN;AAAA,EAAA,GACF;AAEJ;"}
1
+ {"version":3,"file":"index24.js","sources":["../src/components/Notifications/NotificationsDrawer.tsx"],"sourcesContent":["import { createContext, useCallback, useContext, useEffect, useMemo, useState, type Context } from \"react\"\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\"\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\"\nimport { Loader2, MoreVertical, X } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nimport type { NotificationItem, NotificationsRealtimeState } from \"./types\"\n\n\ntype ListResponse = {\n ok?: boolean\n error?: string\n notifications?: NotificationItem[]\n unreadCount?: number\n unseenCount?: number\n}\n\ntype DayGroup = {\n key: string\n label: string\n items: NotificationItem[]\n}\n\nconst toMs = (iso: string): number => {\n const ms = Date.parse(iso)\n return Number.isFinite(ms) ? ms : 0\n}\n\nconst getDayKey = (iso: string): string => {\n const date = new Date(toMs(iso))\n if (!Number.isFinite(date.getTime())) return \"unknown\"\n\n const year = date.getFullYear()\n const month = String(date.getMonth() + 1).padStart(2, \"0\")\n const day = String(date.getDate()).padStart(2, \"0\")\n\n return `${year}-${month}-${day}`\n}\n\nconst formatDayLabel = (key: string): string => {\n if (key === \"unknown\") return \"Unknown date\"\n const [yearRaw, monthRaw, dayRaw] = key.split(\"-\")\n const year = Number(yearRaw)\n const month = Number(monthRaw)\n const day = Number(dayRaw)\n\n if (!Number.isFinite(year) || !Number.isFinite(month) || !Number.isFinite(day)) return \"Unknown date\"\n\n const date = new Date(year, month - 1, day)\n if (!Number.isFinite(date.getTime())) return \"Unknown date\"\n\n const now = new Date()\n const includeYear = now.getFullYear() !== year\n return date.toLocaleDateString(undefined, includeYear\n ? { weekday: \"short\", month: \"short\", day: \"numeric\", year: \"numeric\" }\n : { weekday: \"short\", month: \"short\", day: \"numeric\" })\n}\n\nconst groupByDay = (items: NotificationItem[]): DayGroup[] => {\n const groups: DayGroup[] = []\n let currentKey: string | null = null\n\n for (const item of items) {\n const key = getDayKey(item.createdAt)\n if (key !== currentKey) {\n currentKey = key\n groups.push({ key, label: formatDayLabel(key), items: [] })\n }\n groups[groups.length - 1]!.items.push(item)\n }\n\n return groups\n}\n\nconst EmptyRealtimeContext = createContext<NotificationsRealtimeState | null>(null)\n\nexport function NotificationsDrawer({\n open,\n onOpenChange,\n className,\n limit = 50,\n defaultUnreadOnly = false,\n realtimeContext,\n}: {\n open: boolean\n onOpenChange: (open: boolean) => void\n className?: string\n limit?: number\n defaultUnreadOnly?: boolean\n realtimeContext?: Context<NotificationsRealtimeState | null>\n}) {\n const realtime = useContext(realtimeContext ?? EmptyRealtimeContext)\n\n const [items, setItems] = useState<NotificationItem[]>([])\n const [unreadCount, setUnreadCount] = useState<number>(0)\n const [unseenCount, setUnseenCount] = useState<number>(0)\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [unreadOnly, setUnreadOnly] = useState<boolean>(defaultUnreadOnly)\n\n const mergedItems = realtime?.notifications ?? items\n const mergedUnreadCount = realtime?.unreadCount ?? unreadCount\n const mergedUnseenCount = realtime?.unseenCount ?? unseenCount\n const mergedLoading = realtime?.loading ?? loading\n const mergedError = realtime?.error\n ? (realtime.error instanceof Error ? realtime.error.message : String(realtime.error))\n : error\n\n const visibleItems = useMemo(() => mergedItems.slice(0, limit), [limit, mergedItems])\n\n const unread = useMemo(() => visibleItems.filter((n) => !n.readAt), [visibleItems])\n const read = useMemo(() => visibleItems.filter((n) => Boolean(n.readAt)), [visibleItems])\n const unreadGroups = useMemo(() => groupByDay(unread), [unread])\n const readGroups = useMemo(() => groupByDay(read), [read])\n\n const refresh = useCallback(async ({ unreadOnly, markSeen }: { unreadOnly: boolean; markSeen: boolean }) => {\n setLoading(true)\n setError(null)\n\n try {\n const res = await fetch(\"/api/rb/notifications\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n credentials: \"include\",\n body: JSON.stringify({ limit, unreadOnly, markSeen }),\n })\n\n const json = (await res.json().catch(() => null)) as ListResponse | null\n if (!res.ok || !json?.ok) {\n setError(json?.error || \"Unable to load notifications.\")\n return\n }\n\n const nextItems = Array.isArray(json.notifications) ? json.notifications : []\n setItems(nextItems)\n setUnreadCount(Number.isFinite(json.unreadCount) ? Math.max(0, Math.floor(json.unreadCount ?? 0)) : 0)\n setUnseenCount(Number.isFinite(json.unseenCount) ? Math.max(0, Math.floor(json.unseenCount ?? 0)) : 0)\n } catch {\n setError(\"Unable to load notifications.\")\n } finally {\n setLoading(false)\n }\n }, [limit])\n\n useEffect(() => {\n if (!open) return\n if (realtime) {\n void (async () => {\n try {\n await fetch(\"/api/rb/notifications\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n credentials: \"include\",\n keepalive: true,\n body: JSON.stringify({ limit: 1, markSeen: true }),\n })\n } catch {\n return\n }\n })()\n return\n }\n void refresh({ unreadOnly, markSeen: true })\n }, [open, realtime, refresh, unreadOnly])\n\n useEffect(() => {\n if (!open) return\n if (realtime) return\n void refresh({ unreadOnly, markSeen: false })\n }, [open, realtime, refresh, unreadOnly])\n\n const markAsRead = async (id: string) => {\n try {\n const res = await fetch(`/api/rb/notifications/${encodeURIComponent(id)}/read`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n credentials: \"include\",\n keepalive: true,\n body: \"{}\",\n })\n\n const json = (await res.json().catch(() => null)) as { ok?: boolean } | null\n if (!res.ok || !json?.ok) return\n\n const nowIso = new Date().toISOString()\n if (realtime) return\n setItems((current) => {\n const target = current.find((n) => n.id === id)\n if (target && !target.readAt) {\n setUnreadCount((count) => Math.max(0, count - 1))\n }\n if (target && !target.seenAt) {\n setUnseenCount((count) => Math.max(0, count - 1))\n }\n return current.map((n) => (n.id === id && !n.readAt ? { ...n, readAt: nowIso, ...(n.seenAt ? {} : { seenAt: nowIso }) } : n))\n })\n } catch {\n return\n }\n }\n\n const archive = async (id: string) => {\n try {\n const res = await fetch(`/api/rb/notifications/${encodeURIComponent(id)}/archive`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n credentials: \"include\",\n body: \"{}\",\n })\n\n const json = (await res.json().catch(() => null)) as { ok?: boolean } | null\n if (!res.ok || !json?.ok) return\n\n if (realtime) return\n setItems((current) => {\n const target = current.find((n) => n.id === id)\n if (target && !target.readAt) {\n setUnreadCount((count) => Math.max(0, count - 1))\n }\n if (target && !target.seenAt) {\n setUnseenCount((count) => Math.max(0, count - 1))\n }\n return current.filter((n) => n.id !== id)\n })\n } catch {\n return\n }\n }\n\n return (\n <DialogPrimitive.Root open={open} onOpenChange={onOpenChange}>\n <DialogPrimitive.Portal>\n <DialogPrimitive.Overlay className=\"fixed inset-0 z-50 bg-black/50\" />\n <DialogPrimitive.Content\n className={cn(\n \"fixed right-0 top-0 z-50 flex h-full w-full max-w-md flex-col border-l bg-background shadow-xl outline-none\",\n className,\n )}\n >\n <header className=\"flex items-center justify-between gap-2 border-b px-4 py-3\">\n <div className=\"flex min-w-0 flex-col\">\n <DialogPrimitive.Title className=\"text-sm font-semibold\">Notifications</DialogPrimitive.Title>\n <span className=\"text-xs text-muted-foreground\">\n {mergedUnreadCount > 0 ? `${mergedUnreadCount} unread` : mergedUnseenCount > 0 ? `${mergedUnseenCount} new` : \"All caught up\"}\n </span>\n </div>\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n onClick={() => setUnreadOnly((v) => !v)}\n className={cn(\n \"rounded-md border px-2 py-1 text-xs\",\n unreadOnly ? \"bg-accent text-foreground\" : \"bg-background text-muted-foreground hover:bg-accent\",\n )}\n >\n {unreadOnly ? \"Unread\" : \"All\"}\n </button>\n <DialogPrimitive.Close asChild>\n <button type=\"button\" className=\"inline-flex h-8 w-8 items-center justify-center rounded-md hover:bg-accent\">\n <X className=\"h-4 w-4\" />\n </button>\n </DialogPrimitive.Close>\n </div>\n </header>\n\n <div className=\"flex-1 overflow-y-auto px-4 pb-3\">\n {mergedLoading ? (\n <div className=\"flex items-center justify-center py-10 text-muted-foreground\">\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n </div>\n ) : mergedError ? (\n <div className=\"py-10 text-center text-sm text-muted-foreground\">{mergedError}</div>\n ) : visibleItems.length === 0 ? (\n <div className=\"py-10 text-center text-sm text-muted-foreground\">No notifications.</div>\n ) : (\n <div className=\"flex flex-col gap-4\">\n <div>\n <div className=\"sticky top-0 z-20 -mx-4 flex h-8 items-center border-b bg-background px-4 text-xs font-semibold text-muted-foreground\">\n Unread notifications\n </div>\n {unreadGroups.length === 0 ? (\n <div className=\"py-6 text-center text-sm text-muted-foreground\">No unread notifications.</div>\n ) : (\n unreadGroups.map((group) => (\n <div key={`unread:${group.key}`}>\n <div className=\"sticky top-8 z-10 -mx-4 flex h-7 items-center bg-background px-4 text-[11px] font-semibold text-muted-foreground\">\n {group.label}\n </div>\n <div className=\"-mx-4 flex flex-col divide-y divide-border\">\n {group.items.map((n) => (\n <NotificationRow\n key={n.id}\n notification={n}\n onMarkRead={markAsRead}\n onArchive={archive}\n />\n ))}\n </div>\n </div>\n ))\n )}\n </div>\n\n {unreadOnly ? null : (\n <div>\n <div className=\"sticky top-0 z-20 -mx-4 flex h-8 items-center border-b bg-background px-4 text-xs font-semibold text-muted-foreground\">\n Previous notifications\n </div>\n {readGroups.length === 0 ? (\n <div className=\"py-6 text-center text-sm text-muted-foreground\">No previous notifications.</div>\n ) : (\n readGroups.map((group) => (\n <div key={`previous:${group.key}`}>\n <div className=\"sticky top-8 z-10 -mx-4 flex h-7 items-center bg-background px-4 text-[11px] font-semibold text-muted-foreground\">\n {group.label}\n </div>\n <div className=\"-mx-4 flex flex-col divide-y divide-border\">\n {group.items.map((n) => (\n <NotificationRow\n key={n.id}\n notification={n}\n onMarkRead={markAsRead}\n onArchive={archive}\n />\n ))}\n </div>\n </div>\n ))\n )}\n </div>\n )}\n </div>\n )}\n </div>\n </DialogPrimitive.Content>\n </DialogPrimitive.Portal>\n </DialogPrimitive.Root>\n )\n}\n\nfunction NotificationRow({\n notification,\n onMarkRead,\n onArchive,\n}: {\n notification: NotificationItem\n onMarkRead: (id: string) => void\n onArchive: (id: string) => void\n}) {\n const isUnread = !notification.readAt\n const createdAtLabel = (() => {\n const date = new Date(toMs(notification.createdAt))\n if (!Number.isFinite(date.getTime())) return \"\"\n return date.toLocaleString()\n })()\n\n return (\n <div\n className={cn(\n \"group flex w-full gap-3 px-4 py-3 hover:bg-accent/40\",\n isUnread ? \"bg-primary/5\" : \"bg-background\",\n )}\n >\n <button\n type=\"button\"\n className=\"min-w-0 flex-1 text-left\"\n onClick={() => {\n if (isUnread) {\n void onMarkRead(notification.id)\n }\n if (notification.url) {\n window.location.href = notification.url\n }\n }}\n >\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm font-semibold\">{notification.title}</div>\n {notification.body ? (\n <div className=\"mt-0.5 line-clamp-2 text-xs text-muted-foreground\">{notification.body}</div>\n ) : null}\n </div>\n {notification.url ? <div className=\"mt-2 truncate text-xs text-primary\">{notification.url}</div> : null}\n {createdAtLabel ? (\n <div className=\"mt-2 text-[11px] text-muted-foreground\">{createdAtLabel}</div>\n ) : null}\n </button>\n <div className=\"flex items-start\">\n <DropdownMenuPrimitive.Root>\n <DropdownMenuPrimitive.Trigger asChild>\n <button\n type=\"button\"\n className=\"inline-flex h-8 w-8 items-center justify-center rounded-md hover:bg-accent\"\n aria-label=\"Notification options\"\n >\n <MoreVertical className=\"h-4 w-4\" />\n </button>\n </DropdownMenuPrimitive.Trigger>\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n align=\"end\"\n sideOffset={6}\n className={cn(\n \"z-50 min-w-[10rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md\",\n \"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95\",\n \"data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n )}\n >\n <DropdownMenuPrimitive.Item\n className=\"relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\"\n onSelect={() => onArchive(notification.id)}\n >\n Archive\n </DropdownMenuPrimitive.Item>\n <DropdownMenuPrimitive.Item\n className=\"relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\"\n disabled={!isUnread}\n onSelect={() => onMarkRead(notification.id)}\n >\n Mark as read\n </DropdownMenuPrimitive.Item>\n </DropdownMenuPrimitive.Content>\n </DropdownMenuPrimitive.Portal>\n </DropdownMenuPrimitive.Root>\n </div>\n </div>\n )\n}\n"],"names":["toMs","iso","ms","getDayKey","date","year","month","day","formatDayLabel","key","yearRaw","monthRaw","dayRaw","includeYear","groupByDay","items","groups","currentKey","item","EmptyRealtimeContext","createContext","NotificationsDrawer","open","onOpenChange","className","limit","defaultUnreadOnly","realtimeContext","realtime","useContext","setItems","useState","unreadCount","setUnreadCount","unseenCount","setUnseenCount","loading","setLoading","error","setError","unreadOnly","setUnreadOnly","mergedItems","mergedUnreadCount","mergedUnseenCount","mergedLoading","mergedError","visibleItems","useMemo","unread","read","unreadGroups","readGroups","refresh","useCallback","markSeen","res","json","nextItems","useEffect","markAsRead","id","nowIso","current","target","n","count","archive","jsx","DialogPrimitive","jsxs","cn","v","X","Loader2","group","NotificationRow","notification","onMarkRead","onArchive","isUnread","createdAtLabel","DropdownMenuPrimitive.Root","DropdownMenuPrimitive.Trigger","MoreVertical","DropdownMenuPrimitive.Portal","DropdownMenuPrimitive.Content","DropdownMenuPrimitive.Item"],"mappings":"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"}