@rpcbase/ui 0.280.0 → 0.282.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.
- package/dist/components/AddressAutocompleteInput/index.d.ts +1 -1
- package/dist/components/AddressAutocompleteInput/index.d.ts.map +1 -1
- package/dist/components/ApplePayButton/index.d.ts +1 -1
- package/dist/components/ApplePayButton/index.d.ts.map +1 -1
- package/dist/components/Checkbox/index.d.ts +1 -1
- package/dist/components/Checkbox/index.d.ts.map +1 -1
- package/dist/components/DayPickerField/index.d.ts +2 -2
- package/dist/components/DayPickerField/index.d.ts.map +1 -1
- package/dist/components/Dialog/index.d.ts +9 -9
- package/dist/components/Dialog/index.d.ts.map +1 -1
- package/dist/components/FilesUploadField/index.d.ts +1 -1
- package/dist/components/FilesUploadField/index.d.ts.map +1 -1
- package/dist/components/HourPickerField/index.d.ts +2 -2
- package/dist/components/HourPickerField/index.d.ts.map +1 -1
- package/dist/components/I18nField/index.d.ts +1 -1
- package/dist/components/I18nField/index.d.ts.map +1 -1
- package/dist/components/Image/index.d.ts +1 -1
- package/dist/components/Image/index.d.ts.map +1 -1
- package/dist/components/ImagesField/index.d.ts +1 -1
- package/dist/components/ImagesField/index.d.ts.map +1 -1
- package/dist/components/Input/index.d.ts +1 -1
- package/dist/components/Input/index.d.ts.map +1 -1
- package/dist/components/Notifications/NotificationsButton.d.ts +1 -1
- package/dist/components/Notifications/NotificationsButton.d.ts.map +1 -1
- package/dist/components/Notifications/NotificationsDrawer.d.ts +1 -1
- package/dist/components/Notifications/NotificationsDrawer.d.ts.map +1 -1
- package/dist/components/Notifications/NotificationsSettings.d.ts +1 -1
- package/dist/components/Notifications/NotificationsSettings.d.ts.map +1 -1
- package/dist/components/PhoneNumberInput/suggestions.d.ts +3 -3
- package/dist/components/PhoneNumberInput/suggestions.d.ts.map +1 -1
- package/dist/components/Select/index.d.ts +2 -2
- package/dist/components/Select/index.d.ts.map +1 -1
- package/dist/components/header/MenuPopover/index.d.ts +1 -1
- package/dist/components/header/MenuPopover/index.d.ts.map +1 -1
- package/dist/index.js +12 -12
- package/dist/index10.js +6 -4
- package/dist/index10.js.map +1 -1
- package/dist/index12.js.map +1 -1
- package/dist/index13.js.map +1 -1
- package/dist/index14.js +88 -88
- package/dist/index14.js.map +1 -1
- package/dist/index15.js.map +1 -1
- package/dist/index154.js +19 -7
- package/dist/index154.js.map +1 -1
- package/dist/index16.js +36 -45
- package/dist/index16.js.map +1 -1
- package/dist/index160.js +3 -3
- package/dist/index160.js.map +1 -1
- package/dist/index166.js +5 -5
- package/dist/index166.js.map +1 -1
- package/dist/index172.js +27 -25
- package/dist/index172.js.map +1 -1
- package/dist/index181.js +1 -1
- package/dist/index181.js.map +1 -1
- package/dist/index182.js +145 -162
- package/dist/index182.js.map +1 -1
- package/dist/index184.js +6 -8
- package/dist/index184.js.map +1 -1
- package/dist/index186.js +2 -8
- package/dist/index186.js.map +1 -1
- package/dist/index19.js +1 -1
- package/dist/index19.js.map +1 -1
- package/dist/index195.js +1 -1
- package/dist/index195.js.map +1 -1
- package/dist/index196.js +2 -2
- package/dist/index196.js.map +1 -1
- package/dist/index197.js +1 -1
- package/dist/index197.js.map +1 -1
- package/dist/index198.js +16 -15
- package/dist/index198.js.map +1 -1
- package/dist/index199.js +13 -17
- package/dist/index199.js.map +1 -1
- package/dist/index200.js +3 -2
- package/dist/index200.js.map +1 -1
- package/dist/index207.js +5 -90
- package/dist/index207.js.map +1 -1
- package/dist/index208.js +15 -3
- package/dist/index208.js.map +1 -1
- package/dist/index209.js +102 -22
- package/dist/index209.js.map +1 -1
- package/dist/index210.js +3 -28
- package/dist/index210.js.map +1 -1
- package/dist/index211.js +23 -19
- package/dist/index211.js.map +1 -1
- package/dist/index212.js +27 -6
- package/dist/index212.js.map +1 -1
- package/dist/index213.js +19 -14
- package/dist/index213.js.map +1 -1
- package/dist/index214.js +5 -6
- package/dist/index214.js.map +1 -1
- package/dist/index215.js +14 -26
- package/dist/index215.js.map +1 -1
- package/dist/index216.js +7 -22
- package/dist/index216.js.map +1 -1
- package/dist/index217.js +27 -6
- package/dist/index217.js.map +1 -1
- package/dist/index218.js +23 -5
- package/dist/index218.js.map +1 -1
- package/dist/index219.js +6 -4
- package/dist/index219.js.map +1 -1
- package/dist/index220.js +5 -4
- package/dist/index220.js.map +1 -1
- package/dist/index221.js +4 -24
- package/dist/index221.js.map +1 -1
- package/dist/index222.js +4 -3
- package/dist/index222.js.map +1 -1
- package/dist/index223.js +21 -21
- package/dist/index223.js.map +1 -1
- package/dist/index224.js +3 -23
- package/dist/index224.js.map +1 -1
- package/dist/index225.js +23 -6
- package/dist/index225.js.map +1 -1
- package/dist/index226.js +22 -9
- package/dist/index226.js.map +1 -1
- package/dist/index227.js +5 -17
- package/dist/index227.js.map +1 -1
- package/dist/index228.js +8 -49
- package/dist/index228.js.map +1 -1
- package/dist/index229.js +18 -5
- package/dist/index229.js.map +1 -1
- package/dist/index230.js +50 -19
- package/dist/index230.js.map +1 -1
- package/dist/index231.js +20 -28
- package/dist/index231.js.map +1 -1
- package/dist/index232.js +27 -104
- package/dist/index232.js.map +1 -1
- package/dist/index233.js +98 -33
- package/dist/index233.js.map +1 -1
- package/dist/index234.js +28 -113
- package/dist/index234.js.map +1 -1
- package/dist/index235.js +117 -11
- package/dist/index235.js.map +1 -1
- package/dist/index236.js +12 -4
- package/dist/index236.js.map +1 -1
- package/dist/index237.js +4 -15
- package/dist/index237.js.map +1 -1
- package/dist/index238.js +13 -62
- package/dist/index238.js.map +1 -1
- package/dist/index239.js +64 -9
- package/dist/index239.js.map +1 -1
- package/dist/index240.js +10 -106
- package/dist/index240.js.map +1 -1
- package/dist/index241.js +107 -13
- package/dist/index241.js.map +1 -1
- package/dist/index242.js +16 -13
- package/dist/index242.js.map +1 -1
- package/dist/index243.js +13 -5
- package/dist/index243.js.map +1 -1
- package/dist/index244.js +4 -316
- package/dist/index244.js.map +1 -1
- package/dist/index245.js +315 -58
- package/dist/index245.js.map +1 -1
- package/dist/index246.js +58 -223
- package/dist/index246.js.map +1 -1
- package/dist/index247.js +215 -318
- package/dist/index247.js.map +1 -1
- package/dist/index248.js +250 -306
- package/dist/index248.js.map +1 -1
- package/dist/index249.js +308 -173
- package/dist/index249.js.map +1 -1
- package/dist/index250.js +178 -7
- package/dist/index250.js.map +1 -1
- package/dist/index251.js +8 -15
- package/dist/index251.js.map +1 -1
- package/dist/index252.js +41 -5
- package/dist/index252.js.map +1 -1
- package/dist/index253.js +46 -38
- package/dist/index253.js.map +1 -1
- package/dist/index254.js +7 -50
- package/dist/index254.js.map +1 -1
- package/dist/index255.js +49 -6
- package/dist/index255.js.map +1 -1
- package/dist/index256.js +48 -46
- package/dist/index256.js.map +1 -1
- package/dist/index257.js +6 -51
- package/dist/index257.js.map +1 -1
- package/dist/index258.js +10 -9
- package/dist/index258.js.map +1 -1
- package/dist/index259.js +60 -8
- package/dist/index259.js.map +1 -1
- package/dist/index26.js.map +1 -1
- package/dist/index260.js +41 -60
- package/dist/index260.js.map +1 -1
- package/dist/index261.js +88 -34
- package/dist/index261.js.map +1 -1
- package/dist/index262.js +47 -94
- package/dist/index262.js.map +1 -1
- package/dist/index263.js +36 -49
- package/dist/index263.js.map +1 -1
- package/dist/index264.js +45 -32
- package/dist/index264.js.map +1 -1
- package/dist/index265.js +47 -46
- package/dist/index265.js.map +1 -1
- package/dist/index266.js +18 -48
- package/dist/index266.js.map +1 -1
- package/dist/index267.js +174 -15
- package/dist/index267.js.map +1 -1
- package/dist/index268.js +47 -169
- package/dist/index268.js.map +1 -1
- package/dist/index269.js +17 -34
- package/dist/index269.js.map +1 -1
- package/dist/index270.js +59 -10
- package/dist/index270.js.map +1 -1
- package/dist/index271.js +10 -66
- package/dist/index271.js.map +1 -1
- package/dist/index272.js +4 -4
- package/dist/index273.js +71 -69
- package/dist/index273.js.map +1 -1
- package/dist/index274.js +158 -152
- package/dist/index274.js.map +1 -1
- package/dist/index275.js +7 -13
- package/dist/index275.js.map +1 -1
- package/dist/index276.js +12 -5
- package/dist/index276.js.map +1 -1
- package/dist/index277.js +12 -6
- package/dist/index277.js.map +1 -1
- package/dist/index278.js +11 -12
- package/dist/index278.js.map +1 -1
- package/dist/index279.js +65 -9
- package/dist/index279.js.map +1 -1
- package/dist/index280.js +6 -74
- package/dist/index280.js.map +1 -1
- package/dist/index281.js +25 -6
- package/dist/index281.js.map +1 -1
- package/dist/index282.js +24 -24
- package/dist/index282.js.map +1 -1
- package/dist/index283.js +125 -24
- package/dist/index283.js.map +1 -1
- package/dist/index284.js +52 -115
- package/dist/index284.js.map +1 -1
- package/dist/index285.js +59 -55
- package/dist/index285.js.map +1 -1
- package/dist/index286.js +48 -61
- package/dist/index286.js.map +1 -1
- package/dist/index287.js +5 -48
- package/dist/index287.js.map +1 -1
- package/dist/index288.js +14 -8
- package/dist/index288.js.map +1 -1
- package/dist/index289.js +18 -14
- package/dist/index289.js.map +1 -1
- package/dist/index290.js +10 -17
- package/dist/index290.js.map +1 -1
- package/dist/index291.js +23 -11
- package/dist/index291.js.map +1 -1
- package/dist/index292.js +52 -25
- package/dist/index292.js.map +1 -1
- package/dist/index293.js +6 -52
- package/dist/index293.js.map +1 -1
- package/dist/index294.js +137 -5
- package/dist/index294.js.map +1 -1
- package/dist/index295.js +59 -149
- package/dist/index295.js.map +1 -1
- package/dist/index296.js +90 -49
- package/dist/index296.js.map +1 -1
- package/dist/index297.js +11 -117
- package/dist/index297.js.map +1 -1
- package/dist/index298.js +863 -11
- package/dist/index298.js.map +1 -1
- package/dist/index299.js +21 -865
- package/dist/index299.js.map +1 -1
- package/dist/index3.js.map +1 -1
- package/dist/index300.js +417 -27
- package/dist/index300.js.map +1 -1
- package/dist/index301.js +774 -483
- package/dist/index301.js.map +1 -1
- package/dist/index302.js +7436 -803
- package/dist/index302.js.map +1 -1
- package/dist/index303.js +7 -7429
- package/dist/index303.js.map +1 -1
- package/dist/index304.js +12 -6
- package/dist/index304.js.map +1 -1
- package/dist/index305.js +5 -12
- package/dist/index305.js.map +1 -1
- package/dist/index306.js +3 -3
- package/dist/index306.js.map +1 -1
- package/dist/index307.js +469 -5
- package/dist/index307.js.map +1 -1
- package/dist/index308.js +32 -464
- package/dist/index308.js.map +1 -1
- package/dist/index309.js +18 -36
- package/dist/index309.js.map +1 -1
- package/dist/index310.js +28 -17
- package/dist/index310.js.map +1 -1
- package/dist/index311.js +4 -30
- package/dist/index311.js.map +1 -1
- package/dist/index312.js +59 -4
- package/dist/index312.js.map +1 -1
- package/dist/index313.js +11 -59
- package/dist/index313.js.map +1 -1
- package/dist/index314.js +5 -9
- package/dist/index314.js.map +1 -1
- package/dist/index315.js +9 -5
- package/dist/index315.js.map +1 -1
- package/dist/index316.js +12 -9
- package/dist/index316.js.map +1 -1
- package/dist/index317.js +3 -13
- package/dist/index317.js.map +1 -1
- package/dist/index318.js +17 -3
- package/dist/index318.js.map +1 -1
- package/dist/index319.js +23 -14
- package/dist/index319.js.map +1 -1
- package/dist/index320.js +39 -23
- package/dist/index320.js.map +1 -1
- package/dist/index321.js +5 -41
- package/dist/index321.js.map +1 -1
- package/dist/index322.js +25 -5
- package/dist/index322.js.map +1 -1
- package/dist/index323.js +18 -24
- package/dist/index323.js.map +1 -1
- package/dist/index324.js +32 -17
- package/dist/index324.js.map +1 -1
- package/dist/index325.js +5 -34
- package/dist/index325.js.map +1 -1
- package/dist/index326.js +9 -5
- package/dist/index326.js.map +1 -1
- package/dist/index327.js +7 -8
- package/dist/index327.js.map +1 -1
- package/dist/index328.js +9 -8
- package/dist/index328.js.map +1 -1
- package/dist/index329.js +10 -9
- package/dist/index329.js.map +1 -1
- package/dist/index330.js +7 -10
- package/dist/index330.js.map +1 -1
- package/dist/index331.js +75 -7
- package/dist/index331.js.map +1 -1
- package/dist/index332.js +153 -66
- package/dist/index332.js.map +1 -1
- package/dist/index333.js +99 -147
- package/dist/index333.js.map +1 -1
- package/dist/index334.js +13 -113
- package/dist/index334.js.map +1 -1
- package/dist/index335.js +78 -12
- package/dist/index335.js.map +1 -1
- package/dist/index336.js +23 -57
- package/dist/index336.js.map +1 -1
- package/dist/index337.js +12 -45
- package/dist/index337.js.map +1 -1
- package/dist/index338.js +16 -13
- package/dist/index338.js.map +1 -1
- package/dist/index339.js +100 -15
- package/dist/index339.js.map +1 -1
- package/dist/index340.js +50 -95
- package/dist/index340.js.map +1 -1
- package/dist/index341.js +57 -5
- package/dist/index341.js.map +1 -1
- package/dist/index342.js +41 -78
- package/dist/index342.js.map +1 -1
- package/dist/index343.js +100 -58
- package/dist/index343.js.map +1 -1
- package/dist/index344.js +46 -104
- package/dist/index344.js.map +1 -1
- package/dist/index345.js +39 -51
- package/dist/index345.js.map +1 -1
- package/dist/index346.js +143 -42
- package/dist/index346.js.map +1 -1
- package/dist/index347.js +122 -123
- package/dist/index347.js.map +1 -1
- package/dist/index348.js +224 -108
- package/dist/index348.js.map +1 -1
- package/dist/index349.js +158 -174
- package/dist/index349.js.map +1 -1
- package/dist/index350.js +213 -144
- package/dist/index350.js.map +1 -1
- package/dist/index351.js +5 -309
- package/dist/index351.js.map +1 -1
- package/dist/index352.js +6 -5
- package/dist/index352.js.map +1 -1
- package/dist/index353.js +7 -6
- package/dist/index353.js.map +1 -1
- package/dist/index354.js +4 -5
- package/dist/index354.js.map +1 -1
- package/dist/index355.js +4 -4
- package/dist/index355.js.map +1 -1
- package/dist/index356.js +21 -6
- package/dist/index356.js.map +1 -1
- package/dist/index357.js +10 -21
- package/dist/index357.js.map +1 -1
- package/dist/index358.js +128 -10
- package/dist/index358.js.map +1 -1
- package/dist/index359.js +36 -122
- package/dist/index359.js.map +1 -1
- package/dist/index360.js +64 -38
- package/dist/index360.js.map +1 -1
- package/dist/index361.js +115 -66
- package/dist/index361.js.map +1 -1
- package/dist/index362.js +485 -112
- package/dist/index362.js.map +1 -1
- package/dist/index363.js +7 -490
- package/dist/index363.js.map +1 -1
- package/dist/index364.js +1 -1
- package/dist/index364.js.map +1 -1
- package/dist/index367.js +2 -9
- package/dist/index367.js.map +1 -1
- package/dist/index368.js +26 -5
- package/dist/index368.js.map +1 -1
- package/dist/index369.js +43 -27
- package/dist/index369.js.map +1 -1
- package/dist/index370.js +35 -46
- package/dist/index370.js.map +1 -1
- package/dist/index371.js +16 -27
- package/dist/index371.js.map +1 -1
- package/dist/index372.js +41 -16
- package/dist/index372.js.map +1 -1
- package/dist/index373.js +11 -42
- package/dist/index373.js.map +1 -1
- package/dist/index374.js +10 -14
- package/dist/index374.js.map +1 -1
- package/dist/index375.js +51 -9
- package/dist/index375.js.map +1 -1
- package/dist/index376.js +40 -53
- package/dist/index376.js.map +1 -1
- package/dist/index377.js +17 -43
- package/dist/index377.js.map +1 -1
- package/dist/index378.js +4 -15
- package/dist/index378.js.map +1 -1
- package/dist/index379.js +4 -4
- package/dist/index379.js.map +1 -1
- package/dist/index380.js +9 -4
- package/dist/index380.js.map +1 -1
- package/dist/index381.js +304 -9
- package/dist/index381.js.map +1 -1
- package/dist/index382.js +4 -339
- package/dist/index382.js.map +1 -1
- package/dist/index383.js +21 -5
- package/dist/index383.js.map +1 -1
- package/dist/index384.js +106 -16
- package/dist/index384.js.map +1 -1
- package/dist/index385.js +19 -109
- package/dist/index385.js.map +1 -1
- package/dist/index386.js +18 -18
- package/dist/index386.js.map +1 -1
- package/dist/index387.js +14 -19
- package/dist/index387.js.map +1 -1
- package/dist/index388.js +12 -4
- package/dist/index388.js.map +1 -1
- package/dist/index389.js +113 -20
- package/dist/index389.js.map +1 -1
- package/dist/index390.js +5 -11
- package/dist/index390.js.map +1 -1
- package/dist/index391.js +28 -85
- package/dist/index391.js.map +1 -1
- package/dist/index392.js +9 -9
- package/dist/index392.js.map +1 -1
- package/dist/index393.js +6 -29
- package/dist/index393.js.map +1 -1
- package/dist/index394.js +254 -10
- package/dist/index394.js.map +1 -1
- package/dist/index395.js +12 -6
- package/dist/index395.js.map +1 -1
- package/dist/index396.js +11 -252
- package/dist/index396.js.map +1 -1
- package/dist/index397.js +6 -11
- package/dist/index397.js.map +1 -1
- package/dist/index398.js +22 -10
- package/dist/index398.js.map +1 -1
- package/dist/index399.js +22 -6
- package/dist/index399.js.map +1 -1
- package/dist/index4.js.map +1 -1
- package/dist/index400.js +103 -21
- package/dist/index400.js.map +1 -1
- package/dist/index401.js +15 -23
- package/dist/index401.js.map +1 -1
- package/dist/index402.js +11 -108
- package/dist/index402.js.map +1 -1
- package/dist/index403.js +10 -15
- package/dist/index403.js.map +1 -1
- package/dist/index404.js +237 -10
- package/dist/index404.js.map +1 -1
- package/dist/index405.js +27 -9
- package/dist/index405.js.map +1 -1
- package/dist/index406.js +33 -238
- package/dist/index406.js.map +1 -1
- package/dist/index407.js +11 -30
- package/dist/index407.js.map +1 -1
- package/dist/index408.js +118 -48
- package/dist/index408.js.map +1 -1
- package/dist/index409.js +39 -11
- package/dist/index409.js.map +1 -1
- package/dist/index410.js +18 -121
- package/dist/index410.js.map +1 -1
- package/dist/index411.js +11 -39
- package/dist/index411.js.map +1 -1
- package/dist/index412.js +21 -24
- package/dist/index412.js.map +1 -1
- package/dist/index413.js +17 -11
- package/dist/index413.js.map +1 -1
- package/dist/index414.js +10 -20
- package/dist/index414.js.map +1 -1
- package/dist/index415.js +4 -17
- package/dist/index415.js.map +1 -1
- package/dist/index416.js +300 -14
- package/dist/index416.js.map +1 -1
- package/dist/index417.js +61 -323
- package/dist/index417.js.map +1 -1
- package/dist/index418.js +4 -63
- package/dist/index418.js.map +1 -1
- package/dist/index419.js +28 -4
- package/dist/index419.js.map +1 -1
- package/dist/index420.js +468 -25
- package/dist/index420.js.map +1 -1
- package/dist/index421.js +250 -452
- package/dist/index421.js.map +1 -1
- package/dist/index6.js.map +1 -1
- package/dist/index7.js +91 -133
- package/dist/index7.js.map +1 -1
- package/dist/index70.js +2 -2
- package/dist/index70.js.map +1 -1
- package/dist/index71.js +11 -4
- package/dist/index71.js.map +1 -1
- package/dist/index72.js +1 -3
- package/dist/index72.js.map +1 -1
- package/dist/index8.js.map +1 -1
- package/dist/index9.js +16 -19
- package/dist/index9.js.map +1 -1
- package/dist/test-only/TestCoverageTestBadge/index.d.ts +1 -1
- package/dist/test-only/TestCoverageTestBadge/index.d.ts.map +1 -1
- package/package.json +15 -15
- package/dist/index422.js +0 -272
- package/dist/index422.js.map +0 -1
package/dist/index420.js
CHANGED
|
@@ -1,31 +1,474 @@
|
|
|
1
1
|
import { cn as e } from "./index12.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
})
|
|
19
|
-
|
|
20
|
-
|
|
2
|
+
import { DialogBackdrop as t } from "./index199.js";
|
|
3
|
+
import { DialogClose as n } from "./index212.js";
|
|
4
|
+
import { DialogPopup as r } from "./index279.js";
|
|
5
|
+
import { DialogPortal as i } from "./index282.js";
|
|
6
|
+
import { DialogRoot as a } from "./index287.js";
|
|
7
|
+
import { DialogTitle as o } from "./index288.js";
|
|
8
|
+
import { c as s } from "react/compiler-runtime";
|
|
9
|
+
import { createContext as c, useCallback as l, useContext as u, useEffect as d, useMemo as f, useRef as p, useState as m } from "react";
|
|
10
|
+
import { Loader2 as h, MoreVertical as g, X as _ } from "lucide-react";
|
|
11
|
+
import { jsx as v, jsxs as y } from "react/jsx-runtime";
|
|
12
|
+
//#region src/components/Notifications/NotificationsDrawer.tsx
|
|
13
|
+
var b = (e) => {
|
|
14
|
+
let t = Date.parse(e);
|
|
15
|
+
return Number.isFinite(t) ? t : 0;
|
|
16
|
+
}, x = (e) => {
|
|
17
|
+
let t = new Date(b(e));
|
|
18
|
+
return Number.isFinite(t.getTime()) ? `${t.getFullYear()}-${String(t.getMonth() + 1).padStart(2, "0")}-${String(t.getDate()).padStart(2, "0")}` : "unknown";
|
|
19
|
+
}, S = (e) => {
|
|
20
|
+
if (e === "unknown") return "Unknown date";
|
|
21
|
+
let [t, n, r] = e.split("-"), i = Number(t), a = Number(n), o = Number(r);
|
|
22
|
+
if (!Number.isFinite(i) || !Number.isFinite(a) || !Number.isFinite(o)) return "Unknown date";
|
|
23
|
+
let s = new Date(i, a - 1, o);
|
|
24
|
+
if (!Number.isFinite(s.getTime())) return "Unknown date";
|
|
25
|
+
let c = (/* @__PURE__ */ new Date()).getFullYear() !== i;
|
|
26
|
+
return s.toLocaleDateString(void 0, c ? {
|
|
27
|
+
weekday: "short",
|
|
28
|
+
month: "short",
|
|
29
|
+
day: "numeric",
|
|
30
|
+
year: "numeric"
|
|
31
|
+
} : {
|
|
32
|
+
weekday: "short",
|
|
33
|
+
month: "short",
|
|
34
|
+
day: "numeric"
|
|
35
|
+
});
|
|
36
|
+
}, C = (e) => {
|
|
37
|
+
let t = e.data?.link?.trim();
|
|
38
|
+
if (t) return t;
|
|
39
|
+
let n = e.platform?.webpush;
|
|
40
|
+
if (!n || typeof n != "object" || Array.isArray(n)) return "";
|
|
41
|
+
let r = n.fcmOptions;
|
|
42
|
+
if (!r || typeof r != "object" || Array.isArray(r)) return "";
|
|
43
|
+
let i = r.link;
|
|
44
|
+
return typeof i == "string" ? i.trim() : "";
|
|
45
|
+
}, w = (e) => e.data?.linkMode === "merge_current_search" ? "merge_current_search" : "navigate", T = (e) => {
|
|
46
|
+
let t = C(e);
|
|
47
|
+
return t ? {
|
|
48
|
+
link: t,
|
|
49
|
+
mode: w(e)
|
|
50
|
+
} : null;
|
|
51
|
+
}, E = (e) => e ? e.mode === "merge_current_search" ? "Open" : e.link : "", D = (e) => {
|
|
52
|
+
window.history.pushState(window.history.state, "", e), window.dispatchEvent(new PopStateEvent("popstate", { state: window.history.state }));
|
|
53
|
+
}, O = (e) => {
|
|
54
|
+
if (e.mode === "merge_current_search") {
|
|
55
|
+
let t = new URL(window.location.href), n = new URL(e.link, t);
|
|
56
|
+
n.searchParams.forEach((e, n) => {
|
|
57
|
+
t.searchParams.set(n, e);
|
|
58
|
+
}), n.hash && (t.hash = n.hash), D(`${t.pathname}${t.search}${t.hash}`);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
window.location.href = e.link;
|
|
62
|
+
}, k = (e) => {
|
|
63
|
+
let t = [], n = null;
|
|
64
|
+
for (let r of e) {
|
|
65
|
+
let e = x(r.createdAt);
|
|
66
|
+
e !== n && (n = e, t.push({
|
|
67
|
+
key: e,
|
|
68
|
+
label: S(e),
|
|
69
|
+
items: []
|
|
70
|
+
})), t[t.length - 1].items.push(r);
|
|
71
|
+
}
|
|
72
|
+
return t;
|
|
73
|
+
}, A = () => typeof window > "u" || !("Notification" in window) ? "unsupported" : window.Notification.permission, j = c(null);
|
|
74
|
+
function M({ open: s, onOpenChange: c, className: p, limit: g = 50, defaultUnreadOnly: b = !1, realtimeContext: x }) {
|
|
75
|
+
let S = u(x ?? j), [C, w] = m([]), [T, E] = m(0), [D, O] = m(0), [M, F] = m(!1), [I, L] = m(null), [R, z] = m(b), [B, V] = m(() => A()), [H, U] = m(!1), W = S?.notifications ?? C, G = S?.unreadCount ?? T, K = S?.unseenCount ?? D, ee = S?.loading ?? M, q = S?.error ? S.error instanceof Error ? S.error.message : String(S.error) : I, J = f(() => W.slice(0, g), [g, W]), Y = f(() => J.filter((e) => !e.readAt), [J]), X = f(() => J.filter((e) => !!e.readAt), [J]), Z = f(() => k(Y), [Y]), te = f(() => k(X), [X]), Q = l(async ({ unreadOnly: e, markSeen: t }) => {
|
|
76
|
+
F(!0), L(null);
|
|
77
|
+
try {
|
|
78
|
+
let n = await fetch("/api/rb/notifications", {
|
|
79
|
+
method: "POST",
|
|
80
|
+
headers: { "Content-Type": "application/json" },
|
|
81
|
+
credentials: "include",
|
|
82
|
+
body: JSON.stringify({
|
|
83
|
+
limit: g,
|
|
84
|
+
unreadOnly: e,
|
|
85
|
+
markSeen: t
|
|
86
|
+
})
|
|
87
|
+
}), r = await n.json().catch(() => null);
|
|
88
|
+
if (!n.ok || !r?.ok) {
|
|
89
|
+
L(r?.error || "Unable to load notifications.");
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
let i = Array.isArray(r.notifications) ? r.notifications : [];
|
|
93
|
+
w(i), E(Number.isFinite(r.unreadCount) ? Math.max(0, Math.floor(r.unreadCount ?? 0)) : 0), O(Number.isFinite(r.unseenCount) ? Math.max(0, Math.floor(r.unseenCount ?? 0)) : 0);
|
|
94
|
+
} catch {
|
|
95
|
+
L("Unable to load notifications.");
|
|
96
|
+
} finally {
|
|
97
|
+
F(!1);
|
|
98
|
+
}
|
|
99
|
+
}, [g]);
|
|
100
|
+
d(() => {
|
|
101
|
+
if (s) {
|
|
102
|
+
if (S) {
|
|
103
|
+
(async () => {
|
|
104
|
+
try {
|
|
105
|
+
await fetch("/api/rb/notifications", {
|
|
106
|
+
method: "POST",
|
|
107
|
+
headers: { "Content-Type": "application/json" },
|
|
108
|
+
credentials: "include",
|
|
109
|
+
keepalive: !0,
|
|
110
|
+
body: JSON.stringify({
|
|
111
|
+
limit: 1,
|
|
112
|
+
markSeen: !0
|
|
113
|
+
})
|
|
114
|
+
});
|
|
115
|
+
} catch {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
})();
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
Q({
|
|
122
|
+
unreadOnly: R,
|
|
123
|
+
markSeen: !0
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
}, [
|
|
127
|
+
s,
|
|
128
|
+
S,
|
|
129
|
+
Q,
|
|
130
|
+
R
|
|
131
|
+
]), d(() => {
|
|
132
|
+
s && (S || Q({
|
|
133
|
+
unreadOnly: R,
|
|
134
|
+
markSeen: !1
|
|
135
|
+
}));
|
|
136
|
+
}, [
|
|
137
|
+
s,
|
|
138
|
+
S,
|
|
139
|
+
Q,
|
|
140
|
+
R
|
|
141
|
+
]), d(() => {
|
|
142
|
+
if (!s || (V(A()), typeof navigator > "u" || !navigator.permissions?.query)) return;
|
|
143
|
+
let e = null, t = !1, n = () => {
|
|
144
|
+
V(A());
|
|
145
|
+
};
|
|
146
|
+
try {
|
|
147
|
+
navigator.permissions.query({ name: "notifications" }).then((r) => {
|
|
148
|
+
t || (e = r, n(), r.addEventListener("change", n));
|
|
149
|
+
}).catch(() => {});
|
|
150
|
+
} catch {
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
return () => {
|
|
154
|
+
t = !0, e?.removeEventListener("change", n);
|
|
155
|
+
};
|
|
156
|
+
}, [s]);
|
|
157
|
+
let ne = async () => {
|
|
158
|
+
if (typeof window > "u" || !("Notification" in window)) {
|
|
159
|
+
V("unsupported");
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
U(!0);
|
|
163
|
+
try {
|
|
164
|
+
let e = await window.Notification.requestPermission();
|
|
165
|
+
V(e);
|
|
166
|
+
} catch {
|
|
167
|
+
V(A());
|
|
168
|
+
} finally {
|
|
169
|
+
U(!1);
|
|
170
|
+
}
|
|
171
|
+
}, re = async (e) => {
|
|
172
|
+
try {
|
|
173
|
+
let t = await fetch(`/api/rb/notifications/${encodeURIComponent(e)}/read`, {
|
|
174
|
+
method: "POST",
|
|
175
|
+
headers: { "Content-Type": "application/json" },
|
|
176
|
+
credentials: "include",
|
|
177
|
+
keepalive: !0,
|
|
178
|
+
body: "{}"
|
|
179
|
+
}), n = await t.json().catch(() => null);
|
|
180
|
+
if (!t.ok || !n?.ok) return;
|
|
181
|
+
let r = (/* @__PURE__ */ new Date()).toISOString();
|
|
182
|
+
if (S) return;
|
|
183
|
+
w((t) => {
|
|
184
|
+
let n = t.find((t) => t.id === e);
|
|
185
|
+
return n && !n.readAt && E((e) => Math.max(0, e - 1)), n && !n.seenAt && O((e) => Math.max(0, e - 1)), t.map((t) => t.id === e && !t.readAt ? {
|
|
186
|
+
...t,
|
|
187
|
+
readAt: r,
|
|
188
|
+
...t.seenAt ? {} : { seenAt: r }
|
|
189
|
+
} : t);
|
|
190
|
+
});
|
|
191
|
+
} catch {
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
}, ie = async (e) => {
|
|
195
|
+
try {
|
|
196
|
+
let t = await fetch(`/api/rb/notifications/${encodeURIComponent(e)}/archive`, {
|
|
197
|
+
method: "POST",
|
|
198
|
+
headers: { "Content-Type": "application/json" },
|
|
199
|
+
credentials: "include",
|
|
200
|
+
body: "{}"
|
|
201
|
+
}), n = await t.json().catch(() => null);
|
|
202
|
+
if (!t.ok || !n?.ok || S) return;
|
|
203
|
+
w((t) => {
|
|
204
|
+
let n = t.find((t) => t.id === e);
|
|
205
|
+
return n && !n.readAt && E((e) => Math.max(0, e - 1)), n && !n.seenAt && O((e) => Math.max(0, e - 1)), t.filter((t) => t.id !== e);
|
|
206
|
+
});
|
|
207
|
+
} catch {
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
}, $ = () => {
|
|
211
|
+
c(!1);
|
|
212
|
+
};
|
|
213
|
+
return /* @__PURE__ */ v(a, {
|
|
214
|
+
open: s,
|
|
215
|
+
onOpenChange: (e) => {
|
|
216
|
+
if (e) {
|
|
217
|
+
c(!0);
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
$();
|
|
221
|
+
},
|
|
222
|
+
children: /* @__PURE__ */ y(i, { children: [/* @__PURE__ */ v(t, {
|
|
223
|
+
className: "fixed inset-0 z-50 bg-black/50",
|
|
224
|
+
onClick: $
|
|
225
|
+
}), /* @__PURE__ */ y(r, {
|
|
226
|
+
className: e("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", p),
|
|
227
|
+
children: [/* @__PURE__ */ y("header", {
|
|
228
|
+
className: "flex items-center justify-between gap-2 border-b px-4 py-3",
|
|
229
|
+
children: [/* @__PURE__ */ y("div", {
|
|
230
|
+
className: "flex min-w-0 flex-col",
|
|
231
|
+
children: [/* @__PURE__ */ v(o, {
|
|
232
|
+
className: "text-sm font-semibold",
|
|
233
|
+
children: "Notifications"
|
|
234
|
+
}), /* @__PURE__ */ v("span", {
|
|
235
|
+
className: "text-xs text-muted-foreground",
|
|
236
|
+
children: G > 0 ? `${G} unread` : K > 0 ? `${K} new` : "All caught up"
|
|
237
|
+
})]
|
|
238
|
+
}), /* @__PURE__ */ y("div", {
|
|
239
|
+
className: "flex items-center gap-2",
|
|
240
|
+
children: [/* @__PURE__ */ v("button", {
|
|
241
|
+
type: "button",
|
|
242
|
+
onClick: () => z((e) => !e),
|
|
243
|
+
className: e("rounded-md border px-2 py-1 text-xs", R ? "bg-accent text-foreground" : "bg-background text-muted-foreground hover:bg-accent"),
|
|
244
|
+
children: R ? "Unread" : "All"
|
|
245
|
+
}), /* @__PURE__ */ v(n, {
|
|
246
|
+
type: "button",
|
|
247
|
+
"aria-label": "Close notifications",
|
|
248
|
+
className: "inline-flex h-8 w-8 items-center justify-center rounded-md hover:bg-accent",
|
|
249
|
+
onClick: $,
|
|
250
|
+
children: /* @__PURE__ */ v(_, { className: "h-4 w-4" })
|
|
251
|
+
})]
|
|
252
|
+
})]
|
|
253
|
+
}), /* @__PURE__ */ y("div", {
|
|
254
|
+
className: "flex-1 overflow-y-auto px-4 pb-3",
|
|
255
|
+
children: [/* @__PURE__ */ v(N, {
|
|
256
|
+
permission: B,
|
|
257
|
+
requesting: H,
|
|
258
|
+
onEnable: ne
|
|
259
|
+
}), ee ? /* @__PURE__ */ v("div", {
|
|
260
|
+
className: "flex items-center justify-center py-10 text-muted-foreground",
|
|
261
|
+
children: /* @__PURE__ */ v(h, { className: "h-4 w-4 animate-spin" })
|
|
262
|
+
}) : q ? /* @__PURE__ */ v("div", {
|
|
263
|
+
className: "py-10 text-center text-sm text-muted-foreground",
|
|
264
|
+
children: q
|
|
265
|
+
}) : J.length === 0 ? /* @__PURE__ */ v("div", {
|
|
266
|
+
className: "py-10 text-center text-sm text-muted-foreground",
|
|
267
|
+
children: "No notifications."
|
|
268
|
+
}) : /* @__PURE__ */ y("div", {
|
|
269
|
+
className: "flex flex-col gap-4",
|
|
270
|
+
children: [/* @__PURE__ */ y("div", { children: [/* @__PURE__ */ v("div", {
|
|
271
|
+
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",
|
|
272
|
+
children: "Unread notifications"
|
|
273
|
+
}), Z.length === 0 ? /* @__PURE__ */ v("div", {
|
|
274
|
+
className: "py-6 text-center text-sm text-muted-foreground",
|
|
275
|
+
children: "No unread notifications."
|
|
276
|
+
}) : Z.map((e) => /* @__PURE__ */ y("div", { children: [/* @__PURE__ */ v("div", {
|
|
277
|
+
className: "sticky top-8 z-10 -mx-4 flex h-7 items-center bg-background px-4 text-[11px] font-semibold text-muted-foreground",
|
|
278
|
+
children: e.label
|
|
279
|
+
}), /* @__PURE__ */ v("div", {
|
|
280
|
+
className: "-mx-4 flex flex-col divide-y divide-border",
|
|
281
|
+
children: e.items.map((e) => /* @__PURE__ */ v(P, {
|
|
282
|
+
notification: e,
|
|
283
|
+
onMarkRead: re,
|
|
284
|
+
onArchive: ie,
|
|
285
|
+
onAction: $
|
|
286
|
+
}, e.id))
|
|
287
|
+
})] }, `unread:${e.key}`))] }), R ? null : /* @__PURE__ */ y("div", { children: [/* @__PURE__ */ v("div", {
|
|
288
|
+
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",
|
|
289
|
+
children: "Previous notifications"
|
|
290
|
+
}), te.length === 0 ? /* @__PURE__ */ v("div", {
|
|
291
|
+
className: "py-6 text-center text-sm text-muted-foreground",
|
|
292
|
+
children: "No previous notifications."
|
|
293
|
+
}) : te.map((e) => /* @__PURE__ */ y("div", { children: [/* @__PURE__ */ v("div", {
|
|
294
|
+
className: "sticky top-8 z-10 -mx-4 flex h-7 items-center bg-background px-4 text-[11px] font-semibold text-muted-foreground",
|
|
295
|
+
children: e.label
|
|
296
|
+
}), /* @__PURE__ */ v("div", {
|
|
297
|
+
className: "-mx-4 flex flex-col divide-y divide-border",
|
|
298
|
+
children: e.items.map((e) => /* @__PURE__ */ v(P, {
|
|
299
|
+
notification: e,
|
|
300
|
+
onMarkRead: re,
|
|
301
|
+
onArchive: ie,
|
|
302
|
+
onAction: $
|
|
303
|
+
}, e.id))
|
|
304
|
+
})] }, `previous:${e.key}`))] })]
|
|
305
|
+
})]
|
|
306
|
+
})]
|
|
307
|
+
})] })
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
function N(e) {
|
|
311
|
+
let t = s(13), { permission: n, requesting: r, onEnable: i } = e;
|
|
312
|
+
if (n === "granted") return null;
|
|
313
|
+
if (n === "unsupported") {
|
|
314
|
+
let e;
|
|
315
|
+
return t[0] === Symbol.for("react.memo_cache_sentinel") ? (e = /* @__PURE__ */ v("div", {
|
|
316
|
+
className: "mt-3 rounded-md border bg-muted/40 p-3 text-sm text-muted-foreground",
|
|
317
|
+
children: "Browser notifications are not supported by this browser."
|
|
318
|
+
}), t[0] = e) : e = t[0], e;
|
|
319
|
+
}
|
|
320
|
+
let a = n === "denied", o = a ? "Browser notifications are blocked." : "Browser notifications are not enabled.", c;
|
|
321
|
+
t[1] === o ? c = t[2] : (c = /* @__PURE__ */ v("div", {
|
|
322
|
+
className: "text-sm font-medium",
|
|
323
|
+
children: o
|
|
324
|
+
}), t[1] = o, t[2] = c);
|
|
325
|
+
let l = a ? "Enable notifications for this site in your browser settings, then click again." : "Enable browser notifications to receive important alerts.", u;
|
|
326
|
+
t[3] === l ? u = t[4] : (u = /* @__PURE__ */ v("div", {
|
|
327
|
+
className: "mt-1 text-xs text-muted-foreground",
|
|
328
|
+
children: l
|
|
329
|
+
}), t[3] = l, t[4] = u);
|
|
330
|
+
let d = r ? "Enabling..." : "Enable browser notifications", f;
|
|
331
|
+
t[5] !== i || t[6] !== r || t[7] !== d ? (f = /* @__PURE__ */ v("button", {
|
|
332
|
+
type: "button",
|
|
333
|
+
className: "mt-3 inline-flex h-8 items-center rounded-md border bg-background px-2.5 text-xs font-medium hover:bg-accent disabled:pointer-events-none disabled:opacity-50",
|
|
334
|
+
disabled: r,
|
|
335
|
+
onClick: i,
|
|
336
|
+
children: d
|
|
337
|
+
}), t[5] = i, t[6] = r, t[7] = d, t[8] = f) : f = t[8];
|
|
338
|
+
let p;
|
|
339
|
+
return t[9] !== c || t[10] !== u || t[11] !== f ? (p = /* @__PURE__ */ y("div", {
|
|
340
|
+
className: "mt-3 rounded-md border bg-muted/40 p-3",
|
|
341
|
+
children: [
|
|
342
|
+
c,
|
|
343
|
+
u,
|
|
344
|
+
f
|
|
345
|
+
]
|
|
346
|
+
}), t[9] = c, t[10] = u, t[11] = f, t[12] = p) : p = t[12], p;
|
|
347
|
+
}
|
|
348
|
+
function P(t) {
|
|
349
|
+
let n = s(49), { notification: r, onMarkRead: i, onArchive: a, onAction: o } = t, [c, l] = m(!1), u = p(null), f = p(null), h = !r.readAt, _, x;
|
|
350
|
+
n[0] === r ? (_ = n[1], x = n[2]) : (_ = T(r), x = E(_), n[0] = r, n[1] = _, n[2] = x);
|
|
351
|
+
let S = x, C;
|
|
352
|
+
if (n[3] !== r.createdAt) {
|
|
353
|
+
bb0: {
|
|
354
|
+
let e = new Date(b(r.createdAt));
|
|
355
|
+
if (!Number.isFinite(e.getTime())) {
|
|
356
|
+
C = "";
|
|
357
|
+
break bb0;
|
|
358
|
+
}
|
|
359
|
+
C = e.toLocaleString();
|
|
360
|
+
}
|
|
361
|
+
n[3] = r.createdAt, n[4] = C;
|
|
362
|
+
} else C = n[4];
|
|
363
|
+
let w = C, D, k;
|
|
364
|
+
n[5] === c ? (D = n[6], k = n[7]) : (D = () => {
|
|
365
|
+
if (!c) return;
|
|
366
|
+
let e = (e) => {
|
|
367
|
+
let t = e.target;
|
|
368
|
+
t instanceof Node && (u.current?.contains(t) || f.current?.contains(t) || l(!1));
|
|
369
|
+
}, t = (e) => {
|
|
370
|
+
e.key === "Escape" && (l(!1), f.current?.focus());
|
|
371
|
+
};
|
|
372
|
+
return document.addEventListener("pointerdown", e), document.addEventListener("keydown", t), () => {
|
|
373
|
+
document.removeEventListener("pointerdown", e), document.removeEventListener("keydown", t);
|
|
374
|
+
};
|
|
375
|
+
}, k = [c], n[5] = c, n[6] = D, n[7] = k), d(D, k);
|
|
376
|
+
let A = h ? "bg-primary/5" : "bg-background", j;
|
|
377
|
+
n[8] === A ? j = n[9] : (j = e("group flex w-full gap-3 px-4 py-3 hover:bg-accent/40", A), n[8] = A, n[9] = j);
|
|
378
|
+
let M;
|
|
379
|
+
n[10] !== _ || n[11] !== h || n[12] !== r.id || n[13] !== o || n[14] !== i ? (M = () => {
|
|
380
|
+
h && i(r.id), _ && (o(), O(_));
|
|
381
|
+
}, n[10] = _, n[11] = h, n[12] = r.id, n[13] = o, n[14] = i, n[15] = M) : M = n[15];
|
|
382
|
+
let N;
|
|
383
|
+
n[16] === r.title ? N = n[17] : (N = /* @__PURE__ */ v("div", {
|
|
384
|
+
className: "truncate text-sm font-semibold",
|
|
385
|
+
children: r.title
|
|
386
|
+
}), n[16] = r.title, n[17] = N);
|
|
387
|
+
let P;
|
|
388
|
+
n[18] === r.body ? P = n[19] : (P = r.body ? /* @__PURE__ */ v("div", {
|
|
389
|
+
className: "mt-0.5 line-clamp-2 text-xs text-muted-foreground",
|
|
390
|
+
children: r.body
|
|
391
|
+
}) : null, n[18] = r.body, n[19] = P);
|
|
392
|
+
let I;
|
|
393
|
+
n[20] !== N || n[21] !== P ? (I = /* @__PURE__ */ y("div", {
|
|
394
|
+
className: "min-w-0",
|
|
395
|
+
children: [N, P]
|
|
396
|
+
}), n[20] = N, n[21] = P, n[22] = I) : I = n[22];
|
|
397
|
+
let L;
|
|
398
|
+
n[23] === S ? L = n[24] : (L = S ? /* @__PURE__ */ v("div", {
|
|
399
|
+
className: "mt-2 truncate text-xs text-primary",
|
|
400
|
+
children: S
|
|
401
|
+
}) : null, n[23] = S, n[24] = L);
|
|
402
|
+
let R;
|
|
403
|
+
n[25] === w ? R = n[26] : (R = w ? /* @__PURE__ */ v("div", {
|
|
404
|
+
className: "mt-2 text-[11px] text-muted-foreground",
|
|
405
|
+
children: w
|
|
406
|
+
}) : null, n[25] = w, n[26] = R);
|
|
407
|
+
let z;
|
|
408
|
+
n[27] !== I || n[28] !== L || n[29] !== R || n[30] !== M ? (z = /* @__PURE__ */ y("button", {
|
|
21
409
|
type: "button",
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
410
|
+
className: "min-w-0 flex-1 text-left",
|
|
411
|
+
onClick: M,
|
|
412
|
+
children: [
|
|
413
|
+
I,
|
|
414
|
+
L,
|
|
415
|
+
R
|
|
416
|
+
]
|
|
417
|
+
}), n[27] = I, n[28] = L, n[29] = R, n[30] = M, n[31] = z) : z = n[31];
|
|
418
|
+
let B, V;
|
|
419
|
+
n[32] === Symbol.for("react.memo_cache_sentinel") ? (B = () => {
|
|
420
|
+
l(F);
|
|
421
|
+
}, V = /* @__PURE__ */ v(g, { className: "h-4 w-4" }), n[32] = B, n[33] = V) : (B = n[32], V = n[33]);
|
|
422
|
+
let H;
|
|
423
|
+
n[34] === c ? H = n[35] : (H = /* @__PURE__ */ v("button", {
|
|
424
|
+
ref: f,
|
|
425
|
+
type: "button",
|
|
426
|
+
className: "inline-flex h-8 w-8 items-center justify-center rounded-md hover:bg-accent",
|
|
427
|
+
"aria-label": "Notification options",
|
|
428
|
+
"aria-haspopup": "menu",
|
|
429
|
+
"aria-expanded": c,
|
|
430
|
+
onClick: B,
|
|
431
|
+
children: V
|
|
432
|
+
}), n[34] = c, n[35] = H);
|
|
433
|
+
let U;
|
|
434
|
+
n[36] !== h || n[37] !== c || n[38] !== r.id || n[39] !== a || n[40] !== i ? (U = c ? /* @__PURE__ */ y("div", {
|
|
435
|
+
ref: u,
|
|
436
|
+
role: "menu",
|
|
437
|
+
className: e("absolute right-0 top-full z-50 mt-1 min-w-[10rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md", "animate-in fade-in-0 zoom-in-95"),
|
|
438
|
+
children: [/* @__PURE__ */ v("button", {
|
|
439
|
+
type: "button",
|
|
440
|
+
role: "menuitem",
|
|
441
|
+
className: "relative flex w-full cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-left text-sm outline-none transition-colors hover:bg-accent focus:bg-accent focus:text-accent-foreground",
|
|
442
|
+
onClick: () => {
|
|
443
|
+
l(!1), a(r.id);
|
|
444
|
+
},
|
|
445
|
+
children: "Archive"
|
|
446
|
+
}), /* @__PURE__ */ v("button", {
|
|
447
|
+
type: "button",
|
|
448
|
+
role: "menuitem",
|
|
449
|
+
className: "relative flex w-full cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-left text-sm outline-none transition-colors hover:bg-accent focus:bg-accent focus:text-accent-foreground disabled:pointer-events-none disabled:opacity-50",
|
|
450
|
+
disabled: !h,
|
|
451
|
+
onClick: () => {
|
|
452
|
+
l(!1), i(r.id);
|
|
453
|
+
},
|
|
454
|
+
children: "Mark as read"
|
|
455
|
+
})]
|
|
456
|
+
}) : null, n[36] = h, n[37] = c, n[38] = r.id, n[39] = a, n[40] = i, n[41] = U) : U = n[41];
|
|
457
|
+
let W;
|
|
458
|
+
n[42] !== H || n[43] !== U ? (W = /* @__PURE__ */ y("div", {
|
|
459
|
+
className: "relative flex items-start",
|
|
460
|
+
children: [H, U]
|
|
461
|
+
}), n[42] = H, n[43] = U, n[44] = W) : W = n[44];
|
|
462
|
+
let G;
|
|
463
|
+
return n[45] !== z || n[46] !== W || n[47] !== j ? (G = /* @__PURE__ */ y("div", {
|
|
464
|
+
className: j,
|
|
465
|
+
children: [z, W]
|
|
466
|
+
}), n[45] = z, n[46] = W, n[47] = j, n[48] = G) : G = n[48], G;
|
|
467
|
+
}
|
|
468
|
+
function F(e) {
|
|
469
|
+
return !e;
|
|
27
470
|
}
|
|
28
471
|
//#endregion
|
|
29
|
-
export {
|
|
472
|
+
export { M as NotificationsDrawer };
|
|
30
473
|
|
|
31
474
|
//# sourceMappingURL=index420.js.map
|
package/dist/index420.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index420.js","names":["Bell","cn","NotificationsButton","t0","$","_c","unseenCount","unreadCount","onClick","className","rawCount","Number","isFinite","t1","Math","max","floor","count","t2","t3","t4","Symbol","for","t5","String","t6"],"sources":["../src/components/Notifications/NotificationsButton.tsx"],"sourcesContent":["import { Bell } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\n\nexport function NotificationsButton({\n unseenCount,\n unreadCount,\n onClick,\n className,\n}: {\n unseenCount?: number\n unreadCount?: number\n onClick?: () => void\n className?: string\n}) {\n const rawCount = Number.isFinite(unseenCount) ? unseenCount : unreadCount\n const count = Number.isFinite(rawCount) ? Math.max(0, Math.floor(rawCount ?? 0)) : 0\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={cn(\n \"relative inline-flex h-9 w-9 items-center justify-center rounded-md border bg-background text-foreground hover:bg-accent\",\n className,\n )}\n aria-label={count > 0 ? `Notifications (${count} new)` : \"Notifications\"}\n >\n <Bell className=\"h-4 w-4\" />\n {count > 0 ? (\n <span\n className=\"absolute -right-1 -top-1 inline-flex min-w-4 items-center justify-center rounded-full bg-primary px-1 text-[10px] font-semibold leading-4 text-primary-foreground\"\n aria-hidden=\"true\"\n >\n {count > 99 ? \"99+\" : String(count)}\n </span>\n ) : null}\n </button>\n )\n}\n"],"mappings":";;;;;AAKA,SAAOE,EAAAC,GAAA;CAAA,IAAAC,IAAAC,EAAA,EAAA,GAA6B,EAAAC,gBAAAC,gBAAAC,YAAAC,iBAAAN,GAWlCO,IAAiBC,OAAMC,SAAUN,CAAuC,IAAvDA,IAAAC,GAAwDM;CAAA,AAAAT,EAAA,OAAAM,IACWG,IAAAT,EAAA,MAAtES,IAAAF,OAAMC,SAAUF,CAAqD,IAAzCI,KAAIC,IAAK,GAAGD,KAAIE,MAAON,KAAA,CAAa,CAAK,IAArE,GAAsEN,EAAA,KAAAM,GAAAN,EAAA,KAAAS;CAApF,IAAAI,IAAcJ,GAAsEK;CAAA,AAAAd,EAAA,OAAAK,IAS/ES,IAAAd,EAAA,MAHUc,IAAAjB,EACT,4HACAQ,CACF,GAACL,EAAA,KAAAK,GAAAL,EAAA,KAAAc;CACW,IAAAC,IAAAF,IAAQ,IAAR,kBAA8BA,EAAK,SAAnC,iBAA4DG;CAAA,AAAAhB,EAAA,OAAAiB,OAAAC,IAAA,2BAAA,KAExEF,IAAA,kBAAC,GAAD,EAAgB,WAAA,UAAS,CAAA,GAAGhB,EAAA,KAAAgB,KAAAA,IAAAhB,EAAA;CAAA,IAAAmB;CAAA,AAAAnB,EAAA,OAAAa,IAQpBM,IAAAnB,EAAA,MAPPmB,IAAAN,IAAQ,IACP,kBAAA,QAAA;EACY,WAAA;EACE,eAAA;YAEXA,IAAQ,KAAR,QAAqBO,OAAOP,CAAK;CAC7B,CAAA,IANR,MAOOb,EAAA,KAAAa,GAAAb,EAAA,KAAAmB;CAAA,IAAAE;CACD,OADCrB,EAAA,OAAAI,KAAAJ,EAAA,OAAAc,KAAAd,EAAA,OAAAe,KAAAf,EAAA,QAAAmB,KAjBVE,IAAA,kBAAA,UAAA;EACO,MAAA;EACIjB;EACE,WAAAU;EAIC,cAAAC;YAPd,CASEC,GACCG,CAQM;KAAAnB,EAAA,KAAAI,GAAAJ,EAAA,KAAAc,GAAAd,EAAA,KAAAe,GAAAf,EAAA,MAAAmB,GAAAnB,EAAA,MAAAqB,KAAAA,IAAArB,EAAA,KAlBTqB;AAkBS"}
|
|
1
|
+
{"version":3,"file":"index420.js","names":["n","unreadOnly","res","json","count","id","current","target","group","requesting","onEnable","event","actionLabel","createdAtLabel","menuButtonRef","menuOpen","menuRef"],"sources":["../src/components/Notifications/NotificationsDrawer.tsx"],"sourcesContent":["import { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState, type Context } from \"react\"\nimport { Dialog as DialogPrimitive } from \"@base-ui/react/dialog\"\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\ntype BrowserNotificationPermission = NotificationPermission | \"unsupported\"\ntype NotificationActionMode = \"navigate\" | \"merge_current_search\"\n\ntype NotificationAction = {\n link: string\n mode: NotificationActionMode\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 getNotificationLink = (item: NotificationItem): string => {\n const dataLink = item.data?.link?.trim()\n if (dataLink) return dataLink\n\n const platformWebpush = item.platform?.webpush\n if (!platformWebpush || typeof platformWebpush !== \"object\" || Array.isArray(platformWebpush)) return \"\"\n const fcmOptions = (platformWebpush as { fcmOptions?: unknown }).fcmOptions\n if (!fcmOptions || typeof fcmOptions !== \"object\" || Array.isArray(fcmOptions)) return \"\"\n const link = (fcmOptions as { link?: unknown }).link\n return typeof link === \"string\" ? link.trim() : \"\"\n}\n\nconst getNotificationActionMode = (item: NotificationItem): NotificationActionMode => {\n return item.data?.linkMode === \"merge_current_search\" ? \"merge_current_search\" : \"navigate\"\n}\n\nconst getNotificationAction = (item: NotificationItem): NotificationAction | null => {\n const link = getNotificationLink(item)\n if (!link) return null\n return {\n link,\n mode: getNotificationActionMode(item),\n }\n}\n\nconst getNotificationActionLabel = (action: NotificationAction | null): string => {\n if (!action) return \"\"\n return action.mode === \"merge_current_search\" ? \"Open\" : action.link\n}\n\nconst pushUrlWithoutReload = (url: string): void => {\n window.history.pushState(window.history.state, \"\", url)\n window.dispatchEvent(new PopStateEvent(\"popstate\", { state: window.history.state }))\n}\n\nconst applyNotificationAction = (action: NotificationAction): void => {\n if (action.mode === \"merge_current_search\") {\n const currentUrl = new URL(window.location.href)\n const actionUrl = new URL(action.link, currentUrl)\n\n actionUrl.searchParams.forEach((value, key) => {\n currentUrl.searchParams.set(key, value)\n })\n if (actionUrl.hash) {\n currentUrl.hash = actionUrl.hash\n }\n\n pushUrlWithoutReload(`${currentUrl.pathname}${currentUrl.search}${currentUrl.hash}`)\n return\n }\n\n window.location.href = action.link\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 getBrowserNotificationPermission = (): BrowserNotificationPermission => {\n if (typeof window === \"undefined\") return \"unsupported\"\n if (!(\"Notification\" in window)) return \"unsupported\"\n return window.Notification.permission\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 const [browserNotificationPermission, setBrowserNotificationPermission] = useState<BrowserNotificationPermission>(() =>\n getBrowserNotificationPermission(),\n )\n const [browserNotificationPermissionRequesting, setBrowserNotificationPermissionRequesting] = useState(false)\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 useEffect(() => {\n if (!open) return\n\n setBrowserNotificationPermission(getBrowserNotificationPermission())\n\n if (typeof navigator === \"undefined\" || !navigator.permissions?.query) return\n\n let permissionStatus: PermissionStatus | null = null\n let disposed = false\n const syncPermission = () => {\n setBrowserNotificationPermission(getBrowserNotificationPermission())\n }\n\n try {\n void navigator.permissions.query({ name: \"notifications\" as PermissionName }).then((status) => {\n if (disposed) return\n permissionStatus = status\n syncPermission()\n status.addEventListener(\"change\", syncPermission)\n }).catch(() => {\n // Notifications are not exposed through the Permissions API in every browser.\n })\n } catch {\n return\n }\n\n return () => {\n disposed = true\n permissionStatus?.removeEventListener(\"change\", syncPermission)\n }\n }, [open])\n\n const requestBrowserNotificationPermission = async () => {\n if (typeof window === \"undefined\" || !(\"Notification\" in window)) {\n setBrowserNotificationPermission(\"unsupported\")\n return\n }\n\n setBrowserNotificationPermissionRequesting(true)\n try {\n const nextPermission = await window.Notification.requestPermission()\n setBrowserNotificationPermission(nextPermission)\n } catch {\n setBrowserNotificationPermission(getBrowserNotificationPermission())\n } finally {\n setBrowserNotificationPermissionRequesting(false)\n }\n }\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 const requestClose = () => {\n onOpenChange(false)\n }\n\n const handleOpenChange = (nextOpen: boolean) => {\n if (nextOpen) {\n onOpenChange(true)\n return\n }\n\n requestClose()\n }\n\n return (\n <DialogPrimitive.Root open={open} onOpenChange={handleOpenChange}>\n <DialogPrimitive.Portal>\n <DialogPrimitive.Backdrop className=\"fixed inset-0 z-50 bg-black/50\" onClick={requestClose} />\n <DialogPrimitive.Popup\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\n type=\"button\"\n aria-label=\"Close notifications\"\n className=\"inline-flex h-8 w-8 items-center justify-center rounded-md hover:bg-accent\"\n onClick={requestClose}\n >\n <X className=\"h-4 w-4\" />\n </DialogPrimitive.Close>\n </div>\n </header>\n\n <div className=\"flex-1 overflow-y-auto px-4 pb-3\">\n <BrowserNotificationPermissionNotice\n permission={browserNotificationPermission}\n requesting={browserNotificationPermissionRequesting}\n onEnable={requestBrowserNotificationPermission}\n />\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 onAction={requestClose}\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 onAction={requestClose}\n />\n ))}\n </div>\n </div>\n ))\n )}\n </div>\n )}\n </div>\n )}\n </div>\n </DialogPrimitive.Popup>\n </DialogPrimitive.Portal>\n </DialogPrimitive.Root>\n )\n}\n\nfunction BrowserNotificationPermissionNotice({\n permission,\n requesting,\n onEnable,\n}: {\n permission: BrowserNotificationPermission\n requesting: boolean\n onEnable: () => void\n}) {\n if (permission === \"granted\") return null\n\n if (permission === \"unsupported\") {\n return (\n <div className=\"mt-3 rounded-md border bg-muted/40 p-3 text-sm text-muted-foreground\">\n Browser notifications are not supported by this browser.\n </div>\n )\n }\n\n const isDenied = permission === \"denied\"\n\n return (\n <div className=\"mt-3 rounded-md border bg-muted/40 p-3\">\n <div className=\"text-sm font-medium\">\n {isDenied ? \"Browser notifications are blocked.\" : \"Browser notifications are not enabled.\"}\n </div>\n <div className=\"mt-1 text-xs text-muted-foreground\">\n {isDenied\n ? \"Enable notifications for this site in your browser settings, then click again.\"\n : \"Enable browser notifications to receive important alerts.\"}\n </div>\n <button\n type=\"button\"\n className=\"mt-3 inline-flex h-8 items-center rounded-md border bg-background px-2.5 text-xs font-medium hover:bg-accent disabled:pointer-events-none disabled:opacity-50\"\n disabled={requesting}\n onClick={onEnable}\n >\n {requesting ? \"Enabling...\" : \"Enable browser notifications\"}\n </button>\n </div>\n )\n}\n\nfunction NotificationRow({\n notification,\n onMarkRead,\n onArchive,\n onAction,\n}: {\n notification: NotificationItem\n onMarkRead: (id: string) => void\n onArchive: (id: string) => void\n onAction: () => void\n}) {\n const [menuOpen, setMenuOpen] = useState(false)\n const menuRef = useRef<HTMLDivElement | null>(null)\n const menuButtonRef = useRef<HTMLButtonElement | null>(null)\n const isUnread = !notification.readAt\n const action = getNotificationAction(notification)\n const actionLabel = getNotificationActionLabel(action)\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 useEffect(() => {\n if (!menuOpen) return\n\n const handlePointerDown = (event: PointerEvent) => {\n const target = event.target\n if (!(target instanceof Node)) return\n if (menuRef.current?.contains(target) || menuButtonRef.current?.contains(target)) return\n setMenuOpen(false)\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\") return\n setMenuOpen(false)\n menuButtonRef.current?.focus()\n }\n\n document.addEventListener(\"pointerdown\", handlePointerDown)\n document.addEventListener(\"keydown\", handleKeyDown)\n\n return () => {\n document.removeEventListener(\"pointerdown\", handlePointerDown)\n document.removeEventListener(\"keydown\", handleKeyDown)\n }\n }, [menuOpen])\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 (action) {\n onAction()\n applyNotificationAction(action)\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 {actionLabel ? <div className=\"mt-2 truncate text-xs text-primary\">{actionLabel}</div> : null}\n {createdAtLabel ? (\n <div className=\"mt-2 text-[11px] text-muted-foreground\">{createdAtLabel}</div>\n ) : null}\n </button>\n <div className=\"relative flex items-start\">\n <button\n ref={menuButtonRef}\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 aria-haspopup=\"menu\"\n aria-expanded={menuOpen}\n onClick={() => {\n setMenuOpen((open) => !open)\n }}\n >\n <MoreVertical className=\"h-4 w-4\" />\n </button>\n {menuOpen ? (\n <div\n ref={menuRef}\n role=\"menu\"\n className={cn(\n \"absolute right-0 top-full z-50 mt-1 min-w-[10rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md\",\n \"animate-in fade-in-0 zoom-in-95\",\n )}\n >\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"relative flex w-full cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-left text-sm outline-none transition-colors hover:bg-accent focus:bg-accent focus:text-accent-foreground\"\n onClick={() => {\n setMenuOpen(false)\n onArchive(notification.id)\n }}\n >\n Archive\n </button>\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"relative flex w-full cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-left text-sm outline-none transition-colors hover:bg-accent focus:bg-accent focus:text-accent-foreground disabled:pointer-events-none disabled:opacity-50\"\n disabled={!isUnread}\n onClick={() => {\n setMenuOpen(false)\n onMarkRead(notification.id)\n }}\n >\n Mark as read\n </button>\n </div>\n ) : null}\n </div>\n </div>\n )\n}\n"],"mappings":"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"}
|