@lobehub/chat 0.152.0 → 0.152.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (255) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/README.md +8 -8
  3. package/README.zh-CN.md +8 -8
  4. package/locales/ar/common.json +14 -0
  5. package/locales/ar/setting.json +4 -1
  6. package/locales/bg-BG/common.json +14 -0
  7. package/locales/bg-BG/setting.json +4 -1
  8. package/locales/de-DE/common.json +14 -0
  9. package/locales/de-DE/setting.json +4 -1
  10. package/locales/en-US/common.json +14 -0
  11. package/locales/en-US/setting.json +4 -1
  12. package/locales/es-ES/common.json +14 -0
  13. package/locales/es-ES/setting.json +4 -1
  14. package/locales/fr-FR/common.json +14 -0
  15. package/locales/fr-FR/setting.json +4 -1
  16. package/locales/it-IT/common.json +14 -0
  17. package/locales/it-IT/setting.json +4 -1
  18. package/locales/ja-JP/common.json +14 -0
  19. package/locales/ja-JP/setting.json +4 -1
  20. package/locales/ko-KR/common.json +14 -0
  21. package/locales/ko-KR/setting.json +4 -1
  22. package/locales/nl-NL/common.json +14 -0
  23. package/locales/nl-NL/setting.json +4 -1
  24. package/locales/pl-PL/common.json +14 -0
  25. package/locales/pl-PL/setting.json +4 -1
  26. package/locales/pt-BR/common.json +14 -0
  27. package/locales/pt-BR/setting.json +4 -1
  28. package/locales/ru-RU/common.json +14 -0
  29. package/locales/ru-RU/setting.json +4 -1
  30. package/locales/tr-TR/common.json +14 -0
  31. package/locales/tr-TR/setting.json +4 -1
  32. package/locales/vi-VN/common.json +14 -0
  33. package/locales/vi-VN/setting.json +4 -1
  34. package/locales/zh-CN/common.json +14 -0
  35. package/locales/zh-CN/setting.json +4 -1
  36. package/locales/zh-TW/common.json +14 -0
  37. package/locales/zh-TW/setting.json +4 -1
  38. package/package.json +1 -1
  39. package/src/app/(main)/(mobile)/me/features/AvatarBanner.tsx +52 -0
  40. package/src/app/(main)/(mobile)/me/features/Cate.tsx +34 -0
  41. package/src/app/(main)/(mobile)/me/features/ExtraCate.tsx +26 -0
  42. package/src/app/(main)/(mobile)/me/features/useExtraCate.tsx +68 -0
  43. package/src/app/(main)/(mobile)/me/layout.tsx +11 -0
  44. package/src/app/(main)/(mobile)/me/loading.tsx +17 -0
  45. package/src/app/(main)/(mobile)/me/page.tsx +31 -0
  46. package/src/app/(main)/@nav/_layout/Desktop/BottomActions.tsx +7 -120
  47. package/src/app/(main)/@nav/_layout/Desktop/index.tsx +7 -2
  48. package/src/app/(main)/@nav/_layout/Mobile.tsx +3 -3
  49. package/src/app/(main)/@nav/features/UserAvatar.tsx +24 -0
  50. package/src/app/(main)/@nav/features/UserPanel/LangButton.tsx +55 -0
  51. package/src/app/(main)/@nav/features/UserPanel/Popover.tsx +34 -0
  52. package/src/app/(main)/@nav/features/UserPanel/ThemeButton.tsx +70 -0
  53. package/src/app/(main)/@nav/features/UserPanel/UserInfo.tsx +35 -0
  54. package/src/app/(main)/@nav/features/UserPanel/index.tsx +69 -0
  55. package/src/app/(main)/@nav/features/UserPanel/useMenu.tsx +144 -0
  56. package/src/app/(main)/@nav/features/UserPanel/useNewVersion.tsx +12 -0
  57. package/src/app/(main)/chat/(mobile)/features/SessionHeader.tsx +1 -1
  58. package/src/app/(main)/chat/_layout/Desktop/index.tsx +6 -8
  59. package/src/app/(main)/chat/_layout/Mobile/index.tsx +5 -3
  60. package/src/app/(main)/chat/_layout/type.ts +5 -0
  61. package/src/app/(main)/chat/features/SettingButton.tsx +5 -2
  62. package/src/app/(main)/chat/layout.ts +5 -2
  63. package/src/app/(main)/chat/settings/{(desktop) → _layout/Desktop}/Header.tsx +2 -0
  64. package/src/app/(main)/chat/settings/_layout/Desktop/index.tsx +32 -0
  65. package/src/app/(main)/chat/settings/{(mobile) → _layout/Mobile}/Header.tsx +3 -2
  66. package/src/app/(main)/chat/settings/_layout/Mobile/index.tsx +15 -0
  67. package/src/app/(main)/chat/settings/error.tsx +5 -0
  68. package/src/app/(main)/chat/settings/features/HeaderContent.tsx +15 -9
  69. package/src/app/(main)/chat/settings/features/SubmitAgentButton/SubmitAgentModal.tsx +2 -0
  70. package/src/app/(main)/chat/settings/features/SubmitAgentButton/index.tsx +16 -8
  71. package/src/app/(main)/chat/settings/layout.tsx +9 -2
  72. package/src/app/(main)/chat/settings/loading.tsx +3 -0
  73. package/src/app/(main)/chat/settings/not-found.tsx +3 -0
  74. package/src/app/(main)/chat/settings/page.tsx +2 -9
  75. package/src/app/(main)/market/@detail/default.tsx +12 -0
  76. package/src/app/(main)/market/{features/AgentDetailContent/AgentInfo → @detail/features/AgentDetailContent}/Header.tsx +30 -21
  77. package/src/app/(main)/market/{features/AgentDetailContent/AgentInfo → @detail/features/AgentDetailContent}/index.tsx +10 -4
  78. package/src/app/(main)/market/{features/AgentDetailContent/AgentInfo → @detail/features/AgentDetailContent}/style.ts +7 -11
  79. package/src/app/(main)/market/@detail/loading.tsx +1 -0
  80. package/src/app/(main)/market/_layout/Desktop/{AgentDetail.tsx → DetailSidebar.tsx} +17 -12
  81. package/src/app/(main)/market/_layout/Desktop/Header.tsx +3 -6
  82. package/src/app/(main)/market/_layout/Desktop/Hero.tsx +39 -0
  83. package/src/app/(main)/market/_layout/Desktop/index.tsx +24 -44
  84. package/src/app/(main)/market/{(mobile)/features/AgentDetail.tsx → _layout/Mobile/DetailModal.tsx} +9 -7
  85. package/src/app/(main)/market/_layout/Mobile/Header.tsx +2 -2
  86. package/src/app/(main)/market/_layout/Mobile/index.tsx +17 -9
  87. package/src/app/(main)/market/_layout/type.ts +6 -0
  88. package/src/app/(main)/market/features/AgentCard/AgentCardBanner.tsx +10 -9
  89. package/src/app/(main)/market/features/AgentCard/index.tsx +133 -58
  90. package/src/app/(main)/market/features/AgentList.tsx +94 -0
  91. package/src/app/(main)/market/features/AgentSearchBar.tsx +42 -0
  92. package/src/app/(main)/market/features/ShareAgentButton/Inner.tsx +9 -7
  93. package/src/app/(main)/market/features/ShareAgentButton/index.tsx +22 -15
  94. package/src/app/(main)/market/features/TagList.tsx +65 -0
  95. package/src/app/(main)/market/layout.tsx +11 -0
  96. package/src/app/(main)/market/loading.tsx +2 -2
  97. package/src/app/(main)/market/page.tsx +22 -12
  98. package/src/app/(main)/settings/@category/default.tsx +16 -0
  99. package/src/app/(main)/settings/@category/features/CategoryContent.tsx +35 -0
  100. package/src/app/(main)/settings/@category/features/UpgradeAlert.tsx +38 -0
  101. package/src/app/(main)/settings/_layout/Desktop/Header.tsx +78 -23
  102. package/src/app/(main)/settings/_layout/Desktop/SideBar.tsx +39 -27
  103. package/src/app/(main)/settings/_layout/Desktop/index.tsx +41 -17
  104. package/src/app/(main)/settings/_layout/Mobile/{SubSettingHeader.tsx → Header.tsx} +3 -1
  105. package/src/app/(main)/settings/_layout/Mobile/index.tsx +7 -18
  106. package/src/app/(main)/settings/_layout/type.ts +6 -0
  107. package/src/app/(main)/settings/about/features/AboutList.tsx +122 -0
  108. package/src/app/(main)/settings/about/features/Analytics.tsx +42 -0
  109. package/src/app/(main)/settings/about/layout.tsx +26 -0
  110. package/src/app/(main)/settings/about/loading.tsx +5 -0
  111. package/src/app/(main)/settings/about/page.tsx +20 -25
  112. package/src/app/(main)/settings/agent/layout.tsx +35 -0
  113. package/src/app/(main)/settings/agent/loading.tsx +4 -2
  114. package/src/app/(main)/settings/agent/page.tsx +25 -12
  115. package/src/app/(main)/settings/common/{Common.tsx → features/Common.tsx} +7 -5
  116. package/src/app/(main)/settings/common/{Theme.tsx → features/Theme/index.tsx} +8 -6
  117. package/src/app/(main)/settings/common/page.tsx +21 -4
  118. package/src/app/(main)/settings/error.tsx +5 -0
  119. package/src/app/(main)/settings/features/Footer.tsx +2 -0
  120. package/src/app/(main)/settings/features/UpgradeAlert.tsx +21 -13
  121. package/src/app/(main)/settings/hooks/useCategory.tsx +54 -0
  122. package/src/app/(main)/settings/hooks/useSyncSettings.ts +2 -2
  123. package/src/app/(main)/settings/layout.ts +4 -1
  124. package/src/app/(main)/settings/llm/Anthropic/index.tsx +4 -10
  125. package/src/app/(main)/settings/llm/Azure/index.tsx +3 -1
  126. package/src/app/(main)/settings/llm/Bedrock/index.tsx +3 -1
  127. package/src/app/(main)/settings/llm/Google/index.tsx +4 -2
  128. package/src/app/(main)/settings/llm/Groq/index.tsx +3 -1
  129. package/src/app/(main)/settings/llm/Minimax/index.tsx +3 -9
  130. package/src/app/(main)/settings/llm/Mistral/index.tsx +3 -9
  131. package/src/app/(main)/settings/llm/Moonshot/index.tsx +3 -1
  132. package/src/app/(main)/settings/llm/Ollama/index.tsx +3 -1
  133. package/src/app/(main)/settings/llm/OpenAI/index.tsx +2 -0
  134. package/src/app/(main)/settings/llm/OpenRouter/index.tsx +3 -9
  135. package/src/app/(main)/settings/llm/Perplexity/index.tsx +3 -9
  136. package/src/app/(main)/settings/llm/TogetherAI/index.tsx +3 -9
  137. package/src/app/(main)/settings/llm/ZeroOne/index.tsx +3 -9
  138. package/src/app/(main)/settings/llm/Zhipu/index.tsx +3 -10
  139. package/src/app/(main)/settings/llm/components/Checker.tsx +2 -0
  140. package/src/app/(main)/settings/llm/components/Footer.tsx +26 -0
  141. package/src/app/(main)/settings/llm/components/ProviderConfig/index.tsx +16 -1
  142. package/src/app/(main)/settings/llm/page.tsx +57 -3
  143. package/src/app/(main)/settings/loading.tsx +9 -0
  144. package/src/app/(main)/settings/not-found.tsx +3 -0
  145. package/src/app/(main)/settings/page.tsx +2 -14
  146. package/src/app/(main)/settings/sync/{DeviceInfo → features/DeviceInfo}/Card.tsx +6 -5
  147. package/src/app/(main)/settings/sync/features/DeviceInfo/DeviceName.tsx +63 -0
  148. package/src/app/(main)/settings/sync/{components → features/DeviceInfo}/SystemIcon.tsx +6 -14
  149. package/src/app/(main)/settings/sync/{DeviceInfo → features/DeviceInfo}/index.tsx +22 -36
  150. package/src/app/(main)/settings/sync/{WebRTC → features/WebRTC}/ChannelNameInput.tsx +3 -3
  151. package/src/app/(main)/settings/sync/{WebRTC → features/WebRTC}/index.tsx +10 -9
  152. package/src/app/(main)/settings/sync/page.tsx +19 -11
  153. package/src/app/(main)/settings/tts/features/OpenAI.tsx +54 -0
  154. package/src/app/(main)/settings/tts/{TTS/index.tsx → features/STT.tsx} +11 -27
  155. package/src/app/(main)/settings/tts/page.tsx +17 -11
  156. package/src/app/@modal/(.)settings/about/layout.tsx +1 -0
  157. package/src/app/@modal/(.)settings/about/page.tsx +1 -0
  158. package/src/app/@modal/(.)settings/agent/layout.tsx +1 -0
  159. package/src/app/@modal/(.)settings/agent/page.tsx +1 -0
  160. package/src/app/@modal/(.)settings/common/page.tsx +1 -0
  161. package/src/app/@modal/(.)settings/layout.tsx +28 -0
  162. package/src/app/@modal/(.)settings/llm/page.tsx +1 -0
  163. package/src/app/@modal/(.)settings/loading.tsx +5 -0
  164. package/src/app/@modal/(.)settings/sync/page.tsx +1 -0
  165. package/src/app/@modal/(.)settings/tts/page.tsx +1 -0
  166. package/src/app/@modal/_layout/SettingModalLayout.tsx +59 -0
  167. package/src/app/@modal/chat/(.)settings/features/CategoryContent.tsx +36 -0
  168. package/src/app/@modal/chat/(.)settings/features/useCategory.tsx +62 -0
  169. package/src/app/@modal/chat/(.)settings/layout.tsx +55 -0
  170. package/src/app/@modal/chat/(.)settings/loading.tsx +5 -0
  171. package/src/app/@modal/chat/(.)settings/page.tsx +40 -0
  172. package/src/app/@modal/default.tsx +1 -0
  173. package/src/app/@modal/layout.tsx +30 -0
  174. package/src/app/@modal/loading.tsx +5 -0
  175. package/src/app/layout.tsx +11 -3
  176. package/src/components/BrandWatermark/index.tsx +39 -0
  177. package/src/components/Cell/Divider.tsx +19 -0
  178. package/src/components/Cell/index.tsx +38 -0
  179. package/src/components/Menu/index.tsx +97 -0
  180. package/src/components/SkeletonLoading/index.tsx +21 -0
  181. package/src/const/url.ts +1 -0
  182. package/src/features/AgentSetting/AgentChat/index.tsx +135 -0
  183. package/src/features/AgentSetting/AgentMeta/index.tsx +4 -3
  184. package/src/features/AgentSetting/AgentModal/index.tsx +95 -0
  185. package/src/features/AgentSetting/AgentPlugin/index.tsx +65 -66
  186. package/src/features/AgentSetting/AgentPrompt/index.tsx +101 -47
  187. package/src/features/AgentSetting/AgentTTS/index.tsx +4 -0
  188. package/src/features/AgentSetting/StoreUpdater.tsx +2 -0
  189. package/src/features/AgentSetting/index.tsx +6 -6
  190. package/src/features/AgentSetting/store/index.ts +2 -0
  191. package/src/features/AvatarWithUpload/index.tsx +2 -0
  192. package/src/features/ChatInput/STT/browser.tsx +1 -1
  193. package/src/features/ChatInput/STT/openai.tsx +1 -1
  194. package/src/features/Conversation/components/InboxWelcome/AgentsSuggest.tsx +2 -2
  195. package/src/hooks/useQuery.ts +7 -0
  196. package/src/hooks/useQueryRoute.ts +16 -0
  197. package/src/locales/default/common.ts +14 -0
  198. package/src/locales/default/setting.ts +3 -0
  199. package/src/locales/resources.ts +1 -0
  200. package/src/server/redirectHard.ts +9 -0
  201. package/src/server/translation.ts +20 -0
  202. package/src/services/__tests__/chat.test.ts +1 -1
  203. package/src/store/global/initialState.ts +1 -0
  204. package/src/store/market/action.ts +1 -1
  205. package/src/store/session/slices/session/action.ts +1 -1
  206. package/src/utils/difference.ts +2 -1
  207. package/src/app/(main)/@nav/_layout/Desktop/Avatar.tsx +0 -11
  208. package/src/app/(main)/chat/settings/(desktop)/index.tsx +0 -23
  209. package/src/app/(main)/chat/settings/(mobile)/index.tsx +0 -16
  210. package/src/app/(main)/market/(desktop)/index.tsx +0 -20
  211. package/src/app/(main)/market/(mobile)/features/AgentCard.tsx +0 -31
  212. package/src/app/(main)/market/(mobile)/index.tsx +0 -25
  213. package/src/app/(main)/market/components/Loading.tsx +0 -13
  214. package/src/app/(main)/market/features/AgentCard/AgentCardItem.tsx +0 -54
  215. package/src/app/(main)/market/features/AgentCard/style.ts +0 -33
  216. package/src/app/(main)/market/features/AgentDetailContent/index.tsx +0 -12
  217. package/src/app/(main)/market/features/AgentSearchBar/index.tsx +0 -40
  218. package/src/app/(main)/market/features/PageTitle/index.tsx +0 -13
  219. package/src/app/(main)/market/features/TagList/Inner.tsx +0 -28
  220. package/src/app/(main)/market/features/TagList/index.tsx +0 -23
  221. package/src/app/(main)/market/layout.ts +0 -8
  222. package/src/app/(main)/settings/(desktop)/index.tsx +0 -23
  223. package/src/app/(main)/settings/(mobile)/features/AvatarBanner.tsx +0 -68
  224. package/src/app/(main)/settings/(mobile)/features/ExtraList.tsx +0 -65
  225. package/src/app/(main)/settings/(mobile)/index.tsx +0 -53
  226. package/src/app/(main)/settings/about/AboutList.tsx +0 -53
  227. package/src/app/(main)/settings/about/Analytics.tsx +0 -40
  228. package/src/app/(main)/settings/about/style.ts +0 -22
  229. package/src/app/(main)/settings/agent/Agent.tsx +0 -29
  230. package/src/app/(main)/settings/common/index.tsx +0 -24
  231. package/src/app/(main)/settings/common/loading.tsx +0 -3
  232. package/src/app/(main)/settings/features/SettingList/index.tsx +0 -47
  233. package/src/app/(main)/settings/llm/index.tsx +0 -59
  234. package/src/app/(main)/settings/llm/layout.tsx +0 -11
  235. package/src/app/(main)/settings/llm/loading.tsx +0 -3
  236. package/src/app/(main)/settings/sync/DeviceInfo/DeviceName.tsx +0 -66
  237. package/src/app/(main)/settings/sync/PageTitle.tsx +0 -11
  238. package/src/app/(main)/settings/sync/layout.tsx +0 -12
  239. package/src/app/(main)/settings/sync/loading.tsx +0 -3
  240. package/src/app/(main)/settings/tts/loading.tsx +0 -3
  241. package/src/features/AgentSetting/AgentConfig/index.tsx +0 -202
  242. package/src/features/AgentSetting/AgentConfig/useSyncConfig.ts +0 -23
  243. /package/src/app/(main)/market/{features/AgentDetailContent/AgentInfo → @detail/features/AgentDetailContent}/Comment.tsx +0 -0
  244. /package/src/app/(main)/market/{features/AgentDetailContent/AgentInfo → @detail/features/AgentDetailContent}/Loading.tsx +0 -0
  245. /package/src/app/(main)/market/{features/AgentDetailContent/AgentInfo → @detail/features/AgentDetailContent}/TokenTag.tsx +0 -0
  246. /package/src/app/(main)/settings/{features/SettingList → about/features}/Item.tsx +0 -0
  247. /package/src/app/(main)/settings/{features → common/features/Theme}/ThemeSwatches/ThemeSwatchesNeutral.tsx +0 -0
  248. /package/src/app/(main)/settings/{features → common/features/Theme}/ThemeSwatches/ThemeSwatchesPrimary.tsx +0 -0
  249. /package/src/app/(main)/settings/{features → common/features/Theme}/ThemeSwatches/index.ts +0 -0
  250. /package/src/app/(main)/settings/sync/{Alert.tsx → features/Alert.tsx} +0 -0
  251. /package/src/app/(main)/settings/sync/{components → features/WebRTC}/SyncSwitch/index.css +0 -0
  252. /package/src/app/(main)/settings/sync/{components → features/WebRTC}/SyncSwitch/index.tsx +0 -0
  253. /package/src/app/(main)/settings/sync/{util.ts → features/WebRTC/generateRandomRoomName.ts} +0 -0
  254. /package/src/app/(main)/settings/tts/{TTS/options.ts → features/const.ts} +0 -0
  255. /package/src/features/AgentSetting/{AgentConfig → AgentModal}/ModelSelect.tsx +0 -0
@@ -1,3 +1,5 @@
1
+ 'use client';
2
+
1
3
  import { Alert, Modal, type ModalProps } from '@lobehub/ui';
2
4
  import { Button, Divider, Input } from 'antd';
3
5
  import { useTheme } from 'antd-style';
@@ -1,4 +1,5 @@
1
- import { ActionIcon } from '@lobehub/ui';
1
+ import { ActionIcon, Icon } from '@lobehub/ui';
2
+ import { Button } from 'antd';
2
3
  import { useResponsive } from 'antd-style';
3
4
  import { Share2 } from 'lucide-react';
4
5
  import { memo, useState } from 'react';
@@ -8,18 +9,25 @@ import { HEADER_ICON_SIZE } from '@/const/layoutTokens';
8
9
 
9
10
  import SubmitAgentModal from './SubmitAgentModal';
10
11
 
11
- const SubmitAgentButton = memo(() => {
12
+ const SubmitAgentButton = memo<{ modal?: boolean }>(({ modal }) => {
12
13
  const { t } = useTranslation('setting');
13
14
  const { mobile } = useResponsive();
14
15
  const [isModalOpen, setIsModalOpen] = useState(false);
16
+
15
17
  return (
16
18
  <>
17
- <ActionIcon
18
- icon={Share2}
19
- onClick={() => setIsModalOpen(true)}
20
- size={HEADER_ICON_SIZE(mobile)}
21
- title={t('submitAgentModal.tooltips')}
22
- />
19
+ {modal ? (
20
+ <Button block icon={<Icon icon={Share2} />} onClick={() => setIsModalOpen(true)}>
21
+ {t('submitAgentModal.tooltips')}
22
+ </Button>
23
+ ) : (
24
+ <ActionIcon
25
+ icon={Share2}
26
+ onClick={() => setIsModalOpen(true)}
27
+ size={HEADER_ICON_SIZE(mobile)}
28
+ title={t('submitAgentModal.tooltips')}
29
+ />
30
+ )}
23
31
  <SubmitAgentModal onCancel={() => setIsModalOpen(false)} open={isModalOpen} />
24
32
  </>
25
33
  );
@@ -1,14 +1,21 @@
1
1
  import { notFound } from 'next/navigation';
2
2
  import { PropsWithChildren } from 'react';
3
3
 
4
+ import ServerLayout from '@/components/server/ServerLayout';
4
5
  import { serverFeatureFlags } from '@/config/server/featureFlags';
5
6
 
7
+ import Desktop from './_layout/Desktop';
8
+ import Mobile from './_layout/Mobile';
9
+
10
+ const SessionSettingsLayout = ServerLayout({ Desktop, Mobile });
11
+
6
12
  const Layout = ({ children }: PropsWithChildren) => {
7
13
  const isAgentEditable = serverFeatureFlags().isAgentEditable;
8
-
9
14
  if (!isAgentEditable) return notFound();
10
15
 
11
- return children;
16
+ return <SessionSettingsLayout>{children}</SessionSettingsLayout>;
12
17
  };
13
18
 
19
+ Layout.displayName = 'SessionSettingsLayout';
20
+
14
21
  export default Layout;
@@ -0,0 +1,3 @@
1
+ import SkeletonLoading from '@/components/SkeletonLoading';
2
+
3
+ export default () => <SkeletonLoading paragraph={{ rows: 8 }} />;
@@ -0,0 +1,3 @@
1
+ import dynamic from 'next/dynamic';
2
+
3
+ export default dynamic(() => import('@/components/404'), { ssr: false });
@@ -1,14 +1,7 @@
1
- import { isMobileDevice } from '@/utils/responsive';
2
-
3
- import DesktopPage from './(desktop)';
4
- import MobilePage from './(mobile)';
1
+ import EditPage from './features/EditPage';
5
2
 
6
3
  const Page = () => {
7
- const mobile = isMobileDevice();
8
-
9
- const Page = mobile ? MobilePage : DesktopPage;
10
-
11
- return <Page />;
4
+ return <EditPage />;
12
5
  };
13
6
 
14
7
  export default Page;
@@ -0,0 +1,12 @@
1
+ import { isMobileDevice } from '@/utils/responsive';
2
+
3
+ import AgentDetailContent from './features/AgentDetailContent';
4
+
5
+ const Detail = () => {
6
+ const mobile = isMobileDevice();
7
+ return <AgentDetailContent mobile={mobile} />;
8
+ };
9
+
10
+ Detail.displayName = 'AgentDetail';
11
+
12
+ export default Detail;
@@ -1,10 +1,11 @@
1
1
  import { Avatar, Tag } from '@lobehub/ui';
2
2
  import { App, Button, Typography } from 'antd';
3
+ import isEqual from 'fast-deep-equal';
3
4
  import { startCase } from 'lodash-es';
4
5
  import { useRouter } from 'next/navigation';
5
6
  import { memo } from 'react';
6
7
  import { useTranslation } from 'react-i18next';
7
- import { Center } from 'react-layout-kit';
8
+ import { Center, Flexbox } from 'react-layout-kit';
8
9
 
9
10
  import { SESSION_CHAT_URL } from '@/const/url';
10
11
  import { useIsMobile } from '@/hooks/useIsMobile';
@@ -15,12 +16,14 @@ import { useStyles } from './style';
15
16
 
16
17
  const { Link } = Typography;
17
18
 
18
- const Header = memo(() => {
19
+ const Header = memo<{ mobile?: boolean }>(({ mobile }) => {
20
+ const setSearchKeywords = useMarketStore((s) => s.setSearchKeywords);
19
21
  const router = useRouter();
20
22
  const { t } = useTranslation('market');
21
23
  const { styles, theme } = useStyles();
22
24
  const createSession = useSessionStore((s) => s.createSession);
23
- const agentItem = useMarketStore(agentMarketSelectors.currentAgentItem);
25
+ const agentItem = useMarketStore(agentMarketSelectors.currentAgentItem, isEqual);
26
+
24
27
  const { message } = App.useApp();
25
28
 
26
29
  const { meta, createAt, author, homepage, config } = agentItem;
@@ -38,43 +41,49 @@ const Header = memo(() => {
38
41
 
39
42
  const handleAddAgent = () => {
40
43
  if (!agentItem) return;
41
-
42
44
  createSession({ config, meta }, false);
43
45
  message.success(t('addAgentSuccess'));
44
46
  };
45
47
 
46
48
  return (
47
49
  <Center className={styles.container} gap={16}>
48
- <Avatar
49
- animation
50
- avatar={avatar}
51
- background={backgroundColor || theme.colorFillTertiary}
52
- className={styles.avatar}
53
- size={100}
54
- />
55
- <div className={styles.title}>{title}</div>
50
+ <Center
51
+ flex={'none'}
52
+ height={120}
53
+ style={{
54
+ backgroundColor:
55
+ backgroundColor || mobile ? theme.colorBgElevated : theme.colorBgContainer,
56
+ borderRadius: '50%',
57
+ overflow: 'hidden',
58
+ zIndex: 2,
59
+ }}
60
+ width={120}
61
+ >
62
+ <Avatar animation avatar={avatar} size={100} />
63
+ </Center>
64
+ <h2 className={styles.title}>{title}</h2>
56
65
  <Center gap={6} horizontal style={{ flexWrap: 'wrap' }}>
57
66
  {(tags as string[]).map((tag: string, index) => (
58
- <Tag
59
- key={index}
60
- onClick={() => useMarketStore.setState({ searchKeywords: tag })}
61
- style={{ margin: 0 }}
62
- >
67
+ <Tag key={index} onClick={() => setSearchKeywords(tag)} style={{ margin: 0 }}>
63
68
  {startCase(tag).trim()}
64
69
  </Tag>
65
70
  ))}
66
71
  </Center>
67
72
  <div className={styles.desc}>{description}</div>
68
- <Link aria-label={author} className={styles.author} href={homepage} target={'_blank'}>
69
- @{author}
70
- </Link>
71
73
  <Button block onClick={handleAddAgentAndConverse} type={'primary'}>
72
74
  {t('addAgentAndConverse')}
73
75
  </Button>
74
76
  <Button block onClick={handleAddAgent}>
75
77
  {t('addAgent')}
76
78
  </Button>
77
- <div className={styles.date}>{createAt}</div>
79
+ <Flexbox align={'center'} gap={12} horizontal>
80
+ <Link aria-label={author} className={styles.author} href={homepage} target={'_blank'}>
81
+ @{author}
82
+ </Link>
83
+ <time className={styles.time} dateTime={new Date(createAt).toISOString()}>
84
+ {createAt}
85
+ </time>
86
+ </Flexbox>
78
87
  </Center>
79
88
  );
80
89
  });
@@ -1,11 +1,13 @@
1
+ 'use client';
2
+
1
3
  import { Markdown, TabsNav } from '@lobehub/ui';
2
4
  import { memo, useState } from 'react';
3
5
  import { useTranslation } from 'react-i18next';
4
6
  import { Flexbox } from 'react-layout-kit';
5
7
 
8
+ import AgentCardBanner from '@/app/(main)/market/features/AgentCard/AgentCardBanner';
6
9
  import { useMarketStore } from '@/store/market';
7
10
 
8
- import AgentCardBanner from '../../../features/AgentCard/AgentCardBanner';
9
11
  import Comment from './Comment';
10
12
  import Header from './Header';
11
13
  import Loading from './Loading';
@@ -17,7 +19,7 @@ enum InfoTabs {
17
19
  prompt = 'prompt',
18
20
  }
19
21
 
20
- const AgentModalInner = memo(() => {
22
+ const AgentModalInner = memo<{ mobile?: boolean }>(({ mobile }) => {
21
23
  const [useFetchAgent, currentIdentifier] = useMarketStore((s) => [
22
24
  s.useFetchAgent,
23
25
  s.currentIdentifier,
@@ -34,8 +36,12 @@ const AgentModalInner = memo(() => {
34
36
 
35
37
  return (
36
38
  <>
37
- <AgentCardBanner meta={meta} size={400} style={{ height: 120, marginBottom: -60 }} />
38
- <Header />
39
+ <AgentCardBanner
40
+ avatar={meta?.avatar}
41
+ size={800}
42
+ style={{ height: 120, marginBottom: -60 }}
43
+ />
44
+ <Header mobile={mobile} />
39
45
  <Flexbox align={'center'}>
40
46
  <TabsNav
41
47
  activeKey={tab}
@@ -4,21 +4,13 @@ export const useStyles = createStyles(({ css, token, prefixCls }) => ({
4
4
  author: css`
5
5
  font-size: 12px;
6
6
  `,
7
-
8
- avatar: css`
9
- flex: none;
10
- `,
11
7
  container: css`
12
8
  position: relative;
13
9
  padding: 16px 16px 24px;
14
10
  border-bottom: 1px solid ${token.colorBorderSecondary};
15
11
  `,
16
- date: css`
17
- font-size: 12px;
18
- color: ${token.colorTextDescription};
19
- `,
20
12
  desc: css`
21
- color: ${token.colorTextDescription};
13
+ color: ${token.colorTextSecondary};
22
14
  text-align: center;
23
15
  `,
24
16
  loading: css`
@@ -30,9 +22,13 @@ export const useStyles = createStyles(({ css, token, prefixCls }) => ({
30
22
  nav: css`
31
23
  padding-top: 8px;
32
24
  `,
25
+ time: css`
26
+ font-size: 12px;
27
+ color: ${token.colorTextDescription};
28
+ `,
33
29
  title: css`
34
- font-size: 20px;
35
- font-weight: 600;
30
+ margin-bottom: 0;
31
+ font-weight: bold;
36
32
  text-align: center;
37
33
  `,
38
34
  }));
@@ -0,0 +1 @@
1
+ export default () => null;
@@ -1,13 +1,14 @@
1
+ 'use client';
2
+
1
3
  import { DraggablePanel, DraggablePanelBody, DraggablePanelContainer } from '@lobehub/ui';
2
- import { createStyles } from 'antd-style';
3
- import { memo, useCallback, useState } from 'react';
4
+ import { createStyles, useResponsive } from 'antd-style';
5
+ import { PropsWithChildren, memo, useCallback, useState } from 'react';
6
+ import { Flexbox } from 'react-layout-kit';
4
7
 
5
8
  import SafeSpacing from '@/components/SafeSpacing';
6
9
  import { MARKET_SIDEBAR_WIDTH } from '@/const/layoutTokens';
7
10
  import { agentMarketSelectors, useMarketStore } from '@/store/market';
8
11
 
9
- import AgentDetailContent from '../../features/AgentDetailContent';
10
-
11
12
  const useStyles = createStyles(({ css, token, stylish }) => ({
12
13
  content: css`
13
14
  display: flex;
@@ -15,7 +16,7 @@ const useStyles = createStyles(({ css, token, stylish }) => ({
15
16
  height: 100% !important;
16
17
  `,
17
18
  drawer: css`
18
- background: ${token.colorBgLayout};
19
+ background: ${token.colorBgContainer};
19
20
  `,
20
21
  header: css`
21
22
  border-bottom: 1px solid ${token.colorBorder};
@@ -23,8 +24,9 @@ const useStyles = createStyles(({ css, token, stylish }) => ({
23
24
  noScrollbar: stylish.noScrollbar,
24
25
  }));
25
26
 
26
- const SideBar = memo(() => {
27
+ const DetailSidebar = memo<PropsWithChildren>(({ children }) => {
27
28
  const { styles } = useStyles();
29
+ const { md = true } = useResponsive();
28
30
  const [tempId, setTempId] = useState<string>('');
29
31
  const [showAgentSidebar, deactivateAgent, activateAgent] = useMarketStore((s) => [
30
32
  agentMarketSelectors.showSideBar(s),
@@ -44,6 +46,8 @@ const SideBar = memo(() => {
44
46
  [deactivateAgent, activateAgent, tempId],
45
47
  );
46
48
 
49
+ const minWidth = md ? MARKET_SIDEBAR_WIDTH : 350;
50
+
47
51
  return (
48
52
  <DraggablePanel
49
53
  className={styles.drawer}
@@ -51,8 +55,9 @@ const SideBar = memo(() => {
51
55
  content: styles.content,
52
56
  }}
53
57
  expand={showAgentSidebar}
54
- minWidth={MARKET_SIDEBAR_WIDTH}
55
- mode={'fixed'}
58
+ maxWidth={'80vw' as any}
59
+ minWidth={minWidth}
60
+ mode={md ? 'fixed' : 'float'}
56
61
  onExpandChange={handleExpandChange}
57
62
  placement={'right'}
58
63
  showHandlerWideArea={false}
@@ -61,19 +66,19 @@ const SideBar = memo(() => {
61
66
  style={{
62
67
  flex: 'none',
63
68
  height: '100%',
64
- minWidth: MARKET_SIDEBAR_WIDTH,
69
+ minWidth: minWidth,
65
70
  }}
66
71
  >
67
- <SafeSpacing />
72
+ {md && <SafeSpacing />}
68
73
  <DraggablePanelBody
69
74
  className={styles.noScrollbar}
70
75
  style={{ padding: 0, position: 'relative' }}
71
76
  >
72
- <AgentDetailContent />
77
+ <Flexbox>{children}</Flexbox>
73
78
  </DraggablePanelBody>
74
79
  </DraggablePanelContainer>
75
80
  </DraggablePanel>
76
81
  );
77
82
  });
78
83
 
79
- export default SideBar;
84
+ export default DetailSidebar;
@@ -1,6 +1,7 @@
1
+ 'use client';
2
+
1
3
  import { ChatHeader, Logo } from '@lobehub/ui';
2
4
  import { createStyles } from 'antd-style';
3
- import Link from 'next/link';
4
5
  import { memo } from 'react';
5
6
 
6
7
  import ShareAgentButton from '../../features/ShareAgentButton';
@@ -17,11 +18,7 @@ const Header = memo(() => {
17
18
 
18
19
  return (
19
20
  <ChatHeader
20
- left={
21
- <Link aria-label={'home'} href={'/'}>
22
- <Logo className={styles.logo} extra={'Discover'} size={36} type={'text'} />
23
- </Link>
24
- }
21
+ left={<Logo className={styles.logo} extra={'Discover'} size={36} type={'text'} />}
25
22
  right={<ShareAgentButton />}
26
23
  />
27
24
  );
@@ -0,0 +1,39 @@
1
+ 'use client';
2
+
3
+ import { GridBackground } from '@lobehub/ui';
4
+ import { createStyles } from 'antd-style';
5
+ import { memo } from 'react';
6
+ import { Center } from 'react-layout-kit';
7
+
8
+ const useStyles = createStyles(({ css, responsive }) => ({
9
+ background: css`
10
+ width: 80%;
11
+ margin: -60px 0 -20px;
12
+
13
+ ${responsive.md} {
14
+ display: none;
15
+ }
16
+ `,
17
+ title: css`
18
+ z-index: 2;
19
+
20
+ margin-top: 24px;
21
+
22
+ font-size: min(56px, 5vw);
23
+ font-weight: 800;
24
+ line-height: 1.2;
25
+ text-align: center;
26
+ `,
27
+ }));
28
+
29
+ const Hero = memo(() => {
30
+ const { theme, styles } = useStyles();
31
+ return (
32
+ <Center>
33
+ <h1 className={styles.title}>Find & Use The Best Agents</h1>
34
+ <GridBackground animation className={styles.background} colorFront={theme.colorText} random />
35
+ </Center>
36
+ );
37
+ });
38
+
39
+ export default Hero;
@@ -1,61 +1,41 @@
1
- 'use client';
2
-
3
- import { GridBackground } from '@lobehub/ui';
4
- import { createStyles } from 'antd-style';
5
- import dynamic from 'next/dynamic';
6
- import { PropsWithChildren, memo } from 'react';
7
- import { Center, Flexbox } from 'react-layout-kit';
1
+ import { Flexbox } from 'react-layout-kit';
8
2
 
9
3
  import SafeSpacing from '@/components/SafeSpacing';
10
- import ClientResponsiveLayout from '@/components/client/ClientResponsiveLayout';
11
4
  import { MAX_WIDTH } from '@/const/layoutTokens';
12
5
 
13
- import AgentSearchBar from '../../features/AgentSearchBar';
6
+ import { LayoutProps } from '../type';
7
+ import DetailSidebar from './DetailSidebar';
14
8
  import Header from './Header';
9
+ import Hero from './Hero';
15
10
 
16
- const SideBar = dynamic(() => import('./AgentDetail'));
17
-
18
- const useStyles = createStyles(({ css }) => ({
19
- background: css`
20
- width: 80%;
21
- margin: -60px 0 -20px;
22
- `,
23
- title: css`
24
- z-index: 2;
25
- margin-top: 24px;
26
- font-size: 56px;
27
- font-weight: 800;
28
- `,
29
- }));
30
-
31
- const Desktop = memo<PropsWithChildren>(({ children }) => {
32
- const { theme, styles } = useStyles();
33
-
11
+ const Layout = ({ children, detail }: LayoutProps) => {
34
12
  return (
35
- <Flexbox flex={1} height={'100%'} id={'lobe-market-container'} style={{ position: 'relative' }}>
13
+ <Flexbox
14
+ height={'100%'}
15
+ id={'lobe-market-container'}
16
+ style={{ position: 'relative' }}
17
+ width={'100%'}
18
+ >
36
19
  <Header />
37
- <Flexbox flex={1} height={'calc(100% - 64px)'} horizontal>
38
- <Flexbox align={'center'} flex={1} style={{ overflowY: 'scroll', padding: 16 }}>
20
+ <Flexbox height={'100%'} horizontal style={{ position: 'relative' }} width={'100%'}>
21
+ <Flexbox
22
+ align={'center'}
23
+ flex={1}
24
+ padding={16}
25
+ style={{ overflowX: 'hidden', overflowY: 'scroll', position: 'relative' }}
26
+ >
39
27
  <SafeSpacing />
40
-
41
28
  <Flexbox gap={16} style={{ maxWidth: MAX_WIDTH, position: 'relative', width: '100%' }}>
42
- <Center>
43
- <h1 className={styles.title}>Find & Use The Best Agents</h1>
44
- <GridBackground
45
- animation
46
- className={styles.background}
47
- colorFront={theme.colorText}
48
- random
49
- />
50
- </Center>
51
- <AgentSearchBar />
29
+ <Hero />
52
30
  {children}
53
31
  </Flexbox>
54
32
  </Flexbox>
55
- <SideBar />
33
+ <DetailSidebar>{detail}</DetailSidebar>
56
34
  </Flexbox>
57
35
  </Flexbox>
58
36
  );
59
- });
37
+ };
38
+
39
+ Layout.displayName = 'DesktopMarketLayout';
60
40
 
61
- export default ClientResponsiveLayout({ Desktop, Mobile: () => import('../Mobile') });
41
+ export default Layout;
@@ -1,12 +1,12 @@
1
+ 'use client';
2
+
1
3
  import { Modal } from '@lobehub/ui';
2
- import { memo } from 'react';
4
+ import { PropsWithChildren, memo } from 'react';
3
5
  import { useTranslation } from 'react-i18next';
4
6
 
5
7
  import { agentMarketSelectors, useMarketStore } from '@/store/market';
6
8
 
7
- import AgentDetailContent from '../../features/AgentDetailContent';
8
-
9
- const AgentDetail = memo(() => {
9
+ const DetailModal = memo<PropsWithChildren>(({ children }) => {
10
10
  const [showAgentSidebar, deactivateAgent] = useMarketStore((s) => [
11
11
  agentMarketSelectors.showSideBar(s),
12
12
  s.deactivateAgent,
@@ -17,14 +17,16 @@ const AgentDetail = memo(() => {
17
17
  return (
18
18
  <Modal
19
19
  allowFullscreen
20
- onCancel={deactivateAgent}
20
+ onCancel={() => {
21
+ deactivateAgent();
22
+ }}
21
23
  open={showAgentSidebar}
22
24
  styles={{ body: { padding: 0 } }}
23
25
  title={t('sidebar.title')}
24
26
  >
25
- <AgentDetailContent />
27
+ {children}
26
28
  </Modal>
27
29
  );
28
30
  });
29
31
 
30
- export default AgentDetail;
32
+ export default DetailModal;
@@ -1,6 +1,6 @@
1
1
  'use client';
2
2
 
3
- import { Logo, MobileNavBar } from '@lobehub/ui';
3
+ import { MobileNavBar } from '@lobehub/ui';
4
4
  import { memo } from 'react';
5
5
 
6
6
  import { mobileHeaderSticky } from '@/styles/mobileHeader';
@@ -10,7 +10,7 @@ import ShareAgentButton from '../../features/ShareAgentButton';
10
10
  const Header = memo(() => {
11
11
  return (
12
12
  <MobileNavBar
13
- center={<Logo type={'text'} />}
13
+ center={<div style={{ fontSize: 20, fontWeight: 900 }}>Discover</div>}
14
14
  right={<ShareAgentButton mobile />}
15
15
  style={mobileHeaderSticky}
16
16
  />
@@ -1,17 +1,25 @@
1
- import { PropsWithChildren } from 'react';
2
-
3
1
  import MobileContentLayout from '@/components/server/MobileNavLayout';
4
2
 
5
- import AgentSearchBar from '../../features/AgentSearchBar';
3
+ import { LayoutProps } from '../type';
4
+ import DetailModal from './DetailModal';
6
5
  import Header from './Header';
7
6
 
8
- const MobileLayout = ({ children }: PropsWithChildren) => {
7
+ const Layout = ({ children, detail }: LayoutProps) => {
9
8
  return (
10
- <MobileContentLayout gap={16} header={<Header />} style={{ paddingInline: 16 }} withNav>
11
- <AgentSearchBar mobile />
12
- {children}
13
- </MobileContentLayout>
9
+ <>
10
+ <MobileContentLayout
11
+ gap={16}
12
+ header={<Header />}
13
+ style={{ paddingInline: 16, paddingTop: 8 }}
14
+ withNav
15
+ >
16
+ {children}
17
+ </MobileContentLayout>
18
+ <DetailModal>{detail}</DetailModal>
19
+ </>
14
20
  );
15
21
  };
16
22
 
17
- export default MobileLayout;
23
+ Layout.displayName = 'MobileMarketLayout';
24
+
25
+ export default Layout;
@@ -0,0 +1,6 @@
1
+ import { ReactNode } from 'react';
2
+
3
+ export interface LayoutProps {
4
+ children: ReactNode;
5
+ detail: ReactNode;
6
+ }