@peers-app/peers-ui 0.14.0 → 0.15.0
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/.github/workflows/publish.yml +8 -5
- package/babel.config.js +4 -4
- package/biome.json +191 -0
- package/dist/command-palette/command-palette-ui.d.ts +1 -2
- package/dist/command-palette/command-palette-ui.js +175 -244
- package/dist/command-palette/command-palette.js +65 -64
- package/dist/components/chat-overlay.d.ts +2 -2
- package/dist/components/chat-overlay.js +160 -217
- package/dist/components/checkbox.d.ts +5 -4
- package/dist/components/checkbox.js +4 -7
- package/dist/components/group-switcher.d.ts +1 -2
- package/dist/components/group-switcher.js +119 -159
- package/dist/components/input-date.d.ts +3 -3
- package/dist/components/input-date.js +6 -6
- package/dist/components/input-number.d.ts +7 -6
- package/dist/components/input-number.js +25 -20
- package/dist/components/input.d.ts +5 -4
- package/dist/components/input.js +4 -7
- package/dist/components/inverse-lazy-list.d.ts +3 -3
- package/dist/components/inverse-lazy-list.js +13 -47
- package/dist/components/io-schema-values.d.ts +5 -6
- package/dist/components/io-schema-values.js +28 -65
- package/dist/components/io-schema.d.ts +4 -5
- package/dist/components/io-schema.js +42 -79
- package/dist/components/lazy-list.d.ts +3 -3
- package/dist/components/lazy-list.js +38 -58
- package/dist/components/list-screen.d.ts +3 -8
- package/dist/components/list-screen.js +28 -23
- package/dist/components/loading-indicator.d.ts +1 -2
- package/dist/components/loading-indicator.js +2 -6
- package/dist/components/markdown-editor/autolink-plugin.js +5 -8
- package/dist/components/markdown-editor/editor-inline.d.ts +2 -3
- package/dist/components/markdown-editor/editor-inline.js +2 -6
- package/dist/components/markdown-editor/editor.d.ts +6 -6
- package/dist/components/markdown-editor/editor.js +9 -19
- package/dist/components/markdown-editor/markdown-plugin.d.ts +1 -1
- package/dist/components/markdown-editor/markdown-plugin.js +20 -21
- package/dist/components/markdown-editor/mention-node.d.ts +2 -2
- package/dist/components/markdown-editor/mention-node.js +24 -24
- package/dist/components/markdown-editor/mentions-plugin.d.ts +2 -2
- package/dist/components/markdown-editor/mentions-plugin.js +61 -62
- package/dist/components/markdown-editor/theme.js +28 -28
- package/dist/components/markdown-editor/toolbar.d.ts +2 -3
- package/dist/components/markdown-editor/toolbar.js +32 -49
- package/dist/components/markdown-with-mentions.d.ts +1 -1
- package/dist/components/markdown-with-mentions.js +43 -43
- package/dist/components/message-logs/message-logs.d.ts +1 -2
- package/dist/components/message-logs/message-logs.js +91 -116
- package/dist/components/messages/avatar.d.ts +3 -4
- package/dist/components/messages/avatar.js +37 -46
- package/dist/components/messages/channel-message-list.d.ts +5 -6
- package/dist/components/messages/channel-message-list.js +34 -34
- package/dist/components/messages/channel-view.d.ts +1 -2
- package/dist/components/messages/channel-view.js +23 -57
- package/dist/components/messages/message-compose.d.ts +3 -4
- package/dist/components/messages/message-compose.js +27 -38
- package/dist/components/messages/message-display.d.ts +2 -3
- package/dist/components/messages/message-display.js +42 -95
- package/dist/components/messages/thread-message-list.d.ts +4 -5
- package/dist/components/messages/thread-message-list.js +29 -29
- package/dist/components/router.d.ts +1 -2
- package/dist/components/router.js +58 -66
- package/dist/components/save-button.d.ts +3 -3
- package/dist/components/save-button.js +23 -33
- package/dist/components/sortable-list.d.ts +11 -12
- package/dist/components/sortable-list.js +42 -22
- package/dist/components/tabs.d.ts +3 -3
- package/dist/components/tabs.js +16 -47
- package/dist/components/tooltip.d.ts +4 -4
- package/dist/components/tooltip.js +4 -9
- package/dist/components/trust-level-badge.d.ts +2 -3
- package/dist/components/trust-level-badge.js +16 -16
- package/dist/components/trust-level-dropdown.d.ts +3 -4
- package/dist/components/trust-level-dropdown.js +32 -55
- package/dist/components/typeahead.d.ts +3 -3
- package/dist/components/typeahead.js +48 -89
- package/dist/components/voice-indicator.d.ts +2 -2
- package/dist/components/voice-indicator.js +93 -106
- package/dist/components/voice-subscribe-events.d.ts +32 -0
- package/dist/components/voice-subscribe-events.js +2 -0
- package/dist/globals.d.ts +3 -5
- package/dist/globals.js +22 -33
- package/dist/hooks.d.ts +5 -5
- package/dist/hooks.js +22 -12
- package/dist/hooks.test.js +129 -145
- package/dist/index.d.ts +9 -8
- package/dist/index.js +13 -12
- package/dist/mention-configs.d.ts +2 -2
- package/dist/mention-configs.js +55 -42
- package/dist/screens/assistants/assistant-config.d.ts +2 -3
- package/dist/screens/assistants/assistant-config.js +9 -22
- package/dist/screens/assistants/assistant-details.d.ts +1 -2
- package/dist/screens/assistants/assistant-details.js +13 -28
- package/dist/screens/assistants/assistant-info.d.ts +2 -3
- package/dist/screens/assistants/assistant-info.js +3 -17
- package/dist/screens/assistants/assistant-list.d.ts +1 -2
- package/dist/screens/assistants/assistant-list.js +15 -56
- package/dist/screens/assistants/assistant-tools.d.ts +2 -3
- package/dist/screens/assistants/assistant-tools.js +10 -24
- package/dist/screens/console-logs/console-logs-list.d.ts +1 -2
- package/dist/screens/console-logs/console-logs-list.js +130 -134
- package/dist/screens/console-logs/log-display.d.ts +2 -3
- package/dist/screens/console-logs/log-display.js +40 -42
- package/dist/screens/console-logs/log-filters.d.ts +1 -2
- package/dist/screens/console-logs/log-filters.js +2 -24
- package/dist/screens/console-logs/mobile-log-card.d.ts +2 -3
- package/dist/screens/console-logs/mobile-log-card.js +64 -67
- package/dist/screens/console-logs/resizable-table-header.d.ts +1 -2
- package/dist/screens/console-logs/resizable-table-header.js +31 -67
- package/dist/screens/contacts/contact-details.d.ts +1 -2
- package/dist/screens/contacts/contact-details.js +16 -46
- package/dist/screens/contacts/contact-list.d.ts +1 -2
- package/dist/screens/contacts/contact-list.js +44 -103
- package/dist/screens/contacts/index.d.ts +4 -4
- package/dist/screens/contacts/index.js +1 -1
- package/dist/screens/contacts/user-connect.d.ts +1 -2
- package/dist/screens/contacts/user-connect.js +85 -186
- package/dist/screens/data-explorer/data-explorer.d.ts +1 -2
- package/dist/screens/data-explorer/data-explorer.js +61 -181
- package/dist/screens/data-explorer/index.d.ts +2 -2
- package/dist/screens/data-explorer/query-executor.d.ts +1 -2
- package/dist/screens/data-explorer/query-executor.js +56 -166
- package/dist/screens/groups/group-details.d.ts +1 -2
- package/dist/screens/groups/group-details.js +27 -122
- package/dist/screens/groups/group-invite-listener.d.ts +2 -3
- package/dist/screens/groups/group-invite-listener.js +8 -104
- package/dist/screens/groups/group-list.d.ts +1 -2
- package/dist/screens/groups/group-list.js +56 -133
- package/dist/screens/groups/group-members.d.ts +2 -3
- package/dist/screens/groups/group-members.js +62 -132
- package/dist/screens/groups/index.d.ts +4 -4
- package/dist/screens/groups/index.js +1 -1
- package/dist/screens/join-group/index.d.ts +2 -2
- package/dist/screens/join-group/join-group.d.ts +1 -2
- package/dist/screens/join-group/join-group.js +9 -109
- package/dist/screens/network-viewer/connection-troubleshooter.d.ts +2 -3
- package/dist/screens/network-viewer/connection-troubleshooter.js +89 -193
- package/dist/screens/network-viewer/cpu-usage-graph.d.ts +1 -2
- package/dist/screens/network-viewer/cpu-usage-graph.js +60 -99
- package/dist/screens/network-viewer/device-details-modal.d.ts +1 -2
- package/dist/screens/network-viewer/device-details-modal.js +25 -177
- package/dist/screens/network-viewer/group-details-modal.d.ts +1 -2
- package/dist/screens/network-viewer/group-details-modal.js +31 -142
- package/dist/screens/network-viewer/index.d.ts +4 -4
- package/dist/screens/network-viewer/index.js +3 -3
- package/dist/screens/network-viewer/network-viewer-ipc.d.ts +22 -0
- package/dist/screens/network-viewer/network-viewer-ipc.js +6 -0
- package/dist/screens/network-viewer/network-viewer.d.ts +1 -2
- package/dist/screens/network-viewer/network-viewer.js +91 -296
- package/dist/screens/network-viewer/usage-graph.d.ts +1 -2
- package/dist/screens/network-viewer/usage-graph.js +78 -110
- package/dist/screens/packages/package-details.d.ts +1 -2
- package/dist/screens/packages/package-details.js +35 -41
- package/dist/screens/packages/package-info.d.ts +2 -2
- package/dist/screens/packages/package-info.js +33 -86
- package/dist/screens/packages/package-list.d.ts +1 -2
- package/dist/screens/packages/package-list.js +42 -106
- package/dist/screens/packages/package-new-local.d.ts +1 -2
- package/dist/screens/packages/package-new-local.js +13 -19
- package/dist/screens/packages/package-versions.d.ts +2 -3
- package/dist/screens/packages/package-versions.js +29 -96
- package/dist/screens/peer-types/peer-type-details.d.ts +3 -4
- package/dist/screens/peer-types/peer-type-details.js +26 -78
- package/dist/screens/peer-types/peer-type-list.d.ts +1 -2
- package/dist/screens/peer-types/peer-type-list.js +13 -24
- package/dist/screens/search/global-search.d.ts +1 -2
- package/dist/screens/search/global-search.js +104 -182
- package/dist/screens/settings/color-mode-dropdown.d.ts +3 -4
- package/dist/screens/settings/color-mode-dropdown.js +18 -37
- package/dist/screens/settings/settings-page.d.ts +1 -1
- package/dist/screens/settings/settings-page.js +86 -213
- package/dist/screens/settings/voice-settings-agent.d.ts +1 -1
- package/dist/screens/settings/voice-settings-agent.js +7 -44
- package/dist/screens/settings/voice-settings-api-keys.d.ts +2 -2
- package/dist/screens/settings/voice-settings-api-keys.js +2 -29
- package/dist/screens/settings/voice-settings-output.d.ts +2 -2
- package/dist/screens/settings/voice-settings-output.js +2 -40
- package/dist/screens/settings/voice-settings-providers.d.ts +2 -2
- package/dist/screens/settings/voice-settings-providers.js +2 -19
- package/dist/screens/settings/voice-settings-types.d.ts +4 -4
- package/dist/screens/settings/voice-settings-types.js +31 -31
- package/dist/screens/settings/voice-settings-wake-word.d.ts +2 -2
- package/dist/screens/settings/voice-settings-wake-word.js +2 -33
- package/dist/screens/settings/voice-settings.d.ts +1 -1
- package/dist/screens/settings/voice-settings.js +35 -112
- package/dist/screens/setup-user.d.ts +1 -2
- package/dist/screens/setup-user.js +38 -116
- package/dist/screens/tools/tool-code.d.ts +2 -3
- package/dist/screens/tools/tool-code.js +9 -13
- package/dist/screens/tools/tool-details.d.ts +1 -2
- package/dist/screens/tools/tool-details.js +26 -39
- package/dist/screens/tools/tool-info.d.ts +2 -3
- package/dist/screens/tools/tool-info.js +9 -48
- package/dist/screens/tools/tool-list.d.ts +1 -2
- package/dist/screens/tools/tool-list.js +33 -65
- package/dist/screens/tools/tool-schema.d.ts +2 -3
- package/dist/screens/tools/tool-schema.js +2 -13
- package/dist/screens/tools/tool-test-details.d.ts +1 -2
- package/dist/screens/tools/tool-test-details.js +12 -28
- package/dist/screens/tools/tool-test-list.d.ts +1 -2
- package/dist/screens/tools/tool-test-list.js +17 -56
- package/dist/screens/variables/variable-details.d.ts +1 -2
- package/dist/screens/variables/variable-details.js +19 -86
- package/dist/screens/variables/variable-list.d.ts +1 -2
- package/dist/screens/variables/variable-list.js +16 -27
- package/dist/screens/welcome-modal.d.ts +1 -2
- package/dist/screens/welcome-modal.js +44 -111
- package/dist/screens/workflows/workflow-details.d.ts +1 -2
- package/dist/screens/workflows/workflow-details.js +17 -31
- package/dist/screens/workflows/workflow-info.d.ts +2 -3
- package/dist/screens/workflows/workflow-info.js +2 -9
- package/dist/screens/workflows/workflow-instructions.d.ts +2 -3
- package/dist/screens/workflows/workflow-instructions.js +23 -55
- package/dist/screens/workflows/workflow-list.d.ts +1 -2
- package/dist/screens/workflows/workflow-list.js +23 -62
- package/dist/setupTests.d.ts +1 -1
- package/dist/setupTests.js +10 -11
- package/dist/system-apps/assistants.app.d.ts +1 -1
- package/dist/system-apps/assistants.app.js +3 -3
- package/dist/system-apps/console-logs.app.d.ts +1 -1
- package/dist/system-apps/console-logs.app.js +3 -3
- package/dist/system-apps/contacts.app.d.ts +1 -1
- package/dist/system-apps/contacts.app.js +4 -4
- package/dist/system-apps/data-explorer.app.d.ts +1 -1
- package/dist/system-apps/data-explorer.app.js +4 -4
- package/dist/system-apps/groups.app.d.ts +1 -1
- package/dist/system-apps/groups.app.js +4 -4
- package/dist/system-apps/index.d.ts +17 -17
- package/dist/system-apps/index.js +52 -52
- package/dist/system-apps/join-group.app.d.ts +1 -1
- package/dist/system-apps/join-group.app.js +4 -4
- package/dist/system-apps/mobile-settings.app.d.ts +1 -1
- package/dist/system-apps/mobile-settings.app.js +3 -3
- package/dist/system-apps/network-viewer.app.d.ts +1 -1
- package/dist/system-apps/network-viewer.app.js +4 -4
- package/dist/system-apps/packages.app.d.ts +1 -1
- package/dist/system-apps/packages.app.js +3 -3
- package/dist/system-apps/search.app.d.ts +1 -1
- package/dist/system-apps/search.app.js +4 -4
- package/dist/system-apps/settings.app.d.ts +1 -1
- package/dist/system-apps/settings.app.js +3 -3
- package/dist/system-apps/threads.app.d.ts +1 -1
- package/dist/system-apps/threads.app.js +3 -3
- package/dist/system-apps/tools.app.d.ts +1 -1
- package/dist/system-apps/tools.app.js +3 -3
- package/dist/system-apps/types.app.d.ts +1 -1
- package/dist/system-apps/types.app.js +3 -3
- package/dist/system-apps/variables.app.d.ts +1 -1
- package/dist/system-apps/variables.app.js +3 -3
- package/dist/system-apps/workflows.app.d.ts +1 -1
- package/dist/system-apps/workflows.app.js +3 -3
- package/dist/tabs-layout/tabs-layout.d.ts +2 -3
- package/dist/tabs-layout/tabs-layout.js +215 -246
- package/dist/tabs-layout/tabs-state.d.ts +2 -2
- package/dist/tabs-layout/tabs-state.js +73 -61
- package/dist/ui-defaults/index.d.ts +2 -2
- package/dist/ui-defaults/list-screen.d.ts +2 -3
- package/dist/ui-defaults/list-screen.js +33 -37
- package/dist/ui-defaults/markdown-field.js +24 -56
- package/dist/ui-router/routes-loader.d.ts +1 -1
- package/dist/ui-router/routes-loader.js +17 -13
- package/dist/ui-router/ui-loader.d.ts +6 -6
- package/dist/ui-router/ui-loader.js +172 -268
- package/dist/utils.js +49 -39
- package/jest.config.js +16 -16
- package/package.json +16 -14
- package/src/command-palette/command-palette-ui.tsx +261 -237
- package/src/command-palette/command-palette.ts +81 -78
- package/src/components/chat-overlay.tsx +366 -261
- package/src/components/checkbox.tsx +15 -12
- package/src/components/group-switcher.tsx +150 -105
- package/src/components/input-date.tsx +17 -16
- package/src/components/input-number.tsx +47 -31
- package/src/components/input.tsx +15 -12
- package/src/components/inverse-lazy-list.tsx +14 -13
- package/src/components/io-schema-values.tsx +51 -69
- package/src/components/io-schema.tsx +94 -69
- package/src/components/lazy-list.tsx +51 -34
- package/src/components/list-screen.tsx +51 -35
- package/src/components/loading-indicator.tsx +2 -4
- package/src/components/markdown-editor/autolink-plugin.tsx +4 -11
- package/src/components/markdown-editor/editor-inline.tsx +3 -4
- package/src/components/markdown-editor/editor.tsx +53 -51
- package/src/components/markdown-editor/markdown-plugin.tsx +48 -40
- package/src/components/markdown-editor/mention-node.ts +39 -38
- package/src/components/markdown-editor/mentions-plugin.tsx +99 -101
- package/src/components/markdown-editor/theme.ts +28 -29
- package/src/components/markdown-editor/toolbar.tsx +53 -47
- package/src/components/markdown-with-mentions.tsx +56 -46
- package/src/components/message-logs/message-logs.tsx +225 -165
- package/src/components/messages/avatar.tsx +70 -52
- package/src/components/messages/channel-message-list.tsx +80 -68
- package/src/components/messages/channel-view.tsx +34 -33
- package/src/components/messages/message-compose.tsx +84 -67
- package/src/components/messages/message-display.tsx +103 -89
- package/src/components/messages/thread-message-list.tsx +53 -44
- package/src/components/router.tsx +42 -43
- package/src/components/save-button.tsx +43 -39
- package/src/components/sortable-list.tsx +77 -49
- package/src/components/tabs.tsx +31 -31
- package/src/components/tooltip.tsx +21 -28
- package/src/components/trust-level-badge.tsx +15 -11
- package/src/components/trust-level-dropdown.tsx +49 -19
- package/src/components/typeahead.tsx +57 -59
- package/src/components/voice-indicator.tsx +158 -141
- package/src/components/voice-subscribe-events.ts +20 -0
- package/src/globals.tsx +42 -40
- package/src/hooks.test.tsx +141 -134
- package/src/hooks.ts +80 -48
- package/src/index.tsx +17 -10
- package/src/mention-configs.ts +122 -68
- package/src/screens/assistants/assistant-config.tsx +28 -18
- package/src/screens/assistants/assistant-details.tsx +35 -36
- package/src/screens/assistants/assistant-info.tsx +16 -11
- package/src/screens/assistants/assistant-list.tsx +37 -34
- package/src/screens/assistants/assistant-tools.tsx +41 -20
- package/src/screens/console-logs/console-logs-list.tsx +173 -140
- package/src/screens/console-logs/log-display.tsx +65 -38
- package/src/screens/console-logs/log-filters.tsx +4 -3
- package/src/screens/console-logs/mobile-log-card.tsx +78 -71
- package/src/screens/console-logs/resizable-table-header.tsx +29 -21
- package/src/screens/contacts/contact-details.tsx +29 -30
- package/src/screens/contacts/contact-list.tsx +71 -60
- package/src/screens/contacts/index.ts +5 -5
- package/src/screens/contacts/user-connect.tsx +177 -171
- package/src/screens/data-explorer/data-explorer.tsx +134 -98
- package/src/screens/data-explorer/index.ts +2 -3
- package/src/screens/data-explorer/query-executor.tsx +90 -80
- package/src/screens/groups/group-details.tsx +120 -101
- package/src/screens/groups/group-invite-listener.tsx +34 -37
- package/src/screens/groups/group-list.tsx +119 -103
- package/src/screens/groups/group-members.tsx +225 -164
- package/src/screens/groups/index.ts +5 -6
- package/src/screens/join-group/index.ts +2 -2
- package/src/screens/join-group/join-group.tsx +41 -39
- package/src/screens/network-viewer/connection-troubleshooter.tsx +145 -104
- package/src/screens/network-viewer/cpu-usage-graph.tsx +39 -43
- package/src/screens/network-viewer/device-details-modal.tsx +46 -59
- package/src/screens/network-viewer/group-details-modal.tsx +68 -49
- package/src/screens/network-viewer/index.ts +4 -5
- package/src/screens/network-viewer/network-viewer-ipc.ts +23 -0
- package/src/screens/network-viewer/network-viewer.tsx +261 -236
- package/src/screens/network-viewer/usage-graph.tsx +57 -49
- package/src/screens/packages/package-details.tsx +43 -35
- package/src/screens/packages/package-info.tsx +107 -66
- package/src/screens/packages/package-list.tsx +175 -98
- package/src/screens/packages/package-new-local.tsx +28 -26
- package/src/screens/packages/package-versions.tsx +102 -77
- package/src/screens/peer-types/peer-type-details.tsx +60 -50
- package/src/screens/peer-types/peer-type-list.tsx +20 -30
- package/src/screens/search/global-search.tsx +153 -137
- package/src/screens/settings/color-mode-dropdown.tsx +52 -35
- package/src/screens/settings/settings-page.tsx +215 -141
- package/src/screens/settings/voice-settings-agent.tsx +13 -12
- package/src/screens/settings/voice-settings-api-keys.tsx +14 -12
- package/src/screens/settings/voice-settings-output.tsx +12 -11
- package/src/screens/settings/voice-settings-providers.tsx +7 -3
- package/src/screens/settings/voice-settings-types.ts +52 -49
- package/src/screens/settings/voice-settings-wake-word.tsx +25 -9
- package/src/screens/settings/voice-settings.tsx +66 -43
- package/src/screens/setup-user.tsx +88 -41
- package/src/screens/tools/tool-code.tsx +12 -17
- package/src/screens/tools/tool-details.tsx +28 -28
- package/src/screens/tools/tool-info.tsx +14 -19
- package/src/screens/tools/tool-list.tsx +58 -40
- package/src/screens/tools/tool-schema.tsx +16 -9
- package/src/screens/tools/tool-test-details.tsx +11 -22
- package/src/screens/tools/tool-test-list.tsx +29 -30
- package/src/screens/variables/variable-details.tsx +63 -51
- package/src/screens/variables/variable-list.tsx +29 -30
- package/src/screens/welcome-modal.tsx +68 -48
- package/src/screens/workflows/workflow-details.tsx +40 -30
- package/src/screens/workflows/workflow-info.tsx +4 -11
- package/src/screens/workflows/workflow-instructions.tsx +35 -28
- package/src/screens/workflows/workflow-list.tsx +50 -40
- package/src/setupTests.ts +14 -13
- package/src/system-apps/assistants.app.ts +5 -5
- package/src/system-apps/console-logs.app.ts +4 -4
- package/src/system-apps/contacts.app.ts +6 -6
- package/src/system-apps/data-explorer.app.ts +5 -5
- package/src/system-apps/groups.app.ts +6 -6
- package/src/system-apps/index.ts +49 -49
- package/src/system-apps/join-group.app.ts +5 -5
- package/src/system-apps/mobile-settings.app.ts +4 -5
- package/src/system-apps/network-viewer.app.ts +5 -5
- package/src/system-apps/packages.app.ts +5 -5
- package/src/system-apps/search.app.ts +6 -6
- package/src/system-apps/settings.app.ts +5 -5
- package/src/system-apps/threads.app.ts +5 -5
- package/src/system-apps/tools.app.ts +5 -5
- package/src/system-apps/types.app.ts +5 -5
- package/src/system-apps/variables.app.ts +5 -5
- package/src/system-apps/workflows.app.ts +5 -5
- package/src/tabs-layout/tabs-layout.tsx +345 -254
- package/src/tabs-layout/tabs-state.ts +100 -81
- package/src/ui-defaults/index.ts +2 -3
- package/src/ui-defaults/list-screen.tsx +45 -40
- package/src/ui-defaults/markdown-field.tsx +22 -26
- package/src/ui-router/routes-loader.ts +40 -24
- package/src/ui-router/ui-loader.tsx +312 -214
- package/src/utils.ts +68 -81
- package/tsconfig.json +5 -10
- package/dist/components/input-datetime.d.ts +0 -7
- package/dist/components/input-datetime.js +0 -35
- package/dist/components/lazy-sortable-list.d.ts +0 -29
- package/dist/components/lazy-sortable-list.js +0 -12
- package/dist/components/left-bar.d.ts +0 -5
- package/dist/components/left-bar.js +0 -207
- package/dist/components/main-content-container.d.ts +0 -2
- package/dist/components/main-content-container.js +0 -92
- package/dist/components/messages/thread-view.d.ts +0 -6
- package/dist/components/messages/thread-view.js +0 -174
- package/dist/components/off-canvas.d.ts +0 -13
- package/dist/components/off-canvas.js +0 -89
- package/dist/components/text-list-editor.tsx/text-list-editor.d.ts +0 -6
- package/dist/components/text-list-editor.tsx/text-list-editor.js +0 -13
- package/dist/components/top-bar.d.ts +0 -2
- package/dist/components/top-bar.js +0 -51
- package/dist/components/typeahead/mentions-plugin.d.ts +0 -7
- package/dist/components/typeahead/mentions-plugin.js +0 -203
- package/dist/components/typeahead/typeahead-editor.d.ts +0 -15
- package/dist/components/typeahead/typeahead-editor.js +0 -134
- package/dist/components/typeahead/typeahead.d.ts +0 -12
- package/dist/components/typeahead/typeahead.js +0 -94
- package/dist/screens/profile.d.ts +0 -2
- package/dist/screens/profile.js +0 -76
- package/src/components/input-datetime.tsx +0 -41
- package/src/components/lazy-sortable-list.tsx +0 -51
- package/src/components/left-bar.tsx +0 -322
- package/src/components/main-content-container.tsx +0 -79
- package/src/components/messages/thread-view.tsx +0 -214
- package/src/components/off-canvas.tsx +0 -83
- package/src/components/text-list-editor.tsx/text-list-editor.tsx +0 -13
- package/src/components/top-bar.tsx +0 -119
- package/src/components/typeahead/mentions-plugin.tsx +0 -265
- package/src/components/typeahead/typeahead-editor.tsx +0 -140
- package/src/components/typeahead/typeahead.tsx +0 -77
- package/src/screens/profile.tsx +0 -75
|
@@ -1,40 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
3
|
exports.Typeahead = Typeahead;
|
|
37
|
-
const
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const react_1 = require("react");
|
|
38
6
|
// CSS for hover effects that work with both light and dark themes
|
|
39
7
|
const typeaheadStyles = `
|
|
40
8
|
.typeahead-item:not(.bg-primary):hover {
|
|
@@ -88,8 +56,8 @@ const typeaheadStyles = `
|
|
|
88
56
|
}
|
|
89
57
|
`;
|
|
90
58
|
function Typeahead(props) {
|
|
91
|
-
const { placeholder = "Search...", searchFn, onSelectionChange, renderItem, renderBadge, selectedItems = [], multiSelect = false, maxSelections, className = "form-control", disabled = false, minSearchLength = 1, debounceMs = 300, maxResults = 10 } = props;
|
|
92
|
-
const [query, setQuery] = (0, react_1.useState)(
|
|
59
|
+
const { placeholder = "Search...", searchFn, onSelectionChange, renderItem, renderBadge, selectedItems = [], multiSelect = false, maxSelections, className = "form-control", disabled = false, minSearchLength = 1, debounceMs = 300, maxResults = 10, } = props;
|
|
60
|
+
const [query, setQuery] = (0, react_1.useState)("");
|
|
93
61
|
const [results, setResults] = (0, react_1.useState)([]);
|
|
94
62
|
const [selectedIndex, setSelectedIndex] = (0, react_1.useState)(-1);
|
|
95
63
|
const [isOpen, setIsOpen] = (0, react_1.useState)(false);
|
|
@@ -100,9 +68,9 @@ function Typeahead(props) {
|
|
|
100
68
|
const debounceRef = (0, react_1.useRef)();
|
|
101
69
|
// Inject styles once
|
|
102
70
|
(0, react_1.useEffect)(() => {
|
|
103
|
-
const styleId =
|
|
71
|
+
const styleId = "typeahead-styles";
|
|
104
72
|
if (!document.getElementById(styleId)) {
|
|
105
|
-
const style = document.createElement(
|
|
73
|
+
const style = document.createElement("style");
|
|
106
74
|
style.id = styleId;
|
|
107
75
|
style.textContent = typeaheadStyles;
|
|
108
76
|
document.head.appendChild(style);
|
|
@@ -119,14 +87,14 @@ function Typeahead(props) {
|
|
|
119
87
|
try {
|
|
120
88
|
const searchResults = await searchFn(query);
|
|
121
89
|
// Filter out already selected items
|
|
122
|
-
const selectedIds = selectedItems.map(item => item.id);
|
|
123
|
-
const filteredResults = searchResults.filter(item => !selectedIds.includes(item.id));
|
|
90
|
+
const selectedIds = selectedItems.map((item) => item.id);
|
|
91
|
+
const filteredResults = searchResults.filter((item) => !selectedIds.includes(item.id));
|
|
124
92
|
setResults(filteredResults.slice(0, maxResults));
|
|
125
93
|
setIsOpen(filteredResults.length > 0);
|
|
126
94
|
setSelectedIndex(-1);
|
|
127
95
|
}
|
|
128
96
|
catch (error) {
|
|
129
|
-
console.error(
|
|
97
|
+
console.error("Search error:", error);
|
|
130
98
|
setResults([]);
|
|
131
99
|
}
|
|
132
100
|
finally {
|
|
@@ -153,19 +121,19 @@ function Typeahead(props) {
|
|
|
153
121
|
setSelectedIndex(-1);
|
|
154
122
|
}
|
|
155
123
|
}
|
|
156
|
-
document.addEventListener(
|
|
157
|
-
return () => document.removeEventListener(
|
|
124
|
+
document.addEventListener("mousedown", handleClickOutside);
|
|
125
|
+
return () => document.removeEventListener("mousedown", handleClickOutside);
|
|
158
126
|
}, []);
|
|
159
127
|
const handleKeyDown = (e) => {
|
|
160
128
|
// Handle backspace to remove last selected item when input is empty
|
|
161
|
-
if (e.key ===
|
|
129
|
+
if (e.key === "Backspace" && query === "" && selectedItems.length > 0) {
|
|
162
130
|
e.preventDefault();
|
|
163
131
|
const lastItem = selectedItems[selectedItems.length - 1];
|
|
164
132
|
handleRemove(lastItem);
|
|
165
133
|
return;
|
|
166
134
|
}
|
|
167
135
|
// Handle tab to auto-select highlighted result (or first result if none highlighted)
|
|
168
|
-
if (e.key ===
|
|
136
|
+
if (e.key === "Tab" && isOpen && results.length > 0) {
|
|
169
137
|
e.preventDefault();
|
|
170
138
|
const indexToSelect = selectedIndex >= 0 ? selectedIndex : 0;
|
|
171
139
|
handleSelect(results[indexToSelect]);
|
|
@@ -174,21 +142,21 @@ function Typeahead(props) {
|
|
|
174
142
|
if (!isOpen || results.length === 0)
|
|
175
143
|
return;
|
|
176
144
|
switch (e.key) {
|
|
177
|
-
case
|
|
145
|
+
case "ArrowDown":
|
|
178
146
|
e.preventDefault();
|
|
179
|
-
setSelectedIndex(prev => prev < results.length - 1 ? prev + 1 : 0);
|
|
147
|
+
setSelectedIndex((prev) => (prev < results.length - 1 ? prev + 1 : 0));
|
|
180
148
|
break;
|
|
181
|
-
case
|
|
149
|
+
case "ArrowUp":
|
|
182
150
|
e.preventDefault();
|
|
183
|
-
setSelectedIndex(prev => prev > 0 ? prev - 1 : results.length - 1);
|
|
151
|
+
setSelectedIndex((prev) => (prev > 0 ? prev - 1 : results.length - 1));
|
|
184
152
|
break;
|
|
185
|
-
case
|
|
153
|
+
case "Enter":
|
|
186
154
|
e.preventDefault();
|
|
187
155
|
if (selectedIndex >= 0 && selectedIndex < results.length) {
|
|
188
156
|
handleSelect(results[selectedIndex]);
|
|
189
157
|
}
|
|
190
158
|
break;
|
|
191
|
-
case
|
|
159
|
+
case "Escape":
|
|
192
160
|
e.preventDefault();
|
|
193
161
|
setIsOpen(false);
|
|
194
162
|
setSelectedIndex(-1);
|
|
@@ -210,21 +178,24 @@ function Typeahead(props) {
|
|
|
210
178
|
newSelectedItems = [item];
|
|
211
179
|
}
|
|
212
180
|
onSelectionChange(newSelectedItems);
|
|
213
|
-
setQuery(
|
|
181
|
+
setQuery("");
|
|
214
182
|
setResults([]);
|
|
215
183
|
setIsOpen(false);
|
|
216
184
|
setSelectedIndex(-1);
|
|
217
185
|
inputRef.current?.focus();
|
|
218
186
|
};
|
|
219
187
|
const handleRemove = (itemToRemove) => {
|
|
220
|
-
const newSelectedItems = selectedItems.filter(item => item.id !== itemToRemove.id);
|
|
188
|
+
const newSelectedItems = selectedItems.filter((item) => item.id !== itemToRemove.id);
|
|
221
189
|
onSelectionChange(newSelectedItems);
|
|
222
190
|
inputRef.current?.focus();
|
|
223
191
|
};
|
|
224
192
|
const defaultRenderBadge = (item) => {
|
|
225
|
-
|
|
226
|
-
const
|
|
227
|
-
|
|
193
|
+
const r = item;
|
|
194
|
+
const str = (k) => {
|
|
195
|
+
const v = r[k];
|
|
196
|
+
return typeof v === "string" ? v : undefined;
|
|
197
|
+
};
|
|
198
|
+
return str("name") || str("title") || str("label") || item.id;
|
|
228
199
|
};
|
|
229
200
|
const handleInputChange = (e) => {
|
|
230
201
|
setQuery(e.target.value);
|
|
@@ -234,37 +205,25 @@ function Typeahead(props) {
|
|
|
234
205
|
setIsOpen(true);
|
|
235
206
|
}
|
|
236
207
|
};
|
|
237
|
-
return (
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
react_1.default.createElement("div", { className: "spinner-border spinner-border-sm text-secondary", role: "status" },
|
|
259
|
-
react_1.default.createElement("span", { className: "visually-hidden" }, "Loading..."))))),
|
|
260
|
-
isOpen && results.length > 0 && (react_1.default.createElement("div", { ref: resultsRef, className: "position-absolute w-100 bg-body border border-top-0 rounded-bottom shadow-lg", style: {
|
|
261
|
-
zIndex: 1000,
|
|
262
|
-
maxHeight: '300px',
|
|
263
|
-
overflowY: 'auto'
|
|
264
|
-
} }, results.map((item, index) => (react_1.default.createElement("div", { key: item.id, className: `px-3 py-2 border-bottom typeahead-item ${index === selectedIndex
|
|
265
|
-
? 'bg-primary text-white'
|
|
266
|
-
: 'bg-body text-body'}`, style: {
|
|
267
|
-
cursor: 'pointer'
|
|
268
|
-
}, onClick: () => handleSelect(item), onMouseEnter: () => setSelectedIndex(index) }, renderItem(item, index === selectedIndex)))))),
|
|
269
|
-
isOpen && query.length >= minSearchLength && results.length === 0 && !isLoading && (react_1.default.createElement("div", { className: "position-absolute w-100 bg-body border border-top-0 rounded-bottom shadow-lg px-3 py-2 text-muted", style: { zIndex: 1000 } }, "No results found"))));
|
|
208
|
+
return ((0, jsx_runtime_1.jsxs)("div", { ref: containerRef, className: "position-relative", children: [(0, jsx_runtime_1.jsxs)("div", { className: "typeahead-input-container", onClick: () => inputRef.current?.focus(), children: [selectedItems.map((item) => ((0, jsx_runtime_1.jsxs)("div", { className: "badge bg-primary typeahead-badge d-flex align-items-center position-relative pe-4", children: [(0, jsx_runtime_1.jsx)("span", { children: renderBadge ? renderBadge(item) : defaultRenderBadge(item) }), (0, jsx_runtime_1.jsx)("button", { type: "button", className: "btn-close btn-close-white position-absolute", style: {
|
|
209
|
+
right: "2px",
|
|
210
|
+
top: "50%",
|
|
211
|
+
transform: "translateY(-50%)",
|
|
212
|
+
fontSize: "0.5rem",
|
|
213
|
+
width: "10px",
|
|
214
|
+
height: "10px",
|
|
215
|
+
}, onClick: (e) => {
|
|
216
|
+
e.stopPropagation();
|
|
217
|
+
handleRemove(item);
|
|
218
|
+
}, disabled: disabled, "aria-label": "Remove" })] }, item.id))), (0, jsx_runtime_1.jsx)("input", { ref: inputRef, type: "text", className: `typeahead-input ${className}`, placeholder: selectedItems.length > 0 && !multiSelect ? "Selection made" : placeholder, value: query, onChange: handleInputChange, onKeyDown: handleKeyDown, onFocus: handleInputFocus, disabled: disabled || (!multiSelect && selectedItems.length > 0) }), isLoading && ((0, jsx_runtime_1.jsx)("div", { className: "position-absolute", style: {
|
|
219
|
+
right: "8px",
|
|
220
|
+
top: "50%",
|
|
221
|
+
transform: "translateY(-50%)",
|
|
222
|
+
}, children: (0, jsx_runtime_1.jsx)("div", { className: "spinner-border spinner-border-sm text-secondary", role: "status", children: (0, jsx_runtime_1.jsx)("span", { className: "visually-hidden", children: "Loading..." }) }) }))] }), isOpen && results.length > 0 && ((0, jsx_runtime_1.jsx)("div", { ref: resultsRef, className: "position-absolute w-100 bg-body border border-top-0 rounded-bottom shadow-lg", style: {
|
|
223
|
+
zIndex: 1000,
|
|
224
|
+
maxHeight: "300px",
|
|
225
|
+
overflowY: "auto",
|
|
226
|
+
}, children: results.map((item, index) => ((0, jsx_runtime_1.jsx)("div", { className: `px-3 py-2 border-bottom typeahead-item ${index === selectedIndex ? "bg-primary text-white" : "bg-body text-body"}`, style: {
|
|
227
|
+
cursor: "pointer",
|
|
228
|
+
}, onClick: () => handleSelect(item), onMouseEnter: () => setSelectedIndex(index), children: renderItem(item, index === selectedIndex) }, item.id))) })), isOpen && query.length >= minSearchLength && results.length === 0 && !isLoading && ((0, jsx_runtime_1.jsx)("div", { className: "position-absolute w-100 bg-body border border-top-0 rounded-bottom shadow-lg px-3 py-2 text-muted", style: { zIndex: 1000 }, children: "No results found" }))] }));
|
|
270
229
|
}
|
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
* Floating UI element showing voice input state.
|
|
5
5
|
* Supports manual recording trigger via click.
|
|
6
6
|
*/
|
|
7
|
-
import React from
|
|
7
|
+
import React from "react";
|
|
8
8
|
interface VoiceIndicatorProps {
|
|
9
9
|
/** Position of the indicator */
|
|
10
|
-
position?:
|
|
10
|
+
position?: "bottom-right" | "bottom-left" | "top-right" | "top-left";
|
|
11
11
|
/** Show expanded view with transcription */
|
|
12
12
|
showTranscription?: boolean;
|
|
13
13
|
}
|
|
@@ -1,10 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Voice Indicator Component
|
|
4
|
-
*
|
|
5
|
-
* Floating UI element showing voice input state.
|
|
6
|
-
* Supports manual recording trigger via click.
|
|
7
|
-
*/
|
|
8
2
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
3
|
if (k2 === undefined) k2 = k;
|
|
10
4
|
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
@@ -40,11 +34,18 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
40
34
|
})();
|
|
41
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
36
|
exports.VoiceIndicator = void 0;
|
|
43
|
-
const
|
|
37
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
38
|
+
/**
|
|
39
|
+
* Voice Indicator Component
|
|
40
|
+
*
|
|
41
|
+
* Floating UI element showing voice input state.
|
|
42
|
+
* Supports manual recording trigger via click.
|
|
43
|
+
*/
|
|
44
44
|
const peers_sdk_1 = require("@peers-app/peers-sdk");
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
const [
|
|
45
|
+
const react_1 = __importStar(require("react"));
|
|
46
|
+
const VoiceIndicator = ({ position = "bottom-right", showTranscription = true, }) => {
|
|
47
|
+
const [state, setState] = (0, react_1.useState)("disabled");
|
|
48
|
+
const [transcription, setTranscription] = (0, react_1.useState)("");
|
|
48
49
|
const [volumeLevel, setVolumeLevel] = (0, react_1.useState)(0);
|
|
49
50
|
const [error, setError] = (0, react_1.useState)(null);
|
|
50
51
|
const [isExpanded, setIsExpanded] = (0, react_1.useState)(false);
|
|
@@ -53,45 +54,50 @@ const VoiceIndicator = ({ position = 'bottom-right', showTranscription = true, }
|
|
|
53
54
|
// Subscribe to voice events
|
|
54
55
|
(0, react_1.useEffect)(() => {
|
|
55
56
|
const subscriptions = [
|
|
56
|
-
(0, peers_sdk_1.subscribe)(
|
|
57
|
+
(0, peers_sdk_1.subscribe)("voice:stateChanged", (event) => {
|
|
57
58
|
setState(event.data.state);
|
|
58
|
-
if (event.data.state ===
|
|
59
|
-
setTranscription(
|
|
59
|
+
if (event.data.state === "idle") {
|
|
60
|
+
setTranscription("");
|
|
60
61
|
setError(null);
|
|
61
62
|
}
|
|
62
|
-
if (event.data.state ===
|
|
63
|
+
if (event.data.state === "recording") {
|
|
63
64
|
setIsExpanded(true);
|
|
64
65
|
}
|
|
65
66
|
}),
|
|
66
|
-
(0, peers_sdk_1.subscribe)(
|
|
67
|
+
(0, peers_sdk_1.subscribe)("voice:transcription", (event) => {
|
|
67
68
|
setTranscription(event.data.text);
|
|
68
69
|
}),
|
|
69
|
-
(0, peers_sdk_1.subscribe)(
|
|
70
|
+
(0, peers_sdk_1.subscribe)("voice:volumeLevel", (event) => {
|
|
70
71
|
setVolumeLevel(event.data.level);
|
|
71
72
|
}),
|
|
72
|
-
(0, peers_sdk_1.subscribe)(
|
|
73
|
+
(0, peers_sdk_1.subscribe)("voice:error", (event) => {
|
|
73
74
|
setError(event.data.message);
|
|
74
75
|
}),
|
|
75
76
|
];
|
|
76
77
|
// Load initial state
|
|
77
|
-
peers_sdk_1.rpcServerCalls
|
|
78
|
+
peers_sdk_1.rpcServerCalls
|
|
79
|
+
.voiceGetState()
|
|
80
|
+
.then(({ state }) => {
|
|
78
81
|
setState(state);
|
|
79
|
-
})
|
|
82
|
+
})
|
|
83
|
+
.catch(() => {
|
|
80
84
|
// Voice service may not be initialized yet
|
|
81
85
|
});
|
|
82
86
|
return () => {
|
|
83
|
-
|
|
87
|
+
for (const sub of subscriptions) {
|
|
88
|
+
sub.unsubscribe();
|
|
89
|
+
}
|
|
84
90
|
};
|
|
85
91
|
}, []);
|
|
86
92
|
// Handle browser TTS events
|
|
87
93
|
(0, react_1.useEffect)(() => {
|
|
88
|
-
const speakHandler = (0, peers_sdk_1.subscribe)(
|
|
94
|
+
const speakHandler = (0, peers_sdk_1.subscribe)("voice:speakText", (event) => {
|
|
89
95
|
const { text, voice, rate } = event.data;
|
|
90
|
-
if (
|
|
96
|
+
if ("speechSynthesis" in window) {
|
|
91
97
|
const utterance = new SpeechSynthesisUtterance(text);
|
|
92
98
|
if (voice) {
|
|
93
99
|
const voices = speechSynthesis.getVoices();
|
|
94
|
-
const selectedVoice = voices.find(v => v.name === voice);
|
|
100
|
+
const selectedVoice = voices.find((v) => v.name === voice);
|
|
95
101
|
if (selectedVoice)
|
|
96
102
|
utterance.voice = selectedVoice;
|
|
97
103
|
}
|
|
@@ -112,9 +118,9 @@ const VoiceIndicator = ({ position = 'bottom-right', showTranscription = true, }
|
|
|
112
118
|
peers_sdk_1.rpcServerCalls.voiceNotifyPlaybackComplete?.().catch(() => { });
|
|
113
119
|
}
|
|
114
120
|
});
|
|
115
|
-
const stopHandler = (0, peers_sdk_1.subscribe)(
|
|
121
|
+
const stopHandler = (0, peers_sdk_1.subscribe)("voice:stopSpeaking", () => {
|
|
116
122
|
// Stop browser TTS
|
|
117
|
-
if (
|
|
123
|
+
if ("speechSynthesis" in window) {
|
|
118
124
|
speechSynthesis.cancel();
|
|
119
125
|
}
|
|
120
126
|
// Stop cloud TTS audio if playing
|
|
@@ -123,10 +129,10 @@ const VoiceIndicator = ({ position = 'bottom-right', showTranscription = true, }
|
|
|
123
129
|
currentAudioRef.current = null;
|
|
124
130
|
}
|
|
125
131
|
});
|
|
126
|
-
const playHandler = (0, peers_sdk_1.subscribe)(
|
|
132
|
+
const playHandler = (0, peers_sdk_1.subscribe)("voice:playAudio", async (event) => {
|
|
127
133
|
const { audioBase64, mimeType } = event.data;
|
|
128
134
|
try {
|
|
129
|
-
const audioData = Uint8Array.from(atob(audioBase64), c => c.charCodeAt(0));
|
|
135
|
+
const audioData = Uint8Array.from(atob(audioBase64), (c) => c.charCodeAt(0));
|
|
130
136
|
const blob = new Blob([audioData], { type: mimeType });
|
|
131
137
|
const url = URL.createObjectURL(blob);
|
|
132
138
|
const audio = new Audio(url);
|
|
@@ -141,7 +147,7 @@ const VoiceIndicator = ({ position = 'bottom-right', showTranscription = true, }
|
|
|
141
147
|
await audio.play();
|
|
142
148
|
}
|
|
143
149
|
catch (e) {
|
|
144
|
-
console.error(
|
|
150
|
+
console.error("Failed to play audio:", e);
|
|
145
151
|
currentAudioRef.current = null;
|
|
146
152
|
// Still notify on error so we don't hang
|
|
147
153
|
peers_sdk_1.rpcServerCalls.voiceNotifyPlaybackComplete?.().catch(() => { });
|
|
@@ -155,124 +161,105 @@ const VoiceIndicator = ({ position = 'bottom-right', showTranscription = true, }
|
|
|
155
161
|
}, []);
|
|
156
162
|
const handleClick = (0, react_1.useCallback)(async () => {
|
|
157
163
|
try {
|
|
158
|
-
if (state ===
|
|
164
|
+
if (state === "disabled") {
|
|
159
165
|
// Open settings
|
|
160
|
-
window.location.hash =
|
|
166
|
+
window.location.hash = "#/settings/voice";
|
|
161
167
|
return;
|
|
162
168
|
}
|
|
163
|
-
if (state ===
|
|
169
|
+
if (state === "recording") {
|
|
164
170
|
await peers_sdk_1.rpcServerCalls.voiceStopRecording();
|
|
165
171
|
}
|
|
166
|
-
else if (state ===
|
|
172
|
+
else if (state === "speaking") {
|
|
167
173
|
await peers_sdk_1.rpcServerCalls.voiceStopPlayback();
|
|
168
174
|
}
|
|
169
|
-
else if (state ===
|
|
175
|
+
else if (state === "idle" || state === "listening") {
|
|
170
176
|
await peers_sdk_1.rpcServerCalls.voiceStartRecording();
|
|
171
177
|
}
|
|
172
178
|
}
|
|
173
179
|
catch (e) {
|
|
174
|
-
console.error(
|
|
180
|
+
console.error("Voice action failed:", e);
|
|
175
181
|
}
|
|
176
182
|
}, [state]);
|
|
177
183
|
const getIcon = () => {
|
|
178
184
|
switch (state) {
|
|
179
|
-
case
|
|
180
|
-
return
|
|
181
|
-
case
|
|
182
|
-
return
|
|
183
|
-
case
|
|
184
|
-
return
|
|
185
|
-
case
|
|
186
|
-
return
|
|
187
|
-
case
|
|
188
|
-
return
|
|
189
|
-
case
|
|
190
|
-
return
|
|
185
|
+
case "disabled":
|
|
186
|
+
return "bi-mic-mute";
|
|
187
|
+
case "idle":
|
|
188
|
+
return "bi-mic";
|
|
189
|
+
case "listening":
|
|
190
|
+
return "bi-ear";
|
|
191
|
+
case "recording":
|
|
192
|
+
return "bi-mic-fill";
|
|
193
|
+
case "processing":
|
|
194
|
+
return "bi-hourglass-split";
|
|
195
|
+
case "speaking":
|
|
196
|
+
return "bi-volume-up-fill";
|
|
191
197
|
default:
|
|
192
|
-
return
|
|
198
|
+
return "bi-mic";
|
|
193
199
|
}
|
|
194
200
|
};
|
|
195
201
|
const getStateText = () => {
|
|
196
202
|
switch (state) {
|
|
197
|
-
case
|
|
198
|
-
return
|
|
199
|
-
case
|
|
203
|
+
case "disabled":
|
|
204
|
+
return "Voice disabled";
|
|
205
|
+
case "idle":
|
|
200
206
|
return 'Say "Porcupine" or click';
|
|
201
|
-
case
|
|
202
|
-
return
|
|
203
|
-
case
|
|
204
|
-
return
|
|
205
|
-
case
|
|
206
|
-
return
|
|
207
|
-
case
|
|
208
|
-
return
|
|
207
|
+
case "listening":
|
|
208
|
+
return "Listening...";
|
|
209
|
+
case "recording":
|
|
210
|
+
return "Recording...";
|
|
211
|
+
case "processing":
|
|
212
|
+
return "Processing...";
|
|
213
|
+
case "speaking":
|
|
214
|
+
return "Speaking... (click to stop)";
|
|
209
215
|
default:
|
|
210
|
-
return
|
|
216
|
+
return "";
|
|
211
217
|
}
|
|
212
218
|
};
|
|
213
219
|
const getButtonClass = () => {
|
|
214
|
-
const base =
|
|
220
|
+
const base = "btn rounded-circle shadow";
|
|
215
221
|
switch (state) {
|
|
216
|
-
case
|
|
222
|
+
case "disabled":
|
|
217
223
|
return `${base} btn-secondary`;
|
|
218
|
-
case
|
|
224
|
+
case "idle":
|
|
219
225
|
return `${base} btn-outline-primary`;
|
|
220
|
-
case
|
|
226
|
+
case "listening":
|
|
221
227
|
return `${base} btn-info`;
|
|
222
|
-
case
|
|
228
|
+
case "recording":
|
|
223
229
|
return `${base} btn-danger`;
|
|
224
|
-
case
|
|
230
|
+
case "processing":
|
|
225
231
|
return `${base} btn-warning`;
|
|
226
|
-
case
|
|
232
|
+
case "speaking":
|
|
227
233
|
return `${base} btn-success`;
|
|
228
234
|
default:
|
|
229
235
|
return `${base} btn-secondary`;
|
|
230
236
|
}
|
|
231
237
|
};
|
|
232
238
|
const positionStyles = {
|
|
233
|
-
position:
|
|
239
|
+
position: "fixed",
|
|
234
240
|
zIndex: 1050,
|
|
235
|
-
...(position.includes(
|
|
236
|
-
...(position.includes(
|
|
241
|
+
...(position.includes("bottom") ? { bottom: "20px" } : { top: "70px" }),
|
|
242
|
+
...(position.includes("right") ? { right: "20px" } : { left: "20px" }),
|
|
237
243
|
};
|
|
238
244
|
// Don't render if disabled and not showing
|
|
239
245
|
// Actually, let's always show so users can click to enable
|
|
240
|
-
return (
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
error))))),
|
|
258
|
-
react_1.default.createElement("button", { className: getButtonClass(), style: {
|
|
259
|
-
width: '56px',
|
|
260
|
-
height: '56px',
|
|
261
|
-
fontSize: '24px',
|
|
262
|
-
transition: 'all 0.2s ease',
|
|
263
|
-
}, onClick: handleClick, title: getStateText() },
|
|
264
|
-
react_1.default.createElement("i", { className: `bi ${getIcon()}` }),
|
|
265
|
-
(state === 'listening' || state === 'recording') && (react_1.default.createElement("span", { className: "position-absolute", style: {
|
|
266
|
-
top: 0,
|
|
267
|
-
left: 0,
|
|
268
|
-
right: 0,
|
|
269
|
-
bottom: 0,
|
|
270
|
-
borderRadius: '50%',
|
|
271
|
-
border: '2px solid currentColor',
|
|
272
|
-
animation: 'pulse 1.5s ease-out infinite',
|
|
273
|
-
} })),
|
|
274
|
-
state === 'processing' && (react_1.default.createElement("span", { className: "spinner-border spinner-border-sm position-absolute", style: { top: '4px', right: '4px' } }))),
|
|
275
|
-
react_1.default.createElement("style", null, `
|
|
246
|
+
return ((0, jsx_runtime_1.jsxs)("div", { style: positionStyles, children: [isExpanded && state !== "disabled" && ((0, jsx_runtime_1.jsx)("div", { className: "card shadow mb-2", style: {
|
|
247
|
+
width: "280px",
|
|
248
|
+
backgroundColor: "var(--bs-body-bg)",
|
|
249
|
+
}, children: (0, jsx_runtime_1.jsxs)("div", { className: "card-body py-2 px-3", children: [(0, jsx_runtime_1.jsxs)("div", { className: "d-flex justify-content-between align-items-center mb-2", children: [(0, jsx_runtime_1.jsx)("small", { className: "text-muted", children: getStateText() }), (0, jsx_runtime_1.jsx)("button", { className: "btn btn-sm btn-link p-0", onClick: () => setIsExpanded(false), children: (0, jsx_runtime_1.jsx)("i", { className: "bi bi-x" }) })] }), state === "recording" && ((0, jsx_runtime_1.jsx)("div", { className: "progress mb-2", style: { height: "4px" }, children: (0, jsx_runtime_1.jsx)("div", { className: "progress-bar bg-danger", style: { width: `${Math.min(100, volumeLevel * 500)}%` } }) })), showTranscription && transcription && ((0, jsx_runtime_1.jsxs)("div", { className: "small", children: [(0, jsx_runtime_1.jsx)("i", { className: "bi bi-quote me-1" }), transcription] })), error && ((0, jsx_runtime_1.jsxs)("div", { className: "small text-danger", children: [(0, jsx_runtime_1.jsx)("i", { className: "bi bi-exclamation-triangle me-1" }), error] }))] }) })), (0, jsx_runtime_1.jsxs)("button", { className: getButtonClass(), style: {
|
|
250
|
+
width: "56px",
|
|
251
|
+
height: "56px",
|
|
252
|
+
fontSize: "24px",
|
|
253
|
+
transition: "all 0.2s ease",
|
|
254
|
+
}, onClick: handleClick, title: getStateText(), children: [(0, jsx_runtime_1.jsx)("i", { className: `bi ${getIcon()}` }), (state === "listening" || state === "recording") && ((0, jsx_runtime_1.jsx)("span", { className: "position-absolute", style: {
|
|
255
|
+
top: 0,
|
|
256
|
+
left: 0,
|
|
257
|
+
right: 0,
|
|
258
|
+
bottom: 0,
|
|
259
|
+
borderRadius: "50%",
|
|
260
|
+
border: "2px solid currentColor",
|
|
261
|
+
animation: "pulse 1.5s ease-out infinite",
|
|
262
|
+
} })), state === "processing" && ((0, jsx_runtime_1.jsx)("span", { className: "spinner-border spinner-border-sm position-absolute", style: { top: "4px", right: "4px" } }))] }), (0, jsx_runtime_1.jsx)("style", { children: `
|
|
276
263
|
@keyframes pulse {
|
|
277
264
|
0% {
|
|
278
265
|
transform: scale(1);
|
|
@@ -283,7 +270,7 @@ const VoiceIndicator = ({ position = 'bottom-right', showTranscription = true, }
|
|
|
283
270
|
opacity: 0;
|
|
284
271
|
}
|
|
285
272
|
}
|
|
286
|
-
`)));
|
|
273
|
+
` })] }));
|
|
287
274
|
};
|
|
288
275
|
exports.VoiceIndicator = VoiceIndicator;
|
|
289
276
|
exports.default = exports.VoiceIndicator;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { IMessage } from "@peers-app/peers-sdk";
|
|
2
|
+
/** Shape passed to `subscribe` handlers for voice / chat IPC events */
|
|
3
|
+
export type VoiceSubscribeEvent<T> = {
|
|
4
|
+
data: T;
|
|
5
|
+
};
|
|
6
|
+
export type ChatOpenWithMessagePayload = {
|
|
7
|
+
message?: IMessage;
|
|
8
|
+
};
|
|
9
|
+
export type VoiceStatePayload = {
|
|
10
|
+
state: string;
|
|
11
|
+
};
|
|
12
|
+
export type VoiceTranscriptionPayload = {
|
|
13
|
+
text: string;
|
|
14
|
+
};
|
|
15
|
+
export type VoiceVolumePayload = {
|
|
16
|
+
level: number;
|
|
17
|
+
};
|
|
18
|
+
export type VoiceErrorPayload = {
|
|
19
|
+
message: string;
|
|
20
|
+
};
|
|
21
|
+
export type VoiceThreadPayload = {
|
|
22
|
+
threadId: string;
|
|
23
|
+
};
|
|
24
|
+
export type VoiceSpeakPayload = {
|
|
25
|
+
text: string;
|
|
26
|
+
voice?: string;
|
|
27
|
+
rate?: number;
|
|
28
|
+
};
|
|
29
|
+
export type VoicePlayAudioPayload = {
|
|
30
|
+
audioBase64: string;
|
|
31
|
+
mimeType: string;
|
|
32
|
+
};
|
package/dist/globals.d.ts
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
import { IMessage, IUser
|
|
1
|
+
import { type IMessage, type IUser } from "@peers-app/peers-sdk";
|
|
2
2
|
export declare const packageReloaded: import("@peers-app/peers-sdk").Observable<number>;
|
|
3
|
-
export declare const _mainContentPath: PersistentVar<string>;
|
|
3
|
+
export declare const _mainContentPath: import("@peers-app/peers-sdk").PersistentVar<string>;
|
|
4
4
|
export declare const mainContentPath: import("@peers-app/peers-sdk").Observable<string>;
|
|
5
5
|
export declare function queryParam(name: string, value?: string): string;
|
|
6
|
-
export declare const openThreads: PersistentVar<(string | IMessage)[]>;
|
|
7
|
-
export declare const threadViewOpen: PersistentVar<boolean>;
|
|
8
6
|
export declare function openThread(thread: string | IMessage): Promise<void>;
|
|
9
7
|
export declare function openThreadInTab(thread: string | IMessage): Promise<void>;
|
|
10
8
|
export declare let me: IUser;
|
|
@@ -16,9 +14,9 @@ export declare const groups: import("@peers-app/peers-sdk").Observable<{
|
|
|
16
14
|
description: string;
|
|
17
15
|
publicKey: string;
|
|
18
16
|
signature: string;
|
|
19
|
-
publicBoxKey: string;
|
|
20
17
|
groupId: string;
|
|
21
18
|
founderUserId: string;
|
|
19
|
+
publicBoxKey: string;
|
|
22
20
|
disabled?: boolean | undefined;
|
|
23
21
|
iconClassName?: string | undefined;
|
|
24
22
|
publicRole?: import("@peers-app/peers-sdk").GroupMemberRole | undefined;
|