Skip to content
Merged
9 changes: 0 additions & 9 deletions frontend/src/app/(main)/chat/layout.tsx

This file was deleted.

5 changes: 0 additions & 5 deletions frontend/src/app/(main)/chat/page.tsx

This file was deleted.

24 changes: 0 additions & 24 deletions frontend/src/app/(main)/layout.tsx

This file was deleted.

9 changes: 9 additions & 0 deletions frontend/src/app/chat/layout.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import ChatLayout from '../../components/chat/chat-layout';

export default function Layout({
children,
}: Readonly<{
children: React.ReactNode;
}>) {
return <ChatLayout>{children}</ChatLayout>;
}
5 changes: 5 additions & 0 deletions frontend/src/app/chat/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import Chat from '@/components/chat';

export default function Page() {
return <Chat />;
}
16 changes: 13 additions & 3 deletions frontend/src/app/layout.tsx
Original file line number Diff line number Diff line change
@@ -1,15 +1,21 @@
import type { Metadata } from 'next';
import type { Metadata, Viewport } from 'next';
import { Inter } from 'next/font/google';
import './globals.css';
import { BaseProviders } from '@/providers/BaseProvider';

const inter = Inter({ subsets: ['latin'] });

export const metadata: Metadata = {
title: 'Codefox',
title: 'Codefox - The best dev project generator',
description: 'The best dev project generator',
};

export const viewport: Viewport = {
width: 'device-width',
initialScale: 1,
maximumScale: 1,
userScalable: false,
};
export default function RootLayout({
children,
}: {
Expand All @@ -18,7 +24,11 @@ export default function RootLayout({
return (
<html lang="en" suppressHydrationWarning>
<body className={inter.className}>
<BaseProviders>{children}</BaseProviders>
<BaseProviders>
<div className="min-h-screen w-full bg-gray-50 dark:bg-gray-900 transition-colors">
{children}
</div>
</BaseProviders>
</body>
</html>
);
Expand Down
File renamed without changes.
2 changes: 1 addition & 1 deletion frontend/src/components/chat/chat-bottombar.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
'use client';

import React, { useEffect } from 'react';
import { ChatProps } from './chat';
import { ChatProps } from './chat-panel';
import Link from 'next/link';
import { cn } from '@/lib/utils';
import { Button, buttonVariants } from '../ui/button';
Expand Down
129 changes: 129 additions & 0 deletions frontend/src/components/chat/chat-layout.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
'use client';
import React, { useEffect, useState } from 'react';
import { useRouter } from 'next/navigation';
import { ResizablePanel, ResizablePanelGroup } from '@/components/ui/resizable';
import { SidebarProvider } from '@/components/ui/sidebar';
import { ChatSideBar } from '@/components/sidebar';

import ProjectModal from '@/components/chat/project-modal';
import { useQuery } from '@apollo/client';
import { useChatList } from '@/hooks/useChatList';
import { GET_USER_PROJECTS } from '@/graphql/request';
import { useAuthContext } from '@/providers/AuthProvider';
import { ProjectProvider } from './code-engine/project-context';

export default function ChatLayout({
children,
}: {
children: React.ReactNode;
}) {
const { isAuthorized, isChecking } = useAuthContext();
const [isModalOpen, setIsModalOpen] = useState(false);
const [isCollapsed, setIsCollapsed] = useState(false);
const [isMobile, setIsMobile] = useState(false);

const defaultLayout = [25, 75]; // [sidebar, main]
const navCollapsedSize = 5;

const { refetch } = useQuery(GET_USER_PROJECTS);
const {
chats,
loading,
error,
chatListUpdated,
setChatListUpdated,
refetchChats,
} = useChatList();

const router = useRouter();

useEffect(() => {
if (isChecking || !isAuthorized) {
router.push('/');
}
}, [isChecking, isAuthorized, router]);

useEffect(() => {
document.cookie = `react-resizable-panels:collapsed=${JSON.stringify(
isCollapsed
)}; path=/; max-age=604800`;
}, [isCollapsed]);

useEffect(() => {
const checkScreenWidth = () => {
setIsMobile(window.innerWidth <= 1023);
};
checkScreenWidth();
window.addEventListener('resize', checkScreenWidth);
return () => window.removeEventListener('resize', checkScreenWidth);
}, []);

if (isChecking) {
return (
<div className="flex h-screen items-center justify-center">
Loading...
</div>
);
}

if (!isAuthorized) {
return null;
}

return (
<main className="flex h-[calc(100dvh)] flex-col items-center">
<ResizablePanelGroup
direction="horizontal"
autoSaveId="main-layout"
onLayout={(sizes: number[]) => {
const sidebarSize = sizes[0];
const isNowCollapsed = sidebarSize < 10;
setIsCollapsed(isNowCollapsed);

if (isNowCollapsed && sizes.length > 1) {
const newSizes = [navCollapsedSize, 100 - navCollapsedSize];
document.cookie = `react-resizable-panels:layout=${JSON.stringify(
newSizes
)}; path=/; max-age=604800`;
return newSizes;
}

document.cookie = `react-resizable-panels:layout=${JSON.stringify(
sizes
)}; path=/; max-age=604800`;
return sizes;
}}
className="h-screen items-stretch w-full"
>
<ProjectProvider>
<SidebarProvider>
<ProjectModal
isOpen={isModalOpen}
onClose={() => setIsModalOpen(false)}
refetchProjects={refetch}
/>
<ChatSideBar
setIsModalOpen={setIsModalOpen}
isCollapsed={isCollapsed}
setIsCollapsed={setIsCollapsed}
isMobile={isMobile}
chatListUpdated={chatListUpdated}
setChatListUpdated={setChatListUpdated}
chats={chats}
loading={loading}
error={error}
onRefetch={refetchChats}
/>

<ResizablePanel
className="h-full w-full flex justify-center"
defaultSize={defaultLayout[1]}
>
{children}
</ResizablePanel>
</SidebarProvider>
</ProjectProvider>
</ResizablePanelGroup>
</main>
);
}
2 changes: 1 addition & 1 deletion frontend/src/components/chat/chat-list.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { Avatar, AvatarFallback, AvatarImage, SmallAvatar } from '../ui/avatar';
import Markdown from 'react-markdown';
import remarkGfm from 'remark-gfm';
import CodeDisplayBlock from '../code-display-block';
import { Message } from '../types';
import { Message } from '../../const/MessageType';
import { Button } from '../ui/button';
import { Pencil } from 'lucide-react';
import { useAuth } from '@/hooks/useAuth';
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import React from 'react';
import ChatBottombar from './chat-bottombar';
import ChatTopbar from './chat-topbar';
import { ChatRequestOptions, Message } from '../types';
import { ChatRequestOptions, Message } from '../../const/MessageType';
import ChatList from './chat-list';

export interface ChatProps {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,13 @@ import React, {
useEffect,
} from 'react';
import { useLazyQuery, useMutation, useQuery } from '@apollo/client';
import { Project } from '../project-modal';
import { useAuth } from '@/hooks/useAuth';
import {
CREATE_PROJECT,
GET_CHAT_DETAILS,
GET_USER_PROJECTS,
} from '@/graphql/request';
import { Project } from '../project-modal';

export interface ProjectContextType {
projects: Project[];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,18 @@ import {
ResizablePanel,
ResizableHandle,
} from '@/components/ui/resizable';
import { CodeEngine } from '@/components/code-engine/code-engine';
import { GET_CHAT_HISTORY } from '@/graphql/request';
import { useQuery } from '@apollo/client';
import { toast } from 'sonner';
import { EventEnum } from '@/components/enum';
import { useModels } from '../../../hooks/useModels';
import { useChatList } from '../../../hooks/useChatList';
import { useChatStream } from '../../../hooks/useChatStream';
import { EventEnum } from '@/const/EventEnum';
import EditUsernameForm from '@/components/edit-username-form';
import ChatContent from '@/components/chat/chat';
import ChatContent from '@/components/chat/chat-panel';
import { useModels } from '@/hooks/useModels';
import { useChatList } from '@/hooks/useChatList';
import { useChatStream } from '@/hooks/useChatStream';
import { CodeEngine } from './code-engine/code-engine';

export default function Home() {
export default function Chat() {
// Initialize state, refs, and custom hooks
const urlParams = new URLSearchParams(window.location.search);
const [chatId, setChatId] = useState('');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,15 @@ import { ResizablePanel, ResizablePanelGroup } from '@/components/ui/resizable';
import { SidebarProvider } from '@/components/ui/sidebar';
import { ChatSideBar } from '@/components/sidebar';

import ProjectModal from '@/components/project-modal';
import ProjectModal from '@/components/chat/project-modal';
import { useQuery } from '@apollo/client';
import { ProjectProvider } from '@/components/code-engine/project-context';

import { useChatList } from '@/hooks/useChatList';
import { GET_USER_PROJECTS } from '@/graphql/request';
import { useAuthContext } from '@/providers/AuthProvider';
import { ProjectProvider } from './code-engine/project-context';

export default function MainLayout({
export default function ChatLayout({
children,
}: {
children: React.ReactNode;
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/components/file-sidebar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import SidebarSkeleton from './sidebar-skeleton';
import UserSettings from './user-settings';
import { SideBarItem } from './sidebar-item';
import { Chat } from '@/graphql/type';
import { EventEnum } from './enum';
import { EventEnum } from '../const/EventEnum';
import {
SidebarContent,
SidebarGroup,
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/components/sidebar-item.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ import Link from 'next/link';
import { useRouter } from 'next/navigation';
import { useEffect, useState } from 'react';
import { toast } from 'sonner';
import { EventEnum } from './enum';
import { EventEnum } from '../const/EventEnum';

interface SideBarItemProps {
id: string;
Expand Down
4 changes: 2 additions & 2 deletions frontend/src/components/sidebar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import SidebarSkeleton from './sidebar-skeleton';
import UserSettings from './user-settings';
import { SideBarItem } from './sidebar-item';
import { Chat } from '@/graphql/type';
import { EventEnum } from './enum';
import { EventEnum } from '../const/EventEnum';
import {
SidebarContent,
SidebarGroup,
Expand All @@ -18,7 +18,7 @@ import {
SidebarFooter,
} from './ui/sidebar';
import { cn } from '@/lib/utils';
import { ProjectContext } from './code-engine/project-context';
import { ProjectContext } from './chat/code-engine/project-context';

interface SidebarProps {
setIsModalOpen: (value: boolean) => void; // Parent setter to update collapse state
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/components/user-settings.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import { Button } from '@/components/ui/button';
import { useAuth } from '@/hooks/useAuth';
import { useRouter } from 'next/navigation';
import { useMemo, useState, memo } from 'react';
import { EventEnum } from './enum';
import { EventEnum } from '../const/EventEnum';

interface UserSettingsProps {
isSimple: boolean;
Expand Down
File renamed without changes.
File renamed without changes.
2 changes: 1 addition & 1 deletion frontend/src/hooks/useChatStream.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { useState, useCallback } from 'react';
import { useMutation, useSubscription } from '@apollo/client';
import { CHAT_STREAM, CREATE_CHAT, TRIGGER_CHAT } from '@/graphql/request';
import { Message } from '@/components/types';
import { Message } from '@/const/MessageType';
import { toast } from 'sonner';
import { useRouter } from 'next/navigation';
enum StreamStatus {
Expand Down
Loading