@myrjfa/state 1.0.7 → 1.0.8

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.
Files changed (43) hide show
  1. package/dist/index.d.ts +9 -4
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +9 -4
  4. package/dist/lib/QueryProvider.d.ts +1 -1
  5. package/dist/lib/QueryProvider.d.ts.map +1 -1
  6. package/dist/lib/actions/actions.d.ts +141 -0
  7. package/dist/lib/actions/actions.d.ts.map +1 -0
  8. package/dist/lib/actions/actions.js +307 -0
  9. package/dist/lib/actions/auth.d.ts +150 -0
  10. package/dist/lib/actions/auth.d.ts.map +1 -0
  11. package/dist/lib/actions/auth.js +125 -0
  12. package/dist/lib/actions/chat.d.ts +48 -0
  13. package/dist/lib/actions/chat.d.ts.map +1 -0
  14. package/dist/lib/actions/chat.js +303 -0
  15. package/dist/lib/actions/fetcher.d.ts +9 -0
  16. package/dist/lib/actions/fetcher.d.ts.map +1 -0
  17. package/dist/lib/actions/fetcher.js +84 -0
  18. package/dist/lib/actions/severActions.d.ts +3 -0
  19. package/dist/lib/actions/severActions.d.ts.map +1 -0
  20. package/dist/lib/actions/severActions.js +19 -0
  21. package/dist/lib/actions/socket.d.ts +7 -0
  22. package/dist/lib/actions/socket.d.ts.map +1 -0
  23. package/dist/lib/actions/socket.js +22 -0
  24. package/dist/lib/actions.d.ts +3 -3
  25. package/dist/lib/actions.d.ts.map +1 -1
  26. package/dist/lib/actions.js +2 -2
  27. package/dist/lib/authSessionManager.js +1 -1
  28. package/dist/lib/context/ChatContext.d.ts +25 -0
  29. package/dist/lib/context/ChatContext.d.ts.map +1 -0
  30. package/dist/lib/context/ChatContext.js +229 -0
  31. package/dist/lib/hooks/useChatSocket.d.ts +6 -0
  32. package/dist/lib/hooks/useChatSocket.d.ts.map +1 -0
  33. package/dist/lib/hooks/useChatSocket.js +35 -0
  34. package/dist/lib/models/chat.d.ts +122 -0
  35. package/dist/lib/models/chat.d.ts.map +1 -0
  36. package/dist/lib/models/chat.js +1 -0
  37. package/dist/lib/models/props.d.ts.map +1 -1
  38. package/dist/lib/models/props.js +1 -0
  39. package/dist/lib/socket.d.ts +7 -0
  40. package/dist/lib/socket.d.ts.map +1 -0
  41. package/dist/lib/socket.js +22 -0
  42. package/dist/lib/userAtom.js +2 -2
  43. package/package.json +4 -2
@@ -1 +1 @@
1
- {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../src/lib/actions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../src/lib/actions.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAKrC,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAU3D;AAED,wBAAsB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAcrL;AAED,wBAAsB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAY1H;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAa9J;AAGD,wBAAsB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAY3H;AAED,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAY9J;AAGD,wBAAsB,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAA;CAAE,CAAC,CAcnI;AAED,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;CAAE,CAAC,CAiB1M;AAGD,wBAAsB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAkB3J;AAED,wBAAsB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,gBAAgB,GACpE,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAAE,CAAC,CA2BzJ;AAED,wBAAsB,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,UAAU,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAiBhL;AAED,wBAAsB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAiBzJ;AAED,wBAAsB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAe9G;AAGD,wBAAsB,mBAAmB;;;;;;;;;;;;;;;;;;;GAmBxC;AAED,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM;;;;;;;;;;;;;;;;;;;GAmBnD;AAED,wBAAsB,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO;;;;;;;;GAejE;AAED,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,OAAO;;;;;;;;GAexD"}
@@ -13,11 +13,11 @@ export async function getCurrentUser() {
13
13
  return null;
14
14
  }
15
15
  }
16
- export async function userDetails(username, role) {
16
+ export async function userDetails(query, role) {
17
17
  try {
18
18
  if (role == "admin")
19
19
  role = "user";
20
- const endpoint = `/${role}s/other-${role}/${username}`;
20
+ const endpoint = `/${role}s/other-${role}/${query}`;
21
21
  const data = await get(endpoint);
22
22
  return {
23
23
  success: true,
@@ -3,7 +3,7 @@ import { useAtom } from 'jotai'; // Import useSetAtom
3
3
  import { useEffect } from 'react';
4
4
  import { useQuery } from '@tanstack/react-query';
5
5
  import { initializeAuthSessionAtom, resetAuthState } from './userAtom'; // Import the atom itself
6
- import { validateSession } from './auth';
6
+ import { validateSession } from './actions/auth';
7
7
  export default function AuthSessionManager() {
8
8
  const [, initializeAuthSession] = useAtom(initializeAuthSessionAtom);
9
9
  // --- Initial Session Load ---
@@ -0,0 +1,25 @@
1
+ import React from "react";
2
+ import type { Socket } from "socket.io-client";
3
+ import type { Conversation, Message } from "../models/chat";
4
+ interface ChatContextType {
5
+ socket: Socket | null;
6
+ isConnected: boolean;
7
+ conversations: Conversation[];
8
+ activeConversation: Conversation | null;
9
+ setActiveConversation: (conv: Conversation | null) => void;
10
+ messages: Message[];
11
+ setMessages: React.Dispatch<React.SetStateAction<Message[]>>;
12
+ typingUsers: Map<string, string[]>;
13
+ onlineUsers: Set<string>;
14
+ refreshConversations: () => Promise<void>;
15
+ sendMessage: (conversationId: string, text: string, files?: File[], replyTo?: string) => Promise<void>;
16
+ editMessage: (messageId: string, text: string) => void;
17
+ addMessageReaction: (messageId: string, reaction: string) => void;
18
+ deleteMessage: (messageId: string) => void;
19
+ }
20
+ export declare function useChatContext(): ChatContextType;
21
+ export declare function ChatProvider({ children }: {
22
+ children: React.ReactNode;
23
+ }): import("react/jsx-runtime").JSX.Element;
24
+ export {};
25
+ //# sourceMappingURL=ChatContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatContext.d.ts","sourceRoot":"","sources":["../../../src/lib/context/ChatContext.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA8E,MAAM,OAAO,CAAC;AACnG,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAK5D,UAAU,eAAe;IACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,kBAAkB,EAAE,YAAY,GAAG,IAAI,CAAC;IACxC,qBAAqB,EAAE,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,KAAK,IAAI,CAAC;IAC3D,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAC7D,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACnC,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,oBAAoB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,WAAW,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvG,WAAW,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACvD,kBAAkB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAClE,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C;AAmBD,wBAAgB,cAAc,oBAE7B;AAED,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,2CA8OvE"}
@@ -0,0 +1,229 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { createContext, useContext, useEffect, useState, useCallback, useRef } from "react";
4
+ import { getSocket } from "../actions/socket";
5
+ import { chatApi } from "../actions/chat";
6
+ import { useAtomValue } from "jotai";
7
+ import { userAtom } from "../userAtom";
8
+ const ChatContext = createContext({
9
+ socket: null,
10
+ isConnected: false,
11
+ conversations: [],
12
+ activeConversation: null,
13
+ setActiveConversation: () => { },
14
+ messages: [],
15
+ setMessages: () => { },
16
+ typingUsers: new Map(),
17
+ onlineUsers: new Set(),
18
+ refreshConversations: async () => { },
19
+ sendMessage: async () => { },
20
+ editMessage: () => { },
21
+ addMessageReaction: () => { },
22
+ deleteMessage: () => { },
23
+ });
24
+ export function useChatContext() {
25
+ return useContext(ChatContext);
26
+ }
27
+ export function ChatProvider({ children }) {
28
+ const user = useAtomValue(userAtom);
29
+ const [isConnected, setIsConnected] = useState(false);
30
+ const [conversations, setConversations] = useState([]);
31
+ const [activeConversation, setActiveConversation] = useState(null);
32
+ const activeConversationRef = useRef(null);
33
+ const [messages, setMessages] = useState([]);
34
+ const [typingUsers, setTypingUsers] = useState(new Map());
35
+ const [onlineUsers, setOnlineUsers] = useState(new Set());
36
+ const socketRef = useRef(null);
37
+ // If user changes, we might want to reset state?
38
+ // For now, let's assume component remounts on logout.
39
+ useEffect(() => {
40
+ activeConversationRef.current = activeConversation;
41
+ }, [activeConversation]);
42
+ const refreshConversations = useCallback(async () => {
43
+ try {
44
+ const data = await chatApi.getConversations();
45
+ setConversations(data);
46
+ }
47
+ catch (err) {
48
+ console.error("Failed to fetch conversations:", err);
49
+ }
50
+ }, []);
51
+ const sendMessage = useCallback(async (conversationId, text, files, replyTo) => {
52
+ if (!socketRef.current)
53
+ return;
54
+ let media = [];
55
+ if (files && files.length > 0) {
56
+ // Upload files first
57
+ const formData = new FormData();
58
+ files.forEach(f => formData.append("chatFiles", f));
59
+ try {
60
+ // We need a dedicated upload endpoint.
61
+ // For now, let's assume /api/v1/chat/upload
62
+ const response = await chatApi.uploadFiles(formData);
63
+ if (response.error) {
64
+ console.error("File upload failed:", response.error);
65
+ return;
66
+ }
67
+ media = response.data.files.map((f) => ({
68
+ type: f.mimetype.startsWith("image") ? "image" : "file",
69
+ url: f.location,
70
+ name: f.originalname
71
+ }));
72
+ }
73
+ catch (err) {
74
+ console.error("File upload failed:", err);
75
+ }
76
+ }
77
+ socketRef.current.emit("message:send", {
78
+ conversationId,
79
+ content: { text, media },
80
+ type: media.length > 0 ? "media" : "text",
81
+ replyTo,
82
+ });
83
+ }, []);
84
+ const editMessage = useCallback((messageId, text) => {
85
+ if (!socketRef.current)
86
+ return;
87
+ socketRef.current.emit("message:edit", { messageId, text });
88
+ }, []);
89
+ const addMessageReaction = useCallback((messageId, reaction) => {
90
+ if (!socketRef.current)
91
+ return;
92
+ console.log("reaction:", reaction);
93
+ socketRef.current.emit("message:react", { messageId, reaction });
94
+ }, []);
95
+ const deleteMessage = useCallback((messageId) => {
96
+ if (!socketRef.current)
97
+ return;
98
+ socketRef.current.emit("message:delete", { messageId });
99
+ }, []);
100
+ useEffect(() => {
101
+ if (!user) {
102
+ setIsConnected(false);
103
+ setConversations([]);
104
+ return;
105
+ }
106
+ const socket = getSocket();
107
+ socketRef.current = socket;
108
+ function onConnect() {
109
+ setIsConnected(true);
110
+ refreshConversations();
111
+ }
112
+ function onDisconnect() {
113
+ setIsConnected(false);
114
+ }
115
+ socket.on("connect", onConnect);
116
+ socket.on("disconnect", onDisconnect);
117
+ if (!socket.connected) {
118
+ socket.connect();
119
+ }
120
+ else {
121
+ // Include logic for if already connected
122
+ onConnect();
123
+ }
124
+ // New message
125
+ socket.on("message:new", ({ conversationId, message }) => {
126
+ setMessages((prev) => {
127
+ const currentActiveId = activeConversationRef.current?._id;
128
+ // If we have messages, check if they belong to this conversation
129
+ // OR if we have no messages, check if this is the active conversation
130
+ if ((prev.length > 0 && prev[0]?.conversationId === conversationId) ||
131
+ (prev.length === 0 && currentActiveId === conversationId)) {
132
+ // Deduplicate
133
+ if (prev.some((m) => m._id === message._id))
134
+ return prev;
135
+ return [...prev, message];
136
+ }
137
+ return prev;
138
+ });
139
+ // Update conversations last message
140
+ setConversations((prev) => prev
141
+ .map((c) => c._id === conversationId
142
+ ? {
143
+ ...c,
144
+ lastMessage: {
145
+ content: message.content?.text || `[${message.type}]`,
146
+ senderId: message.senderId,
147
+ sentAt: message.createdAt,
148
+ },
149
+ updatedAt: message.createdAt,
150
+ }
151
+ : c)
152
+ .sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime()));
153
+ });
154
+ // Message updated
155
+ socket.on("message:updated", ({ message }) => {
156
+ setMessages((prev) => prev.map((m) => (m._id === message._id ? message : m)));
157
+ });
158
+ // Message deleted
159
+ socket.on("message:deleted", ({ messageId }) => {
160
+ setMessages((prev) => prev.filter((m) => m._id !== messageId));
161
+ });
162
+ // Typing indicators
163
+ socket.on("typing:start", ({ conversationId, userId }) => {
164
+ setTypingUsers((prev) => {
165
+ const next = new Map(prev);
166
+ const users = next.get(conversationId) || [];
167
+ if (!users.includes(userId)) {
168
+ next.set(conversationId, [...users, userId]);
169
+ }
170
+ return next;
171
+ });
172
+ });
173
+ socket.on("typing:stop", ({ conversationId, userId }) => {
174
+ setTypingUsers((prev) => {
175
+ const next = new Map(prev);
176
+ const users = next.get(conversationId) || [];
177
+ next.set(conversationId, users.filter((u) => u !== userId));
178
+ return next;
179
+ });
180
+ });
181
+ // Online/offline
182
+ socket.on("presence:online", ({ userId }) => {
183
+ setOnlineUsers((prev) => new Set(prev).add(userId));
184
+ });
185
+ socket.on("presence:offline", ({ userId }) => {
186
+ setOnlineUsers((prev) => {
187
+ const next = new Set(prev);
188
+ next.delete(userId);
189
+ return next;
190
+ });
191
+ });
192
+ return () => {
193
+ socket.off("connect", onConnect);
194
+ socket.off("disconnect", onDisconnect);
195
+ socket.off("message:new");
196
+ socket.off("message:updated");
197
+ socket.off("message:deleted");
198
+ socket.off("typing:start");
199
+ socket.off("typing:stop");
200
+ socket.off("presence:online");
201
+ socket.off("presence:offline");
202
+ // Disconnect on unmount? Maybe not if shared across pages.
203
+ // But if specific to chat...
204
+ // For shared state lib, we might want to keep it open?
205
+ // If user navigates away from chat pages, maybe close it?
206
+ // The original logic disconnected on unmount.
207
+ // But if we want global notifications (unread count), we need it open.
208
+ // Let's keep it open but manage listeners.
209
+ // Actually, if we unmount the provider, we should disconnect or remove listeners.
210
+ // Assuming this Provider wraps only Chat pages.
211
+ };
212
+ }, [user, refreshConversations]);
213
+ return (_jsx(ChatContext.Provider, { value: {
214
+ socket: socketRef.current,
215
+ isConnected,
216
+ conversations,
217
+ activeConversation,
218
+ setActiveConversation,
219
+ messages,
220
+ setMessages,
221
+ typingUsers,
222
+ onlineUsers,
223
+ refreshConversations,
224
+ sendMessage,
225
+ editMessage,
226
+ addMessageReaction,
227
+ deleteMessage
228
+ }, children: children }));
229
+ }
@@ -0,0 +1,6 @@
1
+ import type { Socket } from "socket.io-client";
2
+ export declare const useChatSocket: () => {
3
+ socket: Socket | null;
4
+ isConnected: boolean;
5
+ };
6
+ //# sourceMappingURL=useChatSocket.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useChatSocket.d.ts","sourceRoot":"","sources":["../../../src/lib/hooks/useChatSocket.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE/C,eAAO,MAAM,aAAa,QAAO;IAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAuC7E,CAAC"}
@@ -0,0 +1,35 @@
1
+ import { useEffect } from "react";
2
+ import { useAtom, useAtomValue } from "jotai";
3
+ import { getSocket, socketAtom, isConnectedAtom, disconnectSocket } from "../actions/socket";
4
+ import { userAtom } from "../userAtom";
5
+ export const useChatSocket = () => {
6
+ const user = useAtomValue(userAtom);
7
+ const [socket, setSocket] = useAtom(socketAtom);
8
+ const [isConnected, setIsConnected] = useAtom(isConnectedAtom);
9
+ useEffect(() => {
10
+ if (!user) {
11
+ disconnectSocket();
12
+ setSocket(null);
13
+ setIsConnected(false);
14
+ return;
15
+ }
16
+ const socketInstance = getSocket();
17
+ function onConnect() {
18
+ setIsConnected(true);
19
+ }
20
+ function onDisconnect() {
21
+ setIsConnected(false);
22
+ }
23
+ socketInstance.on("connect", onConnect);
24
+ socketInstance.on("disconnect", onDisconnect);
25
+ if (!socketInstance.connected) {
26
+ socketInstance.connect();
27
+ }
28
+ setSocket(socketInstance);
29
+ return () => {
30
+ socketInstance.off("connect", onConnect);
31
+ socketInstance.off("disconnect", onDisconnect);
32
+ };
33
+ }, [user, setSocket, setIsConnected]);
34
+ return { socket, isConnected };
35
+ };
@@ -0,0 +1,122 @@
1
+ import { UserRole } from "./props";
2
+ export interface Participant {
3
+ userId: string;
4
+ chatRole: "admin" | "member";
5
+ role: UserRole;
6
+ profilePic?: string;
7
+ joinedAt: string;
8
+ lastReadMessageId?: string;
9
+ notifications: "all" | "mentions" | "none";
10
+ }
11
+ export interface ConversationFeatures {
12
+ milestones: boolean;
13
+ expenses: boolean;
14
+ }
15
+ export interface Conversation {
16
+ _id: string;
17
+ type: "individual" | "group";
18
+ name?: string;
19
+ description?: string;
20
+ image?: string;
21
+ participants: Participant[];
22
+ features: ConversationFeatures;
23
+ linkedTo?: {
24
+ type: "opportunity" | "travelPackage";
25
+ entityId: string;
26
+ };
27
+ lastMessage?: {
28
+ content: string;
29
+ senderId: string;
30
+ sentAt: string;
31
+ };
32
+ createdBy: string;
33
+ createdAt: string;
34
+ updatedAt: string;
35
+ }
36
+ export interface MediaItem {
37
+ url: string;
38
+ type: "image" | "video" | "document";
39
+ name: string;
40
+ size: number;
41
+ }
42
+ export interface MessageContent {
43
+ text?: string;
44
+ media?: MediaItem[];
45
+ referenceId?: string;
46
+ referenceType?: "milestone" | "expense";
47
+ }
48
+ export interface Reaction {
49
+ userId: string;
50
+ emoji: string;
51
+ createdAt: string;
52
+ }
53
+ export interface ReadReceipt {
54
+ userId: string;
55
+ readAt: string;
56
+ }
57
+ export interface Message {
58
+ _id: string;
59
+ conversationId: string;
60
+ senderId: string;
61
+ type: "text" | "image" | "file" | "media" | "milestone" | "expense" | "system" | "audio" | "location";
62
+ content: MessageContent;
63
+ replyTo?: Message;
64
+ reactions: Reaction[];
65
+ readBy: ReadReceipt[];
66
+ isEdited: boolean;
67
+ isDeleted: boolean;
68
+ createdAt: string;
69
+ updatedAt: string;
70
+ }
71
+ export interface MilestoneCheck {
72
+ userId: string;
73
+ checkedAt: string;
74
+ note?: string;
75
+ }
76
+ export interface Milestone {
77
+ _id: string;
78
+ conversationId: string;
79
+ title: string;
80
+ description?: string;
81
+ section?: string;
82
+ order: number;
83
+ checks: MilestoneCheck[];
84
+ isCompleted: boolean;
85
+ completedAt?: string;
86
+ createdBy: string;
87
+ createdAt: string;
88
+ updatedAt: string;
89
+ }
90
+ export type ExpenseCategory = "food" | "transport" | "accommodation" | "activity" | "shopping" | "other";
91
+ export type SplitType = "equal" | "exact" | "percentage" | "shares";
92
+ export interface ExpensePayer {
93
+ userId: string;
94
+ amount: number;
95
+ }
96
+ export interface ExpenseSplit {
97
+ userId: string;
98
+ amount: number;
99
+ shares?: number;
100
+ percentage?: number;
101
+ isPaid: boolean;
102
+ paidAt?: string;
103
+ }
104
+ export interface Expense {
105
+ _id: string;
106
+ conversationId: string;
107
+ title: string;
108
+ description?: string;
109
+ amount: number;
110
+ currency: string;
111
+ category: ExpenseCategory;
112
+ paidBy: ExpensePayer[];
113
+ splitType: SplitType;
114
+ splits: ExpenseSplit[];
115
+ receipt?: string;
116
+ location?: string;
117
+ date: string;
118
+ createdBy: string;
119
+ createdAt: string;
120
+ updatedAt: string;
121
+ }
122
+ //# sourceMappingURL=chat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../../src/lib/models/chat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -1 +1 @@
1
- {"version":3,"file":"props.d.ts","sourceRoot":"","sources":["../../../src/lib/models/props.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,cAAc;;;;;;;;;EAGhB,CAAC;AAEZ,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAEtD,MAAM,WAAW,QAAQ;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAGD,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAEjD,eAAO,MAAM,UAAU;;;GA8BtB,CAAC;AAEF,eAAO,MAAM,aAAa;;GA+FzB,CAAC;AAEF,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,YAAY,qCAAqC,CAAA"}
1
+ {"version":3,"file":"props.d.ts","sourceRoot":"","sources":["../../../src/lib/models/props.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,cAAc;;;;;;;;;EAGhB,CAAC;AAEZ,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAEtD,MAAM,WAAW,QAAQ;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAGD,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAEjD,eAAO,MAAM,UAAU;;;GA8BtB,CAAC;AAEF,eAAO,MAAM,aAAa;;GA+FzB,CAAC;AAEF,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,YAAY,qCAAqC,CAAA"}
@@ -1,3 +1,4 @@
1
+ // @ts-nocheck
1
2
  import { Badge, BarChart, BookOpen, Box, Brain, Brush, Camera, Code, Cuboid, Film, Instagram, Layout, Link, Mail, Mic, Move, Music, Paintbrush, Palette, PenTool, Search, ShoppingCart, Target, Type, UserCheck, Users, Video, Workflow, Zap } from "lucide-react";
2
3
  import { z } from "zod";
3
4
  export const QuestionSchema = z.object({
@@ -0,0 +1,7 @@
1
+ import { Socket } from "socket.io-client";
2
+ import { type PrimitiveAtom } from "jotai";
3
+ export declare const socketAtom: PrimitiveAtom<Socket | null>;
4
+ export declare const isConnectedAtom: PrimitiveAtom<boolean>;
5
+ export declare const getSocket: () => Socket;
6
+ export declare const disconnectSocket: () => void;
7
+ //# sourceMappingURL=socket.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"socket.d.ts","sourceRoot":"","sources":["../../src/lib/socket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAM,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAQ,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAMjD,eAAO,MAAM,UAAU,EAAE,aAAa,CAAC,MAAM,GAAG,IAAI,CAA6B,CAAC;AAClF,eAAO,MAAM,eAAe,EAAE,aAAa,CAAC,OAAO,CAAwB,CAAC;AAE5E,eAAO,MAAM,SAAS,QAAO,MAS5B,CAAC;AAEF,eAAO,MAAM,gBAAgB,YAK5B,CAAA"}
@@ -0,0 +1,22 @@
1
+ import { io } from "socket.io-client";
2
+ import { atom } from "jotai";
3
+ const SOCKET_URL = process.env.NEXT_PUBLIC_BACKEND_URL || "http://localhost:8000";
4
+ let socket = null;
5
+ export const socketAtom = atom(null);
6
+ export const isConnectedAtom = atom(false);
7
+ export const getSocket = () => {
8
+ if (!socket) {
9
+ socket = io(SOCKET_URL, {
10
+ autoConnect: false,
11
+ withCredentials: true,
12
+ transports: ["websocket", "polling"],
13
+ });
14
+ }
15
+ return socket;
16
+ };
17
+ export const disconnectSocket = () => {
18
+ if (socket?.connected) {
19
+ socket.disconnect();
20
+ }
21
+ socket = null;
22
+ };
@@ -2,8 +2,8 @@
2
2
  import CryptoJS from 'crypto-js';
3
3
  import { atom, getDefaultStore } from 'jotai';
4
4
  import { atomWithStorage } from 'jotai/utils';
5
- import { getCurrentUser } from './actions';
6
- import { validateSession } from './auth';
5
+ import { getCurrentUser } from './actions/actions';
6
+ import { validateSession } from './actions/auth';
7
7
  const STORAGE_KEY = process.env.NEXT_PUBLIC_USER_KEY;
8
8
  const LOGIN_KEY = process.env.NEXT_PUBLIC_LOGIN_KEY;
9
9
  const SECRET_KEY = process.env.NEXT_PUBLIC_RACE;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@myrjfa/state",
3
- "version": "1.0.7",
3
+ "version": "1.0.8",
4
4
  "description": "Shared state management for myrjfa apps",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -9,10 +9,12 @@
9
9
  ],
10
10
  "dependencies": {
11
11
  "@tanstack/react-query": "^5.89.0",
12
+ "@types/socket.io-client": "^3.0.0",
12
13
  "cheerio": "^1.0.0",
13
14
  "clsx": "^2.1.1",
14
15
  "crypto-js": "^4.2.0",
15
16
  "he": "^1.2.0",
17
+ "socket.io-client": "^4.8.3",
16
18
  "tailwind-merge": "^3.0.2"
17
19
  },
18
20
  "peerDependencies": {
@@ -28,7 +30,7 @@
28
30
  "@types/crypto-js": "^4.2.2",
29
31
  "@types/he": "^1.2.3",
30
32
  "@types/node": "^22.13.10",
31
- "@types/react": "^19.0.10",
33
+ "@types/react": "19.0.10",
32
34
  "date-fns": "^3.0.0",
33
35
  "jotai": "^2.12.2",
34
36
  "lucide-react": "^0.482.0",