| Server IP : 35.80.110.71 / Your IP : 216.73.216.221 Web Server : Apache/2.4.58 (Ubuntu) System : Linux ip-172-31-21-44 6.17.0-1019-aws #19~24.04.1-Ubuntu SMP Tue Jun 23 18:53:06 UTC 2026 x86_64 User : ubuntu ( 1000) PHP Version : 8.3.31 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : OFF Directory : /var/www/elite-events-storybook/ |
Upload File : |
"use strict";(self.webpackChunkelite_events_nextjs=self.webpackChunkelite_events_nextjs||[]).push([[9821],{"./src/components/features/product/Reviews/ReviewCard.tsx":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{__webpack_require__.d(__webpack_exports__,{v:()=>ReviewCard,w:()=>ReviewCardSkeleton});var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__("./node_modules/next/dist/compiled/react/jsx-runtime.js"),next_image__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__("./node_modules/@storybook/nextjs/dist/images/next-image.js"),_barrel_optimize_names_formatDistanceToNow_date_fns__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__("./node_modules/date-fns/formatDistanceToNow.js"),_components_ui_StarRating__WEBPACK_IMPORTED_MODULE_3__=__webpack_require__("./src/components/ui/StarRating/index.tsx"),_components_ui_Button__WEBPACK_IMPORTED_MODULE_4__=__webpack_require__("./src/components/ui/Button/index.tsx"),_components_ui_icons__WEBPACK_IMPORTED_MODULE_5__=__webpack_require__("./src/components/ui/icons/index.ts"),_lib_core__WEBPACK_IMPORTED_MODULE_6__=__webpack_require__("./src/lib/core/index.ts");function ReviewCard({review,onHelpful,userVote,isLoading=!1,showActions=!0,className}){const createdAt="string"==typeof review.createdAt?new Date(review.createdAt):review.createdAt,handleHelpfulClick=helpful=>{onHelpful&&!isLoading&&onHelpful(review.id,helpful)},userInitial=review.user.name?.[0]?.toUpperCase()||"U";return(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("div",{className:(0,_lib_core__WEBPACK_IMPORTED_MODULE_6__.cn)("border-b border-gray-200 pb-6 last:border-b-0",className),children:(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div",{className:"flex items-start gap-4",children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("div",{className:"w-10 h-10 rounded-full overflow-hidden bg-gray-200 flex-shrink-0",children:review.user.image?(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(next_image__WEBPACK_IMPORTED_MODULE_1__.A,{src:review.user.image,alt:review.user.name||"User",width:40,height:40,className:"w-full h-full object-cover"}):(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("div",{className:"w-full h-full flex items-center justify-center text-gray-500 font-medium",children:userInitial})}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div",{className:"flex items-center gap-2 flex-wrap",children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("span",{className:"font-medium text-gray-900",children:review.user.name||"Anonymous"}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("span",{className:"text-sm text-gray-600 dark:text-gray-400",children:(0,_barrel_optimize_names_formatDistanceToNow_date_fns__WEBPACK_IMPORTED_MODULE_2__.m)(createdAt,{addSuffix:!0})})]}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("div",{className:"mt-1",children:(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ui_StarRating__WEBPACK_IMPORTED_MODULE_3__.Gk,{rating:review.rating,size:"sm",showCount:!1})}),review.comment&&(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("p",{className:"mt-2 text-gray-700 whitespace-pre-wrap",children:review.comment}),showActions&&(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div",{className:"mt-3 flex items-center gap-4",children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("span",{className:"text-sm text-gray-600 dark:text-gray-400",children:"Was this helpful?"}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div",{className:"flex items-center gap-2",children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(_components_ui_Button__WEBPACK_IMPORTED_MODULE_4__.$,{variant:"ghost",size:"sm",onClick:()=>handleHelpfulClick(!0),disabled:isLoading,className:(0,_lib_core__WEBPACK_IMPORTED_MODULE_6__.cn)("flex items-center gap-1 px-2 py-1",!0===userVote&&"text-green-600 bg-green-50"),"aria-label":"Mark as helpful",children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ui_icons__WEBPACK_IMPORTED_MODULE_5__.In,{name:"check",size:14}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("span",{className:"text-xs",children:["Yes (",review.helpfulCount||0,")"]})]}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(_components_ui_Button__WEBPACK_IMPORTED_MODULE_4__.$,{variant:"ghost",size:"sm",onClick:()=>handleHelpfulClick(!1),disabled:isLoading,className:(0,_lib_core__WEBPACK_IMPORTED_MODULE_6__.cn)("flex items-center gap-1 px-2 py-1",!1===userVote&&"text-red-600 bg-red-50"),"aria-label":"Mark as not helpful",children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ui_icons__WEBPACK_IMPORTED_MODULE_5__.In,{name:"close",size:14}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("span",{className:"text-xs",children:["No (",review.notHelpfulCount||0,")"]})]})]})]})]})]})})}function ReviewCardSkeleton(){return(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("div",{className:"border-b border-gray-200 pb-6 animate-pulse",children:(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div",{className:"flex items-start gap-4",children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("div",{className:"w-10 h-10 rounded-full bg-gray-200"}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div",{className:"flex-1",children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div",{className:"flex items-center gap-2",children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("div",{className:"h-4 w-24 bg-gray-200 rounded"}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("div",{className:"h-3 w-16 bg-gray-200 rounded"})]}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("div",{className:"mt-2 h-4 w-20 bg-gray-200 rounded"}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div",{className:"mt-3 space-y-2",children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("div",{className:"h-3 w-full bg-gray-200 rounded"}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("div",{className:"h-3 w-3/4 bg-gray-200 rounded"})]})]})]})})}},"./src/components/features/product/Reviews/ReviewList.tsx":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{__webpack_require__.d(__webpack_exports__,{D:()=>ReviewList,w:()=>ReviewListSkeleton});var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__("./node_modules/next/dist/compiled/react/jsx-runtime.js"),react__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__("./node_modules/next/dist/compiled/react/index.js"),next_auth_react__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__("./node_modules/next-auth/react.js"),_lib_logging_clientLogger__WEBPACK_IMPORTED_MODULE_3__=__webpack_require__("./src/lib/logging/clientLogger.ts"),_components_ui_StarRating__WEBPACK_IMPORTED_MODULE_4__=__webpack_require__("./src/components/ui/StarRating/index.tsx"),_components_ui_icons__WEBPACK_IMPORTED_MODULE_5__=__webpack_require__("./src/components/ui/icons/index.ts"),_components_ui_Button__WEBPACK_IMPORTED_MODULE_6__=__webpack_require__("./src/components/ui/Button/index.tsx"),_ReviewCard__WEBPACK_IMPORTED_MODULE_7__=__webpack_require__("./src/components/features/product/Reviews/ReviewCard.tsx"),_lib_core__WEBPACK_IMPORTED_MODULE_8__=__webpack_require__("./src/lib/core/index.ts");function ReviewList({productId,initialReviews,initialStats,className}){const{data:session}=(0,next_auth_react__WEBPACK_IMPORTED_MODULE_2__.wV)(),[reviews,setReviews]=(0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(initialReviews||[]),[stats,setStats]=(0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(initialStats||null),[loading,setLoading]=(0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(!initialReviews),[page,setPage]=(0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(1),[totalPages,setTotalPages]=(0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(1),[sortBy,setSortBy]=(0,react__WEBPACK_IMPORTED_MODULE_1__.useState)("recent"),[userVotes,setUserVotes]=(0,react__WEBPACK_IMPORTED_MODULE_1__.useState)({}),[votingId,setVotingId]=(0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null),fetchReviews=(0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)(async()=>{try{setLoading(!0);const response=await fetch(`/api/products/${productId}/reviews?page=${page}&limit=10&sortBy=${sortBy}`),data=await response.json();data.success&&(setReviews(data.data.reviews),setStats(data.data.stats),setTotalPages(data.data.pagination.pages))}catch(error){_lib_logging_clientLogger__WEBPACK_IMPORTED_MODULE_3__.q.error("Failed to fetch reviews",error instanceof Error?error:new Error(String(error)),{productId,page,sortBy})}finally{setLoading(!1)}},[productId,page,sortBy]);(0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{(!initialReviews||page>1||"recent"!==sortBy)&&fetchReviews()},[fetchReviews,initialReviews,page,sortBy]);const handleHelpful=async(reviewId,helpful)=>{if(session){setVotingId(reviewId);try{const response=await fetch(`/api/reviews/${reviewId}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"helpful",helpful})}),data=await response.json();data.success&&(setUserVotes(prev=>({...prev,[reviewId]:helpful})),setReviews(prev=>prev.map(r=>r.id===reviewId?{...r,helpfulCount:data.data.helpfulCount,notHelpfulCount:data.data.notHelpfulCount}:r)))}catch(error){_lib_logging_clientLogger__WEBPACK_IMPORTED_MODULE_3__.q.error("Failed to mark review helpful",error instanceof Error?error:new Error(String(error)),{reviewId,helpful})}finally{setVotingId(null)}}};return loading&&!reviews.length?(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(ReviewListSkeleton,{}):stats?.totalReviews?(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div",{className:(0,_lib_core__WEBPACK_IMPORTED_MODULE_8__.cn)("space-y-8 min-h-[600px]",className),children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div",{className:"flex flex-col md:flex-row gap-8 p-6 bg-gray-50 rounded-lg",children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div",{className:"text-center md:text-left",children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("div",{className:"text-5xl font-bold text-gray-900",children:stats.averageRating.toFixed(1)}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("div",{className:"mt-2",children:(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ui_StarRating__WEBPACK_IMPORTED_MODULE_4__.Gk,{rating:stats.averageRating,size:"lg",showCount:!1})}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div",{className:"text-sm text-gray-600 dark:text-gray-400 mt-2",children:["Based on ",stats.totalReviews," review",1!==stats.totalReviews?"s":""]})]}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("div",{className:"flex-1",children:(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(RatingDistribution,{distribution:stats.distribution,totalReviews:stats.totalReviews})})]}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div",{className:"flex justify-between items-center",children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("h3",{className:"font-semibold text-lg",children:"Customer Reviews"}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div",{className:"flex items-center gap-2",children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("label",{htmlFor:"sort-reviews",className:"text-sm text-gray-600 dark:text-gray-400",children:"Sort by:"}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("select",{id:"sort-reviews",value:sortBy,onChange:e=>{return newSort=e.target.value,setSortBy(newSort),void setPage(1);var newSort},className:"border border-gray-300 rounded-md px-3 py-1.5 text-sm focus:outline-none focus:ring-2 focus:ring-blue-500",children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("option",{value:"recent",children:"Most Recent"}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("option",{value:"helpful",children:"Most Helpful"}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("option",{value:"rating_high",children:"Highest Rated"}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("option",{value:"rating_low",children:"Lowest Rated"})]})]})]}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("div",{className:"space-y-6",children:reviews.map(review=>(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_ReviewCard__WEBPACK_IMPORTED_MODULE_7__.v,{review,onHelpful:session?handleHelpful:void 0,userVote:userVotes[review.id],isLoading:votingId===review.id,showActions:!!session},review.id))}),totalPages>1&&(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div",{className:"flex justify-center items-center gap-2 pt-4",children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(_components_ui_Button__WEBPACK_IMPORTED_MODULE_6__.$,{variant:"outline",size:"sm",onClick:()=>setPage(p=>Math.max(1,p-1)),disabled:1===page||loading,children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ui_icons__WEBPACK_IMPORTED_MODULE_5__.In,{name:"chevron-left",size:16}),"Previous"]}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("span",{className:"text-sm text-gray-600 px-4",children:["Page ",page," of ",totalPages]}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(_components_ui_Button__WEBPACK_IMPORTED_MODULE_6__.$,{variant:"outline",size:"sm",onClick:()=>setPage(p=>Math.min(totalPages,p+1)),disabled:page===totalPages||loading,children:["Next",(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ui_icons__WEBPACK_IMPORTED_MODULE_5__.In,{name:"chevron-right",size:16})]})]})]}):(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div",{className:(0,_lib_core__WEBPACK_IMPORTED_MODULE_8__.cn)("text-center py-12",className),children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ui_icons__WEBPACK_IMPORTED_MODULE_5__.In,{name:"star",size:48,className:"text-gray-300 mx-auto mb-4"}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("p",{className:"text-gray-600 dark:text-gray-400 text-lg",children:"No reviews yet"}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("p",{className:"text-gray-500 dark:text-gray-500 text-sm mt-1",children:"Be the first to share your experience with this product!"})]})}function RatingDistribution({distribution,totalReviews}){return(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("div",{className:"space-y-2",children:[5,4,3,2,1].map(rating=>{const count=distribution[rating]||0,percentage=totalReviews>0?count/totalReviews*100:0;return(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div",{className:"flex items-center gap-2",children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("span",{className:"w-3 text-sm text-gray-600",children:rating}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ui_icons__WEBPACK_IMPORTED_MODULE_5__.In,{name:"star",size:14,className:"text-yellow-400"}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("div",{className:"flex-1 h-2 bg-gray-200 rounded-full overflow-hidden",children:(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("div",{className:"h-full bg-yellow-400 rounded-full transition-all duration-300",style:{width:`${percentage}%`}})}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("span",{className:"w-8 text-sm text-gray-600 dark:text-gray-400 text-right",children:count})]},rating)})})}function ReviewListSkeleton(){return(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div",{className:"space-y-8 min-h-[600px] animate-pulse",children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div",{className:"flex flex-col md:flex-row gap-8 p-6 bg-gray-50 rounded-lg",children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div",{className:"text-center md:text-left",children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("div",{className:"h-12 w-20 bg-gray-200 rounded mx-auto md:mx-0"}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("div",{className:"h-5 w-32 bg-gray-200 rounded mt-2 mx-auto md:mx-0"}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("div",{className:"h-4 w-24 bg-gray-200 rounded mt-2 mx-auto md:mx-0"})]}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("div",{className:"flex-1 space-y-2",children:[5,4,3,2,1].map(i=>(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div",{className:"flex items-center gap-2",children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("div",{className:"w-3 h-4 bg-gray-200 rounded"}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("div",{className:"w-4 h-4 bg-gray-200 rounded"}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("div",{className:"flex-1 h-2 bg-gray-200 rounded-full"}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("div",{className:"w-8 h-4 bg-gray-200 rounded"})]},i))})]}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div",{className:"flex justify-between items-center",children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("div",{className:"h-6 w-40 bg-gray-200 rounded"}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("div",{className:"h-8 w-32 bg-gray-200 rounded"})]}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("div",{className:"space-y-6",children:[1,2,3].map(i=>(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_ReviewCard__WEBPACK_IMPORTED_MODULE_7__.w,{},i))})]})}}}]);