PageSourceSearch

https://brandwriter.ai/assets/ShopsReviewPage-D5EAK9mR.js

js brandwriter.ai collected 2026-10-05 14:09:05 UTC 17,523 bytes, 1 lines download raw bytes

1import{u as e,ar as s,b as a,r as t,c8 as l,bJ as i,eK as r,j as n,bN as o,bO as c,B as d,aM as m,bI as h,bP as x,I as u,C as p,f,aZ as g,ah as j,ai as v,aF as w,cc as b,a as y,bA as N,ae as k,ad as S,af as _}from"./index-DMmkt1ET.js";import{S as C,a as E,b as F,c as T,d as M}from"./select-F5q4ZfZ1.js";import{p as L,o as A}from"./shop-review-api-CXtSgXOR.js";import{u as R}from"./user-shop-api-v2UVg0Zy.js";import{a as D,A as B}from"./user-shop-helpers-DSINuLYe.js";import{h as P}from"./useOptionsQueries-38HAIZp1.js";import{R as q}from"./ReviewCard-C7JzssaY.js";import{l as H}from"./lemon8-DTRjQ7J1.js";import{t as I}from"./tiktok-BzjWUQLC.js";import{d as O}from"./dianping-D6TO7rTb.js";import{g as z}from"./social-google-DyWhqNQN.js";import{s as U}from"./subDays-CIjK7ezQ.js";import{E as V}from"./external-link-C53WDwHH.js";import{M as $}from"./message-square-DAIcqiSF.js";import{B as W}from"./bot-DwW-G9u3.js";import{S as G}from"./share-D3z7pP0X.js";import{T as K}from"./trending-up-Cr39topG.js";import{A as J}from"./arrow-left-CvhR_RDz.js";import"./react-icons.esm-CeBdftn8.js";import"./index-jVOyRz7F.js";import"./index-DPmaI-h8.js";import"./index-r8ssOwms.js";import"./currencies-CW_gu8JS.js";import"./youtube-BaBWEOif.js";import"./thumbs-up-DfQVIui5.js";import"./circle-check-big-DHzR5jg9.js";import"./clock-B2NtgCtf.js";import"./thumbs-down-iZrC3jwW.js";function Q(e){return"copy"===e.trim().toLowerCase()}function X(e){const s=e.toLowerCase().trim();return s.includes("dianping")||s.includes("大众点评")?"dianping":s.includes("小红书")||s.includes("xiaohongshu")||s.includes("xhs")||s.includes("rednote")?"xiaohongshu":s.includes("instagram")||s.includes("ins")?"instagram":s.includes("facebook")||s.includes("fb")?"facebook":s.includes("google")?"google":s.includes("threads")?"threads":s.includes("lemon8")?"lemon8":s.includes("tiktok")?"tiktok":s}function Z(e){const s=e.toLowerCase();return s.includes("小红书")||s.includes("xiaohongshu")||s.includes("xhs")||s.includes("rednote")?N:s.includes("instagram")||s.includes("ins")?k:s.includes("facebook")||s.includes("fb")?S:s.includes("google")?z:s.includes("dianping")||s.includes("大众点评")?O:s.includes("threads")?_:s.includes("lemon8")?H:s.includes("tiktok")?I:""}function Y(e,s,a){const t=s??{},l=new Set,i=e.map((e=>{const s=a.find((s=>s.value===e||s.label===e)),i=function(e,s){if(e[s])return[s,e[s]];const a=X(s);return Object.entries(e).find((([e,s])=>X(e)===a||X(s.label)===a))}(t,e);i&&l.add(i[0]);const r=null==i?void 0:i[1];return{key:e,label:(null==r?void 0:r.label)||(null==s?void 0:s.label)||e,icon:(null==r?void 0:r.icon)||(null==s?void 0:s.icon)||Z(e),total:(null==r?void 0:r.total)??0}}));for(const[r,n]of Object.entries(t)){if(Q(r)||l.has(r))continue;i.some((e=>X(e.key)===X(r)||X(e.label)===X(n.label)))||i.push({key:r,label:n.label||r,icon:n.icon||Z(r),total:n.total})}return i}const ee=({title:e,value:s,icon:a,color:t="primary"})=>n.jsx(p,{className:"bg-gray-100 border-0 hover:shadow-md transition-shadow",children:n.jsxs(f,{className:"p-2",children:[n.jsx("div",{className:"flex items-center gap-2 sm:hidden justify-center",children:n.jsxs("div",{className:"w-12 h-12 rounded-full bg-purple-100 flex flex-col items-center justify-center",children:[n.jsx("span",{className:"text-primary flex items-center justify-center",children:a}),n.jsx("span",{className:"text-base font-bold text-primary leading-tight",children:s})]})}),n.jsxs("div",{className:"hidden sm:flex items-center gap-0 sm:gap-0 sm:flex-row sm:items-center justify-between",children:[n.jsxs("div",{className:"flex-1 min-w-0",children:[n.jsx("p",{className:"text-xs sm:text-sm text-gray-700 mb-0.5 sm:mb-2 truncate",children:e}),n.jsx("p",{className:"text-base sm:text-xl font-bold text-primary break-words",children:s})]}),n.jsx("div",{className:"w-8 h-8 sm:w-10 sm:h-10 rounded-lg bg-purple-100 flex items-center justify-center flex-shrink-0 ml-2",children:n.jsx("div",{className:"text-primary",children:a})})]})]})}),se=()=>{var b;const{t:N}=e(),[k,S]=s(),{toast:_}=y(),{user:q}=a(),{data:H=[]}=P(),I=k.match(/^\/ai-review\/shops\/review\/(\d+)/)||k.match(/^\/shops-review\/(\d+)/),O=I?parseInt(I[1],10):null,[z,J]=t.useState(O),[X,Z]=t.useState(null),[se,te]=t.useState(!0),[le,ie]=t.useState(null),[re,ne]=t.useState([]),[oe,ce]=t.useState(null),[de,me]=t.useState(!1),[he,xe]=t.useState(null),[ue,pe]=t.useState(!1),[fe,ge]=t.useState(1),[je,ve]=t.useState(null),[we,be]=t.useState(!1),[ye,Ne]=t.useState(""),[ke,Se]=t.useState(""),[_e,Ce]=t.useState(""),[Ee,Fe]=t.useState(""),Te=t.useMemo((()=>({..._e?{start_date:_e}:{},...Ee?{end_date:Ee}:{}})),[_e,Ee]),Me=t.useMemo((()=>Y(function(e){if(!e)return[];const s=[],a=new Set;for(const t of[e.desktop,e.mobile])if(t)for(const e of Object.keys(t))!e||Q(e)||a.has(e)||(a.add(e),s.push(e));return s}(null==X?void 0:X.share_url),null==oe?void 0:oe.platforms,H)),[null==X?void 0:X.share_url,null==oe?void 0:oe.platforms,H]),Le=t.useMemo((()=>_e||Ee?_e&&Ee?`${_e} - ${Ee}`:_e||Ee:N("shops.review.dateFilter.allTime")),[_e,Ee,N]),Ae=t.useCallback((e=>{const s=new Date;Ne(l(U(s,e),"yyyy-MM-dd")),Se(l(s,"yyyy-MM-dd"))}),[]),Re=t.useCallback((()=>{ye&&ke&&ke<ye?_({title:N("shops.review.dateFilter.invalidRange"),variant:"destructive"}):(Ce(ye),Fe(ke),ge(1),be(!1))}),[ye,ke,N,_]),De=t.useCallback((()=>{Ne(""),Se(""),Ce(""),Fe(""),ge(1),be(!1)}),[]),{data:Be}=i({queryKey:["userShops","all"],queryFn:()=>R.getUserShops(1,999)}),Pe=Be&&Be.status&&(null==(b=Be.data)?void 0:b.items)?Be.data.items:[];return t.useEffect((()=>{r(z)}),[z]),t.useEffect((()=>{z&&(me(!0),xe(null),L(z,Te).then((e=>{e.status&&e.data?ce(e.data):(ce(null),xe(e.message||N("shops.review.analytics.error")))})).catch((e=>{xe("Error fetching analytics: "+e.message),ce(null)})).finally((()=>me(!1))))}),[z,Te,N]),t.useEffect((()=>
1{if(!z)return void te(!1);let e=!1;return te(!0),ie(null),R.getShopById(z).then((async s=>{var a;if(!e){if(s.status&&s.data){let t=s.data;if(!t.share_url&&t.slug){const s=await R.getShopBySlug(t.slug);if(e)return;s.status&&(null==(a=s.data)?void 0:a.share_url)&&(t={...t,share_url:s.data.share_url})}Z(t),ie(null)}else{Z(null);const e=s.message||N("shops.common.loadingErrorDescription");ie(e),_({title:N("shops.common.loadingError"),description:e,variant:"destructive"})}te(!1)}})).catch((s=>{if(e)return;Z(null);const a=s.message||N("shops.common.loadingErrorDescription");ie(a),_({title:N("shops.common.loadingError"),description:a,variant:"destructive"}),te(!1)})),()=>{e=!0}}),[z,N,_]),t.useEffect((()=>{z&&(pe(!0),A(z,1,void 0,Te).then((e=>{e.status&&e.data?(ne(e.data.items.slice(0,10)),ve(e.data.pagination)):(ne([]),ve(null))})).catch((()=>{ne([]),ve(null)})).finally((()=>pe(!1))))}),[z,Te]),t.useEffect((()=>{const e=()=>{window.scrollTo({top:0,left:0,behavior:"instant"}),document.documentElement.scrollTop=0,document.body.scrollTop=0;document.querySelectorAll("[data-radix-scroll-area-viewport], .overflow-auto, .overflow-y-auto, .overflow-scroll, .overflow-y-scroll").forEach((e=>{e instanceof HTMLElement&&(e.scrollTop=0)}));const e=document.querySelector('main, #root, .container, [role="main"]');e&&e instanceof HTMLElement&&(e.scrollTop=0)};e();const s=setTimeout(e,100),a=setTimeout(e,300);return()=>{clearTimeout(s),clearTimeout(a)}}),[]),se?n.jsx("div",{className:"min-h-screen bg-gray-50 flex items-center justify-center px-4",children:n.jsxs("div",{className:"max-w-md w-full bg-white rounded-2xl shadow-lg p-8 text-center",children:[n.jsx("div",{className:"animate-spin rounded-full h-12 w-12 border-b-2 border-purple-600 mx-auto mb-4"}),n.jsx("p",{className:"text-gray-600",children:N("shops.common.loading")})]})}):le&&!se?n.jsx("div",{className:"min-h-screen bg-gray-50 flex items-center justify-center px-4",children:n.jsxs("div",{className:"max-w-md w-full bg-white rounded-2xl shadow-lg p-8 text-center",children:[n.jsxs("div",{className:"mb-6",children:[n.jsx("div",{className:"mx-auto flex items-center justify-center h-16 w-16 rounded-full bg-red-100 mb-4",children:n.jsx("svg",{className:"h-8 w-8 text-red-600",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor","aria-hidden":"true",children:n.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"})})}),n.jsx("h2",{className:"text-xl font-semibold text-gray-900 mb-2",children:N("shops.common.loadingError","Failed to Load Shop")}),n.jsx("p",{className:"text-sm text-gray-600 mb-6",children:le})]}),n.jsx("div",{className:"flex flex-col sm:flex-row gap-3 justify-center",children:n.jsx("button",{onClick:()=>S("/ai-review/shops"),className:"px-6 py-2.5 border border-gray-300 text-gray-700 font-medium rounded-md hover:bg-gray-50 transition-colors focus:outline-none focus:ring-2 focus:ring-purple-500 focus:ring-offset-2",children:N("shops.backToShops","Back to Shops")})})]})}):n.jsxs("div",{className:"container mx-auto py-4 px-4 max-w-6xl",children:[n.jsxs("div",{className:"mb-6 flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between",children:[n.jsxs("div",{children:[n.jsxs("h1",{className:"text-2xl font-bold text-gray-900 mb-2",children:[N("shops.welcome","Welcome back"),", ",(null==q?void 0:q.name)||N("shops.user","User")]}),n.jsx("p",{className:"text-gray-600",children:N("shops.review.subtitle","Here's an overview of your shop activities.")})]}),n.jsxs(o,{open:we,onOpenChange:be,children:[n.jsx(c,{asChild:!0,children:n.jsxs(d,{variant:"outline",className:"h-9 shrink-0 gap-2 self-start","aria-label":Le,children:[n.jsx(m,{className:"h-4 w-4 shrink-0"}),n.jsx("span",{className:"text-sm",children:Le}),n.jsx(h,{className:"h-3.5 w-3.5 shrink-0 opacity-50"})]})}),n.jsxs(x,{align:"end",className:"min-w-0 w-[calc(100vw-2rem)] p-0 sm:min-w-80 sm:w-max",children:[n.jsx("div",{className:"px-4 py-3 sm:p-3 border-b",children:n.jsx("h3",{className:"font-medium text-sm text-center sm:text-left",children:N("shops.review.dateFilter.title")})}),n.jsxs("div",{className:"px-4 py-3 sm:p-3 space-y-3",children:[n.jsxs("div",{className:"flex flex-row flex-nowrap items-center gap-1.5 sm:gap-2",children:[n.jsx(u,{type:"date",className:"h-11 min-w-0 flex-1 sm:h-10 sm:w-[9.5rem] sm:flex-none",value:ye,max:ke||void 0,onChange:e=>Ne(e.target.value)}),n.jsx("span",{className:"text-xs sm:text-sm text-muted-foreground shrink-0",children:N("shops.review.dateFilter.to")}),n.jsx(u,{type:"date",className:"h-11 min-w-0 flex-1 sm:h-10 sm:w-[9.5rem] sm:flex-none",value:ke,min:ye||void 0,onChange:e=>Se(e.target.value)})]}),n.jsxs("div",{className:"flex flex-row flex-nowrap gap-2",children:[n.jsx(d,{variant:"outline",className:"h-11 min-w-0 flex-1 justify-center px-2 text-xs sm:h-10 sm:text-sm",onClick:()=>Ae(7),children:N("shops.review.dateFilter.last7Days")}),n.jsx(d,{variant:"outline",className:"h-11 min-w-0 flex-1 justify-center px-2 text-xs sm:h-10 sm:text-sm",onClick:()=>Ae(30),children:N("shops.review.dateFilter.last30Days")})]})]}),n.jsxs("div",{className:"px-4 py-3 sm:p-3 border-t flex flex-col gap-2 sm:flex-row sm:justify-between sm:items-center",children:[n.jsx(d,{variant:"ghost",size:"sm",className:"h-11 w-full sm:h-9 sm:w-auto",onClick:De,children:N("shops.review.dateFilter.clear")}),n.jsx(d,{size:"sm",className:"h-11 w-full sm:h-9 sm:w-auto bg-purple-600 hover:bg-purple-700 text-white",onClick:Re,children:N("shops.review.dateFilter.apply")})]})]})]})]}),X&&oe&&n.jsx(p,{className:"mb-8 sticky top-0 z-10",children:n.jsx(f,{className:"p-6",children:n.jsxs("div",{className:"flex flex-col lg:flex-row gap-6",children:[n.jsxs("div",{className:"flex items-start gap-4 lg:flex-shrink-0",children:[n.jsx("div",{className:"relative flex-shrink-0",children:X.logo_url?n.jsx("img",{src:X.logo_url,alt:N("shops.review.shopHeader.logoAlt",{shopName:D(X)}),className:"w-16 h-16 rounded-xl bg-gray-100 object-cover border-2 border-white shadow-md"}):n.jsx("div",{className:"w-16 h-16 rounded-xl bg-gradient-to-br from-purple-400 to-blue-500 flex items-center justify-center text-white font-bold text-xl shadow-md",children:D(X).substring(0,2).toUpperCase()})}),n.jsxs("div",{className:"flex-1 min-w-0",children:[n.jsx("div",{className:"flex items-center gap-2 mb-2",children:Pe.length>1?n.jsxs(C,{value:(null==z?void 0:z.toString())||"",onValueChange:e=>{const s=parseInt(e,10);J(s),ge(1),S(`/ai-review/shops/review/${s}`)},children:[n.jsx(E,{className:"h-auto p-0 border-0 bg-transparent hover:bg-transparent focus:ring-0 shadow-none w-auto inline-flex items-center gap-1 [&>svg:last-child]:hidden",children:n.jsx(F,{children:n.jsxs("div",{className:"flex items-center gap-1",children:[n.jsx("span",{className:"text-base font-bold text-primary",children:D(X)}),n.jsx(h,{className:"h-4 w-4 text-primary"})]})})}),n.jsx(T,{children:Pe.map((e=>n.jsx(M,{value:e.id.toString(),children:D(e)},e.id)))})]}):n.jsx("span",{className:"text-base font-bold text-primary",children:D(X)})}),X.shop_url&&B(X)&&n.jsxs("a",{href:X.shop_url,target:"_blank",rel:"noopener noreferrer",className:"flex items-center gap-1 text-blue-600 hover:text-blue-800 text-sm font-medium",children:[n.jsx(V,{className:"h-4 w-4"}),N("shops.review.shopHeader.visitShop","Visit Shop")]})]})]}),n.jsxs("div",{className:"grid grid-cols-4 md:grid-cols-4 gap-4 flex-1",children:[n.jsx(ee,{title:N("shops.review.analytics.metrics.totalReviews"),value:oe.total_reviews,icon:n.jsx($,{className:"h-5 w-5"})}),n.jsx(ee,{title:N("shops.review.analytics.metrics.aiGenerated"),value:oe.total_generated_review,icon:n.jsx(W,{className:"h-5 w-5"})}),n.jsx(ee,{title:N("shops.review.analytics.metrics.totalFeedbackReviews","Feedback Reviews"),value:oe.total_feedback_review,icon:n.jsx(g,{className:"h-5 w-5"})}),n.jsx(ee,{title:N("shops.review.analytics.metrics.totalShares"),value:oe.total_share,icon:n.jsx(G,{className:"h-5 w-5"})})]})]})})}),oe&&Me.length>0&&n.jsxs(p,{className:"mb-8",children:[n.jsx(j,{children:n.jsxs(v,{className:"flex items-center gap-2",children:[n.jsx(K,{className:"h-5 w-5"}),N("shops.review.analytics.platformDistribution","Platform Distribution")]})}),n.jsx(f,{children:n.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4",children:Me.map((e=>n.jsxs("div",{className:"flex items-center gap-3 p-4 bg-gray-50 border border-gray-200 rounded-lg hover:bg-gray-50 transition-colors",children:[e.icon?n.jsx("img",{src:e.icon,alt:e.label,className:"w-8 h-8 object-contain flex-shrink-0"}):n.jsx("div",{className:"w-8 h-8 rounded-full bg-gray-200 flex items-center justify-center flex-shrink-0 text-xs font-semibold text-gray-600",children:e.label.slice(0,2)}),n.jsxs("div",{className:"flex-1 min-w-0",children:[n.jsx("div",{className:"font-medium text-gray-900",children:e.label}),n.jsxs("div",{className:"text-sm text-gray-600",children:[e.total," ",N("shops.review.analytics.reviews","reviews")]})]})]},e.key)))})})]}),n.jsxs("div",{className:"space-y-6 bg-gray-50 p-6 rounded-lg",children:[n.jsxs("div",{className:"flex items-center justify-between",children:[n.jsx("h2",{className:"text-xl font-bold text-gray-900",children:N("shops.review.latestSharing","Latest Customer Sharing")}),je&&je.total>re.length&&n.jsxs("button",{onClick:()=>{const e=new URLSearchParams;z&&e.set("shop_id",String(z)),_e&&e.set("start_date",_e),Ee&&e.set("end_date",Ee);const s=e.toString();S("/ai-review/shops/reviews/all"+(s?`?${s}`:""))},className:"text-sm text-primary hover:text-primary/80 font-medium flex items-center gap-1",children:[N("shops.review.viewAll","View all"),n.jsx(w,{className:"h-4 w-4"})]})]}),n.jsx(ae,{reviews:re,loadingReviews:ue,pagination:null,page:1,setPage:()=>{},t:N,analytics:oe,showPagination:!1})]})]})},ae=({reviews:e,loadingReviews:s,pagination:a,page:t,setPage:l,t:i,analytics:r,showPagination:o=!0})=>s?n.jsx(p,{children:n.jsxs(f,{className:"py-16 text-center",children:[n.jsx("div",{className:"animate-spin rounded-full h-12 w-12 border-b-2 border-purple-600 mx-auto mb-4"}),n.jsx("p",{className:"text-gray-600 text-lg",children:i("shops.review.reviews.loading")})]})}):0===e.length?n.jsx(p,{children:n.jsxs(f,{className:"py-16 text-center",children:[n.jsx("div",{className:"w-20 h-20 bg-gray-100 rounded-full flex items-center justify-center mx-auto mb-6",children:n.jsx($,{className:"h-8 w-8 text-gray-400"})}),n.jsx("h3",{className:"text-xl font-semibold text-gray-900 mb-2",children:i("shops.review.reviews.empty.title","No reviews yet")}),n.jsx("p",{className:"text-gray-600",children:i("shops.review.reviews.empty.subtitle","Customer reviews will appear here once they are shared.")})]})}):n.jsxs(n.Fragment,{children:[n.jsx("div",{className:"space-y-4",children:e.map(((e,s)=>n.jsx(q,{review:e,index:s,shop:null,t:i,analytics:r,showShopName:!1,showCalendarIcon:!1},e.id)))}),o&&a&&a.last_page>1&&n.jsxs("div",{className:"flex justify-center items-center gap-2",children:[n.jsxs(d,{variant:"outline",disabled:1===t||s,onClick:()=>l(t-1),children:[n.jsx(J,{className:"h-4 w-4 mr-2"}),i("shops.review.pagination.previous")]}),n.jsx("div",{className:"flex gap-1",children:Array.from({length:Math.min(a.last_page,5)},((e,i)=>{let r;return r=a.last_page<=5||t<=3?i+1:t>=a.last_page-2?a.last_page-4+i:t-2+i,n.jsx(d,{variant:t===r?"default":"outline",size:"sm",className:"w-10 h-10 p-0",onClick:()=>l(r),disabled:t===r||s,children:r},r)}))}),n.jsxs(d,{variant:"outline",disabled:t===a.last_page||s,onClick:()=>l(t+1),children:[i("shops.review.pagination.next"),n.jsx(b,{className:"h-4 w-4 ml-2"})]})]})]});
1export{se as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.