@streamplace/components 0.8.9 → 0.8.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/chat/chat-box.d.ts +8 -0
- package/dist/components/chat/chat-box.d.ts.map +1 -0
- package/dist/components/chat/chat-box.js +19 -2
- package/dist/components/chat/chat-box.js.map +1 -0
- package/dist/components/chat/chat-message.d.ts +8 -0
- package/dist/components/chat/chat-message.d.ts.map +1 -0
- package/dist/components/chat/chat-message.js +6 -4
- package/dist/components/chat/chat-message.js.map +1 -0
- package/dist/components/chat/chat.d.ts +7 -0
- package/dist/components/chat/chat.d.ts.map +1 -0
- package/dist/components/chat/chat.js +1 -0
- package/dist/components/chat/chat.js.map +1 -0
- package/dist/components/chat/emoji-suggestions.d.ts +38 -0
- package/dist/components/chat/emoji-suggestions.d.ts.map +1 -0
- package/dist/components/chat/emoji-suggestions.js +1 -0
- package/dist/components/chat/emoji-suggestions.js.map +1 -0
- package/dist/components/chat/mention-suggestions.d.ts +9 -0
- package/dist/components/chat/mention-suggestions.d.ts.map +1 -0
- package/dist/components/chat/mention-suggestions.js +1 -0
- package/dist/components/chat/mention-suggestions.js.map +1 -0
- package/dist/components/chat/mod-view.d.ts +20 -0
- package/dist/components/chat/mod-view.d.ts.map +1 -0
- package/dist/components/chat/mod-view.js +5 -3
- package/dist/components/chat/mod-view.js.map +1 -0
- package/dist/components/chat/system-message.d.ts +7 -0
- package/dist/components/chat/system-message.d.ts.map +1 -0
- package/dist/components/chat/system-message.js +1 -0
- package/dist/components/chat/system-message.js.map +1 -0
- package/dist/components/content-metadata/content-metadata-form.d.ts +9 -0
- package/dist/components/content-metadata/content-metadata-form.d.ts.map +1 -0
- package/dist/components/content-metadata/content-metadata-form.js +4 -2
- package/dist/components/content-metadata/content-metadata-form.js.map +1 -0
- package/dist/components/content-metadata/content-rights.d.ts +14 -0
- package/dist/components/content-metadata/content-rights.d.ts.map +1 -0
- package/dist/components/content-metadata/content-rights.js +1 -0
- package/dist/components/content-metadata/content-rights.js.map +1 -0
- package/dist/components/content-metadata/content-warning-badge.d.ts +5 -0
- package/dist/components/content-metadata/content-warning-badge.d.ts.map +1 -0
- package/dist/components/content-metadata/content-warning-badge.js +1 -0
- package/dist/components/content-metadata/content-warning-badge.js.map +1 -0
- package/dist/components/content-metadata/content-warnings.d.ts +7 -0
- package/dist/components/content-metadata/content-warnings.d.ts.map +1 -0
- package/dist/components/content-metadata/content-warnings.js +1 -0
- package/dist/components/content-metadata/content-warnings.js.map +1 -0
- package/dist/components/content-metadata/index.d.ts +8 -0
- package/dist/components/content-metadata/index.d.ts.map +1 -0
- package/dist/components/content-metadata/index.js +1 -0
- package/dist/components/content-metadata/index.js.map +1 -0
- package/dist/components/danmu/danmu-message.d.ts +17 -0
- package/dist/components/danmu/danmu-message.d.ts.map +1 -0
- package/dist/components/danmu/danmu-message.js +112 -0
- package/dist/components/danmu/danmu-message.js.map +1 -0
- package/dist/components/danmu/danmu-overlay-obs.d.ts +11 -0
- package/dist/components/danmu/danmu-overlay-obs.d.ts.map +1 -0
- package/dist/components/danmu/danmu-overlay-obs.js +21 -0
- package/dist/components/danmu/danmu-overlay-obs.js.map +1 -0
- package/dist/components/danmu/danmu-overlay.d.ts +10 -0
- package/dist/components/danmu/danmu-overlay.d.ts.map +1 -0
- package/dist/components/danmu/danmu-overlay.js +150 -0
- package/dist/components/danmu/danmu-overlay.js.map +1 -0
- package/dist/components/danmu/math.d.ts +10 -0
- package/dist/components/danmu/math.d.ts.map +1 -0
- package/dist/components/danmu/math.js +16 -0
- package/dist/components/danmu/math.js.map +1 -0
- package/dist/components/danmu/mu.d.ts +9 -0
- package/dist/components/danmu/mu.d.ts.map +1 -0
- package/dist/components/danmu/mu.js +9 -0
- package/dist/components/danmu/mu.js.map +1 -0
- package/dist/components/danmu/use-danmu-lanes.d.ts +19 -0
- package/dist/components/danmu/use-danmu-lanes.d.ts.map +1 -0
- package/dist/components/danmu/use-danmu-lanes.js +77 -0
- package/dist/components/danmu/use-danmu-lanes.js.map +1 -0
- package/dist/components/dashboard/chat-panel.d.ts +9 -0
- package/dist/components/dashboard/chat-panel.d.ts.map +1 -0
- package/dist/components/dashboard/chat-panel.js +1 -0
- package/dist/components/dashboard/chat-panel.js.map +1 -0
- package/dist/components/dashboard/header.d.ts +14 -0
- package/dist/components/dashboard/header.d.ts.map +1 -0
- package/dist/components/dashboard/header.js +1 -0
- package/dist/components/dashboard/header.js.map +1 -0
- package/dist/components/dashboard/index.d.ts +6 -0
- package/dist/components/dashboard/index.d.ts.map +1 -0
- package/dist/components/dashboard/index.js +1 -0
- package/dist/components/dashboard/index.js.map +1 -0
- package/dist/components/dashboard/information-widget.d.ts +9 -0
- package/dist/components/dashboard/information-widget.d.ts.map +1 -0
- package/dist/components/dashboard/information-widget.js +1 -0
- package/dist/components/dashboard/information-widget.js.map +1 -0
- package/dist/components/dashboard/mod-actions.d.ts +15 -0
- package/dist/components/dashboard/mod-actions.d.ts.map +1 -0
- package/dist/components/dashboard/mod-actions.js +1 -0
- package/dist/components/dashboard/mod-actions.js.map +1 -0
- package/dist/components/dashboard/problems.d.ts +13 -0
- package/dist/components/dashboard/problems.d.ts.map +1 -0
- package/dist/components/dashboard/problems.js +1 -0
- package/dist/components/dashboard/problems.js.map +1 -0
- package/dist/components/icons/bluesky-icon.d.ts +5 -0
- package/dist/components/icons/bluesky-icon.d.ts.map +1 -0
- package/dist/components/icons/bluesky-icon.js +1 -0
- package/dist/components/icons/bluesky-icon.js.map +1 -0
- package/dist/components/keep-awake.d.ts +2 -0
- package/dist/components/keep-awake.d.ts.map +1 -0
- package/dist/components/keep-awake.js +1 -0
- package/dist/components/keep-awake.js.map +1 -0
- package/dist/components/keep-awake.native.d.ts +2 -0
- package/dist/components/keep-awake.native.d.ts.map +1 -0
- package/dist/components/keep-awake.native.js +1 -0
- package/dist/components/keep-awake.native.js.map +1 -0
- package/dist/components/mobile-player/fullscreen.d.ts +7 -0
- package/dist/components/mobile-player/fullscreen.d.ts.map +1 -0
- package/dist/components/mobile-player/fullscreen.js +7 -1
- package/dist/components/mobile-player/fullscreen.js.map +1 -0
- package/dist/components/mobile-player/fullscreen.native.d.ts +7 -0
- package/dist/components/mobile-player/fullscreen.native.d.ts.map +1 -0
- package/dist/components/mobile-player/fullscreen.native.js +8 -2
- package/dist/components/mobile-player/fullscreen.native.js.map +1 -0
- package/dist/components/mobile-player/player.d.ts +8 -0
- package/dist/components/mobile-player/player.d.ts.map +1 -0
- package/dist/components/mobile-player/player.js +1 -0
- package/dist/components/mobile-player/player.js.map +1 -0
- package/dist/components/mobile-player/props.d.ts +19 -0
- package/dist/components/mobile-player/props.d.ts.map +1 -0
- package/dist/components/mobile-player/props.js +1 -0
- package/dist/components/mobile-player/props.js.map +1 -0
- package/dist/components/mobile-player/rotation-async.native.d.ts +4 -0
- package/dist/components/mobile-player/rotation-async.native.d.ts.map +1 -0
- package/dist/components/mobile-player/rotation-async.native.js +1 -0
- package/dist/components/mobile-player/rotation-async.native.js.map +1 -0
- package/dist/components/mobile-player/rotation-lock.d.ts +18 -0
- package/dist/components/mobile-player/rotation-lock.d.ts.map +1 -0
- package/dist/components/mobile-player/rotation-lock.js +1 -0
- package/dist/components/mobile-player/rotation-lock.js.map +1 -0
- package/dist/components/mobile-player/shared.d.ts +9 -0
- package/dist/components/mobile-player/shared.d.ts.map +1 -0
- package/dist/components/mobile-player/shared.js +1 -0
- package/dist/components/mobile-player/shared.js.map +1 -0
- package/dist/components/mobile-player/ui/autoplay-button.d.ts +2 -0
- package/dist/components/mobile-player/ui/autoplay-button.d.ts.map +1 -0
- package/dist/components/mobile-player/ui/autoplay-button.js +1 -0
- package/dist/components/mobile-player/ui/autoplay-button.js.map +1 -0
- package/dist/components/mobile-player/ui/countdown.d.ts +10 -0
- package/dist/components/mobile-player/ui/countdown.d.ts.map +1 -0
- package/dist/components/mobile-player/ui/countdown.js +1 -0
- package/dist/components/mobile-player/ui/countdown.js.map +1 -0
- package/dist/components/mobile-player/ui/index.d.ts +11 -0
- package/dist/components/mobile-player/ui/index.d.ts.map +1 -0
- package/dist/components/mobile-player/ui/index.js +2 -0
- package/dist/components/mobile-player/ui/index.js.map +1 -0
- package/dist/components/mobile-player/ui/input.d.ts +9 -0
- package/dist/components/mobile-player/ui/input.d.ts.map +1 -0
- package/dist/components/mobile-player/ui/input.js +1 -0
- package/dist/components/mobile-player/ui/input.js.map +1 -0
- package/dist/components/mobile-player/ui/metrics.d.ts +6 -0
- package/dist/components/mobile-player/ui/metrics.d.ts.map +1 -0
- package/dist/components/mobile-player/ui/metrics.js +1 -0
- package/dist/components/mobile-player/ui/metrics.js.map +1 -0
- package/dist/components/mobile-player/ui/report-modal.d.ts +13 -0
- package/dist/components/mobile-player/ui/report-modal.d.ts.map +1 -0
- package/dist/components/mobile-player/ui/report-modal.js +1 -0
- package/dist/components/mobile-player/ui/report-modal.js.map +1 -0
- package/dist/components/mobile-player/ui/streamer-context-menu.d.ts +2 -0
- package/dist/components/mobile-player/ui/streamer-context-menu.d.ts.map +1 -0
- package/dist/components/mobile-player/ui/streamer-context-menu.js +1 -0
- package/dist/components/mobile-player/ui/streamer-context-menu.js.map +1 -0
- package/dist/components/mobile-player/ui/streamer-loading-overlay.d.ts +11 -0
- package/dist/components/mobile-player/ui/streamer-loading-overlay.d.ts.map +1 -0
- package/dist/components/mobile-player/ui/streamer-loading-overlay.js +1 -0
- package/dist/components/mobile-player/ui/streamer-loading-overlay.js.map +1 -0
- package/dist/components/mobile-player/ui/viewer-context-menu.d.ts +9 -0
- package/dist/components/mobile-player/ui/viewer-context-menu.d.ts.map +1 -0
- package/dist/components/mobile-player/ui/viewer-context-menu.js +6 -5
- package/dist/components/mobile-player/ui/viewer-context-menu.js.map +1 -0
- package/dist/components/mobile-player/ui/viewer-count.d.ts +10 -0
- package/dist/components/mobile-player/ui/viewer-count.d.ts.map +1 -0
- package/dist/components/mobile-player/ui/viewer-count.js +24 -0
- package/dist/components/mobile-player/ui/viewer-count.js.map +1 -0
- package/dist/components/mobile-player/ui/viewer-loading-overlay.d.ts +2 -0
- package/dist/components/mobile-player/ui/viewer-loading-overlay.d.ts.map +1 -0
- package/dist/components/mobile-player/ui/viewer-loading-overlay.js +1 -0
- package/dist/components/mobile-player/ui/viewer-loading-overlay.js.map +1 -0
- package/dist/components/mobile-player/ui/viewers.d.ts +6 -0
- package/dist/components/mobile-player/ui/viewers.d.ts.map +1 -0
- package/dist/components/mobile-player/ui/viewers.js +9 -7
- package/dist/components/mobile-player/ui/viewers.js.map +1 -0
- package/dist/components/mobile-player/use-webrtc.d.ts +19 -0
- package/dist/components/mobile-player/use-webrtc.d.ts.map +1 -0
- package/dist/components/mobile-player/use-webrtc.js +1 -0
- package/dist/components/mobile-player/use-webrtc.js.map +1 -0
- package/dist/components/mobile-player/video-async.native.d.ts +16 -0
- package/dist/components/mobile-player/video-async.native.d.ts.map +1 -0
- package/dist/components/mobile-player/video-async.native.js +1 -0
- package/dist/components/mobile-player/video-async.native.js.map +1 -0
- package/dist/components/mobile-player/video-retry.d.ts +5 -0
- package/dist/components/mobile-player/video-retry.d.ts.map +1 -0
- package/dist/components/mobile-player/video-retry.js +1 -0
- package/dist/components/mobile-player/video-retry.js.map +1 -0
- package/dist/components/mobile-player/video.d.ts +25 -0
- package/dist/components/mobile-player/video.d.ts.map +1 -0
- package/dist/components/mobile-player/video.js +1 -0
- package/dist/components/mobile-player/video.js.map +1 -0
- package/dist/components/mobile-player/video.native.d.ts +3 -0
- package/dist/components/mobile-player/video.native.d.ts.map +1 -0
- package/dist/components/mobile-player/video.native.js +1 -0
- package/dist/components/mobile-player/video.native.js.map +1 -0
- package/dist/components/mobile-player/webrtc-diagnostics.d.ts +14 -0
- package/dist/components/mobile-player/webrtc-diagnostics.d.ts.map +1 -0
- package/dist/components/mobile-player/webrtc-diagnostics.js +1 -0
- package/dist/components/mobile-player/webrtc-diagnostics.js.map +1 -0
- package/dist/components/mobile-player/webrtc-primitives.d.ts +19 -0
- package/dist/components/mobile-player/webrtc-primitives.d.ts.map +1 -0
- package/dist/components/mobile-player/webrtc-primitives.js +1 -0
- package/dist/components/mobile-player/webrtc-primitives.js.map +1 -0
- package/dist/components/mobile-player/webrtc-primitives.native.d.ts +2 -0
- package/dist/components/mobile-player/webrtc-primitives.native.d.ts.map +1 -0
- package/dist/components/mobile-player/webrtc-primitives.native.js +1 -0
- package/dist/components/mobile-player/webrtc-primitives.native.js.map +1 -0
- package/dist/components/share/sharesheet.d.ts +5 -0
- package/dist/components/share/sharesheet.d.ts.map +1 -0
- package/dist/components/share/sharesheet.js +6 -14
- package/dist/components/share/sharesheet.js.map +1 -0
- package/dist/components/ui/button.d.ts +18 -0
- package/dist/components/ui/button.d.ts.map +1 -0
- package/dist/components/ui/button.js +14 -2
- package/dist/components/ui/button.js.map +1 -0
- package/dist/components/ui/checkbox.d.ts +11 -0
- package/dist/components/ui/checkbox.d.ts.map +1 -0
- package/dist/components/ui/checkbox.js +1 -0
- package/dist/components/ui/checkbox.js.map +1 -0
- package/dist/components/ui/dialog.d.ts +38 -0
- package/dist/components/ui/dialog.d.ts.map +1 -0
- package/dist/components/ui/dialog.js +1 -0
- package/dist/components/ui/dialog.js.map +1 -0
- package/dist/components/ui/dropdown.d.ts +132 -0
- package/dist/components/ui/dropdown.d.ts.map +1 -0
- package/dist/components/ui/dropdown.js +28 -238
- package/dist/components/ui/dropdown.js.map +1 -0
- package/dist/components/ui/dropdown.native.d.ts +132 -0
- package/dist/components/ui/dropdown.native.d.ts.map +1 -0
- package/dist/components/ui/dropdown.native.js +319 -0
- package/dist/components/ui/dropdown.native.js.map +1 -0
- package/dist/components/ui/icons.d.ts +12 -0
- package/dist/components/ui/icons.d.ts.map +1 -0
- package/dist/components/ui/icons.js +1 -0
- package/dist/components/ui/icons.js.map +1 -0
- package/dist/components/ui/index.d.ts +33 -0
- package/dist/components/ui/index.d.ts.map +1 -0
- package/dist/components/ui/index.js +2 -0
- package/dist/components/ui/index.js.map +1 -0
- package/dist/components/ui/info-box.d.ts +9 -0
- package/dist/components/ui/info-box.d.ts.map +1 -0
- package/dist/components/ui/info-box.js +1 -0
- package/dist/components/ui/info-box.js.map +1 -0
- package/dist/components/ui/info-row.d.ts +9 -0
- package/dist/components/ui/info-row.d.ts.map +1 -0
- package/dist/components/ui/info-row.js +1 -0
- package/dist/components/ui/info-row.js.map +1 -0
- package/dist/components/ui/input.d.ts +20 -0
- package/dist/components/ui/input.d.ts.map +1 -0
- package/dist/components/ui/input.js +1 -0
- package/dist/components/ui/input.js.map +1 -0
- package/dist/components/ui/loader.d.ts +3 -0
- package/dist/components/ui/loader.d.ts.map +1 -0
- package/dist/components/ui/loader.js +1 -0
- package/dist/components/ui/loader.js.map +1 -0
- package/dist/components/ui/menu.d.ts +34 -0
- package/dist/components/ui/menu.d.ts.map +1 -0
- package/dist/components/ui/menu.js +57 -0
- package/dist/components/ui/menu.js.map +1 -0
- package/dist/components/ui/primitives/button.d.ts +41 -0
- package/dist/components/ui/primitives/button.d.ts.map +1 -0
- package/dist/components/ui/primitives/button.js +1 -0
- package/dist/components/ui/primitives/button.js.map +1 -0
- package/dist/components/ui/primitives/input.d.ts +52 -0
- package/dist/components/ui/primitives/input.d.ts.map +1 -0
- package/dist/components/ui/primitives/input.js +1 -0
- package/dist/components/ui/primitives/input.js.map +1 -0
- package/dist/components/ui/primitives/modal.d.ts +46 -0
- package/dist/components/ui/primitives/modal.d.ts.map +1 -0
- package/dist/components/ui/primitives/modal.js +1 -0
- package/dist/components/ui/primitives/modal.js.map +1 -0
- package/dist/components/ui/primitives/text.d.ts +48 -0
- package/dist/components/ui/primitives/text.d.ts.map +1 -0
- package/dist/components/ui/primitives/text.js +1 -0
- package/dist/components/ui/primitives/text.js.map +1 -0
- package/dist/components/ui/resizeable.d.ts +14 -0
- package/dist/components/ui/resizeable.d.ts.map +1 -0
- package/dist/components/ui/resizeable.js +2 -1
- package/dist/components/ui/resizeable.js.map +1 -0
- package/dist/components/ui/select.d.ts +16 -0
- package/dist/components/ui/select.d.ts.map +1 -0
- package/dist/components/ui/select.js +1 -0
- package/dist/components/ui/select.js.map +1 -0
- package/dist/components/ui/slider.d.ts +2 -0
- package/dist/components/ui/slider.d.ts.map +1 -0
- package/dist/components/ui/slider.js +1 -0
- package/dist/components/ui/slider.js.map +1 -0
- package/dist/components/ui/text.d.ts +45 -0
- package/dist/components/ui/text.d.ts.map +1 -0
- package/dist/components/ui/text.js +1 -0
- package/dist/components/ui/text.js.map +1 -0
- package/dist/components/ui/textarea.d.ts +5 -0
- package/dist/components/ui/textarea.d.ts.map +1 -0
- package/dist/components/ui/textarea.js +1 -0
- package/dist/components/ui/textarea.js.map +1 -0
- package/dist/components/ui/toast.d.ts +92 -0
- package/dist/components/ui/toast.d.ts.map +1 -0
- package/dist/components/ui/toast.js +2 -1
- package/dist/components/ui/toast.js.map +1 -0
- package/dist/components/ui/tooltip.d.ts +8 -0
- package/dist/components/ui/tooltip.d.ts.map +1 -0
- package/dist/components/ui/tooltip.js +1 -0
- package/dist/components/ui/tooltip.js.map +1 -0
- package/dist/components/ui/view.d.ts +33 -0
- package/dist/components/ui/view.d.ts.map +1 -0
- package/dist/components/ui/view.js +1 -0
- package/dist/components/ui/view.js.map +1 -0
- package/dist/crypto-polyfill.d.ts +1 -0
- package/dist/crypto-polyfill.d.ts.map +1 -0
- package/dist/crypto-polyfill.js +1 -0
- package/dist/crypto-polyfill.js.map +1 -0
- package/dist/crypto-polyfill.native.d.ts +3 -0
- package/dist/crypto-polyfill.native.d.ts.map +1 -0
- package/dist/crypto-polyfill.native.js +1 -0
- package/dist/crypto-polyfill.native.js.map +1 -0
- package/dist/hooks/index.d.ts +11 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +1 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/useAvatars.d.ts +3 -0
- package/dist/hooks/useAvatars.d.ts.map +1 -0
- package/dist/hooks/useAvatars.js +1 -0
- package/dist/hooks/useAvatars.js.map +1 -0
- package/dist/hooks/useCameraToggle.d.ts +5 -0
- package/dist/hooks/useCameraToggle.d.ts.map +1 -0
- package/dist/hooks/useCameraToggle.js +1 -0
- package/dist/hooks/useCameraToggle.js.map +1 -0
- package/dist/hooks/useKeyboard.d.ts +5 -0
- package/dist/hooks/useKeyboard.d.ts.map +1 -0
- package/dist/hooks/useKeyboard.js +1 -0
- package/dist/hooks/useKeyboard.js.map +1 -0
- package/dist/hooks/useKeyboardSlide.d.ts +5 -0
- package/dist/hooks/useKeyboardSlide.d.ts.map +1 -0
- package/dist/hooks/useKeyboardSlide.js +1 -0
- package/dist/hooks/useKeyboardSlide.js.map +1 -0
- package/dist/hooks/useLivestreamInfo.d.ts +15 -0
- package/dist/hooks/useLivestreamInfo.d.ts.map +1 -0
- package/dist/hooks/useLivestreamInfo.js +1 -0
- package/dist/hooks/useLivestreamInfo.js.map +1 -0
- package/dist/hooks/useOuterAndInnerDimensions.d.ts +10 -0
- package/dist/hooks/useOuterAndInnerDimensions.d.ts.map +1 -0
- package/dist/hooks/useOuterAndInnerDimensions.js +1 -0
- package/dist/hooks/useOuterAndInnerDimensions.js.map +1 -0
- package/dist/hooks/usePlayerDimensions.d.ts +12 -0
- package/dist/hooks/usePlayerDimensions.d.ts.map +1 -0
- package/dist/hooks/usePlayerDimensions.js +1 -0
- package/dist/hooks/usePlayerDimensions.js.map +1 -0
- package/dist/hooks/usePointerDevice.d.ts +12 -0
- package/dist/hooks/usePointerDevice.d.ts.map +1 -0
- package/dist/hooks/usePointerDevice.js +1 -0
- package/dist/hooks/usePointerDevice.js.map +1 -0
- package/dist/hooks/useSegmentDimensions.d.ts +6 -0
- package/dist/hooks/useSegmentDimensions.d.ts.map +1 -0
- package/dist/hooks/useSegmentDimensions.js +1 -0
- package/dist/hooks/useSegmentDimensions.js.map +1 -0
- package/dist/hooks/useSegmentTiming.d.ts +9 -0
- package/dist/hooks/useSegmentTiming.d.ts.map +1 -0
- package/dist/hooks/useSegmentTiming.js +1 -0
- package/dist/hooks/useSegmentTiming.js.map +1 -0
- package/dist/i18n/i18n-loader.d.ts +2 -0
- package/dist/i18n/i18n-loader.d.ts.map +1 -0
- package/dist/i18n/i18n-loader.js +17 -0
- package/dist/i18n/i18n-loader.js.map +1 -0
- package/dist/i18n/i18n-loader.native.d.ts +2 -0
- package/dist/i18n/i18n-loader.native.d.ts.map +1 -0
- package/dist/i18n/i18n-loader.native.js +51 -0
- package/dist/i18n/i18n-loader.native.js.map +1 -0
- package/dist/i18n/i18next-config.d.ts +41 -0
- package/dist/i18n/i18next-config.d.ts.map +1 -0
- package/dist/i18n/i18next-config.js +220 -0
- package/dist/i18n/i18next-config.js.map +1 -0
- package/dist/i18n/index.d.ts +11 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +45 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/provider.d.ts +14 -0
- package/dist/i18n/provider.d.ts.map +1 -0
- package/dist/i18n/provider.js +58 -0
- package/dist/i18n/provider.js.map +1 -0
- package/dist/index.d.ts +34 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -1
- package/dist/index.js.map +1 -0
- package/dist/lib/browser.d.ts +2 -0
- package/dist/lib/browser.d.ts.map +1 -0
- package/dist/lib/browser.js +1 -0
- package/dist/lib/browser.js.map +1 -0
- package/dist/lib/facet.d.ts +11 -0
- package/dist/lib/facet.d.ts.map +1 -0
- package/dist/lib/facet.js +1 -0
- package/dist/lib/facet.js.map +1 -0
- package/dist/lib/metadata-constants.d.ts +13 -0
- package/dist/lib/metadata-constants.d.ts.map +1 -0
- package/dist/lib/metadata-constants.js +1 -0
- package/dist/lib/metadata-constants.js.map +1 -0
- package/dist/lib/system-messages.d.ts +49 -0
- package/dist/lib/system-messages.d.ts.map +1 -0
- package/dist/lib/system-messages.js +1 -0
- package/dist/lib/system-messages.js.map +1 -0
- package/dist/lib/theme/atoms.d.ts +4226 -0
- package/dist/lib/theme/atoms.d.ts.map +1 -0
- package/dist/lib/theme/atoms.js +1 -0
- package/dist/lib/theme/atoms.js.map +1 -0
- package/dist/lib/theme/atoms.types.d.ts +228 -0
- package/dist/lib/theme/atoms.types.d.ts.map +1 -0
- package/dist/lib/theme/atoms.types.js +1 -0
- package/dist/lib/theme/atoms.types.js.map +1 -0
- package/dist/lib/theme/index.d.ts +6 -0
- package/dist/lib/theme/index.d.ts.map +1 -0
- package/dist/lib/theme/index.js +1 -0
- package/dist/lib/theme/index.js.map +1 -0
- package/dist/lib/theme/theme.d.ts +327 -0
- package/dist/lib/theme/theme.d.ts.map +1 -0
- package/dist/lib/theme/theme.js +1 -0
- package/dist/lib/theme/theme.js.map +1 -0
- package/dist/lib/theme/tokens.d.ts +766 -0
- package/dist/lib/theme/tokens.d.ts.map +1 -0
- package/dist/lib/theme/tokens.js +1 -0
- package/dist/lib/theme/tokens.js.map +1 -0
- package/dist/lib/utils.d.ts +53 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +1 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/livestream-provider/index.d.ts +13 -0
- package/dist/livestream-provider/index.d.ts.map +1 -0
- package/dist/livestream-provider/index.js +1 -0
- package/dist/livestream-provider/index.js.map +1 -0
- package/dist/livestream-provider/websocket.d.ts +2 -0
- package/dist/livestream-provider/websocket.d.ts.map +1 -0
- package/dist/livestream-provider/websocket.js +1 -0
- package/dist/livestream-provider/websocket.js.map +1 -0
- package/dist/livestream-store/chat.d.ts +21 -0
- package/dist/livestream-store/chat.d.ts.map +1 -0
- package/dist/livestream-store/chat.js +1 -0
- package/dist/livestream-store/chat.js.map +1 -0
- package/dist/livestream-store/context.d.ts +7 -0
- package/dist/livestream-store/context.d.ts.map +1 -0
- package/dist/livestream-store/context.js +1 -0
- package/dist/livestream-store/context.js.map +1 -0
- package/dist/livestream-store/index.d.ts +5 -0
- package/dist/livestream-store/index.d.ts.map +1 -0
- package/dist/livestream-store/index.js +1 -0
- package/dist/livestream-store/index.js.map +1 -0
- package/dist/livestream-store/livestream-state.d.ts +29 -0
- package/dist/livestream-store/livestream-state.d.ts.map +1 -0
- package/dist/livestream-store/livestream-state.js +1 -0
- package/dist/livestream-store/livestream-state.js.map +1 -0
- package/dist/livestream-store/livestream-store.d.ts +14 -0
- package/dist/livestream-store/livestream-store.d.ts.map +1 -0
- package/dist/livestream-store/livestream-store.js +1 -0
- package/dist/livestream-store/livestream-store.js.map +1 -0
- package/dist/livestream-store/problems.d.ts +4 -0
- package/dist/livestream-store/problems.d.ts.map +1 -0
- package/dist/livestream-store/problems.js +1 -0
- package/dist/livestream-store/problems.js.map +1 -0
- package/dist/livestream-store/stream-key.d.ts +9 -0
- package/dist/livestream-store/stream-key.d.ts.map +1 -0
- package/dist/livestream-store/stream-key.js +1 -0
- package/dist/livestream-store/stream-key.js.map +1 -0
- package/dist/livestream-store/websocket-consumer.d.ts +3 -0
- package/dist/livestream-store/websocket-consumer.d.ts.map +1 -0
- package/dist/livestream-store/websocket-consumer.js +1 -0
- package/dist/livestream-store/websocket-consumer.js.map +1 -0
- package/dist/player-store/context.d.ts +10 -0
- package/dist/player-store/context.d.ts.map +1 -0
- package/dist/player-store/context.js +1 -0
- package/dist/player-store/context.js.map +1 -0
- package/dist/player-store/index.d.ts +6 -0
- package/dist/player-store/index.d.ts.map +1 -0
- package/dist/player-store/index.js +1 -0
- package/dist/player-store/index.js.map +1 -0
- package/dist/player-store/player-provider.d.ts +12 -0
- package/dist/player-store/player-provider.d.ts.map +1 -0
- package/dist/player-store/player-provider.js +1 -0
- package/dist/player-store/player-provider.js.map +1 -0
- package/dist/player-store/player-state.d.ts +138 -0
- package/dist/player-store/player-state.d.ts.map +1 -0
- package/dist/player-store/player-state.js +1 -0
- package/dist/player-store/player-state.js.map +1 -0
- package/dist/player-store/player-store.d.ts +18 -0
- package/dist/player-store/player-store.d.ts.map +1 -0
- package/dist/player-store/player-store.js +1 -0
- package/dist/player-store/player-store.js.map +1 -0
- package/dist/player-store/single-player-provider.d.ts +61 -0
- package/dist/player-store/single-player-provider.d.ts.map +1 -0
- package/dist/player-store/single-player-provider.js +1 -0
- package/dist/player-store/single-player-provider.js.map +1 -0
- package/dist/storage/index.d.ts +4 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +1 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/lock.d.ts +8 -0
- package/dist/storage/lock.d.ts.map +1 -0
- package/dist/storage/lock.js +1 -0
- package/dist/storage/lock.js.map +1 -0
- package/dist/storage/storage.d.ts +7 -0
- package/dist/storage/storage.d.ts.map +1 -0
- package/dist/storage/storage.js +1 -0
- package/dist/storage/storage.js.map +1 -0
- package/dist/storage/storage.native.d.ts +7 -0
- package/dist/storage/storage.native.d.ts.map +1 -0
- package/dist/storage/storage.native.js +1 -0
- package/dist/storage/storage.native.js.map +1 -0
- package/dist/storage/storage.shared.d.ts +6 -0
- package/dist/storage/storage.shared.d.ts.map +1 -0
- package/dist/storage/storage.shared.js +1 -0
- package/dist/storage/storage.shared.js.map +1 -0
- package/dist/streamplace-provider/context.d.ts +7 -0
- package/dist/streamplace-provider/context.d.ts.map +1 -0
- package/dist/streamplace-provider/context.js +1 -0
- package/dist/streamplace-provider/context.js.map +1 -0
- package/dist/streamplace-provider/index.d.ts +11 -0
- package/dist/streamplace-provider/index.d.ts.map +1 -0
- package/dist/streamplace-provider/index.js +1 -0
- package/dist/streamplace-provider/index.js.map +1 -0
- package/dist/streamplace-provider/poller.d.ts +5 -0
- package/dist/streamplace-provider/poller.d.ts.map +1 -0
- package/dist/streamplace-provider/poller.js +3 -0
- package/dist/streamplace-provider/poller.js.map +1 -0
- package/dist/streamplace-provider/xrpc.d.ts +1 -0
- package/dist/streamplace-provider/xrpc.d.ts.map +1 -0
- package/dist/streamplace-provider/xrpc.js +1 -0
- package/dist/streamplace-provider/xrpc.js.map +1 -0
- package/dist/streamplace-store/block.d.ts +9 -0
- package/dist/streamplace-store/block.d.ts.map +1 -0
- package/dist/streamplace-store/block.js +1 -0
- package/dist/streamplace-store/block.js.map +1 -0
- package/dist/streamplace-store/content-metadata-actions.d.ts +9 -0
- package/dist/streamplace-store/content-metadata-actions.d.ts.map +1 -0
- package/dist/streamplace-store/content-metadata-actions.js +1 -0
- package/dist/streamplace-store/content-metadata-actions.js.map +1 -0
- package/dist/streamplace-store/graph.d.ts +22 -0
- package/dist/streamplace-store/graph.d.ts.map +1 -0
- package/dist/streamplace-store/graph.js +1 -0
- package/dist/streamplace-store/graph.js.map +1 -0
- package/dist/streamplace-store/index.d.ts +4 -0
- package/dist/streamplace-store/index.d.ts.map +1 -0
- package/dist/streamplace-store/index.js +1 -0
- package/dist/streamplace-store/index.js.map +1 -0
- package/dist/streamplace-store/stream.d.ts +11 -0
- package/dist/streamplace-store/stream.d.ts.map +1 -0
- package/dist/streamplace-store/stream.js +1 -0
- package/dist/streamplace-store/stream.js.map +1 -0
- package/dist/streamplace-store/streamplace-store.d.ts +92 -0
- package/dist/streamplace-store/streamplace-store.d.ts.map +1 -0
- package/dist/streamplace-store/streamplace-store.js +158 -3
- package/dist/streamplace-store/streamplace-store.js.map +1 -0
- package/dist/streamplace-store/user.d.ts +6 -0
- package/dist/streamplace-store/user.d.ts.map +1 -0
- package/dist/streamplace-store/user.js +1 -0
- package/dist/streamplace-store/user.js.map +1 -0
- package/dist/streamplace-store/xrpc.d.ts +3 -0
- package/dist/streamplace-store/xrpc.d.ts.map +1 -0
- package/dist/streamplace-store/xrpc.js +1 -0
- package/dist/streamplace-store/xrpc.js.map +1 -0
- package/dist/time-sync/index.d.ts +3 -0
- package/dist/time-sync/index.d.ts.map +1 -0
- package/dist/time-sync/index.js +15 -0
- package/dist/time-sync/index.js.map +1 -0
- package/dist/time-sync/time-sync.d.ts +13 -0
- package/dist/time-sync/time-sync.d.ts.map +1 -0
- package/dist/time-sync/time-sync.js +95 -0
- package/dist/time-sync/time-sync.js.map +1 -0
- package/dist/time-sync/useTimeSync.d.ts +2 -0
- package/dist/time-sync/useTimeSync.d.ts.map +1 -0
- package/dist/time-sync/useTimeSync.js +49 -0
- package/dist/time-sync/useTimeSync.js.map +1 -0
- package/dist/ui/index.d.ts +15 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +1 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/utils/format-handle.d.ts +11 -0
- package/dist/utils/format-handle.d.ts.map +1 -0
- package/dist/utils/format-handle.js +21 -0
- package/dist/utils/format-handle.js.map +1 -0
- package/locales/en-US/common.ftl +46 -0
- package/locales/en-US/settings.ftl +129 -0
- package/locales/es-ES/common.ftl +46 -0
- package/locales/es-ES/settings.ftl +168 -0
- package/locales/fr-FR/common.ftl +46 -0
- package/locales/fr-FR/settings.ftl +165 -0
- package/locales/manifest.json +36 -0
- package/locales/pt-BR/common.ftl +46 -0
- package/locales/pt-BR/settings.ftl +166 -0
- package/locales/zh-Hant/common.ftl +46 -0
- package/locales/zh-Hant/settings.ftl +161 -0
- package/node-compile-cache/v22.15.0-x64-efe9a9df-0/37be0eec +0 -0
- package/package.json +24 -3
- package/scripts/compile-translations.js +254 -0
- package/scripts/extract-i18n.js +336 -0
- package/src/components/chat/chat-box.tsx +28 -9
- package/src/components/chat/chat-message.tsx +3 -2
- package/src/components/chat/mod-view.tsx +4 -3
- package/src/components/content-metadata/content-metadata-form.tsx +3 -1
- package/src/components/danmu/danmu-message.tsx +182 -0
- package/src/components/danmu/danmu-overlay-obs.tsx +44 -0
- package/src/components/danmu/danmu-overlay.tsx +225 -0
- package/src/components/danmu/math.ts +27 -0
- package/src/components/danmu/mu.tsx +28 -0
- package/src/components/danmu/use-danmu-lanes.ts +114 -0
- package/src/components/mobile-player/fullscreen.native.tsx +26 -0
- package/src/components/mobile-player/fullscreen.tsx +23 -1
- package/src/components/mobile-player/ui/index.ts +1 -0
- package/src/components/mobile-player/ui/viewer-context-menu.tsx +9 -7
- package/src/components/mobile-player/ui/viewer-count.tsx +39 -0
- package/src/components/mobile-player/ui/viewers.tsx +10 -14
- package/src/components/share/sharesheet.tsx +11 -27
- package/src/components/ui/button.tsx +22 -4
- package/src/components/ui/dropdown.native.tsx +696 -0
- package/src/components/ui/dropdown.tsx +57 -427
- package/src/components/ui/index.ts +1 -0
- package/src/components/ui/menu.tsx +171 -0
- package/src/components/ui/resizeable.tsx +1 -1
- package/src/components/ui/toast.tsx +6 -1
- package/src/i18n/i18n-loader.native.ts +56 -0
- package/src/i18n/i18n-loader.ts +19 -0
- package/src/i18n/i18next-config.ts +250 -0
- package/src/i18n/index.ts +50 -0
- package/src/i18n/provider.tsx +70 -0
- package/src/index.tsx +9 -0
- package/src/streamplace-provider/poller.tsx +3 -0
- package/src/streamplace-store/streamplace-store.tsx +184 -2
- package/src/time-sync/index.ts +12 -0
- package/src/time-sync/time-sync.ts +112 -0
- package/src/time-sync/useTimeSync.tsx +58 -0
- package/src/utils/format-handle.ts +24 -0
- package/tsconfig.json +11 -2
- package/tsconfig.tsbuildinfo +0 -1
|
@@ -54,6 +54,20 @@ export interface StreamplaceState {
|
|
|
54
54
|
muted: boolean;
|
|
55
55
|
setVolume: (volume: number) => void;
|
|
56
56
|
setMuted: (muted: boolean) => void;
|
|
57
|
+
|
|
58
|
+
// Danmu settings
|
|
59
|
+
danmuUnlocked: boolean;
|
|
60
|
+
danmuEnabled: boolean;
|
|
61
|
+
danmuOpacity: number;
|
|
62
|
+
danmuSpeed: number;
|
|
63
|
+
danmuLaneCount: number;
|
|
64
|
+
danmuMaxMessages: number;
|
|
65
|
+
setDanmuUnlocked: (unlocked: boolean) => void;
|
|
66
|
+
setDanmuEnabled: (enabled: boolean) => void;
|
|
67
|
+
setDanmuOpacity: (opacity: number) => void;
|
|
68
|
+
setDanmuSpeed: (speed: number) => void;
|
|
69
|
+
setDanmuLaneCount: (laneCount: number) => void;
|
|
70
|
+
setDanmuMaxMessages: (maxMessages: number) => void;
|
|
57
71
|
}
|
|
58
72
|
|
|
59
73
|
export type StreamplaceStore = StoreApi<StreamplaceState>;
|
|
@@ -65,6 +79,12 @@ export const makeStreamplaceStore = ({
|
|
|
65
79
|
}): StoreApi<StreamplaceState> => {
|
|
66
80
|
const VOLUME_STORAGE_KEY = "globalVolume";
|
|
67
81
|
const MUTED_STORAGE_KEY = "globalMuted";
|
|
82
|
+
const DANMU_UNLOCKED_KEY = "danmuUnlocked";
|
|
83
|
+
const DANMU_ENABLED_KEY = "danmuEnabled";
|
|
84
|
+
const DANMU_OPACITY_KEY = "danmuOpacity";
|
|
85
|
+
const DANMU_SPEED_KEY = "danmuSpeed";
|
|
86
|
+
const DANMU_LANE_COUNT_KEY = "danmuLaneCount";
|
|
87
|
+
const DANMU_MAX_MESSAGES_KEY = "danmuMaxMessages";
|
|
68
88
|
|
|
69
89
|
const store = createStore<StreamplaceState>()((set) => ({
|
|
70
90
|
url,
|
|
@@ -125,16 +145,82 @@ export const makeStreamplaceStore = ({
|
|
|
125
145
|
set({ muted });
|
|
126
146
|
storage.setItem(MUTED_STORAGE_KEY, muted.toString()).catch(console.error);
|
|
127
147
|
},
|
|
148
|
+
|
|
149
|
+
// Danmu settings - start with defaults
|
|
150
|
+
danmuUnlocked: false,
|
|
151
|
+
danmuEnabled: false,
|
|
152
|
+
danmuOpacity: 80,
|
|
153
|
+
danmuSpeed: 1,
|
|
154
|
+
danmuLaneCount: 12,
|
|
155
|
+
danmuMaxMessages: 50,
|
|
156
|
+
|
|
157
|
+
setDanmuUnlocked: (unlocked: boolean) => {
|
|
158
|
+
set({ danmuUnlocked: unlocked });
|
|
159
|
+
storage
|
|
160
|
+
.setItem(DANMU_UNLOCKED_KEY, unlocked.toString())
|
|
161
|
+
.catch(console.error);
|
|
162
|
+
},
|
|
163
|
+
|
|
164
|
+
setDanmuEnabled: (enabled: boolean) => {
|
|
165
|
+
set({ danmuEnabled: enabled });
|
|
166
|
+
storage
|
|
167
|
+
.setItem(DANMU_ENABLED_KEY, enabled.toString())
|
|
168
|
+
.catch(console.error);
|
|
169
|
+
},
|
|
170
|
+
|
|
171
|
+
setDanmuOpacity: (opacity: number) => {
|
|
172
|
+
const clamped = Math.max(0, Math.min(100, opacity));
|
|
173
|
+
set({ danmuOpacity: clamped });
|
|
174
|
+
storage
|
|
175
|
+
.setItem(DANMU_OPACITY_KEY, clamped.toString())
|
|
176
|
+
.catch(console.error);
|
|
177
|
+
},
|
|
178
|
+
|
|
179
|
+
setDanmuSpeed: (speed: number) => {
|
|
180
|
+
const clamped = Math.max(0.1, Math.min(3, speed));
|
|
181
|
+
set({ danmuSpeed: clamped });
|
|
182
|
+
storage.setItem(DANMU_SPEED_KEY, clamped.toString()).catch(console.error);
|
|
183
|
+
},
|
|
184
|
+
|
|
185
|
+
setDanmuLaneCount: (laneCount: number) => {
|
|
186
|
+
const clamped = Math.max(4, Math.min(20, laneCount));
|
|
187
|
+
set({ danmuLaneCount: clamped });
|
|
188
|
+
storage
|
|
189
|
+
.setItem(DANMU_LANE_COUNT_KEY, clamped.toString())
|
|
190
|
+
.catch(console.error);
|
|
191
|
+
},
|
|
192
|
+
|
|
193
|
+
setDanmuMaxMessages: (maxMessages: number) => {
|
|
194
|
+
const clamped = Math.max(5, Math.min(200, maxMessages));
|
|
195
|
+
set({ danmuMaxMessages: clamped });
|
|
196
|
+
storage
|
|
197
|
+
.setItem(DANMU_MAX_MESSAGES_KEY, clamped.toString())
|
|
198
|
+
.catch(console.error);
|
|
199
|
+
},
|
|
128
200
|
}));
|
|
129
201
|
|
|
130
|
-
// Load initial volume state from storage asynchronously
|
|
202
|
+
// Load initial volume and danmu state from storage asynchronously
|
|
131
203
|
(async () => {
|
|
132
204
|
try {
|
|
133
205
|
const storedVolume = await storage.getItem(VOLUME_STORAGE_KEY);
|
|
134
206
|
const storedMuted = await storage.getItem(MUTED_STORAGE_KEY);
|
|
207
|
+
const storedDanmuUnlocked = await storage.getItem(DANMU_UNLOCKED_KEY);
|
|
208
|
+
const storedDanmuEnabled = await storage.getItem(DANMU_ENABLED_KEY);
|
|
209
|
+
const storedDanmuOpacity = await storage.getItem(DANMU_OPACITY_KEY);
|
|
210
|
+
const storedDanmuSpeed = await storage.getItem(DANMU_SPEED_KEY);
|
|
211
|
+
const storedDanmuLaneCount = await storage.getItem(DANMU_LANE_COUNT_KEY);
|
|
212
|
+
const storedDanmuMaxMessages = await storage.getItem(
|
|
213
|
+
DANMU_MAX_MESSAGES_KEY,
|
|
214
|
+
);
|
|
135
215
|
|
|
136
216
|
let initialVolume = 1.0;
|
|
137
217
|
let initialMuted = false;
|
|
218
|
+
let initialDanmuUnlocked = false;
|
|
219
|
+
let initialDanmuEnabled = false;
|
|
220
|
+
let initialDanmuOpacity = 80;
|
|
221
|
+
let initialDanmuSpeed = 1;
|
|
222
|
+
let initialDanmuLaneCount = 12;
|
|
223
|
+
let initialDanmuMaxMessages = 50;
|
|
138
224
|
|
|
139
225
|
if (storedVolume) {
|
|
140
226
|
const parsedVolume = parseFloat(storedVolume);
|
|
@@ -151,12 +237,54 @@ export const makeStreamplaceStore = ({
|
|
|
151
237
|
initialMuted = storedMuted === "true";
|
|
152
238
|
}
|
|
153
239
|
|
|
240
|
+
if (storedDanmuUnlocked) {
|
|
241
|
+
initialDanmuUnlocked = storedDanmuUnlocked === "true";
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
if (storedDanmuEnabled) {
|
|
245
|
+
initialDanmuEnabled = storedDanmuEnabled === "true";
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
if (storedDanmuOpacity) {
|
|
249
|
+
const parsed = parseInt(storedDanmuOpacity);
|
|
250
|
+
if (Number.isFinite(parsed) && parsed >= 0 && parsed <= 100) {
|
|
251
|
+
initialDanmuOpacity = parsed;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
if (storedDanmuSpeed) {
|
|
256
|
+
const parsed = parseFloat(storedDanmuSpeed);
|
|
257
|
+
if (Number.isFinite(parsed) && parsed >= 0.1 && parsed <= 3) {
|
|
258
|
+
initialDanmuSpeed = parsed;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
if (storedDanmuLaneCount) {
|
|
263
|
+
const parsed = parseInt(storedDanmuLaneCount);
|
|
264
|
+
if (Number.isFinite(parsed) && parsed >= 4 && parsed <= 20) {
|
|
265
|
+
initialDanmuLaneCount = parsed;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
if (storedDanmuMaxMessages) {
|
|
270
|
+
const parsed = parseInt(storedDanmuMaxMessages);
|
|
271
|
+
if (Number.isFinite(parsed) && parsed >= 5 && parsed <= 200) {
|
|
272
|
+
initialDanmuMaxMessages = parsed;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
154
276
|
store.setState({
|
|
155
277
|
volume: initialVolume,
|
|
156
278
|
muted: initialMuted,
|
|
279
|
+
danmuUnlocked: initialDanmuUnlocked,
|
|
280
|
+
danmuEnabled: initialDanmuEnabled,
|
|
281
|
+
danmuOpacity: initialDanmuOpacity,
|
|
282
|
+
danmuSpeed: initialDanmuSpeed,
|
|
283
|
+
danmuLaneCount: initialDanmuLaneCount,
|
|
284
|
+
danmuMaxMessages: initialDanmuMaxMessages,
|
|
157
285
|
});
|
|
158
286
|
} catch (error) {
|
|
159
|
-
console.error("Failed to load
|
|
287
|
+
console.error("Failed to load state from storage:", error);
|
|
160
288
|
}
|
|
161
289
|
})();
|
|
162
290
|
|
|
@@ -213,4 +341,58 @@ export const useEffectiveVolume = () =>
|
|
|
213
341
|
return Number.isFinite(effectiveVolume) ? effectiveVolume : 1.0;
|
|
214
342
|
});
|
|
215
343
|
|
|
344
|
+
// Danmu convenience hooks
|
|
345
|
+
export const useDanmuUnlocked = () =>
|
|
346
|
+
useStreamplaceStore((x) => x.danmuUnlocked);
|
|
347
|
+
export const useDanmuEnabled = () => useStreamplaceStore((x) => x.danmuEnabled);
|
|
348
|
+
export const useDanmuOpacity = () => useStreamplaceStore((x) => x.danmuOpacity);
|
|
349
|
+
export const useDanmuSpeed = () => useStreamplaceStore((x) => x.danmuSpeed);
|
|
350
|
+
export const useDanmuLaneCount = () =>
|
|
351
|
+
useStreamplaceStore((x) => x.danmuLaneCount);
|
|
352
|
+
export const useDanmuMaxMessages = () =>
|
|
353
|
+
useStreamplaceStore((x) => x.danmuMaxMessages);
|
|
354
|
+
export const useSetDanmuUnlocked = () =>
|
|
355
|
+
useStreamplaceStore((x) => x.setDanmuUnlocked);
|
|
356
|
+
export const useSetDanmuEnabled = () =>
|
|
357
|
+
useStreamplaceStore((x) => x.setDanmuEnabled);
|
|
358
|
+
export const useSetDanmuOpacity = () =>
|
|
359
|
+
useStreamplaceStore((x) => x.setDanmuOpacity);
|
|
360
|
+
export const useSetDanmuSpeed = () =>
|
|
361
|
+
useStreamplaceStore((x) => x.setDanmuSpeed);
|
|
362
|
+
export const useSetDanmuLaneCount = () =>
|
|
363
|
+
useStreamplaceStore((x) => x.setDanmuLaneCount);
|
|
364
|
+
export const useSetDanmuMaxMessages = () =>
|
|
365
|
+
useStreamplaceStore((x) => x.setDanmuMaxMessages);
|
|
366
|
+
|
|
367
|
+
// Composite hook that calls all individual hooks
|
|
368
|
+
export const useDanmuSettings = () => {
|
|
369
|
+
const danmuUnlocked = useDanmuUnlocked();
|
|
370
|
+
const danmuEnabled = useDanmuEnabled();
|
|
371
|
+
const danmuOpacity = useDanmuOpacity();
|
|
372
|
+
const danmuSpeed = useDanmuSpeed();
|
|
373
|
+
const danmuLaneCount = useDanmuLaneCount();
|
|
374
|
+
const danmuMaxMessages = useDanmuMaxMessages();
|
|
375
|
+
const setDanmuUnlocked = useSetDanmuUnlocked();
|
|
376
|
+
const setDanmuEnabled = useSetDanmuEnabled();
|
|
377
|
+
const setDanmuOpacity = useSetDanmuOpacity();
|
|
378
|
+
const setDanmuSpeed = useSetDanmuSpeed();
|
|
379
|
+
const setDanmuLaneCount = useSetDanmuLaneCount();
|
|
380
|
+
const setDanmuMaxMessages = useSetDanmuMaxMessages();
|
|
381
|
+
|
|
382
|
+
return {
|
|
383
|
+
danmuUnlocked,
|
|
384
|
+
danmuEnabled,
|
|
385
|
+
danmuOpacity,
|
|
386
|
+
danmuSpeed,
|
|
387
|
+
danmuLaneCount,
|
|
388
|
+
danmuMaxMessages,
|
|
389
|
+
setDanmuUnlocked,
|
|
390
|
+
setDanmuEnabled,
|
|
391
|
+
setDanmuOpacity,
|
|
392
|
+
setDanmuSpeed,
|
|
393
|
+
setDanmuLaneCount,
|
|
394
|
+
setDanmuMaxMessages,
|
|
395
|
+
};
|
|
396
|
+
};
|
|
397
|
+
|
|
216
398
|
export { useCreateStreamRecord, useUpdateStreamRecord } from "./stream";
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { Platform } from "react-native";
|
|
2
|
+
|
|
3
|
+
let timeOffset = 0;
|
|
4
|
+
let hasWarned = false;
|
|
5
|
+
let OriginalDate: DateConstructor = Date;
|
|
6
|
+
|
|
7
|
+
const CLOCK_DRIFT_THRESHOLD_MS = 5000; // 5 seconds
|
|
8
|
+
|
|
9
|
+
export function getTimeOffset(): number {
|
|
10
|
+
return timeOffset;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export function setTimeOffset(offset: number): void {
|
|
14
|
+
timeOffset = offset;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function checkClockDrift(serverTime: string): {
|
|
18
|
+
hasDrift: boolean;
|
|
19
|
+
driftMs: number;
|
|
20
|
+
driftSeconds: number;
|
|
21
|
+
} {
|
|
22
|
+
const serverDate = new Date(serverTime);
|
|
23
|
+
const clientDate = new Date();
|
|
24
|
+
const drift = Math.abs(serverDate.getTime() - clientDate.getTime());
|
|
25
|
+
|
|
26
|
+
if (drift > CLOCK_DRIFT_THRESHOLD_MS) {
|
|
27
|
+
const driftSeconds = Math.round(drift / 1000);
|
|
28
|
+
if (!hasWarned) {
|
|
29
|
+
hasWarned = true;
|
|
30
|
+
console.warn(
|
|
31
|
+
`clock drift detected: ${driftSeconds}s difference from server time. ` +
|
|
32
|
+
`this may cause issues with time-sensitive operations. ` +
|
|
33
|
+
`please sync your system clock.`,
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
return { hasDrift: true, driftMs: drift, driftSeconds };
|
|
37
|
+
} else {
|
|
38
|
+
return {
|
|
39
|
+
hasDrift: false,
|
|
40
|
+
driftMs: drift,
|
|
41
|
+
driftSeconds: Math.round(drift / 1000),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function syncTimeWithServer(
|
|
47
|
+
serverTime: string,
|
|
48
|
+
networkLatencyMs: number,
|
|
49
|
+
): void {
|
|
50
|
+
const serverDate = new OriginalDate(serverTime);
|
|
51
|
+
const clientDate = new OriginalDate();
|
|
52
|
+
const offset = serverDate.getTime() - clientDate.getTime() - networkLatencyMs;
|
|
53
|
+
|
|
54
|
+
setTimeOffset(offset);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export function getSyncedDate(): Date {
|
|
58
|
+
const now = new Date();
|
|
59
|
+
if (timeOffset !== 0) {
|
|
60
|
+
return new Date(now.getTime() + timeOffset);
|
|
61
|
+
}
|
|
62
|
+
return now;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export function getSystemDate(): Date {
|
|
66
|
+
return new OriginalDate();
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export function getSystemTime(): number {
|
|
70
|
+
return OriginalDate.now();
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export function initializeTimeSync(): void {
|
|
74
|
+
if (Platform.OS !== "web") {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// store original Date
|
|
79
|
+
OriginalDate = Date;
|
|
80
|
+
const OriginalDatePrototype = OriginalDate.prototype;
|
|
81
|
+
|
|
82
|
+
// create patched Date constructor
|
|
83
|
+
function PatchedDate(this: any, ...args: any[]): any {
|
|
84
|
+
// If called as a function (no `new`), forward to original Date to get the string form
|
|
85
|
+
if (!(this instanceof PatchedDate)) {
|
|
86
|
+
return OriginalDate.apply(undefined, args as any);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// If called as a constructor, construct a Date with synced time when no args provided
|
|
90
|
+
if (args.length === 0) {
|
|
91
|
+
const syncedTime = OriginalDate.now() + timeOffset;
|
|
92
|
+
return Reflect.construct(OriginalDate, [syncedTime], PatchedDate);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Otherwise construct with the provided arguments
|
|
96
|
+
return Reflect.construct(OriginalDate, args, PatchedDate);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// copy static methods
|
|
100
|
+
PatchedDate.now = function (): number {
|
|
101
|
+
return OriginalDate.now() + timeOffset;
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
PatchedDate.parse = OriginalDate.parse;
|
|
105
|
+
PatchedDate.UTC = OriginalDate.UTC;
|
|
106
|
+
|
|
107
|
+
// copy prototype
|
|
108
|
+
PatchedDate.prototype = OriginalDatePrototype;
|
|
109
|
+
|
|
110
|
+
// replace global Date
|
|
111
|
+
(globalThis as any).Date = PatchedDate;
|
|
112
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { TriangleAlert } from "lucide-react-native";
|
|
2
|
+
import { useEffect, useRef } from "react";
|
|
3
|
+
import { Platform } from "react-native";
|
|
4
|
+
import { StreamplaceAgent } from "streamplace";
|
|
5
|
+
import { useToast } from "../components/ui/toast";
|
|
6
|
+
import { useUrl } from "../streamplace-store/streamplace-store";
|
|
7
|
+
import { checkClockDrift, syncTimeWithServer } from "./time-sync";
|
|
8
|
+
|
|
9
|
+
export function useTimeSync() {
|
|
10
|
+
const url = useUrl();
|
|
11
|
+
const t = useToast();
|
|
12
|
+
const hasShownWarning = useRef(false);
|
|
13
|
+
|
|
14
|
+
useEffect(() => {
|
|
15
|
+
const checkTime = async () => {
|
|
16
|
+
if (Platform.OS !== "web") {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
try {
|
|
20
|
+
const agent = new StreamplaceAgent(url);
|
|
21
|
+
const start = new Date().getTime();
|
|
22
|
+
const response = await agent.place.stream.server.getServerTime();
|
|
23
|
+
const roundTripLatency = new Date().getTime() - start;
|
|
24
|
+
const serverTime = response.data.serverTime;
|
|
25
|
+
|
|
26
|
+
// always sync with server time
|
|
27
|
+
syncTimeWithServer(serverTime, roundTripLatency / 2);
|
|
28
|
+
|
|
29
|
+
const driftInfo = checkClockDrift(serverTime);
|
|
30
|
+
|
|
31
|
+
// only show warning if drift is significant
|
|
32
|
+
if (driftInfo.hasDrift && !hasShownWarning.current) {
|
|
33
|
+
hasShownWarning.current = true;
|
|
34
|
+
t.show(
|
|
35
|
+
"Clock drift detected!",
|
|
36
|
+
`Your device clock is ${driftInfo.driftSeconds}s off from server time. Please sync your system clock to avoid issues.`,
|
|
37
|
+
{
|
|
38
|
+
variant: "info",
|
|
39
|
+
iconLeft: TriangleAlert,
|
|
40
|
+
duration: 25,
|
|
41
|
+
},
|
|
42
|
+
);
|
|
43
|
+
console.log(
|
|
44
|
+
`time sync applied: offset ${driftInfo.driftMs}ms. Date() calls will now use server time.`,
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
} catch (error) {
|
|
48
|
+
console.error("failed to sync time with server:", error);
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
checkTime();
|
|
53
|
+
|
|
54
|
+
const interval = setInterval(checkTime, 1800000); // every 30m
|
|
55
|
+
|
|
56
|
+
return () => clearInterval(interval);
|
|
57
|
+
}, [url, t]);
|
|
58
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { AppBskyActorDefs } from "@atproto/api";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* formats a user's handle for display, falling back to DID if handle is invalid
|
|
5
|
+
*/
|
|
6
|
+
export function formatHandle(
|
|
7
|
+
profile: Pick<AppBskyActorDefs.ProfileViewBasic, "handle" | "did">,
|
|
8
|
+
prefix: string = "",
|
|
9
|
+
): string {
|
|
10
|
+
if (profile.handle === "handle.invalid") {
|
|
11
|
+
return profile.did;
|
|
12
|
+
}
|
|
13
|
+
return prefix + profile.handle;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* convenience function for formatting a user's handle with @ prefix for display,
|
|
18
|
+
* falling back to DID if handle is invalid
|
|
19
|
+
*/
|
|
20
|
+
export function formatHandleWithAt(
|
|
21
|
+
profile: Pick<AppBskyActorDefs.ProfileViewBasic, "handle" | "did">,
|
|
22
|
+
): string {
|
|
23
|
+
return formatHandle(profile, "@");
|
|
24
|
+
}
|
package/tsconfig.json
CHANGED
|
@@ -5,7 +5,16 @@
|
|
|
5
5
|
"outDir": "./dist",
|
|
6
6
|
"jsx": "react-jsx",
|
|
7
7
|
"module": "commonjs",
|
|
8
|
-
"
|
|
8
|
+
"noEmit": false,
|
|
9
|
+
"declaration": true,
|
|
10
|
+
"declarationMap": true,
|
|
11
|
+
"sourceMap": true,
|
|
12
|
+
"resolveJsonModule": true
|
|
9
13
|
},
|
|
10
|
-
"include": ["./src"]
|
|
14
|
+
"include": ["./src"],
|
|
15
|
+
"ts-node": {
|
|
16
|
+
"compilerOptions": {
|
|
17
|
+
"resolveJsonModule": true
|
|
18
|
+
}
|
|
19
|
+
}
|
|
11
20
|
}
|