@myrjfa/ui 1.1.0 → 1.1.1

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 (131) hide show
  1. package/dist/chat/ChatMain.d.ts.map +1 -1
  2. package/dist/chat/ChatMain.js +173 -145
  3. package/dist/chat/ChatSidebar.js +7 -8
  4. package/dist/chat/ConversationList.d.ts.map +1 -1
  5. package/dist/chat/ConversationList.js +20 -18
  6. package/dist/chat/ExpensePanel.d.ts +4 -1
  7. package/dist/chat/ExpensePanel.d.ts.map +1 -1
  8. package/dist/chat/ExpensePanel.js +215 -195
  9. package/dist/chat/MessageBubble.d.ts +5 -3
  10. package/dist/chat/MessageBubble.d.ts.map +1 -1
  11. package/dist/chat/MessageBubble.js +185 -103
  12. package/dist/chat/MessageInput.d.ts +8 -1
  13. package/dist/chat/MessageInput.d.ts.map +1 -1
  14. package/dist/chat/MessageInput.js +182 -165
  15. package/dist/chat/MilestonePanel.d.ts +4 -1
  16. package/dist/chat/MilestonePanel.d.ts.map +1 -1
  17. package/dist/chat/MilestonePanel.js +150 -150
  18. package/dist/chat/components/ParticipantSelector.d.ts +11 -0
  19. package/dist/chat/components/ParticipantSelector.d.ts.map +1 -0
  20. package/dist/chat/components/ParticipantSelector.js +17 -0
  21. package/dist/chat/components/SplitInputs.d.ts +11 -0
  22. package/dist/chat/components/SplitInputs.d.ts.map +1 -0
  23. package/dist/chat/components/SplitInputs.js +83 -0
  24. package/dist/chat/components/SplitTypeSelector.d.ts +8 -0
  25. package/dist/chat/components/SplitTypeSelector.d.ts.map +1 -0
  26. package/dist/chat/components/SplitTypeSelector.js +13 -0
  27. package/dist/chat/dialogs/AddMemberDialog.js +30 -90
  28. package/dist/chat/dialogs/CameraDialog.js +38 -86
  29. package/dist/chat/dialogs/CreatePollDialog.d.ts +8 -0
  30. package/dist/chat/dialogs/CreatePollDialog.d.ts.map +1 -0
  31. package/dist/chat/dialogs/CreatePollDialog.js +38 -0
  32. package/dist/chat/dialogs/ExpenseAnalyticsDialog.d.ts +19 -0
  33. package/dist/chat/dialogs/ExpenseAnalyticsDialog.d.ts.map +1 -0
  34. package/dist/chat/dialogs/ExpenseAnalyticsDialog.js +52 -0
  35. package/dist/chat/dialogs/GroupInfoDialog.d.ts.map +1 -1
  36. package/dist/chat/dialogs/GroupInfoDialog.js +55 -92
  37. package/dist/chat/dialogs/GroupInfoViewDialog.js +5 -6
  38. package/dist/chat/dialogs/NewChatDialog.d.ts.map +1 -1
  39. package/dist/chat/dialogs/NewChatDialog.js +49 -113
  40. package/dist/chat/dialogs/NewGroupDialog.d.ts.map +1 -1
  41. package/dist/chat/dialogs/NewGroupDialog.js +49 -92
  42. package/dist/chat/dialogs/ParticipantsDialog.d.ts.map +1 -1
  43. package/dist/chat/dialogs/ParticipantsDialog.js +68 -118
  44. package/dist/chat/dialogs/UserProfileDialog.d.ts +10 -0
  45. package/dist/chat/dialogs/UserProfileDialog.d.ts.map +1 -0
  46. package/dist/chat/dialogs/UserProfileDialog.js +100 -0
  47. package/dist/dashboard/action-buttons.js +4 -5
  48. package/dist/dashboard/app-sidebar.js +46 -128
  49. package/dist/dashboard/card-header.js +1 -2
  50. package/dist/dashboard/dashboard-components.js +3 -5
  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 +1 -0
  60. package/dist/index.d.ts.map +1 -1
  61. package/dist/index.js +1 -1
  62. package/dist/main/footer.js +5 -9
  63. package/dist/main/navbar.js +53 -136
  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 +131 -198
  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/dropdown-menu.js +30 -67
  83. package/dist/misc/faq.js +2 -3
  84. package/dist/misc/file-preview.js +43 -97
  85. package/dist/misc/filter.d.ts.map +1 -1
  86. package/dist/misc/filter.js +18 -21
  87. package/dist/misc/filterBar.js +136 -160
  88. package/dist/misc/form.js +39 -60
  89. package/dist/misc/image-cropper.d.ts +10 -0
  90. package/dist/misc/image-cropper.d.ts.map +1 -0
  91. package/dist/misc/image-cropper.js +44 -0
  92. package/dist/misc/input.js +2 -25
  93. package/dist/misc/label.js +2 -25
  94. package/dist/misc/line-carousel.js +3 -13
  95. package/dist/misc/multiImageUploader.js +2 -3
  96. package/dist/misc/newsLetter.js +18 -78
  97. package/dist/misc/notification.d.ts +1 -2
  98. package/dist/misc/notification.d.ts.map +1 -1
  99. package/dist/misc/notification.js +89 -125
  100. package/dist/misc/pagination.js +16 -45
  101. package/dist/misc/password-eye.js +2 -3
  102. package/dist/misc/popover.d.ts.map +1 -1
  103. package/dist/misc/popover.js +8 -34
  104. package/dist/misc/progress.js +2 -25
  105. package/dist/misc/scroll-area.js +5 -29
  106. package/dist/misc/searchBar.js +27 -31
  107. package/dist/misc/searchBox.js +18 -22
  108. package/dist/misc/select.d.ts.map +1 -1
  109. package/dist/misc/select.js +22 -54
  110. package/dist/misc/separator.js +2 -25
  111. package/dist/misc/share.js +48 -104
  112. package/dist/misc/sheet.js +21 -53
  113. package/dist/misc/sidebar.js +112 -153
  114. package/dist/misc/skeleton.js +2 -25
  115. package/dist/misc/slider.js +3 -26
  116. package/dist/misc/starRating.js +5 -15
  117. package/dist/misc/stateCard.js +7 -8
  118. package/dist/misc/switch.d.ts +5 -0
  119. package/dist/misc/switch.d.ts.map +1 -0
  120. package/dist/misc/switch.js +8 -0
  121. package/dist/misc/tabs.js +8 -34
  122. package/dist/misc/textarea.js +2 -25
  123. package/dist/misc/tile.js +31 -92
  124. package/dist/misc/tooltip.js +8 -34
  125. package/dist/profile/socialLink.d.ts +1 -1
  126. package/dist/profile/socialLink.d.ts.map +1 -1
  127. package/dist/profile/socialLink.js +53 -69
  128. package/dist/utils/permissions.d.ts +7 -0
  129. package/dist/utils/permissions.d.ts.map +1 -0
  130. package/dist/utils/permissions.js +38 -0
  131. package/package.json +3 -2
@@ -1,40 +1,4 @@
1
1
  "use client";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- var __generator = (this && this.__generator) || function (thisArg, body) {
12
- 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);
13
- return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
- function verb(n) { return function (v) { return step([n, v]); }; }
15
- function step(op) {
16
- if (f) throw new TypeError("Generator is already executing.");
17
- while (g && (g = 0, op[0] && (_ = 0)), _) try {
18
- 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;
19
- if (y = 0, t) op = [op[0] & 2, t.value];
20
- switch (op[0]) {
21
- case 0: case 1: t = op; break;
22
- case 4: _.label++; return { value: op[1], done: false };
23
- case 5: _.label++; y = op[1]; op = [0]; continue;
24
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
- default:
26
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
- if (t[2]) _.ops.pop();
31
- _.trys.pop(); continue;
32
- }
33
- op = body.call(thisArg, _);
34
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
- }
37
- };
38
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
39
3
  import { useState } from "react";
40
4
  import { Dialog, DialogContent, DialogHeader, DialogTitle } from "../../misc/dialog";
@@ -46,98 +10,84 @@ import { Input } from "../../misc/input";
46
10
  import { Badge } from "../../misc/badge";
47
11
  import { AddMemberDialog } from "./AddMemberDialog";
48
12
  import { useRouter } from "next/navigation";
49
- export function ParticipantsDialog(_a) {
50
- var _this = this;
51
- var _b;
52
- var open = _a.open, onOpenChange = _a.onOpenChange, conversation = _a.conversation, currentUserId = _a.currentUserId, onUpdate = _a.onUpdate;
53
- var _c = useState(""), search = _c[0], setSearch = _c[1];
54
- var _d = useState([]), selectedUsers = _d[0], setSelectedUsers = _d[1];
55
- var router = useRouter();
56
- var isAdmin = ((_b = conversation.participants.find(function (p) { return p.userId === currentUserId; })) === null || _b === void 0 ? void 0 : _b.chatRole) === "admin";
13
+ import { confirmActions, showAlert } from "../../misc/alertdialogclaude";
14
+ export function ParticipantsDialog({ open, onOpenChange, conversation, currentUserId, onUpdate }) {
15
+ var _a;
16
+ const [search, setSearch] = useState("");
17
+ const [selectedUsers, setSelectedUsers] = useState([]);
18
+ const [participants, setParticipants] = useState(conversation.participants || []);
19
+ const router = useRouter();
20
+ const isAdmin = ((_a = participants.find(p => p.userId === currentUserId)) === null || _a === void 0 ? void 0 : _a.chatRole) === "admin";
57
21
  // Filter participants based on search query
58
- var filteredParticipants = conversation.participants.filter(function (p) {
22
+ const filteredParticipants = participants.filter(p => {
59
23
  var _a;
60
24
  return p.userId.toLowerCase().includes(search.toLowerCase()) ||
61
25
  ((_a = p.role) === null || _a === void 0 ? void 0 : _a.toLowerCase().includes(search.toLowerCase()));
62
26
  });
63
- var handleRemoveMember = function (userId) { return __awaiter(_this, void 0, void 0, function () {
64
- var res, err_1;
65
- return __generator(this, function (_a) {
66
- switch (_a.label) {
67
- case 0:
68
- if (!window.confirm("Are you sure you want to remove this member?")) return [3 /*break*/, 4];
69
- _a.label = 1;
70
- case 1:
71
- _a.trys.push([1, 3, , 4]);
72
- return [4 /*yield*/, chatApi.removeParticipant(conversation._id, userId)];
73
- case 2:
74
- res = _a.sent();
75
- if (res) {
76
- onUpdate();
77
- }
78
- return [3 /*break*/, 4];
79
- case 3:
80
- err_1 = _a.sent();
81
- console.error("Failed to remove member:", err_1);
82
- return [3 /*break*/, 4];
83
- case 4: return [2 /*return*/];
27
+ const handleRemoveMember = async (userId) => {
28
+ let confirmRemove = true;
29
+ await showAlert("Are you sure you want to remove this member?", undefined, confirmActions(() => confirmRemove = false));
30
+ if (!confirmRemove)
31
+ return;
32
+ if (confirmRemove) {
33
+ try {
34
+ const res = await chatApi.removeParticipant(conversation._id, userId);
35
+ if (res) {
36
+ setParticipants(participants.filter(p => p.userId !== userId));
37
+ onUpdate();
38
+ }
84
39
  }
85
- });
86
- }); };
40
+ catch (err) {
41
+ console.error("Failed to remove member:", err);
42
+ await showAlert("Failed to remove member");
43
+ }
44
+ }
45
+ };
87
46
  function handleCancel() {
88
47
  setSelectedUsers([]);
48
+ onOpenChange(false);
89
49
  }
90
- var handleToggleAdmin = function (userId, currentRole) { return __awaiter(_this, void 0, void 0, function () {
91
- var newRole, actionText, res, err_2;
92
- return __generator(this, function (_a) {
93
- switch (_a.label) {
94
- case 0:
95
- newRole = currentRole === "admin" ? "member" : "admin";
96
- actionText = newRole === "admin" ? "make admin" : "remove admin privileges from";
97
- if (!window.confirm("Are you sure you want to ".concat(actionText, " this user?"))) return [3 /*break*/, 4];
98
- _a.label = 1;
99
- case 1:
100
- _a.trys.push([1, 3, , 4]);
101
- return [4 /*yield*/, chatApi.updateParticipant(conversation._id, userId, { chatRole: newRole })];
102
- case 2:
103
- res = _a.sent();
104
- if (res) {
105
- onUpdate();
106
- }
107
- return [3 /*break*/, 4];
108
- case 3:
109
- err_2 = _a.sent();
110
- console.error("Failed to update user role:", err_2);
111
- return [3 /*break*/, 4];
112
- case 4: return [2 /*return*/];
50
+ const handleToggleAdmin = async (userId, currentRole) => {
51
+ const newRole = currentRole === "admin" ? "member" : "admin";
52
+ const actionText = newRole === "admin" ? "make admin" : "remove admin privileges from";
53
+ let confirmChange = true;
54
+ await showAlert(`Are you sure you want to ${actionText} this user?`, undefined, confirmActions(() => confirmChange = false));
55
+ if (confirmChange) {
56
+ try {
57
+ const res = await chatApi.updateParticipant(conversation._id, userId, { chatRole: newRole });
58
+ if (res) {
59
+ setParticipants(participants.map(p => p.userId === userId ? { ...p, chatRole: newRole } : p));
60
+ onUpdate();
61
+ }
62
+ }
63
+ catch (err) {
64
+ console.error(`Failed to update user role:`, err);
65
+ await showAlert("Failed to update user role");
66
+ }
67
+ }
68
+ };
69
+ const handleMembersSelected = async () => {
70
+ try {
71
+ const userIds = selectedUsers.map(u => u.username || "").filter(Boolean);
72
+ const res = await chatApi.addParticipants(conversation._id, userIds);
73
+ if (res.error) {
74
+ throw new Error(res.error);
113
75
  }
114
- });
115
- }); };
116
- var handleMembersSelected = function () { return __awaiter(_this, void 0, void 0, function () {
117
- var userIds, res, err_3;
118
- return __generator(this, function (_a) {
119
- switch (_a.label) {
120
- case 0:
121
- _a.trys.push([0, 2, , 3]);
122
- userIds = selectedUsers.map(function (u) { return u.username || ""; }).filter(Boolean);
123
- return [4 /*yield*/, chatApi.addParticipants(conversation._id, userIds)];
124
- case 1:
125
- res = _a.sent();
126
- if (res) {
127
- onUpdate();
128
- }
129
- router.refresh();
130
- return [3 /*break*/, 3];
131
- case 2:
132
- err_3 = _a.sent();
133
- console.error("Failed to add members:", err_3);
134
- return [3 /*break*/, 3];
135
- case 3: return [2 /*return*/];
76
+ else {
77
+ setParticipants(prev => [...prev, ...res.data]);
78
+ onUpdate();
136
79
  }
137
- });
138
- }); };
139
- var existingUsernames = conversation.participants.map(function (p) { return p.userId; });
140
- return (_jsx(Dialog, { open: open, onOpenChange: onOpenChange, children: _jsxs(DialogContent, { className: "sm:max-w-[500px]", children: [_jsx(DialogHeader, { children: _jsx(DialogTitle, { children: isAdmin ? "Manage Participants" : "Group Members" }) }), _jsxs("div", { className: "space-y-4 py-4", children: [_jsxs("div", { className: "relative", children: [_jsx(Search, { className: "absolute left-3 top-3 w-4 h-4 text-gray-400" }), _jsx(Input, { value: search, onChange: function (e) { return setSearch(e.target.value); }, placeholder: "Search members by name or role..." })] }), _jsxs("div", { className: "max-h-64 overflow-y-auto space-y-2 pr-2 custom-scrollbar border rounded-lg p-3 bg-gray-50 dark:bg-gray-900/30", children: [_jsxs("p", { className: "text-[10px] font-bold text-gray-400 uppercase tracking-widest pl-1 sticky top-0", children: [isAdmin ? "Manage Members" : "Members", " (", filteredParticipants.length, ")"] }), filteredParticipants.map(function (p) { return (_jsxs("div", { className: "flex items-center justify-between p-2 rounded-xl hover:bg-gray-100 dark:hover:bg-gray-800/70 transition-colors", children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsxs(Avatar, { className: "w-8 h-8", children: [_jsx(AvatarImage, { src: p.profilePic }), _jsx(AvatarFallback, { className: "bg-indigo-100 text-indigo-600 text-xs", children: p.userId.charAt(0).toUpperCase() })] }), _jsxs("div", { children: [_jsxs("p", { className: "text-sm font-medium text-gray-900 dark:text-white flex items-center gap-1", children: [p.userId, p.chatRole === "admin" && _jsx(ShieldCheck, { className: "w-3 h-3 text-indigo-500" }), p.userId === currentUserId && _jsx(Badge, { variant: "secondary", className: "text-[10px] px-1.5 py-0.5 ml-1", children: "You" })] }), _jsx("p", { className: "text-[10px] text-gray-400 capitalize", children: p.role })] })] }), isAdmin && p.userId !== currentUserId && (_jsxs("div", { className: "flex items-center gap-1", children: [_jsx(Button, { variant: "ghost", size: "icon", className: "".concat(p.chatRole === "admin"
80
+ }
81
+ catch (err) {
82
+ console.error("Failed to add members:", err);
83
+ await showAlert("Failed to add members");
84
+ }
85
+ finally {
86
+ setSelectedUsers([]);
87
+ }
88
+ };
89
+ const existingUsernames = participants.map(p => p.userId);
90
+ return (_jsx(Dialog, { open: open, onOpenChange: onOpenChange, children: _jsxs(DialogContent, { className: "sm:max-w-[500px]", children: [_jsx(DialogHeader, { children: _jsx(DialogTitle, { children: isAdmin ? "Manage Participants" : "Group Members" }) }), _jsxs("div", { className: "space-y-4 py-4", children: [_jsxs("div", { className: "relative", children: [_jsx(Search, { className: "absolute left-3 top-3 w-4 h-4 text-gray-400" }), _jsx(Input, { value: search, onChange: (e) => setSearch(e.target.value), placeholder: "Search members by name or role..." })] }), _jsxs("div", { className: "max-h-64 overflow-y-auto space-y-2 pr-2 custom-scrollbar border rounded-lg p-3 bg-gray-50 dark:bg-gray-900/30", children: [_jsxs("p", { className: "text-[10px] font-bold text-gray-400 uppercase tracking-widest pl-1 sticky top-0", children: [isAdmin ? "Manage Members" : "Members", " (", filteredParticipants.length, ")"] }), filteredParticipants.map((p) => (_jsxs("div", { className: "flex items-center justify-between p-2 rounded-xl hover:bg-gray-100 dark:hover:bg-gray-800/70 transition-colors", children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsxs(Avatar, { className: "w-8 h-8", children: [_jsx(AvatarImage, { src: p.profilePic }), _jsx(AvatarFallback, { className: "bg-indigo-100 text-indigo-600 text-xs", children: p.userId.charAt(0).toUpperCase() })] }), _jsxs("div", { children: [_jsxs("p", { className: "text-sm font-medium text-gray-900 dark:text-white flex items-center gap-1", children: [p.userId, p.chatRole === "admin" && _jsx(ShieldCheck, { className: "w-3 h-3 text-indigo-500" }), p.userId === currentUserId && _jsx(Badge, { variant: "secondary", className: "text-[10px] px-1.5 py-0.5 ml-1", children: "You" })] }), _jsx("p", { className: "text-[10px] text-gray-400 capitalize", children: p.role })] })] }), isAdmin && p.userId !== currentUserId && (_jsxs("div", { className: "flex items-center gap-1", children: [_jsx(Button, { variant: "ghost", size: "icon", className: `${p.chatRole === "admin"
141
91
  ? "text-yellow-500 hover:text-yellow-600 hover:bg-yellow-50 dark:hover:bg-yellow-900/20"
142
- : "text-blue-400 hover:text-blue-500 hover:bg-blue-50 dark:hover:bg-blue-900/20"), onClick: function () { return handleToggleAdmin(p.userId, p.chatRole); }, title: p.chatRole === "admin" ? "Remove admin" : "Make admin", children: p.chatRole === "admin" ? (_jsx(ShieldCheck, { className: "w-4 h-4" })) : (_jsx(Shield, { className: "w-4 h-4" })) }), _jsx(Button, { variant: "ghost", size: "icon", className: "text-red-400 hover:text-red-500 hover:bg-red-50 dark:hover:bg-red-900/20", onClick: function () { return handleRemoveMember(p.userId); }, title: "Remove member", children: _jsx(UserMinus, { className: "w-4 h-4" }) })] }))] }, p.userId)); })] }), isAdmin && (_jsxs("div", { className: "border-t pt-4", children: [_jsxs("p", { className: "text-sm font-medium mb-3 flex items-center gap-2", children: [_jsx(UserPlus, { className: "w-4 h-4" }), "Add New Members"] }), _jsx(AddMemberDialog, { selectedUsers: selectedUsers, setSelectedUsers: setSelectedUsers, excludeUsernames: existingUsernames }), _jsxs("div", { className: "flex justify-end gap-2 pt-2", children: [_jsx(Button, { variant: "outline", onClick: handleCancel, children: "Cancel" }), _jsx(Button, { onClick: handleMembersSelected, disabled: selectedUsers.length === 0, children: "Add Members" })] })] }))] })] }) }));
92
+ : "text-blue-400 hover:text-blue-500 hover:bg-blue-50 dark:hover:bg-blue-900/20"}`, onClick: () => handleToggleAdmin(p.userId, p.chatRole), title: p.chatRole === "admin" ? "Remove admin" : "Make admin", children: p.chatRole === "admin" ? (_jsx(ShieldCheck, { className: "w-4 h-4" })) : (_jsx(Shield, { className: "w-4 h-4" })) }), _jsx(Button, { variant: "ghost", size: "icon", className: "text-red-400 hover:text-red-500 hover:bg-red-50 dark:hover:bg-red-900/20", onClick: () => handleRemoveMember(p.userId), title: "Remove member", children: _jsx(UserMinus, { className: "w-4 h-4" }) })] }))] }, p.userId)))] }), isAdmin && (_jsxs("div", { className: "border-t pt-4", children: [_jsxs("p", { className: "text-sm font-medium mb-3 flex items-center gap-2", children: [_jsx(UserPlus, { className: "w-4 h-4" }), "Add New Members"] }), _jsx(AddMemberDialog, { selectedUsers: selectedUsers, setSelectedUsers: setSelectedUsers, excludeUsernames: existingUsernames }), _jsxs("div", { className: "flex justify-end gap-2 pt-2", children: [_jsx(Button, { variant: "outline", onClick: handleCancel, children: "Cancel" }), _jsx(Button, { onClick: handleMembersSelected, disabled: selectedUsers.length === 0, children: "Add Members" })] })] }))] })] }) }));
143
93
  }
@@ -0,0 +1,10 @@
1
+ interface UserProfileDialogProps {
2
+ userId: string;
3
+ userName: string;
4
+ userImage?: string;
5
+ open: boolean;
6
+ onClose: () => void;
7
+ }
8
+ export declare function UserProfileDialog({ userId, userName, userImage, open, onClose }: UserProfileDialogProps): import("react/jsx-runtime").JSX.Element;
9
+ export {};
10
+ //# sourceMappingURL=UserProfileDialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UserProfileDialog.d.ts","sourceRoot":"","sources":["../../../src/chat/dialogs/UserProfileDialog.tsx"],"names":[],"mappings":"AASA,UAAU,sBAAsB;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;CACvB;AAED,wBAAgB,iBAAiB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,sBAAsB,2CAkFvG"}
@@ -0,0 +1,100 @@
1
+ "use client";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ 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);
13
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
18
+ 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;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
39
+ import { useState, useEffect } from "react";
40
+ import { Dialog, DialogContent, DialogHeader, DialogTitle } from "../../misc/dialog";
41
+ import { Button } from "../../misc/button";
42
+ import { Avatar, AvatarFallback, AvatarImage } from "../../misc/avatar";
43
+ import { Ban, Shield } from "lucide-react";
44
+ import { userApi } from "@myrjfa/state/dist/lib/actions/user";
45
+ export function UserProfileDialog(_a) {
46
+ var _this = this;
47
+ var userId = _a.userId, userName = _a.userName, userImage = _a.userImage, open = _a.open, onClose = _a.onClose;
48
+ var _b = useState(false), isBlocked = _b[0], setIsBlocked = _b[1];
49
+ var _c = useState(false), loading = _c[0], setLoading = _c[1];
50
+ useEffect(function () {
51
+ if (open && userId) {
52
+ checkBlockStatus();
53
+ }
54
+ }, [open, userId]);
55
+ var checkBlockStatus = function () { return __awaiter(_this, void 0, void 0, function () {
56
+ var blocked;
57
+ return __generator(this, function (_a) {
58
+ switch (_a.label) {
59
+ case 0: return [4 /*yield*/, userApi.checkIfBlocked(userId)];
60
+ case 1:
61
+ blocked = _a.sent();
62
+ setIsBlocked(blocked);
63
+ return [2 /*return*/];
64
+ }
65
+ });
66
+ }); };
67
+ var handleBlockToggle = function () { return __awaiter(_this, void 0, void 0, function () {
68
+ var error_1;
69
+ return __generator(this, function (_a) {
70
+ switch (_a.label) {
71
+ case 0:
72
+ setLoading(true);
73
+ _a.label = 1;
74
+ case 1:
75
+ _a.trys.push([1, 6, 7, 8]);
76
+ if (!isBlocked) return [3 /*break*/, 3];
77
+ return [4 /*yield*/, userApi.unblockUser(userId)];
78
+ case 2:
79
+ _a.sent();
80
+ setIsBlocked(false);
81
+ return [3 /*break*/, 5];
82
+ case 3: return [4 /*yield*/, userApi.blockUser(userId)];
83
+ case 4:
84
+ _a.sent();
85
+ setIsBlocked(true);
86
+ _a.label = 5;
87
+ case 5: return [3 /*break*/, 8];
88
+ case 6:
89
+ error_1 = _a.sent();
90
+ console.error("Failed to toggle block:", error_1);
91
+ return [3 /*break*/, 8];
92
+ case 7:
93
+ setLoading(false);
94
+ return [7 /*endfinally*/];
95
+ case 8: return [2 /*return*/];
96
+ }
97
+ });
98
+ }); };
99
+ return (_jsx(Dialog, { open: open, onOpenChange: onClose, children: _jsxs(DialogContent, { className: "sm:max-w-md", children: [_jsx(DialogHeader, { children: _jsx(DialogTitle, { children: "User Profile" }) }), _jsxs("div", { className: "flex flex-col items-center space-y-4 py-4", children: [_jsxs(Avatar, { className: "h-24 w-24", children: [_jsx(AvatarImage, { src: userImage }), _jsx(AvatarFallback, { className: "text-2xl", children: userName.charAt(0).toUpperCase() })] }), _jsxs("div", { className: "text-center", children: [_jsx("h3", { className: "text-lg font-semibold", children: userName }), _jsxs("p", { className: "text-sm text-gray-500", children: ["@", userId] })] }), _jsx(Button, { onClick: handleBlockToggle, disabled: loading, variant: isBlocked ? "outline" : "destructive", className: "w-full", children: loading ? ("Processing...") : isBlocked ? (_jsxs(_Fragment, { children: [_jsx(Shield, { className: "w-4 h-4 mr-2" }), "Unblock User"] })) : (_jsxs(_Fragment, { children: [_jsx(Ban, { className: "w-4 h-4 mr-2" }), "Block User"] })) }), isBlocked && (_jsx("p", { className: "text-xs text-gray-500 text-center", children: "You have blocked this user. They cannot start chats with you." }))] })] }) }));
100
+ }
@@ -2,9 +2,8 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { MoreHorizontal } from 'lucide-react';
3
3
  import { Button } from '../misc/button';
4
4
  import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from '../misc/dropdown-menu';
5
- export function ActionButtons(_a) {
6
- var actions = _a.actions, _b = _a.includeMoreMenu, includeMoreMenu = _b === void 0 ? true : _b, _c = _a.maxDisplayed, maxDisplayed = _c === void 0 ? 0 : _c;
7
- var displayedActions = actions.slice(0, maxDisplayed);
8
- var menuActions = includeMoreMenu ? actions.slice(maxDisplayed) : [];
9
- return (_jsxs("div", { className: "flex items-center gap-2", children: [displayedActions.map(function (action, index) { return (_jsxs(Button, { variant: action.variant || 'outline', size: "sm", onClick: action.action, className: 'cursor-pointer', children: [action.icon, _jsx("span", { className: "ml-1", children: action.label })] }, index)); }), menuActions.length > 0 && (_jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx(Button, { variant: "outline", size: "sm", children: _jsx(MoreHorizontal, { className: "h-4 w-4 cursor-pointer" }) }) }), _jsx(DropdownMenuContent, { align: "end", children: menuActions.map(function (action, index) { return (_jsxs(DropdownMenuItem, { onClick: action.action, children: [action.icon, _jsx("span", { className: "ml-2", children: action.label })] }, index)); }) })] }))] }));
5
+ export function ActionButtons({ actions, includeMoreMenu = true, maxDisplayed = 0 }) {
6
+ const displayedActions = actions.slice(0, maxDisplayed);
7
+ const menuActions = includeMoreMenu ? actions.slice(maxDisplayed) : [];
8
+ return (_jsxs("div", { className: "flex items-center gap-2", children: [displayedActions.map((action, index) => (_jsxs(Button, { variant: action.variant || 'outline', size: "sm", onClick: action.action, className: 'cursor-pointer', children: [action.icon, _jsx("span", { className: "ml-1", children: action.label })] }, index))), menuActions.length > 0 && (_jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx(Button, { variant: "outline", size: "sm", children: _jsx(MoreHorizontal, { className: "h-4 w-4 cursor-pointer" }) }) }), _jsx(DropdownMenuContent, { align: "end", children: menuActions.map((action, index) => (_jsxs(DropdownMenuItem, { onClick: action.action, children: [action.icon, _jsx("span", { className: "ml-2", children: action.label })] }, index))) })] }))] }));
10
9
  }
@@ -1,71 +1,4 @@
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 __rest = (this && this.__rest) || function (s, e) {
50
- var t = {};
51
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
52
- t[p] = s[p];
53
- if (s != null && typeof Object.getOwnPropertySymbols === "function")
54
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
55
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
56
- t[p[i]] = s[p[i]];
57
- }
58
- return t;
59
- };
60
- var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
61
- if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
62
- if (ar || !(i in from)) {
63
- if (!ar) ar = Array.prototype.slice.call(from, 0, i);
64
- ar[i] = from[i];
65
- }
66
- }
67
- return to.concat(ar || Array.prototype.slice.call(from));
68
- };
69
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
70
3
  import { logoutUser } from "@myrjfa/state/dist/lib/auth";
71
4
  import { isLoggedInAtom, userAtom, userLoadingAtom } from "@myrjfa/state/dist/lib/userAtom";
@@ -80,56 +13,55 @@ import { Avatar, AvatarFallback, AvatarImage } from "../misc/avatar";
80
13
  import { Label } from "../misc/label";
81
14
  import { Sidebar, SidebarContent, SidebarFooter, SidebarMenuButton } from "../misc/sidebar";
82
15
  import { Skeleton } from "../misc/skeleton";
83
- export function AppSidebar(_a) {
84
- var _this = this;
85
- var _b, _c, _d, _e, _f, _g, _h, _j, _k;
86
- var props = __rest(_a, []);
87
- var router = useRouter();
88
- var _l = useAtom(userAtom), user = _l[0], setUser = _l[1];
89
- var setIsLoggedIn = useSetAtom(isLoggedInAtom);
90
- var loading = useAtomValue(userLoadingAtom);
16
+ export function AppSidebar({ ...props }) {
17
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
18
+ const router = useRouter();
19
+ const [user, setUser] = useAtom(userAtom);
20
+ const setIsLoggedIn = useSetAtom(isLoggedInAtom);
21
+ const loading = useAtomValue(userLoadingAtom);
91
22
  // Redirect to login if user is null after loading finishes
92
- useEffect(function () {
23
+ useEffect(() => {
93
24
  if (!loading && !user) {
94
25
  router.push('/auth/login');
95
26
  }
96
27
  }, [loading, user, router]);
97
28
  // Navigation data
98
- var navData = {
99
- navMain: __spreadArray(__spreadArray(__spreadArray([
29
+ const navData = {
30
+ navMain: [
100
31
  {
101
32
  title: "Profile",
102
- url: user ? "/profile/".concat((_b = user.role) !== null && _b !== void 0 ? _b : "user", "/").concat(user.username) : "#",
33
+ url: user ? `/profile/${(_a = user.role) !== null && _a !== void 0 ? _a : "user"}/${user.username}` : "#",
103
34
  icon: User,
104
35
  },
105
36
  {
106
- title: "Dashboard",
107
- url: user ? "/overview/".concat((_c = user.role) !== null && _c !== void 0 ? _c : "user") : "#",
37
+ title: "My Opportunities",
38
+ url: user ? `/overview/${(_b = user.role) !== null && _b !== void 0 ? _b : "user"}` : "#",
108
39
  icon: LayoutDashboardIcon
109
- }
110
- ], ((user === null || user === void 0 ? void 0 : user.role) === "admin" || (user === null || user === void 0 ? void 0 : user.role) === "host"
111
- ? [
112
- {
113
- title: "My Tours",
114
- url: "/overview/".concat(user.role, "/packages"),
115
- icon: Package,
116
- },
117
- ]
118
- : []), true), ((user === null || user === void 0 ? void 0 : user.role) === "admin" || (user === null || user === void 0 ? void 0 : user.role) === "host"
119
- ? [
120
- {
121
- title: "Blogs",
122
- url: "/overview/".concat(user.role, "/blogs"),
123
- icon: FileText,
124
- },
125
- ]
126
- : []), true), [
40
+ },
41
+ ...((user === null || user === void 0 ? void 0 : user.role) === "admin" || (user === null || user === void 0 ? void 0 : user.role) === "host"
42
+ ? [
43
+ {
44
+ title: "My Tours",
45
+ url: `/overview/${user.role}/packages`,
46
+ icon: Package,
47
+ },
48
+ ]
49
+ : []),
50
+ ...((user === null || user === void 0 ? void 0 : user.role) === "admin" || (user === null || user === void 0 ? void 0 : user.role) === "host"
51
+ ? [
52
+ {
53
+ title: "Blogs",
54
+ url: `/overview/${user.role}/blogs`,
55
+ icon: FileText,
56
+ },
57
+ ]
58
+ : []),
127
59
  {
128
60
  title: "Inbox",
129
61
  url: "/inbox",
130
62
  icon: Inbox
131
63
  },
132
- ], false),
64
+ ],
133
65
  navSecondary: [
134
66
  {
135
67
  title: "Get Help",
@@ -139,33 +71,19 @@ export function AppSidebar(_a) {
139
71
  ]
140
72
  };
141
73
  // Loading skeleton for user info
142
- var UserInfoSkeleton = function () { return (_jsxs(_Fragment, { children: [_jsx(Skeleton, { className: "h-8 w-8 rounded-full" }), _jsxs("div", { className: "grid flex-1 gap-1 text-left", children: [_jsx(Skeleton, { className: "h-4 w-24" }), _jsx(Skeleton, { className: "h-3 w-32" })] })] })); };
143
- var handleLogout = function () { return __awaiter(_this, void 0, void 0, function () {
144
- var role, response;
74
+ const UserInfoSkeleton = () => (_jsxs(_Fragment, { children: [_jsx(Skeleton, { className: "h-8 w-8 rounded-full" }), _jsxs("div", { className: "grid flex-1 gap-1 text-left", children: [_jsx(Skeleton, { className: "h-4 w-24" }), _jsx(Skeleton, { className: "h-3 w-32" })] })] }));
75
+ const handleLogout = async () => {
145
76
  var _a;
146
- return __generator(this, function (_b) {
147
- switch (_b.label) {
148
- case 0:
149
- role = (user === null || user === void 0 ? void 0 : user.role) || "user";
150
- setUser(null);
151
- setIsLoggedIn(false);
152
- return [4 /*yield*/, logoutUser(role)];
153
- case 1:
154
- response = _b.sent();
155
- if (!(response === null || response === void 0 ? void 0 : response.error)) return [3 /*break*/, 3];
156
- return [4 /*yield*/, showAlert(response.error)];
157
- case 2:
158
- _b.sent();
159
- return [3 /*break*/, 5];
160
- case 3: return [4 /*yield*/, showAlert((_a = response.message) !== null && _a !== void 0 ? _a : "")];
161
- case 4:
162
- _b.sent();
163
- _b.label = 5;
164
- case 5:
165
- router.push('/auth/login?role=' + role);
166
- return [2 /*return*/];
167
- }
168
- });
169
- }); };
170
- return (_jsxs(Sidebar, __assign({ collapsible: "icon" }, props, { children: [_jsxs(SidebarContent, { children: [_jsx(NavMain, { items: navData.navMain }), _jsx(NavSecondary, { items: navData.navSecondary, className: "mt-auto" })] }), _jsxs(SidebarFooter, { children: [_jsx(SidebarMenuButton, { size: "lg", className: "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground", children: loading ? (_jsx(UserInfoSkeleton, {})) : user ? (_jsxs(_Fragment, { children: [_jsxs(Avatar, { className: "h-8 w-8 rounded-full", children: [_jsx(AvatarImage, { src: (_d = user.profilePic) !== null && _d !== void 0 ? _d : "/images/profile_placeholder.webp", alt: "".concat((_e = user.firstName) !== null && _e !== void 0 ? _e : "Guest", " ").concat(user.lastName) }), _jsxs(AvatarFallback, { className: "rounded-full", children: [(_g = (_f = user.firstName) === null || _f === void 0 ? void 0 : _f.charAt(0)) !== null && _g !== void 0 ? _g : "D", (_j = (_h = user.lastName) === null || _h === void 0 ? void 0 : _h.charAt(0)) !== null && _j !== void 0 ? _j : "P"] })] }), _jsxs("div", { className: "grid flex-1 text-left text-sm leading-tight", children: [_jsxs("span", { className: "truncate font-medium", children: [(_k = user.firstName) !== null && _k !== void 0 ? _k : "Guest", " ", user.lastName] }), user.email && (_jsx("span", { className: "truncate text-xs text-muted-foreground", children: user.email }))] })] })) : (_jsxs(_Fragment, { children: [_jsx(Avatar, { className: "h-8 w-8 rounded-full", children: _jsx(AvatarFallback, { className: "rounded-full", children: "GU" }) }), _jsxs("div", { className: "grid flex-1 text-left text-sm leading-tight", children: [_jsx("span", { className: "truncate font-medium", children: "Guest User" }), _jsx("span", { className: "truncate text-xs text-muted-foreground", children: "Not signed in" })] })] })) }), _jsxs(SidebarMenuButton, { size: "lg", className: "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground", onClick: handleLogout, disabled: loading, children: [_jsx(LogOutIcon, { className: "mx-2" }), _jsx(Label, { className: "cursor-pointer", children: "Log out" })] })] })] })));
77
+ const role = (user === null || user === void 0 ? void 0 : user.role) || "user";
78
+ setUser(null);
79
+ setIsLoggedIn(false);
80
+ const response = await logoutUser(role);
81
+ if (response === null || response === void 0 ? void 0 : response.error) {
82
+ await showAlert(response.error);
83
+ }
84
+ else
85
+ await showAlert((_a = response.message) !== null && _a !== void 0 ? _a : "");
86
+ router.push('/auth/login?role=' + role);
87
+ };
88
+ return (_jsxs(Sidebar, { collapsible: "icon", ...props, children: [_jsxs(SidebarContent, { children: [_jsx(NavMain, { items: navData.navMain }), _jsx(NavSecondary, { items: navData.navSecondary, className: "mt-auto" })] }), _jsxs(SidebarFooter, { children: [_jsx(SidebarMenuButton, { size: "lg", className: "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground", children: loading ? (_jsx(UserInfoSkeleton, {})) : user ? (_jsxs(_Fragment, { children: [_jsxs(Avatar, { className: "h-8 w-8 rounded-full", children: [_jsx(AvatarImage, { src: (_c = user.profilePic) !== null && _c !== void 0 ? _c : "/images/profile_placeholder.webp", alt: `${(_d = user.firstName) !== null && _d !== void 0 ? _d : "Guest"} ${user.lastName}` }), _jsxs(AvatarFallback, { className: "rounded-full", children: [(_f = (_e = user.firstName) === null || _e === void 0 ? void 0 : _e.charAt(0)) !== null && _f !== void 0 ? _f : "D", (_h = (_g = user.lastName) === null || _g === void 0 ? void 0 : _g.charAt(0)) !== null && _h !== void 0 ? _h : "P"] })] }), _jsxs("div", { className: "grid flex-1 text-left text-sm leading-tight", children: [_jsxs("span", { className: "truncate font-medium", children: [(_j = user.firstName) !== null && _j !== void 0 ? _j : "Guest", " ", user.lastName] }), user.email && (_jsx("span", { className: "truncate text-xs text-muted-foreground", children: user.email }))] })] })) : (_jsxs(_Fragment, { children: [_jsx(Avatar, { className: "h-8 w-8 rounded-full", children: _jsx(AvatarFallback, { className: "rounded-full", children: "GU" }) }), _jsxs("div", { className: "grid flex-1 text-left text-sm leading-tight", children: [_jsx("span", { className: "truncate font-medium", children: "Guest User" }), _jsx("span", { className: "truncate text-xs text-muted-foreground", children: "Not signed in" })] })] })) }), _jsxs(SidebarMenuButton, { size: "lg", className: "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground", onClick: handleLogout, disabled: loading, children: [_jsx(LogOutIcon, { className: "mx-2" }), _jsx(Label, { className: "cursor-pointer", children: "Log out" })] })] })] }));
171
89
  }
@@ -2,7 +2,6 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  // components/ui/card-header.tsx
3
3
  import { PlusCircle } from 'lucide-react';
4
4
  import { Button } from '../misc/button';
5
- export function CardHeader(_a) {
6
- var title = _a.title, description = _a.description, action = _a.action;
5
+ export function CardHeader({ title, description, action }) {
7
6
  return (_jsxs("div", { className: "flex flex-col sm:flex-row justify-between items-start sm:items-center mb-6 gap-4", children: [_jsxs("div", { children: [_jsx("h2", { className: "text-2xl font-bold tracking-tight", children: title }), description && _jsx("p", { className: "text-muted-foreground mt-1", children: description })] }), action && (_jsxs(Button, { onClick: action.onClick, children: [_jsx(PlusCircle, { className: "mr-2 h-4 w-4" }), action.label] }))] }));
8
7
  }
@@ -1,12 +1,10 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { cn, getStatusColor } from '@myrjfa/state/dist/lib/utils';
3
3
  import { Progress } from '../misc/progress';
4
- export function StatusBadge(_a) {
5
- var status = _a.status, className = _a.className;
6
- var statusColor = getStatusColor(status);
4
+ export function StatusBadge({ status, className }) {
5
+ const statusColor = getStatusColor(status);
7
6
  return (_jsx("span", { className: cn('inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium', statusColor, className), children: status.charAt(0).toUpperCase() + status.slice(1) }));
8
7
  }
9
- export function ProgressWithText(_a) {
10
- var value = _a.value, label = _a.label, _b = _a.showPercentage, showPercentage = _b === void 0 ? true : _b;
8
+ export function ProgressWithText({ value, label, showPercentage = true }) {
11
9
  return (_jsxs("div", { className: "space-y-1.5", children: [_jsxs("div", { className: "flex items-center justify-between", children: [label && _jsx("p", { className: "text-sm text-muted-foreground", children: label }), showPercentage && _jsxs("p", { className: "text-sm text-muted-foreground", children: [value, "%"] })] }), _jsx(Progress, { value: value, className: "h-2" })] }));
12
10
  }