Skip to content

Commit 833dfab

Browse files
fixed chat initial project default template not loading
1 parent 6cdf463 commit 833dfab

24 files changed

Lines changed: 995 additions & 121 deletions

app/components/chat/Chat.client.tsx

Lines changed: 72 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import { useSettings } from '~/lib/hooks/useSettings';
1818
import type { ProviderInfo } from '~/types/model';
1919
import { useSearchParams } from '@remix-run/react';
2020
import { createSampler } from '~/utils/sampler';
21-
import { getTemplates, selectStarterTemplate } from '~/utils/selectStarterTemplate';
21+
import { getLocalStarter } from '~/utils/selectStarterTemplate';
2222
import { logStore } from '~/lib/stores/logs';
2323
import { streamingState } from '~/lib/stores/streaming';
2424
import { filesToArtifacts } from '~/utils/fileUtils';
@@ -100,7 +100,7 @@ export const ChatImpl = memo(
100100
(project) => project.id === supabaseConn.selectedProjectId,
101101
);
102102
const supabaseAlert = useStore(workbenchStore.supabaseAlert);
103-
const { activeProviders, promptId, autoSelectTemplate, contextOptimizationEnabled } = useSettings();
103+
const { activeProviders, promptId, contextOptimizationEnabled } = useSettings();
104104
const [llmErrorAlert, setLlmErrorAlert] = useState<LlmErrorAlertType | undefined>(undefined);
105105
const [model, setModel] = useState(() => {
106106
const savedModel = Cookies.get('selectedModel');
@@ -177,19 +177,76 @@ export const ChatImpl = memo(
177177
initialInput: Cookies.get(PROMPT_COOKIE_KEY) || '',
178178
});
179179
useEffect(() => {
180-
const prompt = searchParams.get('prompt');
180+
const handlePrompt = async () => {
181+
const prompt = searchParams.get('prompt');
181182

182-
// console.log(prompt, searchParams, model, provider);
183+
if (prompt && !chatStarted) {
184+
setSearchParams({});
185+
runAnimation();
186+
setFakeLoading(true);
183187

184-
if (prompt) {
185-
setSearchParams({});
186-
runAnimation();
187-
append({
188-
role: 'user',
189-
content: `[Model: ${model}]\n\n[Provider: ${provider.name}]\n\n${prompt}`,
190-
});
191-
}
192-
}, [model, provider, searchParams]);
188+
const temResp = await getLocalStarter(prompt).catch((e) => {
189+
console.error('Failed to load local starter template:', e);
190+
toast.warning('Failed to load starter template\n Continuing with blank template');
191+
192+
return null;
193+
});
194+
195+
if (temResp) {
196+
const { assistantMessage, userMessage } = temResp;
197+
const userMessageText = `[Model: ${model}]\n\n[Provider: ${provider.name}]\n\n${prompt}`;
198+
199+
setMessages([
200+
{
201+
id: `1-${new Date().getTime()}`,
202+
role: 'user',
203+
content: userMessageText,
204+
parts: createMessageParts(userMessageText, imageDataList),
205+
},
206+
{
207+
id: `2-${new Date().getTime()}`,
208+
role: 'assistant',
209+
content: assistantMessage,
210+
},
211+
{
212+
id: `3-${new Date().getTime()}`,
213+
role: 'user',
214+
content: `[Model: ${model}]\n\n[Provider: ${provider.name}]\n\n${userMessage}`,
215+
annotations: ['hidden'],
216+
},
217+
]);
218+
219+
const reloadOptions =
220+
uploadedFiles.length > 0
221+
? { experimental_attachments: await filesToAttachments(uploadedFiles) }
222+
: undefined;
223+
224+
reload(reloadOptions);
225+
setInput('');
226+
Cookies.remove(PROMPT_COOKIE_KEY);
227+
228+
setUploadedFiles([]);
229+
setImageDataList([]);
230+
231+
resetEnhancer();
232+
233+
textareaRef.current?.blur();
234+
setFakeLoading(false);
235+
236+
return;
237+
}
238+
} else if (prompt) {
239+
setSearchParams({});
240+
runAnimation();
241+
append({
242+
role: 'user',
243+
content: `[Model: ${model}]\n\n[Provider: ${provider.name}]\n\n${prompt}`,
244+
});
245+
}
246+
};
247+
248+
handlePrompt();
249+
}, [model, provider, searchParams, chatStarted]);
193250

194251
const { enhancingPrompt, promptEnhanced, enhancePrompt, resetEnhancer } = usePromptEnhancer();
195252
const { parsedMessages, parseMessages } = useMessageParser();
@@ -410,95 +467,13 @@ export const ChatImpl = memo(
410467
runAnimation();
411468

412469
if (!chatStarted) {
413-
setFakeLoading(true);
414-
415-
if (autoSelectTemplate) {
416-
const { template, title } = await selectStarterTemplate({
417-
message: finalMessageContent,
418-
model,
419-
provider,
420-
});
421-
422-
if (template !== 'blank') {
423-
const temResp = await getTemplates(template, title).catch((e) => {
424-
if (e.message.includes('rate limit')) {
425-
toast.warning('Rate limit exceeded. Skipping starter template\n Continuing with blank template');
426-
} else {
427-
toast.warning('Failed to import starter template\n Continuing with blank template');
428-
}
429-
430-
return null;
431-
});
432-
433-
if (temResp) {
434-
const { assistantMessage, userMessage } = temResp;
435-
const userMessageText = `[Model: ${model}]\n\n[Provider: ${provider.name}]\n\n${finalMessageContent}`;
436-
437-
setMessages([
438-
{
439-
id: `1-${new Date().getTime()}`,
440-
role: 'user',
441-
content: userMessageText,
442-
parts: createMessageParts(userMessageText, imageDataList),
443-
},
444-
{
445-
id: `2-${new Date().getTime()}`,
446-
role: 'assistant',
447-
content: assistantMessage,
448-
},
449-
{
450-
id: `3-${new Date().getTime()}`,
451-
role: 'user',
452-
content: `[Model: ${model}]\n\n[Provider: ${provider.name}]\n\n${userMessage}`,
453-
annotations: ['hidden'],
454-
},
455-
]);
456-
457-
const reloadOptions =
458-
uploadedFiles.length > 0
459-
? { experimental_attachments: await filesToAttachments(uploadedFiles) }
460-
: undefined;
461-
462-
reload(reloadOptions);
463-
setInput('');
464-
Cookies.remove(PROMPT_COOKIE_KEY);
465-
466-
setUploadedFiles([]);
467-
setImageDataList([]);
468-
469-
resetEnhancer();
470-
471-
textareaRef.current?.blur();
472-
setFakeLoading(false);
473-
474-
return;
475-
}
476-
}
477-
}
478-
479-
// If autoSelectTemplate is disabled or template selection failed, proceed with normal message
480-
const userMessageText = `[Model: ${model}]\n\n[Provider: ${provider.name}]\n\n${finalMessageContent}`;
481-
const attachments = uploadedFiles.length > 0 ? await filesToAttachments(uploadedFiles) : undefined;
482-
483-
setMessages([
484-
{
485-
id: `${new Date().getTime()}`,
486-
role: 'user',
487-
content: userMessageText,
488-
parts: createMessageParts(userMessageText, imageDataList),
489-
experimental_attachments: attachments,
490-
},
491-
]);
492-
reload(attachments ? { experimental_attachments: attachments } : undefined);
493-
setFakeLoading(false);
470+
// On home page, set prompt in URL to trigger the useEffect
471+
setSearchParams({ prompt: finalMessageContent });
494472
setInput('');
495473
Cookies.remove(PROMPT_COOKIE_KEY);
496-
497474
setUploadedFiles([]);
498475
setImageDataList([]);
499-
500476
resetEnhancer();
501-
502477
textareaRef.current?.blur();
503478

504479
return;

app/lib/persistence/useChatHistory.ts

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ export function useChatHistory() {
230230
if (!urlId && firstArtifact?.id) {
231231
const urlId = await getUrlId(db, firstArtifact.id);
232232
_urlId = urlId;
233-
navigateChat(urlId);
233+
navigate(`/chat/${urlId}`, { replace: true });
234234
setUrlId(urlId);
235235
}
236236

@@ -261,9 +261,22 @@ export function useChatHistory() {
261261

262262
chatId.set(nextId);
263263

264+
// Save messages before navigating
265+
await setMessages(
266+
db,
267+
nextId,
268+
[...archivedMessages, ...messages],
269+
urlId,
270+
description.get(),
271+
undefined,
272+
chatMetadata.get(),
273+
);
274+
264275
if (!urlId) {
265-
navigateChat(nextId);
276+
navigate(`/chat/${nextId}`, { replace: true });
266277
}
278+
279+
return; // Exit early since we already saved
267280
}
268281

269282
// Ensure chatId.get() is used for the final setMessages call
@@ -341,15 +354,3 @@ export function useChatHistory() {
341354
},
342355
};
343356
}
344-
345-
function navigateChat(nextId: string) {
346-
/**
347-
* FIXME: Using the intended navigate function causes a rerender for <Chat /> that breaks the app.
348-
*
349-
* `navigate(`/chat/${nextId}`, { replace: true });`
350-
*/
351-
const url = new URL(window.location.href);
352-
url.pathname = `/chat/${nextId}`;
353-
354-
window.history.replaceState({}, '', url);
355-
}

app/styles/index.scss

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ body {
2828
--codinit-elements-bg-depth-2: #161b22; /* editor panel / content surfaces */
2929

3030
/* Text Colors */
31-
--codinit-elements-textPrimary: #E0E0E0; /* Changed from #e6e6e7 */
32-
--codinit-elements-textSecondary: #A0A0A0; /* Changed from #b3b3b5 */
31+
--codinit-elements-textPrimary: #e0e0e0; /* Changed from #e6e6e7 */
32+
--codinit-elements-textSecondary: #a0a0a0; /* Changed from #b3b3b5 */
3333
--codinit-elements-textTertiary: #888888; /* Changed from #7a7a7d */
3434

3535
/* Borders */
@@ -53,7 +53,6 @@ body {
5353
--accent-color: rgba(255, 77, 210, var(--gradient-opacity)); /* Pink */
5454
}
5555

56-
5756
/* --------------------------------------- */
5857
/* MODERN SCROLLBAR */
5958
/* --------------------------------------- */

app/styles/variables.scss

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,8 @@
5656

5757
--codinit-elements-icon-success: theme('colors.green.500');
5858
--codinit-elements-icon-error: theme('colors.red.500');
59-
--codinit-elements-icon-primary: #CCCCCC; /* Changed from theme('colors.gray.950') to low-contrast gray */
60-
--codinit-elements-icon-secondary: #A0A0A0; /* Changed from theme('colors.gray.600') to dimmer gray */
59+
--codinit-elements-icon-primary: #cccccc; /* Changed from theme('colors.gray.950') to low-contrast gray */
60+
--codinit-elements-icon-secondary: #a0a0a0; /* Changed from theme('colors.gray.600') to dimmer gray */
6161
--codinit-elements-icon-tertiary: #888888; /* Changed from theme('colors.gray.500') to softer gray */
6262

6363
--codinit-elements-dividerColor: theme('colors.gray.100');
@@ -190,9 +190,13 @@
190190
--codinit-elements-sidebar-buttonText: #79c0ff; /* Brighter text */
191191

192192
/* Preview Address Bar - Higher contrast */
193-
--codinit-elements-preview-addressBar-background: var(--codinit-elements-bg-depth-2); /* Use depth-2 for consistency */
193+
--codinit-elements-preview-addressBar-background: var(
194+
--codinit-elements-bg-depth-2
195+
); /* Use depth-2 for consistency */
194196
--codinit-elements-preview-addressBar-backgroundHover: rgba(255, 255, 255, 0.05); /* Subtle hover */
195-
--codinit-elements-preview-addressBar-backgroundActive: var(--codinit-elements-bg-depth-1); /* Use depth-1 for active */
197+
--codinit-elements-preview-addressBar-backgroundActive: var(
198+
--codinit-elements-bg-depth-1
199+
); /* Use depth-1 for active */
196200
--codinit-elements-preview-addressBar-text: var(--codinit-elements-textSecondary);
197201
--codinit-elements-preview-addressBar-textActive: var(--codinit-elements-textPrimary);
198202

app/utils/constants.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ export const MODEL_REGEX = /^\[Model: (.*?)\]\n\n/;
88
export const PROVIDER_REGEX = /\[Provider: (.*?)\]\n\n/;
99
export const DEFAULT_MODEL = 'claude-3-5-sonnet-latest';
1010
export const PROMPT_COOKIE_KEY = 'cachedPrompt';
11+
export const DEFAULT_TEMPLATE = '~/codinit-vite-starter';
1112

1213
export const TOOL_EXECUTION_APPROVAL = {
1314
APPROVE: 'tool_execution_approved',

0 commit comments

Comments
 (0)