@signalwire/web-components 4.0.0-beta.11 → 4.0.0-beta.12
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 +48 -55
- package/dist/_virtual/_commonjsHelpers.js +9 -0
- package/dist/_virtual/_commonjsHelpers.js.map +1 -0
- package/dist/_virtual/prism-python.js +28 -0
- package/dist/_virtual/prism-python.js.map +1 -0
- package/dist/_virtual/prism-python2.js +5 -0
- package/dist/_virtual/prism-python2.js.map +1 -0
- package/dist/_virtual/prism-typescript.js +28 -0
- package/dist/_virtual/prism-typescript.js.map +1 -0
- package/dist/_virtual/prism-typescript2.js +5 -0
- package/dist/_virtual/prism-typescript2.js.map +1 -0
- package/dist/_virtual/prism.js +28 -0
- package/dist/_virtual/prism.js.map +1 -0
- package/dist/_virtual/prism2.js +5 -0
- package/dist/_virtual/prism2.js.map +1 -0
- package/dist/assets/sw_background.webp.js +5 -0
- package/dist/assets/sw_background.webp.js.map +1 -0
- package/dist/components/UI/DEFAULT_BACKGROUND.d.ts +4 -0
- package/dist/components/UI/DEFAULT_BACKGROUND.d.ts.map +1 -0
- package/dist/components/UI/DEFAULT_BACKGROUND.js +5 -0
- package/dist/components/UI/DEFAULT_BACKGROUND.js.map +1 -0
- package/dist/components/UI/controls/sw-ui-control-bar.d.ts +114 -0
- package/dist/components/UI/controls/sw-ui-control-bar.d.ts.map +1 -0
- package/dist/components/UI/controls/sw-ui-control-bar.js +324 -0
- package/dist/components/UI/controls/sw-ui-control-bar.js.map +1 -0
- package/dist/components/UI/controls/sw-ui-dialpad.d.ts +67 -0
- package/dist/components/UI/controls/sw-ui-dialpad.d.ts.map +1 -0
- package/dist/components/UI/controls/sw-ui-dialpad.js +359 -0
- package/dist/components/UI/controls/sw-ui-dialpad.js.map +1 -0
- package/dist/components/UI/controls/sw-ui-dropup.d.ts +42 -0
- package/dist/components/UI/controls/sw-ui-dropup.d.ts.map +1 -0
- package/dist/components/UI/controls/sw-ui-dropup.js +137 -0
- package/dist/components/UI/controls/sw-ui-dropup.js.map +1 -0
- package/dist/components/UI/controls/sw-ui-split-button.d.ts +44 -0
- package/dist/components/UI/controls/sw-ui-split-button.d.ts.map +1 -0
- package/dist/components/UI/controls/sw-ui-split-button.js +177 -0
- package/dist/components/UI/controls/sw-ui-split-button.js.map +1 -0
- package/dist/components/UI/icons/backspace.svg.js +10 -0
- package/dist/components/UI/icons/backspace.svg.js.map +1 -0
- package/dist/components/UI/icons/camera-off.svg.js +8 -0
- package/dist/components/UI/icons/camera-off.svg.js.map +1 -0
- package/dist/components/UI/icons/camera-on.svg.js +8 -0
- package/dist/components/UI/icons/camera-on.svg.js.map +1 -0
- package/dist/components/UI/icons/check-circle.svg.js +6 -0
- package/dist/components/UI/icons/check-circle.svg.js.map +1 -0
- package/dist/components/UI/icons/chevron-up.svg.js +8 -0
- package/dist/components/UI/icons/chevron-up.svg.js.map +1 -0
- package/dist/components/UI/icons/close.svg.js +6 -0
- package/dist/components/UI/icons/close.svg.js.map +1 -0
- package/dist/components/UI/icons/copy.svg.js +6 -0
- package/dist/components/UI/icons/copy.svg.js.map +1 -0
- package/dist/components/UI/icons/download.svg.js +6 -0
- package/dist/components/UI/icons/download.svg.js.map +1 -0
- package/dist/components/UI/icons/fullscreen-exit.svg.js +8 -0
- package/dist/components/UI/icons/fullscreen-exit.svg.js.map +1 -0
- package/dist/components/UI/icons/fullscreen.svg.js +8 -0
- package/dist/components/UI/icons/fullscreen.svg.js.map +1 -0
- package/dist/components/UI/icons/hand-raise.svg.js +6 -0
- package/dist/components/UI/icons/hand-raise.svg.js.map +1 -0
- package/dist/components/UI/icons/icons.d.ts +31 -0
- package/dist/components/UI/icons/icons.d.ts.map +1 -0
- package/dist/components/UI/icons/icons.js +60 -0
- package/dist/components/UI/icons/icons.js.map +1 -0
- package/dist/components/UI/icons/index.d.ts +4 -0
- package/dist/components/UI/icons/index.d.ts.map +1 -0
- package/dist/components/UI/icons/info-circle.svg.js +6 -0
- package/dist/components/UI/icons/info-circle.svg.js.map +1 -0
- package/dist/components/UI/icons/mic-off.svg.js +8 -0
- package/dist/components/UI/icons/mic-off.svg.js.map +1 -0
- package/dist/components/UI/icons/mic-on.svg.js +8 -0
- package/dist/components/UI/icons/mic-on.svg.js.map +1 -0
- package/dist/components/UI/icons/person.svg.js +8 -0
- package/dist/components/UI/icons/person.svg.js.map +1 -0
- package/dist/components/UI/icons/phone-call.svg.js +8 -0
- package/dist/components/UI/icons/phone-call.svg.js.map +1 -0
- package/dist/components/UI/icons/phone-end.svg.js +8 -0
- package/dist/components/UI/icons/phone-end.svg.js.map +1 -0
- package/dist/components/UI/icons/room.svg.js +8 -0
- package/dist/components/UI/icons/room.svg.js.map +1 -0
- package/dist/components/UI/icons/screen-share-off.svg.js +9 -0
- package/dist/components/UI/icons/screen-share-off.svg.js.map +1 -0
- package/dist/components/UI/icons/screen-share.svg.js +9 -0
- package/dist/components/UI/icons/screen-share.svg.js.map +1 -0
- package/dist/components/UI/icons/sendIcon.svg.js +9 -0
- package/dist/components/UI/icons/sendIcon.svg.js.map +1 -0
- package/dist/components/UI/icons/settings.svg.js +8 -0
- package/dist/components/UI/icons/settings.svg.js.map +1 -0
- package/dist/components/UI/icons/speaker-off.svg.js +8 -0
- package/dist/components/UI/icons/speaker-off.svg.js.map +1 -0
- package/dist/components/UI/icons/speaker-on.svg.js +8 -0
- package/dist/components/UI/icons/speaker-on.svg.js.map +1 -0
- package/dist/components/UI/icons/spinner.svg.js +9 -0
- package/dist/components/UI/icons/spinner.svg.js.map +1 -0
- package/dist/components/UI/icons/sw-logo.svg.js +11 -0
- package/dist/components/UI/icons/sw-logo.svg.js.map +1 -0
- package/dist/components/UI/icons/sw-ui-icon.d.ts +28 -0
- package/dist/components/UI/icons/sw-ui-icon.d.ts.map +1 -0
- package/dist/components/UI/icons/sw-ui-icon.js +47 -0
- package/dist/components/UI/icons/sw-ui-icon.js.map +1 -0
- package/dist/components/UI/icons/transcript.svg.js +10 -0
- package/dist/components/UI/icons/transcript.svg.js.map +1 -0
- package/dist/components/UI/index.d.ts +18 -0
- package/dist/components/UI/index.d.ts.map +1 -0
- package/dist/components/UI/layout/sw-ui-background.d.ts +33 -0
- package/dist/components/UI/layout/sw-ui-background.d.ts.map +1 -0
- package/dist/components/UI/layout/sw-ui-background.js +106 -0
- package/dist/components/UI/layout/sw-ui-background.js.map +1 -0
- package/dist/components/UI/layout/sw-ui-call-layout.d.ts +69 -0
- package/dist/components/UI/layout/sw-ui-call-layout.d.ts.map +1 -0
- package/dist/components/UI/layout/sw-ui-call-layout.js +278 -0
- package/dist/components/UI/layout/sw-ui-call-layout.js.map +1 -0
- package/dist/components/UI/layout/sw-ui-content-drawer.d.ts +50 -0
- package/dist/components/UI/layout/sw-ui-content-drawer.d.ts.map +1 -0
- package/dist/components/UI/layout/sw-ui-content-drawer.js +413 -0
- package/dist/components/UI/layout/sw-ui-content-drawer.js.map +1 -0
- package/dist/components/UI/layout/sw-ui-modal.d.ts +31 -0
- package/dist/components/UI/layout/sw-ui-modal.d.ts.map +1 -0
- package/dist/components/UI/layout/sw-ui-modal.js +150 -0
- package/dist/components/UI/layout/sw-ui-modal.js.map +1 -0
- package/dist/components/UI/layout/sw-ui-responsive-container.d.ts +15 -0
- package/dist/components/UI/layout/sw-ui-responsive-container.d.ts.map +1 -0
- package/dist/components/UI/layout/sw-ui-responsive-container.js +78 -0
- package/dist/components/UI/layout/sw-ui-responsive-container.js.map +1 -0
- package/dist/components/UI/sw-ui-alert.d.ts +37 -0
- package/dist/components/UI/sw-ui-alert.d.ts.map +1 -0
- package/dist/components/UI/sw-ui-alert.js +126 -0
- package/dist/components/UI/sw-ui-alert.js.map +1 -0
- package/dist/components/UI/sw-ui-transcript-view.d.ts +56 -0
- package/dist/components/UI/sw-ui-transcript-view.d.ts.map +1 -0
- package/dist/components/UI/sw-ui-transcript-view.js +341 -0
- package/dist/components/UI/sw-ui-transcript-view.js.map +1 -0
- package/dist/components/{audio-level.d.ts → sw-audio-level.d.ts} +39 -7
- package/dist/components/sw-audio-level.d.ts.map +1 -0
- package/dist/components/sw-audio-level.js +252 -0
- package/dist/components/sw-audio-level.js.map +1 -0
- package/dist/components/sw-call-controls.d.ts +58 -0
- package/dist/components/sw-call-controls.d.ts.map +1 -0
- package/dist/components/sw-call-controls.js +186 -0
- package/dist/components/sw-call-controls.js.map +1 -0
- package/dist/components/sw-call-dialpad.d.ts +52 -0
- package/dist/components/sw-call-dialpad.d.ts.map +1 -0
- package/dist/components/sw-call-dialpad.js +70 -0
- package/dist/components/sw-call-dialpad.js.map +1 -0
- package/dist/components/sw-call-media.d.ts +68 -0
- package/dist/components/sw-call-media.d.ts.map +1 -0
- package/dist/components/sw-call-media.js +220 -0
- package/dist/components/sw-call-media.js.map +1 -0
- package/dist/components/sw-call-provider.d.ts +41 -0
- package/dist/components/sw-call-provider.d.ts.map +1 -0
- package/dist/components/sw-call-provider.js +37 -0
- package/dist/components/sw-call-provider.js.map +1 -0
- package/dist/components/sw-call-status.d.ts +50 -0
- package/dist/components/sw-call-status.d.ts.map +1 -0
- package/dist/components/sw-call-status.js +203 -0
- package/dist/components/sw-call-status.js.map +1 -0
- package/dist/components/sw-call-widget/client-factory.d.ts +6 -0
- package/dist/components/sw-call-widget/client-factory.d.ts.map +1 -0
- package/dist/components/sw-call-widget/client-factory.js +25 -0
- package/dist/components/sw-call-widget/client-factory.js.map +1 -0
- package/dist/components/sw-call-widget/sw-call-widget.d.ts +110 -0
- package/dist/components/sw-call-widget/sw-call-widget.d.ts.map +1 -0
- package/dist/components/sw-call-widget/sw-call-widget.js +250 -0
- package/dist/components/sw-call-widget/sw-call-widget.js.map +1 -0
- package/dist/components/sw-call-widget/sw-call-widget.templates.d.ts +17 -0
- package/dist/components/sw-call-widget/sw-call-widget.templates.d.ts.map +1 -0
- package/dist/components/sw-call-widget/sw-call-widget.templates.js +80 -0
- package/dist/components/sw-call-widget/sw-call-widget.templates.js.map +1 -0
- package/dist/components/sw-click-to-call.d.ts +39 -0
- package/dist/components/sw-click-to-call.d.ts.map +1 -0
- package/dist/components/sw-click-to-call.js +87 -0
- package/dist/components/sw-click-to-call.js.map +1 -0
- package/dist/components/sw-device-selector/index.d.ts +2 -0
- package/dist/components/sw-device-selector/index.d.ts.map +1 -0
- package/dist/components/sw-device-selector/sw-device-selector.d.ts +69 -0
- package/dist/components/sw-device-selector/sw-device-selector.d.ts.map +1 -0
- package/dist/components/sw-device-selector/sw-device-selector.js +277 -0
- package/dist/components/sw-device-selector/sw-device-selector.js.map +1 -0
- package/dist/components/sw-device-selector/sw-device-selector.styles.d.ts +2 -0
- package/dist/components/sw-device-selector/sw-device-selector.styles.d.ts.map +1 -0
- package/dist/components/sw-device-selector/sw-device-selector.styles.js +238 -0
- package/dist/components/sw-device-selector/sw-device-selector.styles.js.map +1 -0
- package/dist/components/{directory.d.ts → sw-directory.d.ts} +13 -21
- package/dist/components/sw-directory.d.ts.map +1 -0
- package/dist/components/sw-directory.js +434 -0
- package/dist/components/sw-directory.js.map +1 -0
- package/dist/components/sw-local-camera.d.ts +53 -0
- package/dist/components/sw-local-camera.d.ts.map +1 -0
- package/dist/components/sw-local-camera.js +147 -0
- package/dist/components/sw-local-camera.js.map +1 -0
- package/dist/components/sw-participant-controls.d.ts +58 -0
- package/dist/components/sw-participant-controls.d.ts.map +1 -0
- package/dist/components/sw-participant-controls.js +305 -0
- package/dist/components/sw-participant-controls.js.map +1 -0
- package/dist/components/sw-participants.d.ts +55 -0
- package/dist/components/sw-participants.d.ts.map +1 -0
- package/dist/components/sw-participants.js +319 -0
- package/dist/components/sw-participants.js.map +1 -0
- package/dist/components/sw-self-media.d.ts +46 -0
- package/dist/components/sw-self-media.d.ts.map +1 -0
- package/dist/components/sw-self-media.js +106 -0
- package/dist/components/sw-self-media.js.map +1 -0
- package/dist/context/CallStateContextController.d.ts +31 -0
- package/dist/context/CallStateContextController.d.ts.map +1 -0
- package/dist/context/CallStateContextController.js +125 -0
- package/dist/context/CallStateContextController.js.map +1 -0
- package/dist/context/DevicesContextController.d.ts +38 -0
- package/dist/context/DevicesContextController.d.ts.map +1 -0
- package/dist/context/DevicesContextController.js +124 -0
- package/dist/context/DevicesContextController.js.map +1 -0
- package/dist/context/TranscriptController.d.ts +32 -0
- package/dist/context/TranscriptController.d.ts.map +1 -0
- package/dist/context/TranscriptController.js +113 -0
- package/dist/context/TranscriptController.js.map +1 -0
- package/dist/context/UserEventController.d.ts +26 -0
- package/dist/context/UserEventController.d.ts.map +1 -0
- package/dist/context/UserEventController.js +55 -0
- package/dist/context/UserEventController.js.map +1 -0
- package/dist/context/call-state-context.d.ts +75 -0
- package/dist/context/call-state-context.d.ts.map +1 -0
- package/dist/context/call-state-context.js +39 -0
- package/dist/context/call-state-context.js.map +1 -0
- package/dist/context/chat-state.d.ts +41 -0
- package/dist/context/chat-state.d.ts.map +1 -0
- package/dist/context/chat-state.js +61 -0
- package/dist/context/chat-state.js.map +1 -0
- package/dist/context/devices-context.d.ts +28 -0
- package/dist/context/devices-context.d.ts.map +1 -0
- package/dist/context/devices-context.js +6 -0
- package/dist/context/devices-context.js.map +1 -0
- package/dist/context/index.d.ts +9 -1
- package/dist/context/index.d.ts.map +1 -1
- package/dist/context/transcript-context.d.ts +9 -0
- package/dist/context/transcript-context.d.ts.map +1 -0
- package/dist/context/transcript-context.js +6 -0
- package/dist/context/transcript-context.js.map +1 -0
- package/dist/context/types.d.ts +9 -0
- package/dist/context/types.d.ts.map +1 -0
- package/dist/embed/signalwire-web-components-embed.iife.js +3225 -0
- package/dist/embed/signalwire-web-components-embed.iife.js.map +1 -0
- package/dist/embed/signalwire-web-components-embed.umd.cjs +3225 -0
- package/dist/embed/signalwire-web-components-embed.umd.cjs.map +1 -0
- package/dist/embed.d.ts +20 -0
- package/dist/embed.d.ts.map +1 -0
- package/dist/index.d.ts +18 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +83 -34
- package/dist/index.js.map +1 -1
- package/dist/node_modules/dompurify/dist/purify.es.js +597 -0
- package/dist/node_modules/dompurify/dist/purify.es.js.map +1 -0
- package/dist/node_modules/marked/lib/marked.esm.js +1475 -0
- package/dist/node_modules/marked/lib/marked.esm.js.map +1 -0
- package/dist/node_modules/prismjs/components/prism-bash.js +220 -0
- package/dist/node_modules/prismjs/components/prism-bash.js.map +1 -0
- package/dist/node_modules/prismjs/components/prism-css.js +56 -0
- package/dist/node_modules/prismjs/components/prism-css.js.map +1 -0
- package/dist/node_modules/prismjs/components/prism-javascript.js +138 -0
- package/dist/node_modules/prismjs/components/prism-javascript.js.map +1 -0
- package/dist/node_modules/prismjs/components/prism-json.js +26 -0
- package/dist/node_modules/prismjs/components/prism-json.js.map +1 -0
- package/dist/node_modules/prismjs/components/prism-markdown.js +301 -0
- package/dist/node_modules/prismjs/components/prism-markdown.js.map +1 -0
- package/dist/node_modules/prismjs/components/prism-python.js +69 -0
- package/dist/node_modules/prismjs/components/prism-python.js.map +1 -0
- package/dist/node_modules/prismjs/components/prism-sql.js +34 -0
- package/dist/node_modules/prismjs/components/prism-sql.js.map +1 -0
- package/dist/node_modules/prismjs/components/prism-typescript.js +53 -0
- package/dist/node_modules/prismjs/components/prism-typescript.js.map +1 -0
- package/dist/node_modules/prismjs/components/prism-yaml.js +67 -0
- package/dist/node_modules/prismjs/components/prism-yaml.js.map +1 -0
- package/dist/node_modules/prismjs/prism.js +1165 -0
- package/dist/node_modules/prismjs/prism.js.map +1 -0
- package/dist/react.d.ts +55 -26
- package/dist/theme.css +451 -0
- package/dist/theme.css.js +5 -0
- package/dist/theme.css.js.map +1 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/prism.d.ts +4 -0
- package/dist/utils/prism.d.ts.map +1 -0
- package/dist/utils/prism.js +34 -0
- package/dist/utils/prism.js.map +1 -0
- package/dist/utils/theme-loader.d.ts +11 -0
- package/dist/utils/theme-loader.d.ts.map +1 -0
- package/dist/utils/theme-loader.js +17 -0
- package/dist/utils/theme-loader.js.map +1 -0
- package/dist/utils/transcriptToMarkdown.d.ts +14 -0
- package/dist/utils/transcriptToMarkdown.d.ts.map +1 -0
- package/dist/utils/transcriptToMarkdown.js +59 -0
- package/dist/utils/transcriptToMarkdown.js.map +1 -0
- package/dist/utils/use-google-font.d.ts +18 -0
- package/dist/utils/use-google-font.d.ts.map +1 -0
- package/dist/utils/use-google-font.js +12 -0
- package/dist/utils/use-google-font.js.map +1 -0
- package/dist/utils/user-variables.d.ts +20 -0
- package/dist/utils/user-variables.d.ts.map +1 -0
- package/dist/utils/user-variables.js +37 -0
- package/dist/utils/user-variables.js.map +1 -0
- package/package.json +104 -41
- package/dist/components/audio-level.d.ts.map +0 -1
- package/dist/components/audio-level.js +0 -203
- package/dist/components/audio-level.js.map +0 -1
- package/dist/components/call-controls.d.ts +0 -183
- package/dist/components/call-controls.d.ts.map +0 -1
- package/dist/components/call-controls.js +0 -606
- package/dist/components/call-controls.js.map +0 -1
- package/dist/components/call-media.d.ts +0 -118
- package/dist/components/call-media.d.ts.map +0 -1
- package/dist/components/call-media.js +0 -219
- package/dist/components/call-media.js.map +0 -1
- package/dist/components/call-status.d.ts +0 -83
- package/dist/components/call-status.d.ts.map +0 -1
- package/dist/components/call-status.js +0 -255
- package/dist/components/call-status.js.map +0 -1
- package/dist/components/click-to-call.d.ts +0 -151
- package/dist/components/click-to-call.d.ts.map +0 -1
- package/dist/components/click-to-call.js +0 -428
- package/dist/components/click-to-call.js.map +0 -1
- package/dist/components/device-selector.d.ts +0 -238
- package/dist/components/device-selector.d.ts.map +0 -1
- package/dist/components/device-selector.js +0 -685
- package/dist/components/device-selector.js.map +0 -1
- package/dist/components/dialpad.d.ts +0 -74
- package/dist/components/dialpad.d.ts.map +0 -1
- package/dist/components/dialpad.js +0 -372
- package/dist/components/dialpad.js.map +0 -1
- package/dist/components/directory.d.ts.map +0 -1
- package/dist/components/directory.js +0 -503
- package/dist/components/directory.js.map +0 -1
- package/dist/components/example-button.d.ts +0 -21
- package/dist/components/example-button.d.ts.map +0 -1
- package/dist/components/example-button.js +0 -74
- package/dist/components/example-button.js.map +0 -1
- package/dist/components/participant-controls.d.ts +0 -123
- package/dist/components/participant-controls.d.ts.map +0 -1
- package/dist/components/participant-controls.js +0 -468
- package/dist/components/participant-controls.js.map +0 -1
- package/dist/components/participants.d.ts +0 -120
- package/dist/components/participants.d.ts.map +0 -1
- package/dist/components/participants.js +0 -394
- package/dist/components/participants.js.map +0 -1
- package/dist/components/self-media.d.ts +0 -78
- package/dist/components/self-media.d.ts.map +0 -1
- package/dist/components/self-media.js +0 -129
- package/dist/components/self-media.js.map +0 -1
- package/dist/context/call-context.d.ts +0 -13
- package/dist/context/call-context.d.ts.map +0 -1
- package/dist/context/call-context.js +0 -6
- package/dist/context/call-context.js.map +0 -1
- package/dist/types/index.js +0 -12
- package/dist/types/index.js.map +0 -1
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { LitElement as g, html as d, css as _ } from "lit";
|
|
2
|
+
import { state as h, property as l, customElement as f } from "lit/decorators.js";
|
|
3
|
+
import { consume as p } from "@lit/context";
|
|
4
|
+
import { devicesContext as v } from "../context/devices-context.js";
|
|
5
|
+
import { callStateContext as S } from "../context/call-state-context.js";
|
|
6
|
+
import { getLogger as w } from "@signalwire/js";
|
|
7
|
+
var b = Object.defineProperty, m = Object.getOwnPropertyDescriptor, n = (e, s, i, t) => {
|
|
8
|
+
for (var o = t > 1 ? void 0 : t ? m(s, i) : s, c = e.length - 1, u; c >= 0; c--)
|
|
9
|
+
(u = e[c]) && (o = (t ? u(s, i, o) : u(o)) || o);
|
|
10
|
+
return t && o && b(s, i, o), o;
|
|
11
|
+
};
|
|
12
|
+
const a = w();
|
|
13
|
+
let r = class extends g {
|
|
14
|
+
constructor() {
|
|
15
|
+
super(...arguments), this._directSelf = null, this._directSubscriptions = [], this._fullscreen = !1, this.showScreenShare = !0, this.showHandRaise = !0, this.showTranscript = !1, this.transcriptActive = !1, this.showSettings = !0, this.showFullscreen = !0;
|
|
16
|
+
}
|
|
17
|
+
// ── Lifecycle ─────────────────────────────────────────────────────────────
|
|
18
|
+
updated(e) {
|
|
19
|
+
super.updated(e), e.has("call") && (this._teardownDirect(), this.call && this._directSubscriptions.push(
|
|
20
|
+
this.call.self$.subscribe((s) => this._directSelf = s)
|
|
21
|
+
));
|
|
22
|
+
}
|
|
23
|
+
disconnectedCallback() {
|
|
24
|
+
super.disconnectedCallback(), this._teardownDirect();
|
|
25
|
+
}
|
|
26
|
+
_teardownDirect() {
|
|
27
|
+
this._directSubscriptions.forEach((e) => e.unsubscribe()), this._directSubscriptions = [], this._directSelf = null;
|
|
28
|
+
}
|
|
29
|
+
get _effectiveSelf() {
|
|
30
|
+
var e;
|
|
31
|
+
return this.call ? this._directSelf : ((e = this._callState) == null ? void 0 : e.self) ?? null;
|
|
32
|
+
}
|
|
33
|
+
// ── Helpers ───────────────────────────────────────────────────────────────
|
|
34
|
+
_toDropupOptions(e, s) {
|
|
35
|
+
const i = /* @__PURE__ */ new Set(), t = [];
|
|
36
|
+
for (const o of e) {
|
|
37
|
+
const c = o.deviceId || `__default_${o.kind}`;
|
|
38
|
+
i.has(c) || (i.add(c), t.push({
|
|
39
|
+
id: c,
|
|
40
|
+
label: o.label || (o.deviceId ? o.deviceId.slice(0, 12) : "Default"),
|
|
41
|
+
selected: o.deviceId === (s == null ? void 0 : s.deviceId)
|
|
42
|
+
}));
|
|
43
|
+
}
|
|
44
|
+
return t;
|
|
45
|
+
}
|
|
46
|
+
// ── Handlers ─────────────────────────────────────────────────────────────
|
|
47
|
+
_onMicToggle() {
|
|
48
|
+
var e;
|
|
49
|
+
(e = this._devices) == null || e.toggleAudioMute();
|
|
50
|
+
}
|
|
51
|
+
_onCameraToggle() {
|
|
52
|
+
var e;
|
|
53
|
+
(e = this._devices) == null || e.toggleVideoMute();
|
|
54
|
+
}
|
|
55
|
+
_onSpeakerToggle() {
|
|
56
|
+
var e;
|
|
57
|
+
(e = this._devices) == null || e.toggleSpeakerMute();
|
|
58
|
+
}
|
|
59
|
+
_onFullscreenToggle(e) {
|
|
60
|
+
this._fullscreen = e.detail.fullscreen;
|
|
61
|
+
}
|
|
62
|
+
_onScreenShareToggle(e) {
|
|
63
|
+
const s = this._effectiveSelf;
|
|
64
|
+
s && (e.detail.active ? s.startScreenShare().catch((i) => {
|
|
65
|
+
a.error("[CallControls] Screen share failed:", i);
|
|
66
|
+
}) : s.stopScreenShare().catch((i) => {
|
|
67
|
+
a.error("[CallControls] Stop screen share failed:", i);
|
|
68
|
+
}));
|
|
69
|
+
}
|
|
70
|
+
_onHandRaiseToggle(e) {
|
|
71
|
+
const s = this._effectiveSelf;
|
|
72
|
+
s && s.toggleHandraise().catch((i) => {
|
|
73
|
+
a.error("[CallControls] Hand raise failed:", i);
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
_onHangUp() {
|
|
77
|
+
var s;
|
|
78
|
+
const e = this.call ? () => this.call.hangup() : (s = this._callState) == null ? void 0 : s.hangup;
|
|
79
|
+
e == null || e().catch((i) => {
|
|
80
|
+
a.error("[CallControls] Hangup failed:", i);
|
|
81
|
+
}), this.dispatchEvent(new CustomEvent("sw-call-hangup", { bubbles: !0, composed: !0 }));
|
|
82
|
+
}
|
|
83
|
+
_onDeviceChange(e) {
|
|
84
|
+
if (!this._devices) return;
|
|
85
|
+
const { kind: s, deviceId: i } = e.detail, t = (o) => o.find((c) => c.deviceId === i) ?? null;
|
|
86
|
+
s === "mic" && this._devices.selectAudioInput(t(this._devices.audioInputDevices)), s === "camera" && this._devices.selectVideoInput(t(this._devices.videoInputDevices)), s === "speaker" && this._devices.selectAudioOutput(t(this._devices.audioOutputDevices));
|
|
87
|
+
}
|
|
88
|
+
_onSettingsChange(e) {
|
|
89
|
+
if (!this._devices) return;
|
|
90
|
+
const { settingId: s } = e.detail, t = {
|
|
91
|
+
"echo-cancellation": () => this._devices.toggleEchoCancellation(),
|
|
92
|
+
"auto-gain": () => this._devices.toggleAutoGain(),
|
|
93
|
+
"noise-suppression": () => this._devices.toggleNoiseSuppression()
|
|
94
|
+
}[s];
|
|
95
|
+
t && t().catch((o) => a.error("[CallControls] Settings toggle failed:", o));
|
|
96
|
+
}
|
|
97
|
+
_buildSettingsItems() {
|
|
98
|
+
return [
|
|
99
|
+
{ id: "echo-cancellation", label: "Echo Cancellation", selected: this._devices.echoCancellation },
|
|
100
|
+
{ id: "auto-gain", label: "Auto Gain", selected: this._devices.autoGain },
|
|
101
|
+
{ id: "noise-suppression", label: "Noise Suppression", selected: this._devices.noiseSuppression }
|
|
102
|
+
];
|
|
103
|
+
}
|
|
104
|
+
// ── Render ────────────────────────────────────────────────────────────────
|
|
105
|
+
render() {
|
|
106
|
+
if (!this._devices && !this.call) return d``;
|
|
107
|
+
const e = this._effectiveSelf, s = (e == null ? void 0 : e.screenShareStatus) === "started", i = (e == null ? void 0 : e.handraised) ?? !1, t = this._devices;
|
|
108
|
+
return d`
|
|
109
|
+
<sw-ui-control-bar
|
|
110
|
+
exportparts="bar,logo,button,chevron"
|
|
111
|
+
.micMuted=${(t == null ? void 0 : t.audioMuted) ?? !1}
|
|
112
|
+
.cameraMuted=${(t == null ? void 0 : t.videoMuted) ?? !1}
|
|
113
|
+
.speakerMuted=${(t == null ? void 0 : t.speakerMuted) ?? !1}
|
|
114
|
+
.fullscreen=${this._fullscreen}
|
|
115
|
+
.screenSharing=${s}
|
|
116
|
+
.handRaised=${i}
|
|
117
|
+
.transcriptActive=${this.transcriptActive}
|
|
118
|
+
.showScreenShare=${this.showScreenShare}
|
|
119
|
+
.showHandRaise=${this.showHandRaise}
|
|
120
|
+
.showTranscript=${this.showTranscript}
|
|
121
|
+
.showSettings=${this.showSettings && !!t}
|
|
122
|
+
.showFullscreen=${this.showFullscreen}
|
|
123
|
+
.micDevices=${t ? this._toDropupOptions(t.audioInputDevices, t.selectedAudioInput) : []}
|
|
124
|
+
.cameraDevices=${t ? this._toDropupOptions(t.videoInputDevices, t.selectedVideoInput) : []}
|
|
125
|
+
.speakerDevices=${t ? this._toDropupOptions(t.audioOutputDevices, t.selectedAudioOutput) : []}
|
|
126
|
+
.settingsItems=${t ? this._buildSettingsItems() : []}
|
|
127
|
+
@sw-mic-toggle=${this._onMicToggle}
|
|
128
|
+
@sw-camera-toggle=${this._onCameraToggle}
|
|
129
|
+
@sw-speaker-toggle=${this._onSpeakerToggle}
|
|
130
|
+
@sw-fullscreen-toggle=${this._onFullscreenToggle}
|
|
131
|
+
@sw-screen-share-toggle=${this._onScreenShareToggle}
|
|
132
|
+
@sw-hand-raise-toggle=${this._onHandRaiseToggle}
|
|
133
|
+
@sw-call-hangup=${this._onHangUp}
|
|
134
|
+
@sw-device-change=${this._onDeviceChange}
|
|
135
|
+
@sw-settings-change=${this._onSettingsChange}
|
|
136
|
+
></sw-ui-control-bar>
|
|
137
|
+
`;
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
r.styles = _`
|
|
141
|
+
:host {
|
|
142
|
+
display: block;
|
|
143
|
+
}
|
|
144
|
+
`;
|
|
145
|
+
n([
|
|
146
|
+
p({ context: v, subscribe: !0 }),
|
|
147
|
+
h()
|
|
148
|
+
], r.prototype, "_devices", 2);
|
|
149
|
+
n([
|
|
150
|
+
p({ context: S, subscribe: !0 }),
|
|
151
|
+
h()
|
|
152
|
+
], r.prototype, "_callState", 2);
|
|
153
|
+
n([
|
|
154
|
+
l({ type: Object })
|
|
155
|
+
], r.prototype, "call", 2);
|
|
156
|
+
n([
|
|
157
|
+
h()
|
|
158
|
+
], r.prototype, "_directSelf", 2);
|
|
159
|
+
n([
|
|
160
|
+
h()
|
|
161
|
+
], r.prototype, "_fullscreen", 2);
|
|
162
|
+
n([
|
|
163
|
+
l({ type: Boolean, reflect: !0, attribute: "show-screen-share" })
|
|
164
|
+
], r.prototype, "showScreenShare", 2);
|
|
165
|
+
n([
|
|
166
|
+
l({ type: Boolean, reflect: !0, attribute: "show-hand-raise" })
|
|
167
|
+
], r.prototype, "showHandRaise", 2);
|
|
168
|
+
n([
|
|
169
|
+
l({ type: Boolean, reflect: !0, attribute: "show-transcript" })
|
|
170
|
+
], r.prototype, "showTranscript", 2);
|
|
171
|
+
n([
|
|
172
|
+
l({ type: Boolean, reflect: !0, attribute: "transcript-active" })
|
|
173
|
+
], r.prototype, "transcriptActive", 2);
|
|
174
|
+
n([
|
|
175
|
+
l({ type: Boolean, reflect: !0, attribute: "show-settings" })
|
|
176
|
+
], r.prototype, "showSettings", 2);
|
|
177
|
+
n([
|
|
178
|
+
l({ type: Boolean, reflect: !0, attribute: "show-fullscreen" })
|
|
179
|
+
], r.prototype, "showFullscreen", 2);
|
|
180
|
+
r = n([
|
|
181
|
+
f("sw-call-controls")
|
|
182
|
+
], r);
|
|
183
|
+
export {
|
|
184
|
+
r as SwCallControls
|
|
185
|
+
};
|
|
186
|
+
//# sourceMappingURL=sw-call-controls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sw-call-controls.js","sources":["../../src/components/sw-call-controls.ts"],"sourcesContent":["import { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { consume } from '@lit/context';\nimport { Subscription } from 'rxjs';\nimport { devicesContext, type DevicesState } from '../context/devices-context.js';\nimport { callStateContext, type CallState } from '../context/call-state-context.js';\nimport type { DropUpItem } from './UI/controls/sw-ui-dropup.js';\nimport type {\n FullscreenToggleDetail,\n ScreenShareToggleDetail,\n HandRaiseToggleDetail,\n SettingsChangeDetail,\n} from './UI/controls/sw-ui-control-bar.js';\nimport { getLogger } from '@signalwire/js';\nimport type { CallSelfParticipant } from '@signalwire/js';\nimport type { Call } from '../types/index.js';\n\nconst logger = getLogger();\n\n/**\n * Connected control bar that bridges `devicesContext` and `callStateContext`\n * to the pure `sw-ui-control-bar` UI component.\n *\n * Input precedence (most specific wins): `.call` > context.\n * When `.call` is set, the control bar drives screen-share / hand-raise /\n * hang-up directly from the Call. Mic/camera/speaker toggles still require\n * `devicesContext` — without it those buttons render in their default state.\n *\n * @prop {Call} call - explicit Call object (overrides context)\n * @prop {boolean} showScreenShare - show the screen-share button\n * @prop {boolean} showHandRaise - show the hand-raise button\n * @prop {boolean} showTranscript - show the transcript toggle button\n * @prop {boolean} transcriptActive - current transcript panel visibility\n *\n * @fires sw-call-hangup - Re-dispatched when the user clicks hang-up so external\n * consumers (e.g. React parents) can react. No detail.\n */\n@customElement('sw-call-controls')\nexport class SwCallControls extends LitElement {\n static styles = css`\n :host {\n display: block;\n }\n `;\n\n @consume({ context: devicesContext, subscribe: true })\n @state()\n private _devices!: DevicesState;\n\n @consume({ context: callStateContext, subscribe: true })\n @state()\n private _callState?: CallState;\n\n /** Explicit Call — when set, drives call-state actions directly. */\n @property({ type: Object }) call?: Call;\n\n @state() private _directSelf: CallSelfParticipant | null = null;\n\n private _directSubscriptions: Subscription[] = [];\n\n @state() private _fullscreen = false;\n\n @property({ type: Boolean, reflect: true, attribute: 'show-screen-share' })\n showScreenShare = true;\n\n @property({ type: Boolean, reflect: true, attribute: 'show-hand-raise' })\n showHandRaise = true;\n\n @property({ type: Boolean, reflect: true, attribute: 'show-transcript' })\n showTranscript = false;\n\n @property({ type: Boolean, reflect: true, attribute: 'transcript-active' })\n transcriptActive = false;\n\n @property({ type: Boolean, reflect: true, attribute: 'show-settings' })\n showSettings = true;\n\n @property({ type: Boolean, reflect: true, attribute: 'show-fullscreen' })\n showFullscreen = true;\n\n // ── Lifecycle ─────────────────────────────────────────────────────────────\n\n protected updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n if (changed.has('call')) {\n this._teardownDirect();\n if (this.call) {\n this._directSubscriptions.push(\n this.call.self$.subscribe((s) => (this._directSelf = s))\n );\n }\n }\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this._teardownDirect();\n }\n\n private _teardownDirect(): void {\n this._directSubscriptions.forEach((s) => s.unsubscribe());\n this._directSubscriptions = [];\n this._directSelf = null;\n }\n\n private get _effectiveSelf(): CallSelfParticipant | null {\n return this.call ? this._directSelf : this._callState?.self ?? null;\n }\n\n // ── Helpers ───────────────────────────────────────────────────────────────\n\n private _toDropupOptions(\n devices: MediaDeviceInfo[],\n selected: MediaDeviceInfo | null\n ): DropUpItem[] {\n // Before getUserMedia permission, browsers may return devices with\n // empty deviceId/label. Deduplicate empty-ID entries into one\n // placeholder so the chevron doesn't show multiple blank rows.\n const seen = new Set<string>();\n const result: DropUpItem[] = [];\n for (const d of devices) {\n const id = d.deviceId || `__default_${d.kind}`;\n if (seen.has(id)) continue;\n seen.add(id);\n result.push({\n id,\n label: d.label || (d.deviceId ? d.deviceId.slice(0, 12) : 'Default'),\n selected: d.deviceId === selected?.deviceId,\n });\n }\n return result;\n }\n\n // ── Handlers ─────────────────────────────────────────────────────────────\n\n private _onMicToggle() {\n this._devices?.toggleAudioMute();\n }\n\n private _onCameraToggle() {\n this._devices?.toggleVideoMute();\n }\n\n private _onSpeakerToggle() {\n this._devices?.toggleSpeakerMute();\n }\n\n private _onFullscreenToggle(e: CustomEvent<FullscreenToggleDetail>) {\n this._fullscreen = e.detail.fullscreen;\n }\n\n private _onScreenShareToggle(e: CustomEvent<ScreenShareToggleDetail>) {\n const self = this._effectiveSelf;\n if (!self) return;\n\n if (e.detail.active) {\n self.startScreenShare().catch((err) => {\n logger.error('[CallControls] Screen share failed:', err);\n });\n } else {\n self.stopScreenShare().catch((err) => {\n logger.error('[CallControls] Stop screen share failed:', err);\n });\n }\n }\n\n private _onHandRaiseToggle(_e: CustomEvent<HandRaiseToggleDetail>) {\n const self = this._effectiveSelf;\n if (!self) return;\n\n self.toggleHandraise().catch((err) => {\n logger.error('[CallControls] Hand raise failed:', err);\n });\n }\n\n private _onHangUp() {\n const hangup = this.call ? () => this.call!.hangup() : this._callState?.hangup;\n hangup?.().catch((err) => {\n logger.error('[CallControls] Hangup failed:', err);\n });\n // Re-dispatch as sw-call-hangup so external consumers (e.g. React) can react.\n this.dispatchEvent(new CustomEvent('sw-call-hangup', { bubbles: true, composed: true }));\n }\n\n private _onDeviceChange(e: CustomEvent<{ kind: 'mic' | 'camera' | 'speaker'; deviceId: string }>) {\n if (!this._devices) return;\n const { kind, deviceId } = e.detail;\n const find = (list: MediaDeviceInfo[]) => list.find((d) => d.deviceId === deviceId) ?? null;\n\n if (kind === 'mic') this._devices.selectAudioInput(find(this._devices.audioInputDevices));\n if (kind === 'camera') this._devices.selectVideoInput(find(this._devices.videoInputDevices));\n if (kind === 'speaker') this._devices.selectAudioOutput(find(this._devices.audioOutputDevices));\n }\n\n private _onSettingsChange(e: CustomEvent<SettingsChangeDetail>) {\n if (!this._devices) return;\n const { settingId } = e.detail;\n const toggles: Record<string, () => Promise<void>> = {\n 'echo-cancellation': () => this._devices.toggleEchoCancellation(),\n 'auto-gain': () => this._devices.toggleAutoGain(),\n 'noise-suppression': () => this._devices.toggleNoiseSuppression(),\n };\n const toggle = toggles[settingId];\n if (toggle) {\n toggle().catch((err) => logger.error('[CallControls] Settings toggle failed:', err));\n }\n }\n\n private _buildSettingsItems(): DropUpItem[] {\n return [\n { id: 'echo-cancellation', label: 'Echo Cancellation', selected: this._devices.echoCancellation },\n { id: 'auto-gain', label: 'Auto Gain', selected: this._devices.autoGain },\n { id: 'noise-suppression', label: 'Noise Suppression', selected: this._devices.noiseSuppression },\n ];\n }\n\n // ── Render ────────────────────────────────────────────────────────────────\n\n render() {\n if (!this._devices && !this.call) return html``;\n\n const self = this._effectiveSelf;\n const isScreenSharing = self?.screenShareStatus === 'started';\n const isHandRaised = self?.handraised ?? false;\n\n const d = this._devices;\n return html`\n <sw-ui-control-bar\n exportparts=\"bar,logo,button,chevron\"\n .micMuted=${d?.audioMuted ?? false}\n .cameraMuted=${d?.videoMuted ?? false}\n .speakerMuted=${d?.speakerMuted ?? false}\n .fullscreen=${this._fullscreen}\n .screenSharing=${isScreenSharing}\n .handRaised=${isHandRaised}\n .transcriptActive=${this.transcriptActive}\n .showScreenShare=${this.showScreenShare}\n .showHandRaise=${this.showHandRaise}\n .showTranscript=${this.showTranscript}\n .showSettings=${this.showSettings && !!d}\n .showFullscreen=${this.showFullscreen}\n .micDevices=${d ? this._toDropupOptions(d.audioInputDevices, d.selectedAudioInput) : []}\n .cameraDevices=${d ? this._toDropupOptions(d.videoInputDevices, d.selectedVideoInput) : []}\n .speakerDevices=${d ? this._toDropupOptions(d.audioOutputDevices, d.selectedAudioOutput) : []}\n .settingsItems=${d ? this._buildSettingsItems() : []}\n @sw-mic-toggle=${this._onMicToggle}\n @sw-camera-toggle=${this._onCameraToggle}\n @sw-speaker-toggle=${this._onSpeakerToggle}\n @sw-fullscreen-toggle=${this._onFullscreenToggle}\n @sw-screen-share-toggle=${this._onScreenShareToggle}\n @sw-hand-raise-toggle=${this._onHandRaiseToggle}\n @sw-call-hangup=${this._onHangUp}\n @sw-device-change=${this._onDeviceChange}\n @sw-settings-change=${this._onSettingsChange}\n ></sw-ui-control-bar>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'sw-call-controls': SwCallControls;\n }\n}\n"],"names":["logger","getLogger","SwCallControls","LitElement","changed","s","_a","devices","selected","seen","result","d","id","self","err","_e","hangup","kind","deviceId","find","list","settingId","toggle","html","isScreenSharing","isHandRaised","css","__decorateClass","consume","devicesContext","state","callStateContext","property","customElement"],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Call Dialpad Component
|
|
3
|
+
*
|
|
4
|
+
* Wrapper around `sw-dialpad` that integrates with a Call.
|
|
5
|
+
* When a call is connected, digit presses send DTMF tones.
|
|
6
|
+
* When no call is active, the dial event bubbles up for the parent to handle.
|
|
7
|
+
*
|
|
8
|
+
* Input precedence (most specific wins): `.call` > context.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```html
|
|
12
|
+
* <sw-call-dialpad></sw-call-dialpad>
|
|
13
|
+
* <sw-call-dialpad .call=${call}></sw-call-dialpad>
|
|
14
|
+
* <sw-call-dialpad show-call-button @sw-dial=${onDial}></sw-call-dialpad>
|
|
15
|
+
* ```
|
|
16
|
+
*
|
|
17
|
+
* @csspart container - Outer dialpad container.
|
|
18
|
+
* @csspart display - Number / text display field.
|
|
19
|
+
* @csspart keypad - Grid of digit keys.
|
|
20
|
+
* @csspart key - Individual digit button.
|
|
21
|
+
* @csspart key-pressed - Digit button while pressed.
|
|
22
|
+
* @csspart call-button - The call button (when `show-call-button`).
|
|
23
|
+
*
|
|
24
|
+
* @fires sw-digit-press - A digit was pressed. Detail: `{ digit: string, digits: string }`.
|
|
25
|
+
* @fires sw-dial - User pressed the call button. Detail: `{ digits: string }`.
|
|
26
|
+
*/
|
|
27
|
+
import { LitElement } from 'lit';
|
|
28
|
+
import type { Call } from '../types/index.js';
|
|
29
|
+
import './UI/controls/sw-ui-dialpad.js';
|
|
30
|
+
export declare class SwCallDialpad extends LitElement {
|
|
31
|
+
private _callState?;
|
|
32
|
+
/** Explicit Call — when set, drives DTMF directly and bypasses context. */
|
|
33
|
+
call?: Call;
|
|
34
|
+
private _directStatus;
|
|
35
|
+
private _directSubscriptions;
|
|
36
|
+
/** Whether to display the call button below the keypad. */
|
|
37
|
+
showCallButton: boolean;
|
|
38
|
+
/** Allow free-text input in the display field (e.g., SIP URIs, vanity letters). */
|
|
39
|
+
allowText: boolean;
|
|
40
|
+
/** Placeholder text shown in the digit display input. */
|
|
41
|
+
placeholder: string;
|
|
42
|
+
protected updated(changed: Map<string, unknown>): void;
|
|
43
|
+
disconnectedCallback(): void;
|
|
44
|
+
private _onDigitPress;
|
|
45
|
+
render(): import("lit-html").TemplateResult<1>;
|
|
46
|
+
}
|
|
47
|
+
declare global {
|
|
48
|
+
interface HTMLElementTagNameMap {
|
|
49
|
+
'sw-call-dialpad': SwCallDialpad;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=sw-call-dialpad.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sw-call-dialpad.d.ts","sourceRoot":"","sources":["../../src/components/sw-call-dialpad.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,UAAU,EAAQ,MAAM,KAAK,CAAC;AAMvC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAE9C,OAAO,gCAAgC,CAAC;AAIxC,qBACa,aAAc,SAAQ,UAAU;IAG3C,OAAO,CAAC,UAAU,CAAC,CAAY;IAE/B,2EAA2E;IAC/C,IAAI,CAAC,EAAE,IAAI,CAAC;IAE/B,OAAO,CAAC,aAAa,CAA2B;IAEzD,OAAO,CAAC,oBAAoB,CAAsB;IAElD,2DAA2D;IAE3D,cAAc,UAAS;IAEvB,mFAAmF;IAEnF,SAAS,UAAS;IAElB,yDAAyD;IAEzD,WAAW,SAAkB;IAE7B,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IActD,oBAAoB;IAMpB,OAAO,CAAC,aAAa;IAarB,MAAM;CAWP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,iBAAiB,EAAE,aAAa,CAAC;KAClC;CACF"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { LitElement as n, html as d } from "lit";
|
|
2
|
+
import { state as u, property as p, customElement as h } from "lit/decorators.js";
|
|
3
|
+
import { consume as b } from "@lit/context";
|
|
4
|
+
import { callStateContext as _ } from "../context/call-state-context.js";
|
|
5
|
+
import { getLogger as f } from "@signalwire/js";
|
|
6
|
+
var m = Object.defineProperty, w = Object.getOwnPropertyDescriptor, o = (s, t, c, r) => {
|
|
7
|
+
for (var e = r > 1 ? void 0 : r ? w(t, c) : t, a = s.length - 1, l; a >= 0; a--)
|
|
8
|
+
(l = s[a]) && (e = (r ? l(t, c, e) : l(e)) || e);
|
|
9
|
+
return r && e && m(t, c, e), e;
|
|
10
|
+
};
|
|
11
|
+
const S = f();
|
|
12
|
+
let i = class extends n {
|
|
13
|
+
constructor() {
|
|
14
|
+
super(...arguments), this._directStatus = null, this._directSubscriptions = [], this.showCallButton = !1, this.allowText = !1, this.placeholder = "Enter number";
|
|
15
|
+
}
|
|
16
|
+
updated(s) {
|
|
17
|
+
super.updated(s), s.has("call") && (this._directSubscriptions.forEach((t) => t.unsubscribe()), this._directSubscriptions = [], this._directStatus = null, this.call && this._directSubscriptions.push(
|
|
18
|
+
this.call.status$.subscribe((t) => this._directStatus = t)
|
|
19
|
+
));
|
|
20
|
+
}
|
|
21
|
+
disconnectedCallback() {
|
|
22
|
+
super.disconnectedCallback(), this._directSubscriptions.forEach((s) => s.unsubscribe()), this._directSubscriptions = [];
|
|
23
|
+
}
|
|
24
|
+
_onDigitPress(s) {
|
|
25
|
+
var e, a;
|
|
26
|
+
const { digit: t } = s.detail;
|
|
27
|
+
if ((this.call ? this._directStatus : (e = this._callState) == null ? void 0 : e.status) !== "connected") return;
|
|
28
|
+
const r = this.call ? (l) => this.call.sendDigits(l) : (a = this._callState) == null ? void 0 : a.sendDigits;
|
|
29
|
+
r == null || r(t).catch((l) => {
|
|
30
|
+
S.error("Failed to send DTMF:", l);
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
render() {
|
|
34
|
+
return d`
|
|
35
|
+
<sw-ui-dialpad
|
|
36
|
+
exportparts="container,display,keypad,key,key-pressed,call-button"
|
|
37
|
+
?show-call-button=${this.showCallButton}
|
|
38
|
+
?allow-text=${this.allowText}
|
|
39
|
+
placeholder=${this.placeholder}
|
|
40
|
+
@sw-digit-press=${this._onDigitPress}
|
|
41
|
+
></sw-ui-dialpad>
|
|
42
|
+
`;
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
o([
|
|
46
|
+
b({ context: _, subscribe: !0 }),
|
|
47
|
+
u()
|
|
48
|
+
], i.prototype, "_callState", 2);
|
|
49
|
+
o([
|
|
50
|
+
p({ type: Object })
|
|
51
|
+
], i.prototype, "call", 2);
|
|
52
|
+
o([
|
|
53
|
+
u()
|
|
54
|
+
], i.prototype, "_directStatus", 2);
|
|
55
|
+
o([
|
|
56
|
+
p({ type: Boolean, reflect: !0, attribute: "show-call-button" })
|
|
57
|
+
], i.prototype, "showCallButton", 2);
|
|
58
|
+
o([
|
|
59
|
+
p({ type: Boolean, reflect: !0, attribute: "allow-text" })
|
|
60
|
+
], i.prototype, "allowText", 2);
|
|
61
|
+
o([
|
|
62
|
+
p({ type: String })
|
|
63
|
+
], i.prototype, "placeholder", 2);
|
|
64
|
+
i = o([
|
|
65
|
+
h("sw-call-dialpad")
|
|
66
|
+
], i);
|
|
67
|
+
export {
|
|
68
|
+
i as SwCallDialpad
|
|
69
|
+
};
|
|
70
|
+
//# sourceMappingURL=sw-call-dialpad.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sw-call-dialpad.js","sources":["../../src/components/sw-call-dialpad.ts"],"sourcesContent":["/**\n * Call Dialpad Component\n *\n * Wrapper around `sw-dialpad` that integrates with a Call.\n * When a call is connected, digit presses send DTMF tones.\n * When no call is active, the dial event bubbles up for the parent to handle.\n *\n * Input precedence (most specific wins): `.call` > context.\n *\n * @example\n * ```html\n * <sw-call-dialpad></sw-call-dialpad>\n * <sw-call-dialpad .call=${call}></sw-call-dialpad>\n * <sw-call-dialpad show-call-button @sw-dial=${onDial}></sw-call-dialpad>\n * ```\n *\n * @csspart container - Outer dialpad container.\n * @csspart display - Number / text display field.\n * @csspart keypad - Grid of digit keys.\n * @csspart key - Individual digit button.\n * @csspart key-pressed - Digit button while pressed.\n * @csspart call-button - The call button (when `show-call-button`).\n *\n * @fires sw-digit-press - A digit was pressed. Detail: `{ digit: string, digits: string }`.\n * @fires sw-dial - User pressed the call button. Detail: `{ digits: string }`.\n */\n\nimport { LitElement, html } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { consume } from '@lit/context';\nimport { Subscription } from 'rxjs';\nimport type { CallStatus } from '@signalwire/js';\nimport { callStateContext, type CallState } from '../context/call-state-context.js';\nimport type { Call } from '../types/index.js';\nimport { getLogger } from '@signalwire/js';\nimport './UI/controls/sw-ui-dialpad.js';\n\nconst logger = getLogger();\n\n@customElement('sw-call-dialpad')\nexport class SwCallDialpad extends LitElement {\n @consume({ context: callStateContext, subscribe: true })\n @state()\n private _callState?: CallState;\n\n /** Explicit Call — when set, drives DTMF directly and bypasses context. */\n @property({ type: Object }) call?: Call;\n\n @state() private _directStatus: CallStatus | null = null;\n\n private _directSubscriptions: Subscription[] = [];\n\n /** Whether to display the call button below the keypad. */\n @property({ type: Boolean, reflect: true, attribute: 'show-call-button' })\n showCallButton = false;\n\n /** Allow free-text input in the display field (e.g., SIP URIs, vanity letters). */\n @property({ type: Boolean, reflect: true, attribute: 'allow-text' })\n allowText = false;\n\n /** Placeholder text shown in the digit display input. */\n @property({ type: String })\n placeholder = 'Enter number';\n\n protected updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n if (changed.has('call')) {\n this._directSubscriptions.forEach((s) => s.unsubscribe());\n this._directSubscriptions = [];\n this._directStatus = null;\n if (this.call) {\n this._directSubscriptions.push(\n this.call.status$.subscribe((s) => (this._directStatus = s))\n );\n }\n }\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this._directSubscriptions.forEach((s) => s.unsubscribe());\n this._directSubscriptions = [];\n }\n\n private _onDigitPress(e: CustomEvent<{ digit: string; digits: string }>) {\n const { digit } = e.detail;\n const status = this.call ? this._directStatus : this._callState?.status;\n if (status !== 'connected') return;\n\n const send = this.call\n ? (d: string) => this.call!.sendDigits(d)\n : this._callState?.sendDigits;\n send?.(digit).catch((err: unknown) => {\n logger.error('Failed to send DTMF:', err);\n });\n }\n\n render() {\n return html`\n <sw-ui-dialpad\n exportparts=\"container,display,keypad,key,key-pressed,call-button\"\n ?show-call-button=${this.showCallButton}\n ?allow-text=${this.allowText}\n placeholder=${this.placeholder}\n @sw-digit-press=${this._onDigitPress}\n ></sw-ui-dialpad>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'sw-call-dialpad': SwCallDialpad;\n }\n}\n"],"names":["logger","getLogger","SwCallDialpad","LitElement","changed","s","e","digit","_a","send","d","_b","err","html","__decorateClass","consume","callStateContext","state","property","customElement"],"mappings":";;;;;;;;;;AAqCA,MAAMA,IAASC,EAAA;AAGR,IAAMC,IAAN,cAA4BC,EAAW;AAAA,EAAvC,cAAA;AAAA,UAAA,GAAA,SAAA,GAQI,KAAQ,gBAAmC,MAEpD,KAAQ,uBAAuC,CAAA,GAI/C,KAAA,iBAAiB,IAIjB,KAAA,YAAY,IAIZ,KAAA,cAAc;AAAA,EAAA;AAAA,EAEJ,QAAQC,GAAqC;AACrD,UAAM,QAAQA,CAAO,GACjBA,EAAQ,IAAI,MAAM,MACpB,KAAK,qBAAqB,QAAQ,CAACC,MAAMA,EAAE,aAAa,GACxD,KAAK,uBAAuB,CAAA,GAC5B,KAAK,gBAAgB,MACjB,KAAK,QACP,KAAK,qBAAqB;AAAA,MACxB,KAAK,KAAK,QAAQ,UAAU,CAACA,MAAO,KAAK,gBAAgBA,CAAE;AAAA,IAAA;AAAA,EAInE;AAAA,EAEA,uBAAuB;AACrB,UAAM,qBAAA,GACN,KAAK,qBAAqB,QAAQ,CAAC,MAAM,EAAE,aAAa,GACxD,KAAK,uBAAuB,CAAA;AAAA,EAC9B;AAAA,EAEQ,cAAcC,GAAmD;;AACvE,UAAM,EAAE,OAAAC,MAAUD,EAAE;AAEpB,SADe,KAAK,OAAO,KAAK,iBAAgBE,IAAA,KAAK,eAAL,gBAAAA,EAAiB,YAClD,YAAa;AAE5B,UAAMC,IAAO,KAAK,OACd,CAACC,MAAc,KAAK,KAAM,WAAWA,CAAC,KACtCC,IAAA,KAAK,eAAL,gBAAAA,EAAiB;AACrB,IAAAF,KAAA,QAAAA,EAAOF,GAAO,MAAM,CAACK,MAAiB;AACpC,MAAAZ,EAAO,MAAM,wBAAwBY,CAAG;AAAA,IAC1C;AAAA,EACF;AAAA,EAEA,SAAS;AACP,WAAOC;AAAA;AAAA;AAAA,4BAGiB,KAAK,cAAc;AAAA,sBACzB,KAAK,SAAS;AAAA,sBACd,KAAK,WAAW;AAAA,0BACZ,KAAK,aAAa;AAAA;AAAA;AAAA,EAG1C;AACF;AAjEUC,EAAA;AAAA,EAFPC,EAAQ,EAAE,SAASC,GAAkB,WAAW,IAAM;AAAA,EACtDC,EAAA;AAAM,GAFIf,EAGH,WAAA,cAAA,CAAA;AAGoBY,EAAA;AAAA,EAA3BI,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GANfhB,EAMiB,WAAA,QAAA,CAAA;AAEXY,EAAA;AAAA,EAAhBG,EAAA;AAAM,GARIf,EAQM,WAAA,iBAAA,CAAA;AAMjBY,EAAA;AAAA,EADCI,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM,WAAW,oBAAoB;AAAA,GAb9DhB,EAcX,WAAA,kBAAA,CAAA;AAIAY,EAAA;AAAA,EADCI,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM,WAAW,cAAc;AAAA,GAjBxDhB,EAkBX,WAAA,aAAA,CAAA;AAIAY,EAAA;AAAA,EADCI,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GArBfhB,EAsBX,WAAA,eAAA,CAAA;AAtBWA,IAANY,EAAA;AAAA,EADNK,EAAc,iBAAiB;AAAA,GACnBjB,CAAA;"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Call Media Component
|
|
3
|
+
*
|
|
4
|
+
* Renders the remote video stream with aspect-ratio-aware sizing.
|
|
5
|
+
*
|
|
6
|
+
* Input precedence (most specific wins): `.stream` > `.call` > context.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```html
|
|
10
|
+
* <!-- Inside a context provider (sw-call-widget): -->
|
|
11
|
+
* <sw-call-media></sw-call-media>
|
|
12
|
+
*
|
|
13
|
+
* <!-- With an explicit Call: -->
|
|
14
|
+
* <sw-call-media .call=${call}></sw-call-media>
|
|
15
|
+
*
|
|
16
|
+
* <!-- With a raw remote stream: -->
|
|
17
|
+
* <sw-call-media .stream=${remoteStream}></sw-call-media>
|
|
18
|
+
* ```
|
|
19
|
+
*
|
|
20
|
+
* @csspart container - Outer container that holds the video and overlay layers.
|
|
21
|
+
* @csspart video - The `<video>` element rendering the remote stream.
|
|
22
|
+
*
|
|
23
|
+
* @slot - Default slot for overlay layers (e.g. `<sw-self-media>`, `<sw-participants>`).
|
|
24
|
+
*/
|
|
25
|
+
import { LitElement } from 'lit';
|
|
26
|
+
import type { Call } from '../types/index.js';
|
|
27
|
+
export declare class SwCallMedia extends LitElement {
|
|
28
|
+
static styles: import("lit").CSSResult;
|
|
29
|
+
/**
|
|
30
|
+
* Explicit Call — when set, subscribes directly to its observables instead
|
|
31
|
+
* of relying on context. Overridden by `.stream` if both are set.
|
|
32
|
+
*/
|
|
33
|
+
call?: Call;
|
|
34
|
+
/**
|
|
35
|
+
* Explicit remote MediaStream — highest precedence. Bypasses both `.call`
|
|
36
|
+
* and context. Useful for raw rendering with no SDK at all.
|
|
37
|
+
*/
|
|
38
|
+
stream: MediaStream | null;
|
|
39
|
+
private _callState?;
|
|
40
|
+
private _devicesState?;
|
|
41
|
+
private _remoteStreamValue;
|
|
42
|
+
private _lastTrackSignature;
|
|
43
|
+
private _subscriptions;
|
|
44
|
+
private _resizeObserver?;
|
|
45
|
+
private _videoResizeHandler?;
|
|
46
|
+
private _windowResizeHandler?;
|
|
47
|
+
private _videoElement?;
|
|
48
|
+
private _paddingWrapper?;
|
|
49
|
+
connectedCallback(): void;
|
|
50
|
+
protected updated(changedProperties: Map<string, unknown>): void;
|
|
51
|
+
disconnectedCallback(): void;
|
|
52
|
+
protected firstUpdated(): void;
|
|
53
|
+
private _setupDirectSubscriptions;
|
|
54
|
+
private _computeTrackSignature;
|
|
55
|
+
private _cleanupDirectSubscriptions;
|
|
56
|
+
private _applySinkId;
|
|
57
|
+
private _setupResizeObserver;
|
|
58
|
+
private _recalculateDimensions;
|
|
59
|
+
private _cleanupResizeObserver;
|
|
60
|
+
private _cleanupVideoElement;
|
|
61
|
+
render(): import("lit-html").TemplateResult<1>;
|
|
62
|
+
}
|
|
63
|
+
declare global {
|
|
64
|
+
interface HTMLElementTagNameMap {
|
|
65
|
+
'sw-call-media': SwCallMedia;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=sw-call-media.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sw-call-media.d.ts","sourceRoot":"","sources":["../../src/components/sw-call-media.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAI5C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAS9C,qBACa,WAAY,SAAQ,UAAU;IACzC,MAAM,CAAC,MAAM,0BAyDX;IAEF;;;OAGG;IACyB,IAAI,CAAC,EAAE,IAAI,CAAC;IAExC;;;OAGG;IAC6B,MAAM,EAAE,WAAW,GAAG,IAAI,CAAQ;IAIlE,OAAO,CAAC,UAAU,CAAC,CAAY;IAI/B,OAAO,CAAC,aAAa,CAAC,CAAe;IAErC,OAAO,CAAC,kBAAkB,CAA4B;IACtD,OAAO,CAAC,mBAAmB,CAAM;IACjC,OAAO,CAAC,cAAc,CAAsB;IAC5C,OAAO,CAAC,eAAe,CAAC,CAAiB;IACzC,OAAO,CAAC,mBAAmB,CAAC,CAAa;IACzC,OAAO,CAAC,oBAAoB,CAAC,CAAa;IAC1C,OAAO,CAAC,aAAa,CAAC,CAAmB;IACzC,OAAO,CAAC,eAAe,CAAC,CAAiB;IAIzC,iBAAiB;IASjB,SAAS,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IA4ChE,oBAAoB;IAOpB,SAAS,CAAC,YAAY,IAAI,IAAI;IAW9B,OAAO,CAAC,yBAAyB;IAiBjC,OAAO,CAAC,sBAAsB;IAK9B,OAAO,CAAC,2BAA2B;IAOnC,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,oBAAoB;IAwB5B,OAAO,CAAC,sBAAsB;IA6D9B,OAAO,CAAC,sBAAsB;IAgB9B,OAAO,CAAC,oBAAoB;IAO5B,MAAM;CAoBP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,eAAe,EAAE,WAAW,CAAC;KAC9B;CACF"}
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import { LitElement as V, html as q, css as E } from "lit";
|
|
2
|
+
import { property as b, state as g, customElement as M } from "lit/decorators.js";
|
|
3
|
+
import { consume as w } from "@lit/context";
|
|
4
|
+
import { callStateContext as W } from "../context/call-state-context.js";
|
|
5
|
+
import { devicesContext as $ } from "../context/devices-context.js";
|
|
6
|
+
import { debounce as j } from "../utils/debounce.js";
|
|
7
|
+
import { attachMediaStream as _, waitForVideoReady as L, detachMediaStream as I } from "../utils/video.js";
|
|
8
|
+
import { getLogger as A } from "@signalwire/js";
|
|
9
|
+
var B = Object.defineProperty, X = Object.getOwnPropertyDescriptor, d = (t, e, s, o) => {
|
|
10
|
+
for (var i = o > 1 ? void 0 : o ? X(e, s) : e, a = t.length - 1, r; a >= 0; a--)
|
|
11
|
+
(r = t[a]) && (i = (o ? r(e, s, i) : r(i)) || i);
|
|
12
|
+
return o && i && B(e, s, i), i;
|
|
13
|
+
};
|
|
14
|
+
const Y = A();
|
|
15
|
+
let l = class extends V {
|
|
16
|
+
constructor() {
|
|
17
|
+
super(...arguments), this.stream = null, this._remoteStreamValue = null, this._lastTrackSignature = "", this._subscriptions = [];
|
|
18
|
+
}
|
|
19
|
+
// ── Lifecycle ──────────────────────────────────────────────────────
|
|
20
|
+
connectedCallback() {
|
|
21
|
+
super.connectedCallback(), !this.stream && this.call && this._setupDirectSubscriptions(), this.stream && (this._remoteStreamValue = this.stream, this._lastTrackSignature = this._computeTrackSignature(this.stream));
|
|
22
|
+
}
|
|
23
|
+
updated(t) {
|
|
24
|
+
var e, s, o, i, a;
|
|
25
|
+
if (super.updated(t), t.has("call") && (this._cleanupDirectSubscriptions(), !this.stream && this.call && this._setupDirectSubscriptions()), t.has("stream")) {
|
|
26
|
+
this._cleanupDirectSubscriptions();
|
|
27
|
+
const r = this.stream, n = this._computeTrackSignature(r);
|
|
28
|
+
if (r !== this._remoteStreamValue || n !== this._lastTrackSignature) {
|
|
29
|
+
this._remoteStreamValue = r, this._lastTrackSignature = n;
|
|
30
|
+
const c = (e = this.shadowRoot) == null ? void 0 : e.querySelector("video.mcu-video");
|
|
31
|
+
c && _(c, r);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
if (!this.stream && !this.call && t.has("_callState")) {
|
|
35
|
+
const r = ((s = this._callState) == null ? void 0 : s.remoteStream) ?? null, n = this._computeTrackSignature(r);
|
|
36
|
+
if (r !== this._remoteStreamValue || n !== this._lastTrackSignature) {
|
|
37
|
+
this._remoteStreamValue = r, this._lastTrackSignature = n;
|
|
38
|
+
const c = (o = this.shadowRoot) == null ? void 0 : o.querySelector("video.mcu-video");
|
|
39
|
+
c && _(c, r);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
t.has("_devicesState") && this._applySinkId(((a = (i = this._devicesState) == null ? void 0 : i.selectedAudioOutput) == null ? void 0 : a.deviceId) ?? "");
|
|
43
|
+
}
|
|
44
|
+
disconnectedCallback() {
|
|
45
|
+
super.disconnectedCallback(), this._cleanupDirectSubscriptions(), this._cleanupResizeObserver(), this._cleanupVideoElement();
|
|
46
|
+
}
|
|
47
|
+
firstUpdated() {
|
|
48
|
+
var e;
|
|
49
|
+
const t = (e = this.shadowRoot) == null ? void 0 : e.querySelector("video.mcu-video");
|
|
50
|
+
t && L(t).then(() => {
|
|
51
|
+
this.isConnected && this._setupResizeObserver();
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
// ── Direct call subscriptions (legacy / standalone) ────────────────
|
|
55
|
+
_setupDirectSubscriptions() {
|
|
56
|
+
this.call && this._subscriptions.push(
|
|
57
|
+
this.call.remoteStream$.subscribe((t) => {
|
|
58
|
+
var o;
|
|
59
|
+
const e = this._computeTrackSignature(t);
|
|
60
|
+
if (t === this._remoteStreamValue && e === this._lastTrackSignature)
|
|
61
|
+
return;
|
|
62
|
+
this._remoteStreamValue = t, this._lastTrackSignature = e, this.requestUpdate();
|
|
63
|
+
const s = (o = this.shadowRoot) == null ? void 0 : o.querySelector("video.mcu-video");
|
|
64
|
+
s && _(s, t);
|
|
65
|
+
})
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
_computeTrackSignature(t) {
|
|
69
|
+
return t ? t.getTracks().map((e) => `${e.kind}:${e.id}`).sort().join("|") : "";
|
|
70
|
+
}
|
|
71
|
+
_cleanupDirectSubscriptions() {
|
|
72
|
+
this._subscriptions.forEach((t) => t.unsubscribe()), this._subscriptions = [];
|
|
73
|
+
}
|
|
74
|
+
// ── Audio output ───────────────────────────────────────────────────
|
|
75
|
+
_applySinkId(t) {
|
|
76
|
+
var s;
|
|
77
|
+
const e = (s = this.shadowRoot) == null ? void 0 : s.querySelector("video.mcu-video");
|
|
78
|
+
e != null && e.setSinkId && e.setSinkId(t).catch((o) => {
|
|
79
|
+
Y.error("[SwCallMedia] Failed to set audio output device:", o);
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
// ── Resize / dimension management ──────────────────────────────────
|
|
83
|
+
_setupResizeObserver() {
|
|
84
|
+
var s, o;
|
|
85
|
+
const t = (s = this.shadowRoot) == null ? void 0 : s.querySelector("video.mcu-video"), e = (o = this.shadowRoot) == null ? void 0 : o.querySelector(".padding-wrapper");
|
|
86
|
+
!t || !e || (this._videoElement = t, this._paddingWrapper = e, this._resizeObserver = new ResizeObserver(
|
|
87
|
+
j(() => this._recalculateDimensions(), 50)
|
|
88
|
+
), this._resizeObserver.observe(this), this._videoResizeHandler = () => this._recalculateDimensions(), t.addEventListener("resize", this._videoResizeHandler), this._windowResizeHandler = () => {
|
|
89
|
+
requestAnimationFrame(() => this._recalculateDimensions());
|
|
90
|
+
}, window.addEventListener("resize", this._windowResizeHandler), this._recalculateDimensions());
|
|
91
|
+
}
|
|
92
|
+
_recalculateDimensions() {
|
|
93
|
+
const t = this._videoElement, e = this._paddingWrapper;
|
|
94
|
+
if (!t || !e) return;
|
|
95
|
+
if (!t.videoWidth || !t.videoHeight) {
|
|
96
|
+
e.style.width = "100%", e.style.height = "100%", e.style.paddingBottom = "0", e.style.transform = "none";
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
const s = window.innerWidth, o = window.innerHeight, i = this.getBoundingClientRect(), a = i.width, r = i.height;
|
|
100
|
+
if (a <= 0 || r <= 0) return;
|
|
101
|
+
const n = Math.min(1, (s - i.left) / a), c = Math.min(1, (o - i.top) / r), f = Math.min(n, c), p = a * f, m = r * f;
|
|
102
|
+
if (p <= 0 || m <= 0) return;
|
|
103
|
+
const v = t.videoWidth / t.videoHeight, S = p / m;
|
|
104
|
+
let h, u;
|
|
105
|
+
v > S ? (h = p, u = h / v) : (u = m, h = u * v);
|
|
106
|
+
const y = Math.max(0, i.left), R = Math.max(0, i.top), z = Math.min(s, i.right), k = Math.min(o, i.bottom), x = (y + z) / 2, O = (R + k) / 2, H = i.left + a / 2, C = i.top + r / 2, T = x - H, D = O - C;
|
|
107
|
+
e.style.width = `${h}px`, e.style.height = `${u}px`, e.style.paddingBottom = "0", e.style.transform = `translate(${T}px, ${D}px)`;
|
|
108
|
+
}
|
|
109
|
+
_cleanupResizeObserver() {
|
|
110
|
+
var e;
|
|
111
|
+
this._resizeObserver && (this._resizeObserver.disconnect(), this._resizeObserver = void 0);
|
|
112
|
+
const t = (e = this.shadowRoot) == null ? void 0 : e.querySelector("video.mcu-video");
|
|
113
|
+
t && this._videoResizeHandler && (t.removeEventListener("resize", this._videoResizeHandler), this._videoResizeHandler = void 0), this._windowResizeHandler && (window.removeEventListener("resize", this._windowResizeHandler), this._windowResizeHandler = void 0);
|
|
114
|
+
}
|
|
115
|
+
_cleanupVideoElement() {
|
|
116
|
+
var e;
|
|
117
|
+
const t = (e = this.shadowRoot) == null ? void 0 : e.querySelector("video.mcu-video");
|
|
118
|
+
t && I(t);
|
|
119
|
+
}
|
|
120
|
+
// ── Render ─────────────────────────────────────────────────────────
|
|
121
|
+
render() {
|
|
122
|
+
return q`
|
|
123
|
+
<div class="mcu-content" part="container">
|
|
124
|
+
<div class="padding-wrapper">
|
|
125
|
+
<div class="mcu-wrapper">
|
|
126
|
+
<video
|
|
127
|
+
class="mcu-video"
|
|
128
|
+
part="video"
|
|
129
|
+
autoplay
|
|
130
|
+
playsinline
|
|
131
|
+
.srcObject=${this._remoteStreamValue}
|
|
132
|
+
></video>
|
|
133
|
+
</div>
|
|
134
|
+
<div class="mcu-layers">
|
|
135
|
+
<slot></slot>
|
|
136
|
+
</div>
|
|
137
|
+
</div>
|
|
138
|
+
</div>
|
|
139
|
+
`;
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
l.styles = E`
|
|
143
|
+
:host {
|
|
144
|
+
display: block;
|
|
145
|
+
width: 100%;
|
|
146
|
+
height: 100%;
|
|
147
|
+
overflow: hidden;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
.mcu-content {
|
|
151
|
+
position: relative;
|
|
152
|
+
width: 100%;
|
|
153
|
+
height: 100%;
|
|
154
|
+
margin: 0 auto;
|
|
155
|
+
display: flex;
|
|
156
|
+
align-items: center;
|
|
157
|
+
justify-content: center;
|
|
158
|
+
background-color: var(--bg-page, #0e0e18);
|
|
159
|
+
overflow: hidden;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
.padding-wrapper {
|
|
163
|
+
position: relative;
|
|
164
|
+
max-width: 100%;
|
|
165
|
+
max-height: 100%;
|
|
166
|
+
transition:
|
|
167
|
+
width 0.3s ease,
|
|
168
|
+
height 0.3s ease;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/* Outer rounding is owned by sw-ui-call-layout's :host border-radius +
|
|
172
|
+
overflow:hidden. Rounding here too carves a notch out of the right
|
|
173
|
+
edge of the video cell that exposes whatever sits behind the widget
|
|
174
|
+
(page / modal backdrop) as a black sliver in light mode. */
|
|
175
|
+
.mcu-wrapper {
|
|
176
|
+
position: absolute;
|
|
177
|
+
top: 0;
|
|
178
|
+
left: 0;
|
|
179
|
+
right: 0;
|
|
180
|
+
bottom: 0;
|
|
181
|
+
overflow: hidden;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
.mcu-video {
|
|
185
|
+
width: 100%;
|
|
186
|
+
height: 100%;
|
|
187
|
+
display: block;
|
|
188
|
+
object-fit: contain;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
.mcu-layers {
|
|
192
|
+
position: absolute;
|
|
193
|
+
top: 0;
|
|
194
|
+
left: 0;
|
|
195
|
+
width: 100%;
|
|
196
|
+
height: 100%;
|
|
197
|
+
pointer-events: none;
|
|
198
|
+
}
|
|
199
|
+
`;
|
|
200
|
+
d([
|
|
201
|
+
b({ type: Object })
|
|
202
|
+
], l.prototype, "call", 2);
|
|
203
|
+
d([
|
|
204
|
+
b({ attribute: !1 })
|
|
205
|
+
], l.prototype, "stream", 2);
|
|
206
|
+
d([
|
|
207
|
+
w({ context: W, subscribe: !0 }),
|
|
208
|
+
g()
|
|
209
|
+
], l.prototype, "_callState", 2);
|
|
210
|
+
d([
|
|
211
|
+
w({ context: $, subscribe: !0 }),
|
|
212
|
+
g()
|
|
213
|
+
], l.prototype, "_devicesState", 2);
|
|
214
|
+
l = d([
|
|
215
|
+
M("sw-call-media")
|
|
216
|
+
], l);
|
|
217
|
+
export {
|
|
218
|
+
l as SwCallMedia
|
|
219
|
+
};
|
|
220
|
+
//# sourceMappingURL=sw-call-media.js.map
|