@myrjfa/state 1.0.6 → 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.
- package/dist/index.d.ts +9 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -4
- package/dist/lib/QueryProvider.d.ts +1 -1
- package/dist/lib/QueryProvider.d.ts.map +1 -1
- package/dist/lib/actions/actions.d.ts +141 -0
- package/dist/lib/actions/actions.d.ts.map +1 -0
- package/dist/lib/actions/actions.js +307 -0
- package/dist/lib/actions/auth.d.ts +150 -0
- package/dist/lib/actions/auth.d.ts.map +1 -0
- package/dist/lib/actions/auth.js +125 -0
- package/dist/lib/actions/chat.d.ts +48 -0
- package/dist/lib/actions/chat.d.ts.map +1 -0
- package/dist/lib/actions/chat.js +303 -0
- package/dist/lib/actions/fetcher.d.ts +9 -0
- package/dist/lib/actions/fetcher.d.ts.map +1 -0
- package/dist/lib/actions/fetcher.js +84 -0
- package/dist/lib/actions/severActions.d.ts +3 -0
- package/dist/lib/actions/severActions.d.ts.map +1 -0
- package/dist/lib/actions/severActions.js +19 -0
- package/dist/lib/actions/socket.d.ts +7 -0
- package/dist/lib/actions/socket.d.ts.map +1 -0
- package/dist/lib/actions/socket.js +22 -0
- package/dist/lib/actions.d.ts +3 -3
- package/dist/lib/actions.d.ts.map +1 -1
- package/dist/lib/actions.js +2 -2
- package/dist/lib/authSessionManager.js +1 -1
- package/dist/lib/context/ChatContext.d.ts +25 -0
- package/dist/lib/context/ChatContext.d.ts.map +1 -0
- package/dist/lib/context/ChatContext.js +229 -0
- package/dist/lib/data/countryStates.d.ts +8 -0
- package/dist/lib/data/countryStates.d.ts.map +1 -1
- package/dist/lib/data/countryStates.js +24 -0
- package/dist/lib/hooks/useChatSocket.d.ts +6 -0
- package/dist/lib/hooks/useChatSocket.d.ts.map +1 -0
- package/dist/lib/hooks/useChatSocket.js +35 -0
- package/dist/lib/models/application.d.ts +1 -0
- package/dist/lib/models/application.d.ts.map +1 -1
- package/dist/lib/models/blog.d.ts +4 -4
- package/dist/lib/models/chat.d.ts +122 -0
- package/dist/lib/models/chat.d.ts.map +1 -0
- package/dist/lib/models/chat.js +1 -0
- package/dist/lib/models/opportunities/freelance.d.ts +499 -0
- package/dist/lib/models/opportunities/freelance.d.ts.map +1 -0
- package/dist/lib/models/opportunities/freelance.js +12 -0
- package/dist/lib/models/opportunities/internship.d.ts +476 -0
- package/dist/lib/models/opportunities/internship.d.ts.map +1 -0
- package/dist/lib/models/opportunities/internship.js +7 -0
- package/dist/lib/models/opportunities/job.d.ts +612 -0
- package/dist/lib/models/opportunities/job.d.ts.map +1 -0
- package/dist/lib/models/opportunities/job.js +26 -0
- package/dist/lib/models/opportunities/opportunity.d.ts +582 -0
- package/dist/lib/models/opportunities/opportunity.d.ts.map +1 -0
- package/dist/lib/models/opportunities/opportunity.js +227 -0
- package/dist/lib/models/opportunities/volunteerJob.d.ts +453 -0
- package/dist/lib/models/opportunities/volunteerJob.d.ts.map +1 -0
- package/dist/lib/models/opportunities/volunteerJob.js +5 -0
- package/dist/lib/models/portfolio.d.ts +2 -2
- package/dist/lib/models/props.d.ts.map +1 -1
- package/dist/lib/models/props.js +1 -0
- package/dist/lib/models/tile.d.ts +3 -0
- package/dist/lib/models/tile.d.ts.map +1 -1
- package/dist/lib/socket.d.ts +7 -0
- package/dist/lib/socket.d.ts.map +1 -0
- package/dist/lib/socket.js +22 -0
- package/dist/lib/userAtom.js +2 -2
- package/package.json +4 -2
|
@@ -1 +1 @@
|
|
|
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,
|
|
1
|
+
{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../src/lib/actions.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/actions.js
CHANGED
|
@@ -13,11 +13,11 @@ export async function getCurrentUser() {
|
|
|
13
13
|
return null;
|
|
14
14
|
}
|
|
15
15
|
}
|
|
16
|
-
export async function userDetails(
|
|
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}/${
|
|
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
|
+
}
|
|
@@ -20,4 +20,12 @@ export declare function searchStatesOfCountry(countryName: string, query: string
|
|
|
20
20
|
export declare function getCurrencies(): string[];
|
|
21
21
|
export declare function getCurrency(countryName: string): string | null;
|
|
22
22
|
export declare function getCountiesByCurrency(currencyName: string): string[];
|
|
23
|
+
/**
|
|
24
|
+
* Converts a price from one currency to another.
|
|
25
|
+
* @param amount - The amount to convert
|
|
26
|
+
* @param fromCurrency - The source currency code
|
|
27
|
+
* @param toCurrency - The target currency code
|
|
28
|
+
* @returns The converted amount
|
|
29
|
+
*/
|
|
30
|
+
export declare function convertCurrency(amount: number, fromCurrency: string, toCurrency: string | undefined): number;
|
|
23
31
|
//# sourceMappingURL=countryStates.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"countryStates.d.ts","sourceRoot":"","sources":["../../../src/lib/data/countryStates.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,OAAO;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,SAAS,EAAE,OAAO,EAo4N9B,CAAA;AAED,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAGrB,CAAC;AAElC,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAGrB,CAAC;AAGnC,wBAAgB,YAAY,IAAI,OAAO,EAAE,CAExC;AAED,wBAAgB,eAAe,IAAI,MAAM,EAAE,CAE1C;AAED,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAEvD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAElE;AAED,wBAAgB,oBAAoB,IAAI,MAAM,EAAE,CAE/C;AAED,wBAAgB,0BAA0B,IAAI,MAAM,EAAE,CAErD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAElE;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,EAAE,CAKxD;AAED,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAMlF;AAED,wBAAgB,aAAa,IAAI,MAAM,EAAE,CAExC;AAED,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAE9D;AAED,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,CAEpE"}
|
|
1
|
+
{"version":3,"file":"countryStates.d.ts","sourceRoot":"","sources":["../../../src/lib/data/countryStates.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,OAAO;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,SAAS,EAAE,OAAO,EAo4N9B,CAAA;AAED,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAGrB,CAAC;AAElC,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAGrB,CAAC;AAGnC,wBAAgB,YAAY,IAAI,OAAO,EAAE,CAExC;AAED,wBAAgB,eAAe,IAAI,MAAM,EAAE,CAE1C;AAED,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAEvD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAElE;AAED,wBAAgB,oBAAoB,IAAI,MAAM,EAAE,CAE/C;AAED,wBAAgB,0BAA0B,IAAI,MAAM,EAAE,CAErD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAElE;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,EAAE,CAKxD;AAED,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAMlF;AAED,wBAAgB,aAAa,IAAI,MAAM,EAAE,CAExC;AAED,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAE9D;AAED,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,CAEpE;AASD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAY5G"}
|
|
@@ -7091,3 +7091,27 @@ export function getCurrency(countryName) {
|
|
|
7091
7091
|
export function getCountiesByCurrency(currencyName) {
|
|
7092
7092
|
return COUNTRIES.filter(country => country.currency == currencyName).map(country => country.name);
|
|
7093
7093
|
}
|
|
7094
|
+
const exchangeRates = {
|
|
7095
|
+
'inr': 1,
|
|
7096
|
+
'usd': 90,
|
|
7097
|
+
'eur': 109,
|
|
7098
|
+
'gbp': 120,
|
|
7099
|
+
};
|
|
7100
|
+
/**
|
|
7101
|
+
* Converts a price from one currency to another.
|
|
7102
|
+
* @param amount - The amount to convert
|
|
7103
|
+
* @param fromCurrency - The source currency code
|
|
7104
|
+
* @param toCurrency - The target currency code
|
|
7105
|
+
* @returns The converted amount
|
|
7106
|
+
*/
|
|
7107
|
+
export function convertCurrency(amount, fromCurrency, toCurrency) {
|
|
7108
|
+
const from = fromCurrency?.toLowerCase() || 'inr';
|
|
7109
|
+
const to = toCurrency?.toLowerCase() || 'inr';
|
|
7110
|
+
// If same currency or invalid, return original amount
|
|
7111
|
+
if (from === to || !from)
|
|
7112
|
+
return amount;
|
|
7113
|
+
const fromRate = exchangeRates[from] || 1;
|
|
7114
|
+
const toRate = exchangeRates[to] || 1;
|
|
7115
|
+
// Convert: amount in 'from' currency -> INR -> 'to' currency
|
|
7116
|
+
return (amount * fromRate) / toRate;
|
|
7117
|
+
}
|
|
@@ -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
|
+
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"application.d.ts","sourceRoot":"","sources":["../../../src/lib/models/application.ts"],"names":[],"mappings":"AACA,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,eAAe,GAAG,UAAU,GAAG,WAAW,GAAG,QAAQ,CAAC;AAElG,MAAM,WAAW,WAAW;IACxB,GAAG,EAAE,MAAM,CAAC;IAEZ,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IAEjB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,gBAAgB,EAAE,WAAW,EAiIzC,CAAC"}
|
|
1
|
+
{"version":3,"file":"application.d.ts","sourceRoot":"","sources":["../../../src/lib/models/application.ts"],"names":[],"mappings":"AACA,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,eAAe,GAAG,UAAU,GAAG,WAAW,GAAG,QAAQ,CAAC;AAElG,MAAM,WAAW,WAAW;IACxB,GAAG,EAAE,MAAM,CAAC;IAEZ,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,WAAW,GAAG,KAAK,GAAG,YAAY,GAAG,WAAW,CAAC;IACnE,QAAQ,EAAE,MAAM,CAAC;IAEjB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,gBAAgB,EAAE,WAAW,EAiIzC,CAAC"}
|
|
@@ -24,13 +24,13 @@ export declare const BlogSchema: z.ZodObject<{
|
|
|
24
24
|
createdAt: Date;
|
|
25
25
|
updatedAt: Date;
|
|
26
26
|
slug: string;
|
|
27
|
+
views: number;
|
|
28
|
+
shares: number;
|
|
27
29
|
overview: string;
|
|
28
30
|
content: string;
|
|
29
31
|
blogImages: string[];
|
|
30
|
-
views: number;
|
|
31
32
|
likes: number;
|
|
32
33
|
comments: number;
|
|
33
|
-
shares: number;
|
|
34
34
|
author: string;
|
|
35
35
|
authorImage: string;
|
|
36
36
|
authorRole: "host" | "user" | "admin";
|
|
@@ -41,13 +41,13 @@ export declare const BlogSchema: z.ZodObject<{
|
|
|
41
41
|
createdAt: Date;
|
|
42
42
|
updatedAt: Date;
|
|
43
43
|
slug: string;
|
|
44
|
+
views: number;
|
|
45
|
+
shares: number;
|
|
44
46
|
overview: string;
|
|
45
47
|
content: string;
|
|
46
48
|
blogImages: string[];
|
|
47
|
-
views: number;
|
|
48
49
|
likes: number;
|
|
49
50
|
comments: number;
|
|
50
|
-
shares: number;
|
|
51
51
|
author: string;
|
|
52
52
|
authorImage: string;
|
|
53
53
|
authorRole: "host" | "user" | "admin";
|
|
@@ -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":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,MAAM,WAAW,WAAW;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC7B,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,aAAa,EAAE,KAAK,GAAG,UAAU,GAAG,MAAM,CAAC;CAC9C;AAED,MAAM,WAAW,oBAAoB;IACjC,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,QAAQ,CAAC,EAAE;QACP,IAAI,EAAE,aAAa,GAAG,eAAe,CAAC;QACtC,QAAQ,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,WAAW,CAAC,EAAE;QACV,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,UAAU,CAAC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;CAC3C;AAED,MAAM,WAAW,QAAQ;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,OAAO;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU,CAAC;IACtG,OAAO,EAAE,cAAc,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,eAAe,GACrB,MAAM,GACN,WAAW,GACX,eAAe,GACf,UAAU,GACV,UAAU,GACV,OAAO,CAAC;AAEd,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,YAAY,GAAG,QAAQ,CAAC;AAEpE,MAAM,WAAW,YAAY;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,OAAO;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,eAAe,CAAC;IAC1B,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACrB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|