PageSourceSearch

https://tohoorin.com/_next/static/chunks/pages/admin/product/image-upload/[productId]-62cf4d281ed9aa83.js

js tohoorin.com collected 2026-09-26 14:31:17 UTC 9,861 bytes, 1 lines download raw bytes

1(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[44002],{38092:(e,a,t)=>{(window.__NEXT_P=window.__NEXT_P||[]).push(["/admin/product/image-upload/[productId]",function(){return t(89912)}])},36795:(e,a,t)=>{"use strict";t.d(a,{A:()=>r});let r=(0,t(96540).createContext)({addSdk:async()=>{},activeSDK:[]})},10767:(e,a,t)=>{"use strict";t.d(a,{A:()=>o});var r=t(96540),i=t(99624),d=t(36795);let o=()=>{let{addSdk:e,activeSDK:a}=(0,r.useContext)(d.A);return(0,r.useEffect)(()=>{a.includes("auth")||setTimeout(()=>e("auth"))},[a]),a.includes("auth")&&(0,i.As)()}},37496:(e,a,t)=>{"use strict";t.d(a,{A:()=>d});var r=t(96540),i=t(10767);let d=()=>{var e;let a=(0,i.A)()||null,t=null!==(e=null==a?void 0:a.currentUser)&&void 0!==e?e:null,d=(0,r.useCallback)((e,a)=>{let t=new Headers(e.headers);return t.set("Authorization","Bearer ".concat(a)),{...e,headers:t}},[]),o=(0,r.useCallback)(async function(){let e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return t?t.getIdToken(e):null},[t]),l=(0,r.useCallback)(async function(e){let a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!t)throw Error("User is not authenticated");let r=await o();if(!r)throw Error("Failed to acquire bearer token");let i=await fetch(e,d(a,r));if(i.ok)return i.json();let l=Error(await i.text());throw l.response=i,l},[d,t,o]);return{auth:a,currentUser:t,getBearerToken:o,fetchWithAuth:l}}},89912:(e,a,t)=>{"use strict";t.r(a),t.d(a,{default:()=>f});var r=t(2445),i=t(27006),d=t(13368),o=t.n(d),l=t(86715),s=t(96540),n=t(6442),c=t(37496);let u=e=>Array.isArray(e)?e[0]:e,m=(e,a)=>{if(!(e instanceof Error))return a;try{return JSON.parse(e.message).error||e.message}catch(a){return e.message}},g=e=>{var a,t;let r=null==e?void 0:null===(a=e.imageUrl)||void 0===a?void 0:a.trim();if(r)return r;let i=null==e?void 0:null===(t=e.image)||void 0===t?void 0:t.trim();return i&&/^(https?:|data:image\/|blob:)/i.test(i)?i:""},p=e=>{var a;let t=[...(null==e?void 0:e.productImageUrls)||[],...(null==e?void 0:null===(a=e.items)||void 0===a?void 0:a.map(e=>e.imageUrl||""))||[]].map(e=>e.trim()).filter(Boolean);return t.length?Array.from(new Set(t)):[]},f=()=>{var e,a,t;let d=(0,l.useRouter)(),f=(0,i.useToast)(),h=(0,n.A)(),{currentUser:v,fetchWithAuth:M}=(0,c.A)(),b=h.formatMessage({defaultMessage:"商品圖片上傳",id:"admin.product.imageUpload.pageTitle"}),y=h.formatMessage({defaultMessage:"商品圖片上傳",id:"admin.product.imageUpload.heading"}),x=h.formatMessage({defaultMessage:"需要登入",id:"admin.product.imageUpload.authNoticeTitle"}),Y=h.formatMessage({defaultMessage:"請先登入有此商品管理權限的 Portaly 帳號。",id:"admin.product.imageUpload.authNotice"}),U=h.formatMessage({defaultMessage:"商品資訊",id:"admin.product.imageUpload.productInfoTitle"}),S=h.formatMessage({defaultMessage:"無法讀取商品資訊",id:"admin.product.imageUpload.productLoadFailed"}),F=h.formatMessage({defaultMessage:"商品 ID",id:"admin.product.imageUpload.productId"}),w=h.formatMessage({defaultMessage:"商品名稱",id:"admin.product.imageUpload.name"}),T=h.formatMessage({defaultMessage:"簡介",id:"admin.product.imageUpload.description"}),D=h.formatMessage({defaultMessage:"類型",id:"admin.product.imageUpload.category"}),A=h.formatMessage({defaultMessage:"狀態",id:"admin.product.imageUpload.status"}),k=h.formatMessage({defaultMessage:"價格",id:"admin.product.imageUpload.price"}),C=h.formatMessage({defaultMessage:"目前圖片",id:"admin.product.imageUpload.currentImage"}),E=h.formatMessage({defaultMessage:"未設定",id:"admin.product.imageUpload.noValue"}),B=h.formatMessage({defaultMessage:"已上架",id:"admin.product.imageUpload.active"}),I=h.formatMessage({defaultMessage:"未上架",id:"admin.product.imageUpload.inactive"}),R=h.formatMessage({defaultMessage:"數位商品",id:"admin.product.imageUpload.digitalProduct"}),_=h.formatMessage({defaultMessage:"直播課程",id:"admin.product.imageUpload.liveClass"}),z=h.formatMessage({defaultMessage:"圖片檔案",id:"admin.product.imageUpload.imageFile"}),N=h.formatMessage({defaultMessage:"支援 JPEG、PNG、WebP 或 GIF,每張檔案大小上限 8 MB,最多 10 張。",id:"admin.product.imageUpload.imageHelp"}),P=h.formatMessage({defaultMessage:"預覽",id:"admin.product.imageUpload.preview"}),L=h.formatMessage({defaultMessage:"已選取的商品圖片預覽",id:"admin.product.imageUpload.previewAlt"}),G=h.formatMessage({defaultMessage:"上傳商品圖片",id:"admin.product.imageUpload.submit"}
1),H=h.formatMessage({defaultMessage:"商品圖片已上傳",id:"admin.product.imageUpload.uploadSuccessTitle"}),j=h.formatMessage({defaultMessage:"上傳失敗",id:"admin.product.imageUpload.uploadFailedTitle"}),O=h.formatMessage({defaultMessage:"未知錯誤",id:"admin.product.imageUpload.unknownError"}),q="".concat(b," | ").concat("Portaly"),[W,J]=(0,s.useState)([]),[K,X]=(0,s.useState)([]),[V,Q]=(0,s.useState)(null),[Z,$]=(0,s.useState)(""),[ee,ea]=(0,s.useState)(!1),[et,er]=(0,s.useState)(!1),ei=(0,s.useMemo)(()=>{var e;return(null===(e=u(d.query.productId))||void 0===e?void 0:e.trim())||""},[d.query.productId]),ed=!!(v&&ei&&W.length&&!et),eo=(0,s.useMemo)(()=>ei?"/api/product/image/".concat(encodeURIComponent(ei)):"",[ei]),el=(null==V?void 0:V.titleText)||(null==V?void 0:null===(e=V.title)||void 0===e?void 0:e.text)||(null==V?void 0:V.name)||E,es=(null==V?void 0:V.description)||(null==V?void 0:V.productDescription)||(null==V?void 0:null===(a=V.product)||void 0===a?void 0:a.description)||E,en=V?!0===V.isActive||"true"===V.isActive?B:I:E,ec=(null==V?void 0:V.category)==="live"?_:V?R:E,eu=(null==V?void 0:V.productMode)==="free"?"0":null!==(t=null==V?void 0:V.price)&&void 0!==t?t:E,em=g(V),eg=p(V);(0,s.useEffect)(()=>{if(!W.length){X([]);return}let e=W.map(e=>URL.createObjectURL(e));return X(e),()=>{e.forEach(e=>URL.revokeObjectURL(e))}},[W]),(0,s.useEffect)(()=>{if(!eo||!v)return;let e=!0;return(async()=>{ea(!0),$("");try{let t=await M(eo,{method:"GET"});if(e){var a;Q((null===(a=t.data)||void 0===a?void 0:a.product)||null)}}catch(a){e&&$(m(a,S))}finally{e&&ea(!1)}})(),()=>{e=!1}},[v,eo,M,S]);let ep=async e=>{if(e.preventDefault(),!ed||!W.length)return;let a=new FormData;W.forEach(e=>{a.append("file",e)}),er(!0);try{var t;let e=await M(eo,{method:"POST",body:a});Q((null===(t=e.data)||void 0===t?void 0:t.product)||V),f({title:H,status:"success"})}catch(e){f({title:j,description:m(e,O),status:"error"})}finally{er(!1)}};return(0,r.FD)(r.FK,{children:[(0,r.Y)(o(),{children:(0,r.Y)("title",{children:q})}),(0,r.Y)(i.Container,{maxW:"3xl",py:{base:8,md:12},children:(0,r.FD)(i.Stack,{spacing:8,children:[(0,r.Y)(i.Stack,{spacing:3,children:(0,r.Y)(i.Heading,{color:"gray.900",fontSize:{base:"2xl",md:"3xl"},children:y})}),!v&&(0,r.FD)(i.Alert,{status:"warning",borderRadius:"md",children:[(0,r.Y)(i.AlertIcon,{}),(0,r.FD)(i.Box,{children:[(0,r.Y)(i.AlertTitle,{children:x}),(0,r.Y)(i.AlertDescription,{children:Y})]})]}),Z&&(0,r.FD)(i.Alert,{status:"error",borderRadius:"md",children:[(0,r.Y)(i.AlertIcon,{}),(0,r.Y)(i.AlertDescription,{children:Z})]}),(0,r.Y)(i.Box,{border:"1px solid",borderColor:"gray.200",borderRadius:"md",bg:"white",p:{base:5,md:6},children:(0,r.FD)(i.Stack,{spacing:4,children:[(0,r.Y)(i.Heading,{as:"h2",color:"gray.900",fontSize:"xl",children:U}),(0,r.Y)(i.Skeleton,{isLoaded:!ee,children:(0,r.FD)(i.SimpleGrid,{columns:{base:1,md:2},spacing:4,children:[(0,r.FD)(i.Box,{children:[(0,r.Y)(i.Text,{color:"gray.500",fontSize:"sm",children:w}),(0,r.Y)(i.Text,{color:"gray.900",fontWeight:"700",children:el})]}),(0,r.FD)(i.Box,{children:[(0,r.Y)(i.Text,{color:"gray.500",fontSize:"sm",children:A}),(0,r.Y)(i.Badge,{colorScheme:en===B?"green":"gray",children:en})]}),(0,r.FD)(i.Box,{children:[(0,r.Y)(i.Text,{color:"gray.500",fontSize:"sm",children:D}),(0,r.Y)(i.Text,{color:"gray.900",children:ec})]}),(0,r.FD)(i.Box,{children:[(0,r.Y)(i.Text,{color:"gray.500",fontSize:"sm",children:k}),(0,r.Y)(i.Text,{color:"gray.900",children:eu})]})]})}),(0,r.FD)(i.Box,{children:[(0,r.Y)(i.Text,{color:"gray.500",fontSize:"sm",children:T}),(0,r.Y)(i.Text,{color:"gray.900",whiteSpace:"pre-wrap",children:es})]}),(0,r.FD)(i.Box,{children:[(0,r.Y)(i.Text,{color:"gray.500",fontSize:"sm",children:F}),(0,r.Y)(i.Code,{display:"block",p:3,borderRadius:"md",whiteSpace:"pre-wrap",children:ei})]}),(0,r.FD)(i.Box,{children:[(0,r.Y)(i.Text,{color:"gray.500",fontSize:"sm",children:C}),em||eg.length?(0,r.Y)(i.SimpleGrid,{columns:{base:1,sm:2},spacing:3,mt:2,children:(eg.length?eg:[em]).map((e,a)=>(0,r.Y)(i.Image,{src:e,alt:C,maxH:"220px",borderRadius:"md",objectFit:"contain",border:"1px solid",borderColor:"gray.200",bg
1:"gray.50"},"".concat(e,"-").concat(a)))}):(0,r.Y)(i.Text,{color:"gray.900",children:E})]})]})}),(0,r.Y)(i.Box,{as:"form",onSubmit:ep,border:"1px solid",borderColor:"gray.200",borderRadius:"md",bg:"white",p:{base:5,md:6},children:(0,r.FD)(i.Stack,{spacing:5,children:[(0,r.FD)(i.FormControl,{isRequired:!0,children:[(0,r.Y)(i.FormLabel,{children:z}),(0,r.Y)(i.Input,{type:"file",accept:"image/jpeg,image/png,image/webp,image/gif",multiple:!0,p:1,onChange:e=>{J(Array.from(e.target.files||[]).slice(0,10))}}),(0,r.Y)(i.FormHelperText,{children:N})]}),K.length>0&&(0,r.FD)(i.Box,{children:[(0,r.Y)(i.Text,{mb:2,fontWeight:"600",color:"gray.700",children:P}),(0,r.Y)(i.SimpleGrid,{columns:{base:1,sm:2},spacing:3,children:K.map((e,a)=>(0,r.Y)(i.Image,{src:e,alt:"".concat(L," ").concat(a+1),maxH:"220px",borderRadius:"md",objectFit:"contain",border:"1px solid",borderColor:"gray.200",bg:"gray.50"},e))})]}),(0,r.Y)(i.Button,{type:"submit",colorScheme:"teal",isDisabled:!ed,isLoading:et,alignSelf:{base:"stretch",md:"flex-start"},children:G})]})})]})})]})}},13368:(e,a,t)=>{e.exports=t(86085)}},e=>{var a=a=>e(e.s=a);e.O(0,[19883,28505,58247,64065,99624,13404,90636,46593,38792],()=>a(38092)),_N_E=e.O()}]);

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.