light/dark code highlight
This commit is contained in:
parent
f56501ba7c
commit
b6d5576227
|
@ -9,11 +9,12 @@ interface Props {
|
|||
model: OpenAIModel;
|
||||
messages: Message[];
|
||||
loading: boolean;
|
||||
lightMode: "light" | "dark";
|
||||
onSend: (message: Message) => void;
|
||||
onSelect: (model: OpenAIModel) => void;
|
||||
}
|
||||
|
||||
export const Chat: FC<Props> = ({ model, messages, loading, onSend, onSelect }) => {
|
||||
export const Chat: FC<Props> = ({ model, messages, loading, lightMode, onSend, onSelect }) => {
|
||||
const messagesEndRef = useRef<HTMLDivElement>(null);
|
||||
|
||||
const scrollToBottom = () => {
|
||||
|
@ -44,7 +45,10 @@ export const Chat: FC<Props> = ({ model, messages, loading, onSend, onSelect })
|
|||
|
||||
{messages.map((message, index) => (
|
||||
<div key={index}>
|
||||
<ChatMessage message={message} />
|
||||
<ChatMessage
|
||||
message={message}
|
||||
lightMode={lightMode}
|
||||
/>
|
||||
</div>
|
||||
))}
|
||||
{loading && <ChatLoader />}
|
||||
|
|
|
@ -5,9 +5,10 @@ import { CodeBlock } from "../Markdown/CodeBlock";
|
|||
|
||||
interface Props {
|
||||
message: Message;
|
||||
lightMode: "light" | "dark";
|
||||
}
|
||||
|
||||
export const ChatMessage: FC<Props> = ({ message }) => {
|
||||
export const ChatMessage: FC<Props> = ({ message, lightMode }) => {
|
||||
return (
|
||||
<div
|
||||
className={`flex justify-center px-[120px] py-[30px] whitespace-pre-wrap] ${message.role === "assistant" ? "dark:bg-[#444654] dark:text-neutral-100 bg-neutral-100 text-neutral-900 border border-neutral-300 dark:border-none" : "dark:bg-[#343541] dark:text-white text-neutral-900"}`}
|
||||
|
@ -26,6 +27,7 @@ export const ChatMessage: FC<Props> = ({ message }) => {
|
|||
key={Math.random()}
|
||||
language={match[1]}
|
||||
value={String(children).replace(/\n$/, "")}
|
||||
lightMode={lightMode}
|
||||
{...props}
|
||||
/>
|
||||
) : (
|
||||
|
|
|
@ -1,13 +1,14 @@
|
|||
import { FC, useState } from "react";
|
||||
import { Prism as SyntaxHighlighter } from "react-syntax-highlighter";
|
||||
import { tomorrow } from "react-syntax-highlighter/dist/cjs/styles/prism";
|
||||
import { oneDark, oneLight } from "react-syntax-highlighter/dist/cjs/styles/prism";
|
||||
|
||||
interface Props {
|
||||
language: string;
|
||||
value: string;
|
||||
lightMode: "light" | "dark";
|
||||
}
|
||||
|
||||
export const CodeBlock: FC<Props> = ({ language, value }) => {
|
||||
export const CodeBlock: FC<Props> = ({ language, value, lightMode }) => {
|
||||
const [buttonText, setButtonText] = useState("Copy");
|
||||
|
||||
const copyToClipboard = () => {
|
||||
|
@ -21,16 +22,16 @@ export const CodeBlock: FC<Props> = ({ language, value }) => {
|
|||
};
|
||||
|
||||
return (
|
||||
<div className="relative">
|
||||
<div className="relative text-[16px]">
|
||||
<SyntaxHighlighter
|
||||
language={language}
|
||||
style={tomorrow}
|
||||
style={lightMode === "light" ? oneLight : oneDark}
|
||||
>
|
||||
{value}
|
||||
</SyntaxHighlighter>
|
||||
|
||||
<button
|
||||
className="absolute top-2 right-2 text-white bg-blue-600 py-1 px-2 rounded focus:outline-none hover:bg-blue-700"
|
||||
className="absolute top-2 right-2 text-white bg-blue-600 py-1 px-2 rounded focus:outline-none hover:bg-blue-700 text-sm"
|
||||
onClick={copyToClipboard}
|
||||
>
|
||||
{buttonText}
|
||||
|
|
|
@ -231,6 +231,7 @@ export default function Home() {
|
|||
model={model}
|
||||
messages={selectedConversation.messages}
|
||||
loading={loading}
|
||||
lightMode={lightMode}
|
||||
onSend={handleSend}
|
||||
onSelect={setModel}
|
||||
/>
|
||||
|
|
Loading…
Reference in New Issue