mirror of
https://github.com/stackblitz/bolt.new
synced 2025-02-06 04:48:04 +00:00
Merge remote-tracking branch 'upstream/main'
This commit is contained in:
commit
e4866eb75e
@ -1 +1 @@
|
|||||||
{ "commit": "49b02dd885919e24a201f07b1a7b0fd0371b4f85" , "version": "0.0.1" }
|
{ "commit": "25b80ab267541b6ea290985dde09863f1a29c85c" , "version": "0.0.1" }
|
||||||
|
@ -20,6 +20,7 @@ import Cookies from 'js-cookie';
|
|||||||
import { debounce } from '~/utils/debounce';
|
import { debounce } from '~/utils/debounce';
|
||||||
import { useSettings } from '~/lib/hooks/useSettings';
|
import { useSettings } from '~/lib/hooks/useSettings';
|
||||||
import type { ProviderInfo } from '~/types/model';
|
import type { ProviderInfo } from '~/types/model';
|
||||||
|
import { useSearchParams } from '@remix-run/react';
|
||||||
|
|
||||||
const toastAnimation = cssTransition({
|
const toastAnimation = cssTransition({
|
||||||
enter: 'animated fadeInRight',
|
enter: 'animated fadeInRight',
|
||||||
@ -92,6 +93,7 @@ export const ChatImpl = memo(
|
|||||||
const [chatStarted, setChatStarted] = useState(initialMessages.length > 0);
|
const [chatStarted, setChatStarted] = useState(initialMessages.length > 0);
|
||||||
const [uploadedFiles, setUploadedFiles] = useState<File[]>([]); // Move here
|
const [uploadedFiles, setUploadedFiles] = useState<File[]>([]); // Move here
|
||||||
const [imageDataList, setImageDataList] = useState<string[]>([]); // Move here
|
const [imageDataList, setImageDataList] = useState<string[]>([]); // Move here
|
||||||
|
const [searchParams, setSearchParams] = useSearchParams();
|
||||||
const files = useStore(workbenchStore.files);
|
const files = useStore(workbenchStore.files);
|
||||||
const { activeProviders, promptId } = useSettings();
|
const { activeProviders, promptId } = useSettings();
|
||||||
|
|
||||||
@ -138,6 +140,24 @@ export const ChatImpl = memo(
|
|||||||
initialMessages,
|
initialMessages,
|
||||||
initialInput: Cookies.get(PROMPT_COOKIE_KEY) || '',
|
initialInput: Cookies.get(PROMPT_COOKIE_KEY) || '',
|
||||||
});
|
});
|
||||||
|
useEffect(() => {
|
||||||
|
const prompt = searchParams.get('prompt');
|
||||||
|
console.log(prompt, searchParams, model, provider);
|
||||||
|
|
||||||
|
if (prompt) {
|
||||||
|
setSearchParams({});
|
||||||
|
runAnimation();
|
||||||
|
append({
|
||||||
|
role: 'user',
|
||||||
|
content: [
|
||||||
|
{
|
||||||
|
type: 'text',
|
||||||
|
text: `[Model: ${model}]\n\n[Provider: ${provider.name}]\n\n${prompt}`,
|
||||||
|
},
|
||||||
|
] as any, // Type assertion to bypass compiler check
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, [model, provider, searchParams]);
|
||||||
|
|
||||||
const { enhancingPrompt, promptEnhanced, enhancePrompt, resetEnhancer } = usePromptEnhancer();
|
const { enhancingPrompt, promptEnhanced, enhancePrompt, resetEnhancer } = usePromptEnhancer();
|
||||||
const { parsedMessages, parseMessages } = useMessageParser();
|
const { parsedMessages, parseMessages } = useMessageParser();
|
||||||
|
@ -53,7 +53,7 @@ export const CodeBlock = memo(
|
|||||||
<div
|
<div
|
||||||
className={classNames(
|
className={classNames(
|
||||||
styles.CopyButtonContainer,
|
styles.CopyButtonContainer,
|
||||||
'bg-white absolute top-[10px] right-[10px] rounded-md z-10 text-lg flex items-center justify-center opacity-0 group-hover:opacity-100',
|
'bg-transparant absolute top-[10px] right-[10px] rounded-md z-10 text-lg flex items-center justify-center opacity-0 group-hover:opacity-100',
|
||||||
{
|
{
|
||||||
'rounded-l-0 opacity-100': copied,
|
'rounded-l-0 opacity-100': copied,
|
||||||
},
|
},
|
||||||
@ -62,7 +62,7 @@ export const CodeBlock = memo(
|
|||||||
{!disableCopy && (
|
{!disableCopy && (
|
||||||
<button
|
<button
|
||||||
className={classNames(
|
className={classNames(
|
||||||
'flex items-center bg-transparent p-[6px] justify-center before:bg-white before:rounded-l-md before:text-gray-500 before:border-r before:border-gray-300',
|
'flex items-center bg-accent-500 p-[6px] justify-center before:bg-white before:rounded-l-md before:text-gray-500 before:border-r before:border-gray-300 rounded-md transition-theme',
|
||||||
{
|
{
|
||||||
'before:opacity-0': !copied,
|
'before:opacity-0': !copied,
|
||||||
'before:opacity-100': copied,
|
'before:opacity-100': copied,
|
||||||
|
@ -8,6 +8,8 @@ import { Chat } from '~/components/chat/Chat.client';
|
|||||||
import { useGit } from '~/lib/hooks/useGit';
|
import { useGit } from '~/lib/hooks/useGit';
|
||||||
import { useChatHistory } from '~/lib/persistence';
|
import { useChatHistory } from '~/lib/persistence';
|
||||||
import { createCommandsMessage, detectProjectCommands } from '~/utils/projectCommands';
|
import { createCommandsMessage, detectProjectCommands } from '~/utils/projectCommands';
|
||||||
|
import { LoadingOverlay } from '~/components/ui/LoadingOverlay';
|
||||||
|
import { toast } from 'react-toastify';
|
||||||
|
|
||||||
const IGNORE_PATTERNS = [
|
const IGNORE_PATTERNS = [
|
||||||
'node_modules/**',
|
'node_modules/**',
|
||||||
@ -38,6 +40,7 @@ export function GitUrlImport() {
|
|||||||
const { ready: historyReady, importChat } = useChatHistory();
|
const { ready: historyReady, importChat } = useChatHistory();
|
||||||
const { ready: gitReady, gitClone } = useGit();
|
const { ready: gitReady, gitClone } = useGit();
|
||||||
const [imported, setImported] = useState(false);
|
const [imported, setImported] = useState(false);
|
||||||
|
const [loading, setLoading] = useState(true);
|
||||||
|
|
||||||
const importRepo = async (repoUrl?: string) => {
|
const importRepo = async (repoUrl?: string) => {
|
||||||
if (!gitReady && !historyReady) {
|
if (!gitReady && !historyReady) {
|
||||||
@ -109,9 +112,23 @@ ${file.content}
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
importRepo(url);
|
importRepo(url).catch((error) => {
|
||||||
|
console.error('Error importing repo:', error);
|
||||||
|
toast.error('Failed to import repository');
|
||||||
|
setLoading(false);
|
||||||
|
window.location.href = '/';
|
||||||
|
});
|
||||||
setImported(true);
|
setImported(true);
|
||||||
}, [searchParams, historyReady, gitReady, imported]);
|
}, [searchParams, historyReady, gitReady, imported]);
|
||||||
|
|
||||||
return <ClientOnly fallback={<BaseChat />}>{() => <Chat />}</ClientOnly>;
|
return (
|
||||||
|
<ClientOnly fallback={<BaseChat />}>
|
||||||
|
{() => (
|
||||||
|
<>
|
||||||
|
<Chat />
|
||||||
|
{loading && <LoadingOverlay message="Please wait while we clone the repository..." />}
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</ClientOnly>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
14
app/components/ui/LoadingOverlay.tsx
Normal file
14
app/components/ui/LoadingOverlay.tsx
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
export const LoadingOverlay = ({ message = 'Loading...' }) => {
|
||||||
|
return (
|
||||||
|
<div className="fixed inset-0 flex items-center justify-center bg-black/80 z-50 backdrop-blur-sm">
|
||||||
|
{/* Loading content */}
|
||||||
|
<div className="relative flex flex-col items-center gap-4 p-8 rounded-lg bg-bolt-elements-background-depth-2 shadow-lg">
|
||||||
|
<div
|
||||||
|
className={'i-svg-spinners:90-ring-with-bg text-bolt-elements-loader-progress'}
|
||||||
|
style={{ fontSize: '2rem' }}
|
||||||
|
></div>
|
||||||
|
<p className="text-lg text-bolt-elements-textTertiary">{message}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
@ -4,6 +4,7 @@ import { ClientOnly } from 'remix-utils/client-only';
|
|||||||
import { BaseChat } from '~/components/chat/BaseChat';
|
import { BaseChat } from '~/components/chat/BaseChat';
|
||||||
import { GitUrlImport } from '~/components/git/GitUrlImport.client';
|
import { GitUrlImport } from '~/components/git/GitUrlImport.client';
|
||||||
import { Header } from '~/components/header/Header';
|
import { Header } from '~/components/header/Header';
|
||||||
|
import BackgroundRays from '~/components/ui/BackgroundRays';
|
||||||
|
|
||||||
export const meta: MetaFunction = () => {
|
export const meta: MetaFunction = () => {
|
||||||
return [{ title: 'Bolt' }, { name: 'description', content: 'Talk with Bolt, an AI assistant from StackBlitz' }];
|
return [{ title: 'Bolt' }, { name: 'description', content: 'Talk with Bolt, an AI assistant from StackBlitz' }];
|
||||||
@ -15,7 +16,8 @@ export async function loader(args: LoaderFunctionArgs) {
|
|||||||
|
|
||||||
export default function Index() {
|
export default function Index() {
|
||||||
return (
|
return (
|
||||||
<div className="flex flex-col h-full w-full">
|
<div className="flex flex-col h-full w-full bg-bolt-elements-background-depth-1">
|
||||||
|
<BackgroundRays />
|
||||||
<Header />
|
<Header />
|
||||||
<ClientOnly fallback={<BaseChat />}>{() => <GitUrlImport />}</ClientOnly>
|
<ClientOnly fallback={<BaseChat />}>{() => <GitUrlImport />}</ClientOnly>
|
||||||
</div>
|
</div>
|
||||||
|
Loading…
Reference in New Issue
Block a user