@myrjfa/ui 1.1.0 → 1.1.2

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 (154) hide show
  1. package/dist/chat/ChatMain.d.ts +3 -1
  2. package/dist/chat/ChatMain.d.ts.map +1 -1
  3. package/dist/chat/ChatMain.js +174 -145
  4. package/dist/chat/ChatSidebar.js +7 -8
  5. package/dist/chat/ConversationList.d.ts.map +1 -1
  6. package/dist/chat/ConversationList.js +20 -18
  7. package/dist/chat/ExpensePanel.d.ts +4 -1
  8. package/dist/chat/ExpensePanel.d.ts.map +1 -1
  9. package/dist/chat/ExpensePanel.js +215 -195
  10. package/dist/chat/MessageBubble.d.ts +5 -3
  11. package/dist/chat/MessageBubble.d.ts.map +1 -1
  12. package/dist/chat/MessageBubble.js +185 -103
  13. package/dist/chat/MessageInput.d.ts +8 -1
  14. package/dist/chat/MessageInput.d.ts.map +1 -1
  15. package/dist/chat/MessageInput.js +182 -165
  16. package/dist/chat/MilestonePanel.d.ts +4 -1
  17. package/dist/chat/MilestonePanel.d.ts.map +1 -1
  18. package/dist/chat/MilestonePanel.js +150 -150
  19. package/dist/chat/components/ParticipantSelector.d.ts +11 -0
  20. package/dist/chat/components/ParticipantSelector.d.ts.map +1 -0
  21. package/dist/chat/components/ParticipantSelector.js +17 -0
  22. package/dist/chat/components/SplitInputs.d.ts +11 -0
  23. package/dist/chat/components/SplitInputs.d.ts.map +1 -0
  24. package/dist/chat/components/SplitInputs.js +83 -0
  25. package/dist/chat/components/SplitTypeSelector.d.ts +8 -0
  26. package/dist/chat/components/SplitTypeSelector.d.ts.map +1 -0
  27. package/dist/chat/components/SplitTypeSelector.js +13 -0
  28. package/dist/chat/dialogs/AddMemberDialog.js +30 -90
  29. package/dist/chat/dialogs/CameraDialog.js +38 -86
  30. package/dist/chat/dialogs/CreatePollDialog.d.ts +8 -0
  31. package/dist/chat/dialogs/CreatePollDialog.d.ts.map +1 -0
  32. package/dist/chat/dialogs/CreatePollDialog.js +38 -0
  33. package/dist/chat/dialogs/ExpenseAnalyticsDialog.d.ts +19 -0
  34. package/dist/chat/dialogs/ExpenseAnalyticsDialog.d.ts.map +1 -0
  35. package/dist/chat/dialogs/ExpenseAnalyticsDialog.js +52 -0
  36. package/dist/chat/dialogs/GroupInfoDialog.d.ts.map +1 -1
  37. package/dist/chat/dialogs/GroupInfoDialog.js +55 -92
  38. package/dist/chat/dialogs/GroupInfoViewDialog.js +5 -6
  39. package/dist/chat/dialogs/NewChatDialog.d.ts.map +1 -1
  40. package/dist/chat/dialogs/NewChatDialog.js +49 -113
  41. package/dist/chat/dialogs/NewGroupDialog.d.ts.map +1 -1
  42. package/dist/chat/dialogs/NewGroupDialog.js +49 -92
  43. package/dist/chat/dialogs/ParticipantsDialog.d.ts.map +1 -1
  44. package/dist/chat/dialogs/ParticipantsDialog.js +68 -118
  45. package/dist/dashboard/action-buttons.js +4 -5
  46. package/dist/dashboard/app-sidebar.js +47 -129
  47. package/dist/dashboard/card-header.js +1 -2
  48. package/dist/dashboard/dashboard-components.js +3 -5
  49. package/dist/dashboard/data-table.d.ts +2 -1
  50. package/dist/dashboard/data-table.d.ts.map +1 -1
  51. package/dist/dashboard/data-table.js +21 -33
  52. package/dist/dashboard/nav-main.js +4 -5
  53. package/dist/dashboard/nav-secondary.js +2 -25
  54. package/dist/dashboard/stats-card.js +1 -2
  55. package/dist/dashboard/table.js +8 -54
  56. package/dist/header/mobile-nav-item.js +1 -2
  57. package/dist/header/mobile-navbar.js +8 -9
  58. package/dist/header/nav-item.js +1 -2
  59. package/dist/index.d.ts +6 -0
  60. package/dist/index.d.ts.map +1 -1
  61. package/dist/index.js +7 -1
  62. package/dist/main/footer.js +5 -9
  63. package/dist/main/navbar.js +55 -138
  64. package/dist/main/paginationBar.js +12 -14
  65. package/dist/main/portfolio/portfolioItem.js +1 -2
  66. package/dist/main/portfolio/portfolioPopup.js +16 -17
  67. package/dist/main/review-page.d.ts.map +1 -1
  68. package/dist/main/review-page.js +132 -199
  69. package/dist/misc/accordion.js +8 -34
  70. package/dist/misc/alert-dialog.js +22 -55
  71. package/dist/misc/alert.js +7 -32
  72. package/dist/misc/alertdialogclaude.js +50 -125
  73. package/dist/misc/avatar.js +6 -31
  74. package/dist/misc/badge.js +4 -27
  75. package/dist/misc/button.js +4 -27
  76. package/dist/misc/card.js +12 -40
  77. package/dist/misc/carousel.js +37 -61
  78. package/dist/misc/checkbox.js +2 -25
  79. package/dist/misc/command.js +18 -49
  80. package/dist/misc/datepicker.js +66 -76
  81. package/dist/misc/dialog.js +20 -52
  82. package/dist/misc/document-upload-button.d.ts +12 -0
  83. package/dist/misc/document-upload-button.d.ts.map +1 -0
  84. package/dist/misc/document-upload-button.js +27 -0
  85. package/dist/misc/dropdown-menu.js +30 -67
  86. package/dist/misc/empty-state.d.ts +10 -0
  87. package/dist/misc/empty-state.d.ts.map +1 -0
  88. package/dist/misc/empty-state.js +5 -0
  89. package/dist/misc/faq.js +2 -3
  90. package/dist/misc/file-preview.js +43 -97
  91. package/dist/misc/filter.d.ts.map +1 -1
  92. package/dist/misc/filter.js +18 -21
  93. package/dist/misc/filterBar.js +136 -160
  94. package/dist/misc/form.js +39 -60
  95. package/dist/misc/image-compressor.d.ts +29 -0
  96. package/dist/misc/image-compressor.d.ts.map +1 -0
  97. package/dist/misc/image-compressor.js +70 -0
  98. package/dist/misc/image-cropper.d.ts +10 -0
  99. package/dist/misc/image-cropper.d.ts.map +1 -0
  100. package/dist/misc/image-cropper.js +44 -0
  101. package/dist/misc/input.d.ts.map +1 -1
  102. package/dist/misc/input.js +2 -25
  103. package/dist/misc/label.js +2 -25
  104. package/dist/misc/line-carousel.js +3 -13
  105. package/dist/misc/multiImageUploader.d.ts +2 -1
  106. package/dist/misc/multiImageUploader.d.ts.map +1 -1
  107. package/dist/misc/multiImageUploader.js +26 -3
  108. package/dist/misc/newsLetter.js +19 -79
  109. package/dist/misc/notification.d.ts +1 -2
  110. package/dist/misc/notification.d.ts.map +1 -1
  111. package/dist/misc/notification.js +89 -125
  112. package/dist/misc/pagination.js +16 -45
  113. package/dist/misc/password-eye.js +2 -3
  114. package/dist/misc/popover.d.ts.map +1 -1
  115. package/dist/misc/popover.js +8 -34
  116. package/dist/misc/progress.js +2 -25
  117. package/dist/misc/pwa-install-button.d.ts +9 -0
  118. package/dist/misc/pwa-install-button.d.ts.map +1 -0
  119. package/dist/misc/pwa-install-button.js +158 -0
  120. package/dist/misc/scroll-area.js +5 -29
  121. package/dist/misc/searchBar.js +27 -31
  122. package/dist/misc/searchBox.js +18 -22
  123. package/dist/misc/select.d.ts.map +1 -1
  124. package/dist/misc/select.js +22 -54
  125. package/dist/misc/separator.js +2 -25
  126. package/dist/misc/share.js +48 -104
  127. package/dist/misc/sheet.js +21 -53
  128. package/dist/misc/sidebar.js +112 -153
  129. package/dist/misc/skeleton.d.ts +36 -1
  130. package/dist/misc/skeleton.d.ts.map +1 -1
  131. package/dist/misc/skeleton.js +41 -27
  132. package/dist/misc/slider.js +3 -26
  133. package/dist/misc/starRating.js +5 -15
  134. package/dist/misc/stateCard.js +7 -8
  135. package/dist/misc/switch.d.ts +5 -0
  136. package/dist/misc/switch.d.ts.map +1 -0
  137. package/dist/misc/switch.js +8 -0
  138. package/dist/misc/tabs.js +8 -34
  139. package/dist/misc/textarea.js +2 -25
  140. package/dist/misc/tile.js +32 -93
  141. package/dist/misc/tooltip.js +8 -34
  142. package/dist/misc/whatsapp-help.d.ts +9 -0
  143. package/dist/misc/whatsapp-help.d.ts.map +1 -0
  144. package/dist/misc/whatsapp-help.js +13 -0
  145. package/dist/profile/socialLink.d.ts +1 -1
  146. package/dist/profile/socialLink.d.ts.map +1 -1
  147. package/dist/profile/socialLink.js +53 -69
  148. package/dist/utils/permissions.d.ts +7 -0
  149. package/dist/utils/permissions.d.ts.map +1 -0
  150. package/dist/utils/permissions.js +38 -0
  151. package/package.json +6 -4
  152. package/dist/main/portfolio/temp-page.d.ts +0 -2
  153. package/dist/main/portfolio/temp-page.d.ts.map +0 -1
  154. package/dist/main/portfolio/temp-page.js +0 -102
@@ -3,28 +3,26 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { usePathname, useSearchParams } from "next/navigation";
4
4
  import { Suspense } from "react";
5
5
  import { Pagination, PaginationContent, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious } from "../misc/pagination";
6
- function PaginationBarComponent(_a) {
7
- var currentPage = _a.currentPage, totalPages = _a.totalPages;
8
- var searchParams = useSearchParams();
9
- var pathname = usePathname();
6
+ function PaginationBarComponent({ currentPage, totalPages }) {
7
+ const searchParams = useSearchParams();
8
+ const pathname = usePathname();
10
9
  function createPageURL(page) {
11
- var params = new URLSearchParams(searchParams);
10
+ const params = new URLSearchParams(searchParams);
12
11
  params.set('page', page.toString());
13
- return "".concat(pathname, "?").concat(params.toString());
12
+ return `${pathname}?${params.toString()}`;
14
13
  }
15
- var maxVisible = 5;
16
- var half = Math.floor(maxVisible / 2);
17
- var start = Math.max(1, currentPage - half);
18
- var end = Math.min(totalPages, start + maxVisible - 1);
14
+ const maxVisible = 5;
15
+ const half = Math.floor(maxVisible / 2);
16
+ let start = Math.max(1, currentPage - half);
17
+ const end = Math.min(totalPages, start + maxVisible - 1);
19
18
  if (end - start < maxVisible - 1) {
20
19
  start = Math.max(1, end - maxVisible + 1);
21
20
  }
22
- return (_jsx(Pagination, { children: _jsxs(PaginationContent, { children: [currentPage > 1 && (_jsx(PaginationItem, { children: _jsx(PaginationPrevious, { href: createPageURL(currentPage - 1) }) })), Array.from({ length: end - start + 1 }, function (_, i) {
23
- var page = start + i;
21
+ return (_jsx(Pagination, { children: _jsxs(PaginationContent, { children: [currentPage > 1 && (_jsx(PaginationItem, { children: _jsx(PaginationPrevious, { href: createPageURL(currentPage - 1) }) })), Array.from({ length: end - start + 1 }, (_, i) => {
22
+ const page = start + i;
24
23
  return (_jsx(PaginationItem, { children: _jsx(PaginationLink, { href: createPageURL(page), isActive: page === currentPage, children: page }) }, page));
25
24
  }), currentPage < totalPages && (_jsx(PaginationItem, { children: _jsx(PaginationNext, { href: createPageURL(currentPage + 1) }) }))] }) }));
26
25
  }
27
- export default function PaginationBar(_a) {
28
- var currentPage = _a.currentPage, totalPages = _a.totalPages;
26
+ export default function PaginationBar({ currentPage, totalPages }) {
29
27
  return (_jsx(Suspense, { fallback: _jsx("div", { className: "w-full h-screen flex items-center justify-center", children: "Loading..." }), children: _jsx(PaginationBarComponent, { currentPage: currentPage, totalPages: totalPages }) }));
30
28
  }
@@ -2,7 +2,6 @@
2
2
  'use client';
3
3
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
4
4
  import Image from 'next/image';
5
- export function PortfolioItemComponent(_a) {
6
- var item = _a.item, onClick = _a.onClick;
5
+ export function PortfolioItemComponent({ item, onClick }) {
7
6
  return _jsxs("div", { className: "relative aspect-square group cursor-pointer rounded-md overflow-hidden border border-gray-200", onClick: onClick, children: [item.mediaType === 'video' ? (_jsx("video", { src: item.url, muted: true, loop: true, playsInline: true, preload: "metadata", className: "object-cover w-full h-full" })) : (_jsx(Image, { src: item.url, alt: item.caption, fill: true, sizes: "(max-width: 768px) 50vw, 33vw", className: "object-cover transition-transform duration-300 group-hover:scale-105", loading: "lazy" })), _jsx("div", { className: "absolute inset-0 bg-black/0 group-hover:bg-black/40 transition-all duration-300 flex items-center justify-center", children: _jsx("div", { className: "text-white p-3 text-center text-sm opacity-0 group-hover:opacity-100 line-clamp-3", children: item.caption }) })] });
8
7
  }
@@ -7,19 +7,18 @@ import { Button } from '../../misc/button';
7
7
  import { ExternalLink, ChevronLeft, ChevronRight } from 'lucide-react';
8
8
  import ShareButton from '../../misc/share';
9
9
  import { Avatar, AvatarFallback, AvatarImage } from '../../misc/avatar';
10
- export function PortfolioPopUp(_a) {
11
- var items = _a.items, currentIndex = _a.currentIndex, firstName = _a.firstName, profilePic = _a.profilePic;
12
- var _b = useState(items.at(currentIndex)), currentItem = _b[0], setCurrentItem = _b[1];
13
- var _c = useState(currentIndex), currentIdx = _c[0], setCurrentIdx = _c[1];
14
- var touchStartX = useRef(null);
15
- var containerRef = useRef(null);
10
+ export function PortfolioPopUp({ items, currentIndex, firstName, profilePic }) {
11
+ const [currentItem, setCurrentItem] = useState(items.at(currentIndex));
12
+ const [currentIdx, setCurrentIdx] = useState(currentIndex);
13
+ const touchStartX = useRef(null);
14
+ const containerRef = useRef(null);
16
15
  // const [likes, setLikes] = useState(currentItem.likes ?? 0);
17
16
  // const [isLiked, setIsLiked] = useState(false);
18
- var handleNext = function () {
17
+ const handleNext = () => {
19
18
  var _a;
20
19
  if (currentIdx < items.length - 1) {
21
- var nextIdx = currentIdx + 1;
22
- var nextItem = items[nextIdx];
20
+ const nextIdx = currentIdx + 1;
21
+ const nextItem = items[nextIdx];
23
22
  setCurrentItem(nextItem);
24
23
  setCurrentIdx(nextIdx);
25
24
  // setLikes(nextItem.likes ?? 0);
@@ -27,11 +26,11 @@ export function PortfolioPopUp(_a) {
27
26
  }
28
27
  (_a = containerRef.current) === null || _a === void 0 ? void 0 : _a.focus();
29
28
  };
30
- var handlePrev = function () {
29
+ const handlePrev = () => {
31
30
  var _a;
32
31
  if (currentIdx > 0) {
33
- var prevIdx = currentIdx - 1;
34
- var prevItem = items[prevIdx];
32
+ const prevIdx = currentIdx - 1;
33
+ const prevItem = items[prevIdx];
35
34
  setCurrentItem(prevItem);
36
35
  setCurrentIdx(prevIdx);
37
36
  // setLikes(prevItem.likes ?? 0);
@@ -44,21 +43,21 @@ export function PortfolioPopUp(_a) {
44
43
  // setLikes(prev => isLiked ? prev - 1 : prev + 1);
45
44
  // };
46
45
  /** ⌨️ Keyboard navigation */
47
- var handleKeyDown = function (e) {
46
+ const handleKeyDown = (e) => {
48
47
  if (e.key === 'ArrowRight')
49
48
  handleNext();
50
49
  else if (e.key === 'ArrowLeft')
51
50
  handlePrev();
52
51
  };
53
52
  /** 📱 Touch swipe navigation */
54
- var handleTouchStart = function (e) {
53
+ const handleTouchStart = (e) => {
55
54
  if (e.touches[0])
56
55
  touchStartX.current = e.touches[0].clientX;
57
56
  };
58
- var handleTouchEnd = function (e) {
57
+ const handleTouchEnd = (e) => {
59
58
  if (touchStartX.current == null || !e.changedTouches[0])
60
59
  return;
61
- var diff = touchStartX.current - e.changedTouches[0].clientX;
60
+ const diff = touchStartX.current - e.changedTouches[0].clientX;
62
61
  if (Math.abs(diff) > 50) {
63
62
  // Swipe left → next, right → previous
64
63
  if (diff > 0)
@@ -68,5 +67,5 @@ export function PortfolioPopUp(_a) {
68
67
  }
69
68
  touchStartX.current = null;
70
69
  };
71
- return (_jsxs("div", { ref: containerRef, tabIndex: 0, onKeyDown: handleKeyDown, onTouchStart: handleTouchStart, onTouchEnd: handleTouchEnd, className: "w-full h-full flex items-center justify-center relative rounded-lg", children: [currentIdx > 0 && (_jsx(Button, { variant: "ghost", size: "sm", onClick: handlePrev, className: "absolute -left-3 md:-left-12 z-50 text-black hover:bg-white bg-white/70 h-7 w-7 md:h-10 md:w-10 p-0 rounded-full", children: _jsx(ChevronLeft, { className: "h-8 w-8" }) })), currentIdx < items.length - 1 && (_jsx(Button, { variant: "ghost", size: "sm", onClick: handleNext, className: "absolute -right-3 md:-right-12 z-50 text-black hover:bg-white bg-white/70 h-7 w-7 md:h-10 md:w-10 p-0 rounded-full", children: _jsx(ChevronRight, { className: "h-8 w-8" }) })), _jsx("div", { className: "flex items-center justify-center w-full h-full mx-auto", children: _jsxs("div", { className: "flex flex-col md:flex-row w-full h-full rounded-lg overflow-hidden bg-white/80 backdrop-blur-sm border border-white/20 shadow-2xl", children: [_jsx("div", { className: "flex-2 flex items-center justify-center bg-black", children: currentItem.mediaType === 'video' ? (_jsx("video", { src: currentItem.url, controls: true, autoPlay: true, loop: true, className: "max-w-full max-h-full object-contain" }, currentItem._id)) : (_jsx("div", { className: "relative w-full h-full", children: _jsx(Image, { src: currentItem.url, alt: currentItem.caption, fill: true, sizes: "70vw", className: "object-contain", priority: true }, currentItem._id) })) }), _jsxs("div", { className: "flex-1 flex flex-col bg-white/90 backdrop-blur-sm text-black", children: [_jsx("div", { className: "p-4 border-b border-white/20", children: _jsxs("div", { className: "flex items-center gap-3", children: [_jsx("div", { className: "w-8 h-8 bg-gradient-to-r from-blue-500 to-purple-500 rounded-full flex items-center justify-center", children: _jsxs(Avatar, { className: "h-full w-full shadow-lg", children: [_jsx(AvatarImage, { src: profilePic }), _jsx(AvatarFallback, { children: ((firstName === null || firstName === void 0 ? void 0 : firstName[0]) || "DP") })] }) }), _jsxs("div", { children: [_jsxs("h3", { className: "font-semibold text-sm text-gray-900", children: [firstName, "'s Portfolio"] }), _jsxs("p", { className: "text-xs text-gray-500", children: [currentIdx + 1, " of ", items.length] })] })] }) }), _jsxs("div", { className: "flex-1 px-4 overflow-y-auto space-y-3", children: [_jsx("p", { className: "text-sm leading-relaxed text-gray-900", children: currentItem.caption }), currentItem.mainUrl && (_jsxs(Button, { variant: "outline", size: "sm", className: "w-full", onClick: function () { return window.open(currentItem.mainUrl, '_blank'); }, children: [_jsx(ExternalLink, { className: "w-4 h-4 mr-2" }), "View Source"] }))] }), _jsxs("div", { className: "flex flex-row justify-between border-t border-white/20 p-4 pt-2 bg-white/90 backdrop-blur-sm", children: [_jsxs("div", { className: "text-sm space-y-1", children: [_jsxs("p", { className: "font-medium text-gray-900", children: [5, " likes"] }), _jsxs("p", { className: "text-gray-600 text-xs", children: [currentItem.comments || 0, " comments \u2022 ", currentItem.shares || 0, " shares"] }), _jsx("p", { className: "text-gray-400 text-xs", children: "2 hours ago" })] }), _jsx("div", { className: "flex items-center gap-3 mb-3", children: _jsx(ShareButton, {}) })] })] })] }) })] }));
70
+ return (_jsxs("div", { ref: containerRef, tabIndex: 0, onKeyDown: handleKeyDown, onTouchStart: handleTouchStart, onTouchEnd: handleTouchEnd, className: "w-full h-full flex items-center justify-center relative rounded-lg", children: [currentIdx > 0 && (_jsx(Button, { variant: "ghost", size: "sm", onClick: handlePrev, className: "absolute -left-3 md:-left-12 z-50 text-black hover:bg-white bg-white/70 h-7 w-7 md:h-10 md:w-10 p-0 rounded-full", children: _jsx(ChevronLeft, { className: "h-8 w-8" }) })), currentIdx < items.length - 1 && (_jsx(Button, { variant: "ghost", size: "sm", onClick: handleNext, className: "absolute -right-3 md:-right-12 z-50 text-black hover:bg-white bg-white/70 h-7 w-7 md:h-10 md:w-10 p-0 rounded-full", children: _jsx(ChevronRight, { className: "h-8 w-8" }) })), _jsx("div", { className: "flex items-center justify-center w-full h-full mx-auto", children: _jsxs("div", { className: "flex flex-col md:flex-row w-full h-full rounded-lg overflow-hidden bg-white/80 backdrop-blur-sm border border-white/20 shadow-2xl", children: [_jsx("div", { className: "flex-2 flex items-center justify-center bg-black", children: currentItem.mediaType === 'video' ? (_jsx("video", { src: currentItem.url, controls: true, autoPlay: true, loop: true, className: "max-w-full max-h-full object-contain" }, currentItem._id)) : (_jsx("div", { className: "relative w-full h-full", children: _jsx(Image, { src: currentItem.url, alt: currentItem.caption, fill: true, sizes: "70vw", className: "object-contain", priority: true }, currentItem._id) })) }), _jsxs("div", { className: "flex-1 flex flex-col bg-white/90 backdrop-blur-sm text-black", children: [_jsx("div", { className: "p-4 border-b border-white/20", children: _jsxs("div", { className: "flex items-center gap-3", children: [_jsx("div", { className: "w-8 h-8 bg-gradient-to-r from-blue-500 to-purple-500 rounded-full flex items-center justify-center", children: _jsxs(Avatar, { className: "h-full w-full shadow-lg", children: [_jsx(AvatarImage, { src: profilePic }), _jsx(AvatarFallback, { children: ((firstName === null || firstName === void 0 ? void 0 : firstName[0]) || "DP") })] }) }), _jsxs("div", { children: [_jsxs("h3", { className: "font-semibold text-sm text-gray-900", children: [firstName, "'s Portfolio"] }), _jsxs("p", { className: "text-xs text-gray-500", children: [currentIdx + 1, " of ", items.length] })] })] }) }), _jsxs("div", { className: "flex-1 px-4 overflow-y-auto space-y-3", children: [_jsx("p", { className: "text-sm leading-relaxed text-gray-900", children: currentItem.caption }), currentItem.mainUrl && (_jsxs(Button, { variant: "outline", size: "sm", className: "w-full", onClick: () => window.open(currentItem.mainUrl, '_blank'), children: [_jsx(ExternalLink, { className: "w-4 h-4 mr-2" }), "View Source"] }))] }), _jsxs("div", { className: "flex flex-row justify-between border-t border-white/20 p-4 pt-2 bg-white/90 backdrop-blur-sm", children: [_jsxs("div", { className: "text-sm space-y-1", children: [_jsxs("p", { className: "font-medium text-gray-900", children: [5, " likes"] }), _jsxs("p", { className: "text-gray-600 text-xs", children: [currentItem.comments || 0, " comments \u2022 ", currentItem.shares || 0, " shares"] }), _jsx("p", { className: "text-gray-400 text-xs", children: "2 hours ago" })] }), _jsx("div", { className: "flex items-center gap-3 mb-3", children: _jsx(ShareButton, {}) })] })] })] }) })] }));
72
71
  }
@@ -1 +1 @@
1
- {"version":3,"file":"review-page.d.ts","sourceRoot":"","sources":["../../src/main/review-page.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAqB,gBAAgB,EAAc,MAAM,sCAAsC,CAAC;AAoD/G,UAAU,eAAe;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,cAAc,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;CACzC;AAED,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,EAC/B,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,UAA0B,EAC1B,QAAgB,EAChB,cAAmB,EACnB,cAAyB,GAC5B,EAAE,eAAe,2CAsNjB"}
1
+ {"version":3,"file":"review-page.d.ts","sourceRoot":"","sources":["../../src/main/review-page.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAqB,gBAAgB,EAAc,MAAM,sCAAsC,CAAC;AAoD/G,UAAU,eAAe;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,cAAc,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;CACzC;AAED,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,EAC/B,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,UAA0B,EAC1B,QAAgB,EAChB,cAAmB,EACnB,cAAyB,GAC5B,EAAE,eAAe,2CAwQjB"}
@@ -1,63 +1,7 @@
1
1
  "use client";
2
- var __assign = (this && this.__assign) || function () {
3
- __assign = Object.assign || function(t) {
4
- for (var s, i = 1, n = arguments.length; i < n; i++) {
5
- s = arguments[i];
6
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
- t[p] = s[p];
8
- }
9
- return t;
10
- };
11
- return __assign.apply(this, arguments);
12
- };
13
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
- return new (P || (P = Promise))(function (resolve, reject) {
16
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
17
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
18
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
19
- step((generator = generator.apply(thisArg, _arguments || [])).next());
20
- });
21
- };
22
- var __generator = (this && this.__generator) || function (thisArg, body) {
23
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
24
- return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
25
- function verb(n) { return function (v) { return step([n, v]); }; }
26
- function step(op) {
27
- if (f) throw new TypeError("Generator is already executing.");
28
- while (g && (g = 0, op[0] && (_ = 0)), _) try {
29
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
30
- if (y = 0, t) op = [op[0] & 2, t.value];
31
- switch (op[0]) {
32
- case 0: case 1: t = op; break;
33
- case 4: _.label++; return { value: op[1], done: false };
34
- case 5: _.label++; y = op[1]; op = [0]; continue;
35
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
36
- default:
37
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
38
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
39
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
40
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
41
- if (t[2]) _.ops.pop();
42
- _.trys.pop(); continue;
43
- }
44
- op = body.call(thisArg, _);
45
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
46
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
47
- }
48
- };
49
- var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
50
- if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
51
- if (ar || !(i in from)) {
52
- if (!ar) ar = Array.prototype.slice.call(from, 0, i);
53
- ar[i] = from[i];
54
- }
55
- }
56
- return to.concat(ar || Array.prototype.slice.call(from));
57
- };
58
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
59
3
  import { zodResolver } from "@hookform/resolvers/zod";
60
- import { addReview, deleteReview, editReview, getReviewsById } from "@myrjfa/state/dist/lib/actions";
4
+ import { addReview, deleteReview, editReview, getReviewsById } from "@myrjfa/state/dist/lib/actions/actions";
61
5
  import { reviewBasicSchema } from "@myrjfa/state/dist/lib/models/review";
62
6
  import { userAtom, userLoadingAtom } from "@myrjfa/state/dist/lib/userAtom";
63
7
  import { formatDate } from "@myrjfa/state/dist/lib/utils";
@@ -72,55 +16,56 @@ import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle }
72
16
  import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "../misc/form";
73
17
  import { Separator } from "../misc/separator";
74
18
  import { Textarea } from "../misc/textarea";
75
- var StarRating = function (_a) {
76
- var value = _a.value, onChange = _a.onChange, onHover = _a.onHover, _b = _a.size, size = _b === void 0 ? 8 : _b, _c = _a.interactive, interactive = _c === void 0 ? false : _c;
77
- return (_jsx("div", { className: "flex space-x-1", children: [1, 2, 3, 4, 5].map(function (star) { return (_jsx("button", { type: "button", onClick: function () { return interactive && (onChange === null || onChange === void 0 ? void 0 : onChange(star)); }, onMouseEnter: function () { return interactive && (onHover === null || onHover === void 0 ? void 0 : onHover(star)); }, onMouseLeave: function () { return interactive && (onHover === null || onHover === void 0 ? void 0 : onHover(null)); }, className: "focus:outline-none text-".concat(size, "xl"), children: _jsx(StarIcon, { className: "h-".concat(size, " w-").concat(size, " ").concat(star <= value ? 'text-yellow-400 fill-yellow-400' : 'text-gray-300') }) }, star)); }) }));
19
+ const StarRating = ({ value, onChange, onHover, size = 8, interactive = false }) => {
20
+ return (_jsx("div", { className: "flex space-x-1", children: [1, 2, 3, 4, 5].map((star) => (_jsx("button", { type: "button", onClick: () => interactive && (onChange === null || onChange === void 0 ? void 0 : onChange(star)), onMouseEnter: () => interactive && (onHover === null || onHover === void 0 ? void 0 : onHover(star)), onMouseLeave: () => interactive && (onHover === null || onHover === void 0 ? void 0 : onHover(null)), className: `focus:outline-none text-${size}xl`, children: _jsx(StarIcon, { className: `h-${size} w-${size} ${star <= value ? 'text-yellow-400 fill-yellow-400' : 'text-gray-300'}` }) }, star))) }));
78
21
  };
79
- export default function ReviewPage(_a) {
80
- var _this = this;
81
- var _b;
82
- var title = _a.title, subtitle = _a.subtitle, targetId = _a.targetId, _c = _a.targetType, targetType = _c === void 0 ? "opportunity" : _c, _d = _a.editable, editable = _d === void 0 ? false : _d, _e = _a.initialReviews, initialReviews = _e === void 0 ? [] : _e, _f = _a.reviewCategory, reviewCategory = _f === void 0 ? "review" : _f;
83
- var user = useAtomValue(userAtom);
84
- var loading = useAtomValue(userLoadingAtom);
85
- var _g = useState((_b = initialReviews.find(function (r) { return r.reviewerUsername === (user === null || user === void 0 ? void 0 : user.username); })) !== null && _b !== void 0 ? _b : null), review = _g[0], setReview = _g[1];
86
- var _h = useState(initialReviews), reviews = _h[0], setReviews = _h[1];
87
- var _j = useState([]), displayReviews = _j[0], setDisplayReviews = _j[1];
88
- var _k = useState(null), hoveredRating = _k[0], setHoveredRating = _k[1];
89
- var _l = useState(false), isSubmitting = _l[0], setIsSubmitting = _l[1];
90
- var _m = useState(false), isDeleting = _m[0], setIsDeleting = _m[1];
91
- var _o = useState(false), isFormInitialized = _o[0], setIsFormInitialized = _o[1];
92
- var form = useForm({
22
+ export default function ReviewPage({ title, subtitle, targetId, targetType = "opportunity", editable = false, initialReviews = [], reviewCategory = "review", }) {
23
+ var _a;
24
+ const user = useAtomValue(userAtom);
25
+ const loading = useAtomValue(userLoadingAtom);
26
+ const [review, setReview] = useState(Array.isArray(initialReviews) ? ((_a = initialReviews.find((r) => r.reviewerUsername === (user === null || user === void 0 ? void 0 : user.username))) !== null && _a !== void 0 ? _a : null) : null);
27
+ const [reviews, setReviews] = useState(initialReviews);
28
+ const [displayReviews, setDisplayReviews] = useState([]);
29
+ const [page, setPage] = useState(1);
30
+ const [hasMore, setHasMore] = useState(false);
31
+ const [totalCount, setTotalCount] = useState(Array.isArray(initialReviews) ? initialReviews.length : 0);
32
+ const [hoveredRating, setHoveredRating] = useState(null);
33
+ const [isSubmitting, setIsSubmitting] = useState(false);
34
+ const [isDeleting, setIsDeleting] = useState(false);
35
+ const [isFormInitialized, setIsFormInitialized] = useState(false);
36
+ const [isLoadingMore, setIsLoadingMore] = useState(false);
37
+ const form = useForm({
93
38
  resolver: zodResolver(reviewBasicSchema),
94
39
  defaultValues: {
95
40
  rating: reviewCategory === "comment" ? 1 : ((review === null || review === void 0 ? void 0 : review.rating) || 0),
96
41
  comment: (review === null || review === void 0 ? void 0 : review.comment) || "",
97
42
  },
98
43
  });
99
- var ratingValue = hoveredRating !== null && hoveredRating !== void 0 ? hoveredRating : form.watch("rating");
100
- useEffect(function () {
44
+ const ratingValue = hoveredRating !== null && hoveredRating !== void 0 ? hoveredRating : form.watch("rating");
45
+ useEffect(() => {
101
46
  if (loading)
102
47
  return;
103
- var fetchData = function () { return __awaiter(_this, void 0, void 0, function () {
104
- var response, myReview;
105
- return __generator(this, function (_a) {
106
- switch (_a.label) {
107
- case 0: return [4 /*yield*/, getReviewsById(targetId, targetType)];
108
- case 1:
109
- response = _a.sent();
110
- if (response === null || response === void 0 ? void 0 : response.error) {
111
- console.error("Error: " + response.error);
112
- }
113
- else {
114
- setReviews(response.reviews);
115
- myReview = response.reviews.find(function (r) { return r.reviewerUsername === (user === null || user === void 0 ? void 0 : user.username); });
116
- setReview(myReview !== null && myReview !== void 0 ? myReview : null);
117
- form.reset({ rating: reviewCategory === "comment" ? 1 : ((myReview === null || myReview === void 0 ? void 0 : myReview.rating) || 0), comment: (myReview === null || myReview === void 0 ? void 0 : myReview.comment) || "" });
118
- setIsFormInitialized(true);
119
- }
120
- return [2 /*return*/];
121
- }
122
- });
123
- }); };
48
+ const fetchData = async () => {
49
+ // Cast to any to bypass stale type definitions in @myrjfa/state/dist
50
+ const response = await getReviewsById(targetId, targetType, { page: 1, limit: 10 });
51
+ if (response === null || response === void 0 ? void 0 : response.error) {
52
+ console.error("Error: " + response.error);
53
+ }
54
+ else if (Array.isArray(response.reviews)) {
55
+ setReviews(response.reviews);
56
+ setTotalCount(response.totalCount);
57
+ setHasMore(response.hasMore);
58
+ setPage(1);
59
+ const myReview = response.reviews.find((r) => r.reviewerUsername === (user === null || user === void 0 ? void 0 : user.username));
60
+ setReview(myReview !== null && myReview !== void 0 ? myReview : null);
61
+ form.reset({ rating: reviewCategory === "comment" ? 1 : ((myReview === null || myReview === void 0 ? void 0 : myReview.rating) || 0), comment: (myReview === null || myReview === void 0 ? void 0 : myReview.comment) || "" });
62
+ setIsFormInitialized(true);
63
+ }
64
+ else {
65
+ setReviews([]);
66
+ setIsFormInitialized(true);
67
+ }
68
+ };
124
69
  if (!initialReviews || initialReviews.length === 0) {
125
70
  fetchData();
126
71
  }
@@ -128,7 +73,28 @@ export default function ReviewPage(_a) {
128
73
  setIsFormInitialized(true); // Initialize immediately if already present
129
74
  }
130
75
  }, [targetId, targetType, user, loading]);
131
- useEffect(function () {
76
+ const handleLoadMore = async () => {
77
+ if (isLoadingMore || !hasMore)
78
+ return;
79
+ setIsLoadingMore(true);
80
+ try {
81
+ const nextPage = page + 1;
82
+ // Cast to any to bypass stale type definitions in @myrjfa/state/dist
83
+ const response = await getReviewsById(targetId, targetType, { page: nextPage, limit: 10 });
84
+ if (response === null || response === void 0 ? void 0 : response.error) {
85
+ console.error("Error: " + response.error);
86
+ }
87
+ else if (Array.isArray(response.reviews)) {
88
+ setReviews([...reviews, ...response.reviews]);
89
+ setPage(nextPage);
90
+ setHasMore(response.hasMore);
91
+ }
92
+ }
93
+ finally {
94
+ setIsLoadingMore(false);
95
+ }
96
+ };
97
+ useEffect(() => {
132
98
  if (review) {
133
99
  form.reset({
134
100
  rating: reviewCategory === "comment" ? 1 : review.rating,
@@ -137,110 +103,77 @@ export default function ReviewPage(_a) {
137
103
  }
138
104
  setIsFormInitialized(true);
139
105
  }, [review]);
140
- useEffect(function () {
141
- setDisplayReviews(reviews.filter(function (r) { return r.comment; }));
106
+ useEffect(() => {
107
+ if (Array.isArray(reviews)) {
108
+ setDisplayReviews(reviews.filter((r) => r.comment));
109
+ }
110
+ else {
111
+ setDisplayReviews([]);
112
+ }
142
113
  }, [reviews]);
143
- var onSubmit = function (data) { return __awaiter(_this, void 0, void 0, function () {
144
- var response, newReview_1, error_1;
145
- return __generator(this, function (_a) {
146
- switch (_a.label) {
147
- case 0:
148
- setIsSubmitting(true);
149
- _a.label = 1;
150
- case 1:
151
- _a.trys.push([1, 9, 10, 11]);
152
- response = void 0;
153
- if (!review) return [3 /*break*/, 3];
154
- return [4 /*yield*/, editReview(review._id, data)];
155
- case 2:
156
- response = _a.sent();
157
- return [3 /*break*/, 5];
158
- case 3: return [4 /*yield*/, addReview(targetId, targetType, data)];
159
- case 4:
160
- response = _a.sent();
161
- _a.label = 5;
162
- case 5:
163
- if (!(response === null || response === void 0 ? void 0 : response.error)) return [3 /*break*/, 7];
164
- return [4 /*yield*/, showAlert(response.error, "Error reviewing ".concat(targetType))];
165
- case 6:
166
- _a.sent();
167
- return [3 /*break*/, 8];
168
- case 7:
169
- newReview_1 = response.review;
170
- if (newReview_1) {
171
- setReviews(__spreadArray([newReview_1], reviews.filter(function (r) { return r._id !== newReview_1._id; }), true));
172
- setReview(newReview_1);
173
- form.reset({ rating: reviewCategory === "comment" ? 1 : newReview_1.rating, comment: newReview_1.comment || "" });
174
- }
175
- _a.label = 8;
176
- case 8: return [3 /*break*/, 11];
177
- case 9:
178
- error_1 = _a.sent();
179
- console.error("Failed to submit review:", error_1);
180
- form.setError("root", { message: "Failed to submit review. Please try again." });
181
- return [3 /*break*/, 11];
182
- case 10:
183
- setIsSubmitting(false);
184
- return [7 /*endfinally*/];
185
- case 11: return [2 /*return*/];
114
+ const onSubmit = async (data) => {
115
+ setIsSubmitting(true);
116
+ try {
117
+ let response;
118
+ if (review) {
119
+ response = await editReview(review._id, data);
120
+ }
121
+ else {
122
+ response = await addReview(targetId, targetType, data);
186
123
  }
187
- });
188
- }); };
189
- var handleDeleteReview = function () { return __awaiter(_this, void 0, void 0, function () {
190
- var confirmed, response, err_1;
191
- return __generator(this, function (_a) {
192
- switch (_a.label) {
193
- case 0:
194
- if (!review)
195
- return [2 /*return*/];
196
- confirmed = true;
197
- return [4 /*yield*/, showAlert("Are you sure you want to delete your review?", undefined, deleteActions(function () {
198
- confirmed = false;
199
- }))];
200
- case 1:
201
- _a.sent();
202
- if (!confirmed)
203
- return [2 /*return*/];
204
- setIsDeleting(true);
205
- _a.label = 2;
206
- case 2:
207
- _a.trys.push([2, 7, 9, 10]);
208
- return [4 /*yield*/, deleteReview(review._id)];
209
- case 3:
210
- response = _a.sent();
211
- if (!(response === null || response === void 0 ? void 0 : response.error)) return [3 /*break*/, 5];
212
- return [4 /*yield*/, showAlert(response.error, "Error deleting review:")];
213
- case 4:
214
- _a.sent();
215
- return [3 /*break*/, 6];
216
- case 5:
217
- setReviews(reviews.filter(function (r) { return r._id !== review._id; }));
218
- setReview(null);
219
- form.reset({ rating: reviewCategory === "comment" ? 1 : 0, comment: "" });
220
- _a.label = 6;
221
- case 6: return [3 /*break*/, 10];
222
- case 7:
223
- err_1 = _a.sent();
224
- console.error("Failed to delete review:", err_1);
225
- return [4 /*yield*/, showAlert("Something went wrong while deleting. Please try again.")];
226
- case 8:
227
- _a.sent();
228
- return [3 /*break*/, 10];
229
- case 9:
230
- setIsDeleting(false);
231
- return [7 /*endfinally*/];
232
- case 10: return [2 /*return*/];
124
+ if (response === null || response === void 0 ? void 0 : response.error) {
125
+ await showAlert(response.error, `Error reviewing ${targetType}`);
233
126
  }
234
- });
235
- }); };
127
+ else {
128
+ const newReview = response.review;
129
+ if (newReview) {
130
+ setReviews([newReview, ...reviews.filter((r) => r._id !== newReview._id)]);
131
+ setReview(newReview);
132
+ setTotalCount(prev => review ? prev : prev + 1);
133
+ form.reset({ rating: reviewCategory === "comment" ? 1 : newReview.rating, comment: newReview.comment || "" });
134
+ }
135
+ }
136
+ }
137
+ catch (error) {
138
+ console.error("Failed to submit review:", error);
139
+ form.setError("root", { message: "Failed to submit review. Please try again." });
140
+ }
141
+ finally {
142
+ setIsSubmitting(false);
143
+ }
144
+ };
145
+ const handleDeleteReview = async () => {
146
+ if (!review)
147
+ return;
148
+ let confirmed = true;
149
+ await showAlert("Are you sure you want to delete your review?", undefined, deleteActions(() => {
150
+ confirmed = false;
151
+ }));
152
+ if (!confirmed)
153
+ return;
154
+ setIsDeleting(true);
155
+ try {
156
+ const response = await deleteReview(review._id);
157
+ if (response === null || response === void 0 ? void 0 : response.error) {
158
+ await showAlert(response.error, "Error deleting review:");
159
+ }
160
+ else {
161
+ setReviews(reviews.filter((r) => r._id !== review._id));
162
+ setReview(null);
163
+ setTotalCount(prev => Math.max(0, prev - 1));
164
+ form.reset({ rating: reviewCategory === "comment" ? 1 : 0, comment: "" });
165
+ }
166
+ }
167
+ catch (err) {
168
+ console.error("Failed to delete review:", err);
169
+ await showAlert("Something went wrong while deleting. Please try again.");
170
+ }
171
+ finally {
172
+ setIsDeleting(false);
173
+ }
174
+ };
236
175
  if (loading || !isFormInitialized)
237
176
  return _jsx(Card, { className: "w-full h-50 flex items-center justify-center", children: "Loading Reviews..." });
238
- var averageRating = reviews.length ? reviews.reduce(function (acc, r) { return acc + r.rating; }, 0) / reviews.length : 0;
239
- return (_jsxs(Card, { className: "w-full mb-10", children: [(title || subtitle) && _jsxs(CardHeader, { children: [title && _jsx(CardTitle, { children: title }), subtitle && _jsx(CardDescription, { children: subtitle })] }), _jsxs(CardContent, { children: [editable && _jsx(Form, __assign({}, form, { children: _jsxs("form", { onSubmit: form.handleSubmit(onSubmit), className: "space-y-6 pb-4", children: [_jsx(FormField, { control: form.control, name: "rating", render: function (_a) {
240
- var field = _a.field;
241
- return (_jsxs(FormItem, { className: reviewCategory === "comment" ? "hidden" : "", children: [_jsx(FormLabel, { children: "Your Rating" }), _jsx(FormControl, { children: _jsx(StarRating, { value: ratingValue, onChange: function (val) { return field.onChange(val); }, onHover: setHoveredRating, interactive: true }) }), _jsx(FormMessage, {})] }));
242
- } }), _jsx(FormField, { control: form.control, name: "comment", render: function (_a) {
243
- var field = _a.field;
244
- return (_jsxs(FormItem, { children: [_jsxs(FormLabel, { children: ["Your ", reviewCategory == "review" ? "Review" : "Comment"] }), _jsx(FormControl, { children: _jsx(Textarea, __assign({ placeholder: "Share your ".concat(reviewCategory == "review" ? "experience" : "thoughts", "..."), className: "resize-none", rows: 4 }, field)) }), _jsx(FormMessage, {})] }));
245
- } }), form.formState.errors.root && (_jsx("p", { className: "text-sm font-medium text-destructive", children: form.formState.errors.root.message })), _jsxs("div", { className: "flex flex-wrap gap-2", children: [_jsx(Button, { type: "submit", disabled: isSubmitting, className: "w-full sm:w-auto", children: isSubmitting ? (reviewCategory == "review" ? "Submitting... Review" : "Posting... Comment") : (reviewCategory == "review" ? "Submit Review" : "Post Comment") }), review && _jsx(Button, { type: "button", variant: "destructive", className: "w-full sm:w-auto", disabled: isDeleting, onClick: handleDeleteReview, children: isDeleting ? "Deleting..." : reviewCategory == "review" ? "Delete Review" : "Delete Comment" })] })] }) })), displayReviews.length > 0 ? (_jsxs("div", { className: "mt-4", children: [_jsxs("div", { className: "flex justify-between items-center mb-4", children: [_jsxs("h3", { className: "text-lg font-medium", children: [reviewCategory == "review" ? "Reviews" : "Comments", " (", displayReviews.length, ")"] }), reviewCategory == "review" && _jsxs("div", { className: "flex items-center", children: [_jsx("span", { className: "font-medium mr-2", children: averageRating.toFixed(1) }), _jsx(StarRating, { value: Math.round(averageRating), size: 5 })] })] }), _jsx(Separator, { className: "my-4" }), _jsx("div", { className: "space-y-6", children: displayReviews.map(function (review) { return (_jsxs("div", { className: "pb-4", children: [_jsxs("div", { className: "flex items-start justify-between", children: [_jsxs("div", { className: "flex items-center", children: [_jsxs(Avatar, { className: "h-10 w-10 mr-3", children: [_jsx(AvatarImage, { src: review.reviewerPic || "/images/profile_placeholder.webp", alt: review.reviewerUsername }), _jsx(AvatarFallback, { children: review.reviewerUsername.charAt(0) })] }), _jsxs("div", { children: [_jsx("h4", { className: "font-medium", children: review.reviewerUsername }), _jsx("p", { className: "text-sm text-gray-500", children: formatDate(review.createdAt) })] })] }), reviewCategory == "review" && _jsx(StarRating, { value: review.rating, size: 4 })] }), _jsx("p", { className: "mt-2 text-gray-600 whitespace-pre-line", children: review.comment }), _jsx(Separator, { className: "mt-4" })] }, review._id)); }) })] })) : (_jsxs("div", { className: "text-center justify-center p-5", children: ["No ", reviewCategory == "comment" ? "comments" : "reviews", " yet"] }))] }), displayReviews.length > 0 && _jsx(CardFooter, { children: _jsx("p", { className: "text-sm text-gray-500", children: "Thank you for sharing your feedback. All reviews are moderated and typically appear within 24-48 hours." }) })] }));
177
+ const averageRating = reviews.length ? reviews.reduce((acc, r) => acc + r.rating, 0) / reviews.length : 0;
178
+ return (_jsxs(Card, { className: "w-full mb-10", children: [(title || subtitle) && _jsxs(CardHeader, { children: [title && _jsx(CardTitle, { children: title }), subtitle && _jsx(CardDescription, { children: subtitle })] }), _jsxs(CardContent, { children: [editable && _jsx(Form, { ...form, children: _jsxs("form", { onSubmit: form.handleSubmit(onSubmit), className: "space-y-6 pb-4", children: [_jsx(FormField, { control: form.control, name: "rating", render: ({ field }) => (_jsxs(FormItem, { className: reviewCategory === "comment" ? "hidden" : "", children: [_jsx(FormLabel, { children: "Your Rating" }), _jsx(FormControl, { children: _jsx(StarRating, { value: ratingValue, onChange: (val) => field.onChange(val), onHover: setHoveredRating, interactive: true }) }), _jsx(FormMessage, {})] })) }), _jsx(FormField, { control: form.control, name: "comment", render: ({ field }) => (_jsxs(FormItem, { children: [_jsxs(FormLabel, { children: ["Your ", reviewCategory == "review" ? "Review" : "Comment"] }), _jsx(FormControl, { children: _jsx(Textarea, { placeholder: `Share your ${reviewCategory == "review" ? "experience" : "thoughts"}...`, className: "resize-none", rows: 4, ...field }) }), _jsx(FormMessage, {})] })) }), form.formState.errors.root && (_jsx("p", { className: "text-sm font-medium text-destructive", children: form.formState.errors.root.message })), _jsxs("div", { className: "flex flex-wrap gap-2", children: [_jsx(Button, { type: "submit", disabled: isSubmitting, className: "w-full sm:w-auto", children: isSubmitting ? (reviewCategory == "review" ? "Submitting... Review" : "Posting... Comment") : (reviewCategory == "review" ? "Submit Review" : "Post Comment") }), review && _jsx(Button, { type: "button", variant: "destructive", className: "w-full sm:w-auto", disabled: isDeleting, onClick: handleDeleteReview, children: isDeleting ? "Deleting..." : reviewCategory == "review" ? "Delete Review" : "Delete Comment" })] })] }) }), displayReviews.length > 0 ? (_jsxs("div", { className: "mt-4", children: [_jsxs("div", { className: "flex justify-between items-center mb-4", children: [_jsxs("h3", { className: "text-lg font-medium", children: [reviewCategory == "review" ? "Reviews" : "Comments", " (", totalCount || displayReviews.length, ")"] }), reviewCategory == "review" && _jsxs("div", { className: "flex items-center", children: [_jsx("span", { className: "font-medium mr-2", children: averageRating.toFixed(1) }), _jsx(StarRating, { value: Math.round(averageRating), size: 5 })] })] }), _jsx(Separator, { className: "my-4" }), _jsx("div", { className: "space-y-6", children: displayReviews.map((review) => (_jsxs("div", { className: "pb-4", children: [_jsxs("div", { className: "flex items-start justify-between", children: [_jsxs("div", { className: "flex items-center", children: [_jsxs(Avatar, { className: "h-10 w-10 mr-3", children: [_jsx(AvatarImage, { src: review.reviewerPic || "/images/profile_placeholder.webp", alt: review.reviewerUsername }), _jsx(AvatarFallback, { children: review.reviewerUsername.charAt(0) })] }), _jsxs("div", { children: [_jsx("h4", { className: "font-medium", children: review.reviewerUsername }), _jsx("p", { className: "text-sm text-gray-500", children: formatDate(review.createdAt) })] })] }), reviewCategory == "review" && _jsx(StarRating, { value: review.rating, size: 4 })] }), _jsx("p", { className: "mt-2 text-gray-600 whitespace-pre-line", children: review.comment }), _jsx(Separator, { className: "mt-4" })] }, review._id))) }), hasMore && (_jsx("div", { className: "flex justify-center mt-6", children: _jsx(Button, { variant: "outline", onClick: handleLoadMore, disabled: isLoadingMore, className: "w-full sm:w-auto", children: isLoadingMore ? "Loading more..." : "View More" }) }))] })) : (_jsxs("div", { className: "text-center justify-center p-5", children: ["No ", reviewCategory == "comment" ? "comments" : "reviews", " yet"] }))] }), displayReviews.length > 0 && _jsx(CardFooter, { children: _jsx("p", { className: "text-sm text-gray-500", children: "Thank you for sharing your feedback. All reviews are moderated and typically appear within 24-48 hours." }) })] }));
246
179
  }
@@ -1,44 +1,18 @@
1
1
  "use client";
2
- var __assign = (this && this.__assign) || function () {
3
- __assign = Object.assign || function(t) {
4
- for (var s, i = 1, n = arguments.length; i < n; i++) {
5
- s = arguments[i];
6
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
- t[p] = s[p];
8
- }
9
- return t;
10
- };
11
- return __assign.apply(this, arguments);
12
- };
13
- var __rest = (this && this.__rest) || function (s, e) {
14
- var t = {};
15
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
16
- t[p] = s[p];
17
- if (s != null && typeof Object.getOwnPropertySymbols === "function")
18
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
19
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
20
- t[p[i]] = s[p[i]];
21
- }
22
- return t;
23
- };
24
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
25
3
  import * as AccordionPrimitive from "@radix-ui/react-accordion";
26
4
  import { cn } from "@myrjfa/state/dist/lib/utils";
27
5
  import { ChevronDownIcon } from "lucide-react";
28
- function Accordion(_a) {
29
- var props = __rest(_a, []);
30
- return _jsx(AccordionPrimitive.Root, __assign({ "data-slot": "accordion" }, props));
6
+ function Accordion({ ...props }) {
7
+ return _jsx(AccordionPrimitive.Root, { "data-slot": "accordion", ...props });
31
8
  }
32
- function AccordionItem(_a) {
33
- var className = _a.className, props = __rest(_a, ["className"]);
34
- return (_jsx(AccordionPrimitive.Item, __assign({ "data-slot": "accordion-item", className: cn("border-b last:border-b-0", className) }, props)));
9
+ function AccordionItem({ className, ...props }) {
10
+ return (_jsx(AccordionPrimitive.Item, { "data-slot": "accordion-item", className: cn("border-b last:border-b-0", className), ...props }));
35
11
  }
36
- function AccordionTrigger(_a) {
37
- var className = _a.className, children = _a.children, props = __rest(_a, ["className", "children"]);
38
- return (_jsx(AccordionPrimitive.Header, { className: "flex", children: _jsxs(AccordionPrimitive.Trigger, __assign({ "data-slot": "accordion-trigger", className: cn("focus-visible:border-ring focus-visible:ring-ring/50 flex flex-1 items-start justify-between gap-4 rounded-md py-4 text-left text-sm font-medium transition-all outline-none hover:underline focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&[data-state=open]>svg]:rotate-180", className) }, props, { children: [children, _jsx(ChevronDownIcon, { className: "text-muted-foreground pointer-events-none size-4 shrink-0 translate-y-0.5 transition-transform duration-200" })] })) }));
12
+ function AccordionTrigger({ className, children, ...props }) {
13
+ return (_jsx(AccordionPrimitive.Header, { className: "flex", children: _jsxs(AccordionPrimitive.Trigger, { "data-slot": "accordion-trigger", className: cn("focus-visible:border-ring focus-visible:ring-ring/50 flex flex-1 items-start justify-between gap-4 rounded-md py-4 text-left text-sm font-medium transition-all outline-none hover:underline focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&[data-state=open]>svg]:rotate-180", className), ...props, children: [children, _jsx(ChevronDownIcon, { className: "text-muted-foreground pointer-events-none size-4 shrink-0 translate-y-0.5 transition-transform duration-200" })] }) }));
39
14
  }
40
- function AccordionContent(_a) {
41
- var className = _a.className, children = _a.children, props = __rest(_a, ["className", "children"]);
42
- return (_jsx(AccordionPrimitive.Content, __assign({ "data-slot": "accordion-content", className: "data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down overflow-hidden text-sm" }, props, { children: _jsx("div", { className: cn("pt-0 pb-4", className), children: children }) })));
15
+ function AccordionContent({ className, children, ...props }) {
16
+ return (_jsx(AccordionPrimitive.Content, { "data-slot": "accordion-content", className: "data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down overflow-hidden text-sm", ...props, children: _jsx("div", { className: cn("pt-0 pb-4", className), children: children }) }));
43
17
  }
44
18
  export { Accordion, AccordionItem, AccordionTrigger, AccordionContent };