home.tsx 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. "use client";
  2. import { IconButton } from "./button";
  3. import styles from "./home.module.css";
  4. import SettingsIcon from "../icons/settings.svg";
  5. import GithubIcon from "../icons/github.svg";
  6. import ChatGptIcon from "../icons/chatgpt.svg";
  7. import SendWhiteIcon from "../icons/send-white.svg";
  8. import BrainIcon from "../icons/brain.svg";
  9. import ExportIcon from "../icons/export.svg";
  10. import BotIcon from "../icons/bot.svg";
  11. import UserIcon from "../icons/user.svg";
  12. import AddIcon from "../icons/add.svg";
  13. export function ChatItem(props: {
  14. onClick?: () => void;
  15. title: string;
  16. count: number;
  17. time: string;
  18. selected: boolean;
  19. }) {
  20. return (
  21. <div
  22. className={`${styles["chat-item"]} ${
  23. props.selected && styles["chat-item-selected"]
  24. }`}
  25. >
  26. <div className={styles["chat-item-title"]}>{props.title}</div>
  27. <div className={styles["chat-item-info"]}>
  28. <div className={styles["chat-item-count"]}>{props.count} 条对话</div>
  29. <div className={styles["chat-item-date"]}>{props.time}</div>
  30. </div>
  31. </div>
  32. );
  33. }
  34. export function ChatList() {
  35. const listData = new Array(5).fill({
  36. title: "这是一个标题",
  37. count: 10,
  38. time: new Date().toLocaleString(),
  39. });
  40. const selectedIndex = 0;
  41. return (
  42. <div className={styles["chat-list"]}>
  43. {listData.map((item, i) => (
  44. <ChatItem {...item} key={i} selected={i === selectedIndex} />
  45. ))}
  46. </div>
  47. );
  48. }
  49. export function Chat() {
  50. const messages = [
  51. {
  52. role: "user",
  53. content: "这是一条消息",
  54. date: new Date().toLocaleString(),
  55. },
  56. {
  57. role: "bot",
  58. content: "这是一条回复".repeat(10),
  59. date: new Date().toLocaleString(),
  60. },
  61. ];
  62. const title = "这是一个标题";
  63. const count = 10;
  64. return (
  65. <div className={styles.chat}>
  66. <div className={styles["chat-header"]}>
  67. <div>
  68. <div className={styles["chat-header-title"]}>{title}</div>
  69. <div className={styles["chat-header-sub-title"]}>
  70. 与 ChatGPT 的 {count} 条对话
  71. </div>
  72. </div>
  73. <div className={styles["chat-actions"]}>
  74. <div className={styles["chat-action-button"]}>
  75. <IconButton icon={<BrainIcon />} bordered />
  76. </div>
  77. <div className={styles["chat-action-button"]}>
  78. <IconButton icon={<ExportIcon />} bordered />
  79. </div>
  80. </div>
  81. </div>
  82. <div className={styles["chat-body"]}>
  83. {messages.map((message, i) => {
  84. const isUser = message.role === "user";
  85. return (
  86. <div
  87. key={i}
  88. className={
  89. isUser ? styles["chat-message-reverse"] : styles["chat-message"]
  90. }
  91. >
  92. <div className={styles["chat-message-container"]}>
  93. <div className={styles["chat-message-avtar"]}>
  94. {message.role === "user" ? <UserIcon /> : <BotIcon />}
  95. </div>
  96. <div className={styles["chat-message-item"]}>
  97. {message.content}
  98. </div>
  99. {!isUser && (
  100. <div className={styles["chat-message-actions"]}>
  101. <div className={styles["chat-message-action-date"]}>
  102. {message.date}
  103. </div>
  104. </div>
  105. )}
  106. </div>
  107. </div>
  108. );
  109. })}
  110. </div>
  111. <div className={styles["chat-input-panel"]}>
  112. <div className={styles["chat-input-panel-inner"]}>
  113. <textarea
  114. className={styles["chat-input"]}
  115. placeholder="输入消息"
  116. rows={3}
  117. />
  118. <IconButton
  119. icon={<SendWhiteIcon />}
  120. text={"发送"}
  121. className={styles["chat-input-send"]}
  122. />
  123. </div>
  124. </div>
  125. </div>
  126. );
  127. }
  128. export function Home() {
  129. return (
  130. <div className={styles.container}>
  131. <div className={styles.sidebar}>
  132. <div className={styles["sidebar-header"]}>
  133. <div className={styles["sidebar-title"]}>ChatGPT Next</div>
  134. <div className={styles["sidebar-sub-title"]}>
  135. Build your own AI assistant.
  136. </div>
  137. <div className={styles["sidebar-logo"]}>
  138. <ChatGptIcon />
  139. </div>
  140. </div>
  141. <div className={styles["sidebar-body"]}>
  142. <ChatList />
  143. </div>
  144. <div className={styles["sidebar-tail"]}>
  145. <div className={styles["sidebar-actions"]}>
  146. <div className={styles["sidebar-action"]}>
  147. <IconButton icon={<SettingsIcon />} />
  148. </div>
  149. <div className={styles["sidebar-action"]}>
  150. <IconButton icon={<GithubIcon />} />
  151. </div>
  152. </div>
  153. <div>
  154. <IconButton icon={<AddIcon />} text={"新的聊天"} />
  155. </div>
  156. </div>
  157. </div>
  158. <Chat key="chat" />
  159. </div>
  160. );
  161. }