@botuyo/chat-widget-standalone 1.0.44 → 1.0.47
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.
- package/dist/botuyo-chat.es.js +23 -23
- package/dist/botuyo-chat.es.js.map +1 -1
- package/dist/botuyo-chat.umd.js +1 -1
- package/dist/botuyo-chat.umd.js.map +1 -1
- package/dist/chunk-audio-B4jwb7Se.js +12 -0
- package/dist/chunk-audio-B4jwb7Se.js.map +1 -0
- package/dist/{chunk-chat-ui-DnjbBMZe.js → chunk-chat-ui-DKipQPcr.js} +13 -13
- package/dist/chunk-chat-ui-DKipQPcr.js.map +1 -0
- package/dist/{chunk-gallery-Daf3BU2J.js → chunk-gallery-BAW9nHMc.js} +2 -2
- package/dist/{chunk-gallery-Daf3BU2J.js.map → chunk-gallery-BAW9nHMc.js.map} +1 -1
- package/dist/src/chat-widget/components/AudioPlayer.d.ts.map +1 -1
- package/dist/src/chat-widget/components/MessageBubble.d.ts.map +1 -1
- package/dist/stats-umd.html +1 -1
- package/dist/stats.html +1 -1
- package/package.json +1 -1
- package/dist/chunk-audio-Cnj7d9z9.js +0 -11
- package/dist/chunk-audio-Cnj7d9z9.js.map +0 -1
- package/dist/chunk-chat-ui-DnjbBMZe.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import{jsxs as r,jsx as e,Fragment as a}from"react/jsx-runtime";import{memo as t,useState as l,useRef as o,useMemo as n,useCallback as i}from"react";import{g as s,c,R as d,L as u,P as h,a as m,C as f}from"./chunk-chat-ui-DnjbBMZe.js";const p=t(function({url:t,isBot:p,primaryColor:y}){const[x,N]=l(!1),[b,g]=l(0),[w,v]=l(0),C=t?.startsWith("blob:"),[k,j]=l(!C),[M,P]=l(C?"Audio no disponible":null),S=o(null),A=n(()=>s({primaryColor:y}),[y]),E=i(()=>{M||(x?S.current?.pause():S.current?.play().catch(r=>{console.error("[AudioPlayer] Play error:",r),P("Error al reproducir")}),N(!x))},[x,M]),T=i(()=>{g(S.current?.duration||0)},[]),$=i(()=>{j(!1),P(null)},[]),L=i(()=>{console.error("[AudioPlayer] Failed to load audio:",t),j(!1),P("No se pudo cargar")},[t]),R=i(()=>{j(!0),P(null),S.current&&S.current.load()},[]);/* @__PURE__ */
|
|
2
|
-
return r("div",{className:c("flex items-center gap-3 py-1 min-w-[200px]",p?"text-foreground":"text-primary-foreground"),children:[!C&&/* @__PURE__ */e("audio",{ref:S,src:t,preload:"metadata",onLoadedMetadata:T,onCanPlayThrough:$,onTimeUpdate:()=>v(S.current?.currentTime||0),onEnded:()=>N(!1),onError:L}),
|
|
3
|
-
/* @__PURE__ */e("button",M?{onClick:R,className:"w-8 h-8 rounded-full flex items-center justify-center shrink-0 bg-red-500/20 text-red-500 hover:bg-red-500/30 transition-colors",title:"Reintentar",children:/* @__PURE__ */e(d,{className:"w-4 h-4"})}:{onClick:E,disabled:k,className:"w-8 h-8 rounded-full flex items-center justify-center shrink-0 transition-opacity",style:{backgroundColor:p?A:"hsl(var(--card))",color:p?"white":A,opacity:k?.6:1},children:k?/* @__PURE__ */e(u,{className:"w-4 h-4 animate-spin"}):x?/* @__PURE__ */e(h,{className:"w-4 h-4 fill-current"}):/* @__PURE__ */e(m,{className:"w-4 h-4 fill-current ml-0.5"})}),
|
|
4
|
-
/* @__PURE__ */e("div",{className:"flex-1 space-y-1",children:M?/* @__PURE__ */r("div",{className:"flex items-center gap-1.5 text-red-500",children:[
|
|
5
|
-
/* @__PURE__ */e(f,{className:"w-3 h-3"}),
|
|
6
|
-
/* @__PURE__ */e("span",{className:"text-[9px] font-bold",children:M})]}):/* @__PURE__ */r(a,{children:[
|
|
7
|
-
/* @__PURE__ */e("div",{className:"relative h-1 w-full bg-current/20 rounded-full overflow-hidden",children:/* @__PURE__ */e("div",{className:"absolute h-full bg-current rounded-full transition-all",style:{width:`${w/b*100||0}%`}})}),
|
|
8
|
-
/* @__PURE__ */r("div",{className:"flex justify-between text-[9px] font-bold opacity-60",children:[
|
|
9
|
-
/* @__PURE__ */r("span",{children:[Math.floor(w/60),":",Math.floor(w%60).toString().padStart(2,"0")]}),
|
|
10
|
-
/* @__PURE__ */e("span",{children:k?"--:--":`${Math.floor(b/60)}:${Math.floor(b%60).toString().padStart(2,"0")}`})]})]})})]})});export{p as AudioPlayer};
|
|
11
|
-
//# sourceMappingURL=chunk-audio-Cnj7d9z9.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"chunk-audio-Cnj7d9z9.js","sources":["../src/chat-widget/components/AudioPlayer.tsx"],"sourcesContent":["'use client'\r\n\r\nimport { useState, useRef, useMemo, memo, useCallback } from 'react'\r\nimport { Play, Pause, Loader2, AlertCircle, RotateCw } from './Icons'\r\nimport { cn } from '@/lib/utils'\r\nimport { getPrimaryColor } from '../utils/theme'\r\n\r\ninterface AudioPlayerProps {\r\n url: string\r\n isBot: boolean\r\n primaryColor?: string\r\n}\r\n\r\nexport type { AudioPlayerProps }\r\n\r\nexport const AudioPlayer = memo(function AudioPlayer({\r\n url,\r\n isBot,\r\n primaryColor,\r\n}: AudioPlayerProps) {\r\n const [isPlaying, setIsPlaying] = useState(false)\r\n const [duration, setDuration] = useState(0)\r\n const [currentTime, setCurrentTime] = useState(0)\r\n // Detect expired blob URLs immediately — they become invalid after page reload\r\n const isBlobUrl = url?.startsWith('blob:')\r\n const [isLoading, setIsLoading] = useState(!isBlobUrl)\r\n const [error, setError] = useState<string | null>(isBlobUrl ? 'Audio no disponible' : null)\r\n const audioRef = useRef<HTMLAudioElement>(null)\r\n\r\n const brandColor = useMemo(() => getPrimaryColor({ primaryColor }), [primaryColor])\r\n\r\n const togglePlay = useCallback(() => {\r\n if (error) return\r\n if (isPlaying) audioRef.current?.pause()\r\n else audioRef.current?.play().catch((e) => {\r\n console.error('[AudioPlayer] Play error:', e)\r\n setError('Error al reproducir')\r\n })\r\n setIsPlaying(!isPlaying)\r\n }, [isPlaying, error])\r\n\r\n const handleLoadedMetadata = useCallback(() => {\r\n setDuration(audioRef.current?.duration || 0)\r\n }, [])\r\n\r\n const handleCanPlayThrough = useCallback(() => {\r\n setIsLoading(false)\r\n setError(null)\r\n }, [])\r\n\r\n const handleError = useCallback(() => {\r\n console.error('[AudioPlayer] Failed to load audio:', url)\r\n setIsLoading(false)\r\n setError('No se pudo cargar')\r\n }, [url])\r\n\r\n const handleRetry = useCallback(() => {\r\n setIsLoading(true)\r\n setError(null)\r\n if (audioRef.current) {\r\n audioRef.current.load()\r\n }\r\n }, [])\r\n\r\n return (\r\n <div\r\n className={cn(\r\n 'flex items-center gap-3 py-1 min-w-[200px]',\r\n isBot ? 'text-foreground' : 'text-primary-foreground'\r\n )}\r\n >\r\n {/* Don't attempt to load expired blob: URLs */}\r\n {!isBlobUrl && (\r\n <audio\r\n ref={audioRef}\r\n src={url}\r\n preload=\"metadata\"\r\n onLoadedMetadata={handleLoadedMetadata}\r\n onCanPlayThrough={handleCanPlayThrough}\r\n onTimeUpdate={() => setCurrentTime(audioRef.current?.currentTime || 0)}\r\n onEnded={() => setIsPlaying(false)}\r\n onError={handleError}\r\n />\r\n )}\r\n \r\n {error ? (\r\n // Error state - show retry button\r\n <button\r\n onClick={handleRetry}\r\n className=\"w-8 h-8 rounded-full flex items-center justify-center shrink-0 bg-red-500/20 text-red-500 hover:bg-red-500/30 transition-colors\"\r\n title=\"Reintentar\"\r\n >\r\n <RotateCw className=\"w-4 h-4\" />\r\n </button>\r\n ) : (\r\n // Normal play/pause button\r\n <button\r\n onClick={togglePlay}\r\n disabled={isLoading}\r\n className=\"w-8 h-8 rounded-full flex items-center justify-center shrink-0 transition-opacity\"\r\n style={{\r\n backgroundColor: isBot ? brandColor : 'hsl(var(--card))',\r\n color: isBot ? 'white' : brandColor,\r\n opacity: isLoading ? 0.6 : 1,\r\n }}\r\n >\r\n {isLoading ? (\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n ) : isPlaying ? (\r\n <Pause className=\"w-4 h-4 fill-current\" />\r\n ) : (\r\n <Play className=\"w-4 h-4 fill-current ml-0.5\" />\r\n )}\r\n </button>\r\n )}\r\n \r\n <div className=\"flex-1 space-y-1\">\r\n {error ? (\r\n <div className=\"flex items-center gap-1.5 text-red-500\">\r\n <AlertCircle className=\"w-3 h-3\" />\r\n <span className=\"text-[9px] font-bold\">{error}</span>\r\n </div>\r\n ) : (\r\n <>\r\n <div className=\"relative h-1 w-full bg-current/20 rounded-full overflow-hidden\">\r\n <div\r\n className=\"absolute h-full bg-current rounded-full transition-all\"\r\n style={{ width: `${(currentTime / duration) * 100 || 0}%` }}\r\n />\r\n </div>\r\n <div className=\"flex justify-between text-[9px] font-bold opacity-60\">\r\n <span>\r\n {Math.floor(currentTime / 60)}:\r\n {Math.floor(currentTime % 60)\r\n .toString()\r\n .padStart(2, '0')}\r\n </span>\r\n <span>\r\n {isLoading ? '--:--' : `${Math.floor(duration / 60)}:${Math.floor(duration % 60).toString().padStart(2, '0')}`}\r\n </span>\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n )\r\n})\r\n"],"names":["AudioPlayer","memo","url","isBot","primaryColor","isPlaying","setIsPlaying","useState","duration","setDuration","currentTime","setCurrentTime","isBlobUrl","startsWith","isLoading","setIsLoading","error","setError","audioRef","useRef","brandColor","useMemo","getPrimaryColor","togglePlay","useCallback","current","pause","play","catch","e","console","handleLoadedMetadata","handleCanPlayThrough","handleError","handleRetry","load","jsxs","className","cn","children","jsx","ref","src","preload","onLoadedMetadata","onCanPlayThrough","onTimeUpdate","onEnded","onError","onClick","title","RotateCw","disabled","style","backgroundColor","color","opacity","Loader2","Pause","Play","AlertCircle","Fragment","width","Math","floor","toString","padStart"],"mappings":"0OAeO,MAAMA,EAAcC,EAAK,UAAqBC,IACnDA,EAAAC,MACAA,EAAAC,aACAA,IAEA,MAAOC,EAAWC,GAAgBC,GAAS,IACpCC,EAAUC,GAAeF,EAAS,IAClCG,EAAaC,GAAkBJ,EAAS,GAEzCK,EAAYV,GAAKW,WAAW,UAC3BC,EAAWC,GAAgBR,GAAUK,IACrCI,EAAOC,GAAYV,EAAwBK,EAAY,sBAAwB,MAChFM,EAAWC,EAAyB,MAEpCC,EAAaC,EAAQ,IAAMC,EAAgB,CAAElB,iBAAiB,CAACA,IAE/DmB,EAAaC,EAAY,KACzBR,IACAX,EAAWa,EAASO,SAASC,UACnBD,SAASE,OAAOC,MAAOC,IACnCC,QAAQd,MAAM,4BAA6Ba,GAC3CZ,EAAS,yBAEXX,GAAcD,KACb,CAACA,EAAWW,IAETe,EAAuBP,EAAY,KACvCf,EAAYS,EAASO,SAASjB,UAAY,IACzC,IAEGwB,EAAuBR,EAAY,KACvCT,GAAa,GACbE,EAAS,OACR,IAEGgB,EAAcT,EAAY,KAC9BM,QAAQd,MAAM,sCAAuCd,GACrDa,GAAa,GACbE,EAAS,sBACR,CAACf,IAEEgC,EAAcV,EAAY,KAC9BT,GAAa,GACbE,EAAS,MACLC,EAASO,SACXP,EAASO,QAAQU,QAElB;AAEH,OACEC,EAAC,MAAA,CACCC,UAAWC,EACT,6CACAnC,EAAQ,kBAAoB,2BAI7BoC,SAAA,EAAC3B,kBACA4B,EAAC,QAAA,CACCC,IAAKvB,EACLwB,IAAKxC,EACLyC,QAAQ,WACRC,iBAAkBb,EAClBc,iBAAkBb,EAClBc,aAAc,IAAMnC,EAAeO,EAASO,SAASf,aAAe,GACpEqC,QAAS,IAAMzC,GAAa,GAC5B0C,QAASf;eAMXO,EAAC,SAFFxB,EAEE,CACCiC,QAASf,EACTG,UAAU,kIACVa,MAAM,aAENX,wBAAAC,EAACW,EAAA,CAASd,UAAU,aAIrB,CACCY,QAAS1B,EACT6B,SAAUtC,EACVuB,UAAU,oFACVgB,MAAO,CACLC,gBAAiBnD,EAAQiB,EAAa,mBACtCmC,MAAOpD,EAAQ,QAAUiB,EACzBoC,QAAS1C,EAAY,GAAM,GAG5ByB,SAAAzB,iBACC0B,EAACiB,EAAA,CAAQpB,UAAU,yBACjBhC,iBACFmC,EAACkB,EAAA,CAAMrB,UAAU,0CAEhBsB,EAAA,CAAKtB,UAAU;eAKtBG,EAAC,OAAIH,UAAU,mBACZE,0BACCH,EAAC,MAAA,CAAIC,UAAU,yCACbE,SAAA;eAAAC,EAACoB,EAAA,CAAYvB,UAAU;iBACtB,OAAA,CAAKA,UAAU,uBAAwBE,SAAAvB,sBAG1CoB,EAAAyB,EAAA,CACEtB,SAAA;eAAAC,EAAC,MAAA,CAAIH,UAAU,iEACbE,wBAAAC,EAAC,MAAA,CACCH,UAAU,yDACVgB,MAAO,CAAES,MAAO,GAAIpD,EAAcF,EAAY,KAAO;eAGzD4B,EAAC,MAAA,CAAIC,UAAU,uDACbE,SAAA;eAAAH,EAAC,OAAA,CACEG,SAAA,CAAAwB,KAAKC,MAAMtD,EAAc,IAAI,IAC7BqD,KAAKC,MAAMtD,EAAc,IACvBuD,WACAC,SAAS,EAAG;eAEjB1B,EAAC,QACED,SAAAzB,EAAY,QAAU,GAAGiD,KAAKC,MAAMxD,EAAW,OAAOuD,KAAKC,MAAMxD,EAAW,IAAIyD,WAAWC,SAAS,EAAG,mBAQxH"}
|