1
0
mirror of https://github.com/kamranahmedse/developer-roadmap.git synced 2025-09-03 14:22:41 +02:00

Add plus for chat icons

This commit is contained in:
Kamran Ahmed
2025-06-13 01:15:51 +01:00
parent 5cc96b2dd0
commit 11eda4d443
2 changed files with 63 additions and 41 deletions

View File

@@ -3,6 +3,7 @@ import type { JSONContent } from '@tiptap/core';
import { import {
BookOpen, BookOpen,
ChevronDown, ChevronDown,
Loader2Icon,
MessageCirclePlus, MessageCirclePlus,
PauseCircleIcon, PauseCircleIcon,
PersonStanding, PersonStanding,
@@ -376,7 +377,18 @@ export function RoadmapFloatingChat(props: RoadmapChatProps) {
> >
{isOpen && ( {isOpen && (
<> <>
<div className="flex h-full w-full flex-col overflow-hidden rounded-lg bg-white shadow-lg"> <div className="relative flex h-full w-full flex-col overflow-hidden rounded-lg bg-white shadow-lg">
{isChatHistoryLoading && (
<div className="absolute inset-0 z-50 flex items-center justify-center bg-white">
<div className="flex items-center rounded-md border border-gray-200 py-2 pr-3 pl-2">
<Loader2Icon className="size-4 animate-spin stroke-[2.5] text-gray-400" />
<span className="ml-2 text-sm text-gray-500">
Loading history..
</span>
</div>
</div>
)}
<div className="flex items-center justify-between px-3 py-2"> <div className="flex items-center justify-between px-3 py-2">
<div className="flex"> <div className="flex">
<ChatHeaderButton <ChatHeaderButton
@@ -392,6 +404,7 @@ export function RoadmapFloatingChat(props: RoadmapChatProps) {
<ChatHeaderButton <ChatHeaderButton
onClick={() => { onClick={() => {
setActiveChatHistoryId(undefined); setActiveChatHistoryId(undefined);
inputRef.current?.focus();
}} }}
icon={<Plus className="h-3.5 w-3.5" />} icon={<Plus className="h-3.5 w-3.5" />}
className="justify-center rounded-md bg-gray-200 px-2 py-1 text-xs text-black hover:bg-gray-300" className="justify-center rounded-md bg-gray-200 px-2 py-1 text-xs text-black hover:bg-gray-300"

View File

@@ -1,8 +1,17 @@
import './RoadmapAIChat.css'; import './RoadmapAIChat.css';
import { useQuery } from '@tanstack/react-query'; import { useQuery } from '@tanstack/react-query';
import { roadmapJSONOptions } from '../../queries/roadmap'; import type { Editor, JSONContent } from '@tiptap/core';
import { queryClient } from '../../stores/query-client'; import {
Bot,
Frown,
HistoryIcon,
Loader2Icon,
LockIcon,
PauseCircleIcon,
SendIcon,
XIcon,
} from 'lucide-react';
import { import {
Fragment, Fragment,
useCallback, useCallback,
@@ -12,49 +21,41 @@ import {
useRef, useRef,
useState, useState,
} from 'react'; } from 'react';
import {
Bot,
Frown,
Loader2Icon,
LockIcon,
PauseCircleIcon,
SendIcon,
FileIcon,
} from 'lucide-react';
import { ChatEditor } from '../ChatEditor/ChatEditor';
import { roadmapTreeMappingOptions } from '../../queries/roadmap-tree';
import { isLoggedIn } from '../../lib/jwt';
import type { JSONContent, Editor } from '@tiptap/core';
import { flushSync } from 'react-dom'; import { flushSync } from 'react-dom';
import { getAiCourseLimitOptions } from '../../queries/ai-course';
import { useToast } from '../../hooks/use-toast';
import { userResourceProgressOptions } from '../../queries/resource-progress';
import { ChatRoadmapRenderer } from './ChatRoadmapRenderer';
import { RoadmapAIChatCard } from './RoadmapAIChatCard';
import { RoadmapAIChatHeader } from './RoadmapAIChatHeader';
import { showLoginPopup } from '../../lib/popup';
import { UpgradeAccountModal } from '../Billing/UpgradeAccountModal';
import { billingDetailsOptions } from '../../queries/billing';
import { TopicDetail } from '../TopicDetail/TopicDetail';
import { slugify } from '../../lib/slugger';
import { AIChatActionButtons } from './AIChatActionButtons';
import { cn } from '../../lib/classname';
import {
getTailwindScreenDimension,
type TailwindScreenDimensions,
} from '../../lib/is-mobile';
import { ChatPersona } from '../UserPersona/ChatPersona';
import { userRoadmapPersonaOptions } from '../../queries/user-persona';
import { UpdatePersonaModal } from '../UserPersona/UpdatePersonaModal';
import { lockBodyScroll } from '../../lib/dom';
import { TutorIntroMessage } from './TutorIntroMessage';
import { import {
roadmapAIChatRenderer, roadmapAIChatRenderer,
useRoadmapAIChat, useRoadmapAIChat,
type RoadmapAIChatHistoryType, type RoadmapAIChatHistoryType,
} from '../../hooks/use-roadmap-ai-chat'; } from '../../hooks/use-roadmap-ai-chat';
import { chatHistoryOptions } from '../../queries/chat-history'; import { useToast } from '../../hooks/use-toast';
import { deleteUrlParam, getUrlParams } from '../../lib/browser'; import { deleteUrlParam, getUrlParams } from '../../lib/browser';
import { cn } from '../../lib/classname';
import { lockBodyScroll } from '../../lib/dom';
import {
getTailwindScreenDimension,
type TailwindScreenDimensions,
} from '../../lib/is-mobile';
import { isLoggedIn } from '../../lib/jwt';
import { showLoginPopup } from '../../lib/popup';
import { slugify } from '../../lib/slugger';
import { getAiCourseLimitOptions } from '../../queries/ai-course';
import { billingDetailsOptions } from '../../queries/billing';
import { chatHistoryOptions } from '../../queries/chat-history';
import { userResourceProgressOptions } from '../../queries/resource-progress';
import { roadmapJSONOptions } from '../../queries/roadmap';
import { roadmapTreeMappingOptions } from '../../queries/roadmap-tree';
import { userRoadmapPersonaOptions } from '../../queries/user-persona';
import { queryClient } from '../../stores/query-client';
import { UpgradeAccountModal } from '../Billing/UpgradeAccountModal';
import { ChatEditor } from '../ChatEditor/ChatEditor';
import { TopicDetail } from '../TopicDetail/TopicDetail';
import { ChatPersona } from '../UserPersona/ChatPersona';
import { UpdatePersonaModal } from '../UserPersona/UpdatePersonaModal';
import { AIChatActionButtons } from './AIChatActionButtons';
import { ChatRoadmapRenderer } from './ChatRoadmapRenderer';
import { RoadmapAIChatCard } from './RoadmapAIChatCard';
import { RoadmapAIChatHeader } from './RoadmapAIChatHeader';
import { TutorIntroMessage } from './TutorIntroMessage';
export type RoadmapAIChatTab = 'chat' | 'topic'; export type RoadmapAIChatTab = 'chat' | 'topic';
@@ -404,11 +405,19 @@ export function RoadmapAIChat(props: RoadmapAIChatProps) {
{activeTab === 'chat' && ( {activeTab === 'chat' && (
<> <>
{!!chatHistory && isPaidUser && !isChatHistoryLoading && ( {!!chatHistory && isPaidUser && !isChatHistoryLoading && (
<div className="flex flex-col border-b border-gray-200 px-3 py-2 text-sm text-gray-500"> <div className="flex flex-row items-center justify-between border-b border-gray-200 bg-gray-100 px-3 py-2 text-sm text-gray-500">
<h3 className="flex min-w-0 items-center gap-2"> <h3 className="flex min-w-0 items-center gap-2">
<FileIcon className="size-4 shrink-0" /> <HistoryIcon className="size-4 shrink-0" />
<span className="truncate">{chatHistory.title}</span> <span className="truncate">{chatHistory.title}</span>
</h3> </h3>
<button
onClick={() => {
setActiveChatHistoryId(undefined);
}}
className="text-sm text-gray-500 hover:text-gray-700"
>
<XIcon className="size-4" />
</button>
</div> </div>
)} )}