@myrjfa/ui 1.0.8 → 1.0.10

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 (161) hide show
  1. package/dist/chat/ChatMain.d.ts +9 -0
  2. package/dist/chat/ChatMain.d.ts.map +1 -0
  3. package/dist/chat/ChatMain.js +272 -0
  4. package/dist/chat/ChatSidebar.d.ts +13 -0
  5. package/dist/chat/ChatSidebar.d.ts.map +1 -0
  6. package/dist/chat/ChatSidebar.js +23 -0
  7. package/dist/chat/ConversationList.d.ts +12 -0
  8. package/dist/chat/ConversationList.d.ts.map +1 -0
  9. package/dist/chat/ConversationList.js +70 -0
  10. package/dist/chat/ExpensePanel.d.ts +11 -0
  11. package/dist/chat/ExpensePanel.d.ts.map +1 -0
  12. package/dist/chat/ExpensePanel.js +235 -0
  13. package/dist/chat/MessageBubble.d.ts +18 -0
  14. package/dist/chat/MessageBubble.d.ts.map +1 -0
  15. package/dist/chat/MessageBubble.js +284 -0
  16. package/dist/chat/MessageInput.d.ts +21 -0
  17. package/dist/chat/MessageInput.d.ts.map +1 -0
  18. package/dist/chat/MessageInput.js +252 -0
  19. package/dist/chat/MilestonePanel.d.ts +11 -0
  20. package/dist/chat/MilestonePanel.d.ts.map +1 -0
  21. package/dist/chat/MilestonePanel.js +173 -0
  22. package/dist/chat/components/ParticipantSelector.d.ts +11 -0
  23. package/dist/chat/components/ParticipantSelector.d.ts.map +1 -0
  24. package/dist/chat/components/ParticipantSelector.js +17 -0
  25. package/dist/chat/components/SplitInputs.d.ts +11 -0
  26. package/dist/chat/components/SplitInputs.d.ts.map +1 -0
  27. package/dist/chat/components/SplitInputs.js +83 -0
  28. package/dist/chat/components/SplitTypeSelector.d.ts +8 -0
  29. package/dist/chat/components/SplitTypeSelector.d.ts.map +1 -0
  30. package/dist/chat/components/SplitTypeSelector.js +13 -0
  31. package/dist/chat/dialogs/AddMemberDialog.d.ts +10 -0
  32. package/dist/chat/dialogs/AddMemberDialog.d.ts.map +1 -0
  33. package/dist/chat/dialogs/AddMemberDialog.js +50 -0
  34. package/dist/chat/dialogs/CameraDialog.d.ts +8 -0
  35. package/dist/chat/dialogs/CameraDialog.d.ts.map +1 -0
  36. package/dist/chat/dialogs/CameraDialog.js +80 -0
  37. package/dist/chat/dialogs/CreatePollDialog.d.ts +8 -0
  38. package/dist/chat/dialogs/CreatePollDialog.d.ts.map +1 -0
  39. package/dist/chat/dialogs/CreatePollDialog.js +38 -0
  40. package/dist/chat/dialogs/ExpenseAnalyticsDialog.d.ts +19 -0
  41. package/dist/chat/dialogs/ExpenseAnalyticsDialog.d.ts.map +1 -0
  42. package/dist/chat/dialogs/ExpenseAnalyticsDialog.js +52 -0
  43. package/dist/chat/dialogs/GroupInfoDialog.d.ts +10 -0
  44. package/dist/chat/dialogs/GroupInfoDialog.d.ts.map +1 -0
  45. package/dist/chat/dialogs/GroupInfoDialog.js +71 -0
  46. package/dist/chat/dialogs/GroupInfoViewDialog.d.ts +9 -0
  47. package/dist/chat/dialogs/GroupInfoViewDialog.d.ts.map +1 -0
  48. package/dist/chat/dialogs/GroupInfoViewDialog.js +15 -0
  49. package/dist/chat/dialogs/NewChatDialog.d.ts +2 -0
  50. package/dist/chat/dialogs/NewChatDialog.d.ts.map +1 -0
  51. package/dist/chat/dialogs/NewChatDialog.js +63 -0
  52. package/dist/chat/dialogs/NewGroupDialog.d.ts +2 -0
  53. package/dist/chat/dialogs/NewGroupDialog.d.ts.map +1 -0
  54. package/dist/chat/dialogs/NewGroupDialog.js +69 -0
  55. package/dist/chat/dialogs/ParticipantsDialog.d.ts +11 -0
  56. package/dist/chat/dialogs/ParticipantsDialog.d.ts.map +1 -0
  57. package/dist/chat/dialogs/ParticipantsDialog.js +93 -0
  58. package/dist/chat/dialogs/UserProfileDialog.d.ts +10 -0
  59. package/dist/chat/dialogs/UserProfileDialog.d.ts.map +1 -0
  60. package/dist/chat/dialogs/UserProfileDialog.js +100 -0
  61. package/dist/chat/index.d.ts +8 -0
  62. package/dist/chat/index.d.ts.map +1 -0
  63. package/dist/chat/index.js +7 -0
  64. package/dist/dashboard/action-buttons.js +4 -5
  65. package/dist/dashboard/app-sidebar.js +46 -128
  66. package/dist/dashboard/card-header.js +1 -2
  67. package/dist/dashboard/dashboard-components.js +3 -5
  68. package/dist/dashboard/data-table.d.ts +18 -18
  69. package/dist/dashboard/data-table.js +54 -66
  70. package/dist/dashboard/nav-main.js +4 -5
  71. package/dist/dashboard/nav-secondary.js +2 -25
  72. package/dist/dashboard/stats-card.js +1 -2
  73. package/dist/dashboard/table.js +8 -54
  74. package/dist/header/mobile-nav-item.js +1 -2
  75. package/dist/header/mobile-navbar.js +8 -9
  76. package/dist/header/nav-item.d.ts +2 -1
  77. package/dist/header/nav-item.d.ts.map +1 -1
  78. package/dist/header/nav-item.js +2 -3
  79. package/dist/index.d.ts +57 -56
  80. package/dist/index.d.ts.map +1 -1
  81. package/dist/index.js +57 -57
  82. package/dist/main/footer.js +5 -9
  83. package/dist/main/navbar.d.ts.map +1 -1
  84. package/dist/main/navbar.js +53 -136
  85. package/dist/main/paginationBar.js +12 -14
  86. package/dist/main/portfolio/portfolioItem.js +1 -2
  87. package/dist/main/portfolio/portfolioPopup.js +16 -17
  88. package/dist/main/review-page.d.ts.map +1 -1
  89. package/dist/main/review-page.js +131 -198
  90. package/dist/misc/accordion.js +8 -34
  91. package/dist/misc/alert-dialog.js +22 -55
  92. package/dist/misc/alert.js +7 -32
  93. package/dist/misc/alertdialogclaude.js +50 -125
  94. package/dist/misc/avatar.js +6 -31
  95. package/dist/misc/badge.d.ts +8 -8
  96. package/dist/misc/badge.js +4 -27
  97. package/dist/misc/button.d.ts +9 -9
  98. package/dist/misc/button.js +4 -27
  99. package/dist/misc/card.js +12 -40
  100. package/dist/misc/carousel.js +37 -61
  101. package/dist/misc/checkbox.js +2 -25
  102. package/dist/misc/command.d.ts +3 -1
  103. package/dist/misc/command.d.ts.map +1 -1
  104. package/dist/misc/command.js +18 -49
  105. package/dist/misc/datepicker.js +66 -76
  106. package/dist/misc/dialog.js +20 -52
  107. package/dist/misc/dropdown-menu.js +30 -67
  108. package/dist/misc/faq.js +2 -3
  109. package/dist/misc/file-preview.js +43 -97
  110. package/dist/misc/filter.d.ts.map +1 -1
  111. package/dist/misc/filter.js +18 -21
  112. package/dist/misc/filterBar.js +136 -160
  113. package/dist/misc/form.d.ts +1 -1
  114. package/dist/misc/form.d.ts.map +1 -1
  115. package/dist/misc/form.js +39 -60
  116. package/dist/misc/image-cropper.d.ts +10 -0
  117. package/dist/misc/image-cropper.d.ts.map +1 -0
  118. package/dist/misc/image-cropper.js +44 -0
  119. package/dist/misc/input.js +2 -25
  120. package/dist/misc/label.js +2 -25
  121. package/dist/misc/line-carousel.js +3 -13
  122. package/dist/misc/multiImageUploader.d.ts +8 -8
  123. package/dist/misc/multiImageUploader.js +10 -11
  124. package/dist/misc/newsLetter.js +18 -78
  125. package/dist/misc/notification.d.ts +1 -2
  126. package/dist/misc/notification.d.ts.map +1 -1
  127. package/dist/misc/notification.js +89 -125
  128. package/dist/misc/pagination.js +16 -45
  129. package/dist/misc/password-eye.js +2 -3
  130. package/dist/misc/popover.d.ts.map +1 -1
  131. package/dist/misc/popover.js +8 -34
  132. package/dist/misc/progress.js +2 -25
  133. package/dist/misc/scroll-area.js +5 -29
  134. package/dist/misc/searchBar.js +27 -31
  135. package/dist/misc/searchBox.js +18 -22
  136. package/dist/misc/select.d.ts.map +1 -1
  137. package/dist/misc/select.js +22 -54
  138. package/dist/misc/separator.js +2 -25
  139. package/dist/misc/share.js +48 -104
  140. package/dist/misc/sheet.js +21 -53
  141. package/dist/misc/sidebar.d.ts +69 -69
  142. package/dist/misc/sidebar.js +112 -153
  143. package/dist/misc/skeleton.d.ts +2 -2
  144. package/dist/misc/skeleton.js +6 -29
  145. package/dist/misc/slider.js +3 -26
  146. package/dist/misc/starRating.js +5 -15
  147. package/dist/misc/stateCard.js +7 -8
  148. package/dist/misc/switch.d.ts +5 -0
  149. package/dist/misc/switch.d.ts.map +1 -0
  150. package/dist/misc/switch.js +8 -0
  151. package/dist/misc/tabs.js +8 -34
  152. package/dist/misc/textarea.js +2 -25
  153. package/dist/misc/tile.js +31 -92
  154. package/dist/misc/tooltip.js +8 -34
  155. package/dist/profile/socialLink.d.ts +1 -1
  156. package/dist/profile/socialLink.d.ts.map +1 -1
  157. package/dist/profile/socialLink.js +53 -69
  158. package/dist/utils/permissions.d.ts +7 -0
  159. package/dist/utils/permissions.d.ts.map +1 -0
  160. package/dist/utils/permissions.js +38 -0
  161. package/package.json +8 -5
@@ -0,0 +1,93 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useState } from "react";
4
+ import { Dialog, DialogContent, DialogHeader, DialogTitle } from "../../misc/dialog";
5
+ import { Button } from "../../misc/button";
6
+ import { Avatar, AvatarFallback, AvatarImage } from "../../misc/avatar";
7
+ import { Search, UserPlus, UserMinus, Shield, ShieldCheck } from "lucide-react";
8
+ import { chatApi } from "@myrjfa/state/dist/lib/actions/chat";
9
+ import { Input } from "../../misc/input";
10
+ import { Badge } from "../../misc/badge";
11
+ import { AddMemberDialog } from "./AddMemberDialog";
12
+ import { useRouter } from "next/navigation";
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";
21
+ // Filter participants based on search query
22
+ const filteredParticipants = participants.filter(p => {
23
+ var _a;
24
+ return p.userId.toLowerCase().includes(search.toLowerCase()) ||
25
+ ((_a = p.role) === null || _a === void 0 ? void 0 : _a.toLowerCase().includes(search.toLowerCase()));
26
+ });
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
+ }
39
+ }
40
+ catch (err) {
41
+ console.error("Failed to remove member:", err);
42
+ await showAlert("Failed to remove member");
43
+ }
44
+ }
45
+ };
46
+ function handleCancel() {
47
+ setSelectedUsers([]);
48
+ onOpenChange(false);
49
+ }
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);
75
+ }
76
+ else {
77
+ setParticipants(prev => [...prev, ...res.data]);
78
+ onUpdate();
79
+ }
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"
91
+ ? "text-yellow-500 hover:text-yellow-600 hover:bg-yellow-50 dark:hover:bg-yellow-900/20"
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" })] })] }))] })] }) }));
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
+ }
@@ -0,0 +1,8 @@
1
+ export * from './ConversationList';
2
+ export * from './ChatSidebar';
3
+ export * from './dialogs/NewChatDialog';
4
+ export * from './dialogs/NewGroupDialog';
5
+ export * from './MessageBubble';
6
+ export * from './MessageInput';
7
+ export * from './ChatMain';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/chat/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,7 @@
1
+ export * from './ConversationList';
2
+ export * from './ChatSidebar';
3
+ export * from './dialogs/NewChatDialog';
4
+ export * from './dialogs/NewGroupDialog';
5
+ export * from './MessageBubble';
6
+ export * from './MessageInput';
7
+ export * from './ChatMain';
@@ -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
  }
@@ -1,19 +1,19 @@
1
- import React, { JSX } from 'react';
2
- export interface Column<T> {
3
- header: string;
4
- accessorKey: keyof T;
5
- cell?: (item: T) => React.ReactNode;
6
- sortable?: boolean;
7
- }
8
- interface DataTableProps<T> {
9
- data: T[];
10
- columns: Column<T>[];
11
- actions?: (item: T) => JSX.Element;
12
- onRowClick?: (id: string) => void;
13
- }
14
- export declare function DataTable<T extends {
15
- slug?: string;
16
- _id?: string;
17
- }>({ data, columns, actions, onRowClick, }: DataTableProps<T>): import("react/jsx-runtime").JSX.Element;
18
- export {};
1
+ import React, { JSX } from 'react';
2
+ export interface Column<T> {
3
+ header: string;
4
+ accessorKey: keyof T;
5
+ cell?: (item: T) => React.ReactNode;
6
+ sortable?: boolean;
7
+ }
8
+ interface DataTableProps<T> {
9
+ data: T[];
10
+ columns: Column<T>[];
11
+ actions?: (item: T) => JSX.Element;
12
+ onRowClick?: (id: string) => void;
13
+ }
14
+ export declare function DataTable<T extends {
15
+ slug?: string;
16
+ _id?: string;
17
+ }>({ data, columns, actions, onRowClick, }: DataTableProps<T>): import("react/jsx-runtime").JSX.Element;
18
+ export {};
19
19
  //# sourceMappingURL=data-table.d.ts.map