@royaltics/ui 1.9.9 → 2.0.1
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.socket.md +60 -78
- package/dist/core/socket/socket-store.d.ts +18 -7
- package/dist/core/socket/socket-store.d.ts.map +1 -1
- package/dist/core/socket/socket-store.js +34 -10
- package/dist/core/socket/socket-store.js.map +1 -1
- package/dist/core/socket/useSocketState.d.ts +13 -1
- package/dist/core/socket/useSocketState.d.ts.map +1 -1
- package/dist/core/socket/useSocketState.js +31 -2
- package/dist/core/socket/useSocketState.js.map +1 -1
- package/dist/reducers/index.d.ts +3 -4
- package/dist/reducers/index.d.ts.map +1 -1
- package/dist/reducers/index.js +5 -2
- package/dist/reducers/index.js.map +1 -1
- package/package.json +1 -1
package/README.socket.md
CHANGED
|
@@ -1,126 +1,108 @@
|
|
|
1
1
|
# @royaltics/ui - WebSocket Store & Hooks
|
|
2
2
|
|
|
3
|
-
The WebSocket system
|
|
3
|
+
The WebSocket system provides a global `Zustand` store for managing connections and subscriptions, removing the need for local state management or complex context providers. It's designed for high-performance SaaS applications with automatic resubscription and flexible configuration.
|
|
4
4
|
|
|
5
5
|
## 1. Global Socket Initialization
|
|
6
|
-
|
|
6
|
+
|
|
7
|
+
### Via `SocketProvider` (Recommended)
|
|
8
|
+
The `SocketProvider` is the most scalable way to initialize the socket in React. It automatically handles connection lifecycle based on props.
|
|
9
|
+
|
|
10
|
+
```tsx
|
|
11
|
+
import { SocketProvider } from '@royaltics/ui/socket';
|
|
12
|
+
|
|
13
|
+
export const App = ({ userToken }) => {
|
|
14
|
+
return (
|
|
15
|
+
<SocketProvider
|
|
16
|
+
socketUrl="https://api.example.com"
|
|
17
|
+
token={userToken}
|
|
18
|
+
path="/ws" // Optional, default: /ws
|
|
19
|
+
transports={['websocket']} // Optional, default: ['websocket']
|
|
20
|
+
>
|
|
21
|
+
<MainLayout />
|
|
22
|
+
</SocketProvider>
|
|
23
|
+
);
|
|
24
|
+
};
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### Via `initSocketOptions` (Imperative)
|
|
28
|
+
If you need to initialize the socket outside of a React component (e.g., in a service or interceptor):
|
|
7
29
|
|
|
8
30
|
```tsx
|
|
9
|
-
import { initSocketOptions } from '@royaltics/ui/
|
|
31
|
+
import { initSocketOptions } from '@royaltics/ui/socket';
|
|
10
32
|
|
|
11
|
-
// Call this when the user logs in or app initializes
|
|
12
33
|
initSocketOptions({
|
|
13
34
|
socketUrl: 'https://socket.example.com',
|
|
14
35
|
token: 'YOUR_AUTH_TOKEN_HERE',
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
reconnection: true,
|
|
18
|
-
reconnectionAttempts: 5,
|
|
19
|
-
},
|
|
20
|
-
onAuthError: (err) => {
|
|
21
|
-
// Triggered when socket.io 'connect_error' is fired.
|
|
22
|
-
// You can implement token refreshing mechanisms and then re-call `initSocketOptions({ ...newConfig })`
|
|
23
|
-
console.error("Socket authentication failed", err);
|
|
24
|
-
}
|
|
36
|
+
path: '/ws',
|
|
37
|
+
onAuthError: (err) => console.error("Socket Auth failed", err)
|
|
25
38
|
});
|
|
26
39
|
```
|
|
27
|
-
*Note: If you call `initSocketOptions` with an empty `socketUrl` or `token`, it will automatically disconnect the socket.*
|
|
28
40
|
|
|
29
|
-
## 2.
|
|
30
|
-
|
|
41
|
+
## 2. Managing Subscriptions
|
|
42
|
+
|
|
43
|
+
The system features an **Auto-Resubscription** engine. When you subscribe to a topic, the store keeps track of it. If the connection drops and reconnects, the store will automatically re-emit the subscription events.
|
|
44
|
+
|
|
45
|
+
### `useSocketSubscription`
|
|
46
|
+
Designed for NestJS-compatible @SubscribeMessage handlers. It manages the full lifecycle (subscribe on mount, unsubscribe on unmount).
|
|
31
47
|
|
|
32
48
|
```tsx
|
|
33
|
-
import {
|
|
49
|
+
import { useSocketSubscription } from '@royaltics/ui/socket';
|
|
34
50
|
|
|
35
|
-
export const
|
|
36
|
-
//
|
|
37
|
-
|
|
51
|
+
export const ChatRoom = ({ roomId }) => {
|
|
52
|
+
// Sends { rooms: [roomId] } to 'subscribe' event
|
|
53
|
+
useSocketSubscription(`room-${roomId}`, [roomId]);
|
|
38
54
|
|
|
39
|
-
return <div>
|
|
55
|
+
return <div>Room: {roomId}</div>;
|
|
40
56
|
}
|
|
41
57
|
```
|
|
42
58
|
|
|
43
|
-
## 3. Emitting
|
|
44
|
-
|
|
59
|
+
## 3. Emitting & Listening
|
|
60
|
+
|
|
61
|
+
### `useSocketState`
|
|
62
|
+
Read connection status and access the raw `emit` function.
|
|
45
63
|
|
|
46
64
|
```tsx
|
|
47
65
|
import { useSocketState } from '@royaltics/ui/socket';
|
|
48
66
|
|
|
49
67
|
export const ChatInput = () => {
|
|
50
|
-
|
|
51
|
-
const { emit, isConnected } = useSocketState();
|
|
68
|
+
const { emit, isConnected, status } = useSocketState();
|
|
52
69
|
|
|
53
70
|
const sendMessage = () => {
|
|
54
71
|
if (!isConnected) return;
|
|
55
|
-
emit('chat:message', { text: 'Hello
|
|
72
|
+
emit('chat:message', { text: 'Hello!' });
|
|
56
73
|
};
|
|
57
74
|
|
|
58
|
-
return <button onClick={sendMessage}>Send</button>;
|
|
75
|
+
return <button disabled={status !== 'connected'} onClick={sendMessage}>Send</button>;
|
|
59
76
|
};
|
|
60
77
|
```
|
|
61
78
|
|
|
62
|
-
### `
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
```tsx
|
|
66
|
-
import { useSocketState } from '@royaltics/ui/socket';
|
|
67
|
-
|
|
68
|
-
export const ProfileSettings = () => {
|
|
69
|
-
const { setToken } = useSocketState();
|
|
70
|
-
|
|
71
|
-
const handleSessionRefresh = (newToken: string) => {
|
|
72
|
-
setToken(newToken);
|
|
73
|
-
};
|
|
74
|
-
|
|
75
|
-
return <button onClick={() => handleSessionRefresh('NEW_TOKEN')}>Refresh Socket Token</button>;
|
|
76
|
-
};
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
## 4. Tree-Shaking & Bundle Optimization
|
|
80
|
-
To ensure that `socket.io-client` is only bundled when you actually use WebSockets, the socket logic is isolated in `@royaltics/ui/socket`.
|
|
81
|
-
|
|
82
|
-
> [!IMPORTANT]
|
|
83
|
-
> Do **NOT** import socket hooks from `@royaltics/ui/hooks`. Always use the dedicated entry point:
|
|
84
|
-
> `import { useSocketState } from '@royaltics/ui/socket';`
|
|
85
|
-
|
|
86
|
-
## 5. Listening to Events
|
|
87
|
-
We provide two tailored hooks for listening to specific Socket.io events and managing standard React lifecycles.
|
|
88
|
-
|
|
89
|
-
### `useSocketEvent`
|
|
90
|
-
Used for managing a single distinct event listener.
|
|
79
|
+
### `useSocketEvent`
|
|
80
|
+
Handle specific incoming events.
|
|
91
81
|
|
|
92
82
|
```tsx
|
|
93
83
|
import { useSocketEvent } from '@royaltics/ui/socket';
|
|
94
84
|
|
|
95
85
|
export const NotificationToast = () => {
|
|
96
|
-
// Automatically binds/unbinds on mount/unmount
|
|
97
86
|
useSocketEvent('notification:new', (data) => {
|
|
98
|
-
console.log('
|
|
87
|
+
console.log('New notification:', data);
|
|
99
88
|
});
|
|
100
89
|
|
|
101
90
|
return null;
|
|
102
91
|
}
|
|
103
92
|
```
|
|
104
93
|
|
|
105
|
-
|
|
106
|
-
|
|
94
|
+
## 4. Advanced Configuration
|
|
95
|
+
|
|
96
|
+
### `setToken(token)`
|
|
97
|
+
Update the authentication token without resetting the entire configuration.
|
|
107
98
|
|
|
108
99
|
```tsx
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
export const ChatRoom = () => {
|
|
112
|
-
useSocketEvents([
|
|
113
|
-
{
|
|
114
|
-
event: 'chat:message',
|
|
115
|
-
onData: (message) => console.log('New Message:', message)
|
|
116
|
-
},
|
|
117
|
-
{
|
|
118
|
-
event: 'chat:typing',
|
|
119
|
-
enabled: false, // You can toggle this dynamically!
|
|
120
|
-
onData: (user) => console.log(`${user} is typing...`)
|
|
121
|
-
}
|
|
122
|
-
]);
|
|
123
|
-
|
|
124
|
-
return <div>Chat UI</div>
|
|
125
|
-
}
|
|
100
|
+
const { setToken } = useSocketState();
|
|
101
|
+
setToken('NEW_JWT_TOKEN');
|
|
126
102
|
```
|
|
103
|
+
|
|
104
|
+
### SaaS Scalability
|
|
105
|
+
The store allows overriding the subscription event name (default: `'subscribe'`) and handles multi-transport fallbacks if needed.
|
|
106
|
+
|
|
107
|
+
> [!TIP]
|
|
108
|
+
> Always prefer `SocketProvider` for React applications to ensure the socket state is strictly synced with your authentication state.
|
|
@@ -1,20 +1,31 @@
|
|
|
1
1
|
import { Socket, ManagerOptions, SocketOptions } from 'socket.io-client';
|
|
2
2
|
export type SocketStatus = 'disconnected' | 'connecting' | 'connected' | 'error';
|
|
3
|
+
export interface SubscriptionData {
|
|
4
|
+
rooms: string[];
|
|
5
|
+
[key: string]: any;
|
|
6
|
+
}
|
|
7
|
+
export interface SocketStoreConfig {
|
|
8
|
+
url: string;
|
|
9
|
+
token: string;
|
|
10
|
+
path?: string;
|
|
11
|
+
transports?: ('websocket' | 'polling')[];
|
|
12
|
+
options?: Partial<ManagerOptions & SocketOptions>;
|
|
13
|
+
onAuthError?: (err: Error) => void;
|
|
14
|
+
subscriptionEvent?: string;
|
|
15
|
+
}
|
|
3
16
|
export interface SocketStoreState {
|
|
4
17
|
socket: Socket | null;
|
|
5
18
|
status: SocketStatus;
|
|
6
19
|
isConnected: boolean;
|
|
7
|
-
config:
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
options?: Partial<ManagerOptions & SocketOptions>;
|
|
11
|
-
onAuthError?: (err: Error) => void;
|
|
12
|
-
} | null;
|
|
13
|
-
connect: (url: string, token: string, extraOptions?: Partial<ManagerOptions & SocketOptions>, onAuthError?: (err: Error) => void) => void;
|
|
20
|
+
config: SocketStoreConfig | null;
|
|
21
|
+
subscriptions: Map<string, SubscriptionData>;
|
|
22
|
+
connect: (config: SocketStoreConfig) => void;
|
|
14
23
|
disconnect: () => void;
|
|
15
24
|
setToken: (token: string) => void;
|
|
16
25
|
emit: (event: string, ...args: any[]) => void;
|
|
17
26
|
off: (event: string, callback?: (...args: any[]) => void) => void;
|
|
27
|
+
subscribe: (id: string, data: SubscriptionData, event?: string) => void;
|
|
28
|
+
unsubscribe: (id: string, event?: string) => void;
|
|
18
29
|
}
|
|
19
30
|
export interface SocketHookEvent<T = any> {
|
|
20
31
|
event: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"socket-store.d.ts","sourceRoot":"","sources":["../../../src/core/socket/socket-store.ts"],"names":[],"mappings":"AACA,OAAO,EAAM,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAE7E,MAAM,MAAM,YAAY,GAAG,cAAc,GAAG,YAAY,GAAG,WAAW,GAAG,OAAO,CAAC;AAEjF,MAAM,WAAW,gBAAgB;IAC7B,MAAM,EAAE,MAAM,GAAG,
|
|
1
|
+
{"version":3,"file":"socket-store.d.ts","sourceRoot":"","sources":["../../../src/core/socket/socket-store.ts"],"names":[],"mappings":"AACA,OAAO,EAAM,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAE7E,MAAM,MAAM,YAAY,GAAG,cAAc,GAAG,YAAY,GAAG,WAAW,GAAG,OAAO,CAAC;AAEjF,MAAM,WAAW,gBAAgB;IAC7B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,CAAC,WAAW,GAAG,SAAS,CAAC,EAAE,CAAC;IACzC,OAAO,CAAC,EAAE,OAAO,CAAC,cAAc,GAAG,aAAa,CAAC,CAAC;IAClD,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;IACnC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,gBAAgB;IAC7B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,YAAY,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACjC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC7C,OAAO,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC7C,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;IAC9C,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,KAAK,IAAI,CAAC;IAClE,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACxE,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CACrD;AAED,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,GAAG;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,eAAO,MAAM,WAAW,8CA6HrB,CAAC"}
|
|
@@ -5,31 +5,38 @@ export const socketStore = createStore((set, get) => ({
|
|
|
5
5
|
status: 'disconnected',
|
|
6
6
|
isConnected: false,
|
|
7
7
|
config: null,
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
subscriptions: new Map(),
|
|
9
|
+
connect: (config) => {
|
|
10
|
+
const { url, token, path = '/ws', transports = ['websocket'], options, onAuthError, subscriptionEvent = 'subscribe' } = config;
|
|
11
|
+
let { socket, subscriptions } = get();
|
|
12
|
+
// Prevent reconnecting if already connected to the same instance/token/path
|
|
11
13
|
// @ts-ignore: uri is private but needed for caching check
|
|
12
|
-
if (socket?.connected && socket.auth && socket.auth.token === token && socket.io.uri === url)
|
|
14
|
+
if (socket?.connected && socket.auth && socket.auth.token === token && socket.io.uri === url && socket.io.opts.path === path)
|
|
13
15
|
return;
|
|
14
16
|
// Clean up previous instance
|
|
15
17
|
if (socket) {
|
|
16
18
|
socket.removeAllListeners();
|
|
17
19
|
socket.disconnect();
|
|
18
20
|
}
|
|
19
|
-
set({ status: 'connecting' });
|
|
21
|
+
set({ status: 'connecting', config });
|
|
20
22
|
const newSocket = io(url, {
|
|
21
23
|
auth: { token },
|
|
22
|
-
path
|
|
23
|
-
transports
|
|
24
|
+
path,
|
|
25
|
+
transports,
|
|
24
26
|
reconnection: true,
|
|
25
27
|
reconnectionDelay: 3000,
|
|
26
28
|
reconnectionAttempts: 5,
|
|
27
29
|
timeout: 10000,
|
|
28
30
|
autoConnect: true,
|
|
29
|
-
...
|
|
31
|
+
...options
|
|
30
32
|
});
|
|
31
33
|
newSocket.on('connect', () => {
|
|
34
|
+
console.log('[Socket.IO] Connected to:', url);
|
|
32
35
|
set({ status: 'connected', isConnected: true });
|
|
36
|
+
// Auto-resubscribe to all active topics
|
|
37
|
+
subscriptions.forEach((data) => {
|
|
38
|
+
newSocket.emit(subscriptionEvent, data);
|
|
39
|
+
});
|
|
33
40
|
});
|
|
34
41
|
newSocket.on('disconnect', (reason) => {
|
|
35
42
|
console.log('[Socket.IO] Disconnected:', reason);
|
|
@@ -49,12 +56,12 @@ export const socketStore = createStore((set, get) => ({
|
|
|
49
56
|
console.error('[Socket.IO] Socket error:', error);
|
|
50
57
|
set({ status: 'error', isConnected: false });
|
|
51
58
|
});
|
|
52
|
-
set({ socket: newSocket
|
|
59
|
+
set({ socket: newSocket });
|
|
53
60
|
},
|
|
54
61
|
setToken: (token) => {
|
|
55
62
|
const { config, connect } = get();
|
|
56
63
|
if (config && config.token !== token) {
|
|
57
|
-
connect(config
|
|
64
|
+
connect({ ...config, token });
|
|
58
65
|
}
|
|
59
66
|
},
|
|
60
67
|
disconnect: () => {
|
|
@@ -84,6 +91,23 @@ export const socketStore = createStore((set, get) => ({
|
|
|
84
91
|
socket.off(event);
|
|
85
92
|
}
|
|
86
93
|
}
|
|
94
|
+
},
|
|
95
|
+
subscribe: (id, data, event) => {
|
|
96
|
+
const { socket, subscriptions, config } = get();
|
|
97
|
+
const eventName = event || config?.subscriptionEvent || 'subscribe';
|
|
98
|
+
subscriptions.set(id, data);
|
|
99
|
+
if (socket?.connected) {
|
|
100
|
+
socket.emit(eventName, data);
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
unsubscribe: (id, event) => {
|
|
104
|
+
const { socket, subscriptions, config } = get();
|
|
105
|
+
const eventName = event || config?.subscriptionEvent || 'unsubscribe';
|
|
106
|
+
const data = subscriptions.get(id);
|
|
107
|
+
if (data && socket?.connected) {
|
|
108
|
+
socket.emit(eventName, data);
|
|
109
|
+
}
|
|
110
|
+
subscriptions.delete(id);
|
|
87
111
|
}
|
|
88
112
|
}));
|
|
89
113
|
//# sourceMappingURL=socket-store.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"socket-store.js","sourceRoot":"","sources":["../../../src/core/socket/socket-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,EAAE,EAAyC,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"socket-store.js","sourceRoot":"","sources":["../../../src/core/socket/socket-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,11 +3,23 @@ import { SocketHookEvent } from './socket-store.js';
|
|
|
3
3
|
export interface SocketOptionsProps {
|
|
4
4
|
socketUrl?: string;
|
|
5
5
|
token?: string;
|
|
6
|
+
path?: string;
|
|
7
|
+
transports?: ('websocket' | 'polling')[];
|
|
6
8
|
options?: Partial<ManagerOptions & SocketOptions>;
|
|
9
|
+
subscriptionEvent?: string;
|
|
7
10
|
onAuthError?: (error: Error) => void;
|
|
8
11
|
}
|
|
9
|
-
export declare const initSocketOptions: ({ socketUrl, token, options, onAuthError }: SocketOptionsProps) => void;
|
|
12
|
+
export declare const initSocketOptions: ({ socketUrl, token, path, transports, options, onAuthError, subscriptionEvent }: SocketOptionsProps) => void;
|
|
10
13
|
export declare const useSocketState: () => import("./socket-store.js").SocketStoreState;
|
|
14
|
+
export declare const SocketProvider: ({ children, ...props }: SocketOptionsProps & {
|
|
15
|
+
children: React.ReactNode;
|
|
16
|
+
}) => import("react").ReactNode;
|
|
11
17
|
export declare const useSocketEvent: <T = any>(event: string, callback: (...args: T[]) => void) => void;
|
|
12
18
|
export declare const useSocketEvents: (events: SocketHookEvent[]) => void;
|
|
19
|
+
/**
|
|
20
|
+
* Hook to manage a socket subscription lifecycle.
|
|
21
|
+
* Automatically sends 'subscribe' on mount and 'unsubscribe' on unmount.
|
|
22
|
+
* Compatible with NestJS @SubscribeMessage('subscribe')
|
|
23
|
+
*/
|
|
24
|
+
export declare const useSocketSubscription: (id: string, rooms: string[], extraData?: Record<string, any>, subscriptionEvent?: string) => void;
|
|
13
25
|
//# sourceMappingURL=useSocketState.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSocketState.d.ts","sourceRoot":"","sources":["../../../src/core/socket/useSocketState.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAe,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEjE,MAAM,WAAW,kBAAkB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC,cAAc,GAAG,aAAa,CAAC,CAAC;IAClD,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACxC;AAED,eAAO,MAAM,iBAAiB,GAAI,
|
|
1
|
+
{"version":3,"file":"useSocketState.d.ts","sourceRoot":"","sources":["../../../src/core/socket/useSocketState.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAe,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEjE,MAAM,WAAW,kBAAkB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,CAAC,WAAW,GAAG,SAAS,CAAC,EAAE,CAAC;IACzC,OAAO,CAAC,EAAE,OAAO,CAAC,cAAc,GAAG,aAAa,CAAC,CAAC;IAClD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACxC;AAED,eAAO,MAAM,iBAAiB,GAAI,iFAAiF,kBAAkB,SAcpI,CAAC;AAEF,eAAO,MAAM,cAAc,oDAE1B,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,wBAAwB,kBAAkB,GAAG;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,8BAMxG,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,CAAC,GAAG,GAAG,EAAE,OAAO,MAAM,EAAE,UAAU,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,KAAK,IAAI,SAUtF,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,QAAQ,eAAe,EAAE,SAkBxD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GAAI,IAAI,MAAM,EAAE,OAAO,MAAM,EAAE,EAAE,YAAY,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,oBAAoB,MAAM,SAW7H,CAAC"}
|
|
@@ -1,9 +1,17 @@
|
|
|
1
1
|
import { useEffect } from 'react';
|
|
2
2
|
import { useStore } from 'zustand';
|
|
3
3
|
import { socketStore } from './socket-store.js';
|
|
4
|
-
export const initSocketOptions = ({ socketUrl, token, options, onAuthError }) => {
|
|
4
|
+
export const initSocketOptions = ({ socketUrl, token, path, transports, options, onAuthError, subscriptionEvent }) => {
|
|
5
5
|
if (socketUrl && token) {
|
|
6
|
-
socketStore.getState().connect(
|
|
6
|
+
socketStore.getState().connect({
|
|
7
|
+
url: socketUrl,
|
|
8
|
+
token,
|
|
9
|
+
path,
|
|
10
|
+
transports,
|
|
11
|
+
options,
|
|
12
|
+
onAuthError,
|
|
13
|
+
subscriptionEvent
|
|
14
|
+
});
|
|
7
15
|
}
|
|
8
16
|
else {
|
|
9
17
|
socketStore.getState().disconnect();
|
|
@@ -12,6 +20,12 @@ export const initSocketOptions = ({ socketUrl, token, options, onAuthError }) =>
|
|
|
12
20
|
export const useSocketState = () => {
|
|
13
21
|
return useStore(socketStore);
|
|
14
22
|
};
|
|
23
|
+
export const SocketProvider = ({ children, ...props }) => {
|
|
24
|
+
useEffect(() => {
|
|
25
|
+
initSocketOptions(props);
|
|
26
|
+
}, [props.socketUrl, props.token, props.path, JSON.stringify(props.transports), JSON.stringify(props.options)]);
|
|
27
|
+
return children;
|
|
28
|
+
};
|
|
15
29
|
export const useSocketEvent = (event, callback) => {
|
|
16
30
|
const socket = useSocketState().socket;
|
|
17
31
|
useEffect(() => {
|
|
@@ -39,4 +53,19 @@ export const useSocketEvents = (events) => {
|
|
|
39
53
|
};
|
|
40
54
|
}, [socket, events]);
|
|
41
55
|
};
|
|
56
|
+
/**
|
|
57
|
+
* Hook to manage a socket subscription lifecycle.
|
|
58
|
+
* Automatically sends 'subscribe' on mount and 'unsubscribe' on unmount.
|
|
59
|
+
* Compatible with NestJS @SubscribeMessage('subscribe')
|
|
60
|
+
*/
|
|
61
|
+
export const useSocketSubscription = (id, rooms, extraData, subscriptionEvent) => {
|
|
62
|
+
const { subscribe, unsubscribe, isConnected } = useSocketState();
|
|
63
|
+
useEffect(() => {
|
|
64
|
+
const data = { rooms, ...extraData };
|
|
65
|
+
subscribe(id, data, subscriptionEvent);
|
|
66
|
+
return () => {
|
|
67
|
+
unsubscribe(id, subscriptionEvent);
|
|
68
|
+
};
|
|
69
|
+
}, [id, JSON.stringify(rooms), JSON.stringify(extraData), isConnected, subscriptionEvent]);
|
|
70
|
+
};
|
|
42
71
|
//# sourceMappingURL=useSocketState.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSocketState.js","sourceRoot":"","sources":["../../../src/core/socket/useSocketState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,OAAO,EAAE,WAAW,EAAmB,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"useSocketState.js","sourceRoot":"","sources":["../../../src/core/socket/useSocketState.ts"],"names":[],"mappings":"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"}
|
package/dist/reducers/index.d.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
__reset?: boolean |
|
|
3
|
-
|
|
4
|
-
}
|
|
1
|
+
type ReducerDataActions<T> = Partial<T> & {
|
|
2
|
+
__reset?: boolean | Partial<T>;
|
|
3
|
+
};
|
|
5
4
|
export declare const Reducer: <T>(state: T, data: ReducerDataActions<T>) => T;
|
|
6
5
|
export {};
|
|
7
6
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/reducers/index.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/reducers/index.ts"],"names":[],"mappings":"AAAA,KAAK,kBAAkB,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG;IACtC,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CAClC,CAAC;AAEF,eAAO,MAAM,OAAO,GAAI,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,kBAAkB,CAAC,CAAC,CAAC,KAAG,CAOlE,CAAC"}
|
package/dist/reducers/index.js
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
export const Reducer = (state, data) => {
|
|
2
|
+
if (data === undefined)
|
|
3
|
+
return undefined;
|
|
4
|
+
if (data === null)
|
|
5
|
+
return null;
|
|
2
6
|
if (data.__reset) {
|
|
3
|
-
|
|
4
|
-
return typeof data.__reset === 'boolean' ? { __reset: undefined } : { ...data.__reset };
|
|
7
|
+
return typeof data.__reset === 'boolean' ? { __reset: undefined } : data.__reset;
|
|
5
8
|
}
|
|
6
9
|
return { ...state, ...data };
|
|
7
10
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/reducers/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/reducers/index.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,MAAM,OAAO,GAAG,CAAI,KAAQ,EAAE,IAA2B,EAAK,EAAE;IACnE,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAc,CAAC;IAC9C,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,IAAS,CAAC;IACpC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,OAAO,OAAO,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,EAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAY,CAAC;IAC/F,CAAC;IACD,OAAO,EAAE,GAAG,KAAK,EAAE,GAAG,IAAI,EAAO,CAAC;AACtC,CAAC,CAAC"}
|