@molin.ai/shop-ai 0.9.32 → 0.9.34

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.
@@ -1269,7 +1269,7 @@ var Sa=Object.create;var Pi=Object.defineProperty;var Ea=Object.getOwnPropertyDe
1269
1269
  </div>
1270
1270
  </div>
1271
1271
  </div>
1272
- `}#e(){this.dispatchEvent(new t.NewChatClickEvent)}#t(){this.dispatchEvent(new t.CloseClickEvent)}};Le.NewChatClickEvent=class extends CustomEvent{static type="mw:new-chat-click";constructor(e={}){super(Le.NewChatClickEvent.type,{...e})}};Le.CloseClickEvent=class extends CustomEvent{static type="mw:close-click";constructor(e={}){super(Le.CloseClickEvent.type,{...e})}};customElements.get("mw-chat-header")||customElements.define("mw-chat-header",Le);var ko=Ta(xo(),1);var se=Object.freeze({PENDING:"pending",READY:"ready",ERROR:"error"}),Cr=class{#e;#t;#r=null;#n=!1;#i=null;#s=[];constructor(e,r){this.#e=e,this.#t={acceptedTypes:["image/jpeg","image/png","image/gif","image/webp","image/svg+xml","image/heic"],maxFileSize:10*1024*1024,maxFiles:3,onError:()=>{},enabled:!0,isConnected:()=>!1,onConnect:()=>{},...r},e.addController(this),this.#l()}hostConnected(){this.#o(),this.#h()}hostDisconnected(){this.#a(),this.#c(),this.#r&&this.#r.parentNode&&this.#r.parentNode.removeChild(this.#r)}#o(){this.#t.enabled&&this.#t.isConnected()&&(this.#e.addEventListener("dragover",this.#w),this.#e.addEventListener("dragenter",this.#y),this.#e.addEventListener("dragleave",this.#v),this.#e.addEventListener("drop",this.#b))}#a(){this.#e.removeEventListener("dragover",this.#w),this.#e.removeEventListener("dragenter",this.#y),this.#e.removeEventListener("dragleave",this.#v),this.#e.removeEventListener("drop",this.#b)}#h(){this.#t.enabled&&this.#e.addEventListener("paste",this.#m)}#c(){this.#e.removeEventListener("paste",this.#m)}#l(){this.#r=document.createElement("input"),this.#r.type="file",this.#r.accept=this.#t.acceptedTypes.join(","),this.#r.multiple=this.#t.maxFiles>1,this.#r.style.display="none",this.#r.addEventListener("change",this.#f),document.body.appendChild(this.#r)}#f=e=>{let r=e.target,n=Array.from(r.files||[]);this.#t.isConnected()||this.#t.onConnect?.(),this.#k(n),r.value=""};#w=e=>{e.preventDefault(),e.dataTransfer&&(e.dataTransfer.dropEffect="copy")};#y=e=>{e.preventDefault(),e.dataTransfer&&this.#x(e.dataTransfer)&&this.#g(!0)};#v=e=>{e.preventDefault();let r=e.relatedTarget;this.#e.contains(r)||this.#g(!1)};#b=e=>{if(e.preventDefault(),this.#g(!1),e.dataTransfer){let r=Array.from(e.dataTransfer.files||[]);this.#k(r)}};#m=e=>{if(!e.clipboardData)return;let n=Array.from(e.clipboardData.items||[]).filter(s=>s.type.startsWith("image/"));if(n.length===0)return;e.preventDefault();let i=n.map(s=>s.getAsFile()).filter(s=>s!==null);this.#k(i)};#x(e){return e.types&&e.types.includes("Files")}#g(e){this.#n!==e&&(this.#n=e,this.#e.requestUpdate())}#u(e){this.#i=e,this.#t.onError(e),this.#e.requestUpdate(),setTimeout(()=>{this.#d()},6e3)}#d(){this.#i=null,this.#e.requestUpdate()}async#k(e){if(e.length===0)return;this.#d();let r=e.filter(o=>this.#C(o));if(r.length===0)return;let n=this.#s.length,i=this.#t.maxFiles??1/0,s=r.length;if(n+s>i){this.#u(`You can upload a maximum of ${i} files`);return}try{let c=(await Promise.all(r.map(l=>this.#p(l)))).filter(l=>!this.#s.some(a=>a.dataUrl===l.dataUrl));this.#s=[...this.#s,...c],this.#e.requestUpdate(),await pn({times:5,delay:2e3},async()=>{if(this.#t.isConnected())await dn(3,c,async l=>{await this.#$(l)});else throw new Error("Not connected yet")}),this.#e.requestUpdate()}catch(o){console.error("Failed to process and upload images:",o),this.#u("Upload failed")}}#C(e){return this.#t.acceptedTypes.includes(e.type)?e.size>this.#t.maxFileSize?(this.#u(`Max file size: ${this.#t.maxFileSize/(1024*1024)}MB`),!1):!0:(this.#u("Invalid file type"),!1)}async#p(e){try{let r=await(0,ko.fileToBase64)(e);return{id:crypto.randomUUID(),name:e.name,type:e.type,size:e.size,dataUrl:r,file:e,processingState:se.PENDING}}catch(r){let n=r instanceof Error?r:new Error(String(r));throw new Error(`Failed to read file: ${e.name} - ${n.message}`)}}async#$(e){if(!e){console.error("No image provided to upload"),this.#u("No image provided");return}if(!this.#t?.uploadUrl){console.error("Missing uploadUrl in options"),this.#u("Upload URL not configured");return}e.processingState=se.PENDING,this.#e.requestUpdate();let r=new FormData;r.append("file",e.file),r.append("imageId",e.id),r.append("role",this.#t.role||"user"),this.#t.conversationId&&r.append("conversationId",this.#t.conversationId),this.#t.widgetId&&r.append("widgetId",this.#t.widgetId);try{let n=await fetch(this.#t.uploadUrl,{method:"POST",body:r});if(!n.ok)throw new Error(`Upload failed with status: ${n.status}`);let i=await n.json();if(!!!i?.success){let o=i?.error||"Upload failed";throw new Error(o)}i.imageUrl&&i.imageId?(e.imageUrl=i.imageUrl,e.id=i.imageId,e.processingState=se.READY):e.processingState=se.PENDING,this.#e.requestUpdate()}catch(n){let i=n instanceof Error?n:new Error(String(n));console.error("Upload error:",i.message),this.#u(i.message),e.processingState=se.ERROR,this.#e.requestUpdate()}}get isDragging(){return this.#n}get error(){return this.#i}get selectedImages(){return this.#s}get hasPendingImages(){return this.#s.some(e=>e.processingState===se.PENDING)}openImagePicker=()=>{if(!this.#t.enabled||!this.#t.widgetId){console.warn("Image uploads are disabled");return}this.#r&&this.#r.click()};clearError(){this.#d()}updateUploadOptions(e){let r=this.#t.isConnected();e.conversationId!==void 0&&(this.#t.conversationId=e.conversationId),e.widgetId!==void 0&&(this.#t.widgetId=e.widgetId),e.enabled!==void 0&&(this.#t.enabled=!!e.enabled),e.isConnected!==void 0&&(this.#t.isConnected=e.isConnected),e.onConnect!==void 0&&(this.#t.onConnect=e.onConnect),!this.#t.enabled||!this.#t.isConnected()?(this.#a(),this.#c()):!r&&this.#t.isConnected()&&(this.#o(),this.#h())}restoreImages(e){if(!Array.isArray(e)||e.length===0){this.#s=[],this.#e.requestUpdate();return}let r=e.map(n=>{let i=new File([],n.name,{type:n.type});return{id:n.id,name:n.name,type:n.type,size:n.size,dataUrl:n.url,file:i,processingState:se.READY,imageUrl:n.url}});this.#s=r,this.#e.requestUpdate()}clearImages(){this.#s=[],this.clearError(),this.#e.requestUpdate()}onImageDelete=e=>{this.#t.onImageDelete&&this.#t.onImageDelete(e),this.#s=this.#s.filter(r=>r.id!==e),this.#d(),this.#e.requestUpdate()}};var ei={maxHeight:120,initialHeight:32,paddingY:12},he=class t extends C(v){static properties={disabled:{type:Boolean},streaming:{type:Boolean},loading:{type:Boolean},placeholder:{type:String},color:{type:String},enableImageUpload:{type:Boolean},onImageUploadClick:{type:Function},images:{type:Array},onImageDelete:{type:Function}};#e=new Date;constructor(){super(),this.disabled=!1,this.streaming=!1,this.loading=!1,this.placeholder="Type a message...",this.enableImageUpload=!1,this.onImageUploadClick=void 0,this.images=[],this.onImageDelete=void 0,this.color="#8B5CF6"}get value(){return this.#t?.value?.trim()??""}render(){return u`
1272
+ `}#e(){this.dispatchEvent(new t.NewChatClickEvent)}#t(){this.dispatchEvent(new t.CloseClickEvent)}};Le.NewChatClickEvent=class extends CustomEvent{static type="mw:new-chat-click";constructor(e={}){super(Le.NewChatClickEvent.type,{...e})}};Le.CloseClickEvent=class extends CustomEvent{static type="mw:close-click";constructor(e={}){super(Le.CloseClickEvent.type,{...e})}};customElements.get("mw-chat-header")||customElements.define("mw-chat-header",Le);var ko=Ta(xo(),1);var se=Object.freeze({PENDING:"pending",READY:"ready",ERROR:"error"}),Cr=class{#e;#t;#r=null;#n=!1;#i=null;#s=[];constructor(e,r){this.#e=e,this.#t={acceptedTypes:["image/jpeg","image/png","image/gif","image/webp","image/svg+xml","image/heic"],maxFileSize:10*1024*1024,maxFiles:3,onError:()=>{},enabled:!0,isConnected:()=>!1,onConnect:()=>{},...r},e.addController(this),this.#l()}hostDisconnected(){this.#a(),this.#c(),this.#r&&this.#r.parentNode&&this.#r.parentNode.removeChild(this.#r)}#o(){this.#t.enabled&&(this.#e.addEventListener("dragover",this.#w),this.#e.addEventListener("dragenter",this.#y),this.#e.addEventListener("dragleave",this.#v),this.#e.addEventListener("drop",this.#b))}#a(){this.#e.removeEventListener("dragover",this.#w),this.#e.removeEventListener("dragenter",this.#y),this.#e.removeEventListener("dragleave",this.#v),this.#e.removeEventListener("drop",this.#b)}#h(){this.#t.enabled&&this.#e.addEventListener("paste",this.#m)}#c(){this.#e.removeEventListener("paste",this.#m)}#l(){this.#r=document.createElement("input"),this.#r.type="file",this.#r.accept=this.#t.acceptedTypes.join(","),this.#r.multiple=this.#t.maxFiles>1,this.#r.style.display="none",this.#r.addEventListener("change",this.#f),document.body.appendChild(this.#r)}#f=e=>{let r=e.target,n=Array.from(r.files||[]);this.#t.isConnected()||this.#t.onConnect?.(),this.#k(n),r.value=""};#w=e=>{e.preventDefault(),e.dataTransfer&&(e.dataTransfer.dropEffect="copy")};#y=e=>{e.preventDefault(),e.dataTransfer&&this.#x(e.dataTransfer)&&this.#g(!0)};#v=e=>{e.preventDefault();let r=e.relatedTarget;this.#e.contains(r)||this.#g(!1)};#b=e=>{if(e.preventDefault(),this.#g(!1),e.dataTransfer){let r=Array.from(e.dataTransfer.files||[]);this.#k(r)}};#m=e=>{if(!e.clipboardData)return;let n=Array.from(e.clipboardData.items||[]).filter(s=>s.type.startsWith("image/"));if(n.length===0)return;e.preventDefault();let i=n.map(s=>s.getAsFile()).filter(s=>s!==null);this.#k(i)};#x(e){return e.types&&e.types.includes("Files")}#g(e){this.#n!==e&&(this.#n=e,this.#e.requestUpdate())}#u(e){this.#i=e,this.#t.onError(e),this.#e.requestUpdate(),setTimeout(()=>{this.#d()},6e3)}#d(){this.#i=null,this.#e.requestUpdate()}async#k(e){if(e.length===0)return;this.#d();let r=e.filter(o=>this.#C(o));if(r.length===0)return;let n=this.#s.length,i=this.#t.maxFiles??1/0,s=r.length;if(n+s>i){this.#u(`You can upload a maximum of ${i} files`);return}try{let c=(await Promise.all(r.map(l=>this.#p(l)))).filter(l=>!this.#s.some(a=>a.dataUrl===l.dataUrl));this.#s=[...this.#s,...c],this.#e.requestUpdate(),await pn({times:5,delay:2e3},async()=>{if(this.#t.isConnected())await dn(3,c,async l=>{await this.#$(l)});else throw new Error("Not connected yet")}),this.#e.requestUpdate()}catch(o){console.error("Failed to process and upload images:",o),this.#u("Upload failed")}}#C(e){return this.#t.acceptedTypes.includes(e.type)?e.size>this.#t.maxFileSize?(this.#u(`Max file size: ${this.#t.maxFileSize/(1024*1024)}MB`),!1):!0:(this.#u("Invalid file type"),!1)}async#p(e){try{let r=await(0,ko.fileToBase64)(e);return{id:crypto.randomUUID(),name:e.name,type:e.type,size:e.size,dataUrl:r,file:e,processingState:se.PENDING}}catch(r){let n=r instanceof Error?r:new Error(String(r));throw new Error(`Failed to read file: ${e.name} - ${n.message}`)}}async#$(e){if(!e){console.error("No image provided to upload"),this.#u("No image provided");return}if(!this.#t?.uploadUrl){console.error("Missing uploadUrl in options"),this.#u("Upload URL not configured");return}e.processingState=se.PENDING,this.#e.requestUpdate();let r=new FormData;r.append("file",e.file),r.append("imageId",e.id),r.append("role",this.#t.role||"user"),this.#t.conversationId&&r.append("conversationId",this.#t.conversationId),this.#t.widgetId&&r.append("widgetId",this.#t.widgetId);try{let n=await fetch(this.#t.uploadUrl,{method:"POST",body:r});if(!n.ok)throw new Error(`Upload failed with status: ${n.status}`);let i=await n.json();if(!!!i?.success){let o=i?.error||"Upload failed";throw new Error(o)}i.imageUrl&&i.imageId?(e.imageUrl=i.imageUrl,e.id=i.imageId,e.processingState=se.READY):e.processingState=se.PENDING,this.#e.requestUpdate()}catch(n){let i=n instanceof Error?n:new Error(String(n));console.error("Upload error:",i.message),this.#u(i.message),e.processingState=se.ERROR,this.#e.requestUpdate()}}get isDragging(){return this.#n}get error(){return this.#i}get selectedImages(){return this.#s}get hasPendingImages(){return this.#s.some(e=>e.processingState===se.PENDING)}openImagePicker=()=>{if(!this.#t.enabled||!this.#t.widgetId){console.warn("Image uploads are disabled");return}this.#r&&this.#r.click()};clearError(){this.#d()}updateUploadOptions(e){e.conversationId!==void 0&&(this.#t.conversationId=e.conversationId),e.widgetId!==void 0&&(this.#t.widgetId=e.widgetId),e.enabled!==void 0&&(this.#t.enabled=!!e.enabled),e.isConnected!==void 0&&(this.#t.isConnected=e.isConnected),e.onConnect!==void 0&&(this.#t.onConnect=e.onConnect),this.#t.enabled?(this.#o(),this.#h()):(this.#a(),this.#c())}restoreImages(e){if(!Array.isArray(e)||e.length===0){this.#s=[],this.#e.requestUpdate();return}let r=e.map(n=>{let i=new File([],n.name,{type:n.type});return{id:n.id,name:n.name,type:n.type,size:n.size,dataUrl:n.url,file:i,processingState:se.READY,imageUrl:n.url}});this.#s=r,this.#e.requestUpdate()}clearImages(){this.#s=[],this.clearError(),this.#e.requestUpdate()}onImageDelete=e=>{this.#t.onImageDelete&&this.#t.onImageDelete(e),this.#s=this.#s.filter(r=>r.id!==e),this.#d(),this.#e.requestUpdate()}};var ei={maxHeight:120,initialHeight:32,paddingY:12},he=class t extends C(v){static properties={disabled:{type:Boolean},streaming:{type:Boolean},loading:{type:Boolean},placeholder:{type:String},color:{type:String},enableImageUpload:{type:Boolean},onImageUploadClick:{type:Function},images:{type:Array},onImageDelete:{type:Function}};#e=new Date;constructor(){super(),this.disabled=!1,this.streaming=!1,this.loading=!1,this.placeholder="Type a message...",this.enableImageUpload=!1,this.onImageUploadClick=void 0,this.images=[],this.onImageDelete=void 0,this.color="#8B5CF6"}get value(){return this.#t?.value?.trim()??""}render(){return u`
1273
1273
  <div
1274
1274
  class="focus-within:ring-opacity-50 ${this.enableImageUpload&&this.images.length>0?`ring-2 ring-[${this.color}] ring-opacity-50`:""} w-full overflow-hidden rounded-[18px] bg-white shadow-[0px_3px_20px_0px_rgba(0,0,0,0.2)] transition-all duration-200 focus-within:ring-2 focus-within:ring-[${this.color}]">
1275
1275
  <!-- Image preview area -->
@@ -2076,7 +2076,7 @@ var Sa=Object.create;var Pi=Object.defineProperty;var Ea=Object.getOwnPropertyDe
2076
2076
  </div>
2077
2077
 
2078
2078
  <!-- drag overlay -->
2079
- ${this.config.enableImageUpload&&this.#n.isDragging&&this.#e.value?.isConnected()?u`
2079
+ ${this.config.enableImageUpload&&this.#n.isDragging?u`
2080
2080
  <div class="bg-opacity-90 absolute inset-0 z-50 flex items-center justify-center bg-white sm:rounded-[30px]">
2081
2081
  <div class="p-8 text-center">
2082
2082
  <lucide-icon name="image-plus" class="mx-auto mb-4 h-12 w-12 text-blue-500"></lucide-icon>
@@ -2119,7 +2119,7 @@ var Sa=Object.create;var Pi=Object.defineProperty;var Ea=Object.getOwnPropertyDe
2119
2119
  position=${this.#i}
2120
2120
  @click="${this.#l}">
2121
2121
  <div
2122
- class="prose prose-h1:first:mt-0 prose-h2:first:mt-0 prose-h3:first:mt-0 prose-h4:first:mt-0 prose-h1:last:mb-0 prose-h2:last:mb-0 prose-h3:last:mb-0 prose-h4:last:mb-0 prose-h1:mt-5 prose-h2:mt-5 prose-h3:mt-5 prose-h4:mt-5 prose-h1:mb-2 prose-h2:mb-2 prose-h3:mb-2 prose-h4:mb-2 prose-h1:text-xl prose-h1:text-bold prose-h2:text-lg prose-h2:text-bold prose-h3:text-base prose-h3:text-bold prose-h4:text-sm prose-h4:text-bold break-words text-inherit">
2122
+ class="prose prose-h1:first:mt-0 prose-h2:first:mt-0 prose-h3:first:mt-0 prose-h4:first:mt-0 prose-h1:last:mb-0 prose-h2:last:mb-0 prose-h3:last:mb-0 prose-h4:last:mb-0 prose-h1:mt-5 prose-h2:mt-5 prose-h3:mt-5 prose-h4:mt-5 prose-h1:mb-2 prose-h2:mb-2 prose-h3:mb-2 prose-h4:mb-2 prose-h1:text-xl prose-h1:text-bold prose-h2:text-lg prose-h2:text-bold prose-h3:text-base prose-h3:text-bold prose-h4:text-sm prose-h4:text-bold prose-p:whitespace-pre-wrap break-words text-inherit">
2123
2123
  ${o.content===uu?u`<mw-loading class="-mx-2 block h-8 max-h-[24px] w-8 fill-[${this.config?.color}]"></mw-loading>`:o.parts?X(o.parts,(x,w)=>w,(x,w)=>aa(x,w,o.parts??[],{imagesByProductUrl:o.metadata?.imagesByProductUrl,linksNewTab:this.config?.linksNewTab??!0,searchParams:this.config?.disableUtmInjection?void 0:new URLSearchParams({utm_source:"molin.ai",utm_medium:"chat",utm_campaign:"general"}),messageIsStreaming:o.streaming,color:this.config?.color,apiBaseUrl:Fr(),cdnBaseUrl:ma()})):u`<p>${o.content}</p>`}
2124
2124
  </div>
2125
2125
  </mw-chat-message>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@molin.ai/shop-ai",
3
- "version": "0.9.32",
3
+ "version": "0.9.34",
4
4
  "description": "Molin Shop AI",
5
5
  "keywords": [
6
6
  "molin",