@convai/web-sdk 1.8.0-beta.5 → 1.8.0-beta.7
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/README.md +333 -13
- package/dist/core/CharacterRoster.d.ts +84 -0
- package/dist/core/CharacterRoster.d.ts.map +1 -0
- package/dist/core/CharacterRoster.js +348 -0
- package/dist/core/CharacterRoster.js.map +1 -0
- package/dist/core/ConvaiClient.d.ts +152 -2
- package/dist/core/ConvaiClient.d.ts.map +1 -1
- package/dist/core/ConvaiClient.js +1036 -49
- package/dist/core/ConvaiClient.js.map +1 -1
- package/dist/core/ConvaiRoomError.d.ts +48 -0
- package/dist/core/ConvaiRoomError.d.ts.map +1 -0
- package/dist/core/ConvaiRoomError.js +111 -0
- package/dist/core/ConvaiRoomError.js.map +1 -0
- package/dist/core/MessageHandler.d.ts +25 -0
- package/dist/core/MessageHandler.d.ts.map +1 -1
- package/dist/core/MessageHandler.js +431 -30
- package/dist/core/MessageHandler.js.map +1 -1
- package/dist/core/SSESession.d.ts +15 -0
- package/dist/core/SSESession.d.ts.map +1 -1
- package/dist/core/SSESession.js +92 -3
- package/dist/core/SSESession.js.map +1 -1
- package/dist/core/connectRequest.d.ts +38 -2
- package/dist/core/connectRequest.d.ts.map +1 -1
- package/dist/core/connectRequest.js +57 -0
- package/dist/core/connectRequest.js.map +1 -1
- package/dist/core/index.d.ts +6 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +5 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/logicalTurn.d.ts +4 -1
- package/dist/core/logicalTurn.d.ts.map +1 -1
- package/dist/core/logicalTurn.js +35 -4
- package/dist/core/logicalTurn.js.map +1 -1
- package/dist/core/modelOutput.d.ts +40 -0
- package/dist/core/modelOutput.d.ts.map +1 -0
- package/dist/core/modelOutput.js +187 -0
- package/dist/core/modelOutput.js.map +1 -0
- package/dist/core/publishedChat.d.ts +9 -0
- package/dist/core/publishedChat.d.ts.map +1 -0
- package/dist/core/publishedChat.js +13 -0
- package/dist/core/publishedChat.js.map +1 -0
- package/dist/core/rosterRequest.d.ts +57 -0
- package/dist/core/rosterRequest.d.ts.map +1 -0
- package/dist/core/rosterRequest.js +210 -0
- package/dist/core/rosterRequest.js.map +1 -0
- package/dist/core/types.d.ts +667 -10
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/embed/ConvaiChatElement.d.ts +27 -0
- package/dist/embed/ConvaiChatElement.d.ts.map +1 -0
- package/dist/embed/ConvaiChatElement.js +300 -0
- package/dist/embed/ConvaiChatElement.js.map +1 -0
- package/dist/embed/browser.d.ts +3 -0
- package/dist/embed/browser.d.ts.map +1 -0
- package/dist/embed/browser.js +5 -0
- package/dist/embed/browser.js.map +1 -0
- package/dist/embed/chat-embed-v1.js +100 -0
- package/dist/embed/chat-embed-v1.js.map +7 -0
- package/dist/embed/index.d.ts +9 -0
- package/dist/embed/index.d.ts.map +1 -0
- package/dist/embed/index.js +9 -0
- package/dist/embed/index.js.map +1 -0
- package/dist/embed/publicationApi.d.ts +23 -0
- package/dist/embed/publicationApi.d.ts.map +1 -0
- package/dist/embed/publicationApi.js +141 -0
- package/dist/embed/publicationApi.js.map +1 -0
- package/dist/react/components/ConvaiWidget.d.ts +11 -1
- package/dist/react/components/ConvaiWidget.d.ts.map +1 -1
- package/dist/react/components/ConvaiWidget.js +67 -11
- package/dist/react/components/ConvaiWidget.js.map +1 -1
- package/dist/react/components/rtc-widget/components/MarkdownRenderer.d.ts.map +1 -1
- package/dist/react/components/rtc-widget/components/MarkdownRenderer.js +39 -44
- package/dist/react/components/rtc-widget/components/MarkdownRenderer.js.map +1 -1
- package/dist/react/components/rtc-widget/components/conviComponents/SettingsTray.d.ts +1 -1
- package/dist/react/components/rtc-widget/components/conviComponents/SettingsTray.d.ts.map +1 -1
- package/dist/react/components/rtc-widget/components/conviComponents/SettingsTray.js +2 -2
- package/dist/react/components/rtc-widget/components/conviComponents/SettingsTray.js.map +1 -1
- package/dist/react/hooks/useConvaiClient.d.ts +2 -0
- package/dist/react/hooks/useConvaiClient.d.ts.map +1 -1
- package/dist/react/hooks/useConvaiClient.js +16 -0
- package/dist/react/hooks/useConvaiClient.js.map +1 -1
- package/dist/react/index.d.ts +1 -1
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +1 -1
- package/dist/react/index.js.map +1 -1
- package/dist/utils/inlineMarkdown.d.ts +38 -0
- package/dist/utils/inlineMarkdown.d.ts.map +1 -0
- package/dist/utils/inlineMarkdown.js +106 -0
- package/dist/utils/inlineMarkdown.js.map +1 -0
- package/dist/vanilla/AudioRenderer.d.ts.map +1 -1
- package/dist/vanilla/AudioRenderer.js +6 -0
- package/dist/vanilla/AudioRenderer.js.map +1 -1
- package/dist/vanilla/ConvaiWidget.d.ts.map +1 -1
- package/dist/vanilla/ConvaiWidget.js +224 -89
- package/dist/vanilla/ConvaiWidget.js.map +1 -1
- package/dist/vanilla/WidgetEventSubscriptions.d.ts +15 -0
- package/dist/vanilla/WidgetEventSubscriptions.d.ts.map +1 -0
- package/dist/vanilla/WidgetEventSubscriptions.js +37 -0
- package/dist/vanilla/WidgetEventSubscriptions.js.map +1 -0
- package/dist/vanilla/index.d.ts +2 -1
- package/dist/vanilla/index.d.ts.map +1 -1
- package/dist/vanilla/index.js +2 -1
- package/dist/vanilla/index.js.map +1 -1
- package/dist/vanilla/types.d.ts +8 -1
- package/dist/vanilla/types.d.ts.map +1 -1
- package/dist/vanilla/types.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +19 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConvaiWidget.js","sourceRoot":"","sources":["../../../src/react/components/ConvaiWidget.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAe,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACjE,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,cAAc,EAAS,MAAM,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D,qDAAqD;AACrD,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,IAAI,EACJ,WAAW,EACX,MAAM,EACN,KAAK,EACL,WAAW,EACX,cAAc,EACd,OAAO,EACP,MAAM,EACN,cAAc,EACd,KAAK,EACL,YAAY,EACZ,SAAS,EACT,cAAc,EACd,UAAU,EACV,WAAW,GACZ,MAAM,cAAc,CAAC;AAEtB,4BAA4B;AAC5B,OAAO,EACL,WAAW,EACX,YAAY,EACZ,gBAAgB,EAEhB,aAAa,GACd,MAAM,cAAc,CAAC;AAiCtB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,MAAM,CAAC,MAAM,YAAY,GAAgC,CAAC,EACxD,YAAY,EACZ,SAAS,GAAG,IAAI,EAChB,eAAe,GAAG,IAAI,EACtB,gBAAgB,GAAG,IAAI,GACxB,EAAE,EAAE;IACH,sEAAsE;IACtE,MAAM,EACJ,IAAI,EAAE,aAAa,EACnB,KAAK,EAAE,cAAc,EACrB,SAAS,EAAE,kBAAkB,GAC9B,GAAG,gBAAgB,CAClB,YAAY,CAAC,WAAW,IAAI,SAAS,EACrC,YAAY,CAAC,MAAM,IAAI,SAAS,EAChC,YAAY,CAAC,SAAS,IAAI,SAAS,CACpC,CAAC;IAEF,WAAW;IACX,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACjD,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5D,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IACjE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,iCAAiC;IAChF,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5D,MAAM,CAAC,0BAA0B,EAAE,6BAA6B,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEpF,MAAM,iBAAiB,GAAG,MAAM,CAAoB,IAAI,CAAC,CAAC;IAC1D,8HAA8H;IAC9H,MAAM,qBAAqB,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAE5C,yDAAyD;IACzD,MAAM,iBAAiB,GAAG;QACxB,EAAE,EAAE,YAAY,CAAC,WAAW,IAAI,SAAS;QACzC,IAAI,EAAE,aAAa;QACnB,KAAK,EAAE,cAAc;KACtB,CAAC;IAEF,kDAAkD;IAClD,MAAM,iBAAiB,GAAG,GAAG,EAAE;QAC7B,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;YACpC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC,MAAM;QAC5D,CAAC;QACD,IAAI,YAAY,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC;YAChE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC,gBAAgB;QACpE,CAAC;QACD,IAAI,YAAY,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;YACnC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,uBAAuB;QAC1E,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,QAAQ;IAC3D,CAAC,CAAC;IAEF,8BAA8B;IAC9B,MAAM,cAAc,GAAG,GAAqB,EAAE;QAC5C,wEAAwE;QACxE,MAAM,gBAAgB,GAAG,YAAY,CAAC,YAAY,CAAC,MAAM,CACvD,CAAC,GAAG,EAAE,EAAE,CACN,CAAC,GAAG,CAAC,IAAI,KAAK,oBAAoB;YAChC,GAAG,CAAC,IAAI,KAAK,eAAe;YAC5B,GAAG,CAAC,IAAI,KAAK,cAAc;YAC3B,GAAG,CAAC,IAAI,KAAK,YAAY;YACzB,GAAG,CAAC,IAAI,KAAK,aAAa,CAAC;YAC7B,GAAG,CAAC,OAAO,IAAI,wBAAwB;YACvC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAChC,CAAC;QAEF,OAAO,gBAAgB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACpC,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,IAAI,EAAE,GAAG,CAAC,OAAO;YACjB,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;YACjC,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,kBAAkB,CAAC,EAAE,EAAE;gBACxD,IAAI,EAAE,SAAS;gBACf,MAAM,EAAE,SAAS;aAClB,CAAC;YACF,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI;YAClE,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;SACnC,CAAC,CAAC,CAAC;IACN,CAAC,CAAC;IAEF,iBAAiB;IACjB,MAAM,YAAY,GAAG,KAAK,IAAI,EAAE;QAC9B,6DAA6D;QAC7D,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;YACxE,IAAI,CAAC;gBACH,6EAA6E;gBAC7E,IAAI,qBAAqB,CAAC,OAAO,IAAI,OAAO,YAAY,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;oBAClF,MAAM,YAAY,CAAC,SAAS,EAAE,CAAC;gBACjC,CAAC;qBAAM,CAAC;oBACN,MAAM,YAAY,CAAC,OAAO,EAAE,CAAC;gBAC/B,CAAC;gBACD,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,0CAA0C;YAC7D,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;aAAM,CAAC;YACN,8CAA8C;YAC9C,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;QACrB,CAAC;IACH,CAAC,CAAC;IACF,MAAM,WAAW,GAAG,GAAG,EAAE;QACvB,SAAS,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC,CAAC;IAEF,MAAM,iBAAiB,GAAG,CAAC,CAAsC,EAAE,EAAE;QACnE,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,GAAG,EAAE;QACtB,IAAI,UAAU,CAAC,IAAI,EAAE,IAAI,YAAY,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;YACxD,YAAY,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;YAC7C,aAAa,CAAC,EAAE,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,cAAc,GAAG,CAAC,CAAsB,EAAE,EAAE;QAChD,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC;YACtB,UAAU,EAAE,CAAC;QACf,CAAC;IACH,CAAC,CAAC;IAGF,MAAM,gBAAgB,GAAG,GAAG,EAAE;QAC5B,MAAM,aAAa,GAAG,CAAC,OAAO,CAAC;QAE/B,IAAI,YAAY,CAAC,IAAI,EAAE,KAAK,KAAK,WAAW,EAAE,CAAC;YAC7C,uDAAuD;YACvD,MAAM,kBAAkB,GAAG,KAAK,CAAC,IAAI,CACnC,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAC9C,CAAC;YACF,kBAAkB,CAAC,OAAO,CAAC,CAAC,WAAgB,EAAE,EAAE;gBAC9C,WAAW,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,WAAgB,EAAE,EAAE;oBAC9D,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;wBACtB,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;oBAC5C,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,6EAA6E;YAC7E,MAAM,UAAU,GAAG,QAAQ,CAAC,gBAAgB,CAAmB,uBAAuB,CAAC,CAAC;YACxF,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,CAAC;QAED,UAAU,CAAC,aAAa,CAAC,CAAC;IAC5B,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,KAAK,IAAI,EAAE;QAC7B,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAEzB,IAAI,CAAC;YACH,6BAA6B;YAC7B,MAAM,YAAY,CAAC,UAAU,EAAE,CAAC;YAEhC,4DAA4D;YAC5D,YAAY,CAAC,YAAY,EAAE,CAAC;YAE5B,8BAA8B;YAC9B,UAAU,CAAC,KAAK,CAAC,CAAC;YAClB,cAAc,CAAC,KAAK,CAAC,CAAC;YAEtB,yDAAyD;YACzD,qDAAqD;QACvD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,gBAAgB,GAAG,KAAK,IAAI,EAAE;QAClC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACzB,MAAM,YAAY,CAAC,UAAU,EAAE,CAAC;QAEhC,8BAA8B;QAC9B,UAAU,CAAC,KAAK,CAAC,CAAC;QAClB,cAAc,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC,CAAC;IAEF,MAAM,iBAAiB,GAAG,KAAK,IAAI,EAAE;QACnC,0CAA0C;QAC1C,IAAI,YAAY,CAAC,cAAc,KAAK,OAAO,EAAE,CAAC;YAC5C,OAAO,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;YACxE,OAAO;QACT,CAAC;QAED,IAAI,YAAY,CAAC,cAAc,EAAE,CAAC;YAChC,MAAM,YAAY,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC;QAClD,CAAC;aAAM,CAAC;YACN,MAAM,YAAY,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC;QACjD,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,uBAAuB,GAAG,KAAK,IAAI,EAAE;QACzC,MAAM,YAAY,CAAC,mBAAmB,CAAC,iBAAiB,EAAE,CAAC;IAC7D,CAAC,CAAC;IAEF,MAAM,oBAAoB,GAAG,GAAG,EAAE;QAChC,iBAAiB,CAAC,CAAC,cAAc,CAAC,CAAC;IACrC,CAAC,CAAC;IAEF,mGAAmG;IACnG,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,YAAY,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;YACnC,qBAAqB,CAAC,OAAO,GAAG,IAAI,CAAC;QACvC,CAAC;IACH,CAAC,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;IAErC,kCAAkC;IAClC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;YACxE,IAAI,MAAM,EAAE,CAAC;gBACX,SAAS,CAAC,KAAK,CAAC,CAAC;YACnB,CAAC;YACD,gCAAgC;YAChC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,uBAAuB;YAC1C,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,mBAAmB;YAC1C,6BAA6B,CAAC,KAAK,CAAC,CAAC,CAAC,6DAA6D;QACrG,CAAC;IACH,CAAC,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,WAAW,EAAE,YAAY,CAAC,KAAK,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;IAE9E,kDAAkD;IAClD,SAAS,CAAC,GAAG,EAAE;QACb,iBAAiB,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;IACjD,CAAC,EAAE,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC;IAElC,oDAAoD;IACpD,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,cAAc,GAAG,KAAK,IAAI,EAAE;YAChC,IAAI,CAAC,WAAW,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC;gBAC/C,oCAAoC;gBACpC,MAAM,YAAY,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;YAC/C,CAAC;QACH,CAAC,CAAC;QACF,cAAc,EAAE,CAAC;IACnB,CAAC,EAAE,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC;IAEhC,0DAA0D;IAC1D,SAAS,CAAC,GAAG,EAAE;QACb,IACE,MAAM;YACN,gBAAgB;YAChB,YAAY,CAAC,KAAK,CAAC,WAAW;YAC9B,CAAC,0BAA0B;YAC3B,CAAC,WAAW,EACZ,CAAC;YACD,MAAM,cAAc,GAAG,KAAK,IAAI,EAAE;gBAChC,IAAI,CAAC;oBACH,MAAM,YAAY,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC;oBAC/C,cAAc,CAAC,IAAI,CAAC,CAAC;oBACrB,6BAA6B,CAAC,IAAI,CAAC,CAAC;gBACtC,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;gBACtD,CAAC;YACH,CAAC,CAAC;YACF,cAAc,EAAE,CAAC;QACnB,CAAC;IACH,CAAC,EAAE,CAAC,MAAM,EAAE,gBAAgB,EAAE,YAAY,CAAC,KAAK,CAAC,WAAW,EAAE,0BAA0B,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC;IAEtH,uCAAuC;IACvC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,kBAAkB,GAAG,CAAC,KAAiB,EAAE,EAAE;YAC/C,IAAI,cAAc,IAAI,iBAAiB,CAAC,OAAO,EAAE,CAAC;gBAChD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAc,CAAC;gBACpC,MAAM,cAAc,GAAG,iBAAiB,CAAC,OAAO,CAAC;gBACjD,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;oBACrC,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,sBAAsB,CAAC,CAAC;oBACpE,IAAI,YAAY,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;wBACnD,iBAAiB,CAAC,KAAK,CAAC,CAAC;oBAC3B,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC,CAAC;QAEF,IAAI,cAAc,EAAE,CAAC;YACnB,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;QAC7D,CAAC;QACD,OAAO,GAAG,EAAE;YACV,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;QAChE,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC;IAErB,iCAAiC;IACjC,MAAM,YAAY,GAAG,GAAwC,EAAE;QAC7D,IAAI,YAAY,CAAC,KAAK,CAAC,YAAY;YAAE,OAAO,YAAY,CAAC;QACzD,IAAI,YAAY,CAAC,KAAK,CAAC,WAAW;YAAE,OAAO,WAAW,CAAC;QACvD,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,GAAG,EAAE;QACxB,IAAI,YAAY,CAAC,KAAK,CAAC,WAAW;YAAE,OAAO,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,uBAAuB;QACjG,IAAI,YAAY,CAAC,KAAK,CAAC,YAAY;YAAE,OAAO,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,gCAAgC;QAC3G,OAAO,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,gBAAgB;IACxD,CAAC,CAAC;IAEF,gFAAgF;IAChF,MAAM,gBAAgB,GAAG,MAAM,CAAuB,IAAI,CAAC,CAAC;IAE5D,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,YAAY,CAAC,IAAI,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,KAAK,WAAW;YAAE,OAAO;QAE1E,gBAAgB,CAAC,OAAO,GAAG,IAAI,aAAa,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAEhE,OAAO,GAAG,EAAE;YACV,IAAI,gBAAgB,CAAC,OAAO,EAAE,CAAC;gBAC7B,gBAAgB,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;gBACnC,gBAAgB,CAAC,OAAO,GAAG,IAAI,CAAC;YAClC,CAAC;QACH,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;IAExD,OAAO,CACL,MAAC,WAAW,CAAC,QAAQ,IAAC,KAAK,EAAE,YAAY,CAAC,IAAI,EAAE,KAAK,KAAK,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,aAGnG,MAAC,eAAe,IACd,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,EACnC,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EACjC,UAAU,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,aAE9C,MAAC,iBAAiB,IAChB,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,EAC3C,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,EACjD,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,EAC/C,OAAO,EAAE;4BACP,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;4BAChC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;4BACjC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK;yBACzD,EACD,UAAU,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,EAChD,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE,aAGlD,KAAC,aAAa,IACZ,OAAO,EAAE;oCACP,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oCACvB,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;iCACxB,EACD,UAAU,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,YAE7B,KAAC,IAAI,cACH,KAAC,UAAU,IACT,IAAI,EAAC,IAAI,EACT,KAAK,EAAE,YAAY,EAAE,EACrB,OAAO,EAAE,YAAY,CAAC,KAAK,CAAC,YAAY,EACxC,KAAK,EAAE,YAAY,EAAE,GACrB,GACG,GACO,EAGf,YAAY,CAAC,KAAK,CAAC,WAAW,IAAI,CACjC,MAAC,WAAW,IACV,OAAO,EAAE;oCACP,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oCACvB,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG;iCACxB,EACD,UAAU,EAAE;oCACV,QAAQ,EAAE,GAAG;oCACb,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;iCACxB,EACD,KAAK,EAAE;oCACL,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;iCACxC,aAGD,MAAC,MAAM,IACL,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAC/B,OAAO,EAAE;4CACP,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;4CACvB,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;yCACpB,EACD,UAAU,EAAE;4CACV,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;4CACvB,GAAG,cAAc,CAAC,UAAU;yCAC7B,EACD,KAAK,EAAE;4CACL,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;4CACvC,SAAS,EAAE,QAAQ,EAAE,2BAA2B;yCACjD,aAED,KAAC,WAAW,IACV,OAAO,EAAE,WAAW,EACpB,UAAU,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAC1B,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EACxB,UAAU,EAAE,cAAc,CAAC,MAAM,EACjC,KAAK,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,YAEnD,KAAC,WAAW,IAAC,IAAI,EAAC,IAAI,GAAG,GACb,EAEd,MAAC,KAAK,eACH,iBAAiB,CAAC,KAAK,IAAI,CAAC,WAAW,IAAI,CAC1C,KAAC,MAAM,CAAC,GAAG,IAET,GAAG,EAAE,iBAAiB,CAAC,KAAK,EAC5B,GAAG,EAAE,iBAAiB,CAAC,IAAI,EAC3B,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,EACnC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EACjC,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,EAChC,UAAU,EAAE,cAAc,CAAC,OAAO,EAClC,KAAK,EAAE;4DACL,KAAK,EAAE,QAAQ;4DACf,MAAM,EAAE,QAAQ;4DAChB,YAAY,EAAE,KAAK;4DACnB,SAAS,EAAE,OAAO;4DAClB,WAAW,EAAE,QAAQ;4DACrB,MAAM,EAAE,eAAe,iBAAiB,EAAE,CAAC,KAAK,EAAE;4DAClD,SAAS,EAAE,WAAW,iBAAiB,EAAE,CAAC,KAAK,IAAI;4DACnD,UAAU,EAAE,eAAe;yDAC5B,IAhBG,eAAe,CAAC,wDAAwD;qDAiB5E,CACH,EACA,iBAAiB,CAAC,IAAI,EACvB,KAAC,MAAM,CAAC,MAAM,IACZ,OAAO,EAAE,gBAAgB,EACzB,UAAU,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAC1B,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EACxB,UAAU,EAAE,cAAc,CAAC,MAAM,EACjC,KAAK,EAAE;4DACL,MAAM,EAAE,SAAS;4DACjB,aAAa,EAAE,MAAM;4DACrB,UAAU,EAAE,aAAa;4DACzB,MAAM,EAAE,MAAM;4DACd,SAAS,EAAE,MAAM;4DACjB,KAAK,EAAE,MAAM;4DACb,MAAM,EAAE,MAAM;4DACd,OAAO,EAAE,GAAG;4DACZ,OAAO,EAAE,aAAa;4DACtB,UAAU,EAAE,QAAQ;4DACpB,UAAU,EAAE,QAAQ;4DACpB,OAAO,EAAE,MAAM;yDAChB,gBACW,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EACvC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,YAEjC,OAAO,CAAC,CAAC,CAAC,CACT,KAAC,YAAY,IAAC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAC,WAAW,GAAG,CAC7C,CAAC,CAAC,CAAC,CACF,KAAC,YAAY,IAAC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAC,SAAS,GAAG,CAC3C,GACa,EACf,WAAW,IAAI,CACd,eACE,KAAK,EAAE;4DACL,QAAQ,EAAE,MAAM;4DAChB,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK;4DACpC,UAAU,EAAE,GAAG;4DACf,UAAU,EAAE,KAAK;4DACjB,OAAO,EAAE,SAAS;4DAClB,YAAY,EAAE,KAAK;4DACnB,eAAe,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI;yDACtD,sBAGI,CACR,EACA,YAAY,CAAC,KAAK,CAAC,UAAU,IAAI,CAChC,MAAC,MAAM,CAAC,IAAI,IACV,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,EACnC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EACjC,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,EAChC,UAAU,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,EAC7B,KAAK,EAAE;4DACL,QAAQ,EAAE,MAAM;4DAChB,KAAK,EAAE,SAAS;4DAChB,UAAU,EAAE,GAAG;4DACf,UAAU,EAAE,KAAK;4DACjB,OAAO,EAAE,SAAS;4DAClB,YAAY,EAAE,KAAK;4DACnB,eAAe,EAAE,WAAW;4DAC5B,MAAM,EAAE,qBAAqB;4DAC7B,OAAO,EAAE,aAAa;4DACtB,UAAU,EAAE,QAAQ;4DACpB,GAAG,EAAE,KAAK;yDACX,aAED,KAAC,MAAM,CAAC,IAAI,IACV,OAAO,EAAE;oEACP,KAAK,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;oEAClB,OAAO,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;iEACrB,EACD,UAAU,EAAE;oEACV,QAAQ,EAAE,GAAG;oEACb,MAAM,EAAE,QAAQ;oEAChB,IAAI,EAAE,WAAW;iEAClB,EACD,KAAK,EAAE;oEACL,KAAK,EAAE,KAAK;oEACZ,MAAM,EAAE,KAAK;oEACb,YAAY,EAAE,KAAK;oEACnB,eAAe,EAAE,SAAS;oEAC1B,OAAO,EAAE,cAAc;iEACxB,GACD,gBAEU,CACf,EACA,YAAY,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,UAAU,IAAI,CACnE,MAAC,MAAM,CAAC,IAAI,IACV,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,EACnC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EACjC,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,EAChC,UAAU,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,EAC7B,KAAK,EAAE;4DACL,QAAQ,EAAE,MAAM;4DAChB,KAAK,EAAE,SAAS;4DAChB,UAAU,EAAE,GAAG;4DACf,UAAU,EAAE,KAAK;4DACjB,OAAO,EAAE,SAAS;4DAClB,YAAY,EAAE,KAAK;4DACnB,eAAe,EAAE,WAAW;4DAC5B,MAAM,EAAE,qBAAqB;4DAC7B,OAAO,EAAE,aAAa;4DACtB,UAAU,EAAE,QAAQ;4DACpB,GAAG,EAAE,KAAK;yDACX,aAED,KAAC,MAAM,CAAC,IAAI,IACV,OAAO,EAAE;oEACP,KAAK,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;oEAClB,OAAO,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;iEACrB,EACD,UAAU,EAAE;oEACV,QAAQ,EAAE,GAAG;oEACb,MAAM,EAAE,QAAQ;oEAChB,IAAI,EAAE,WAAW;iEAClB,EACD,KAAK,EAAE;oEACL,KAAK,EAAE,KAAK;oEACZ,MAAM,EAAE,KAAK;oEACb,YAAY,EAAE,KAAK;oEACnB,eAAe,EAAE,SAAS;oEAC1B,OAAO,EAAE,cAAc;iEACxB,GACD,iBAEU,CACf,IACK,EAER,cACE,KAAK,EAAE;oDACL,OAAO,EAAE,MAAM;oDACf,UAAU,EAAE,QAAQ;oDACpB,GAAG,EAAE,QAAQ;oDACb,QAAQ,EAAE,UAAU;iDACrB,YAED,KAAC,cAAc,IACb,GAAG,EAAE,iBAAiB,EACtB,OAAO,EAAE,oBAAoB,EAC7B,UAAU,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAC1B,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EACxB,UAAU,EAAE,cAAc,CAAC,MAAM,EACjC,KAAK,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,YAE5B,KAAC,cAAc,IAAC,IAAI,EAAE,EAAE,GAAI,GACb,GACb,IACC,EAGT,MAAC,OAAO,IACN,KAAK,EAAE;4CACL,UAAU,EAAE,WAAW;gDACrB,CAAC,CAAC,2BAA2B;gDAC7B,CAAC,CAAC,aAAa;4CACjB,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM;4CAC7C,QAAQ,EAAE,UAAU;yCACrB,aAGD,KAAC,eAAe,cACb,YAAY,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,YAAY,CAAC,UAAU,IAAI,CAC7D,MAAC,MAAM,CAAC,GAAG,IACT,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EACvB,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EACvB,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EACpB,UAAU,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,EAC7B,KAAK,EAAE;wDACL,QAAQ,EAAE,UAAU;wDACpB,GAAG,EAAE,CAAC;wDACN,IAAI,EAAE,CAAC;wDACP,KAAK,EAAE,CAAC;wDACR,MAAM,EAAE,CAAC;wDACT,OAAO,EAAE,MAAM;wDACf,aAAa,EAAE,QAAQ;wDACvB,UAAU,EAAE,QAAQ;wDACpB,cAAc,EAAE,QAAQ;wDACxB,eAAe,EAAE,2BAA2B;wDAC5C,MAAM,EAAE,GAAG;wDACX,GAAG,EAAE,MAAM;qDACZ,aAED,KAAC,MAAM,CAAC,GAAG,IACT,OAAO,EAAE;gEACP,MAAM,EAAE,GAAG;6DACZ,EACD,UAAU,EAAE;gEACV,QAAQ,EAAE,CAAC;gEACX,MAAM,EAAE,QAAQ;gEAChB,IAAI,EAAE,QAAQ;6DACf,YAED,KAAC,UAAU,IACT,IAAI,EAAC,IAAI,EACT,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EACpC,KAAK,EAAC,YAAY,GAClB,GACS,EACb,MAAC,MAAM,CAAC,GAAG,IACT,OAAO,EAAE;gEACP,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC;6DACvB,EACD,UAAU,EAAE;gEACV,QAAQ,EAAE,CAAC;gEACX,MAAM,EAAE,QAAQ;gEAChB,IAAI,EAAE,WAAW;6DAClB,EACD,KAAK,EAAE;gEACL,QAAQ,EAAE,MAAM;gEAChB,UAAU,EAAE,GAAG;gEACf,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS;6DACvC,+BAEc,iBAAiB,CAAC,IAAI,WAC1B,IACF,CACd,GACe,EAEjB,WAAW,IAAI,CACd,KAAC,gBAAgB,IACf,QAAQ,EAAE,CAAC,YAAY,CAAC,YAAY,EACpC,SAAS,EAAE,YAAY,CAAC,KAAK,CAAC,UAAU,EACxC,WAAW,EAAE,YAAY,CAAC,KAAK,CAAC,WAAW,EAC3C,YAAY,EAAE,IAAI,EAClB,cAAc,EAAE,cAAc,IAAI,SAAS,EAC3C,aAAa,EAAE,aAAa,IAAI,SAAS,EACzC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,KAAK,KAAK,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GACzE,CACH,EACA,CAAC,WAAW,IAAI,CACf,KAAC,WAAW,IACV,QAAQ,EAAE,cAAc,EAAE,EAC1B,WAAW,EAAE,YAAY,CAAC,KAAK,CAAC,UAAU,EAC1C,kBAAkB,EAAE,GAAG,MAAM,IAAI,YAAY,CAAC,YAAY,CAAC,MAAM,EAAE,GACnE,CACH,IACO,EAGV,KAAC,MAAM,IACL,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EAC9B,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EAC7B,UAAU,EAAE;4CACV,KAAK,EAAE,GAAG;4CACV,GAAG,cAAc,CAAC,UAAU;yCAC7B,EACD,KAAK,EAAE;4CACL,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM;4CAC7C,UAAU,EAAE,kBAAkB;4CAC9B,OAAO,EAAE,MAAM;4CACf,GAAG,EAAE,QAAQ;4CACb,UAAU,EAAE,QAAQ;4CACpB,QAAQ,EAAE,UAAU;4CACpB,cAAc,EAAE,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY;4CACrD,SAAS,EAAE,QAAQ,EAAE,2BAA2B;yCACjD,YAGA,WAAW,CAAC,CAAC,CAAC,CACb,KAAC,MAAM,CAAC,MAAM,IAEZ,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,EACnC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EACjC,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,EAChC,UAAU,EAAE;gDACV,QAAQ,EAAE,GAAG;gDACb,IAAI,EAAE,SAAS;6CAChB,EACD,OAAO,EAAE,KAAK,IAAI,EAAE;gDAClB,YAAY,CAAC,oBAAoB,EAAE,CAAC;gDACpC,MAAM,YAAY,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;gDAC7C,yDAAyD;gDACzD,gEAAgE;gDAChE,IAAI,YAAY,CAAC,IAAI,EAAE,KAAK,KAAK,WAAW,EAAE,CAAC;oDAC7C,YAAY,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;gDAChC,CAAC;gDACD,cAAc,CAAC,KAAK,CAAC,CAAC;4CACxB,CAAC,EACD,UAAU,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAC1B,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EACxB,KAAK,EAAE;gDACL,MAAM,EAAE,SAAS;gDACjB,eAAe,EAAE,SAAS;gDAC1B,KAAK,EAAE,SAAS;gDAChB,MAAM,EAAE,MAAM;gDACd,YAAY,EAAE,KAAK;gDACnB,KAAK,EAAE,SAAS;gDAChB,MAAM,EAAE,SAAS;gDACjB,QAAQ,EAAE,SAAS;gDACnB,SAAS,EAAE,SAAS;gDACpB,OAAO,EAAE,MAAM;gDACf,UAAU,EAAE,QAAQ;gDACpB,cAAc,EAAE,QAAQ;gDACxB,UAAU,EAAE,CAAC;gDACb,OAAO,EAAE,CAAC;gDACV,OAAO,EAAE,MAAM;6CAChB,gBACU,iBAAiB,EAC5B,KAAK,EAAC,iBAAiB,YAEvB,KAAC,UAAU,IAAC,IAAI,EAAE,EAAE,GAAI,IAxCpB,iBAAiB,CAyCP,CACjB,CAAC,CAAC,CAAC,CACF,4BAEE,MAAC,cAAc,IAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,aAEtD,KAAC,KAAK,IACJ,IAAI,EAAC,MAAM,EACX,WAAW,EAAC,cAAc,EAC1B,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,iBAAiB,EAC3B,UAAU,EAAE,cAAc,EAC1B,KAAK,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,GAClC,EAGF,cACE,KAAK,EAAE;4DACL,QAAQ,EAAE,UAAU;4DACpB,KAAK,EAAE,UAAU;4DACjB,GAAG,EAAE,KAAK;4DACV,SAAS,EAAE,kBAAkB;4DAC7B,KAAK,EAAE,SAAS;4DAChB,MAAM,EAAE,SAAS;4DACjB,QAAQ,EAAE,SAAS;4DACnB,SAAS,EAAE,SAAS;4DACpB,UAAU,EAAE,CAAC;4DACb,QAAQ,EAAE,SAAS;4DACnB,OAAO,EAAE,MAAM;4DACf,UAAU,EAAE,QAAQ;4DACpB,cAAc,EAAE,QAAQ;4DACxB,MAAM,EAAE,CAAC;yDACV,YAED,KAAC,eAAe,IAAC,IAAI,EAAC,MAAM,YACzB,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CACvB,KAAC,YAAY,IAEX,OAAO,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,EACtB,OAAO,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,EACpB,IAAI,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,EACpB,UAAU,EAAE;oEACV,QAAQ,EAAE,GAAG;oEACb,IAAI,EAAE,QAAQ;iEACf,EACD,OAAO,EAAE,UAAU,EACnB,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EACxB,KAAK,EAAE;oEACL,QAAQ,EAAE,UAAU;oEACpB,GAAG,EAAE,CAAC;oEACN,IAAI,EAAE,CAAC;oEACP,MAAM,EAAE,SAAS;iEAClB,YAED,KAAC,MAAM,IAAC,IAAI,EAAE,EAAE,GAAI,IAjBhB,MAAM,CAkBG,CAChB,CAAC,CAAC,CAAC,CACF,KAAC,MAAM,CAAC,MAAM,IAEZ,OAAO,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,EACtB,OAAO,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,EACpB,IAAI,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,EACpB,UAAU,EAAE;oEACV,QAAQ,EAAE,GAAG;oEACb,IAAI,EAAE,QAAQ;iEACf,EACD,OAAO,EAAE,KAAK,IAAI,EAAE;oEAClB,YAAY,CAAC,oBAAoB,EAAE,CAAC;oEACpC,mDAAmD;oEACnD,IAAI,YAAY,CAAC,IAAI,EAAE,KAAK,KAAK,WAAW,EAAE,CAAC;wEAC7C,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;oEAC/B,CAAC;oEACD,MAAM,YAAY,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC;oEAC/C,cAAc,CAAC,IAAI,CAAC,CAAC;gEACvB,CAAC,EACD,UAAU,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAC1B,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EACxB,KAAK,EAAE;oEACL,QAAQ,EAAE,UAAU;oEACpB,GAAG,EAAE,CAAC;oEACN,IAAI,EAAE,CAAC;oEACP,MAAM,EAAE,SAAS;oEACjB,eAAe,EAAE,aAAa;oEAC9B,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO;oEACpC,MAAM,EAAE,aAAa,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;oEACpD,YAAY,EAAE,KAAK;oEACnB,KAAK,EAAE,SAAS;oEAChB,MAAM,EAAE,SAAS;oEACjB,QAAQ,EAAE,SAAS;oEACnB,SAAS,EAAE,SAAS;oEACpB,OAAO,EAAE,MAAM;oEACf,UAAU,EAAE,QAAQ;oEACpB,cAAc,EAAE,QAAQ;oEACxB,UAAU,EAAE,CAAC;oEACb,OAAO,EAAE,CAAC;oEACV,OAAO,EAAE,MAAM;iEAChB,gBACU,kBAAkB,EAC7B,KAAK,EAAC,gBAAgB,YAEtB,KAAC,UAAU,IAAC,IAAI,EAAE,EAAE,GAAI,IA1CpB,OAAO,CA2CG,CACjB,GACe,GACd,IACS,GAChB,CACJ,GACM,IACG,CACf,IACiB,EAGnB,YAAY,CAAC,KAAK,CAAC,WAAW,IAAI,CACjC,KAAC,YAAY,IACX,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,WAAW,EACpB,YAAY,EAAE,gBAAgB,EAC9B,aAAa,EACX,YAAY,CAAC,cAAc,KAAK,OAAO,IAAI,SAAS;4BAClD,CAAC,CAAC,iBAAiB;4BACnB,CAAC,CAAC,SAAS,EAEf,cAAc,EAAE,cAAc,EAC9B,mBAAmB,EACjB,YAAY,CAAC,cAAc,KAAK,OAAO,IAAI,eAAe;4BACxD,CAAC,CAAC,uBAAuB;4BACzB,CAAC,CAAC,SAAS,EAEf,mBAAmB,EACjB,YAAY,CAAC,mBAAmB,GAElC,CACH,IACe,EAGjB,YAAY,CAAC,IAAI,EAAE,KAAK,KAAK,WAAW,IAAI,CAC3C,KAAC,aAAa,IACZ,SAAS,EAAE,cAAc,EACzB,OAAO,EAAE,KAAK,IAAI,EAAE;oBAClB,MAAM,YAAY,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC;gBAClD,CAAC,EACD,MAAM,EAAE,IAAI,GACZ,CACH,IACoB,CACxB,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { useCallback, useState, useRef, useEffect } from \"react\";\nimport { motion, AnimatePresence } from \"framer-motion\";\nimport { FiMoreVertical, FiMic, FiSend, FiPhoneOff } from \"react-icons/fi\";\nimport { IoVolumeMute, IoVolumeHigh } from \"react-icons/io5\";\nimport { PiWaveform } from \"react-icons/pi\";\nimport type { IConvaiClient } from \"../../core/types\";\nimport { RoomContext } from \"@livekit/components-react\";\nimport { useCharacterInfo } from \"../hooks/useCharacterInfo\";\nimport { AudioRenderer } from \"../../vanilla/AudioRenderer\";\n\n// Import styled components and theme from rtc-widget\nimport {\n ConvaiContainer,\n MorphingContainer,\n ButtonContent,\n Logo,\n ChatContent,\n Header,\n Title,\n CloseButton,\n SettingsButton,\n Content,\n Footer,\n InputContainer,\n Input,\n ActionButton,\n aeroTheme,\n iosTransitions,\n ConvaiLogo,\n ChevronDown,\n} from \"./rtc-widget\";\n\n// Import message components\nimport {\n MessageList,\n SettingsTray,\n VoiceModeOverlay,\n RTCChatMessage,\n FloatingVideo,\n} from \"./rtc-widget\";\n\ninterface Character {\n id: string;\n name?: string;\n image?: string;\n}\n\ninterface ConvaiWidgetProps {\n /** Convai client instance (required) */\n convaiClient: IConvaiClient & { \n activity?: string;\n isAudioMuted: boolean;\n isVideoEnabled: boolean;\n isScreenShareActive: boolean;\n };\n /**\n * Show video toggle button in settings (default: true).\n * Only works if connection type is \"video\". If false, hides the video button.\n */\n showVideo?: boolean;\n /**\n * Show screen share toggle button in settings (default: true).\n * Only works if connection type is \"video\". If false, hides the screen share button.\n */\n showScreenShare?: boolean;\n /**\n * Start in voice mode by default when widget opens (default: true).\n * When true, the widget will open directly in voice mode with microphone enabled.\n */\n defaultVoiceMode?: boolean;\n}\n\n/**\n * ConvaiWidget - A consolidated chat widget component for real-time conversations\n *\n * This component provides a complete UI for interacting with Convai characters.\n * Connection configuration should be handled via useConvaiClient.connect().\n *\n * Features:\n * - Collapsed circular button with status indicator\n * - Expandable/collapsible chat interface\n * - Voice mode support\n * - Real-time message streaming\n * - Audio controls (mute/unmute)\n * - Settings tray with session reset\n * - Optional video and screen share (when connection type supports it)\n *\n * @param {ConvaiWidgetProps} props - Component props\n * @param {ConvaiClient} props.convaiClient - Convai client instance (required)\n * @param {boolean} props.showVideo - Show video toggle in settings (default: true)\n * @param {boolean} props.showScreenShare - Show screen share toggle in settings (default: true)\n * @param {boolean} props.defaultVoiceMode - Start in voice mode when widget opens (default: true)\n *\n * @example\n * ```tsx\n * function App() {\n * const convaiClient = useConvaiClient({\n * apiKey: 'your-api-key',\n * characterId: 'your-character-id',\n * enableVideo: true,\n * });\n *\n * return (\n * <ConvaiWidget\n * convaiClient={convaiClient}\n * showVideo={true}\n * showScreenShare={true}\n * />\n * );\n * }\n * ```\n */\nexport const ConvaiWidget: React.FC<ConvaiWidgetProps> = ({\n convaiClient,\n showVideo = true,\n showScreenShare = true,\n defaultVoiceMode = true,\n}) => {\n // Fetch character information dynamically from client's stored values\n const {\n name: characterName,\n image: characterImage,\n isLoading: isCharacterLoading,\n } = useCharacterInfo(\n convaiClient.characterId || undefined,\n convaiClient.apiKey || undefined,\n convaiClient.authToken || undefined,\n );\n\n // UI State\n const [isOpen, setIsOpen] = useState(false);\n const [inputValue, setInputValue] = useState(\"\");\n const [isSettingsOpen, setIsSettingsOpen] = useState(false);\n const [isVoiceMode, setIsVoiceMode] = useState(defaultVoiceMode);\n const [isMuted, setIsMuted] = useState(false); // Character audio starts unmuted\n const [isVideoVisible, setIsVideoVisible] = useState(false);\n const [hasEnteredDefaultVoiceMode, setHasEnteredDefaultVoiceMode] = useState(false);\n\n const settingsButtonRef = useRef<HTMLButtonElement>(null);\n /** True after we have connected at least once; used to call reconnect() instead of connect() when opening after disconnect */\n const hasConnectedBeforeRef = useRef(false);\n\n // Character info from API (using client's stored values)\n const selectedCharacter = {\n id: convaiClient.characterId || \"unknown\",\n name: characterName,\n image: characterImage,\n };\n\n // Get bot status color for character image border\n const getBotStatusColor = () => {\n if (!convaiClient.state.isConnected) {\n return { color: \"#ef4444\", label: \"Disconnected\" }; // Red\n }\n if (convaiClient.state.isConnecting || !convaiClient.isBotReady) {\n return { color: \"#f59e0b\", label: \"Connecting\" }; // Yellow/Orange\n }\n if (convaiClient.state.isListening) {\n return { color: \"#3b82f6\", label: \"Listening\" }; // Blue - user speaking\n }\n return { color: \"#10b981\", label: \"Connected\" }; // Green\n };\n\n // Format chat messages for UI\n const formatMessages = (): RTCChatMessage[] => {\n // Filter to only show relevant message types and exclude empty messages\n const filteredMessages = convaiClient.chatMessages.filter(\n (msg) =>\n (msg.type === \"user-transcription\" ||\n msg.type === \"user-llm-text\" ||\n msg.type === \"bot-llm-text\" ||\n msg.type === \"bot-output\" ||\n msg.type === \"bot-emotion\") &&\n msg.content && // Ensure content exists\n msg.content.trim().length > 0, // Ensure content is not empty or just whitespace\n );\n\n return filteredMessages.map((msg) => ({\n id: msg.id,\n text: msg.content,\n isUser: msg.type.includes(\"user\"),\n timestamp: new Date(msg.timestamp).toLocaleTimeString([], {\n hour: \"2-digit\",\n minute: \"2-digit\",\n }),\n sender: msg.type.includes(\"user\") ? \"You\" : selectedCharacter.name,\n showLogo: msg.type.includes(\"bot\"),\n }));\n };\n\n // Event Handlers\n const handleToggle = async () => {\n // Connect on first click if not already connected/connecting\n if (!convaiClient.state.isConnected && !convaiClient.state.isConnecting) {\n try {\n // Use reconnect when opening again after a disconnect (reuses stored config)\n if (hasConnectedBeforeRef.current && typeof convaiClient.reconnect === \"function\") {\n await convaiClient.reconnect();\n } else {\n await convaiClient.connect();\n }\n setIsOpen(true); // Open widget after successful connection\n } catch (error) {\n console.error(\"Failed to connect:\", error);\n }\n } else {\n // Just toggle open/close if already connected\n setIsOpen(!isOpen);\n }\n };\n const handleClose = () => {\n setIsOpen(false);\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setInputValue(e.target.value);\n };\n\n const handleSend = () => {\n if (inputValue.trim() && convaiClient.state.isConnected) {\n convaiClient.sendUserTextMessage(inputValue);\n setInputValue(\"\");\n }\n };\n\n const handleKeyPress = (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\") {\n handleSend();\n }\n };\n\n\n const handleToggleMute = () => {\n const newMutedState = !isMuted;\n\n if (convaiClient.room?.state === \"connected\") {\n // LiveKit: mute/unmute remote participant audio tracks\n const remoteParticipants = Array.from(\n convaiClient.room.remoteParticipants.values(),\n );\n remoteParticipants.forEach((participant: any) => {\n participant.audioTrackPublications.forEach((publication: any) => {\n if (publication.track) {\n publication.track.setMuted(newMutedState);\n }\n });\n });\n } else {\n // WebSocket: mute/unmute the hidden <audio> element added by useConvaiClient\n const wsAudioEls = document.querySelectorAll<HTMLAudioElement>(\"audio[data-convai-ws]\");\n wsAudioEls.forEach((el) => { el.muted = newMutedState; });\n }\n\n setIsMuted(newMutedState);\n };\n\n const handleReset = async () => {\n setIsSettingsOpen(false);\n\n try {\n // Disconnect current session\n await convaiClient.disconnect();\n\n // Reset session ID so next connection creates a new session\n convaiClient.resetSession();\n\n // Reset UI states immediately\n setIsMuted(false);\n setIsVoiceMode(false);\n\n // Note: User is responsible for reconnecting after reset\n // They should call convaiClient.connect() themselves\n } catch (error) {\n console.error(\"Failed to reset:\", error);\n }\n };\n\n const handleDisconnect = async () => {\n setIsSettingsOpen(false);\n await convaiClient.disconnect();\n\n // Reset UI states immediately\n setIsMuted(false);\n setIsVoiceMode(false);\n };\n\n const handleToggleVideo = async () => {\n // Only toggle if connection type is video\n if (convaiClient.connectionType !== \"video\") {\n console.warn(\"Video capability requires connection type to be 'video'\");\n return;\n }\n\n if (convaiClient.isVideoEnabled) {\n await convaiClient.videoControls.disableVideo();\n } else {\n await convaiClient.videoControls.enableVideo();\n }\n };\n\n const handleToggleScreenShare = async () => {\n await convaiClient.screenShareControls.toggleScreenShare();\n };\n\n const handleSettingsToggle = () => {\n setIsSettingsOpen(!isSettingsOpen);\n };\n\n // Remember that we have connected at least once (so we use reconnect() next time after disconnect)\n useEffect(() => {\n if (convaiClient.state.isConnected) {\n hasConnectedBeforeRef.current = true;\n }\n }, [convaiClient.state.isConnected]);\n\n // Auto-collapse when disconnected\n useEffect(() => {\n if (!convaiClient.state.isConnected && !convaiClient.state.isConnecting) {\n if (isOpen) {\n setIsOpen(false);\n }\n // Reset UI states on disconnect\n setIsMuted(false); // Reset character mute\n setIsVoiceMode(false); // Reset voice mode\n setHasEnteredDefaultVoiceMode(false); // Reset flag so voice mode can be entered again on reconnect\n }\n }, [convaiClient.state.isConnected, convaiClient.state.isConnecting, isOpen]);\n\n // Sync video visibility with video controls state\n useEffect(() => {\n setIsVideoVisible(convaiClient.isVideoEnabled);\n }, [convaiClient.isVideoEnabled]);\n\n // Ensure microphone is muted when not in voice mode\n useEffect(() => {\n const ensureMicState = async () => {\n if (!isVoiceMode && !convaiClient.isAudioMuted) {\n // Mute microphone when in text mode\n await convaiClient.audioControls.muteAudio();\n }\n };\n ensureMicState();\n }, [isVoiceMode, convaiClient]);\n\n // Handle default voice mode when widget opens (only once)\n useEffect(() => {\n if (\n isOpen &&\n defaultVoiceMode &&\n convaiClient.state.isConnected &&\n !hasEnteredDefaultVoiceMode &&\n !isVoiceMode\n ) {\n const enterVoiceMode = async () => {\n try {\n await convaiClient.audioControls.unmuteAudio();\n setIsVoiceMode(true);\n setHasEnteredDefaultVoiceMode(true);\n } catch (error) {\n console.error(\"Failed to enter voice mode:\", error);\n }\n };\n enterVoiceMode();\n }\n }, [isOpen, defaultVoiceMode, convaiClient.state.isConnected, hasEnteredDefaultVoiceMode, isVoiceMode, convaiClient]);\n\n // Close settings when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (isSettingsOpen && settingsButtonRef.current) {\n const target = event.target as Node;\n const settingsButton = settingsButtonRef.current;\n if (!settingsButton.contains(target)) {\n const settingsTray = document.querySelector(\"[data-settings-tray]\");\n if (settingsTray && !settingsTray.contains(target)) {\n setIsSettingsOpen(false);\n }\n }\n }\n };\n\n if (isSettingsOpen) {\n document.addEventListener(\"mousedown\", handleClickOutside);\n }\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [isSettingsOpen]);\n\n // Determine logo state and color\n const getLogoState = (): \"idle\" | \"connecting\" | \"connected\" => {\n if (convaiClient.state.isConnecting) return \"connecting\";\n if (convaiClient.state.isConnected) return \"connected\";\n return \"idle\";\n };\n\n const getLogoColor = () => {\n if (convaiClient.state.isConnected) return aeroTheme.colors.primary[500]; // Green when connected\n if (convaiClient.state.isConnecting) return aeroTheme.colors.primary[300]; // Lighter green when connecting\n return aeroTheme.colors.primary[500]; // Default green\n };\n\n // Audio renderer for LiveKit direct audio playback (not used in WebSocket mode)\n const audioRendererRef = useRef<AudioRenderer | null>(null);\n\n useEffect(() => {\n if (!convaiClient.room || convaiClient.room.state !== \"connected\") return;\n\n audioRendererRef.current = new AudioRenderer(convaiClient.room);\n\n return () => {\n if (audioRendererRef.current) {\n audioRendererRef.current.destroy();\n audioRendererRef.current = null;\n }\n };\n }, [convaiClient.room, convaiClient.state.isConnected]);\n\n return (\n <RoomContext.Provider value={convaiClient.room?.state === \"connected\" ? convaiClient.room : undefined}>\n\n {/* Convai Widget Chat UI - Always visible */}\n <ConvaiContainer\n initial={{ opacity: 0, scale: 0.8 }}\n animate={{ opacity: 1, scale: 1 }}\n transition={{ duration: 0.4, ease: \"easeOut\" }}\n >\n <MorphingContainer\n onClick={!isOpen ? handleToggle : undefined}\n whileHover={!isOpen ? { scale: 1.05 } : undefined}\n whileTap={!isOpen ? { scale: 0.95 } : undefined}\n animate={{\n width: isOpen ? \"400px\" : \"4rem\",\n height: isOpen ? \"600px\" : \"4rem\",\n borderRadius: isOpen ? aeroTheme.borderRadius.xl : \"50%\",\n }}\n transition={{ duration: 0.3, ease: \"easeInOut\" }}\n style={{ cursor: !isOpen ? \"pointer\" : \"default\" }}\n >\n {/* Button Content - fades out when chat opens */}\n <ButtonContent\n animate={{\n opacity: isOpen ? 0 : 1,\n scale: isOpen ? 0.8 : 1,\n }}\n transition={{ duration: 0.3 }}\n >\n <Logo>\n <ConvaiLogo\n size=\"xl\"\n color={getLogoColor()}\n animate={convaiClient.state.isConnecting}\n state={getLogoState()}\n />\n </Logo>\n </ButtonContent>\n\n {/* Chat Content - fades in when chat opens (only show if connected) */}\n {convaiClient.state.isConnected && (\n <ChatContent\n animate={{\n opacity: isOpen ? 1 : 0,\n scale: isOpen ? 1 : 0.8,\n }}\n transition={{\n duration: 0.2,\n delay: isOpen ? 0.2 : 0,\n }}\n style={{\n pointerEvents: isOpen ? \"auto\" : \"none\",\n }}\n >\n {/* Header */}\n <Header\n initial={{ opacity: 0, y: -20 }}\n animate={{\n opacity: isOpen ? 1 : 0,\n y: isOpen ? 0 : -20,\n }}\n transition={{\n delay: isOpen ? 0.4 : 0,\n ...iosTransitions.modalSlide,\n }}\n style={{ \n pointerEvents: isOpen ? \"auto\" : \"none\",\n minHeight: \"3.5rem\", // Ensure consistent height\n }}\n >\n <CloseButton\n onClick={handleClose}\n whileHover={{ scale: 1.1 }}\n whileTap={{ scale: 0.9 }}\n transition={iosTransitions.snappy}\n style={{ cursor: \"pointer\", pointerEvents: \"auto\" }}\n >\n <ChevronDown size=\"md\" />\n </CloseButton>\n\n <Title>\n {selectedCharacter.image && !isVoiceMode && (\n <motion.img\n key=\"header-avatar\" // Use key instead of layoutId for independent animation\n src={selectedCharacter.image}\n alt={selectedCharacter.name}\n initial={{ scale: 0.8, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n exit={{ scale: 0.8, opacity: 0 }}\n transition={iosTransitions.fadePop}\n style={{\n width: \"1.5rem\",\n height: \"1.5rem\",\n borderRadius: \"50%\",\n objectFit: \"cover\",\n marginRight: \"0.5rem\",\n border: `1.5px solid ${getBotStatusColor().color}`,\n boxShadow: `0 0 6px ${getBotStatusColor().color}40`,\n transition: \"all 0.3s ease\",\n }}\n />\n )}\n {selectedCharacter.name}\n <motion.button\n onClick={handleToggleMute}\n whileHover={{ scale: 1.1 }}\n whileTap={{ scale: 0.9 }}\n transition={iosTransitions.snappy}\n style={{\n cursor: \"pointer\",\n pointerEvents: \"auto\",\n background: \"transparent\",\n border: \"none\",\n boxShadow: \"none\",\n width: \"auto\",\n height: \"auto\",\n padding: \"0\",\n display: \"inline-flex\",\n alignItems: \"center\",\n marginLeft: \"0.5rem\",\n outline: \"none\",\n }}\n aria-label={isMuted ? \"Unmute\" : \"Mute\"}\n title={isMuted ? \"Unmute\" : \"Mute\"}\n >\n {isMuted ? (\n <IoVolumeMute size={16} color=\"#919EABA6\" />\n ) : (\n <IoVolumeHigh size={16} color=\"#0E7360\" />\n )}\n </motion.button>\n {isVoiceMode && (\n <span\n style={{\n fontSize: \"10px\",\n color: aeroTheme.colors.convai.light,\n fontWeight: 500,\n marginLeft: \"8px\",\n padding: \"2px 6px\",\n borderRadius: \"4px\",\n backgroundColor: aeroTheme.colors.convai.light + \"20\",\n }}\n >\n VOICE\n </span>\n )}\n {convaiClient.state.isSpeaking && (\n <motion.span\n initial={{ scale: 0.8, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n exit={{ scale: 0.8, opacity: 0 }}\n transition={{ duration: 0.2 }}\n style={{\n fontSize: \"10px\",\n color: \"#10b981\",\n fontWeight: 600,\n marginLeft: \"8px\",\n padding: \"3px 8px\",\n borderRadius: \"6px\",\n backgroundColor: \"#10b98120\",\n border: \"1px solid #10b98140\",\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"4px\",\n }}\n >\n <motion.span\n animate={{\n scale: [1, 1.2, 1],\n opacity: [1, 0.7, 1],\n }}\n transition={{\n duration: 1.5,\n repeat: Infinity,\n ease: \"easeInOut\",\n }}\n style={{\n width: \"6px\",\n height: \"6px\",\n borderRadius: \"50%\",\n backgroundColor: \"#10b981\",\n display: \"inline-block\",\n }}\n />\n SPEAKING\n </motion.span>\n )}\n {convaiClient.state.isListening && !convaiClient.state.isSpeaking && (\n <motion.span\n initial={{ scale: 0.8, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n exit={{ scale: 0.8, opacity: 0 }}\n transition={{ duration: 0.2 }}\n style={{\n fontSize: \"10px\",\n color: \"#3b82f6\",\n fontWeight: 600,\n marginLeft: \"8px\",\n padding: \"3px 8px\",\n borderRadius: \"6px\",\n backgroundColor: \"#3b82f620\",\n border: \"1px solid #3b82f640\",\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"4px\",\n }}\n >\n <motion.span\n animate={{\n scale: [1, 1.2, 1],\n opacity: [1, 0.7, 1],\n }}\n transition={{\n duration: 1.5,\n repeat: Infinity,\n ease: \"easeInOut\",\n }}\n style={{\n width: \"6px\",\n height: \"6px\",\n borderRadius: \"50%\",\n backgroundColor: \"#3b82f6\",\n display: \"inline-block\",\n }}\n />\n LISTENING\n </motion.span>\n )}\n </Title>\n\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.5rem\",\n position: \"relative\",\n }}\n >\n <SettingsButton\n ref={settingsButtonRef}\n onClick={handleSettingsToggle}\n whileHover={{ scale: 1.1 }}\n whileTap={{ scale: 0.9 }}\n transition={iosTransitions.snappy}\n style={{ cursor: \"pointer\" }}\n >\n <FiMoreVertical size={20} />\n </SettingsButton>\n </div>\n </Header>\n\n {/* Content Area */}\n <Content\n style={{\n background: isVoiceMode\n ? \"rgba(255, 255, 255, 0.98)\"\n : \"transparent\",\n filter: isSettingsOpen ? \"blur(3px)\" : \"none\",\n position: \"relative\",\n }}\n >\n {/* Connecting Overlay - shown until bot is ready */}\n <AnimatePresence>\n {convaiClient.state.isConnected && !convaiClient.isBotReady && (\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.3 }}\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: \"rgba(255, 255, 255, 0.95)\",\n zIndex: 100,\n gap: \"1rem\",\n }}\n >\n <motion.div\n animate={{\n rotate: 360,\n }}\n transition={{\n duration: 2,\n repeat: Infinity,\n ease: \"linear\",\n }}\n >\n <ConvaiLogo\n size=\"xl\"\n color={aeroTheme.colors.convai.light}\n state=\"connecting\"\n />\n </motion.div>\n <motion.div\n animate={{\n opacity: [0.5, 1, 0.5],\n }}\n transition={{\n duration: 2,\n repeat: Infinity,\n ease: \"easeInOut\",\n }}\n style={{\n fontSize: \"14px\",\n fontWeight: 500,\n color: aeroTheme.colors.text.secondary,\n }}\n >\n Connecting to {selectedCharacter.name}...\n </motion.div>\n </motion.div>\n )}\n </AnimatePresence>\n\n {isVoiceMode && (\n <VoiceModeOverlay\n isActive={!convaiClient.isAudioMuted}\n isTalking={convaiClient.state.isSpeaking}\n isListening={convaiClient.state.isListening}\n convaiClient={null}\n characterImage={characterImage || undefined}\n characterName={characterName || undefined}\n room={convaiClient.room?.state === \"connected\" ? convaiClient.room : null}\n />\n )}\n {!isVoiceMode && (\n <MessageList\n messages={formatMessages()}\n isStreaming={convaiClient.state.isSpeaking}\n forceToBottomToken={`${isOpen}-${convaiClient.chatMessages.length}`}\n />\n )}\n </Content>\n\n {/* Footer */}\n <Footer\n initial={{ y: 20, opacity: 0 }}\n animate={{ y: 0, opacity: 1 }}\n transition={{\n delay: 0.7,\n ...iosTransitions.modalSlide,\n }}\n style={{\n filter: isSettingsOpen ? \"blur(3px)\" : \"none\",\n transition: \"filter 0.2s ease\",\n display: \"flex\",\n gap: \"0.5rem\",\n alignItems: \"center\",\n position: \"relative\",\n justifyContent: isVoiceMode ? \"center\" : \"flex-start\",\n minHeight: \"3.5rem\", // Ensure consistent height\n }}\n >\n {/* In Voice Mode: Show only centered exit button */}\n {isVoiceMode ? (\n <motion.button\n key=\"voice-mode-exit\"\n initial={{ scale: 0.8, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n exit={{ scale: 0.8, opacity: 0 }}\n transition={{\n duration: 0.3,\n ease: \"easeOut\",\n }}\n onClick={async () => {\n convaiClient.sendInterruptMessage();\n await convaiClient.audioControls.muteAudio();\n // WebSocket: tell server to stop processing audio so the\n // character doesn't prompt \"tap microphone to talk\" on silence.\n if (convaiClient.room?.state !== \"connected\") {\n convaiClient.toggleStt(false);\n }\n setIsVoiceMode(false);\n }}\n whileHover={{ scale: 1.1 }}\n whileTap={{ scale: 0.9 }}\n style={{\n cursor: \"pointer\",\n backgroundColor: \"#ef4444\",\n color: \"#ffffff\",\n border: \"none\",\n borderRadius: \"50%\",\n width: \"2.25rem\",\n height: \"2.25rem\",\n minWidth: \"2.25rem\",\n minHeight: \"2.25rem\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n padding: 0,\n outline: \"none\",\n }}\n aria-label=\"Exit Voice Mode\"\n title=\"Exit voice mode\"\n >\n <FiPhoneOff size={20} />\n </motion.button>\n ) : (\n <>\n {/* Input Container */}\n <InputContainer style={{ flex: 1, position: \"relative\" }}>\n {/* Input field */}\n <Input\n type=\"text\"\n placeholder=\"Conversation\"\n value={inputValue}\n onChange={handleInputChange}\n onKeyPress={handleKeyPress}\n style={{ paddingRight: \"2.75rem\" }}\n />\n\n {/* Send/Voice Mode button */}\n <div\n style={{\n position: \"absolute\",\n right: \"0.375rem\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n width: \"2.25rem\",\n height: \"2.25rem\",\n minWidth: \"2.25rem\",\n minHeight: \"2.25rem\",\n flexShrink: 0,\n overflow: \"visible\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n zIndex: 2,\n }}\n >\n <AnimatePresence mode=\"wait\">\n {inputValue.length > 0 ? (\n <ActionButton\n key=\"send\"\n initial={{ y: \"100%\" }}\n animate={{ y: \"0%\" }}\n exit={{ y: \"-100%\" }}\n transition={{\n duration: 0.1,\n ease: \"linear\",\n }}\n onClick={handleSend}\n whileTap={{ scale: 0.9 }}\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n cursor: \"pointer\",\n }}\n >\n <FiSend size={20} />\n </ActionButton>\n ) : (\n <motion.button\n key=\"voice\"\n initial={{ y: \"100%\" }}\n animate={{ y: \"0%\" }}\n exit={{ y: \"-100%\" }}\n transition={{\n duration: 0.1,\n ease: \"linear\",\n }}\n onClick={async () => {\n convaiClient.sendInterruptMessage();\n // WebSocket: re-enable server STT before unmuting.\n if (convaiClient.room?.state !== \"connected\") {\n convaiClient.toggleStt(true);\n }\n await convaiClient.audioControls.unmuteAudio();\n setIsVoiceMode(true);\n }}\n whileHover={{ scale: 1.1 }}\n whileTap={{ scale: 0.9 }}\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n cursor: \"pointer\",\n backgroundColor: \"transparent\",\n color: aeroTheme.colors.text.primary,\n border: `1px solid ${aeroTheme.colors.neutral[300]}`,\n borderRadius: \"50%\",\n width: \"2.25rem\",\n height: \"2.25rem\",\n minWidth: \"2.25rem\",\n minHeight: \"2.25rem\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n padding: 0,\n outline: \"none\",\n }}\n aria-label=\"Enter Voice Mode\"\n title=\"Use voice mode\"\n >\n <PiWaveform size={20} />\n </motion.button>\n )}\n </AnimatePresence>\n </div>\n </InputContainer>\n </>\n )}\n </Footer>\n </ChatContent>\n )}\n </MorphingContainer>\n\n {/* Settings Tray - only show when connected */}\n {convaiClient.state.isConnected && (\n <SettingsTray\n isOpen={isSettingsOpen}\n onReset={handleReset}\n onDisconnect={handleDisconnect}\n onToggleVideo={\n convaiClient.connectionType === \"video\" && showVideo\n ? handleToggleVideo\n : undefined\n }\n isVideoVisible={isVideoVisible}\n onToggleScreenShare={\n convaiClient.connectionType === \"video\" && showScreenShare\n ? handleToggleScreenShare\n : undefined\n }\n isScreenShareActive={\n convaiClient.isScreenShareActive\n }\n />\n )}\n </ConvaiContainer>\n\n {/* Floating Video - only rendered in LiveKit mode (requires RoomContext) */}\n {convaiClient.room?.state === \"connected\" && (\n <FloatingVideo\n isVisible={isVideoVisible}\n onClose={async () => {\n await convaiClient.videoControls.disableVideo();\n }}\n mirror={true}\n />\n )}\n </RoomContext.Provider>\n );\n};\n"]}
|
|
1
|
+
{"version":3,"file":"ConvaiWidget.js","sourceRoot":"","sources":["../../../src/react/components/ConvaiWidget.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useCallback, useState, useRef, useEffect } from \"react\";\nimport { motion, AnimatePresence } from \"framer-motion\";\nimport { FiMoreVertical, FiMic, FiSend, FiPhoneOff } from \"react-icons/fi\";\nimport { IoVolumeMute, IoVolumeHigh } from \"react-icons/io5\";\nimport { PiWaveform } from \"react-icons/pi\";\nimport type {\n IConvaiClient,\n PublishedChatConnectOptions,\n} from \"../../core/types\";\nimport { RoomContext } from \"@livekit/components-react\";\nimport { useCharacterInfo } from \"../hooks/useCharacterInfo\";\nimport { AudioRenderer } from \"../../vanilla/AudioRenderer\";\nimport type { PublishedChatDescriptor } from \"../../embed/publicationApi\";\nimport { freshPublicationGrantOptions } from \"../../core/publishedChat\";\n\n// Import styled components and theme from rtc-widget\nimport {\n ConvaiContainer,\n MorphingContainer,\n ButtonContent,\n Logo,\n ChatContent,\n Header,\n Title,\n CloseButton,\n SettingsButton,\n Content,\n Footer,\n InputContainer,\n Input,\n ActionButton,\n aeroTheme,\n iosTransitions,\n ConvaiLogo,\n ChevronDown,\n} from \"./rtc-widget\";\n\n// Import message components\nimport {\n MessageList,\n SettingsTray,\n VoiceModeOverlay,\n RTCChatMessage,\n FloatingVideo,\n} from \"./rtc-widget\";\n\ninterface Character {\n id: string;\n name?: string;\n image?: string;\n}\n\ninterface ConvaiWidgetProps {\n /** Convai client instance (required) */\n convaiClient: IConvaiClient & { \n activity?: string;\n isAudioMuted: boolean;\n isVideoEnabled: boolean;\n isScreenShareActive: boolean;\n };\n /**\n * Show video toggle button in settings (default: true).\n * Only works if connection type is \"video\". If false, hides the video button.\n */\n showVideo?: boolean;\n /**\n * Show screen share toggle button in settings (default: true).\n * Only works if connection type is \"video\". If false, hides the screen share button.\n */\n showScreenShare?: boolean;\n /**\n * Start in voice mode by default when widget opens (default: true).\n * When true, the widget will open directly in voice mode with microphone enabled.\n */\n defaultVoiceMode?: boolean;\n /**\n * Mint a fresh single-use grant when a published-chat session is reopened.\n * Required when using this widget with connectWithPublicationGrant().\n */\n requestPublicationGrant?: () => Promise<string>;\n /** Core endpoint override used with requestPublicationGrant. */\n publishedChatConnectOptions?: PublishedChatConnectOptions;\n /** Public descriptor used to label a credential-free published session. */\n publishedChatDescriptor?: Pick<\n PublishedChatDescriptor,\n \"display_name\" | \"image_url\"\n >;\n}\n\n/**\n * ConvaiWidget - A consolidated chat widget component for real-time conversations\n *\n * This component provides a complete UI for interacting with Convai characters.\n * Connection configuration should be handled via useConvaiClient.connect().\n *\n * Features:\n * - Collapsed circular button with status indicator\n * - Expandable/collapsible chat interface\n * - Voice mode support\n * - Real-time message streaming\n * - Audio controls (mute/unmute)\n * - Settings tray with session reset\n * - Optional video and screen share (when connection type supports it)\n *\n * @param {ConvaiWidgetProps} props - Component props\n * @param {ConvaiClient} props.convaiClient - Convai client instance (required)\n * @param {boolean} props.showVideo - Show video toggle in settings (default: true)\n * @param {boolean} props.showScreenShare - Show screen share toggle in settings (default: true)\n * @param {boolean} props.defaultVoiceMode - Start in voice mode when widget opens (default: true)\n *\n * @example\n * ```tsx\n * function App() {\n * const convaiClient = useConvaiClient({\n * apiKey: 'your-api-key',\n * characterId: 'your-character-id',\n * enableVideo: true,\n * });\n *\n * return (\n * <ConvaiWidget\n * convaiClient={convaiClient}\n * showVideo={true}\n * showScreenShare={true}\n * />\n * );\n * }\n * ```\n */\nexport const ConvaiWidget: React.FC<ConvaiWidgetProps> = ({\n convaiClient,\n showVideo = true,\n showScreenShare = true,\n defaultVoiceMode = true,\n requestPublicationGrant,\n publishedChatConnectOptions,\n publishedChatDescriptor,\n}) => {\n const isTextOnly =\n Boolean(requestPublicationGrant) || convaiClient.connectionType === \"text\";\n // Fetch character information dynamically from client's stored values\n const {\n name: fetchedCharacterName,\n image: fetchedCharacterImage,\n isLoading: isFetchedCharacterLoading,\n } = useCharacterInfo(\n convaiClient.characterId || undefined,\n convaiClient.apiKey || undefined,\n convaiClient.authToken || undefined,\n );\n const characterName =\n publishedChatDescriptor?.display_name || fetchedCharacterName;\n const characterImage =\n publishedChatDescriptor?.image_url ?? fetchedCharacterImage;\n const isCharacterLoading = publishedChatDescriptor\n ? false\n : isFetchedCharacterLoading;\n\n // UI State\n const [isOpen, setIsOpen] = useState(false);\n const [inputValue, setInputValue] = useState(\"\");\n const [isSettingsOpen, setIsSettingsOpen] = useState(false);\n const [isVoiceMode, setIsVoiceMode] = useState(\n defaultVoiceMode && !isTextOnly,\n );\n const [isMuted, setIsMuted] = useState(false); // Character audio starts unmuted\n const [isVideoVisible, setIsVideoVisible] = useState(false);\n const [hasEnteredDefaultVoiceMode, setHasEnteredDefaultVoiceMode] = useState(false);\n\n const settingsButtonRef = useRef<HTMLButtonElement>(null);\n /** True after we have connected at least once; used to call reconnect() instead of connect() when opening after disconnect */\n const hasConnectedBeforeRef = useRef(false);\n /** Prevent repeated open clicks from minting multiple one-time publication grants. */\n const isStartingConnectionRef = useRef(false);\n /** Avoid opening a room after this widget has been removed from the tree. */\n const isUnmountedRef = useRef(false);\n\n // Only published sessions wait for Core's bot-ready handshake. A normal\n // authenticated text session still uses the text-only layout, but can send\n // as soon as it connects.\n const requiresBotReadyForText =\n Boolean(requestPublicationGrant) || convaiClient.isPublishedChatSession;\n const canSendText =\n convaiClient.state.isConnected &&\n (!requiresBotReadyForText || convaiClient.isBotReady);\n\n // Character info from API (using client's stored values)\n const selectedCharacter = {\n id: convaiClient.characterId || \"unknown\",\n name: characterName,\n image: characterImage,\n };\n\n // Get bot status color for character image border\n const getBotStatusColor = () => {\n if (!convaiClient.state.isConnected) {\n return { color: \"#ef4444\", label: \"Disconnected\" }; // Red\n }\n if (convaiClient.state.isConnecting || !convaiClient.isBotReady) {\n return { color: \"#f59e0b\", label: \"Connecting\" }; // Yellow/Orange\n }\n if (convaiClient.state.isListening) {\n return { color: \"#3b82f6\", label: \"Listening\" }; // Blue - user speaking\n }\n return { color: \"#10b981\", label: \"Connected\" }; // Green\n };\n\n // Format chat messages for UI\n const formatMessages = (): RTCChatMessage[] => {\n // Filter to only show relevant message types and exclude empty messages\n const filteredMessages = convaiClient.chatMessages.filter(\n (msg) =>\n (msg.type === \"user-transcription\" ||\n msg.type === \"user-llm-text\" ||\n msg.type === \"bot-llm-text\" ||\n msg.type === \"bot-output\" ||\n msg.type === \"bot-emotion\") &&\n msg.content && // Ensure content exists\n msg.content.trim().length > 0, // Ensure content is not empty or just whitespace\n );\n\n return filteredMessages.map((msg) => ({\n id: msg.id,\n text: msg.content,\n isUser: msg.type.includes(\"user\"),\n timestamp: new Date(msg.timestamp).toLocaleTimeString([], {\n hour: \"2-digit\",\n minute: \"2-digit\",\n }),\n sender: msg.type.includes(\"user\") ? \"You\" : selectedCharacter.name,\n showLogo: msg.type.includes(\"bot\"),\n }));\n };\n\n // Event Handlers\n const handleToggle = async () => {\n if (isStartingConnectionRef.current) {\n return;\n }\n\n // Connect on first click if not already connected/connecting\n if (!convaiClient.state.isConnected && !convaiClient.state.isConnecting) {\n isStartingConnectionRef.current = true;\n try {\n if (requestPublicationGrant || convaiClient.isPublishedChatSession) {\n if (!requestPublicationGrant) {\n throw new Error(\n \"Published chat widgets require requestPublicationGrant to start a new session\",\n );\n }\n if (!convaiClient.connectWithPublicationGrant) {\n throw new Error(\n \"This Convai client does not support published chat connections\",\n );\n }\n const launchToken = await requestPublicationGrant();\n if (isUnmountedRef.current) return;\n await convaiClient.connectWithPublicationGrant(\n launchToken,\n freshPublicationGrantOptions(publishedChatConnectOptions),\n );\n } else if (\n hasConnectedBeforeRef.current &&\n typeof convaiClient.reconnect === \"function\"\n ) {\n await convaiClient.reconnect();\n } else {\n await convaiClient.connect();\n }\n if (isUnmountedRef.current) {\n await convaiClient.disconnect();\n return;\n }\n setIsOpen(true); // Open widget after successful connection\n } catch (error) {\n console.error(\"Failed to connect:\", error);\n } finally {\n isStartingConnectionRef.current = false;\n }\n } else {\n // Just toggle open/close if already connected\n setIsOpen(!isOpen);\n }\n };\n const handleClose = () => {\n setIsOpen(false);\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setInputValue(e.target.value);\n };\n\n const handleSend = () => {\n if (inputValue.trim() && canSendText) {\n convaiClient.sendUserTextMessage(inputValue);\n setInputValue(\"\");\n }\n };\n\n const handleKeyPress = (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\") {\n handleSend();\n }\n };\n\n\n const handleToggleMute = () => {\n const newMutedState = !isMuted;\n\n if (convaiClient.room?.state === \"connected\") {\n // LiveKit: mute/unmute remote participant audio tracks\n const remoteParticipants = Array.from(\n convaiClient.room.remoteParticipants.values(),\n );\n remoteParticipants.forEach((participant: any) => {\n participant.audioTrackPublications.forEach((publication: any) => {\n if (publication.track) {\n publication.track.setMuted(newMutedState);\n }\n });\n });\n } else {\n // WebSocket: mute/unmute the hidden <audio> element added by useConvaiClient\n const wsAudioEls = document.querySelectorAll<HTMLAudioElement>(\"audio[data-convai-ws]\");\n wsAudioEls.forEach((el) => { el.muted = newMutedState; });\n }\n\n setIsMuted(newMutedState);\n };\n\n const handleReset = async () => {\n setIsSettingsOpen(false);\n\n try {\n // Disconnect current session\n await convaiClient.disconnect();\n\n // Reset session ID so next connection creates a new session\n convaiClient.resetSession();\n\n // Reset UI states immediately\n setIsMuted(false);\n setIsVoiceMode(false);\n\n // Note: User is responsible for reconnecting after reset\n // They should call convaiClient.connect() themselves\n } catch (error) {\n console.error(\"Failed to reset:\", error);\n }\n };\n\n const handleDisconnect = async () => {\n setIsSettingsOpen(false);\n await convaiClient.disconnect();\n\n // Reset UI states immediately\n setIsMuted(false);\n setIsVoiceMode(false);\n };\n\n const handleToggleVideo = async () => {\n // Only toggle if connection type is video\n if (convaiClient.connectionType !== \"video\") {\n console.warn(\"Video capability requires connection type to be 'video'\");\n return;\n }\n\n if (convaiClient.isVideoEnabled) {\n await convaiClient.videoControls.disableVideo();\n } else {\n await convaiClient.videoControls.enableVideo();\n }\n };\n\n const handleToggleScreenShare = async () => {\n await convaiClient.screenShareControls.toggleScreenShare();\n };\n\n const handleSettingsToggle = () => {\n setIsSettingsOpen(!isSettingsOpen);\n };\n\n useEffect(() => {\n isUnmountedRef.current = false;\n return () => {\n isUnmountedRef.current = true;\n };\n }, []);\n\n // Remember that we have connected at least once (so we use reconnect() next time after disconnect)\n useEffect(() => {\n if (convaiClient.state.isConnected) {\n hasConnectedBeforeRef.current = true;\n }\n }, [convaiClient.state.isConnected]);\n\n // Auto-collapse when disconnected\n useEffect(() => {\n if (!convaiClient.state.isConnected && !convaiClient.state.isConnecting) {\n if (isOpen) {\n setIsOpen(false);\n }\n // Reset UI states on disconnect\n setIsMuted(false); // Reset character mute\n setIsVoiceMode(false); // Reset voice mode\n setHasEnteredDefaultVoiceMode(false); // Reset flag so voice mode can be entered again on reconnect\n }\n }, [convaiClient.state.isConnected, convaiClient.state.isConnecting, isOpen]);\n\n // Sync video visibility with video controls state\n useEffect(() => {\n setIsVideoVisible(convaiClient.isVideoEnabled);\n }, [convaiClient.isVideoEnabled]);\n\n // Ensure microphone is muted when not in voice mode\n useEffect(() => {\n if (isTextOnly && isVoiceMode) {\n setIsVoiceMode(false);\n }\n }, [isTextOnly, isVoiceMode]);\n\n useEffect(() => {\n const ensureMicState = async () => {\n if (!isVoiceMode && !convaiClient.isAudioMuted) {\n // Mute microphone when in text mode\n await convaiClient.audioControls.muteAudio();\n }\n };\n ensureMicState();\n }, [isVoiceMode, convaiClient]);\n\n // Handle default voice mode when widget opens (only once)\n useEffect(() => {\n if (\n isOpen &&\n defaultVoiceMode &&\n !isTextOnly &&\n convaiClient.state.isConnected &&\n !hasEnteredDefaultVoiceMode &&\n !isVoiceMode\n ) {\n const enterVoiceMode = async () => {\n try {\n await convaiClient.audioControls.unmuteAudio();\n setIsVoiceMode(true);\n setHasEnteredDefaultVoiceMode(true);\n } catch (error) {\n console.error(\"Failed to enter voice mode:\", error);\n }\n };\n enterVoiceMode();\n }\n }, [isOpen, defaultVoiceMode, isTextOnly, convaiClient.state.isConnected, hasEnteredDefaultVoiceMode, isVoiceMode, convaiClient]);\n\n // Close settings when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (isSettingsOpen && settingsButtonRef.current) {\n const target = event.target as Node;\n const settingsButton = settingsButtonRef.current;\n if (!settingsButton.contains(target)) {\n const settingsTray = document.querySelector(\"[data-settings-tray]\");\n if (settingsTray && !settingsTray.contains(target)) {\n setIsSettingsOpen(false);\n }\n }\n }\n };\n\n if (isSettingsOpen) {\n document.addEventListener(\"mousedown\", handleClickOutside);\n }\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [isSettingsOpen]);\n\n // Determine logo state and color\n const getLogoState = (): \"idle\" | \"connecting\" | \"connected\" => {\n if (convaiClient.state.isConnecting) return \"connecting\";\n if (convaiClient.state.isConnected) return \"connected\";\n return \"idle\";\n };\n\n const getLogoColor = () => {\n if (convaiClient.state.isConnected) return aeroTheme.colors.primary[500]; // Green when connected\n if (convaiClient.state.isConnecting) return aeroTheme.colors.primary[300]; // Lighter green when connecting\n return aeroTheme.colors.primary[500]; // Default green\n };\n\n // Audio renderer for LiveKit direct audio playback (not used in WebSocket mode)\n const audioRendererRef = useRef<AudioRenderer | null>(null);\n\n useEffect(() => {\n if (!convaiClient.room || convaiClient.room.state !== \"connected\") return;\n\n audioRendererRef.current = new AudioRenderer(convaiClient.room);\n\n return () => {\n if (audioRendererRef.current) {\n audioRendererRef.current.destroy();\n audioRendererRef.current = null;\n }\n };\n }, [convaiClient.room, convaiClient.state.isConnected]);\n\n return (\n <RoomContext.Provider value={convaiClient.room?.state === \"connected\" ? convaiClient.room : undefined}>\n\n {/* Convai Widget Chat UI - Always visible */}\n <ConvaiContainer\n initial={{ opacity: 0, scale: 0.8 }}\n animate={{ opacity: 1, scale: 1 }}\n transition={{ duration: 0.4, ease: \"easeOut\" }}\n >\n <MorphingContainer\n onClick={!isOpen ? handleToggle : undefined}\n whileHover={!isOpen ? { scale: 1.05 } : undefined}\n whileTap={!isOpen ? { scale: 0.95 } : undefined}\n animate={{\n width: isOpen ? \"400px\" : \"4rem\",\n height: isOpen ? \"600px\" : \"4rem\",\n borderRadius: isOpen ? aeroTheme.borderRadius.xl : \"50%\",\n }}\n transition={{ duration: 0.3, ease: \"easeInOut\" }}\n style={{ cursor: !isOpen ? \"pointer\" : \"default\" }}\n >\n {/* Button Content - fades out when chat opens */}\n <ButtonContent\n animate={{\n opacity: isOpen ? 0 : 1,\n scale: isOpen ? 0.8 : 1,\n }}\n transition={{ duration: 0.3 }}\n >\n <Logo>\n <ConvaiLogo\n size=\"xl\"\n color={getLogoColor()}\n animate={convaiClient.state.isConnecting}\n state={getLogoState()}\n />\n </Logo>\n </ButtonContent>\n\n {/* Chat Content - fades in when chat opens (only show if connected) */}\n {convaiClient.state.isConnected && (\n <ChatContent\n animate={{\n opacity: isOpen ? 1 : 0,\n scale: isOpen ? 1 : 0.8,\n }}\n transition={{\n duration: 0.2,\n delay: isOpen ? 0.2 : 0,\n }}\n style={{\n pointerEvents: isOpen ? \"auto\" : \"none\",\n }}\n >\n {/* Header */}\n <Header\n initial={{ opacity: 0, y: -20 }}\n animate={{\n opacity: isOpen ? 1 : 0,\n y: isOpen ? 0 : -20,\n }}\n transition={{\n delay: isOpen ? 0.4 : 0,\n ...iosTransitions.modalSlide,\n }}\n style={{ \n pointerEvents: isOpen ? \"auto\" : \"none\",\n minHeight: \"3.5rem\", // Ensure consistent height\n }}\n >\n <CloseButton\n onClick={handleClose}\n whileHover={{ scale: 1.1 }}\n whileTap={{ scale: 0.9 }}\n transition={iosTransitions.snappy}\n style={{ cursor: \"pointer\", pointerEvents: \"auto\" }}\n >\n <ChevronDown size=\"md\" />\n </CloseButton>\n\n <Title>\n {selectedCharacter.image && !isVoiceMode && (\n <motion.img\n key=\"header-avatar\" // Use key instead of layoutId for independent animation\n src={selectedCharacter.image}\n alt={selectedCharacter.name}\n initial={{ scale: 0.8, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n exit={{ scale: 0.8, opacity: 0 }}\n transition={iosTransitions.fadePop}\n style={{\n width: \"1.5rem\",\n height: \"1.5rem\",\n borderRadius: \"50%\",\n objectFit: \"cover\",\n marginRight: \"0.5rem\",\n border: `1.5px solid ${getBotStatusColor().color}`,\n boxShadow: `0 0 6px ${getBotStatusColor().color}40`,\n transition: \"all 0.3s ease\",\n }}\n />\n )}\n {selectedCharacter.name}\n <motion.button\n onClick={handleToggleMute}\n whileHover={{ scale: 1.1 }}\n whileTap={{ scale: 0.9 }}\n transition={iosTransitions.snappy}\n style={{\n cursor: \"pointer\",\n pointerEvents: \"auto\",\n background: \"transparent\",\n border: \"none\",\n boxShadow: \"none\",\n width: \"auto\",\n height: \"auto\",\n padding: \"0\",\n display: \"inline-flex\",\n alignItems: \"center\",\n marginLeft: \"0.5rem\",\n outline: \"none\",\n }}\n aria-label={isMuted ? \"Unmute\" : \"Mute\"}\n title={isMuted ? \"Unmute\" : \"Mute\"}\n >\n {isMuted ? (\n <IoVolumeMute size={16} color=\"#919EABA6\" />\n ) : (\n <IoVolumeHigh size={16} color=\"#0E7360\" />\n )}\n </motion.button>\n {isVoiceMode && (\n <span\n style={{\n fontSize: \"10px\",\n color: aeroTheme.colors.convai.light,\n fontWeight: 500,\n marginLeft: \"8px\",\n padding: \"2px 6px\",\n borderRadius: \"4px\",\n backgroundColor: aeroTheme.colors.convai.light + \"20\",\n }}\n >\n VOICE\n </span>\n )}\n {convaiClient.state.isSpeaking && (\n <motion.span\n initial={{ scale: 0.8, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n exit={{ scale: 0.8, opacity: 0 }}\n transition={{ duration: 0.2 }}\n style={{\n fontSize: \"10px\",\n color: \"#10b981\",\n fontWeight: 600,\n marginLeft: \"8px\",\n padding: \"3px 8px\",\n borderRadius: \"6px\",\n backgroundColor: \"#10b98120\",\n border: \"1px solid #10b98140\",\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"4px\",\n }}\n >\n <motion.span\n animate={{\n scale: [1, 1.2, 1],\n opacity: [1, 0.7, 1],\n }}\n transition={{\n duration: 1.5,\n repeat: Infinity,\n ease: \"easeInOut\",\n }}\n style={{\n width: \"6px\",\n height: \"6px\",\n borderRadius: \"50%\",\n backgroundColor: \"#10b981\",\n display: \"inline-block\",\n }}\n />\n SPEAKING\n </motion.span>\n )}\n {convaiClient.state.isListening && !convaiClient.state.isSpeaking && (\n <motion.span\n initial={{ scale: 0.8, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n exit={{ scale: 0.8, opacity: 0 }}\n transition={{ duration: 0.2 }}\n style={{\n fontSize: \"10px\",\n color: \"#3b82f6\",\n fontWeight: 600,\n marginLeft: \"8px\",\n padding: \"3px 8px\",\n borderRadius: \"6px\",\n backgroundColor: \"#3b82f620\",\n border: \"1px solid #3b82f640\",\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"4px\",\n }}\n >\n <motion.span\n animate={{\n scale: [1, 1.2, 1],\n opacity: [1, 0.7, 1],\n }}\n transition={{\n duration: 1.5,\n repeat: Infinity,\n ease: \"easeInOut\",\n }}\n style={{\n width: \"6px\",\n height: \"6px\",\n borderRadius: \"50%\",\n backgroundColor: \"#3b82f6\",\n display: \"inline-block\",\n }}\n />\n LISTENING\n </motion.span>\n )}\n </Title>\n\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.5rem\",\n position: \"relative\",\n }}\n >\n <SettingsButton\n ref={settingsButtonRef}\n onClick={handleSettingsToggle}\n whileHover={{ scale: 1.1 }}\n whileTap={{ scale: 0.9 }}\n transition={iosTransitions.snappy}\n style={{ cursor: \"pointer\" }}\n >\n <FiMoreVertical size={20} />\n </SettingsButton>\n </div>\n </Header>\n\n {/* Content Area */}\n <Content\n style={{\n background: isVoiceMode\n ? \"rgba(255, 255, 255, 0.98)\"\n : \"transparent\",\n filter: isSettingsOpen ? \"blur(3px)\" : \"none\",\n position: \"relative\",\n }}\n >\n {/* Connecting Overlay - shown until bot is ready */}\n <AnimatePresence>\n {convaiClient.state.isConnected && !convaiClient.isBotReady && (\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.3 }}\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: \"rgba(255, 255, 255, 0.95)\",\n zIndex: 100,\n gap: \"1rem\",\n }}\n >\n <motion.div\n animate={{\n rotate: 360,\n }}\n transition={{\n duration: 2,\n repeat: Infinity,\n ease: \"linear\",\n }}\n >\n <ConvaiLogo\n size=\"xl\"\n color={aeroTheme.colors.convai.light}\n state=\"connecting\"\n />\n </motion.div>\n <motion.div\n animate={{\n opacity: [0.5, 1, 0.5],\n }}\n transition={{\n duration: 2,\n repeat: Infinity,\n ease: \"easeInOut\",\n }}\n style={{\n fontSize: \"14px\",\n fontWeight: 500,\n color: aeroTheme.colors.text.secondary,\n }}\n >\n Connecting to {selectedCharacter.name}...\n </motion.div>\n </motion.div>\n )}\n </AnimatePresence>\n\n {isVoiceMode && (\n <VoiceModeOverlay\n isActive={!convaiClient.isAudioMuted}\n isTalking={convaiClient.state.isSpeaking}\n isListening={convaiClient.state.isListening}\n convaiClient={null}\n characterImage={characterImage || undefined}\n characterName={characterName || undefined}\n room={convaiClient.room?.state === \"connected\" ? convaiClient.room : null}\n />\n )}\n {!isVoiceMode && (\n <MessageList\n messages={formatMessages()}\n isStreaming={convaiClient.state.isSpeaking}\n forceToBottomToken={`${isOpen}-${convaiClient.chatMessages.length}`}\n />\n )}\n </Content>\n\n {/* Footer */}\n <Footer\n initial={{ y: 20, opacity: 0 }}\n animate={{ y: 0, opacity: 1 }}\n transition={{\n delay: 0.7,\n ...iosTransitions.modalSlide,\n }}\n style={{\n filter: isSettingsOpen ? \"blur(3px)\" : \"none\",\n transition: \"filter 0.2s ease\",\n display: \"flex\",\n gap: \"0.5rem\",\n alignItems: \"center\",\n position: \"relative\",\n justifyContent: isVoiceMode ? \"center\" : \"flex-start\",\n minHeight: \"3.5rem\", // Ensure consistent height\n }}\n >\n {/* In Voice Mode: Show only centered exit button */}\n {isVoiceMode ? (\n <motion.button\n key=\"voice-mode-exit\"\n initial={{ scale: 0.8, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n exit={{ scale: 0.8, opacity: 0 }}\n transition={{\n duration: 0.3,\n ease: \"easeOut\",\n }}\n onClick={async () => {\n convaiClient.sendInterruptMessage();\n await convaiClient.audioControls.muteAudio();\n // WebSocket: tell server to stop processing audio so the\n // character doesn't prompt \"tap microphone to talk\" on silence.\n if (convaiClient.room?.state !== \"connected\") {\n convaiClient.toggleStt(false);\n }\n setIsVoiceMode(false);\n }}\n whileHover={{ scale: 1.1 }}\n whileTap={{ scale: 0.9 }}\n style={{\n cursor: \"pointer\",\n backgroundColor: \"#ef4444\",\n color: \"#ffffff\",\n border: \"none\",\n borderRadius: \"50%\",\n width: \"2.25rem\",\n height: \"2.25rem\",\n minWidth: \"2.25rem\",\n minHeight: \"2.25rem\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n padding: 0,\n outline: \"none\",\n }}\n aria-label=\"Exit Voice Mode\"\n title=\"Exit voice mode\"\n >\n <FiPhoneOff size={20} />\n </motion.button>\n ) : (\n <>\n {/* Input Container */}\n <InputContainer style={{ flex: 1, position: \"relative\" }}>\n {/* Input field */}\n <Input\n type=\"text\"\n placeholder=\"Conversation\"\n value={inputValue}\n onChange={handleInputChange}\n onKeyPress={handleKeyPress}\n disabled={!canSendText}\n style={{ paddingRight: \"2.75rem\" }}\n />\n\n {/* Send/Voice Mode button */}\n <div\n style={{\n position: \"absolute\",\n right: \"0.375rem\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n width: \"2.25rem\",\n height: \"2.25rem\",\n minWidth: \"2.25rem\",\n minHeight: \"2.25rem\",\n flexShrink: 0,\n overflow: \"visible\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n zIndex: 2,\n }}\n >\n <AnimatePresence mode=\"wait\">\n {inputValue.length > 0 || isTextOnly ? (\n <ActionButton\n key=\"send\"\n initial={{ y: \"100%\" }}\n animate={{ y: \"0%\" }}\n exit={{ y: \"-100%\" }}\n transition={{\n duration: 0.1,\n ease: \"linear\",\n }}\n onClick={handleSend}\n disabled={inputValue.length === 0 || !canSendText}\n whileTap={{ scale: 0.9 }}\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n cursor: \"pointer\",\n }}\n >\n <FiSend size={20} />\n </ActionButton>\n ) : (\n <motion.button\n key=\"voice\"\n initial={{ y: \"100%\" }}\n animate={{ y: \"0%\" }}\n exit={{ y: \"-100%\" }}\n transition={{\n duration: 0.1,\n ease: \"linear\",\n }}\n onClick={async () => {\n convaiClient.sendInterruptMessage();\n // WebSocket: re-enable server STT before unmuting.\n if (convaiClient.room?.state !== \"connected\") {\n convaiClient.toggleStt(true);\n }\n await convaiClient.audioControls.unmuteAudio();\n setIsVoiceMode(true);\n }}\n whileHover={{ scale: 1.1 }}\n whileTap={{ scale: 0.9 }}\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n cursor: \"pointer\",\n backgroundColor: \"transparent\",\n color: aeroTheme.colors.text.primary,\n border: `1px solid ${aeroTheme.colors.neutral[300]}`,\n borderRadius: \"50%\",\n width: \"2.25rem\",\n height: \"2.25rem\",\n minWidth: \"2.25rem\",\n minHeight: \"2.25rem\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n padding: 0,\n outline: \"none\",\n }}\n aria-label=\"Enter Voice Mode\"\n title=\"Use voice mode\"\n >\n <PiWaveform size={20} />\n </motion.button>\n )}\n </AnimatePresence>\n </div>\n </InputContainer>\n </>\n )}\n </Footer>\n </ChatContent>\n )}\n </MorphingContainer>\n\n {/* Settings Tray - only show when connected */}\n {convaiClient.state.isConnected && (\n <SettingsTray\n isOpen={isSettingsOpen}\n onReset={\n convaiClient.isPublishedChatSession && !requestPublicationGrant\n ? undefined\n : handleReset\n }\n onDisconnect={\n convaiClient.isPublishedChatSession && !requestPublicationGrant\n ? undefined\n : handleDisconnect\n }\n onToggleVideo={\n convaiClient.connectionType === \"video\" && showVideo\n ? handleToggleVideo\n : undefined\n }\n isVideoVisible={isVideoVisible}\n onToggleScreenShare={\n convaiClient.connectionType === \"video\" && showScreenShare\n ? handleToggleScreenShare\n : undefined\n }\n isScreenShareActive={\n convaiClient.isScreenShareActive\n }\n />\n )}\n </ConvaiContainer>\n\n {/* Floating Video - only rendered in LiveKit mode (requires RoomContext) */}\n {convaiClient.room?.state === \"connected\" && (\n <FloatingVideo\n isVisible={isVideoVisible}\n onClose={async () => {\n await convaiClient.videoControls.disableVideo();\n }}\n mirror={true}\n />\n )}\n </RoomContext.Provider>\n );\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MarkdownRenderer.d.ts","sourceRoot":"","sources":["../../../../../src/react/components/rtc-widget/components/MarkdownRenderer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"MarkdownRenderer.d.ts","sourceRoot":"","sources":["../../../../../src/react/components/rtc-widget/components/MarkdownRenderer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,UAAU,qBAAqB;IAC7B,IAAI,EAAE,MAAM,CAAC;CACd;AAiDD,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CAkC5D,CAAC"}
|
|
@@ -1,5 +1,42 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import React from "react";
|
|
3
|
+
import { parseInlineMarkdown } from "../../../../utils/inlineMarkdown.js";
|
|
4
|
+
const linkStyle = {
|
|
5
|
+
color: "#10b981",
|
|
6
|
+
textDecoration: "underline",
|
|
7
|
+
wordBreak: "break-all",
|
|
8
|
+
};
|
|
9
|
+
const mediaStyle = {
|
|
10
|
+
display: "block",
|
|
11
|
+
maxWidth: "100%",
|
|
12
|
+
maxHeight: 240,
|
|
13
|
+
marginTop: 6,
|
|
14
|
+
borderRadius: 8,
|
|
15
|
+
};
|
|
16
|
+
/** Inline preview for an image or video URL, shown under its link. */
|
|
17
|
+
const MediaPreview = ({ node }) => {
|
|
18
|
+
if (node.media === "image") {
|
|
19
|
+
return _jsx("img", { src: node.href, alt: node.label, loading: "lazy", style: mediaStyle });
|
|
20
|
+
}
|
|
21
|
+
if (node.media === "video") {
|
|
22
|
+
return _jsx("video", { src: node.href, controls: true, preload: "metadata", style: mediaStyle });
|
|
23
|
+
}
|
|
24
|
+
return null;
|
|
25
|
+
};
|
|
26
|
+
const renderNode = (node, key) => {
|
|
27
|
+
switch (node.kind) {
|
|
28
|
+
case "strong":
|
|
29
|
+
return _jsx("strong", { children: node.text }, key);
|
|
30
|
+
case "em":
|
|
31
|
+
return _jsx("em", { children: node.text }, key);
|
|
32
|
+
case "link":
|
|
33
|
+
return (_jsxs(React.Fragment, { children: [_jsx("a", { href: node.href, target: "_blank", rel: "noopener noreferrer", style: linkStyle, children: node.label }), _jsx(MediaPreview, { node: node })] }, key));
|
|
34
|
+
case "image":
|
|
35
|
+
return _jsx("img", { src: node.src, alt: node.alt, loading: "lazy", style: mediaStyle }, key);
|
|
36
|
+
default:
|
|
37
|
+
return _jsx(React.Fragment, { children: node.text }, key);
|
|
38
|
+
}
|
|
39
|
+
};
|
|
3
40
|
export const MarkdownRenderer = ({ text }) => {
|
|
4
41
|
// Convert markdown to JSX elements
|
|
5
42
|
const renderMarkdown = (input) => {
|
|
@@ -11,50 +48,8 @@ export const MarkdownRenderer = ({ text }) => {
|
|
|
11
48
|
// Split by actual newlines
|
|
12
49
|
const lines = normalizedText.split('\n');
|
|
13
50
|
return lines.map((line, lineIndex) => {
|
|
14
|
-
//
|
|
15
|
-
const
|
|
16
|
-
const parts = [];
|
|
17
|
-
let remaining = text;
|
|
18
|
-
let keyCounter = 0;
|
|
19
|
-
// Process bold and italic markdown
|
|
20
|
-
// Bold: **text** or __text__
|
|
21
|
-
// Italic: *text* or _text_
|
|
22
|
-
const markdownRegex = /(\*\*|__)(.*?)\1|\*([^*]+)\*|_([^_]+)_/g;
|
|
23
|
-
let lastIndex = 0;
|
|
24
|
-
let match;
|
|
25
|
-
while ((match = markdownRegex.exec(remaining)) !== null) {
|
|
26
|
-
// Add text before the match
|
|
27
|
-
if (match.index > lastIndex) {
|
|
28
|
-
const textBefore = remaining.substring(lastIndex, match.index);
|
|
29
|
-
if (textBefore) {
|
|
30
|
-
parts.push(_jsx(React.Fragment, { children: textBefore }, `text-${lineIndex}-${keyCounter++}`));
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
// Determine if it's bold or italic
|
|
34
|
-
if (match[1] && match[2]) {
|
|
35
|
-
// Bold text (** or __)
|
|
36
|
-
parts.push(_jsx("strong", { children: match[2] }, `bold-${lineIndex}-${keyCounter++}`));
|
|
37
|
-
}
|
|
38
|
-
else if (match[3]) {
|
|
39
|
-
// Italic text (*)
|
|
40
|
-
parts.push(_jsx("em", { children: match[3] }, `italic-${lineIndex}-${keyCounter++}`));
|
|
41
|
-
}
|
|
42
|
-
else if (match[4]) {
|
|
43
|
-
// Italic text (_)
|
|
44
|
-
parts.push(_jsx("em", { children: match[4] }, `italic-${lineIndex}-${keyCounter++}`));
|
|
45
|
-
}
|
|
46
|
-
lastIndex = match.index + match[0].length;
|
|
47
|
-
}
|
|
48
|
-
// Add remaining text
|
|
49
|
-
if (lastIndex < remaining.length) {
|
|
50
|
-
const textAfter = remaining.substring(lastIndex);
|
|
51
|
-
if (textAfter) {
|
|
52
|
-
parts.push(_jsx(React.Fragment, { children: textAfter }, `text-${lineIndex}-${keyCounter++}`));
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
return parts;
|
|
56
|
-
};
|
|
57
|
-
const processedLine = processLine(line);
|
|
51
|
+
// Bold, italic, links, images and bare URLs — see utils/inlineMarkdown.
|
|
52
|
+
const processedLine = parseInlineMarkdown(line).map((node, i) => renderNode(node, `${node.kind}-${lineIndex}-${i}`));
|
|
58
53
|
// Handle empty lines (creates paragraph spacing)
|
|
59
54
|
if (line.trim() === "" && lineIndex > 0) {
|
|
60
55
|
return _jsx("br", {}, `br-${lineIndex}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MarkdownRenderer.js","sourceRoot":"","sources":["../../../../../src/react/components/rtc-widget/components/MarkdownRenderer.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"MarkdownRenderer.js","sourceRoot":"","sources":["../../../../../src/react/components/rtc-widget/components/MarkdownRenderer.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from \"react\";\nimport { parseInlineMarkdown, type InlineNode } from \"../../../../utils/inlineMarkdown\";\n\ninterface MarkdownRendererProps {\n text: string;\n}\n\nconst linkStyle: React.CSSProperties = {\n color: \"#10b981\",\n textDecoration: \"underline\",\n wordBreak: \"break-all\",\n};\n\nconst mediaStyle: React.CSSProperties = {\n display: \"block\",\n maxWidth: \"100%\",\n maxHeight: 240,\n marginTop: 6,\n borderRadius: 8,\n};\n\n/** Inline preview for an image or video URL, shown under its link. */\nconst MediaPreview = ({ node }: { node: Extract<InlineNode, { kind: \"link\" }> }) => {\n if (node.media === \"image\") {\n return <img src={node.href} alt={node.label} loading=\"lazy\" style={mediaStyle} />;\n }\n if (node.media === \"video\") {\n return <video src={node.href} controls preload=\"metadata\" style={mediaStyle} />;\n }\n return null;\n};\n\nconst renderNode = (node: InlineNode, key: string): React.ReactNode => {\n switch (node.kind) {\n case \"strong\":\n return <strong key={key}>{node.text}</strong>;\n case \"em\":\n return <em key={key}>{node.text}</em>;\n case \"link\":\n return (\n <React.Fragment key={key}>\n <a href={node.href} target=\"_blank\" rel=\"noopener noreferrer\" style={linkStyle}>\n {node.label}\n </a>\n <MediaPreview node={node} />\n </React.Fragment>\n );\n case \"image\":\n return <img key={key} src={node.src} alt={node.alt} loading=\"lazy\" style={mediaStyle} />;\n default:\n return <React.Fragment key={key}>{node.text}</React.Fragment>;\n }\n};\n\nexport const MarkdownRenderer: React.FC<MarkdownRendererProps> = ({ text }) => {\n // Convert markdown to JSX elements\n const renderMarkdown = (input: string): React.ReactNode => {\n if (!input) return null;\n\n // Handle both actual newlines and \\n escape sequences\n // Replace literal \\n strings with actual newlines\n const normalizedText = input.replace(/\\\\n/g, '\\n');\n\n // Split by actual newlines\n const lines = normalizedText.split('\\n');\n\n return lines.map((line, lineIndex) => {\n // Bold, italic, links, images and bare URLs — see utils/inlineMarkdown.\n const processedLine = parseInlineMarkdown(line).map((node, i) =>\n renderNode(node, `${node.kind}-${lineIndex}-${i}`),\n );\n\n // Handle empty lines (creates paragraph spacing)\n if (line.trim() === \"\" && lineIndex > 0) {\n return <br key={`br-${lineIndex}`} />;\n }\n\n // Return the line with line break\n return (\n <React.Fragment key={`line-${lineIndex}`}>\n {processedLine.length > 0 ? processedLine : line}\n {lineIndex < lines.length - 1 && <br />}\n </React.Fragment>\n );\n });\n };\n\n return <div style={{ whiteSpace: 'pre-wrap', wordWrap: 'break-word' }}>{renderMarkdown(text)}</div>;\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SettingsTray.d.ts","sourceRoot":"","sources":["../../../../../../src/react/components/rtc-widget/components/conviComponents/SettingsTray.tsx"],"names":[],"mappings":"AAYA,UAAU,iBAAiB;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,OAAO,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"SettingsTray.d.ts","sourceRoot":"","sources":["../../../../../../src/react/components/rtc-widget/components/conviComponents/SettingsTray.tsx"],"names":[],"mappings":"AAYA,UAAU,iBAAiB;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,mBAAmB,CAAC,EAAE,MAAM,IAAI,CAAC;CAClC;AAED,eAAO,MAAM,YAAY,GAAI,6GAQ1B,iBAAiB,mDA2InB,CAAC"}
|
|
@@ -20,12 +20,12 @@ export const SettingsTray = ({ isOpen, isVideoVisible, isScreenShareActive, onRe
|
|
|
20
20
|
alignItems: "center",
|
|
21
21
|
padding: "8px",
|
|
22
22
|
gap: "4px",
|
|
23
|
-
}, children: [_jsxs(SettingsOption, { onClick: onReset, whileHover: { scale: 1.02 }, whileTap: { scale: 0.98 }, transition: iosTransitions.snappy, style: {
|
|
23
|
+
}, children: [onReset && (_jsxs(SettingsOption, { onClick: onReset, whileHover: { scale: 1.02 }, whileTap: { scale: 0.98 }, transition: iosTransitions.snappy, style: {
|
|
24
24
|
cursor: "pointer",
|
|
25
25
|
flexDirection: "column",
|
|
26
26
|
gap: "4px",
|
|
27
27
|
padding: "8px 12px",
|
|
28
|
-
}, "aria-label": "Reset", title: "Reset", children: [_jsx(LiaRedoAltSolid, { size: 18 }), _jsx("span", { style: { fontSize: "10px", fontWeight: 500 }, children: "Reset" })] }), onToggleVideo && (_jsxs(SettingsOption, { onClick: (e) => {
|
|
28
|
+
}, "aria-label": "Reset", title: "Reset", children: [_jsx(LiaRedoAltSolid, { size: 18 }), _jsx("span", { style: { fontSize: "10px", fontWeight: 500 }, children: "Reset" })] })), onToggleVideo && (_jsxs(SettingsOption, { onClick: (e) => {
|
|
29
29
|
e.stopPropagation();
|
|
30
30
|
onToggleVideo();
|
|
31
31
|
}, whileHover: { scale: 1.02 }, whileTap: { scale: 0.98 }, transition: iosTransitions.snappy, style: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SettingsTray.js","sourceRoot":"","sources":["../../../../../../src/react/components/rtc-widget/components/conviComponents/SettingsTray.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from \"react\";\nimport { AnimatePresence } from \"framer-motion\";\nimport { LiaRedoAltSolid } from \"react-icons/lia\";\nimport { IoVideocam, IoVideocamOff } from \"react-icons/io5\";\nimport { MdScreenShare, MdStopScreenShare } from \"react-icons/md\";\nimport { aeroTheme } from \"../../styles/theme\";\nimport { iosTransitions } from \"../../styles/framerConfig\";\nimport {\n SettingsTray as StyledSettingsTray,\n SettingsOption,\n} from \"../../styles/styledComponents\";\n\ninterface SettingsTrayProps {\n isOpen: boolean;\n isVideoVisible?: boolean;\n isScreenShareActive?: boolean;\n onReset: () => void;\n onDisconnect?: () => void;\n onToggleVideo?: () => void;\n onToggleScreenShare?: () => void;\n}\n\nexport const SettingsTray = ({\n isOpen,\n isVideoVisible,\n isScreenShareActive,\n onReset,\n onDisconnect,\n onToggleVideo,\n onToggleScreenShare,\n}: SettingsTrayProps) => {\n if (!isOpen) return null;\n\n return (\n <AnimatePresence>\n <StyledSettingsTray\n data-settings-tray\n initial={{ opacity: 0, y: -10, scale: 0.95 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, y: -10, scale: 0.95 }}\n transition={iosTransitions.fadePop}\n style={{\n position: \"absolute\",\n top: \"60px\",\n right: \"16px\",\n zIndex: 9999,\n }}\n onClick={(e: React.MouseEvent) => e.stopPropagation()}\n >\n {/* Horizontal Settings Row */}\n <div\n style={{\n display: \"flex\",\n flexDirection: \"row\",\n alignItems: \"center\",\n padding: \"8px\",\n gap: \"4px\",\n }}\n >\n <SettingsOption\n onClick={onReset}\n whileHover={{ scale: 1.02 }}\n whileTap={{ scale: 0.98 }}\n transition={iosTransitions.snappy}\n style={{\n cursor: \"pointer\",\n flexDirection: \"column\",\n gap: \"4px\",\n padding: \"8px 12px\",\n }}\n aria-label=\"Reset\"\n title=\"Reset\"\n >\n <LiaRedoAltSolid size={18} />\n <span style={{ fontSize: \"10px\", fontWeight: 500 }}>Reset</span>\n </SettingsOption>\n\n {/* Video Toggle Button */}\n {onToggleVideo && (\n <SettingsOption\n onClick={(e: React.MouseEvent) => {\n e.stopPropagation();\n onToggleVideo();\n }}\n whileHover={{ scale: 1.02 }}\n whileTap={{ scale: 0.98 }}\n transition={iosTransitions.snappy}\n style={{\n cursor: \"pointer\",\n flexDirection: \"column\",\n gap: \"4px\",\n padding: \"8px 12px\",\n backgroundColor: isVideoVisible\n ? \"rgba(16, 185, 129, 0.15)\"\n : \"transparent\",\n color: isVideoVisible\n ? \"#10b981\"\n : aeroTheme.colors.text.primary,\n }}\n aria-label={isVideoVisible ? \"Hide Video\" : \"Show Video\"}\n title={isVideoVisible ? \"Hide Video\" : \"Show Video\"}\n >\n {isVideoVisible ? <IoVideocam size={18} /> : <IoVideocamOff size={18} />}\n <span style={{ fontSize: \"10px\", fontWeight: 500 }}>Video</span>\n </SettingsOption>\n )}\n\n {/* Screen Share Toggle Button */}\n {onToggleScreenShare && (\n <SettingsOption\n onClick={(e: React.MouseEvent) => {\n e.stopPropagation();\n onToggleScreenShare();\n }}\n whileHover={{ scale: 1.02 }}\n whileTap={{ scale: 0.98 }}\n transition={iosTransitions.snappy}\n style={{\n cursor: \"pointer\",\n flexDirection: \"column\",\n gap: \"4px\",\n padding: \"8px 12px\",\n backgroundColor: isScreenShareActive\n ? \"rgba(16, 185, 129, 0.15)\"\n : \"transparent\",\n color: isScreenShareActive\n ? \"#10b981\"\n : aeroTheme.colors.text.primary,\n }}\n aria-label={isScreenShareActive ? \"Stop Sharing\" : \"Share Screen\"}\n title={isScreenShareActive ? \"Stop Sharing\" : \"Share Screen\"}\n >\n {isScreenShareActive ? <MdStopScreenShare size={18} /> : <MdScreenShare size={18} />}\n <span style={{ fontSize: \"10px\", fontWeight: 500 }}>Screen</span>\n </SettingsOption>\n )}\n\n {/* Disconnect Button */}\n {onDisconnect && (\n <SettingsOption\n onClick={(e: React.MouseEvent) => {\n e.stopPropagation();\n onDisconnect();\n }}\n whileHover={{ scale: 1.02 }}\n whileTap={{ scale: 0.98 }}\n transition={iosTransitions.snappy}\n style={{\n cursor: \"pointer\",\n flexDirection: \"column\",\n gap: \"4px\",\n padding: \"8px 12px\",\n backgroundColor: \"rgba(239, 68, 68, 0.1)\",\n color: \"#ef4444\",\n }}\n aria-label=\"Disconnect\"\n title=\"Disconnect\"\n >\n {/* Placeholder for icon - user will add their own */}\n <span style={{ fontSize: \"18px\" }}>⏻</span>\n <span style={{ fontSize: \"10px\", fontWeight: 500 }}>Disconnect</span>\n </SettingsOption>\n )}\n </div>\n </StyledSettingsTray>\n </AnimatePresence>\n );\n};\n\n"]}
|
|
1
|
+
{"version":3,"file":"SettingsTray.js","sourceRoot":"","sources":["../../../../../../src/react/components/rtc-widget/components/conviComponents/SettingsTray.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from \"react\";\nimport { AnimatePresence } from \"framer-motion\";\nimport { LiaRedoAltSolid } from \"react-icons/lia\";\nimport { IoVideocam, IoVideocamOff } from \"react-icons/io5\";\nimport { MdScreenShare, MdStopScreenShare } from \"react-icons/md\";\nimport { aeroTheme } from \"../../styles/theme\";\nimport { iosTransitions } from \"../../styles/framerConfig\";\nimport {\n SettingsTray as StyledSettingsTray,\n SettingsOption,\n} from \"../../styles/styledComponents\";\n\ninterface SettingsTrayProps {\n isOpen: boolean;\n isVideoVisible?: boolean;\n isScreenShareActive?: boolean;\n onReset?: () => void;\n onDisconnect?: () => void;\n onToggleVideo?: () => void;\n onToggleScreenShare?: () => void;\n}\n\nexport const SettingsTray = ({\n isOpen,\n isVideoVisible,\n isScreenShareActive,\n onReset,\n onDisconnect,\n onToggleVideo,\n onToggleScreenShare,\n}: SettingsTrayProps) => {\n if (!isOpen) return null;\n\n return (\n <AnimatePresence>\n <StyledSettingsTray\n data-settings-tray\n initial={{ opacity: 0, y: -10, scale: 0.95 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, y: -10, scale: 0.95 }}\n transition={iosTransitions.fadePop}\n style={{\n position: \"absolute\",\n top: \"60px\",\n right: \"16px\",\n zIndex: 9999,\n }}\n onClick={(e: React.MouseEvent) => e.stopPropagation()}\n >\n {/* Horizontal Settings Row */}\n <div\n style={{\n display: \"flex\",\n flexDirection: \"row\",\n alignItems: \"center\",\n padding: \"8px\",\n gap: \"4px\",\n }}\n >\n {onReset && (\n <SettingsOption\n onClick={onReset}\n whileHover={{ scale: 1.02 }}\n whileTap={{ scale: 0.98 }}\n transition={iosTransitions.snappy}\n style={{\n cursor: \"pointer\",\n flexDirection: \"column\",\n gap: \"4px\",\n padding: \"8px 12px\",\n }}\n aria-label=\"Reset\"\n title=\"Reset\"\n >\n <LiaRedoAltSolid size={18} />\n <span style={{ fontSize: \"10px\", fontWeight: 500 }}>Reset</span>\n </SettingsOption>\n )}\n\n {/* Video Toggle Button */}\n {onToggleVideo && (\n <SettingsOption\n onClick={(e: React.MouseEvent) => {\n e.stopPropagation();\n onToggleVideo();\n }}\n whileHover={{ scale: 1.02 }}\n whileTap={{ scale: 0.98 }}\n transition={iosTransitions.snappy}\n style={{\n cursor: \"pointer\",\n flexDirection: \"column\",\n gap: \"4px\",\n padding: \"8px 12px\",\n backgroundColor: isVideoVisible\n ? \"rgba(16, 185, 129, 0.15)\"\n : \"transparent\",\n color: isVideoVisible\n ? \"#10b981\"\n : aeroTheme.colors.text.primary,\n }}\n aria-label={isVideoVisible ? \"Hide Video\" : \"Show Video\"}\n title={isVideoVisible ? \"Hide Video\" : \"Show Video\"}\n >\n {isVideoVisible ? <IoVideocam size={18} /> : <IoVideocamOff size={18} />}\n <span style={{ fontSize: \"10px\", fontWeight: 500 }}>Video</span>\n </SettingsOption>\n )}\n\n {/* Screen Share Toggle Button */}\n {onToggleScreenShare && (\n <SettingsOption\n onClick={(e: React.MouseEvent) => {\n e.stopPropagation();\n onToggleScreenShare();\n }}\n whileHover={{ scale: 1.02 }}\n whileTap={{ scale: 0.98 }}\n transition={iosTransitions.snappy}\n style={{\n cursor: \"pointer\",\n flexDirection: \"column\",\n gap: \"4px\",\n padding: \"8px 12px\",\n backgroundColor: isScreenShareActive\n ? \"rgba(16, 185, 129, 0.15)\"\n : \"transparent\",\n color: isScreenShareActive\n ? \"#10b981\"\n : aeroTheme.colors.text.primary,\n }}\n aria-label={isScreenShareActive ? \"Stop Sharing\" : \"Share Screen\"}\n title={isScreenShareActive ? \"Stop Sharing\" : \"Share Screen\"}\n >\n {isScreenShareActive ? <MdStopScreenShare size={18} /> : <MdScreenShare size={18} />}\n <span style={{ fontSize: \"10px\", fontWeight: 500 }}>Screen</span>\n </SettingsOption>\n )}\n\n {/* Disconnect Button */}\n {onDisconnect && (\n <SettingsOption\n onClick={(e: React.MouseEvent) => {\n e.stopPropagation();\n onDisconnect();\n }}\n whileHover={{ scale: 1.02 }}\n whileTap={{ scale: 0.98 }}\n transition={iosTransitions.snappy}\n style={{\n cursor: \"pointer\",\n flexDirection: \"column\",\n gap: \"4px\",\n padding: \"8px 12px\",\n backgroundColor: \"rgba(239, 68, 68, 0.1)\",\n color: \"#ef4444\",\n }}\n aria-label=\"Disconnect\"\n title=\"Disconnect\"\n >\n {/* Placeholder for icon - user will add their own */}\n <span style={{ fontSize: \"18px\" }}>⏻</span>\n <span style={{ fontSize: \"10px\", fontWeight: 500 }}>Disconnect</span>\n </SettingsOption>\n )}\n </div>\n </StyledSettingsTray>\n </AnimatePresence>\n );\n};\n"]}
|
|
@@ -26,6 +26,8 @@ import type { ConvaiConfig, IConvaiClient, ChatMessage } from "../../core/types.
|
|
|
26
26
|
* ```
|
|
27
27
|
*/
|
|
28
28
|
export declare const useConvaiClient: (config?: ConvaiConfig) => IConvaiClient & {
|
|
29
|
+
/** This hook always supplies the publication connector, unlike generic adapters. */
|
|
30
|
+
connectWithPublicationGrant: NonNullable<IConvaiClient["connectWithPublicationGrant"]>;
|
|
29
31
|
activity: string;
|
|
30
32
|
chatMessages: ChatMessage[];
|
|
31
33
|
isAudioMuted: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useConvaiClient.d.ts","sourceRoot":"","sources":["../../../src/react/hooks/useConvaiClient.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EACb,WAAW,
|
|
1
|
+
{"version":3,"file":"useConvaiClient.d.ts","sourceRoot":"","sources":["../../../src/react/hooks/useConvaiClient.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EACb,WAAW,EAEZ,MAAM,kBAAkB,CAAC;AAE1B;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,eAAO,MAAM,eAAe,GAC1B,SAAS,YAAY,KACpB,aAAa,GAAG;IACjB,oFAAoF;IACpF,2BAA2B,EAAE,WAAW,CACtC,aAAa,CAAC,6BAA6B,CAAC,CAC7C,CAAC;IACF,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,YAAY,EAAE,OAAO,CAAC;IACtB,cAAc,EAAE,OAAO,CAAC;IACxB,mBAAmB,EAAE,OAAO,CAAC;CAuP9B,CAAC"}
|