@messenger-box/tailwind-ui-inbox 10.0.3-alpha.72 → 10.0.3-alpha.74
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/CHANGELOG.md +8 -0
- package/lib/components/AIAgent/AIAgent.d.ts +7 -0
- package/lib/components/AIAgent/AIAgent.d.ts.map +1 -1
- package/lib/components/AIAgent/AIAgent.js +362 -615
- package/lib/components/AIAgent/AIAgent.js.map +1 -1
- package/lib/components/InboxMessage/InputComponent.d.ts.map +1 -1
- package/lib/components/InboxMessage/InputComponent.js +143 -140
- package/lib/components/InboxMessage/InputComponent.js.map +1 -1
- package/lib/components/InboxMessage/RightSidebarAi.d.ts +23 -0
- package/lib/components/InboxMessage/RightSidebarAi.d.ts.map +1 -0
- package/lib/components/InboxMessage/RightSidebarAi.js +9 -0
- package/lib/components/InboxMessage/RightSidebarAi.js.map +1 -0
- package/lib/components/InboxMessage/index.d.ts +1 -0
- package/lib/components/InboxMessage/index.d.ts.map +1 -1
- package/lib/components/InboxMessage/message-widgets/ErrorFixCard.d.ts +11 -0
- package/lib/components/InboxMessage/message-widgets/ErrorFixCard.d.ts.map +1 -0
- package/lib/components/InboxMessage/message-widgets/ErrorFixCard.js +194 -0
- package/lib/components/InboxMessage/message-widgets/ErrorFixCard.js.map +1 -0
- package/lib/components/InboxMessage/message-widgets/ModernMessageGroup.d.ts +5 -1
- package/lib/components/InboxMessage/message-widgets/ModernMessageGroup.d.ts.map +1 -1
- package/lib/components/InboxMessage/message-widgets/ModernMessageGroup.js +308 -857
- package/lib/components/InboxMessage/message-widgets/ModernMessageGroup.js.map +1 -1
- package/lib/components/ModelConfigPanel.d.ts +12 -0
- package/lib/components/ModelConfigPanel.d.ts.map +1 -0
- package/lib/components/ModelConfigPanel.js +304 -0
- package/lib/components/ModelConfigPanel.js.map +1 -0
- package/lib/components/filler-components/RightSiderBar.d.ts +24 -0
- package/lib/components/filler-components/RightSiderBar.d.ts.map +1 -0
- package/lib/components/filler-components/RightSiderBar.js +335 -0
- package/lib/components/filler-components/RightSiderBar.js.map +1 -0
- package/lib/components/index.d.ts +4 -2
- package/lib/components/index.d.ts.map +1 -1
- package/lib/components/live-code-editor/hybrid-live-editor.d.ts +20 -0
- package/lib/components/live-code-editor/hybrid-live-editor.d.ts.map +1 -0
- package/lib/components/live-code-editor/hybrid-live-editor.js +68 -0
- package/lib/components/live-code-editor/hybrid-live-editor.js.map +1 -0
- package/lib/components/live-code-editor/index.d.ts +4 -0
- package/lib/components/live-code-editor/index.d.ts.map +1 -0
- package/lib/components/live-code-editor/live-code-editor.d.ts +14 -0
- package/lib/components/live-code-editor/live-code-editor.d.ts.map +1 -0
- package/lib/components/live-code-editor/live-code-editor.js +207 -0
- package/lib/components/live-code-editor/live-code-editor.js.map +1 -0
- package/lib/components/slot-fill/chat-message-filler.js +1 -1
- package/lib/components/slot-fill/chat-message-filler.js.map +1 -1
- package/lib/components/slot-fill/index.d.ts +1 -0
- package/lib/components/slot-fill/index.d.ts.map +1 -1
- package/lib/components/slot-fill/right-sidebar-filler.d.ts +4 -0
- package/lib/components/slot-fill/right-sidebar-filler.d.ts.map +1 -0
- package/lib/components/slot-fill/right-sidebar-filler.js +13 -0
- package/lib/components/slot-fill/right-sidebar-filler.js.map +1 -0
- package/lib/components/ui/button.d.ts +9 -0
- package/lib/components/ui/button.d.ts.map +1 -0
- package/lib/compute.js +1 -2
- package/lib/container/AiInbox.d.ts.map +1 -1
- package/lib/container/AiLandingInput.d.ts.map +1 -1
- package/lib/container/AiLandingInput.js +46 -119
- package/lib/container/AiLandingInput.js.map +1 -1
- package/lib/container/Inbox.js +1 -1
- package/lib/container/Inbox.js.map +1 -1
- package/lib/container/InboxAiMessagesLoader.d.ts +0 -21
- package/lib/container/InboxAiMessagesLoader.d.ts.map +1 -1
- package/lib/container/InboxAiMessagesLoader.js +18 -35
- package/lib/container/InboxAiMessagesLoader.js.map +1 -1
- package/lib/container/ServiceInbox.js +1 -1
- package/lib/container/ServiceInbox.js.map +1 -1
- package/lib/container/ThreadMessages.js +1 -1
- package/lib/container/ThreadMessages.js.map +1 -1
- package/lib/container/ThreadMessagesInbox.js +1 -1
- package/lib/container/ThreadMessagesInbox.js.map +1 -1
- package/lib/container/Threads.js +1 -1
- package/lib/container/Threads.js.map +1 -1
- package/lib/container/index.d.ts +5 -4
- package/lib/container/index.d.ts.map +1 -1
- package/lib/enums/messenger-slot-fill-name-enum.d.ts +2 -1
- package/lib/enums/messenger-slot-fill-name-enum.d.ts.map +1 -1
- package/lib/enums/messenger-slot-fill-name-enum.js +1 -0
- package/lib/enums/messenger-slot-fill-name-enum.js.map +1 -1
- package/lib/hooks/index.d.ts +3 -0
- package/lib/hooks/index.d.ts.map +1 -0
- package/lib/hooks/use-file-sync.d.ts +16 -0
- package/lib/hooks/use-file-sync.d.ts.map +1 -0
- package/lib/hooks/use-file-sync.js +63 -0
- package/lib/hooks/use-file-sync.js.map +1 -0
- package/lib/hooks/usePersistentModelConfig.d.ts +15 -0
- package/lib/hooks/usePersistentModelConfig.d.ts.map +1 -0
- package/lib/hooks/usePersistentModelConfig.js +46 -0
- package/lib/hooks/usePersistentModelConfig.js.map +1 -0
- package/lib/index.d.ts +5 -2
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -1
- package/lib/machines/aiAgentMachine.d.ts.map +1 -1
- package/lib/machines/aiAgentMachine.js +64 -21
- package/lib/machines/aiAgentMachine.js.map +1 -1
- package/lib/machines/aiAgentMachine.simple.d.ts +3 -0
- package/lib/machines/aiAgentMachine.simple.d.ts.map +1 -0
- package/lib/machines/aiAgentMachine.simple.js +108 -0
- package/lib/machines/aiAgentMachine.simple.js.map +1 -0
- package/lib/machines/index.d.ts +3 -0
- package/lib/machines/index.d.ts.map +1 -0
- package/lib/module.d.ts +2 -1
- package/lib/module.d.ts.map +1 -1
- package/lib/module.js +11 -3
- package/lib/module.js.map +1 -1
- package/lib/routes.json +1 -2
- package/lib/templates/InboxWithAi.d.ts.map +1 -1
- package/lib/templates/InboxWithAi.js +129 -70
- package/lib/templates/InboxWithAi.js.map +1 -1
- package/lib/templates/InboxWithAi.tsx +151 -90
- package/lib/templates/index.d.ts +2 -0
- package/lib/templates/index.d.ts.map +1 -0
- package/lib/templates/index.ts +1 -0
- package/lib/utils/utils.d.ts +2 -0
- package/lib/utils/utils.d.ts.map +1 -0
- package/lib/utils/utils.js +3 -0
- package/lib/utils/utils.js.map +1 -0
- package/package.json +8 -5
- package/src/components/AIAgent/AIAgent.tsx +469 -731
- package/src/components/AIAgent/AIAgent.tsx.bk +1365 -0
- package/src/components/InboxMessage/InputComponent.tsx +2 -1
- package/src/components/InboxMessage/RightSidebarAi.tsx +37 -0
- package/src/components/InboxMessage/index.ts +1 -0
- package/src/components/InboxMessage/message-widgets/ErrorFixCard.tsx +240 -0
- package/src/components/InboxMessage/message-widgets/ModernMessageGroup.tsx +337 -1116
- package/src/components/ModelConfigPanel.tsx +334 -0
- package/src/components/filler-components/RightSiderBar.tsx +408 -0
- package/src/components/index.ts +4 -1
- package/src/components/live-code-editor/hybrid-live-editor.tsx +105 -0
- package/src/components/live-code-editor/index.ts +3 -0
- package/src/components/live-code-editor/live-code-editor.tsx +257 -0
- package/src/components/slot-fill/index.ts +1 -0
- package/src/components/slot-fill/right-sidebar-filler.tsx +39 -0
- package/src/components/ui/button.tsx +32 -0
- package/src/container/AiInbox.tsx +26 -3
- package/src/container/AiLandingInput.tsx +48 -22
- package/src/container/InboxAiMessagesLoader.tsx +17 -41
- package/src/container/index.ts +14 -6
- package/src/enums/messenger-slot-fill-name-enum.ts +1 -0
- package/src/hooks/index.ts +2 -0
- package/src/hooks/use-file-sync.ts +91 -0
- package/src/hooks/usePersistentModelConfig.ts +63 -0
- package/src/index.ts +19 -1
- package/src/machines/aiAgentMachine.simple.ts +89 -0
- package/src/machines/aiAgentMachine.ts +67 -19
- package/src/machines/aiAgentMachine.ts.bk +1296 -0
- package/src/machines/index.ts +2 -0
- package/src/module.tsx +10 -1
- package/src/templates/InboxWithAi.tsx +151 -90
- package/src/templates/index.ts +1 -0
- package/src/utils/utils.ts +3 -0
- package/lib/components/InboxMessage/MessageInputComponent.js +0 -173
- package/lib/components/InboxMessage/MessageInputComponent.js.map +0 -1
- package/lib/components/InboxMessage/MessagesBuilderUi.js +0 -162
- package/lib/components/InboxMessage/MessagesBuilderUi.js.map +0 -1
- package/lib/container/AiInbox.js +0 -1520
- package/lib/container/AiInbox.js.map +0 -1
- package/lib/container/AiInboxWithLoader.js +0 -300
- package/lib/container/AiInboxWithLoader.js.map +0 -1
- package/lib/container/InboxTemplate1.js +0 -1375
- package/lib/container/InboxTemplate1.js.map +0 -1
- package/lib/container/InboxTemplate2.js +0 -1426
- package/lib/container/InboxTemplate2.js.map +0 -1
package/src/module.tsx
CHANGED
|
@@ -3,8 +3,9 @@ import { schema, typePolicies, dataIdFromObject } from '@messenger-box/platform-
|
|
|
3
3
|
import { MESSAGE_SLOT_FILL_NAME } from '@messenger-box/core';
|
|
4
4
|
import { filteredRoutes } from './compute';
|
|
5
5
|
import { ChatMessageFill, ChatMessageFill2 } from './components/slot-fill/chat-message-filler';
|
|
6
|
+
import { RightSidebarFill } from './components/slot-fill/right-sidebar-filler';
|
|
6
7
|
|
|
7
|
-
export { ChatMessageFill };
|
|
8
|
+
export { ChatMessageFill, RightSidebarFill };
|
|
8
9
|
export default new Feature({
|
|
9
10
|
routeConfig: filteredRoutes,
|
|
10
11
|
dataIdFromObject,
|
|
@@ -19,5 +20,13 @@ export default new Feature({
|
|
|
19
20
|
// name: `${MESSAGE_SLOT_FILL_NAME}2`,
|
|
20
21
|
// render: ChatMessageFill2,
|
|
21
22
|
// },
|
|
23
|
+
{
|
|
24
|
+
name: 'inbox-with-ai-right-sidebar-1',
|
|
25
|
+
render: RightSidebarFill,
|
|
26
|
+
},
|
|
27
|
+
// {
|
|
28
|
+
// name: 'inbox-with-ai-right-sidebar-2',
|
|
29
|
+
// render: RightSidebarFill2,
|
|
30
|
+
// },
|
|
22
31
|
],
|
|
23
32
|
});
|
|
@@ -10,13 +10,17 @@ import React, {
|
|
|
10
10
|
useState,
|
|
11
11
|
} from 'react';
|
|
12
12
|
import { Outlet, useNavigate, useParams, useLocation } from '@remix-run/react';
|
|
13
|
+
import { RightSidebarAi } from '../components/InboxMessage/RightSidebarAi';
|
|
14
|
+
import { useRecreateSandboxMutation, useRegenerateAiCodeMutation } from 'common/graphql';
|
|
15
|
+
import { usePersistentModelConfig } from '../hooks/usePersistentModelConfig';
|
|
16
|
+
import { useFileSync } from '../hooks/use-file-sync';
|
|
13
17
|
|
|
14
18
|
// Context for sharing tab state between header and sidebar
|
|
15
19
|
const TabContext = createContext<{
|
|
16
20
|
activeTab: string;
|
|
17
21
|
setActiveTab: (tab: string) => void;
|
|
18
22
|
}>({
|
|
19
|
-
activeTab: '
|
|
23
|
+
activeTab: 'preview',
|
|
20
24
|
setActiveTab: () => {},
|
|
21
25
|
});
|
|
22
26
|
|
|
@@ -86,7 +90,7 @@ const EmptyState = React.memo(() => (
|
|
|
86
90
|
));
|
|
87
91
|
|
|
88
92
|
const InboxWithAi = (props: InboxProps) => {
|
|
89
|
-
const [activeTab, setActiveTab] = React.useState('
|
|
93
|
+
const [activeTab, setActiveTab] = React.useState('preview');
|
|
90
94
|
|
|
91
95
|
return (
|
|
92
96
|
<TabContext.Provider value={{ activeTab, setActiveTab }}>
|
|
@@ -101,14 +105,85 @@ const InboxWithAiInternal = (props: InboxProps) => {
|
|
|
101
105
|
const location = useLocation();
|
|
102
106
|
const urlParams = location?.search ? new URLSearchParams(location.search) : null;
|
|
103
107
|
const { activeTab, setActiveTab } = useContext(TabContext);
|
|
104
|
-
|
|
108
|
+
const [messages, setMessages] = useState<any[]>([]);
|
|
109
|
+
const [selectedPost, setSelectedPost] = useState<any>(null);
|
|
110
|
+
const [recreateSandbox] = useRecreateSandboxMutation();
|
|
111
|
+
const [regenerateAiCode] = useRegenerateAiCodeMutation();
|
|
112
|
+
const { modelConfig, getValidatedConfig, hasApiKey } = usePersistentModelConfig();
|
|
113
|
+
const [isLoading, setIsLoading] = useState(true);
|
|
114
|
+
const [errorData, setError] = useState<string | null>(null);
|
|
105
115
|
// Extract channelId from query parameters (priority) or path parameters (fallback)
|
|
106
116
|
const channelId = urlParams?.get('id') || pathChannelId;
|
|
107
117
|
|
|
118
|
+
const regenerateAiCodeForFragment = useCallback(
|
|
119
|
+
async (messageId: string) => {
|
|
120
|
+
try {
|
|
121
|
+
setIsLoading(true);
|
|
122
|
+
setError(null);
|
|
123
|
+
|
|
124
|
+
const response = await regenerateAiCode({
|
|
125
|
+
variables: {
|
|
126
|
+
messageId: messageId,
|
|
127
|
+
modelConfig: modelConfig,
|
|
128
|
+
},
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
if (response.data?.regenerateAiCode?.success) {
|
|
132
|
+
console.log('Sandbox recreation initiated successfully');
|
|
133
|
+
// The subscription will handle updating the UI with the new sandbox URL
|
|
134
|
+
} else {
|
|
135
|
+
const errorMsg = response.data?.regenerateAiCode?.message || 'Failed to regenerate AI code';
|
|
136
|
+
throw new Error(errorMsg);
|
|
137
|
+
}
|
|
138
|
+
} catch (err) {
|
|
139
|
+
console.error('Error recreating sandbox:', err);
|
|
140
|
+
setError(err instanceof Error ? err.message : 'Failed to recreate sandbox');
|
|
141
|
+
setIsLoading(false);
|
|
142
|
+
}
|
|
143
|
+
},
|
|
144
|
+
[regenerateAiCode, modelConfig],
|
|
145
|
+
);
|
|
146
|
+
|
|
147
|
+
const recreateSandboxForFragment = useCallback(
|
|
148
|
+
async (messageId: string) => {
|
|
149
|
+
if (!channelId) {
|
|
150
|
+
console.error('No project ID available for sandbox recreation');
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
try {
|
|
155
|
+
setIsLoading(true);
|
|
156
|
+
setError(null);
|
|
157
|
+
|
|
158
|
+
const response = await recreateSandbox({
|
|
159
|
+
variables: {
|
|
160
|
+
projectId: channelId,
|
|
161
|
+
messageId,
|
|
162
|
+
},
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
if (response.data?.recreateSandbox?.success) {
|
|
166
|
+
console.log('Sandbox recreation initiated successfully');
|
|
167
|
+
// The subscription will handle updating the UI with the new sandbox URL
|
|
168
|
+
} else {
|
|
169
|
+
const errorMsg = response.data?.recreateSandbox?.message || 'Failed to recreate sandbox';
|
|
170
|
+
throw new Error(errorMsg);
|
|
171
|
+
}
|
|
172
|
+
} catch (err) {
|
|
173
|
+
console.error('Error recreating sandbox:', err);
|
|
174
|
+
setError(err instanceof Error ? err.message : 'Failed to recreate sandbox');
|
|
175
|
+
setIsLoading(false);
|
|
176
|
+
}
|
|
177
|
+
},
|
|
178
|
+
[recreateSandbox, channelId],
|
|
179
|
+
);
|
|
180
|
+
|
|
108
181
|
// Handle refresh sandbox
|
|
109
182
|
const handleRefreshSandbox = useCallback(() => {
|
|
110
|
-
|
|
111
|
-
|
|
183
|
+
if (selectedPost) {
|
|
184
|
+
recreateSandboxForFragment(selectedPost.id);
|
|
185
|
+
}
|
|
186
|
+
}, [activeTab, selectedPost, regenerateAiCodeForFragment]);
|
|
112
187
|
|
|
113
188
|
// Hooks - improved responsive breakpoints with better granularity
|
|
114
189
|
const { width: windowWidth, height: windowHeight } = useWindowDimensions();
|
|
@@ -145,33 +220,9 @@ const InboxWithAiInternal = (props: InboxProps) => {
|
|
|
145
220
|
{!isSmallScreen && (
|
|
146
221
|
<div className="flex bg-gray-100 p-2" style={{ borderRadius: '10px' }}>
|
|
147
222
|
<button
|
|
148
|
-
onClick={() => setActiveTab('
|
|
149
|
-
className={`flex items-center space-x-2 px-4 py-2 text-xs font-medium transition-all duration-200 ${
|
|
150
|
-
activeTab === 'design'
|
|
151
|
-
? 'bg-blue-500 text-white shadow-sm'
|
|
152
|
-
: 'text-gray-600 hover:text-gray-900'
|
|
153
|
-
}`}
|
|
154
|
-
style={{ borderRadius: '10px' }}
|
|
155
|
-
>
|
|
156
|
-
<svg
|
|
157
|
-
className="w-4 h-4"
|
|
158
|
-
fill="none"
|
|
159
|
-
stroke="currentColor"
|
|
160
|
-
viewBox="0 0 24 24"
|
|
161
|
-
>
|
|
162
|
-
<path
|
|
163
|
-
strokeLinecap="round"
|
|
164
|
-
strokeLinejoin="round"
|
|
165
|
-
strokeWidth={2}
|
|
166
|
-
d="M4 5a1 1 0 011-1h14a1 1 0 011 1v2a1 1 0 01-1 1H5a1 1 0 01-1-1V5zM4 13a1 1 0 011-1h6a1 1 0 011 1v6a1 1 0 01-1 1H5a1 1 0 01-1-1v-6zM16 13a1 1 0 011-1h2a1 1 0 011 1v6a1 1 0 01-1 1h-2a1 1 0 01-1-1v-6z"
|
|
167
|
-
/>
|
|
168
|
-
</svg>
|
|
169
|
-
<span>Design</span>
|
|
170
|
-
</button>
|
|
171
|
-
<button
|
|
172
|
-
onClick={() => setActiveTab('interact')}
|
|
223
|
+
onClick={() => setActiveTab('preview')}
|
|
173
224
|
className={`flex items-center space-x-2 px-4 py-2 text-xs font-medium transition-all duration-200 ${
|
|
174
|
-
activeTab === '
|
|
225
|
+
activeTab === 'preview'
|
|
175
226
|
? 'bg-blue-500 text-white shadow-sm'
|
|
176
227
|
: 'text-gray-600 hover:text-gray-900'
|
|
177
228
|
}`}
|
|
@@ -196,7 +247,7 @@ const InboxWithAiInternal = (props: InboxProps) => {
|
|
|
196
247
|
d="M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z"
|
|
197
248
|
/>
|
|
198
249
|
</svg>
|
|
199
|
-
<span>
|
|
250
|
+
<span>Preview</span>
|
|
200
251
|
</button>
|
|
201
252
|
<button
|
|
202
253
|
onClick={() => setActiveTab('code')}
|
|
@@ -229,7 +280,7 @@ const InboxWithAiInternal = (props: InboxProps) => {
|
|
|
229
280
|
{/* Refresh icon on the right - hidden on mobile */}
|
|
230
281
|
{isDesktopView && (
|
|
231
282
|
<button
|
|
232
|
-
onClick={handleRefreshSandbox}
|
|
283
|
+
onClick={() => handleRefreshSandbox()}
|
|
233
284
|
className="p-2 text-gray-600 hover:text-gray-900 hover:bg-gray-50 rounded-lg transition-colors"
|
|
234
285
|
title="Refresh Sandbox"
|
|
235
286
|
>
|
|
@@ -263,7 +314,20 @@ const InboxWithAiInternal = (props: InboxProps) => {
|
|
|
263
314
|
`}
|
|
264
315
|
style={{ paddingTop: '15px' }}
|
|
265
316
|
>
|
|
266
|
-
{channelId ?
|
|
317
|
+
{channelId ? (
|
|
318
|
+
<ContentComponent
|
|
319
|
+
channelId={channelId}
|
|
320
|
+
{...props}
|
|
321
|
+
messages={messages}
|
|
322
|
+
setMessages={setMessages}
|
|
323
|
+
selectedPost={selectedPost}
|
|
324
|
+
setSelectedPost={setSelectedPost}
|
|
325
|
+
setIsLoading={setIsLoading}
|
|
326
|
+
isLoading={isLoading}
|
|
327
|
+
/>
|
|
328
|
+
) : (
|
|
329
|
+
<EmptyState />
|
|
330
|
+
)}
|
|
267
331
|
</div>
|
|
268
332
|
|
|
269
333
|
{/* Right Sidebar - 65% width on desktop only */}
|
|
@@ -276,6 +340,13 @@ const InboxWithAiInternal = (props: InboxProps) => {
|
|
|
276
340
|
detailSidebarOptions={detailSidebarOptions}
|
|
277
341
|
windowWidth={windowWidth}
|
|
278
342
|
windowHeight={windowHeight}
|
|
343
|
+
activeTab={activeTab}
|
|
344
|
+
channelId={channelId}
|
|
345
|
+
messages={messages}
|
|
346
|
+
selectedPost={selectedPost}
|
|
347
|
+
setIsLoading={setIsLoading}
|
|
348
|
+
isLoading={isLoading}
|
|
349
|
+
{...props}
|
|
279
350
|
/>
|
|
280
351
|
</div>
|
|
281
352
|
)}
|
|
@@ -286,7 +357,7 @@ const InboxWithAiInternal = (props: InboxProps) => {
|
|
|
286
357
|
};
|
|
287
358
|
|
|
288
359
|
const ContentComponent = React.memo((props: any) => {
|
|
289
|
-
const { channelId } = props;
|
|
360
|
+
const { channelId, messages, setMessages, selectedPost, setSelectedPost, setIsLoading, isLoading } = props;
|
|
290
361
|
|
|
291
362
|
return (
|
|
292
363
|
<div className="flex overflow-hidden h-full">
|
|
@@ -296,7 +367,16 @@ const ContentComponent = React.memo((props: any) => {
|
|
|
296
367
|
<div className="flex-1 flex flex-col min-h-0 overflow-hidden">
|
|
297
368
|
{channelId && (
|
|
298
369
|
<>
|
|
299
|
-
<MessagesComponent
|
|
370
|
+
<MessagesComponent
|
|
371
|
+
{...props}
|
|
372
|
+
channelId={channelId}
|
|
373
|
+
messages={messages}
|
|
374
|
+
setMessages={setMessages}
|
|
375
|
+
selectedPost={selectedPost}
|
|
376
|
+
setSelectedPost={setSelectedPost}
|
|
377
|
+
setIsLoading={setIsLoading}
|
|
378
|
+
isLoading={isLoading}
|
|
379
|
+
/>
|
|
300
380
|
</>
|
|
301
381
|
)}
|
|
302
382
|
</div>
|
|
@@ -311,42 +391,10 @@ const RightSidebarWrapper = React.memo(({ detailSidebarOptions }: any) => {
|
|
|
311
391
|
<div className="h-full flex flex-col overflow-hidden bg-white">
|
|
312
392
|
{/* Content Area */}
|
|
313
393
|
<div className="flex-1 overflow-hidden">
|
|
314
|
-
{activeTab === '
|
|
394
|
+
{activeTab === 'preview' ? (
|
|
315
395
|
<div className="h-full flex items-center justify-center bg-gray-50">
|
|
316
396
|
<div className="text-center">
|
|
317
|
-
{/*
|
|
318
|
-
<div className="mb-8">
|
|
319
|
-
<svg className="w-32 h-16 mx-auto text-black" viewBox="0 0 394 80" fill="currentColor">
|
|
320
|
-
<path d="M262 0h68.5v12.7h-27.2v66.6h-13.6V12.7H262V0ZM149 0v12.7H94v20.4h44.3v12.6H94v21h55v12.6H80.5V0h68.4zm34.3 0h-17.8l63.8 79.4h17.9l-32-39.7 32-39.7h-17.9l-23 28.6-23-28.6zm18.3 56.7-9-11-27.1 33.7h17.8l18.3-22.7z" />
|
|
321
|
-
<path d="M81 79.3 17 0H0v79.3h13.6V17l50.2 62.3H81Zm252.6-.4c-1 0-1.8-.4-2.5-1s-1.1-1.6-1.1-2.6.3-1.8 1-2.5 1.6-1 2.6-1 1.8.3 2.5 1a3.4 3.4 0 0 1 .6 4.3 3.7 3.7 0 0 1-3 1.8zm23.2-33.5h6v23.3c0 2.1-.4 4-1.3 5.5a9.1 9.1 0 0 1-3.8 3.5c-1.6.8-3.5 1.3-5.7 1.3-2 0-3.7-.4-5.3-1s-2.8-1.8-3.7-3.2c-.9-1.3-1.4-3-1.4-5h6c.1.8.3 1.6.7 2.2s1 1.2 1.6 1.5c.7.4 1.5.5 2.4.5 1 0 1.8-.2 2.4-.6a4 4 0 0 0 1.6-1.8c.3-.8.5-1.8.5-3V45.5zm30.9 9.1a4.4 4.4 0 0 0-2-3.3 7.5 7.5 0 0 0-4.3-1.1c-1.3 0-2.4.2-3.3.5-.9.4-1.6 1-2 1.6a3.5 3.5 0 0 0-.3 4c.3.5.7.9 1.3 1.2l1.8 1 2 .5 3.2.8c1.3.3 2.5.7 3.7 1.2a13 13 0 0 1 3.2 1.8 8.1 8.1 0 0 1 3 6.5c0 2-.5 3.7-1.5 5.1a10 10 0 0 1-4.4 3.5c-1.8.8-4.1 1.2-6.8 1.2-2.6 0-4.9-.4-6.8-1.2-2-.8-3.4-2-4.5-3.5a10 10 0 0 1-1.7-5.6h6a5 5 0 0 0 3.5 4.6c1 .4 2.2.6 3.4.6 1.3 0 2.5-.2 3.5-.6 1-.4 1.8-1 2.4-1.7a4 4 0 0 0 .8-2.4c0-.9-.2-1.6-.7-2.2a11 11 0 0 0-2.1-1.4l-3.2-1-3.8-1c-2.8-.7-5-1.7-6.6-3.2a7.2 7.2 0 0 1-2.4-5.7 8 8 0 0 1 1.7-5 10 10 0 0 1 4.3-3.5c2-.8 4-1.2 6.4-1.2 2.3 0 4.4.4 6.2 1.2 1.8.8 3.2 2 4.2 3.4 1 1.4 1.5 3 1.5 5h-5.8z" />
|
|
322
|
-
</svg>
|
|
323
|
-
</div>
|
|
324
|
-
|
|
325
|
-
<div className="space-y-4 text-gray-600">
|
|
326
|
-
<h3 className="text-lg font-semibold text-gray-900">Design View</h3>
|
|
327
|
-
<p className="font-mono text-sm bg-gray-100 px-3 py-1 rounded">
|
|
328
|
-
Design components and UI
|
|
329
|
-
</p>
|
|
330
|
-
<p>Customize and preview your design changes.</p>
|
|
331
|
-
</div>
|
|
332
|
-
|
|
333
|
-
<div className="mt-8 space-y-4">
|
|
334
|
-
<button className="bg-black text-white px-6 py-3 rounded-full hover:bg-gray-800 transition-colors flex items-center space-x-2 mx-auto">
|
|
335
|
-
<svg className="w-4 h-4" fill="currentColor" viewBox="0 0 24 24">
|
|
336
|
-
<path d="M12 2L2 7v10c0 5.55 3.84 9.739 9 11 5.16-1.261 9-5.45 9-11V7l-10-5z" />
|
|
337
|
-
</svg>
|
|
338
|
-
<span>Design now</span>
|
|
339
|
-
</button>
|
|
340
|
-
<p className="text-sm text-gray-500 underline cursor-pointer hover:text-gray-700">
|
|
341
|
-
View design docs
|
|
342
|
-
</p>
|
|
343
|
-
</div>
|
|
344
|
-
</div>
|
|
345
|
-
</div>
|
|
346
|
-
) : activeTab === 'interact' ? (
|
|
347
|
-
<div className="h-full flex items-center justify-center bg-blue-50">
|
|
348
|
-
<div className="text-center">
|
|
349
|
-
{/* Interact Icon */}
|
|
397
|
+
{/* Preview Icon */}
|
|
350
398
|
<div className="mb-8">
|
|
351
399
|
<svg
|
|
352
400
|
className="w-32 h-32 mx-auto text-blue-500"
|
|
@@ -370,11 +418,11 @@ const RightSidebarWrapper = React.memo(({ detailSidebarOptions }: any) => {
|
|
|
370
418
|
</div>
|
|
371
419
|
|
|
372
420
|
<div className="space-y-4 text-gray-600">
|
|
373
|
-
<h3 className="text-lg font-semibold text-gray-900">
|
|
421
|
+
<h3 className="text-lg font-semibold text-gray-900">Preview Mode</h3>
|
|
374
422
|
<p className="font-mono text-sm bg-blue-100 px-3 py-1 rounded">
|
|
375
|
-
Live
|
|
423
|
+
Live preview and testing
|
|
376
424
|
</p>
|
|
377
|
-
<p>
|
|
425
|
+
<p>Preview and test your components in real-time.</p>
|
|
378
426
|
</div>
|
|
379
427
|
|
|
380
428
|
<div className="mt-8 space-y-4">
|
|
@@ -382,10 +430,10 @@ const RightSidebarWrapper = React.memo(({ detailSidebarOptions }: any) => {
|
|
|
382
430
|
<svg className="w-4 h-4" fill="currentColor" viewBox="0 0 24 24">
|
|
383
431
|
<path d="M8 5v14l11-7z" />
|
|
384
432
|
</svg>
|
|
385
|
-
<span>Start
|
|
433
|
+
<span>Start Preview</span>
|
|
386
434
|
</button>
|
|
387
435
|
<p className="text-sm text-gray-500 underline cursor-pointer hover:text-gray-700">
|
|
388
|
-
Learn about
|
|
436
|
+
Learn about preview mode
|
|
389
437
|
</p>
|
|
390
438
|
</div>
|
|
391
439
|
</div>
|
|
@@ -472,23 +520,36 @@ const RightSidebarWrapper = React.memo(({ detailSidebarOptions }: any) => {
|
|
|
472
520
|
);
|
|
473
521
|
});
|
|
474
522
|
|
|
475
|
-
const RightSidebarContent = React.memo(
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
523
|
+
const RightSidebarContent = React.memo(
|
|
524
|
+
({ detailSidebarOptions, windowWidth, windowHeight, channelId, setIsLoading, isLoading, ...props }: any) => {
|
|
525
|
+
const { activeTab } = useContext(TabContext);
|
|
526
|
+
|
|
527
|
+
return (
|
|
528
|
+
<div
|
|
529
|
+
className="border-l border-gray-200 bg-white flex-shrink-0 overflow-hidden"
|
|
530
|
+
style={{
|
|
531
|
+
// width: `${windowWidth * 0.35}px`, // 35% of window width
|
|
532
|
+
height: `${windowHeight}px`,
|
|
533
|
+
maxHeight: '100vh',
|
|
534
|
+
}}
|
|
535
|
+
>
|
|
536
|
+
<RightSidebarAi
|
|
537
|
+
detailSidebarOptions={detailSidebarOptions}
|
|
538
|
+
windowWidth={windowWidth}
|
|
539
|
+
windowHeight={windowHeight}
|
|
540
|
+
activeTab={activeTab}
|
|
541
|
+
channelId={channelId}
|
|
542
|
+
setIsLoading={setIsLoading}
|
|
543
|
+
isLoading={isLoading}
|
|
544
|
+
{...props}
|
|
545
|
+
/>
|
|
546
|
+
</div>
|
|
547
|
+
);
|
|
548
|
+
},
|
|
549
|
+
);
|
|
489
550
|
|
|
490
551
|
const MessagesComponent = React.memo((props: any) => {
|
|
491
|
-
return <Outlet context=
|
|
552
|
+
return <Outlet context={{ ...props, app: 'app' }} />;
|
|
492
553
|
});
|
|
493
554
|
|
|
494
555
|
// Display names for debugging
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as InboxWithAi } from './InboxWithAi';
|
|
@@ -1,173 +0,0 @@
|
|
|
1
|
-
import React__default,{useState,useRef,useEffect,useCallback,useMemo}from'react';import {useTranslation}from'react-i18next';import {config}from'../../config/env-config.js';import {UploadImageButton}from'./UploadImageButton.js';import {FilesList}from'../inbox/FilesList.js';import'../inbox/MessageItem.js';import'../inbox/ThreadItem.js';const MessageInputComponent = ({
|
|
2
|
-
handleSend: handleSendProp,
|
|
3
|
-
placeholder
|
|
4
|
-
}) => {
|
|
5
|
-
const [message, setMessage] = useState('');
|
|
6
|
-
const [sending, setSending] = useState(false);
|
|
7
|
-
const [files, setFiles] = useState([]);
|
|
8
|
-
const [showToast, setShowToast] = useState(false);
|
|
9
|
-
const [toastMessage, setToastMessage] = useState('');
|
|
10
|
-
const [isFocused, setIsFocused] = useState(false);
|
|
11
|
-
const textareaRef = useRef(null);
|
|
12
|
-
const {
|
|
13
|
-
t
|
|
14
|
-
} = useTranslation('translations');
|
|
15
|
-
// Auto-focus the textarea when component mounts
|
|
16
|
-
useEffect(() => {
|
|
17
|
-
if (textareaRef.current) {
|
|
18
|
-
textareaRef.current.focus();
|
|
19
|
-
}
|
|
20
|
-
}, []);
|
|
21
|
-
const showToastMessage = useCallback(message => {
|
|
22
|
-
setToastMessage(message);
|
|
23
|
-
setShowToast(true);
|
|
24
|
-
setTimeout(() => setShowToast(false), 3000);
|
|
25
|
-
}, []);
|
|
26
|
-
const handleSend = useCallback(() => {
|
|
27
|
-
if (!message.trim() && files.length === 0) return;
|
|
28
|
-
setSending(true);
|
|
29
|
-
handleSendProp(message, files).then(() => {
|
|
30
|
-
setMessage('');
|
|
31
|
-
setFiles([]);
|
|
32
|
-
// Auto-focus the textarea after sending a message
|
|
33
|
-
setTimeout(() => {
|
|
34
|
-
if (textareaRef.current) {
|
|
35
|
-
textareaRef.current.focus();
|
|
36
|
-
}
|
|
37
|
-
}, 100);
|
|
38
|
-
}).finally(() => setSending(false));
|
|
39
|
-
}, [files, handleSendProp, message]);
|
|
40
|
-
const handleKeyDown = useCallback(e => {
|
|
41
|
-
const keyCode = e.which || e.keyCode;
|
|
42
|
-
if (keyCode == 13 && !e.shiftKey) {
|
|
43
|
-
e.preventDefault();
|
|
44
|
-
handleSend();
|
|
45
|
-
}
|
|
46
|
-
}, [handleSend]);
|
|
47
|
-
const inputHeight = useMemo(() => {
|
|
48
|
-
const lines = message.split('\n').length;
|
|
49
|
-
return Math.max(48, Math.min(120, 48 + (lines - 1) * 20));
|
|
50
|
-
}, [message]);
|
|
51
|
-
const onUploadImageChange = useCallback(({
|
|
52
|
-
target
|
|
53
|
-
}) => {
|
|
54
|
-
let fileList = [];
|
|
55
|
-
let index = 0;
|
|
56
|
-
if (files.length + target.files.length > config.FILES_PER_MESSAGE) {
|
|
57
|
-
showToastMessage(t('tailwind_ui_inbox.you_can_not_upload_more_than_files', {
|
|
58
|
-
files_per_message: config.FILES_PER_MESSAGE
|
|
59
|
-
}));
|
|
60
|
-
return;
|
|
61
|
-
}
|
|
62
|
-
while (target.files[index]) {
|
|
63
|
-
fileList.push(target.files[index]);
|
|
64
|
-
index += 1;
|
|
65
|
-
}
|
|
66
|
-
setFiles(oldFiles => [...oldFiles, ...fileList]);
|
|
67
|
-
}, [setFiles, files, showToastMessage, t]);
|
|
68
|
-
const canSend = message.trim() || files.length > 0;
|
|
69
|
-
const hasContent = message.trim().length > 0;
|
|
70
|
-
return React__default.createElement("div", {
|
|
71
|
-
className: "bg-white"
|
|
72
|
-
}, showToast && React__default.createElement("div", {
|
|
73
|
-
className: "fixed top-4 right-4 z-50 bg-orange-50 border border-orange-200 text-orange-800 px-4 py-3 rounded-lg shadow-lg animate-bounce"
|
|
74
|
-
}, React__default.createElement("div", {
|
|
75
|
-
className: "flex items-center"
|
|
76
|
-
}, React__default.createElement("svg", {
|
|
77
|
-
className: "w-5 h-5 mr-2",
|
|
78
|
-
fill: "currentColor",
|
|
79
|
-
viewBox: "0 0 20 20"
|
|
80
|
-
}, React__default.createElement("path", {
|
|
81
|
-
fillRule: "evenodd",
|
|
82
|
-
d: "M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z",
|
|
83
|
-
clipRule: "evenodd"
|
|
84
|
-
})), toastMessage)), files?.length > 0 && !sending && React__default.createElement("div", {
|
|
85
|
-
className: "px-4 py-3 border-b border-gray-100 animate-fade-in"
|
|
86
|
-
}, React__default.createElement(FilesList, {
|
|
87
|
-
files: files
|
|
88
|
-
})), React__default.createElement("div", {
|
|
89
|
-
className: "p-4"
|
|
90
|
-
}, React__default.createElement("div", {
|
|
91
|
-
className: `relative border-2 transition-all duration-200 ease-in-out ${hasContent || isFocused ? 'rounded-2xl border-gray-300 bg-white' : 'rounded-2xl border-gray-300 bg-white'} ${isFocused ? 'border-blue-500' : ''}`
|
|
92
|
-
}, React__default.createElement("div", {
|
|
93
|
-
className: "absolute left-4 top-1/2 transform -translate-y-1/2 z-10"
|
|
94
|
-
}, hasContent || isFocused ? React__default.createElement(UploadImageButton, {
|
|
95
|
-
onChange: onUploadImageChange
|
|
96
|
-
}) : React__default.createElement("svg", {
|
|
97
|
-
className: "w-5 h-5 text-gray-400",
|
|
98
|
-
fill: "none",
|
|
99
|
-
stroke: "currentColor",
|
|
100
|
-
viewBox: "0 0 24 24"
|
|
101
|
-
}, React__default.createElement("path", {
|
|
102
|
-
strokeLinecap: "round",
|
|
103
|
-
strokeLinejoin: "round",
|
|
104
|
-
strokeWidth: 2,
|
|
105
|
-
d: "M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z"
|
|
106
|
-
}))), React__default.createElement("textarea", {
|
|
107
|
-
ref: textareaRef,
|
|
108
|
-
className: `w-full text-base bg-transparent border-none resize-none overflow-hidden text-gray-900 focus:outline-none focus:ring-0 scrollbar-thin scrollbar-thumb-gray-300 scrollbar-track-transparent ${hasContent || isFocused ? 'pl-14 pr-20 py-3 placeholder-gray-500' : 'pl-12 pr-12 py-3 placeholder-gray-600'}`,
|
|
109
|
-
style: {
|
|
110
|
-
height: hasContent || isFocused ? `${inputHeight}px` : '48px',
|
|
111
|
-
minHeight: '48px',
|
|
112
|
-
maxHeight: '120px'
|
|
113
|
-
},
|
|
114
|
-
placeholder: placeholder || 'Message',
|
|
115
|
-
value: sending ? '' : message,
|
|
116
|
-
onKeyDown: handleKeyDown,
|
|
117
|
-
onChange: e => setMessage(e.target.value),
|
|
118
|
-
onFocus: () => setIsFocused(true),
|
|
119
|
-
onBlur: () => setIsFocused(false),
|
|
120
|
-
disabled: sending,
|
|
121
|
-
rows: 1
|
|
122
|
-
}), React__default.createElement("div", {
|
|
123
|
-
className: "absolute right-3 top-1/2 transform -translate-y-1/2 flex items-center gap-2"
|
|
124
|
-
}, hasContent && React__default.createElement("span", {
|
|
125
|
-
className: "text-sm text-gray-500"
|
|
126
|
-
}, message.length, "/10000"), hasContent || isFocused ? (/* Send button when typing */
|
|
127
|
-
React__default.createElement("button", {
|
|
128
|
-
className: `w-10 h-10 rounded-xl flex items-center justify-center transition-all duration-200 ease-in-out ${canSend && !sending ? 'bg-gray-900 hover:bg-gray-800 text-white shadow-md hover:shadow-lg' : 'bg-gray-200 text-gray-400 cursor-not-allowed'}`,
|
|
129
|
-
onClick: handleSend,
|
|
130
|
-
disabled: !canSend || sending,
|
|
131
|
-
type: "button"
|
|
132
|
-
}, sending ? React__default.createElement("svg", {
|
|
133
|
-
className: "w-5 h-5 animate-spin",
|
|
134
|
-
fill: "none",
|
|
135
|
-
viewBox: "0 0 24 24"
|
|
136
|
-
}, React__default.createElement("circle", {
|
|
137
|
-
className: "opacity-25",
|
|
138
|
-
cx: "12",
|
|
139
|
-
cy: "12",
|
|
140
|
-
r: "10",
|
|
141
|
-
stroke: "currentColor",
|
|
142
|
-
strokeWidth: "4"
|
|
143
|
-
}), React__default.createElement("path", {
|
|
144
|
-
className: "opacity-75",
|
|
145
|
-
fill: "currentColor",
|
|
146
|
-
d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"
|
|
147
|
-
})) : React__default.createElement("svg", {
|
|
148
|
-
className: "w-5 h-5",
|
|
149
|
-
fill: "none",
|
|
150
|
-
stroke: "currentColor",
|
|
151
|
-
viewBox: "0 0 24 24"
|
|
152
|
-
}, React__default.createElement("path", {
|
|
153
|
-
strokeLinecap: "round",
|
|
154
|
-
strokeLinejoin: "round",
|
|
155
|
-
strokeWidth: 2,
|
|
156
|
-
d: "M12 19l9 2-9-18-9 18 9-2zm0 0v-8"
|
|
157
|
-
})))) : (/* Warning/Info icon when empty */
|
|
158
|
-
React__default.createElement("svg", {
|
|
159
|
-
className: "w-5 h-5 text-gray-400",
|
|
160
|
-
fill: "none",
|
|
161
|
-
stroke: "currentColor",
|
|
162
|
-
viewBox: "0 0 24 24"
|
|
163
|
-
}, React__default.createElement("path", {
|
|
164
|
-
strokeLinecap: "round",
|
|
165
|
-
strokeLinejoin: "round",
|
|
166
|
-
strokeWidth: 2,
|
|
167
|
-
d: "M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z"
|
|
168
|
-
}))))), React__default.createElement("div", {
|
|
169
|
-
className: "mt-2 px-1"
|
|
170
|
-
}, React__default.createElement("span", {
|
|
171
|
-
className: "text-xs text-gray-400"
|
|
172
|
-
}, "Press Enter to send, Shift+Enter for new line"))));
|
|
173
|
-
};export{MessageInputComponent};//# sourceMappingURL=MessageInputComponent.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MessageInputComponent.js","sources":["../../../src/components/InboxMessage/MessageInputComponent.tsx"],"sourcesContent":[null],"names":["React"],"mappings":"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"}
|