@signalwire/web-components 4.0.0-beta.8 → 4.0.0-dev-20260515133934
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 +360 -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 +138 -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 +178 -0
- package/dist/components/UI/controls/sw-ui-split-button.js.map +1 -0
- package/dist/components/UI/host-reset.d.ts +16 -0
- package/dist/components/UI/host-reset.d.ts.map +1 -0
- package/dist/components/UI/host-reset.js +20 -0
- package/dist/components/UI/host-reset.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 +127 -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 +342 -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} +44 -4
- 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 +59 -0
- package/dist/components/sw-call-media.d.ts.map +1 -0
- package/dist/components/sw-call-media.js +178 -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 +204 -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 +251 -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 +88 -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 +278 -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} +18 -4
- package/dist/components/sw-directory.d.ts.map +1 -0
- package/dist/components/sw-directory.js +435 -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 +306 -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 +320 -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 +3237 -0
- package/dist/embed/signalwire-web-components-embed.iife.js.map +1 -0
- package/dist/embed/signalwire-web-components-embed.umd.cjs +3237 -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 +19 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +84 -35
- 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 +96 -46
- package/dist/theme.css +451 -0
- package/dist/theme.css.js +5 -0
- package/dist/theme.css.js.map +1 -0
- package/dist/types/index.d.ts +9 -33
- package/dist/types/index.d.ts.map +1 -1
- 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/dist/utils/video.js +6 -21
- package/dist/utils/video.js.map +1 -1
- package/package.json +105 -42
- 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 -163
- 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 -114
- 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 -68
- package/dist/components/call-status.d.ts.map +0 -1
- package/dist/components/call-status.js +0 -254
- package/dist/components/call-status.js.map +0 -1
- package/dist/components/click-to-call.d.ts +0 -123
- 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 -224
- 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 -60
- 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 -20
- 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 -94
- 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 -116
- 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/constants.js +0 -5
- package/dist/constants.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
- package/dist/utils/debounce.js +0 -13
- package/dist/utils/debounce.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,59 @@
|
|
|
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
|
+
connectedCallback(): void;
|
|
45
|
+
protected updated(changedProperties: Map<string, unknown>): void;
|
|
46
|
+
disconnectedCallback(): void;
|
|
47
|
+
private _setupDirectSubscriptions;
|
|
48
|
+
private _computeTrackSignature;
|
|
49
|
+
private _cleanupDirectSubscriptions;
|
|
50
|
+
private _applySinkId;
|
|
51
|
+
private _cleanupVideoElement;
|
|
52
|
+
render(): import("lit-html").TemplateResult<1>;
|
|
53
|
+
}
|
|
54
|
+
declare global {
|
|
55
|
+
interface HTMLElementTagNameMap {
|
|
56
|
+
'sw-call-media': SwCallMedia;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# 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;AAQ9C,qBACa,WAAY,SAAQ,UAAU;IACzC,MAAM,CAAC,MAAM,0BAsDX;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;IAI5C,iBAAiB;IASjB,SAAS,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IA4ChE,oBAAoB;IAQpB,OAAO,CAAC,yBAAyB;IAiBjC,OAAO,CAAC,sBAAsB;IAK9B,OAAO,CAAC,2BAA2B;IAOnC,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,oBAAoB;IAO5B,MAAM;CAqBP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,eAAe,EAAE,WAAW,CAAC;KAC9B;CACF"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { LitElement as v, html as S, css as _ } from "lit";
|
|
2
|
+
import { property as d, state as p, customElement as b } from "lit/decorators.js";
|
|
3
|
+
import { consume as m } from "@lit/context";
|
|
4
|
+
import { callStateContext as f } from "../context/call-state-context.js";
|
|
5
|
+
import { devicesContext as g } from "../context/devices-context.js";
|
|
6
|
+
import { attachMediaStream as h, detachMediaStream as w } from "../utils/video.js";
|
|
7
|
+
import { getLogger as y } from "@signalwire/js";
|
|
8
|
+
var k = Object.defineProperty, T = Object.getOwnPropertyDescriptor, u = (t, e, s, r) => {
|
|
9
|
+
for (var a = r > 1 ? void 0 : r ? T(e, s) : e, c = t.length - 1, i; c >= 0; c--)
|
|
10
|
+
(i = t[c]) && (a = (r ? i(e, s, a) : i(a)) || a);
|
|
11
|
+
return r && a && k(e, s, a), a;
|
|
12
|
+
};
|
|
13
|
+
const V = y();
|
|
14
|
+
let o = class extends v {
|
|
15
|
+
constructor() {
|
|
16
|
+
super(...arguments), this.stream = null, this._remoteStreamValue = null, this._lastTrackSignature = "", this._subscriptions = [];
|
|
17
|
+
}
|
|
18
|
+
// ── Lifecycle ──────────────────────────────────────────────────────
|
|
19
|
+
connectedCallback() {
|
|
20
|
+
super.connectedCallback(), !this.stream && this.call && this._setupDirectSubscriptions(), this.stream && (this._remoteStreamValue = this.stream, this._lastTrackSignature = this._computeTrackSignature(this.stream));
|
|
21
|
+
}
|
|
22
|
+
updated(t) {
|
|
23
|
+
var e, s, r, a, c;
|
|
24
|
+
if (super.updated(t), t.has("call") && (this._cleanupDirectSubscriptions(), !this.stream && this.call && this._setupDirectSubscriptions()), t.has("stream")) {
|
|
25
|
+
this._cleanupDirectSubscriptions();
|
|
26
|
+
const i = this.stream, l = this._computeTrackSignature(i);
|
|
27
|
+
if (i !== this._remoteStreamValue || l !== this._lastTrackSignature) {
|
|
28
|
+
this._remoteStreamValue = i, this._lastTrackSignature = l;
|
|
29
|
+
const n = (e = this.shadowRoot) == null ? void 0 : e.querySelector("video.mcu-video");
|
|
30
|
+
n && h(n, i);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
if (!this.stream && !this.call && t.has("_callState")) {
|
|
34
|
+
const i = ((s = this._callState) == null ? void 0 : s.remoteStream) ?? null, l = this._computeTrackSignature(i);
|
|
35
|
+
if (i !== this._remoteStreamValue || l !== this._lastTrackSignature) {
|
|
36
|
+
this._remoteStreamValue = i, this._lastTrackSignature = l;
|
|
37
|
+
const n = (r = this.shadowRoot) == null ? void 0 : r.querySelector("video.mcu-video");
|
|
38
|
+
n && h(n, i);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
t.has("_devicesState") && this._applySinkId(((c = (a = this._devicesState) == null ? void 0 : a.selectedAudioOutput) == null ? void 0 : c.deviceId) ?? "");
|
|
42
|
+
}
|
|
43
|
+
disconnectedCallback() {
|
|
44
|
+
super.disconnectedCallback(), this._cleanupDirectSubscriptions(), this._cleanupVideoElement();
|
|
45
|
+
}
|
|
46
|
+
// ── Direct call subscriptions (legacy / standalone) ────────────────
|
|
47
|
+
_setupDirectSubscriptions() {
|
|
48
|
+
this.call && this._subscriptions.push(
|
|
49
|
+
this.call.remoteStream$.subscribe((t) => {
|
|
50
|
+
var r;
|
|
51
|
+
const e = this._computeTrackSignature(t);
|
|
52
|
+
if (t === this._remoteStreamValue && e === this._lastTrackSignature)
|
|
53
|
+
return;
|
|
54
|
+
this._remoteStreamValue = t, this._lastTrackSignature = e, this.requestUpdate();
|
|
55
|
+
const s = (r = this.shadowRoot) == null ? void 0 : r.querySelector("video.mcu-video");
|
|
56
|
+
s && h(s, t);
|
|
57
|
+
})
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
_computeTrackSignature(t) {
|
|
61
|
+
return t ? t.getTracks().map((e) => `${e.kind}:${e.id}`).sort().join("|") : "";
|
|
62
|
+
}
|
|
63
|
+
_cleanupDirectSubscriptions() {
|
|
64
|
+
this._subscriptions.forEach((t) => t.unsubscribe()), this._subscriptions = [];
|
|
65
|
+
}
|
|
66
|
+
// ── Audio output ───────────────────────────────────────────────────
|
|
67
|
+
_applySinkId(t) {
|
|
68
|
+
var s;
|
|
69
|
+
const e = (s = this.shadowRoot) == null ? void 0 : s.querySelector("video.mcu-video");
|
|
70
|
+
e != null && e.setSinkId && e.setSinkId(t).catch((r) => {
|
|
71
|
+
V.error("[SwCallMedia] Failed to set audio output device:", r);
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
// ── Cleanup ─────────────────────────────────────────────────────────
|
|
75
|
+
_cleanupVideoElement() {
|
|
76
|
+
var e;
|
|
77
|
+
const t = (e = this.shadowRoot) == null ? void 0 : e.querySelector("video.mcu-video");
|
|
78
|
+
t && w(t);
|
|
79
|
+
}
|
|
80
|
+
// ── Render ─────────────────────────────────────────────────────────
|
|
81
|
+
render() {
|
|
82
|
+
return S`
|
|
83
|
+
<div class="mcu-content" part="container">
|
|
84
|
+
<div class="padding-wrapper">
|
|
85
|
+
<div class="mcu-wrapper">
|
|
86
|
+
<video
|
|
87
|
+
class="mcu-video"
|
|
88
|
+
part="video"
|
|
89
|
+
autoplay
|
|
90
|
+
playsinline
|
|
91
|
+
muted
|
|
92
|
+
.srcObject=${this._remoteStreamValue}
|
|
93
|
+
></video>
|
|
94
|
+
</div>
|
|
95
|
+
<div class="mcu-layers">
|
|
96
|
+
<slot></slot>
|
|
97
|
+
</div>
|
|
98
|
+
</div>
|
|
99
|
+
</div>
|
|
100
|
+
`;
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
o.styles = _`
|
|
104
|
+
:host {
|
|
105
|
+
display: block;
|
|
106
|
+
width: 100%;
|
|
107
|
+
height: 100%;
|
|
108
|
+
overflow: hidden;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
.mcu-content {
|
|
112
|
+
position: relative;
|
|
113
|
+
width: 100%;
|
|
114
|
+
height: 100%;
|
|
115
|
+
margin: 0 auto;
|
|
116
|
+
display: flex;
|
|
117
|
+
align-items: center;
|
|
118
|
+
justify-content: center;
|
|
119
|
+
background-color: var(--bg-page, #0e0e18);
|
|
120
|
+
overflow: hidden;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/* Fill the parent box. The video element below uses object-fit: contain
|
|
124
|
+
so the stream letterboxes into whatever rectangle the parent gives us
|
|
125
|
+
— no JS sizing pass required. */
|
|
126
|
+
.padding-wrapper {
|
|
127
|
+
position: relative;
|
|
128
|
+
width: 100%;
|
|
129
|
+
height: 100%;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/* Outer rounding is owned by sw-ui-call-layout's :host border-radius +
|
|
133
|
+
overflow:hidden. Rounding here too carves a notch out of the right
|
|
134
|
+
edge of the video cell that exposes whatever sits behind the widget
|
|
135
|
+
(page / modal backdrop) as a black sliver in light mode. */
|
|
136
|
+
.mcu-wrapper {
|
|
137
|
+
position: absolute;
|
|
138
|
+
inset: 0;
|
|
139
|
+
overflow: hidden;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
.mcu-video {
|
|
143
|
+
width: 100%;
|
|
144
|
+
height: 100%;
|
|
145
|
+
display: block;
|
|
146
|
+
object-fit: contain;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
.mcu-layers {
|
|
150
|
+
position: absolute;
|
|
151
|
+
top: 0;
|
|
152
|
+
left: 0;
|
|
153
|
+
width: 100%;
|
|
154
|
+
height: 100%;
|
|
155
|
+
pointer-events: none;
|
|
156
|
+
}
|
|
157
|
+
`;
|
|
158
|
+
u([
|
|
159
|
+
d({ type: Object })
|
|
160
|
+
], o.prototype, "call", 2);
|
|
161
|
+
u([
|
|
162
|
+
d({ attribute: !1 })
|
|
163
|
+
], o.prototype, "stream", 2);
|
|
164
|
+
u([
|
|
165
|
+
m({ context: f, subscribe: !0 }),
|
|
166
|
+
p()
|
|
167
|
+
], o.prototype, "_callState", 2);
|
|
168
|
+
u([
|
|
169
|
+
m({ context: g, subscribe: !0 }),
|
|
170
|
+
p()
|
|
171
|
+
], o.prototype, "_devicesState", 2);
|
|
172
|
+
o = u([
|
|
173
|
+
b("sw-call-media")
|
|
174
|
+
], o);
|
|
175
|
+
export {
|
|
176
|
+
o as SwCallMedia
|
|
177
|
+
};
|
|
178
|
+
//# sourceMappingURL=sw-call-media.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sw-call-media.js","sources":["../../src/components/sw-call-media.ts"],"sourcesContent":["/**\n * Call Media Component\n *\n * Renders the remote video stream with aspect-ratio-aware sizing.\n *\n * Input precedence (most specific wins): `.stream` > `.call` > context.\n *\n * @example\n * ```html\n * <!-- Inside a context provider (sw-call-widget): -->\n * <sw-call-media></sw-call-media>\n *\n * <!-- With an explicit Call: -->\n * <sw-call-media .call=${call}></sw-call-media>\n *\n * <!-- With a raw remote stream: -->\n * <sw-call-media .stream=${remoteStream}></sw-call-media>\n * ```\n *\n * @csspart container - Outer container that holds the video and overlay layers.\n * @csspart video - The `<video>` element rendering the remote stream.\n *\n * @slot - Default slot for overlay layers (e.g. `<sw-self-media>`, `<sw-participants>`).\n */\n\nimport { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { consume } from '@lit/context';\nimport { Subscription } from 'rxjs';\nimport type { Call } from '../types/index.js';\nimport { callStateContext, type CallState } from '../context/call-state-context.js';\nimport { devicesContext, type DevicesState } from '../context/devices-context.js';\nimport { attachMediaStream, detachMediaStream } from '../utils/video.js';\nimport { getLogger } from '@signalwire/js';\n\nconst logger = getLogger();\n\n@customElement('sw-call-media')\nexport class SwCallMedia extends LitElement {\n static styles = css`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n overflow: hidden;\n }\n\n .mcu-content {\n position: relative;\n width: 100%;\n height: 100%;\n margin: 0 auto;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: var(--bg-page, #0e0e18);\n overflow: hidden;\n }\n\n /* Fill the parent box. The video element below uses object-fit: contain\n so the stream letterboxes into whatever rectangle the parent gives us\n — no JS sizing pass required. */\n .padding-wrapper {\n position: relative;\n width: 100%;\n height: 100%;\n }\n\n /* Outer rounding is owned by sw-ui-call-layout's :host border-radius +\n overflow:hidden. Rounding here too carves a notch out of the right\n edge of the video cell that exposes whatever sits behind the widget\n (page / modal backdrop) as a black sliver in light mode. */\n .mcu-wrapper {\n position: absolute;\n inset: 0;\n overflow: hidden;\n }\n\n .mcu-video {\n width: 100%;\n height: 100%;\n display: block;\n object-fit: contain;\n }\n\n .mcu-layers {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n }\n `;\n\n /**\n * Explicit Call — when set, subscribes directly to its observables instead\n * of relying on context. Overridden by `.stream` if both are set.\n */\n @property({ type: Object }) call?: Call;\n\n /**\n * Explicit remote MediaStream — highest precedence. Bypasses both `.call`\n * and context. Useful for raw rendering with no SDK at all.\n */\n @property({ attribute: false }) stream: MediaStream | null = null;\n\n @consume({ context: callStateContext, subscribe: true })\n @state()\n private _callState?: CallState;\n\n @consume({ context: devicesContext, subscribe: true })\n @state()\n private _devicesState?: DevicesState;\n\n private _remoteStreamValue: MediaStream | null = null;\n private _lastTrackSignature = '';\n private _subscriptions: Subscription[] = [];\n\n // ── Lifecycle ──────────────────────────────────────────────────────\n\n connectedCallback() {\n super.connectedCallback();\n if (!this.stream && this.call) this._setupDirectSubscriptions();\n if (this.stream) {\n this._remoteStreamValue = this.stream;\n this._lastTrackSignature = this._computeTrackSignature(this.stream);\n }\n }\n\n protected updated(changedProperties: Map<string, unknown>): void {\n super.updated(changedProperties);\n\n // Direct call prop changed — re-subscribe (only meaningful when `.stream` isn't set)\n if (changedProperties.has('call')) {\n this._cleanupDirectSubscriptions();\n if (!this.stream && this.call) this._setupDirectSubscriptions();\n }\n\n // Explicit `.stream` prop wins — attach it and skip everything else.\n if (changedProperties.has('stream')) {\n this._cleanupDirectSubscriptions();\n const stream = this.stream;\n const signature = this._computeTrackSignature(stream);\n if (stream !== this._remoteStreamValue || signature !== this._lastTrackSignature) {\n this._remoteStreamValue = stream;\n this._lastTrackSignature = signature;\n const video = this.shadowRoot?.querySelector('video.mcu-video') as HTMLVideoElement;\n if (video) attachMediaStream(video, stream);\n }\n }\n\n // Context-driven: stream or its track set changed.\n // WebRTC delivers tracks one at a time via ontrack, and the SDK re-emits\n // the same MediaStream reference each time — so we must also re-attach when\n // the track set changes, otherwise Chromium may never render a video track\n // added after the initial srcObject assignment.\n if (!this.stream && !this.call && changedProperties.has('_callState')) {\n const stream = this._callState?.remoteStream ?? null;\n const signature = this._computeTrackSignature(stream);\n if (stream !== this._remoteStreamValue || signature !== this._lastTrackSignature) {\n this._remoteStreamValue = stream;\n this._lastTrackSignature = signature;\n const video = this.shadowRoot?.querySelector('video.mcu-video') as HTMLVideoElement;\n if (video) attachMediaStream(video, stream);\n }\n }\n\n // Audio output device changed\n if (changedProperties.has('_devicesState')) {\n this._applySinkId(this._devicesState?.selectedAudioOutput?.deviceId ?? '');\n }\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this._cleanupDirectSubscriptions();\n this._cleanupVideoElement();\n }\n\n // ── Direct call subscriptions (legacy / standalone) ────────────────\n\n private _setupDirectSubscriptions(): void {\n if (!this.call) return;\n this._subscriptions.push(\n this.call.remoteStream$.subscribe((stream: MediaStream | null) => {\n const signature = this._computeTrackSignature(stream);\n if (stream === this._remoteStreamValue && signature === this._lastTrackSignature) {\n return;\n }\n this._remoteStreamValue = stream;\n this._lastTrackSignature = signature;\n this.requestUpdate();\n const video = this.shadowRoot?.querySelector('video.mcu-video') as HTMLVideoElement;\n if (video) attachMediaStream(video, stream);\n })\n );\n }\n\n private _computeTrackSignature(stream: MediaStream | null): string {\n if (!stream) return '';\n return stream.getTracks().map((t) => `${t.kind}:${t.id}`).sort().join('|');\n }\n\n private _cleanupDirectSubscriptions(): void {\n this._subscriptions.forEach((sub) => sub.unsubscribe());\n this._subscriptions = [];\n }\n\n // ── Audio output ───────────────────────────────────────────────────\n\n private _applySinkId(deviceId: string): void {\n const video = this.shadowRoot?.querySelector('video.mcu-video') as HTMLVideoElement & {\n setSinkId?: (sinkId: string) => Promise<void>;\n };\n if (!video?.setSinkId) return;\n video.setSinkId(deviceId).catch((err) => {\n logger.error('[SwCallMedia] Failed to set audio output device:', err);\n });\n }\n\n // ── Cleanup ─────────────────────────────────────────────────────────\n\n private _cleanupVideoElement(): void {\n const video = this.shadowRoot?.querySelector('video.mcu-video') as HTMLVideoElement;\n if (video) detachMediaStream(video);\n }\n\n // ── Render ─────────────────────────────────────────────────────────\n\n render() {\n return html`\n <div class=\"mcu-content\" part=\"container\">\n <div class=\"padding-wrapper\">\n <div class=\"mcu-wrapper\">\n <video\n class=\"mcu-video\"\n part=\"video\"\n autoplay\n playsinline\n muted\n .srcObject=${this._remoteStreamValue}\n ></video>\n </div>\n <div class=\"mcu-layers\">\n <slot></slot>\n </div>\n </div>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'sw-call-media': SwCallMedia;\n }\n}\n"],"names":["logger","getLogger","SwCallMedia","LitElement","changedProperties","stream","signature","video","_a","attachMediaStream","_b","_c","_e","_d","t","sub","deviceId","err","html","css","__decorateClass","property","consume","callStateContext","state","devicesContext","customElement"],"mappings":"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"}
|