@leonardozhe/medusa-plugin-product-reviews 0.0.23

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 (86) hide show
  1. package/README.md +64 -0
  2. package/dist/admin/index.d.ts +28 -0
  3. package/dist/admin/index.js +79 -0
  4. package/dist/admin/index.js.map +1 -0
  5. package/dist/admin/menu.d.ts +20 -0
  6. package/dist/admin/menu.js +28 -0
  7. package/dist/admin/menu.js.map +1 -0
  8. package/dist/admin/routes.d.ts +32 -0
  9. package/dist/admin/routes.js +116 -0
  10. package/dist/admin/routes.js.map +1 -0
  11. package/dist/admin/widgets.d.ts +35 -0
  12. package/dist/admin/widgets.js +119 -0
  13. package/dist/admin/widgets.js.map +1 -0
  14. package/dist/api/index.d.ts +10 -0
  15. package/dist/api/index.js +64 -0
  16. package/dist/api/index.js.map +1 -0
  17. package/dist/api/routes/product-review-image-upload-routes.d.ts +6 -0
  18. package/dist/api/routes/product-review-image-upload-routes.js +33 -0
  19. package/dist/api/routes/product-review-image-upload-routes.js.map +1 -0
  20. package/dist/api/routes/product-review-request-routes.d.ts +3 -0
  21. package/dist/api/routes/product-review-request-routes.js +22 -0
  22. package/dist/api/routes/product-review-request-routes.js.map +1 -0
  23. package/dist/api/routes/product-review-routes.d.ts +3 -0
  24. package/dist/api/routes/product-review-routes.js +129 -0
  25. package/dist/api/routes/product-review-routes.js.map +1 -0
  26. package/dist/index.d.ts +12 -0
  27. package/dist/index.js +36 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/migrations/1683131541071-ProductReview.d.ts +5 -0
  30. package/dist/migrations/1683131541071-ProductReview.js +32 -0
  31. package/dist/migrations/1683131541071-ProductReview.js.map +1 -0
  32. package/dist/migrations/1683131541072-ProductReviewImage.d.ts +5 -0
  33. package/dist/migrations/1683131541072-ProductReviewImage.js +41 -0
  34. package/dist/migrations/1683131541072-ProductReviewImage.js.map +1 -0
  35. package/dist/migrations/1683131541073-ProductReviewRequest.d.ts +5 -0
  36. package/dist/migrations/1683131541073-ProductReviewRequest.js +29 -0
  37. package/dist/migrations/1683131541073-ProductReviewRequest.js.map +1 -0
  38. package/dist/models/index.d.ts +2 -0
  39. package/dist/models/index.js +19 -0
  40. package/dist/models/index.js.map +1 -0
  41. package/dist/models/product-review-request.d.ts +6 -0
  42. package/dist/models/product-review-request.js +42 -0
  43. package/dist/models/product-review-request.js.map +1 -0
  44. package/dist/models/product-review.d.ts +12 -0
  45. package/dist/models/product-review.js +82 -0
  46. package/dist/models/product-review.js.map +1 -0
  47. package/dist/module.d.ts +22 -0
  48. package/dist/module.js +38 -0
  49. package/dist/module.js.map +1 -0
  50. package/dist/plugin.d.ts +16 -0
  51. package/dist/plugin.js +27 -0
  52. package/dist/plugin.js.map +1 -0
  53. package/dist/repositories/index.d.ts +2 -0
  54. package/dist/repositories/index.js +11 -0
  55. package/dist/repositories/index.js.map +1 -0
  56. package/dist/repositories/product-review-request.d.ts +2 -0
  57. package/dist/repositories/product-review-request.js +7 -0
  58. package/dist/repositories/product-review-request.js.map +1 -0
  59. package/dist/repositories/product-review.d.ts +2 -0
  60. package/dist/repositories/product-review.js +7 -0
  61. package/dist/repositories/product-review.js.map +1 -0
  62. package/dist/services/index.d.ts +6 -0
  63. package/dist/services/index.js +17 -0
  64. package/dist/services/index.js.map +1 -0
  65. package/dist/services/product-review-image.d.ts +19 -0
  66. package/dist/services/product-review-image.js +55 -0
  67. package/dist/services/product-review-image.js.map +1 -0
  68. package/dist/services/product-review-request.d.ts +31 -0
  69. package/dist/services/product-review-request.js +59 -0
  70. package/dist/services/product-review-request.js.map +1 -0
  71. package/dist/services/product-review.d.ts +43 -0
  72. package/dist/services/product-review.js +149 -0
  73. package/dist/services/product-review.js.map +1 -0
  74. package/dist/types/file.d.ts +22 -0
  75. package/dist/types/file.js +19 -0
  76. package/dist/types/file.js.map +1 -0
  77. package/dist/types/product-review.d.ts +24 -0
  78. package/dist/types/product-review.js +3 -0
  79. package/dist/types/product-review.js.map +1 -0
  80. package/dist/validators/index.d.ts +1 -0
  81. package/dist/validators/index.js +18 -0
  82. package/dist/validators/index.js.map +1 -0
  83. package/dist/validators/product-review.validator.d.ts +42 -0
  84. package/dist/validators/product-review.validator.js +186 -0
  85. package/dist/validators/product-review.validator.js.map +1 -0
  86. package/package.json +65 -0
package/README.md ADDED
@@ -0,0 +1,64 @@
1
+ # Medusa Plugin Product Reviews
2
+
3
+ A plugin that enables customer product reviews for Medusa v2.13+.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ yarn add @leonardozhe/medusa-plugin-product-reviews
9
+ ```
10
+
11
+ ## Configuration
12
+
13
+ Add to your `medusa.config.js`:
14
+
15
+ ```javascript
16
+ module.exports = {
17
+ plugins: [
18
+ {
19
+ resolve: "@leonardozhe/medusa-plugin-product-reviews",
20
+ options: {
21
+ auto_approve: false,
22
+ max_images: 5
23
+ }
24
+ }
25
+ ],
26
+ admin: {
27
+ extensions: [
28
+ {
29
+ resolve: "@leonardozhe/medusa-plugin-product-reviews/admin"
30
+ }
31
+ ]
32
+ }
33
+ }
34
+ ```
35
+
36
+ Run migrations:
37
+
38
+ ```bash
39
+ yarn medusa migrations run
40
+ ```
41
+
42
+ ## API Routes
43
+
44
+ ### Admin
45
+ - `GET /admin/product-reviews` - List all reviews
46
+ - `DELETE /admin/product-reviews/:id` - Delete a review
47
+ - `GET /admin/product-review-requests` - List review requests
48
+
49
+ ### Store
50
+ - `GET /store/product-reviews` - List product reviews (public)
51
+ - `POST /store/product-reviews` - Create a review
52
+ - `POST /store/product-review-image-upload` - Upload review image
53
+
54
+ ## License
55
+
56
+ MIT
57
+
58
+ ## Repository
59
+
60
+ https://github.com/leonardozhe/medusa-plugin-product-reviews
61
+
62
+ ---
63
+
64
+ Original author: Lambda Curry
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Product Reviews Admin Extension
3
+ *
4
+ * Provides admin UI components for managing product reviews.
5
+ * Compatible with Medusa v2 Admin SDK.
6
+ *
7
+ * @author Lambda Curry <team@lambdacurry.dev>
8
+ * @author Modified for Medusa 2.13 compatibility by leonardozhe
9
+ */
10
+ declare const _default: {
11
+ id: string;
12
+ label: string;
13
+ widgets: {
14
+ "product.details.after": {
15
+ component: () => Promise<typeof import("./widgets").ProductReviewsWidget>;
16
+ };
17
+ };
18
+ routes: {
19
+ path: string;
20
+ component: () => Promise<any>;
21
+ }[];
22
+ menuItems: {
23
+ label: string;
24
+ path: string;
25
+ icon: string;
26
+ }[];
27
+ };
28
+ export default _default;
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ /**
37
+ * Product Reviews Admin Extension
38
+ *
39
+ * Provides admin UI components for managing product reviews.
40
+ * Compatible with Medusa v2 Admin SDK.
41
+ *
42
+ * @author Lambda Curry <team@lambdacurry.dev>
43
+ * @author Modified for Medusa 2.13 compatibility by leonardozhe
44
+ */
45
+ exports.default = {
46
+ id: "product-reviews-admin",
47
+ label: "Product Reviews",
48
+ // Widget definitions for product details page
49
+ widgets: {
50
+ "product.details.after": {
51
+ component: () => Promise.resolve().then(() => __importStar(require("./widgets"))).then(m => m.ProductReviewsWidget)
52
+ }
53
+ },
54
+ // Custom routes
55
+ routes: [
56
+ {
57
+ path: "/reviews",
58
+ component: () => Promise.resolve().then(() => __importStar(require("./routes"))).then(m => m.ProductReviewsPage)
59
+ },
60
+ {
61
+ path: "/review-requests",
62
+ component: () => Promise.resolve().then(() => __importStar(require("./routes"))).then(m => m.ProductReviewRequestsPage)
63
+ }
64
+ ],
65
+ // Menu items
66
+ menuItems: [
67
+ {
68
+ label: "Product Reviews",
69
+ path: "/reviews",
70
+ icon: "star"
71
+ },
72
+ {
73
+ label: "Review Requests",
74
+ path: "/review-requests",
75
+ icon: "envelope"
76
+ }
77
+ ]
78
+ };
79
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/admin/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;GAQG;AACH,kBAAe;IACb,EAAE,EAAE,uBAAuB;IAC3B,KAAK,EAAE,iBAAiB;IAExB,8CAA8C;IAC9C,OAAO,EAAE;QACP,uBAAuB,EAAE;YACvB,SAAS,EAAE,GAAG,EAAE,CAAC,kDAAO,WAAW,IAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,oBAAoB,CAAC;SACvE;KACF;IAED,gBAAgB;IAChB,MAAM,EAAE;QACN;YACE,IAAI,EAAE,UAAU;YAChB,SAAS,EAAE,GAAG,EAAE,CAAC,kDAAO,UAAU,IAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,kBAAkB,CAAC;SACpE;QACD;YACE,IAAI,EAAE,kBAAkB;YACxB,SAAS,EAAE,GAAG,EAAE,CAAC,kDAAO,UAAU,IAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,yBAAyB,CAAC;SAC3E;KACF;IAED,aAAa;IACb,SAAS,EAAE;QACT;YACE,KAAK,EAAE,iBAAiB;YACxB,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,MAAM;SACb;QACD;YACE,KAAK,EAAE,iBAAiB;YACxB,IAAI,EAAE,kBAAkB;YACxB,IAAI,EAAE,UAAU;SACjB;KACF;CACF,CAAA"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Product Reviews Admin Menu Items
3
+ *
4
+ * Menu configuration for the admin sidebar.
5
+ *
6
+ * @author Lambda Curry <team@lambdacurry.dev>
7
+ * @author Modified for Medusa 2.13 compatibility by leonardozhe
8
+ */
9
+ export declare const productReviewsMenuItems: {
10
+ label: string;
11
+ icon: string;
12
+ path: string;
13
+ permissions: string[];
14
+ }[];
15
+ export declare const productReviewRequestsMenuItems: {
16
+ label: string;
17
+ icon: string;
18
+ path: string;
19
+ permissions: string[];
20
+ }[];
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ /**
3
+ * Product Reviews Admin Menu Items
4
+ *
5
+ * Menu configuration for the admin sidebar.
6
+ *
7
+ * @author Lambda Curry <team@lambdacurry.dev>
8
+ * @author Modified for Medusa 2.13 compatibility by leonardozhe
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.productReviewRequestsMenuItems = exports.productReviewsMenuItems = void 0;
12
+ exports.productReviewsMenuItems = [
13
+ {
14
+ label: "Product Reviews",
15
+ icon: "star",
16
+ path: "/reviews",
17
+ permissions: ["product_reviews.view"]
18
+ }
19
+ ];
20
+ exports.productReviewRequestsMenuItems = [
21
+ {
22
+ label: "Review Requests",
23
+ icon: "envelope",
24
+ path: "/review-requests",
25
+ permissions: ["product_review_requests.view"]
26
+ }
27
+ ];
28
+ //# sourceMappingURL=menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menu.js","sourceRoot":"","sources":["../../src/admin/menu.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;AAEU,QAAA,uBAAuB,GAAG;IACrC;QACE,KAAK,EAAE,iBAAiB;QACxB,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,CAAC,sBAAsB,CAAC;KACtC;CACF,CAAA;AAEY,QAAA,8BAA8B,GAAG;IAC5C;QACE,KAAK,EAAE,iBAAiB;QACxB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,kBAAkB;QACxB,WAAW,EAAE,CAAC,8BAA8B,CAAC;KAC9C;CACF,CAAA"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Product Reviews Route
3
+ *
4
+ * Main route for viewing and managing product reviews.
5
+ *
6
+ * @author Lambda Curry <team@lambdacurry.dev>
7
+ * @author Modified for Medusa 2.13 compatibility by leonardozhe
8
+ */
9
+ export declare const productReviewsRoute: {
10
+ path: string;
11
+ label: string;
12
+ icon: string;
13
+ component: () => any;
14
+ children: {
15
+ path: string;
16
+ component: () => any;
17
+ }[];
18
+ };
19
+ /**
20
+ * Product Review Requests Route
21
+ *
22
+ * Route for viewing and managing review requests.
23
+ *
24
+ * @author Lambda Curry <team@lambdacurry.dev>
25
+ * @author Modified for Medusa 2.13 compatibility by leonardozhe
26
+ */
27
+ export declare const productReviewRequestsRoute: {
28
+ path: string;
29
+ label: string;
30
+ icon: string;
31
+ component: () => any;
32
+ };
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.productReviewRequestsRoute = exports.productReviewsRoute = void 0;
7
+ const jsx_runtime_1 = require("react/jsx-runtime");
8
+ const ui_1 = require("@medusajs/ui");
9
+ const react_query_1 = require("@tanstack/react-query");
10
+ const react_1 = __importDefault(require("react"));
11
+ /**
12
+ * Product Reviews Route
13
+ *
14
+ * Main route for viewing and managing product reviews.
15
+ *
16
+ * @author Lambda Curry <team@lambdacurry.dev>
17
+ * @author Modified for Medusa 2.13 compatibility by leonardozhe
18
+ */
19
+ exports.productReviewsRoute = {
20
+ path: "/reviews",
21
+ label: "Reviews",
22
+ icon: "star",
23
+ component: () => (0, jsx_runtime_1.jsx)(ProductReviewsPage, {}),
24
+ children: [
25
+ {
26
+ path: "/reviews/:id",
27
+ component: () => (0, jsx_runtime_1.jsx)(ProductReviewDetailPage, {})
28
+ }
29
+ ]
30
+ };
31
+ function ProductReviewsPage() {
32
+ const { data: reviews, isLoading, refetch } = (0, react_query_1.useQuery)({
33
+ queryKey: ["all-product-reviews"],
34
+ queryFn: async () => {
35
+ const response = await fetch("/admin/product-reviews", {
36
+ headers: {
37
+ "Content-Type": "application/json"
38
+ }
39
+ });
40
+ return response.json();
41
+ }
42
+ });
43
+ const deleteMutation = (0, react_query_1.useMutation)({
44
+ mutationFn: async (reviewId) => {
45
+ const response = await fetch(`/admin/product-reviews/${reviewId}`, {
46
+ method: "DELETE",
47
+ headers: {
48
+ "Content-Type": "application/json"
49
+ }
50
+ });
51
+ return response.json();
52
+ },
53
+ onSuccess: () => {
54
+ ui_1.toast.success("Review deleted successfully");
55
+ refetch();
56
+ },
57
+ onError: () => {
58
+ ui_1.toast.error("Failed to delete review");
59
+ }
60
+ });
61
+ const handleDelete = (reviewId) => {
62
+ if (confirm("Are you sure you want to delete this review?")) {
63
+ deleteMutation.mutate(reviewId);
64
+ }
65
+ };
66
+ if (isLoading) {
67
+ return (0, jsx_runtime_1.jsx)("div", { className: "text-center py-8", children: "Loading reviews..." });
68
+ }
69
+ return ((0, jsx_runtime_1.jsxs)(ui_1.Container, { children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center justify-between mb-6", children: [(0, jsx_runtime_1.jsx)(ui_1.Heading, { level: "h2", children: "Product Reviews" }), (0, jsx_runtime_1.jsx)(ui_1.Button, { onClick: () => refetch(), children: "Refresh" })] }), reviews?.length > 0 ? ((0, jsx_runtime_1.jsx)("div", { className: "border rounded-lg overflow-hidden", children: (0, jsx_runtime_1.jsxs)("table", { className: "w-full", children: [(0, jsx_runtime_1.jsx)("thead", { className: "bg-gray-50", children: (0, jsx_runtime_1.jsxs)("tr", { children: [(0, jsx_runtime_1.jsx)("th", { className: "px-4 py-3 text-left", children: "Product" }), (0, jsx_runtime_1.jsx)("th", { className: "px-4 py-3 text-left", children: "Title" }), (0, jsx_runtime_1.jsx)("th", { className: "px-4 py-3 text-left", children: "Rating" }), (0, jsx_runtime_1.jsx)("th", { className: "px-4 py-3 text-left", children: "Status" }), (0, jsx_runtime_1.jsx)("th", { className: "px-4 py-3 text-left", children: "Date" }), (0, jsx_runtime_1.jsx)("th", { className: "px-4 py-3 text-right", children: "Actions" })] }) }), (0, jsx_runtime_1.jsx)("tbody", { children: reviews.map((review) => ((0, jsx_runtime_1.jsxs)("tr", { className: "border-t hover:bg-gray-50", children: [(0, jsx_runtime_1.jsx)("td", { className: "px-4 py-3", children: review.product?.title || "Unknown" }), (0, jsx_runtime_1.jsx)("td", { className: "px-4 py-3", children: review.title }), (0, jsx_runtime_1.jsxs)("td", { className: "px-4 py-3", children: [review.rating, "/5"] }), (0, jsx_runtime_1.jsx)("td", { className: "px-4 py-3", children: (0, jsx_runtime_1.jsx)("span", { className: `inline-block px-2 py-1 rounded text-xs ${review.status === "approved"
70
+ ? "bg-green-100 text-green-800"
71
+ : review.status === "rejected"
72
+ ? "bg-red-100 text-red-800"
73
+ : "bg-yellow-100 text-yellow-800"}`, children: review.status }) }), (0, jsx_runtime_1.jsx)("td", { className: "px-4 py-3", children: review.created_at
74
+ ? new Date(review.created_at).toLocaleDateString()
75
+ : "N/A" }), (0, jsx_runtime_1.jsx)("td", { className: "px-4 py-3 text-right", children: (0, jsx_runtime_1.jsx)(ui_1.Button, { variant: "danger", size: "small", onClick: () => handleDelete(review.id), children: "Delete" }) })] }, review.id))) })] }) })) : ((0, jsx_runtime_1.jsx)("div", { className: "text-center py-12", children: (0, jsx_runtime_1.jsx)("p", { className: "text-gray-500", children: "No reviews found." }) }))] }));
76
+ }
77
+ function ProductReviewDetailPage() {
78
+ // Implementation for detail view
79
+ return ((0, jsx_runtime_1.jsx)(ui_1.Container, { children: (0, jsx_runtime_1.jsx)(ui_1.Heading, { level: "h2", children: "Review Details" }) }));
80
+ }
81
+ /**
82
+ * Product Review Requests Route
83
+ *
84
+ * Route for viewing and managing review requests.
85
+ *
86
+ * @author Lambda Curry <team@lambdacurry.dev>
87
+ * @author Modified for Medusa 2.13 compatibility by leonardozhe
88
+ */
89
+ exports.productReviewRequestsRoute = {
90
+ path: "/review-requests",
91
+ label: "Review Requests",
92
+ icon: "envelope",
93
+ component: () => (0, jsx_runtime_1.jsx)(ProductReviewRequestsPage, {})
94
+ };
95
+ function ProductReviewRequestsPage() {
96
+ const { data: requests, isLoading } = (0, react_query_1.useQuery)({
97
+ queryKey: ["product-review-requests"],
98
+ queryFn: async () => {
99
+ const response = await fetch("/admin/product-review-requests", {
100
+ headers: {
101
+ "Content-Type": "application/json"
102
+ }
103
+ });
104
+ return response.json();
105
+ }
106
+ });
107
+ if (isLoading) {
108
+ return (0, jsx_runtime_1.jsx)("div", { className: "text-center py-8", children: "Loading requests..." });
109
+ }
110
+ return ((0, jsx_runtime_1.jsxs)(ui_1.Container, { children: [(0, jsx_runtime_1.jsx)(ui_1.Heading, { level: "h2", className: "mb-6", children: "Review Requests" }), requests?.length > 0 ? ((0, jsx_runtime_1.jsx)("div", { className: "border rounded-lg overflow-hidden", children: (0, jsx_runtime_1.jsxs)("table", { className: "w-full", children: [(0, jsx_runtime_1.jsx)("thead", { className: "bg-gray-50", children: (0, jsx_runtime_1.jsxs)("tr", { children: [(0, jsx_runtime_1.jsx)("th", { className: "px-4 py-3 text-left", children: "Product" }), (0, jsx_runtime_1.jsx)("th", { className: "px-4 py-3 text-left", children: "Customer Email" }), (0, jsx_runtime_1.jsx)("th", { className: "px-4 py-3 text-left", children: "Status" }), (0, jsx_runtime_1.jsx)("th", { className: "px-4 py-3 text-left", children: "Date" })] }) }), (0, jsx_runtime_1.jsx)("tbody", { children: requests.map((request) => ((0, jsx_runtime_1.jsxs)("tr", { className: "border-t hover:bg-gray-50", children: [(0, jsx_runtime_1.jsx)("td", { className: "px-4 py-3", children: request.product?.title || "Unknown" }), (0, jsx_runtime_1.jsx)("td", { className: "px-4 py-3", children: request.customer_email }), (0, jsx_runtime_1.jsx)("td", { className: "px-4 py-3", children: (0, jsx_runtime_1.jsx)("span", { className: `inline-block px-2 py-1 rounded text-xs ${request.status === "completed"
111
+ ? "bg-green-100 text-green-800"
112
+ : "bg-yellow-100 text-yellow-800"}`, children: request.status }) }), (0, jsx_runtime_1.jsx)("td", { className: "px-4 py-3", children: request.created_at
113
+ ? new Date(request.created_at).toLocaleDateString()
114
+ : "N/A" })] }, request.id))) })] }) })) : ((0, jsx_runtime_1.jsx)("div", { className: "text-center py-12", children: (0, jsx_runtime_1.jsx)("p", { className: "text-gray-500", children: "No review requests found." }) }))] }));
115
+ }
116
+ //# sourceMappingURL=routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/admin/routes.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import { type DetailWidgetProps } from "@medusajs/framework/types";
2
+ /**
3
+ * Product Reviews Widget
4
+ *
5
+ * Displays product reviews summary on the product details page.
6
+ *
7
+ * @author Lambda Curry <team@lambdacurry.dev>
8
+ * @author Modified for Medusa 2.13 compatibility by leonardozhe
9
+ */
10
+ export declare function ProductReviewsWidget({ data, notify }: DetailWidgetProps): any;
11
+ /**
12
+ * Product Review Requests Widget
13
+ *
14
+ * Displays review request status for the product.
15
+ *
16
+ * @author Lambda Curry <team@lambdacurry.dev>
17
+ * @author Modified for Medusa 2.13 compatibility by leonardozhe
18
+ */
19
+ export declare function ProductReviewRequestsWidget({ data, notify }: DetailWidgetProps): any;
20
+ /**
21
+ * Product Reviews List Component
22
+ *
23
+ * Displays a list of product reviews.
24
+ */
25
+ export declare function ProductReviewsList({ productId }: {
26
+ productId: string;
27
+ }): any;
28
+ /**
29
+ * Product Review Details Component
30
+ *
31
+ * Displays details of a single review.
32
+ */
33
+ export declare function ProductReviewDetails({ reviewId }: {
34
+ reviewId: string;
35
+ }): any;
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ProductReviewsWidget = ProductReviewsWidget;
7
+ exports.ProductReviewRequestsWidget = ProductReviewRequestsWidget;
8
+ exports.ProductReviewsList = ProductReviewsList;
9
+ exports.ProductReviewDetails = ProductReviewDetails;
10
+ const jsx_runtime_1 = require("react/jsx-runtime");
11
+ const ui_1 = require("@medusajs/ui");
12
+ const react_query_1 = require("@tanstack/react-query");
13
+ const icons_1 = require("@medusajs/icons");
14
+ const react_1 = __importDefault(require("react"));
15
+ /**
16
+ * Product Reviews Widget
17
+ *
18
+ * Displays product reviews summary on the product details page.
19
+ *
20
+ * @author Lambda Curry <team@lambdacurry.dev>
21
+ * @author Modified for Medusa 2.13 compatibility by leonardozhe
22
+ */
23
+ function ProductReviewsWidget({ data, notify }) {
24
+ const productId = data?.id;
25
+ const { data: reviews, isLoading } = (0, react_query_1.useQuery)({
26
+ queryKey: ["product-reviews", productId],
27
+ queryFn: async () => {
28
+ // Fetch reviews for this product
29
+ const response = await fetch(`/admin/product-reviews?product_id=${productId}`, {
30
+ headers: {
31
+ "Content-Type": "application/json"
32
+ }
33
+ });
34
+ return response.json();
35
+ },
36
+ enabled: !!productId
37
+ });
38
+ if (isLoading) {
39
+ return (0, jsx_runtime_1.jsx)("div", { className: "text-center py-4", children: "Loading reviews..." });
40
+ }
41
+ const reviewCount = reviews?.count || 0;
42
+ const averageRating = reviews?.average_rating || 0;
43
+ return ((0, jsx_runtime_1.jsxs)(ui_1.Container, { children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center justify-between mb-2", children: [(0, jsx_runtime_1.jsx)(ui_1.Heading, { level: "h4", children: "Product Reviews" }), (0, jsx_runtime_1.jsxs)(ui_1.Badge, { color: "blue", children: [reviewCount, " reviews"] })] }), reviewCount > 0 ? ((0, jsx_runtime_1.jsxs)("div", { className: "space-y-4", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-2", children: [(0, jsx_runtime_1.jsx)(ui_1.Text, { className: "text-lg font-semibold", children: averageRating.toFixed(1) }), (0, jsx_runtime_1.jsx)("div", { className: "flex", children: [1, 2, 3, 4, 5].map((star) => ((0, jsx_runtime_1.jsx)(icons_1.Star, { className: `h-5 w-5 ${star <= Math.round(averageRating)
44
+ ? "text-orange-400"
45
+ : "text-gray-200"}`, filled: star <= Math.round(averageRating) }, star))) })] }), (0, jsx_runtime_1.jsx)(ui_1.Text, { size: "small", className: "text-gray-500", children: "Average rating based on customer feedback" })] })) : ((0, jsx_runtime_1.jsx)(ui_1.Text, { size: "small", className: "text-gray-500", children: "No reviews yet. Encourage customers to leave reviews!" }))] }));
46
+ }
47
+ /**
48
+ * Product Review Requests Widget
49
+ *
50
+ * Displays review request status for the product.
51
+ *
52
+ * @author Lambda Curry <team@lambdacurry.dev>
53
+ * @author Modified for Medusa 2.13 compatibility by leonardozhe
54
+ */
55
+ function ProductReviewRequestsWidget({ data, notify }) {
56
+ const productId = data?.id;
57
+ const { data: requests, isLoading } = (0, react_query_1.useQuery)({
58
+ queryKey: ["product-review-requests", productId],
59
+ queryFn: async () => {
60
+ const response = await fetch(`/admin/product-review-requests?product_id=${productId}`, {
61
+ headers: {
62
+ "Content-Type": "application/json"
63
+ }
64
+ });
65
+ return response.json();
66
+ },
67
+ enabled: !!productId
68
+ });
69
+ if (isLoading) {
70
+ return (0, jsx_runtime_1.jsx)("div", { className: "text-center py-4", children: "Loading requests..." });
71
+ }
72
+ const pendingCount = requests?.filter((r) => r.status === "pending")?.length || 0;
73
+ return ((0, jsx_runtime_1.jsxs)(ui_1.Container, { children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center justify-between mb-2", children: [(0, jsx_runtime_1.jsx)(ui_1.Heading, { level: "h4", children: "Review Requests" }), pendingCount > 0 && ((0, jsx_runtime_1.jsxs)(ui_1.Badge, { color: "orange", children: [pendingCount, " pending"] }))] }), (0, jsx_runtime_1.jsxs)(ui_1.Text, { size: "small", className: "text-gray-500", children: [requests?.length || 0, " review requests sent for this product"] })] }));
74
+ }
75
+ /**
76
+ * Product Reviews List Component
77
+ *
78
+ * Displays a list of product reviews.
79
+ */
80
+ function ProductReviewsList({ productId }) {
81
+ const { data: reviews, isLoading } = (0, react_query_1.useQuery)({
82
+ queryKey: ["product-reviews-list", productId],
83
+ queryFn: async () => {
84
+ const response = await fetch(`/admin/product-reviews?product_id=${productId}`, {
85
+ headers: {
86
+ "Content-Type": "application/json"
87
+ }
88
+ });
89
+ return response.json();
90
+ }
91
+ });
92
+ if (isLoading) {
93
+ return (0, jsx_runtime_1.jsx)("div", { className: "text-center py-8", children: "Loading..." });
94
+ }
95
+ return ((0, jsx_runtime_1.jsxs)(ui_1.Container, { children: [(0, jsx_runtime_1.jsx)(ui_1.Heading, { level: "h3", className: "mb-4", children: "Product Reviews" }), reviews?.reviews?.length > 0 ? ((0, jsx_runtime_1.jsx)("div", { className: "space-y-4", children: reviews.reviews.map((review) => ((0, jsx_runtime_1.jsxs)("div", { className: "border rounded-lg p-4", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-2 mb-2", children: [(0, jsx_runtime_1.jsx)(ui_1.Text, { className: "font-semibold", children: review.title }), (0, jsx_runtime_1.jsx)("div", { className: "flex", children: [1, 2, 3, 4, 5].map((star) => ((0, jsx_runtime_1.jsx)(icons_1.Star, { className: `h-4 w-4 ${star <= review.rating ? "text-orange-400" : "text-gray-200"}`, filled: star <= review.rating }, star))) })] }), (0, jsx_runtime_1.jsx)(ui_1.Text, { size: "small", children: review.content }), review.created_at && ((0, jsx_runtime_1.jsx)(ui_1.Text, { size: "x-small", className: "text-gray-500 mt-2", children: new Date(review.created_at).toLocaleDateString() }))] }, review.id))) })) : ((0, jsx_runtime_1.jsx)(ui_1.Text, { children: "No reviews found." }))] }));
96
+ }
97
+ /**
98
+ * Product Review Details Component
99
+ *
100
+ * Displays details of a single review.
101
+ */
102
+ function ProductReviewDetails({ reviewId }) {
103
+ const { data: review, isLoading } = (0, react_query_1.useQuery)({
104
+ queryKey: ["product-review-detail", reviewId],
105
+ queryFn: async () => {
106
+ const response = await fetch(`/admin/product-reviews/${reviewId}`, {
107
+ headers: {
108
+ "Content-Type": "application/json"
109
+ }
110
+ });
111
+ return response.json();
112
+ }
113
+ });
114
+ if (isLoading) {
115
+ return (0, jsx_runtime_1.jsx)("div", { className: "text-center py-8", children: "Loading..." });
116
+ }
117
+ return ((0, jsx_runtime_1.jsxs)(ui_1.Container, { children: [(0, jsx_runtime_1.jsx)(ui_1.Heading, { level: "h3", className: "mb-4", children: "Review Details" }), review && ((0, jsx_runtime_1.jsxs)("div", { className: "space-y-4", children: [(0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(ui_1.Heading, { level: "h4", children: review.title }), (0, jsx_runtime_1.jsx)("div", { className: "flex mt-2", children: [1, 2, 3, 4, 5].map((star) => ((0, jsx_runtime_1.jsx)(icons_1.Star, { className: `h-5 w-5 ${star <= review.rating ? "text-orange-400" : "text-gray-200"}`, filled: star <= review.rating }, star))) })] }), (0, jsx_runtime_1.jsx)(ui_1.Text, { children: review.content }), review.images && review.images.length > 0 && ((0, jsx_runtime_1.jsx)("div", { className: "grid grid-cols-3 gap-2", children: review.images.map((image, index) => ((0, jsx_runtime_1.jsx)("img", { src: image.url, alt: `Review image ${index + 1}`, className: "w-full h-24 object-cover rounded" }, index))) }))] }))] }));
118
+ }
119
+ //# sourceMappingURL=widgets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"widgets.js","sourceRoot":"","sources":["../../src/admin/widgets.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { Router } from "express";
2
+ export type RouteMethod = "all" | "get" | "post" | "put" | "delete" | "patch" | "options" | "head";
3
+ export interface RouteConfig {
4
+ path: string;
5
+ method: RouteMethod;
6
+ handlers: any[];
7
+ requiredAuth: boolean;
8
+ }
9
+ export declare const createRoute: (router: Router, route: RouteConfig) => void;
10
+ export default function (rootDirectory: string): import("express-serve-static-core").Router;
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createRoute = void 0;
7
+ exports.default = default_1;
8
+ const error_handler_1 = __importDefault(require("@medusajs/medusa/dist/api/middlewares/error-handler"));
9
+ const body_parser_1 = __importDefault(require("body-parser"));
10
+ const cors_1 = __importDefault(require("cors"));
11
+ const express_1 = require("express");
12
+ const medusa_core_utils_1 = require("medusa-core-utils");
13
+ const medusa_1 = require("@medusajs/medusa");
14
+ const product_review_routes_1 = require("./routes/product-review-routes");
15
+ const product_review_request_routes_1 = require("./routes/product-review-request-routes");
16
+ const product_review_image_upload_routes_1 = require("./routes/product-review-image-upload-routes");
17
+ const routes = [...product_review_image_upload_routes_1.routes, ...product_review_routes_1.routes, ...product_review_request_routes_1.routes];
18
+ const createRoute = (router, route) => {
19
+ try {
20
+ if (route.path.startsWith("/admin"))
21
+ return createAdminRoute(router, route);
22
+ if (route.path.startsWith("/store"))
23
+ return createStoreRoute(router, route);
24
+ }
25
+ catch (error) {
26
+ console.error(error, route);
27
+ }
28
+ };
29
+ exports.createRoute = createRoute;
30
+ const createAdminRoute = (router, route) => {
31
+ const { method, path, handlers, requiredAuth } = route;
32
+ const defaultAdminMiddleware = [requiredAuth ? (0, medusa_1.authenticate)() : null].filter((a) => a !== null);
33
+ router[method](path, ...defaultAdminMiddleware, ...handlers);
34
+ };
35
+ const createStoreRoute = (router, route) => {
36
+ const { method, path, handlers, requiredAuth } = route;
37
+ const defaultMiddleware = [requiredAuth ? (0, medusa_1.authenticateCustomer)() : null].filter((a) => a);
38
+ router[method](path, ...defaultMiddleware, ...handlers);
39
+ };
40
+ function default_1(rootDirectory) {
41
+ const router = (0, express_1.Router)();
42
+ router.use(body_parser_1.default.json());
43
+ router.use((req, res, next) => {
44
+ const config = req.scope.resolve("configModule");
45
+ const adminCors = (0, cors_1.default)({
46
+ origin: (0, medusa_core_utils_1.parseCorsOrigins)(config.projectConfig.admin_cors || ""),
47
+ credentials: true,
48
+ });
49
+ const storeCors = (0, cors_1.default)({
50
+ origin: (0, medusa_core_utils_1.parseCorsOrigins)(config.projectConfig.store_cors || ""),
51
+ credentials: true,
52
+ });
53
+ if (req.path.startsWith("/admin"))
54
+ return adminCors(req, res, next);
55
+ if (req.path.startsWith("/store"))
56
+ return storeCors(req, res, next);
57
+ return next();
58
+ });
59
+ for (const route of routes)
60
+ (0, exports.createRoute)(router, route);
61
+ router.use((0, error_handler_1.default)());
62
+ return router;
63
+ }
64
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"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"}