flikkui 0.2.0-beta.2 → 0.2.0-beta.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +92 -0
- package/dist/components/ai/PromptInput/PromptInput.js +23 -15
- package/dist/components/ai/PromptSuggestions/PromptSuggestion.d.ts +27 -0
- package/dist/components/ai/PromptSuggestions/PromptSuggestion.js +62 -0
- package/dist/components/ai/PromptSuggestions/PromptSuggestion.theme.d.ts +10 -0
- package/dist/components/ai/PromptSuggestions/PromptSuggestion.theme.js +12 -0
- package/dist/components/ai/PromptSuggestions/PromptSuggestion.types.d.ts +53 -0
- package/dist/components/ai/PromptSuggestions/index.d.ts +4 -2
- package/dist/components/ai/index.d.ts +2 -12
- package/dist/components/charts/ActivityRings/ActivityRings.js +70 -58
- package/dist/components/charts/ActivityRings/ActivityRings.theme.js +0 -1
- package/dist/components/charts/ActivityRings/ActivityRings.types.d.ts +17 -0
- package/dist/components/charts/BarChart/BarChart.js +8 -4
- package/dist/components/charts/BarChart/BarChart.types.d.ts +14 -0
- package/dist/components/charts/DonutChart/DonutChart.js +11 -8
- package/dist/components/charts/DonutChart/DonutChart.theme.d.ts +3 -0
- package/dist/components/charts/DonutChart/DonutChart.theme.js +5 -4
- package/dist/components/charts/DonutChart/donut-utils.d.ts +5 -0
- package/dist/components/charts/DonutChart/donut-utils.js +26 -1
- package/dist/components/charts/Heatmap/Heatmap.theme.js +2 -2
- package/dist/components/charts/shared/ChartAxis/XAxis.d.ts +2 -2
- package/dist/components/charts/shared/ChartAxis/XAxis.js +4 -4
- package/dist/components/charts/shared/ChartAxis/YAxis.d.ts +2 -2
- package/dist/components/charts/shared/ChartAxis/YAxis.js +8 -7
- package/dist/components/charts/shared/ChartGrid/HorizontalGrid.d.ts +1 -1
- package/dist/components/charts/shared/ChartGrid/HorizontalGrid.js +2 -2
- package/dist/components/charts/theme/chart.theme.d.ts +1 -1
- package/dist/components/charts/theme/chart.theme.js +39 -39
- package/dist/components/core/Accordion/Accordion.d.ts +1 -1
- package/dist/components/core/Accordion/Accordion.js +2 -2
- package/dist/components/core/Accordion/Accordion.types.d.ts +8 -0
- package/dist/components/core/Badge/Badge.js +11 -15
- package/dist/components/core/Badge/Badge.theme.js +7 -21
- package/dist/components/core/Badge/Badge.types.d.ts +9 -1
- package/dist/components/core/Button/Button.js +2 -2
- package/dist/components/core/Button/Button.theme.js +1 -1
- package/dist/components/core/Button/Button.types.d.ts +8 -0
- package/dist/components/core/Card/Card.js +8 -2
- package/dist/components/core/Card/Card.theme.js +1 -1
- package/dist/components/core/Card/Card.types.d.ts +24 -1
- package/dist/components/core/Drawer/Drawer.d.ts +1 -1
- package/dist/components/core/Drawer/Drawer.js +10 -40
- package/dist/components/core/Drawer/Drawer.theme.js +2 -1
- package/dist/components/core/Drawer/Drawer.types.d.ts +8 -0
- package/dist/components/core/Dropdown/Dropdown.d.ts +1 -1
- package/dist/components/core/Dropdown/Dropdown.js +2 -2
- package/dist/components/core/Dropdown/Dropdown.types.d.ts +8 -0
- package/dist/components/core/Metric/Metric.d.ts +1 -1
- package/dist/components/core/Metric/Metric.js +9 -5
- package/dist/components/core/Metric/Metric.theme.d.ts +1 -1
- package/dist/components/core/Metric/Metric.theme.js +38 -28
- package/dist/components/core/Metric/Metric.types.d.ts +27 -8
- package/dist/components/core/Modal/Modal.d.ts +1 -1
- package/dist/components/core/Modal/Modal.js +17 -40
- package/dist/components/core/Modal/Modal.theme.js +8 -3
- package/dist/components/core/Modal/Modal.types.d.ts +18 -0
- package/dist/components/core/Modal/index.d.ts +1 -1
- package/dist/components/core/Notification/Notification.js +2 -0
- package/dist/components/core/Pill/Pill.d.ts +6 -11
- package/dist/components/core/Pill/Pill.theme.d.ts +2 -2
- package/dist/components/core/Pill/Pill.types.d.ts +9 -22
- package/dist/components/core/Pill/index.d.ts +1 -1
- package/dist/components/core/Popover/Popover.d.ts +1 -1
- package/dist/components/core/Popover/Popover.js +2 -2
- package/dist/components/core/Popover/Popover.types.d.ts +8 -0
- package/dist/components/core/Progress/Progress.d.ts +28 -0
- package/dist/components/core/Progress/Progress.js +114 -0
- package/dist/components/core/Progress/Progress.theme.d.ts +5 -0
- package/dist/components/core/Progress/Progress.theme.js +33 -0
- package/dist/components/core/Progress/Progress.types.d.ts +92 -0
- package/dist/components/core/Progress/index.d.ts +2 -0
- package/dist/components/core/Table/Table.animations.d.ts +5 -16
- package/dist/components/core/Table/Table.animations.js +46 -0
- package/dist/components/core/Table/Table.d.ts +0 -27
- package/dist/components/core/Table/Table.js +58 -156
- package/dist/components/core/Table/Table.theme.js +28 -19
- package/dist/components/core/Table/Table.types.d.ts +95 -8
- package/dist/components/core/Table/Table.utils.d.ts +7 -0
- package/dist/components/core/Table/Table.utils.js +11 -1
- package/dist/components/core/Table/{components/TableActions/TableActions.d.ts → TableActions.d.ts} +3 -3
- package/dist/components/core/Table/{components/TableActions/TableActions.js → TableActions.js} +14 -24
- package/dist/components/core/Table/{components/TableActions/TableActionsMenu.d.ts → TableActionsMenu.d.ts} +1 -1
- package/dist/components/core/Table/{components/TableActions/TableActionsMenu.js → TableActionsMenu.js} +4 -4
- package/dist/components/core/Table/{components/core/TableBody.d.ts → TableBody.d.ts} +1 -1
- package/dist/components/core/Table/{components/core/TableBody.js → TableBody.js} +14 -20
- package/dist/components/core/Table/{components/core/TableCell.d.ts → TableCell.d.ts} +1 -9
- package/dist/components/core/Table/{components/core/TableCell.js → TableCell.js} +5 -13
- package/dist/components/core/Table/TableColumnManager.d.ts +3 -0
- package/dist/components/core/Table/TableColumnManager.js +34 -0
- package/dist/components/core/Table/{components/DeclarativeComponents.d.ts → TableDeclarative.d.ts} +1 -1
- package/dist/components/core/Table/{components/DeclarativeComponents.js → TableDeclarative.js} +6 -56
- package/dist/components/core/Table/TableFilter.d.ts +3 -0
- package/dist/components/core/Table/TableFilter.js +122 -0
- package/dist/components/core/Table/{components/core/TableHeader.d.ts → TableHeader.d.ts} +1 -1
- package/dist/components/core/Table/{components/core/TableHeader.js → TableHeader.js} +15 -29
- package/dist/components/core/Table/TablePagination.d.ts +7 -0
- package/dist/components/core/Table/{components/TablePagination/TablePagination.js → TablePagination.js} +5 -16
- package/dist/components/core/Table/TableRow.d.ts +8 -0
- package/dist/components/core/Table/TableRow.js +45 -0
- package/dist/components/core/Table/TableSelectionHeader.d.ts +7 -0
- package/dist/components/core/Table/{components/TableSelectionHeader/TableSelectionHeader.js → TableSelectionHeader.js} +4 -5
- package/dist/components/core/Table/hooks/index.d.ts +10 -0
- package/dist/components/core/Table/hooks/useTableColumns.d.ts +16 -0
- package/dist/components/core/Table/hooks/useTableColumns.js +67 -0
- package/dist/components/core/Table/hooks/useTableExpansion.d.ts +8 -0
- package/dist/components/core/Table/hooks/useTableExpansion.js +15 -0
- package/dist/components/core/Table/hooks/useTableFilter.d.ts +12 -0
- package/dist/components/core/Table/hooks/useTableFilter.js +37 -0
- package/dist/components/core/Table/hooks/useTablePagination.d.ts +12 -0
- package/dist/components/core/Table/hooks/useTablePagination.js +13 -0
- package/dist/components/core/Table/hooks/useTableSelection.d.ts +17 -0
- package/dist/components/core/Table/hooks/useTableSelection.js +40 -0
- package/dist/components/core/Table/index.d.ts +9 -8
- package/dist/components/core/Table/index.js +7 -5
- package/dist/components/core/Tabs/Tabs.js +2 -2
- package/dist/components/core/Tabs/Tabs.types.d.ts +8 -0
- package/dist/components/core/Tag/Tag.animations.d.ts +3 -0
- package/dist/components/core/Tag/Tag.animations.js +31 -0
- package/dist/components/core/Tag/Tag.d.ts +14 -0
- package/dist/components/core/Tag/Tag.js +45 -0
- package/dist/components/core/Tag/Tag.theme.d.ts +2 -0
- package/dist/components/core/Tag/Tag.theme.js +21 -0
- package/dist/components/core/Tag/Tag.types.d.ts +40 -0
- package/dist/components/core/Tag/index.d.ts +3 -0
- package/dist/components/core/Tooltip/Tooltip.d.ts +1 -1
- package/dist/components/core/Tooltip/Tooltip.js +3 -3
- package/dist/components/core/Tooltip/Tooltip.theme.js +1 -1
- package/dist/components/core/Tooltip/Tooltip.types.d.ts +17 -0
- package/dist/components/core/index.d.ts +2 -1
- package/dist/components/core/index.js +12 -5
- package/dist/components/effects/CustomCursor/CustomCursor.d.ts +0 -13
- package/dist/components/effects/CustomCursor/CustomCursor.js +26 -2
- package/dist/components/effects/CustomCursor/CustomCursor.theme.js +12 -1
- package/dist/components/effects/CustomCursor/CustomCursor.types.d.ts +14 -1
- package/dist/components/forms/Combobox/Combobox.d.ts +25 -0
- package/dist/components/forms/Combobox/Combobox.js +412 -0
- package/dist/components/forms/Combobox/Combobox.theme.d.ts +6 -0
- package/dist/components/forms/Combobox/Combobox.theme.js +60 -0
- package/dist/components/forms/Combobox/Combobox.types.d.ts +111 -0
- package/dist/components/forms/Combobox/index.d.ts +3 -0
- package/dist/components/forms/FileUpload/FileUpload.js +2 -0
- package/dist/components/forms/Input/Input.js +25 -28
- package/dist/components/forms/Input/inputMasks.d.ts +15 -0
- package/dist/components/forms/Input/inputMasks.js +72 -1
- package/dist/components/forms/InputTag/InputTag.d.ts +40 -0
- package/dist/components/forms/InputTag/InputTag.js +491 -0
- package/dist/components/forms/InputTag/InputTag.theme.d.ts +2 -0
- package/dist/components/forms/InputTag/InputTag.theme.js +16 -0
- package/dist/components/forms/InputTag/InputTag.types.d.ts +107 -0
- package/dist/components/forms/InputTag/index.d.ts +3 -0
- package/dist/components/forms/Select/Select.d.ts +101 -2
- package/dist/components/forms/Select/Select.js +128 -132
- package/dist/components/forms/Select/Select.theme.js +10 -14
- package/dist/components/forms/Select/Select.types.d.ts +6 -2
- package/dist/components/forms/Select/index.d.ts +7 -4
- package/dist/components/forms/Select/useSelectState.d.ts +66 -0
- package/dist/components/forms/Select/useSelectState.js +134 -0
- package/dist/components/forms/SelectExpand/SelectExpand.animations.d.ts +20 -0
- package/dist/components/forms/SelectExpand/SelectExpand.animations.js +74 -0
- package/dist/components/forms/SelectExpand/SelectExpand.d.ts +9 -0
- package/dist/components/forms/SelectExpand/SelectExpand.js +223 -0
- package/dist/components/forms/SelectExpand/SelectExpand.theme.d.ts +5 -0
- package/dist/components/forms/SelectExpand/SelectExpand.theme.js +74 -0
- package/dist/components/forms/SelectExpand/SelectExpand.types.d.ts +126 -0
- package/dist/components/forms/SelectExpand/index.d.ts +4 -0
- package/dist/components/forms/Switch/Switch.js +3 -3
- package/dist/components/forms/Switch/Switch.theme.d.ts +1 -1
- package/dist/components/forms/Switch/Switch.theme.js +2 -2
- package/dist/components/forms/TimePicker/TimePicker.animations.d.ts +0 -46
- package/dist/components/forms/TimePicker/TimePicker.d.ts +15 -6
- package/dist/components/forms/TimePicker/TimePicker.js +285 -124
- package/dist/components/forms/TimePicker/TimePicker.theme.d.ts +1 -1
- package/dist/components/forms/TimePicker/TimePicker.theme.js +39 -22
- package/dist/components/forms/TimePicker/TimePicker.types.d.ts +88 -34
- package/dist/components/forms/TimePicker/TimePickerContent.d.ts +7 -10
- package/dist/components/forms/TimePicker/TimePickerContent.js +149 -16
- package/dist/components/forms/TimePicker/TimePickerTrigger.d.ts +3 -3
- package/dist/components/forms/TimePicker/TimePickerTrigger.js +22 -19
- package/dist/components/forms/TimePicker/WheelColumn.d.ts +14 -0
- package/dist/components/forms/TimePicker/WheelColumn.js +90 -0
- package/dist/components/forms/TimePicker/index.d.ts +4 -1
- package/dist/components/forms/TimePicker/useWheelPicker.d.ts +37 -0
- package/dist/components/forms/TimePicker/useWheelPicker.js +138 -0
- package/dist/components/forms/forms.theme.d.ts +14 -0
- package/dist/components/forms/forms.theme.js +31 -0
- package/dist/components/forms/index.d.ts +9 -3
- package/dist/components/forms/index.js +73 -2
- package/dist/hooks/index.d.ts +0 -4
- package/dist/icons/Icon.d.ts +7 -0
- package/dist/icons/Icon.js +6 -2
- package/dist/index.js +21 -19
- package/dist/styles.css +1 -1
- package/dist/utils/index.d.ts +0 -1
- package/dist/utils/optimisticErrors.js +1 -70
- package/package.json +1 -1
- package/dist/components/ai/EditingIndicator/EditingIndicator.animations.d.ts +0 -31
- package/dist/components/ai/EditingIndicator/EditingIndicator.animations.js +0 -115
- package/dist/components/ai/EditingIndicator/EditingIndicator.d.ts +0 -35
- package/dist/components/ai/EditingIndicator/EditingIndicator.js +0 -94
- package/dist/components/ai/EditingIndicator/EditingIndicator.theme.d.ts +0 -2
- package/dist/components/ai/EditingIndicator/EditingIndicator.theme.js +0 -13
- package/dist/components/ai/EditingIndicator/EditingIndicator.types.d.ts +0 -54
- package/dist/components/ai/EditingIndicator/index.d.ts +0 -9
- package/dist/components/ai/GenerativeRenderer/GenerativeRenderer.d.ts +0 -3
- package/dist/components/ai/GenerativeRenderer/GenerativeRenderer.js +0 -126
- package/dist/components/ai/GenerativeRenderer/GenerativeRenderer.theme.d.ts +0 -2
- package/dist/components/ai/GenerativeRenderer/GenerativeRenderer.theme.js +0 -8
- package/dist/components/ai/GenerativeRenderer/GenerativeRenderer.types.d.ts +0 -45
- package/dist/components/ai/GenerativeRenderer/index.d.ts +0 -3
- package/dist/components/ai/PresenceIndicator/PresenceIndicator.animations.d.ts +0 -17
- package/dist/components/ai/PresenceIndicator/PresenceIndicator.animations.js +0 -56
- package/dist/components/ai/PresenceIndicator/PresenceIndicator.d.ts +0 -38
- package/dist/components/ai/PresenceIndicator/PresenceIndicator.js +0 -110
- package/dist/components/ai/PresenceIndicator/PresenceIndicator.theme.d.ts +0 -2
- package/dist/components/ai/PresenceIndicator/PresenceIndicator.theme.js +0 -13
- package/dist/components/ai/PresenceIndicator/PresenceIndicator.types.d.ts +0 -53
- package/dist/components/ai/PresenceIndicator/index.d.ts +0 -8
- package/dist/components/ai/PresenceProvider/PresenceContext.d.ts +0 -24
- package/dist/components/ai/PresenceProvider/PresenceContext.js +0 -34
- package/dist/components/ai/PresenceProvider/PresenceProvider.d.ts +0 -32
- package/dist/components/ai/PresenceProvider/PresenceProvider.js +0 -321
- package/dist/components/ai/PresenceProvider/PresenceProvider.types.d.ts +0 -140
- package/dist/components/ai/PresenceProvider/adapters/MockAdapter.d.ts +0 -102
- package/dist/components/ai/PresenceProvider/adapters/MockAdapter.js +0 -331
- package/dist/components/ai/PresenceProvider/adapters/PresenceAdapter.d.ts +0 -93
- package/dist/components/ai/PresenceProvider/adapters/SupabaseAdapter.d.ts +0 -134
- package/dist/components/ai/PresenceProvider/adapters/WebSocketAdapter.d.ts +0 -149
- package/dist/components/ai/PresenceProvider/adapters/index.d.ts +0 -11
- package/dist/components/ai/PresenceProvider/index.d.ts +0 -10
- package/dist/components/ai/PromptSuggestions/PromptSuggestions.d.ts +0 -27
- package/dist/components/ai/PromptSuggestions/PromptSuggestions.js +0 -61
- package/dist/components/ai/PromptSuggestions/PromptSuggestions.types.d.ts +0 -65
- package/dist/components/ai/VersionSlider/VersionSlider.d.ts +0 -3
- package/dist/components/ai/VersionSlider/VersionSlider.js +0 -97
- package/dist/components/ai/VersionSlider/VersionSlider.theme.d.ts +0 -2
- package/dist/components/ai/VersionSlider/VersionSlider.theme.js +0 -18
- package/dist/components/ai/VersionSlider/VersionSlider.types.d.ts +0 -77
- package/dist/components/ai/VersionSlider/index.d.ts +0 -3
- package/dist/components/core/Pill/Pill.animations.js +0 -25
- package/dist/components/core/Pill/Pill.js +0 -145
- package/dist/components/core/Pill/Pill.theme.js +0 -65
- package/dist/components/core/RetryBoundary/RetryBoundary.d.ts +0 -35
- package/dist/components/core/RetryBoundary/RetryBoundary.js +0 -154
- package/dist/components/core/RetryBoundary/RetryBoundary.theme.d.ts +0 -2
- package/dist/components/core/RetryBoundary/RetryBoundary.theme.js +0 -7
- package/dist/components/core/RetryBoundary/RetryBoundary.types.d.ts +0 -51
- package/dist/components/core/RetryBoundary/index.d.ts +0 -3
- package/dist/components/core/Table/components/TableActions/TableActions.types.d.ts +0 -40
- package/dist/components/core/Table/components/TableActions/index.d.ts +0 -3
- package/dist/components/core/Table/components/TableActionsMenu.d.ts +0 -6
- package/dist/components/core/Table/components/TablePagination/TablePagination.d.ts +0 -17
- package/dist/components/core/Table/components/TablePagination/TablePagination.types.d.ts +0 -21
- package/dist/components/core/Table/components/TablePagination/index.d.ts +0 -2
- package/dist/components/core/Table/components/TableSelectionHeader/TableSelectionHeader.d.ts +0 -15
- package/dist/components/core/Table/components/TableSelectionHeader/index.d.ts +0 -3
- package/dist/components/core/Table/components/core/TableRow.d.ts +0 -3
- package/dist/components/core/Table/components/core/TableRow.js +0 -44
- package/dist/components/core/Table/components/core/index.d.ts +0 -4
- package/dist/components/forms/OptimisticForm/OptimisticForm.d.ts +0 -33
- package/dist/components/forms/OptimisticForm/OptimisticForm.js +0 -87
- package/dist/components/forms/OptimisticForm/OptimisticForm.theme.d.ts +0 -2
- package/dist/components/forms/OptimisticForm/OptimisticForm.theme.js +0 -8
- package/dist/components/forms/OptimisticForm/OptimisticForm.types.d.ts +0 -74
- package/dist/components/forms/OptimisticForm/index.d.ts +0 -3
- package/dist/hooks/useOptimisticMutation.d.ts +0 -109
- package/dist/hooks/useOptimisticMutation.js +0 -171
- package/dist/hooks/usePresence.d.ts +0 -88
- package/dist/utils/presenceUtils.d.ts +0 -66
- package/dist/utils/presenceUtils.js +0 -107
|
@@ -1,331 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Mock Presence Adapter
|
|
3
|
-
*
|
|
4
|
-
* Simulates real-time presence behavior for development and Storybook demos.
|
|
5
|
-
* No external dependencies - pure client-side simulation.
|
|
6
|
-
*
|
|
7
|
-
* Features:
|
|
8
|
-
* - Simulates 4-5 users joining at staggered intervals
|
|
9
|
-
* - Random typing events every 5 seconds
|
|
10
|
-
* - Auto-stop typing after 2-5 seconds
|
|
11
|
-
* - Connection status simulation
|
|
12
|
-
*/
|
|
13
|
-
/**
|
|
14
|
-
* Mock user data for simulation
|
|
15
|
-
*/
|
|
16
|
-
const MOCK_USERS = [
|
|
17
|
-
{
|
|
18
|
-
id: 'mock-user-2',
|
|
19
|
-
name: 'Sarah Wilson',
|
|
20
|
-
avatar: 'https://i.pravatar.cc/150?img=1',
|
|
21
|
-
status: 'online',
|
|
22
|
-
},
|
|
23
|
-
{
|
|
24
|
-
id: 'mock-user-3',
|
|
25
|
-
name: 'John Doe',
|
|
26
|
-
avatar: 'https://i.pravatar.cc/150?img=2',
|
|
27
|
-
status: 'online',
|
|
28
|
-
},
|
|
29
|
-
{
|
|
30
|
-
id: 'mock-user-4',
|
|
31
|
-
name: 'Emily Chen',
|
|
32
|
-
avatar: 'https://i.pravatar.cc/150?img=3',
|
|
33
|
-
status: 'busy',
|
|
34
|
-
},
|
|
35
|
-
{
|
|
36
|
-
id: 'mock-user-5',
|
|
37
|
-
name: 'Michael Brown',
|
|
38
|
-
avatar: 'https://i.pravatar.cc/150?img=4',
|
|
39
|
-
status: 'away',
|
|
40
|
-
},
|
|
41
|
-
];
|
|
42
|
-
/**
|
|
43
|
-
* Mock adapter implementation
|
|
44
|
-
* Simulates presence behavior without backend
|
|
45
|
-
*/
|
|
46
|
-
class MockPresenceAdapter {
|
|
47
|
-
constructor() {
|
|
48
|
-
this.config = null;
|
|
49
|
-
this.connectionStatus = 'disconnected';
|
|
50
|
-
this.users = [];
|
|
51
|
-
this.typingUsers = [];
|
|
52
|
-
this.intervals = [];
|
|
53
|
-
this.timeouts = [];
|
|
54
|
-
// Callback sets
|
|
55
|
-
this.presenceCallbacks = new Set();
|
|
56
|
-
this.typingCallbacks = new Set();
|
|
57
|
-
this.connectionCallbacks = new Set();
|
|
58
|
-
this.errorCallbacks = new Set();
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Connect to mock presence channel
|
|
62
|
-
*/
|
|
63
|
-
async connect(config) {
|
|
64
|
-
this.config = config;
|
|
65
|
-
this.connectionStatus = 'connecting';
|
|
66
|
-
this.notifyConnectionChange();
|
|
67
|
-
// Simulate connection delay
|
|
68
|
-
await new Promise(resolve => setTimeout(resolve, 500));
|
|
69
|
-
// Add current user
|
|
70
|
-
this.users = [{
|
|
71
|
-
...config.currentUser,
|
|
72
|
-
joinedAt: new Date(),
|
|
73
|
-
}];
|
|
74
|
-
this.connectionStatus = 'connected';
|
|
75
|
-
this.notifyConnectionChange();
|
|
76
|
-
this.notifyPresenceChange();
|
|
77
|
-
if (process.env.NODE_ENV !== 'production') {
|
|
78
|
-
console.log('[MockPresenceAdapter]: Connected to channel:', config.channel);
|
|
79
|
-
}
|
|
80
|
-
// Start simulating user activity
|
|
81
|
-
this.simulateUserActivity();
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Disconnect from mock channel
|
|
85
|
-
*/
|
|
86
|
-
async disconnect() {
|
|
87
|
-
// Clear all intervals and timeouts
|
|
88
|
-
this.intervals.forEach(id => clearInterval(id));
|
|
89
|
-
this.timeouts.forEach(id => clearTimeout(id));
|
|
90
|
-
this.intervals = [];
|
|
91
|
-
this.timeouts = [];
|
|
92
|
-
// Reset state
|
|
93
|
-
this.users = [];
|
|
94
|
-
this.typingUsers = [];
|
|
95
|
-
this.connectionStatus = 'disconnected';
|
|
96
|
-
this.notifyConnectionChange();
|
|
97
|
-
if (process.env.NODE_ENV !== 'production') {
|
|
98
|
-
console.log('[MockPresenceAdapter]: Disconnected from channel');
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
/**
|
|
102
|
-
* Subscribe to presence changes
|
|
103
|
-
*/
|
|
104
|
-
onPresenceChange(callback) {
|
|
105
|
-
this.presenceCallbacks.add(callback);
|
|
106
|
-
return () => this.presenceCallbacks.delete(callback);
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* Subscribe to typing changes
|
|
110
|
-
*/
|
|
111
|
-
onTypingChange(callback) {
|
|
112
|
-
this.typingCallbacks.add(callback);
|
|
113
|
-
return () => this.typingCallbacks.delete(callback);
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* Subscribe to connection changes
|
|
117
|
-
*/
|
|
118
|
-
onConnectionChange(callback) {
|
|
119
|
-
this.connectionCallbacks.add(callback);
|
|
120
|
-
return () => this.connectionCallbacks.delete(callback);
|
|
121
|
-
}
|
|
122
|
-
/**
|
|
123
|
-
* Subscribe to errors
|
|
124
|
-
*/
|
|
125
|
-
onError(callback) {
|
|
126
|
-
this.errorCallbacks.add(callback);
|
|
127
|
-
return () => this.errorCallbacks.delete(callback);
|
|
128
|
-
}
|
|
129
|
-
/**
|
|
130
|
-
* Send typing start (current user)
|
|
131
|
-
*/
|
|
132
|
-
sendTypingStart() {
|
|
133
|
-
if (!this.config)
|
|
134
|
-
return;
|
|
135
|
-
// Add current user to typing list if not already there
|
|
136
|
-
const alreadyTyping = this.typingUsers.find(u => u.id === this.config.currentUser.id);
|
|
137
|
-
if (!alreadyTyping) {
|
|
138
|
-
this.typingUsers.push({
|
|
139
|
-
id: this.config.currentUser.id,
|
|
140
|
-
name: this.config.currentUser.name,
|
|
141
|
-
avatar: this.config.currentUser.avatar,
|
|
142
|
-
startedAt: new Date(),
|
|
143
|
-
});
|
|
144
|
-
this.notifyTypingChange();
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
/**
|
|
148
|
-
* Send typing stop (current user)
|
|
149
|
-
*/
|
|
150
|
-
sendTypingStop() {
|
|
151
|
-
if (!this.config)
|
|
152
|
-
return;
|
|
153
|
-
this.typingUsers = this.typingUsers.filter(u => u.id !== this.config.currentUser.id);
|
|
154
|
-
this.notifyTypingChange();
|
|
155
|
-
}
|
|
156
|
-
/**
|
|
157
|
-
* Update current user metadata
|
|
158
|
-
*/
|
|
159
|
-
updateUserMetadata(metadata) {
|
|
160
|
-
if (!this.config)
|
|
161
|
-
return;
|
|
162
|
-
// Update current user in users list
|
|
163
|
-
this.users = this.users.map(user => user.id === this.config.currentUser.id
|
|
164
|
-
? { ...user, ...metadata }
|
|
165
|
-
: user);
|
|
166
|
-
// Update config
|
|
167
|
-
this.config.currentUser = {
|
|
168
|
-
...this.config.currentUser,
|
|
169
|
-
...metadata,
|
|
170
|
-
};
|
|
171
|
-
this.notifyPresenceChange();
|
|
172
|
-
}
|
|
173
|
-
/**
|
|
174
|
-
* Send custom event (mock implementation)
|
|
175
|
-
*/
|
|
176
|
-
sendCustomEvent(event, data) {
|
|
177
|
-
if (process.env.NODE_ENV !== 'production') {
|
|
178
|
-
console.log('[MockPresenceAdapter]: Custom event sent:', event, data);
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
/**
|
|
182
|
-
* Get current connection status
|
|
183
|
-
*/
|
|
184
|
-
getConnectionStatus() {
|
|
185
|
-
return this.connectionStatus;
|
|
186
|
-
}
|
|
187
|
-
/**
|
|
188
|
-
* Get current user
|
|
189
|
-
*/
|
|
190
|
-
getCurrentUser() {
|
|
191
|
-
if (!this.config) {
|
|
192
|
-
throw new Error('Adapter not connected');
|
|
193
|
-
}
|
|
194
|
-
return this.config.currentUser;
|
|
195
|
-
}
|
|
196
|
-
// ===== Private methods =====
|
|
197
|
-
/**
|
|
198
|
-
* Simulate realistic user activity
|
|
199
|
-
*/
|
|
200
|
-
simulateUserActivity() {
|
|
201
|
-
// Stagger mock user joins (2s intervals)
|
|
202
|
-
MOCK_USERS.forEach((mockUser, index) => {
|
|
203
|
-
const timeout = setTimeout(() => {
|
|
204
|
-
this.users.push({
|
|
205
|
-
...mockUser,
|
|
206
|
-
joinedAt: new Date(),
|
|
207
|
-
});
|
|
208
|
-
this.notifyPresenceChange();
|
|
209
|
-
}, (index + 1) * 2000);
|
|
210
|
-
this.timeouts.push(timeout);
|
|
211
|
-
});
|
|
212
|
-
// Simulate random typing events every 5 seconds
|
|
213
|
-
const typingInterval = setInterval(() => {
|
|
214
|
-
if (this.users.length > 1 && Math.random() > 0.5) {
|
|
215
|
-
// Pick random user (excluding current user)
|
|
216
|
-
const otherUsers = this.users.filter(u => { var _a; return u.id !== ((_a = this.config) === null || _a === void 0 ? void 0 : _a.currentUser.id); });
|
|
217
|
-
if (otherUsers.length > 0) {
|
|
218
|
-
const randomUser = otherUsers[Math.floor(Math.random() * otherUsers.length)];
|
|
219
|
-
this.simulateTypingStart(randomUser);
|
|
220
|
-
// Auto-stop typing after 2-5 seconds
|
|
221
|
-
const stopDelay = 2000 + Math.random() * 3000;
|
|
222
|
-
const stopTimeout = setTimeout(() => {
|
|
223
|
-
this.simulateTypingStop(randomUser.id);
|
|
224
|
-
}, stopDelay);
|
|
225
|
-
this.timeouts.push(stopTimeout);
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
}, 5000);
|
|
229
|
-
this.intervals.push(typingInterval);
|
|
230
|
-
// Simulate occasional user leaving (after 30s, 1 random user leaves)
|
|
231
|
-
const leaveTimeout = setTimeout(() => {
|
|
232
|
-
if (this.users.length > 2) {
|
|
233
|
-
// Remove random mock user (not current user)
|
|
234
|
-
const mockUserIds = MOCK_USERS.map(u => u.id);
|
|
235
|
-
const removableUsers = this.users.filter(u => mockUserIds.includes(u.id));
|
|
236
|
-
if (removableUsers.length > 0) {
|
|
237
|
-
const randomIndex = Math.floor(Math.random() * removableUsers.length);
|
|
238
|
-
const userToRemove = removableUsers[randomIndex];
|
|
239
|
-
this.users = this.users.filter(u => u.id !== userToRemove.id);
|
|
240
|
-
this.typingUsers = this.typingUsers.filter(u => u.id !== userToRemove.id);
|
|
241
|
-
this.notifyPresenceChange();
|
|
242
|
-
this.notifyTypingChange();
|
|
243
|
-
if (process.env.NODE_ENV !== 'production') {
|
|
244
|
-
console.log('[MockPresenceAdapter]: User left:', userToRemove.name);
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
}, 30000);
|
|
249
|
-
this.timeouts.push(leaveTimeout);
|
|
250
|
-
}
|
|
251
|
-
/**
|
|
252
|
-
* Simulate typing start for a user
|
|
253
|
-
*/
|
|
254
|
-
simulateTypingStart(user) {
|
|
255
|
-
// Don't add if already typing
|
|
256
|
-
if (this.typingUsers.find(u => u.id === user.id)) {
|
|
257
|
-
return;
|
|
258
|
-
}
|
|
259
|
-
this.typingUsers.push({
|
|
260
|
-
id: user.id,
|
|
261
|
-
name: user.name,
|
|
262
|
-
avatar: user.avatar,
|
|
263
|
-
startedAt: new Date(),
|
|
264
|
-
});
|
|
265
|
-
this.notifyTypingChange();
|
|
266
|
-
if (process.env.NODE_ENV !== 'production') {
|
|
267
|
-
console.log('[MockPresenceAdapter]: User typing:', user.name);
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
/**
|
|
271
|
-
* Simulate typing stop for a user
|
|
272
|
-
*/
|
|
273
|
-
simulateTypingStop(userId) {
|
|
274
|
-
const wasTyping = this.typingUsers.some(u => u.id === userId);
|
|
275
|
-
this.typingUsers = this.typingUsers.filter(u => u.id !== userId);
|
|
276
|
-
if (wasTyping) {
|
|
277
|
-
this.notifyTypingChange();
|
|
278
|
-
if (process.env.NODE_ENV !== 'production') {
|
|
279
|
-
const user = this.users.find(u => u.id === userId);
|
|
280
|
-
console.log('[MockPresenceAdapter]: User stopped typing:', user === null || user === void 0 ? void 0 : user.name);
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
/**
|
|
285
|
-
* Notify all presence callbacks
|
|
286
|
-
*/
|
|
287
|
-
notifyPresenceChange() {
|
|
288
|
-
this.presenceCallbacks.forEach(callback => {
|
|
289
|
-
try {
|
|
290
|
-
callback([...this.users]);
|
|
291
|
-
}
|
|
292
|
-
catch (error) {
|
|
293
|
-
if (process.env.NODE_ENV !== 'production') {
|
|
294
|
-
console.error('[MockPresenceAdapter]: Error in presence callback:', error);
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
});
|
|
298
|
-
}
|
|
299
|
-
/**
|
|
300
|
-
* Notify all typing callbacks
|
|
301
|
-
*/
|
|
302
|
-
notifyTypingChange() {
|
|
303
|
-
this.typingCallbacks.forEach(callback => {
|
|
304
|
-
try {
|
|
305
|
-
callback([...this.typingUsers]);
|
|
306
|
-
}
|
|
307
|
-
catch (error) {
|
|
308
|
-
if (process.env.NODE_ENV !== 'production') {
|
|
309
|
-
console.error('[MockPresenceAdapter]: Error in typing callback:', error);
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
});
|
|
313
|
-
}
|
|
314
|
-
/**
|
|
315
|
-
* Notify all connection callbacks
|
|
316
|
-
*/
|
|
317
|
-
notifyConnectionChange() {
|
|
318
|
-
this.connectionCallbacks.forEach(callback => {
|
|
319
|
-
try {
|
|
320
|
-
callback(this.connectionStatus);
|
|
321
|
-
}
|
|
322
|
-
catch (error) {
|
|
323
|
-
if (process.env.NODE_ENV !== 'production') {
|
|
324
|
-
console.error('[MockPresenceAdapter]: Error in connection callback:', error);
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
});
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
export { MockPresenceAdapter };
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Presence Adapter Interface
|
|
3
|
-
*
|
|
4
|
-
* Defines the contract for backend adapters that enable real-time presence.
|
|
5
|
-
* Implementations can use WebSocket, Supabase, Ably, Pusher, or custom backends.
|
|
6
|
-
*/
|
|
7
|
-
import { PresenceUser, TypingUser, ConnectionStatus } from '../PresenceProvider.types';
|
|
8
|
-
/**
|
|
9
|
-
* Adapter configuration
|
|
10
|
-
* Passed to adapter on connection
|
|
11
|
-
*/
|
|
12
|
-
export interface PresenceAdapterConfig {
|
|
13
|
-
/** Channel/room ID */
|
|
14
|
-
channel: string;
|
|
15
|
-
/** Current user information */
|
|
16
|
-
currentUser: PresenceUser;
|
|
17
|
-
/** Typing debounce delay in ms (default: 300) */
|
|
18
|
-
typingDebounce?: number;
|
|
19
|
-
/** Typing timeout in ms (default: 3000) */
|
|
20
|
-
typingTimeout?: number;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Base adapter interface
|
|
24
|
-
* All presence adapters must implement these methods
|
|
25
|
-
*/
|
|
26
|
-
export interface PresenceAdapter {
|
|
27
|
-
/**
|
|
28
|
-
* Connect to presence channel
|
|
29
|
-
* @param config - Connection configuration
|
|
30
|
-
* @returns Promise that resolves when connected
|
|
31
|
-
*/
|
|
32
|
-
connect(config: PresenceAdapterConfig): Promise<void>;
|
|
33
|
-
/**
|
|
34
|
-
* Disconnect from channel
|
|
35
|
-
* @returns Promise that resolves when disconnected
|
|
36
|
-
*/
|
|
37
|
-
disconnect(): Promise<void>;
|
|
38
|
-
/**
|
|
39
|
-
* Subscribe to presence changes (users joining/leaving)
|
|
40
|
-
* @param callback - Called when presence state changes
|
|
41
|
-
* @returns Unsubscribe function
|
|
42
|
-
*/
|
|
43
|
-
onPresenceChange(callback: (users: PresenceUser[]) => void): () => void;
|
|
44
|
-
/**
|
|
45
|
-
* Subscribe to typing state changes
|
|
46
|
-
* @param callback - Called when typing state changes
|
|
47
|
-
* @returns Unsubscribe function
|
|
48
|
-
*/
|
|
49
|
-
onTypingChange(callback: (typingUsers: TypingUser[]) => void): () => void;
|
|
50
|
-
/**
|
|
51
|
-
* Subscribe to connection status changes
|
|
52
|
-
* @param callback - Called when connection status changes
|
|
53
|
-
* @returns Unsubscribe function
|
|
54
|
-
*/
|
|
55
|
-
onConnectionChange(callback: (status: ConnectionStatus) => void): () => void;
|
|
56
|
-
/**
|
|
57
|
-
* Subscribe to errors
|
|
58
|
-
* @param callback - Called when an error occurs
|
|
59
|
-
* @returns Unsubscribe function
|
|
60
|
-
*/
|
|
61
|
-
onError(callback: (error: Error) => void): () => void;
|
|
62
|
-
/**
|
|
63
|
-
* Send typing start event
|
|
64
|
-
* Notifies other users that current user started typing
|
|
65
|
-
*/
|
|
66
|
-
sendTypingStart(): void;
|
|
67
|
-
/**
|
|
68
|
-
* Send typing stop event
|
|
69
|
-
* Notifies other users that current user stopped typing
|
|
70
|
-
*/
|
|
71
|
-
sendTypingStop(): void;
|
|
72
|
-
/**
|
|
73
|
-
* Update current user metadata
|
|
74
|
-
* @param metadata - Partial user data to update
|
|
75
|
-
*/
|
|
76
|
-
updateUserMetadata(metadata: Partial<PresenceUser>): void;
|
|
77
|
-
/**
|
|
78
|
-
* Send custom event to channel
|
|
79
|
-
* @param event - Event name
|
|
80
|
-
* @param data - Event payload (JSON serializable)
|
|
81
|
-
*/
|
|
82
|
-
sendCustomEvent(event: string, data?: unknown): void;
|
|
83
|
-
/**
|
|
84
|
-
* Get current connection status
|
|
85
|
-
* @returns Current connection status
|
|
86
|
-
*/
|
|
87
|
-
getConnectionStatus(): ConnectionStatus;
|
|
88
|
-
/**
|
|
89
|
-
* Get current user
|
|
90
|
-
* @returns Current user data
|
|
91
|
-
*/
|
|
92
|
-
getCurrentUser(): PresenceUser;
|
|
93
|
-
}
|
|
@@ -1,134 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Supabase Presence Adapter
|
|
3
|
-
*
|
|
4
|
-
* Supabase Realtime integration for presence tracking.
|
|
5
|
-
* Requires @supabase/supabase-js to be installed.
|
|
6
|
-
*
|
|
7
|
-
* @example
|
|
8
|
-
* ```tsx
|
|
9
|
-
* import { createClient } from '@supabase/supabase-js';
|
|
10
|
-
*
|
|
11
|
-
* const supabase = createClient('YOUR_URL', 'YOUR_KEY');
|
|
12
|
-
* const adapter = new SupabasePresenceAdapter(supabase);
|
|
13
|
-
*
|
|
14
|
-
* <PresenceProvider adapter={adapter} currentUser={user} channel="room-123">
|
|
15
|
-
* <YourApp />
|
|
16
|
-
* </PresenceProvider>
|
|
17
|
-
* ```
|
|
18
|
-
*/
|
|
19
|
-
import { PresenceAdapter, PresenceAdapterConfig } from './PresenceAdapter';
|
|
20
|
-
import { PresenceUser, TypingUser, ConnectionStatus } from '../PresenceProvider.types';
|
|
21
|
-
/**
|
|
22
|
-
* Supabase Realtime Channel interface
|
|
23
|
-
* (Minimal type definition for adapter, user should have @supabase/supabase-js installed)
|
|
24
|
-
*/
|
|
25
|
-
interface SupabaseRealtimeChannel {
|
|
26
|
-
on(event: string, filter: {
|
|
27
|
-
event: string;
|
|
28
|
-
}, callback: (payload: any) => void): SupabaseRealtimeChannel;
|
|
29
|
-
send(payload: {
|
|
30
|
-
type: string;
|
|
31
|
-
event: string;
|
|
32
|
-
payload: any;
|
|
33
|
-
}): Promise<any>;
|
|
34
|
-
track(payload: any): Promise<any>;
|
|
35
|
-
subscribe(callback?: (status: string) => void): SupabaseRealtimeChannel;
|
|
36
|
-
unsubscribe(): Promise<any>;
|
|
37
|
-
presenceState(): Record<string, any[]>;
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Minimal SupabaseClient interface
|
|
41
|
-
*/
|
|
42
|
-
interface SupabaseClient {
|
|
43
|
-
channel(name: string, options?: {
|
|
44
|
-
config?: {
|
|
45
|
-
presence?: {
|
|
46
|
-
key: string;
|
|
47
|
-
};
|
|
48
|
-
};
|
|
49
|
-
}): SupabaseRealtimeChannel;
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Supabase presence adapter
|
|
53
|
-
* Uses Supabase Realtime for presence tracking
|
|
54
|
-
*
|
|
55
|
-
* NOTE: Requires @supabase/supabase-js installed:
|
|
56
|
-
* npm install @supabase/supabase-js
|
|
57
|
-
*/
|
|
58
|
-
export declare class SupabasePresenceAdapter implements PresenceAdapter {
|
|
59
|
-
private client;
|
|
60
|
-
private channel;
|
|
61
|
-
private config;
|
|
62
|
-
private connectionStatus;
|
|
63
|
-
private typingStates;
|
|
64
|
-
private presenceCallbacks;
|
|
65
|
-
private typingCallbacks;
|
|
66
|
-
private connectionCallbacks;
|
|
67
|
-
private errorCallbacks;
|
|
68
|
-
constructor(client: SupabaseClient);
|
|
69
|
-
/**
|
|
70
|
-
* Connect to Supabase Realtime channel
|
|
71
|
-
*/
|
|
72
|
-
connect(config: PresenceAdapterConfig): Promise<void>;
|
|
73
|
-
/**
|
|
74
|
-
* Disconnect from Supabase channel
|
|
75
|
-
*/
|
|
76
|
-
disconnect(): Promise<void>;
|
|
77
|
-
/**
|
|
78
|
-
* Subscribe to presence changes
|
|
79
|
-
*/
|
|
80
|
-
onPresenceChange(callback: (users: PresenceUser[]) => void): () => void;
|
|
81
|
-
/**
|
|
82
|
-
* Subscribe to typing changes
|
|
83
|
-
*/
|
|
84
|
-
onTypingChange(callback: (users: TypingUser[]) => void): () => void;
|
|
85
|
-
/**
|
|
86
|
-
* Subscribe to connection changes
|
|
87
|
-
*/
|
|
88
|
-
onConnectionChange(callback: (status: ConnectionStatus) => void): () => void;
|
|
89
|
-
/**
|
|
90
|
-
* Subscribe to errors
|
|
91
|
-
*/
|
|
92
|
-
onError(callback: (error: Error) => void): () => void;
|
|
93
|
-
/**
|
|
94
|
-
* Send typing start
|
|
95
|
-
*/
|
|
96
|
-
sendTypingStart(): void;
|
|
97
|
-
/**
|
|
98
|
-
* Send typing stop
|
|
99
|
-
*/
|
|
100
|
-
sendTypingStop(): void;
|
|
101
|
-
/**
|
|
102
|
-
* Update user metadata
|
|
103
|
-
*/
|
|
104
|
-
updateUserMetadata(metadata: Partial<PresenceUser>): void;
|
|
105
|
-
/**
|
|
106
|
-
* Send custom event
|
|
107
|
-
*/
|
|
108
|
-
sendCustomEvent(event: string, data?: unknown): void;
|
|
109
|
-
/**
|
|
110
|
-
* Get connection status
|
|
111
|
-
*/
|
|
112
|
-
getConnectionStatus(): ConnectionStatus;
|
|
113
|
-
/**
|
|
114
|
-
* Get current user
|
|
115
|
-
*/
|
|
116
|
-
getCurrentUser(): PresenceUser;
|
|
117
|
-
/**
|
|
118
|
-
* Notify presence callbacks
|
|
119
|
-
*/
|
|
120
|
-
private notifyPresenceChange;
|
|
121
|
-
/**
|
|
122
|
-
* Notify typing callbacks
|
|
123
|
-
*/
|
|
124
|
-
private notifyTypingChange;
|
|
125
|
-
/**
|
|
126
|
-
* Notify connection callbacks
|
|
127
|
-
*/
|
|
128
|
-
private notifyConnectionChange;
|
|
129
|
-
/**
|
|
130
|
-
* Notify error callbacks
|
|
131
|
-
*/
|
|
132
|
-
private notifyError;
|
|
133
|
-
}
|
|
134
|
-
export {};
|
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* WebSocket Presence Adapter
|
|
3
|
-
*
|
|
4
|
-
* Generic WebSocket implementation for real-time presence.
|
|
5
|
-
* Requires a WebSocket server that implements the presence protocol.
|
|
6
|
-
*
|
|
7
|
-
* @example
|
|
8
|
-
* ```tsx
|
|
9
|
-
* const adapter = new WebSocketPresenceAdapter({
|
|
10
|
-
* url: 'ws://localhost:3000/presence',
|
|
11
|
-
* reconnect: {
|
|
12
|
-
* enabled: true,
|
|
13
|
-
* maxAttempts: 5,
|
|
14
|
-
* delay: 1000,
|
|
15
|
-
* },
|
|
16
|
-
* });
|
|
17
|
-
*
|
|
18
|
-
* <PresenceProvider adapter={adapter} currentUser={user} channel="room-123">
|
|
19
|
-
* <YourApp />
|
|
20
|
-
* </PresenceProvider>
|
|
21
|
-
* ```
|
|
22
|
-
*/
|
|
23
|
-
import { PresenceAdapter, PresenceAdapterConfig } from './PresenceAdapter';
|
|
24
|
-
import { PresenceUser, TypingUser, ConnectionStatus } from '../PresenceProvider.types';
|
|
25
|
-
/**
|
|
26
|
-
* WebSocket adapter configuration
|
|
27
|
-
*/
|
|
28
|
-
export interface WebSocketAdapterOptions {
|
|
29
|
-
/** WebSocket server URL */
|
|
30
|
-
url: string;
|
|
31
|
-
/** Reconnection configuration */
|
|
32
|
-
reconnect?: {
|
|
33
|
-
/** Enable automatic reconnection */
|
|
34
|
-
enabled: boolean;
|
|
35
|
-
/** Maximum reconnection attempts */
|
|
36
|
-
maxAttempts?: number;
|
|
37
|
-
/** Initial delay between attempts (ms) */
|
|
38
|
-
delay?: number;
|
|
39
|
-
};
|
|
40
|
-
/** Custom message protocol names */
|
|
41
|
-
protocols?: {
|
|
42
|
-
/** Join channel message type */
|
|
43
|
-
join?: string;
|
|
44
|
-
/** Leave channel message type */
|
|
45
|
-
leave?: string;
|
|
46
|
-
/** Typing message type */
|
|
47
|
-
typing?: string;
|
|
48
|
-
/** Update user message type */
|
|
49
|
-
update?: string;
|
|
50
|
-
/** Presence update message type */
|
|
51
|
-
presenceUpdate?: string;
|
|
52
|
-
/** Typing update message type */
|
|
53
|
-
typingUpdate?: string;
|
|
54
|
-
};
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* WebSocket presence adapter
|
|
58
|
-
* Connects to a WebSocket server for real-time presence
|
|
59
|
-
*/
|
|
60
|
-
export declare class WebSocketPresenceAdapter implements PresenceAdapter {
|
|
61
|
-
private ws;
|
|
62
|
-
private config;
|
|
63
|
-
private options;
|
|
64
|
-
private connectionStatus;
|
|
65
|
-
private reconnectAttempts;
|
|
66
|
-
private reconnectTimeoutId?;
|
|
67
|
-
private presenceCallbacks;
|
|
68
|
-
private typingCallbacks;
|
|
69
|
-
private connectionCallbacks;
|
|
70
|
-
private errorCallbacks;
|
|
71
|
-
private readonly DEFAULT_PROTOCOLS;
|
|
72
|
-
constructor(options: WebSocketAdapterOptions);
|
|
73
|
-
/**
|
|
74
|
-
* Connect to WebSocket server
|
|
75
|
-
*/
|
|
76
|
-
connect(config: PresenceAdapterConfig): Promise<void>;
|
|
77
|
-
/**
|
|
78
|
-
* Disconnect from WebSocket
|
|
79
|
-
*/
|
|
80
|
-
disconnect(): Promise<void>;
|
|
81
|
-
/**
|
|
82
|
-
* Subscribe to presence changes
|
|
83
|
-
*/
|
|
84
|
-
onPresenceChange(callback: (users: PresenceUser[]) => void): () => void;
|
|
85
|
-
/**
|
|
86
|
-
* Subscribe to typing changes
|
|
87
|
-
*/
|
|
88
|
-
onTypingChange(callback: (users: TypingUser[]) => void): () => void;
|
|
89
|
-
/**
|
|
90
|
-
* Subscribe to connection changes
|
|
91
|
-
*/
|
|
92
|
-
onConnectionChange(callback: (status: ConnectionStatus) => void): () => void;
|
|
93
|
-
/**
|
|
94
|
-
* Subscribe to errors
|
|
95
|
-
*/
|
|
96
|
-
onError(callback: (error: Error) => void): () => void;
|
|
97
|
-
/**
|
|
98
|
-
* Send typing start
|
|
99
|
-
*/
|
|
100
|
-
sendTypingStart(): void;
|
|
101
|
-
/**
|
|
102
|
-
* Send typing stop
|
|
103
|
-
*/
|
|
104
|
-
sendTypingStop(): void;
|
|
105
|
-
/**
|
|
106
|
-
* Update user metadata
|
|
107
|
-
*/
|
|
108
|
-
updateUserMetadata(metadata: Partial<PresenceUser>): void;
|
|
109
|
-
/**
|
|
110
|
-
* Send custom event
|
|
111
|
-
*/
|
|
112
|
-
sendCustomEvent(event: string, data?: unknown): void;
|
|
113
|
-
/**
|
|
114
|
-
* Get connection status
|
|
115
|
-
*/
|
|
116
|
-
getConnectionStatus(): ConnectionStatus;
|
|
117
|
-
/**
|
|
118
|
-
* Get current user
|
|
119
|
-
*/
|
|
120
|
-
getCurrentUser(): PresenceUser;
|
|
121
|
-
/**
|
|
122
|
-
* Send message to WebSocket
|
|
123
|
-
*/
|
|
124
|
-
private send;
|
|
125
|
-
/**
|
|
126
|
-
* Handle incoming WebSocket message
|
|
127
|
-
*/
|
|
128
|
-
private handleMessage;
|
|
129
|
-
/**
|
|
130
|
-
* Handle reconnection logic
|
|
131
|
-
*/
|
|
132
|
-
private handleReconnect;
|
|
133
|
-
/**
|
|
134
|
-
* Notify presence callbacks
|
|
135
|
-
*/
|
|
136
|
-
private notifyPresenceChange;
|
|
137
|
-
/**
|
|
138
|
-
* Notify typing callbacks
|
|
139
|
-
*/
|
|
140
|
-
private notifyTypingChange;
|
|
141
|
-
/**
|
|
142
|
-
* Notify connection callbacks
|
|
143
|
-
*/
|
|
144
|
-
private notifyConnectionChange;
|
|
145
|
-
/**
|
|
146
|
-
* Notify error callbacks
|
|
147
|
-
*/
|
|
148
|
-
private notifyError;
|
|
149
|
-
}
|