@botuyo/chat-widget-standalone 1.0.37 → 1.0.39

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.
Files changed (158) hide show
  1. package/dist/ShadowChatWidget.d.ts +25 -0
  2. package/dist/ShadowChatWidget.d.ts.map +1 -0
  3. package/dist/botuyo-chat.es.js +1 -1
  4. package/dist/botuyo-chat.es.js.map +1 -1
  5. package/dist/botuyo-chat.umd.css +1 -0
  6. package/dist/botuyo-chat.umd.js +2 -0
  7. package/dist/botuyo-chat.umd.js.map +1 -0
  8. package/dist/{chunk-audio-DG3X3uze.js → chunk-audio-COeJdzjG.js} +2 -2
  9. package/dist/{chunk-audio-DG3X3uze.js.map → chunk-audio-COeJdzjG.js.map} +1 -1
  10. package/dist/{chunk-chat-ui-C0sPAQ4e.js → chunk-chat-ui-SifgaVaw.js} +33 -32
  11. package/dist/{chunk-chat-ui-C0sPAQ4e.js.map → chunk-chat-ui-SifgaVaw.js.map} +1 -1
  12. package/dist/{chunk-gallery-BDe3OAec.js → chunk-gallery-CvYRVmRl.js} +2 -2
  13. package/dist/{chunk-gallery-BDe3OAec.js.map → chunk-gallery-CvYRVmRl.js.map} +1 -1
  14. package/dist/src/chat-widget/ChatWidget.d.ts +5 -0
  15. package/dist/src/chat-widget/ChatWidget.d.ts.map +1 -0
  16. package/dist/src/chat-widget/ChatWidgetProvider.d.ts +81 -0
  17. package/dist/src/chat-widget/ChatWidgetProvider.d.ts.map +1 -0
  18. package/dist/src/chat-widget/components/AudioPlayer.d.ts +8 -0
  19. package/dist/src/chat-widget/components/AudioPlayer.d.ts.map +1 -0
  20. package/dist/src/chat-widget/components/AudioPlayer.stories.d.ts +37 -0
  21. package/dist/src/chat-widget/components/AudioPlayer.stories.d.ts.map +1 -0
  22. package/dist/src/chat-widget/components/Avatar3D.d.ts +23 -0
  23. package/dist/src/chat-widget/components/Avatar3D.d.ts.map +1 -0
  24. package/dist/src/chat-widget/components/ChatWindow.d.ts +35 -0
  25. package/dist/src/chat-widget/components/ChatWindow.d.ts.map +1 -0
  26. package/dist/src/chat-widget/components/ChatWindow.stories.d.ts +71 -0
  27. package/dist/src/chat-widget/components/ChatWindow.stories.d.ts.map +1 -0
  28. package/dist/src/chat-widget/components/ErrorBoundary.d.ts +36 -0
  29. package/dist/src/chat-widget/components/ErrorBoundary.d.ts.map +1 -0
  30. package/dist/src/chat-widget/components/ErrorBoundary.stories.d.ts +29 -0
  31. package/dist/src/chat-widget/components/ErrorBoundary.stories.d.ts.map +1 -0
  32. package/dist/src/chat-widget/components/Gallery.d.ts +14 -0
  33. package/dist/src/chat-widget/components/Gallery.d.ts.map +1 -0
  34. package/dist/src/chat-widget/components/Gallery.stories.d.ts +33 -0
  35. package/dist/src/chat-widget/components/Gallery.stories.d.ts.map +1 -0
  36. package/dist/src/chat-widget/components/Icons.d.ts +10 -0
  37. package/dist/src/chat-widget/components/Icons.d.ts.map +1 -0
  38. package/dist/src/chat-widget/components/InputArea.d.ts +21 -0
  39. package/dist/src/chat-widget/components/InputArea.d.ts.map +1 -0
  40. package/dist/src/chat-widget/components/InputArea.stories.d.ts +62 -0
  41. package/dist/src/chat-widget/components/InputArea.stories.d.ts.map +1 -0
  42. package/dist/src/chat-widget/components/LanguageSelector.d.ts +25 -0
  43. package/dist/src/chat-widget/components/LanguageSelector.d.ts.map +1 -0
  44. package/dist/src/chat-widget/components/Launcher.d.ts +22 -0
  45. package/dist/src/chat-widget/components/Launcher.d.ts.map +1 -0
  46. package/dist/src/chat-widget/components/Launcher.stories.d.ts +75 -0
  47. package/dist/src/chat-widget/components/Launcher.stories.d.ts.map +1 -0
  48. package/dist/src/chat-widget/components/LiveCallInputArea.d.ts +29 -0
  49. package/dist/src/chat-widget/components/LiveCallInputArea.d.ts.map +1 -0
  50. package/dist/src/chat-widget/components/MessageBubble.d.ts +15 -0
  51. package/dist/src/chat-widget/components/MessageBubble.d.ts.map +1 -0
  52. package/dist/src/chat-widget/components/MessageBubble.stories.d.ts +71 -0
  53. package/dist/src/chat-widget/components/MessageBubble.stories.d.ts.map +1 -0
  54. package/dist/src/chat-widget/components/MessageList.d.ts +15 -0
  55. package/dist/src/chat-widget/components/MessageList.d.ts.map +1 -0
  56. package/dist/src/chat-widget/components/MessageList.stories.d.ts +52 -0
  57. package/dist/src/chat-widget/components/MessageList.stories.d.ts.map +1 -0
  58. package/dist/src/chat-widget/components/TypingIndicator.d.ts +2 -0
  59. package/dist/src/chat-widget/components/TypingIndicator.d.ts.map +1 -0
  60. package/dist/src/chat-widget/components/TypingIndicator.stories.d.ts +39 -0
  61. package/dist/src/chat-widget/components/TypingIndicator.stories.d.ts.map +1 -0
  62. package/dist/src/chat-widget/components/VoiceCallOverlay.d.ts +65 -0
  63. package/dist/src/chat-widget/components/VoiceCallOverlay.d.ts.map +1 -0
  64. package/dist/src/chat-widget/components/VoiceInputArea.d.ts +26 -0
  65. package/dist/src/chat-widget/components/VoiceInputArea.d.ts.map +1 -0
  66. package/dist/src/chat-widget/components/index.d.ts +16 -0
  67. package/dist/src/chat-widget/components/index.d.ts.map +1 -0
  68. package/dist/src/chat-widget/contexts/AnimationContext.d.ts +69 -0
  69. package/dist/src/chat-widget/contexts/AnimationContext.d.ts.map +1 -0
  70. package/dist/src/chat-widget/hooks/useAnalytics.d.ts +19 -0
  71. package/dist/src/chat-widget/hooks/useAnalytics.d.ts.map +1 -0
  72. package/dist/src/chat-widget/hooks/useChatSocket.d.ts +35 -0
  73. package/dist/src/chat-widget/hooks/useChatSocket.d.ts.map +1 -0
  74. package/dist/src/chat-widget/hooks/useChatState.d.ts +23 -0
  75. package/dist/src/chat-widget/hooks/useChatState.d.ts.map +1 -0
  76. package/dist/src/chat-widget/hooks/useChatWidget.d.ts +50 -0
  77. package/dist/src/chat-widget/hooks/useChatWidget.d.ts.map +1 -0
  78. package/dist/src/chat-widget/hooks/useDarkMode.d.ts +6 -0
  79. package/dist/src/chat-widget/hooks/useDarkMode.d.ts.map +1 -0
  80. package/dist/src/chat-widget/hooks/useDynamicHeight.d.ts +10 -0
  81. package/dist/src/chat-widget/hooks/useDynamicHeight.d.ts.map +1 -0
  82. package/dist/src/chat-widget/hooks/useFocusTrap.d.ts +34 -0
  83. package/dist/src/chat-widget/hooks/useFocusTrap.d.ts.map +1 -0
  84. package/dist/src/chat-widget/hooks/useHighContrast.d.ts +6 -0
  85. package/dist/src/chat-widget/hooks/useHighContrast.d.ts.map +1 -0
  86. package/dist/src/chat-widget/hooks/useIsMobile.d.ts +2 -0
  87. package/dist/src/chat-widget/hooks/useIsMobile.d.ts.map +1 -0
  88. package/dist/src/chat-widget/hooks/useNotifications.d.ts +23 -0
  89. package/dist/src/chat-widget/hooks/useNotifications.d.ts.map +1 -0
  90. package/dist/src/chat-widget/hooks/useRateLimit.d.ts +15 -0
  91. package/dist/src/chat-widget/hooks/useRateLimit.d.ts.map +1 -0
  92. package/dist/src/chat-widget/hooks/useSEOMetadata.d.ts +10 -0
  93. package/dist/src/chat-widget/hooks/useSEOMetadata.d.ts.map +1 -0
  94. package/dist/src/chat-widget/hooks/useWidgetTheme.d.ts +12 -0
  95. package/dist/src/chat-widget/hooks/useWidgetTheme.d.ts.map +1 -0
  96. package/dist/src/chat-widget/i18n/LanguageContext.d.ts +33 -0
  97. package/dist/src/chat-widget/i18n/LanguageContext.d.ts.map +1 -0
  98. package/dist/src/chat-widget/i18n/index.d.ts +8 -0
  99. package/dist/src/chat-widget/i18n/index.d.ts.map +1 -0
  100. package/dist/src/chat-widget/i18n/translations.d.ts +177 -0
  101. package/dist/src/chat-widget/i18n/translations.d.ts.map +1 -0
  102. package/dist/src/chat-widget/i18n/useTranslations.d.ts +27 -0
  103. package/dist/src/chat-widget/i18n/useTranslations.d.ts.map +1 -0
  104. package/dist/src/chat-widget/index.d.ts +11 -0
  105. package/dist/src/chat-widget/index.d.ts.map +1 -0
  106. package/dist/src/chat-widget/types/index.d.ts +328 -0
  107. package/dist/src/chat-widget/types/index.d.ts.map +1 -0
  108. package/dist/src/chat-widget/types/socket.d.ts +107 -0
  109. package/dist/src/chat-widget/types/socket.d.ts.map +1 -0
  110. package/dist/src/chat-widget/utils/dateUtils.d.ts +33 -0
  111. package/dist/src/chat-widget/utils/dateUtils.d.ts.map +1 -0
  112. package/dist/src/chat-widget/utils/defaultAssets.d.ts +20 -0
  113. package/dist/src/chat-widget/utils/defaultAssets.d.ts.map +1 -0
  114. package/dist/src/chat-widget/utils/deviceId.d.ts +18 -0
  115. package/dist/src/chat-widget/utils/deviceId.d.ts.map +1 -0
  116. package/dist/src/chat-widget/utils/fileValidation.d.ts +75 -0
  117. package/dist/src/chat-widget/utils/fileValidation.d.ts.map +1 -0
  118. package/dist/src/chat-widget/utils/logger.d.ts +31 -0
  119. package/dist/src/chat-widget/utils/logger.d.ts.map +1 -0
  120. package/dist/src/chat-widget/utils/performance.d.ts +50 -0
  121. package/dist/src/chat-widget/utils/performance.d.ts.map +1 -0
  122. package/dist/src/chat-widget/utils/storage.d.ts +25 -0
  123. package/dist/src/chat-widget/utils/storage.d.ts.map +1 -0
  124. package/dist/src/chat-widget/utils/theme.d.ts +122 -0
  125. package/dist/src/chat-widget/utils/theme.d.ts.map +1 -0
  126. package/dist/src/chat-widget/utils/theme.examples.d.ts +47 -0
  127. package/dist/src/chat-widget/utils/theme.examples.d.ts.map +1 -0
  128. package/dist/src/chat-widget/utils/themes/index.d.ts +12 -0
  129. package/dist/src/chat-widget/utils/themes/index.d.ts.map +1 -0
  130. package/dist/src/chat-widget/voice/components/CallButton.d.ts +12 -0
  131. package/dist/src/chat-widget/voice/components/CallButton.d.ts.map +1 -0
  132. package/dist/src/chat-widget/voice/components/LiveCallOverlay.d.ts +12 -0
  133. package/dist/src/chat-widget/voice/components/LiveCallOverlay.d.ts.map +1 -0
  134. package/dist/src/chat-widget/voice/components/VoiceButton.d.ts +13 -0
  135. package/dist/src/chat-widget/voice/components/VoiceButton.d.ts.map +1 -0
  136. package/dist/src/chat-widget/voice/components/VoiceChatOverlay.d.ts +12 -0
  137. package/dist/src/chat-widget/voice/components/VoiceChatOverlay.d.ts.map +1 -0
  138. package/dist/src/chat-widget/voice/components/WaveformVisualizer.d.ts +12 -0
  139. package/dist/src/chat-widget/voice/components/WaveformVisualizer.d.ts.map +1 -0
  140. package/dist/src/chat-widget/voice/components/index.d.ts +10 -0
  141. package/dist/src/chat-widget/voice/components/index.d.ts.map +1 -0
  142. package/dist/src/chat-widget/voice/index.d.ts +11 -0
  143. package/dist/src/chat-widget/voice/index.d.ts.map +1 -0
  144. package/dist/src/chat-widget/voice/types.d.ts +232 -0
  145. package/dist/src/chat-widget/voice/types.d.ts.map +1 -0
  146. package/dist/src/chat-widget/voice/useLiveCall.d.ts +13 -0
  147. package/dist/src/chat-widget/voice/useLiveCall.d.ts.map +1 -0
  148. package/dist/src/chat-widget/voice/useVoiceChat.d.ts +13 -0
  149. package/dist/src/chat-widget/voice/useVoiceChat.d.ts.map +1 -0
  150. package/dist/src/chat-widget/voice/useVoiceState.d.ts +38 -0
  151. package/dist/src/chat-widget/voice/useVoiceState.d.ts.map +1 -0
  152. package/dist/src/lib/utils.d.ts +3 -0
  153. package/dist/src/lib/utils.d.ts.map +1 -0
  154. package/dist/standalone.d.ts +113 -0
  155. package/dist/standalone.d.ts.map +1 -0
  156. package/dist/stats-umd.html +4949 -0
  157. package/dist/stats.html +1 -1
  158. package/package.json +1 -1
@@ -1,4 +1,4 @@
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-C0sPAQ4e.js";const p=t(function({url:t,isBot:p,primaryColor:y}){const[x,N]=l(!1),[g,w]=l(0),[b,v]=l(0),[C,k]=l(!0),[j,M]=l(null),P=o(null),S=n(()=>s({primaryColor:y}),[y]),E=i(()=>{j||(x?P.current?.pause():P.current?.play().catch(r=>{console.error("[AudioPlayer] Play error:",r),M("Error al reproducir")}),N(!x))},[x,j]),T=i(()=>{w(P.current?.duration||0)},[]),$=i(()=>{k(!1),M(null)},[]),A=i(()=>{console.error("[AudioPlayer] Failed to load audio:",t),k(!1),M("No se pudo cargar")},[t]),L=i(()=>{k(!0),M(null),P.current&&P.current.load()},[]);/* @__PURE__ */
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-SifgaVaw.js";const p=t(function({url:t,isBot:p,primaryColor:y}){const[x,N]=l(!1),[g,w]=l(0),[b,v]=l(0),[C,k]=l(!0),[j,M]=l(null),P=o(null),S=n(()=>s({primaryColor:y}),[y]),E=i(()=>{j||(x?P.current?.pause():P.current?.play().catch(r=>{console.error("[AudioPlayer] Play error:",r),M("Error al reproducir")}),N(!x))},[x,j]),T=i(()=>{w(P.current?.duration||0)},[]),$=i(()=>{k(!1),M(null)},[]),A=i(()=>{console.error("[AudioPlayer] Failed to load audio:",t),k(!1),M("No se pudo cargar")},[t]),L=i(()=>{k(!0),M(null),P.current&&P.current.load()},[]);/* @__PURE__ */
2
2
  return r("div",{className:c("flex items-center gap-3 py-1 min-w-[200px]",p?"text-foreground":"text-primary-foreground"),children:[
3
3
  /* @__PURE__ */e("audio",{ref:P,src:t,preload:"metadata",onLoadedMetadata:T,onCanPlayThrough:$,onTimeUpdate:()=>v(P.current?.currentTime||0),onEnded:()=>N(!1),onError:A}),
4
4
  /* @__PURE__ */e("button",j?{onClick:L,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:C,className:"w-8 h-8 rounded-full flex items-center justify-center shrink-0 transition-opacity",style:{backgroundColor:p?S:"hsl(var(--card))",color:p?"white":S,opacity:C?.6:1},children:C?/* @__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"})}),
@@ -9,4 +9,4 @@ return r("div",{className:c("flex items-center gap-3 py-1 min-w-[200px]",p?"text
9
9
  /* @__PURE__ */r("div",{className:"flex justify-between text-[9px] font-bold opacity-60",children:[
10
10
  /* @__PURE__ */r("span",{children:[Math.floor(b/60),":",Math.floor(b%60).toString().padStart(2,"0")]}),
11
11
  /* @__PURE__ */e("span",{children:C?"--:--":`${Math.floor(g/60)}:${Math.floor(g%60).toString().padStart(2,"0")}`})]})]})})]})});export{p as AudioPlayer};
12
- //# sourceMappingURL=chunk-audio-DG3X3uze.js.map
12
+ //# sourceMappingURL=chunk-audio-COeJdzjG.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chunk-audio-DG3X3uze.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 const [isLoading, setIsLoading] = useState(true)\r\n const [error, setError] = useState<string | null>(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 <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 {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","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,IACxCK,EAAWC,GAAgBN,GAAS,IACpCO,EAAOC,GAAYR,EAAwB,MAC5CS,EAAWC,EAAyB,MAEpCC,EAAaC,EAAQ,IAAMC,EAAgB,CAAEhB,iBAAiB,CAACA,IAE/DiB,EAAaC,EAAY,KACzBR,IACAT,EAAWW,EAASO,SAASC,UACnBD,SAASE,OAAOC,MAAOC,IACnCC,QAAQd,MAAM,4BAA6Ba,GAC3CZ,EAAS,yBAEXT,GAAcD,KACb,CAACA,EAAWS,IAETe,EAAuBP,EAAY,KACvCb,EAAYO,EAASO,SAASf,UAAY,IACzC,IAEGsB,EAAuBR,EAAY,KACvCT,GAAa,GACbE,EAAS,OACR,IAEGgB,EAAcT,EAAY,KAC9BM,QAAQd,MAAM,sCAAuCZ,GACrDW,GAAa,GACbE,EAAS,sBACR,CAACb,IAEE8B,EAAcV,EAAY,KAC9BT,GAAa,GACbE,EAAS,MACLC,EAASO,SACXP,EAASO,QAAQU,QAElB;AAEH,OACEC,EAAC,MAAA,CACCC,UAAWC,EACT,6CACAjC,EAAQ,kBAAoB,2BAG9BkC,SAAA;eAAAC,EAAC,QAAA,CACCC,IAAKvB,EACLwB,IAAKtC,EACLuC,QAAQ,WACRC,iBAAkBb,EAClBc,iBAAkBb,EAClBc,aAAc,IAAMjC,EAAeK,EAASO,SAASb,aAAe,GACpEmC,QAAS,IAAMvC,GAAa,GAC5BwC,QAASf;eAKTO,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,gBAAiBjD,EAAQe,EAAa,mBACtCmC,MAAOlD,EAAQ,QAAUe,EACzBoC,QAAS1C,EAAY,GAAM,GAG5ByB,SAAAzB,iBACC0B,EAACiB,EAAA,CAAQpB,UAAU,yBACjB9B,iBACFiC,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,GAAIlD,EAAcF,EAAY,KAAO;eAGzD0B,EAAC,MAAA,CAAIC,UAAU,uDACbE,SAAA;eAAAH,EAAC,OAAA,CACEG,SAAA,CAAAwB,KAAKC,MAAMpD,EAAc,IAAI,IAC7BmD,KAAKC,MAAMpD,EAAc,IACvBqD,WACAC,SAAS,EAAG;eAEjB1B,EAAC,QACED,SAAAzB,EAAY,QAAU,GAAGiD,KAAKC,MAAMtD,EAAW,OAAOqD,KAAKC,MAAMtD,EAAW,IAAIuD,WAAWC,SAAS,EAAG,mBAQxH"}
1
+ {"version":3,"file":"chunk-audio-COeJdzjG.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 const [isLoading, setIsLoading] = useState(true)\r\n const [error, setError] = useState<string | null>(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 <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 {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","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,IACxCK,EAAWC,GAAgBN,GAAS,IACpCO,EAAOC,GAAYR,EAAwB,MAC5CS,EAAWC,EAAyB,MAEpCC,EAAaC,EAAQ,IAAMC,EAAgB,CAAEhB,iBAAiB,CAACA,IAE/DiB,EAAaC,EAAY,KACzBR,IACAT,EAAWW,EAASO,SAASC,UACnBD,SAASE,OAAOC,MAAOC,IACnCC,QAAQd,MAAM,4BAA6Ba,GAC3CZ,EAAS,yBAEXT,GAAcD,KACb,CAACA,EAAWS,IAETe,EAAuBP,EAAY,KACvCb,EAAYO,EAASO,SAASf,UAAY,IACzC,IAEGsB,EAAuBR,EAAY,KACvCT,GAAa,GACbE,EAAS,OACR,IAEGgB,EAAcT,EAAY,KAC9BM,QAAQd,MAAM,sCAAuCZ,GACrDW,GAAa,GACbE,EAAS,sBACR,CAACb,IAEE8B,EAAcV,EAAY,KAC9BT,GAAa,GACbE,EAAS,MACLC,EAASO,SACXP,EAASO,QAAQU,QAElB;AAEH,OACEC,EAAC,MAAA,CACCC,UAAWC,EACT,6CACAjC,EAAQ,kBAAoB,2BAG9BkC,SAAA;eAAAC,EAAC,QAAA,CACCC,IAAKvB,EACLwB,IAAKtC,EACLuC,QAAQ,WACRC,iBAAkBb,EAClBc,iBAAkBb,EAClBc,aAAc,IAAMjC,EAAeK,EAASO,SAASb,aAAe,GACpEmC,QAAS,IAAMvC,GAAa,GAC5BwC,QAASf;eAKTO,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,gBAAiBjD,EAAQe,EAAa,mBACtCmC,MAAOlD,EAAQ,QAAUe,EACzBoC,QAAS1C,EAAY,GAAM,GAG5ByB,SAAAzB,iBACC0B,EAACiB,EAAA,CAAQpB,UAAU,yBACjB9B,iBACFiC,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,GAAIlD,EAAcF,EAAY,KAAO;eAGzD0B,EAAC,MAAA,CAAIC,UAAU,uDACbE,SAAA;eAAAH,EAAC,OAAA,CACEG,SAAA,CAAAwB,KAAKC,MAAMpD,EAAc,IAAI,IAC7BmD,KAAKC,MAAMpD,EAAc,IACvBqD,WACAC,SAAS,EAAG;eAEjB1B,EAAC,QACED,SAAAzB,EAAY,QAAU,GAAGiD,KAAKC,MAAMtD,EAAW,OAAOqD,KAAKC,MAAMtD,EAAW,IAAIuD,WAAWC,SAAS,EAAG,mBAQxH"}