@lobehub/chat 0.86.0-beta.5 → 0.86.0-beta.7

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 (44) hide show
  1. package/.github/workflows/docker.yml +45 -0
  2. package/.github/workflows/issue-check-inactive.yml +1 -0
  3. package/.github/workflows/issue-close-require.yml +3 -0
  4. package/.github/workflows/issue-remove-inactive.yml +1 -0
  5. package/.github/workflows/pre-welcome.yml +5 -4
  6. package/.github/workflows/release.yml +2 -2
  7. package/.releaserc.js +6 -6
  8. package/CHANGELOG.md +20 -28
  9. package/Dockerfile +2 -0
  10. package/next.config.mjs +1 -2
  11. package/package.json +3 -1
  12. package/public/manifest.json +1 -1
  13. package/scripts/i18nWorkflow/genDiff.ts +2 -1
  14. package/scripts/i18nWorkflow/utils.ts +3 -9
  15. package/src/app/chat/(desktop)/index.tsx +1 -1
  16. package/src/app/chat/(desktop)/layout.desktop.tsx +1 -1
  17. package/src/app/chat/(mobile)/mobile/index.tsx +1 -1
  18. package/src/app/chat/features/SessionListContent/Inbox/index.tsx +1 -0
  19. package/src/app/chat/features/SessionListContent/List/index.tsx +1 -0
  20. package/src/app/home/index.tsx +1 -1
  21. package/src/app/market/(desktop)/features/AgentDetail.tsx +1 -1
  22. package/src/app/market/(desktop)/features/Header.tsx +1 -1
  23. package/src/app/market/(desktop)/layout.desktop.tsx +2 -2
  24. package/src/app/market/features/AgentCard/AgentCardBanner.tsx +1 -0
  25. package/src/app/market/features/AgentDetailContent/AgentInfo/Header.tsx +1 -1
  26. package/src/app/settings/(desktop)/layout.desktop.tsx +1 -1
  27. package/src/app/settings/common/index.tsx +4 -0
  28. package/src/app/settings/features/Footer.tsx +24 -0
  29. package/src/app/settings/features/SideBar/List.tsx +1 -0
  30. package/src/app/settings/features/SideBar/index.tsx +1 -1
  31. package/src/app/settings/features/UpgradeAlert.tsx +1 -1
  32. package/src/app/settings/llm/LLM/index.tsx +7 -25
  33. package/src/app/settings/llm/index.tsx +16 -1
  34. package/src/app/welcome/(desktop)/features/Showcase.tsx +1 -1
  35. package/src/app/welcome/(desktop)/layout.desktop.tsx +1 -1
  36. package/src/app/welcome/(mobile)/features/Showcase.tsx +1 -1
  37. package/src/app/welcome/(mobile)/layout.mobile.tsx +1 -1
  38. package/src/app/welcome/features/Banner/style.ts +1 -1
  39. package/src/features/FolderPanel/index.tsx +2 -2
  40. package/src/features/SideBar/index.tsx +1 -1
  41. package/src/layout/AppLayout.desktop.tsx +1 -0
  42. package/src/layout/AppLayout.mobile.tsx +1 -2
  43. package/src/layout/GlobalLayout/LocaleLoading.tsx +1 -1
  44. package/src/styles/global.ts +6 -5
@@ -0,0 +1,45 @@
1
+ name: Publish Docker image
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ release:
6
+ types: [published]
7
+
8
+ jobs:
9
+ push_to_registry:
10
+ name: Push Docker image to Docker Hub
11
+ runs-on: ubuntu-latest
12
+ steps:
13
+ - name: Check out the repo
14
+ uses: actions/checkout@v3
15
+ - name: Log in to Docker Hub
16
+ uses: docker/login-action@v2
17
+ with:
18
+ username: ${{ secrets.DOCKER_REGISTRY_USER }}
19
+ password: ${{ secrets.DOCKER_REGISTRY_PASSWORD }}
20
+
21
+ - name: Extract metadata (tags, labels) for Docker
22
+ id: meta
23
+ uses: docker/metadata-action@v4
24
+ with:
25
+ images: lobehub/lobe-chat
26
+ tags: |
27
+ type=raw,value=latest
28
+ type=ref,event=tag
29
+
30
+ - name: Set up QEMU
31
+ uses: docker/setup-qemu-action@v2
32
+
33
+ - name: Set up Docker Buildx
34
+ uses: docker/setup-buildx-action@v2
35
+
36
+ - name: Build and push Docker image
37
+ uses: docker/build-push-action@v4
38
+ with:
39
+ context: .
40
+ platforms: linux/amd64,linux/arm64
41
+ push: true
42
+ tags: ${{ steps.meta.outputs.tags }}
43
+ labels: ${{ steps.meta.outputs.labels }}
44
+ cache-from: type=gha
45
+ cache-to: type=gha,mode=max
@@ -18,5 +18,6 @@ jobs:
18
18
  uses: actions-cool/issues-helper@v3
19
19
  with:
20
20
  actions: 'check-inactive'
21
+ token: ${{ secrets.GH_TOKEN }}
21
22
  inactive-label: 'Inactive'
22
23
  inactive-day: 30
@@ -18,6 +18,7 @@ jobs:
18
18
  uses: actions-cool/issues-helper@v3
19
19
  with:
20
20
  actions: 'close-issues'
21
+ token: ${{ secrets.GH_TOKEN }}
21
22
  labels: '✅ Fixed'
22
23
  inactive-day: 3
23
24
  body: |
@@ -28,6 +29,7 @@ jobs:
28
29
  uses: actions-cool/issues-helper@v3
29
30
  with:
30
31
  actions: 'close-issues'
32
+ token: ${{ secrets.GH_TOKEN }}
31
33
  labels: '🤔 Need Reproduce'
32
34
  inactive-day: 3
33
35
  body: |
@@ -38,6 +40,7 @@ jobs:
38
40
  uses: actions-cool/issues-helper@v3
39
41
  with:
40
42
  actions: 'close-issues'
43
+ token: ${{ secrets.GH_TOKEN }}
41
44
  labels: "🙅🏻‍♀️ WON'T DO"
42
45
  inactive-day: 3
43
46
  body: |
@@ -21,5 +21,6 @@ jobs:
21
21
  uses: actions-cool/issues-helper@v3
22
22
  with:
23
23
  actions: 'remove-labels'
24
+ token: ${{ secrets.GH_TOKEN }}
24
25
  issue-number: ${{ github.event.issue.number }}
25
26
  labels: 'Inactive'
@@ -14,9 +14,10 @@ jobs:
14
14
  with:
15
15
  token: ${{ secrets.GITHUB_TOKEN }}
16
16
  comment: |
17
- Great PR @${{ github.event.pull_request.user.login }}. The growth of project is inseparable from user feedback and contribution, thanks for your contribution ❤️
17
+ 🎉 Great PR @${{ github.event.pull_request.user.login }} 🎉
18
18
 
19
- 非常棒的 PR @${{ github.event.pull_request.user.login }}. 项目的成长离不开用户反馈和贡献,感谢您的贡献 ❤️
20
- emoji: 'heart'
19
+ The growth of project is inseparable from user feedback and contribution, thanks for your contribution ❤️
20
+
21
+ 项目的成长离不开用户反馈和贡献,感谢您的贡献 ❤️
22
+ emoji: 'hooray'
21
23
  pr-emoji: '+1, heart'
22
- close: true
@@ -29,5 +29,5 @@ jobs:
29
29
  env:
30
30
  GH_TOKEN: ${{ secrets.GH_TOKEN }}
31
31
  NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
32
- DOCKER_REGISTRY_PASSWORD: ${{ secrets.DOCKER_REGISTRY_PASSWORD }}
33
- DOCKER_REGISTRY_USER: ${{ secrets.DOCKER_REGISTRY_USER }}
32
+ # DOCKER_REGISTRY_PASSWORD: ${{ secrets.DOCKER_REGISTRY_PASSWORD }}
33
+ # DOCKER_REGISTRY_USER: ${{ secrets.DOCKER_REGISTRY_USER }}
package/.releaserc.js CHANGED
@@ -4,11 +4,11 @@ module.exports = {
4
4
  ...release,
5
5
  plugins: [
6
6
  ...release.plugins,
7
- [
8
- '@codedependant/semantic-release-docker',
9
- {
10
- dockerImage: 'lobe-chat',
11
- },
12
- ],
7
+ // [
8
+ // '@codedependant/semantic-release-docker',
9
+ // {
10
+ // dockerImage: 'lobe-chat',
11
+ // },
12
+ // ],
13
13
  ],
14
14
  };
package/CHANGELOG.md CHANGED
@@ -2,13 +2,13 @@
2
2
 
3
3
  # Changelog
4
4
 
5
- ## [Version 0.86.0-beta.5](https://github.com/lobehub/lobe-chat/compare/v0.86.0-beta.4...v0.86.0-beta.5)
5
+ ## [Version 0.86.0-beta.7](https://github.com/lobehub/lobe-chat/compare/v0.86.0-beta.6...v0.86.0-beta.7)
6
6
 
7
7
  <sup>Released on **2023-10-10**</sup>
8
8
 
9
9
  #### ✨ Features
10
10
 
11
- - **misc**: Add default ACCESS_CODE=lobe66.
11
+ - **misc**: Add more ENV for Dockerfile.
12
12
 
13
13
  <br/>
14
14
 
@@ -17,7 +17,7 @@
17
17
 
18
18
  #### What's improved
19
19
 
20
- - **misc**: Add default ACCESS_CODE=lobe66 ([3ebec4a](https://github.com/lobehub/lobe-chat/commit/3ebec4a))
20
+ - **misc**: Add more ENV for Dockerfile ([ea1eca8](https://github.com/lobehub/lobe-chat/commit/ea1eca8))
21
21
 
22
22
  </details>
23
23
 
@@ -27,30 +27,17 @@
27
27
 
28
28
  </div>
29
29
 
30
- ## [Version 0.86.0-beta.4](https://github.com/lobehub/lobe-chat/compare/v0.86.0-beta.3...v0.86.0-beta.4)
30
+ ## [Version 0.86.0-beta.6](https://github.com/lobehub/lobe-chat/compare/v0.86.0-beta.5...v0.86.0-beta.6)
31
31
 
32
32
  <sup>Released on **2023-10-10**</sup>
33
33
 
34
- <br/>
35
-
36
- <details>
37
- <summary><kbd>Improvements and Fixes</kbd></summary>
38
-
39
- </details>
40
-
41
- <div align="right">
42
-
43
- [![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
44
-
45
- </div>
46
-
47
- ## [Version 0.86.0-beta.3](https://github.com/lobehub/lobe-chat/compare/v0.86.0-beta.2...v0.86.0-beta.3)
34
+ #### ✨ Features
48
35
 
49
- <sup>Released on **2023-10-10**</sup>
36
+ - **misc**: Try with docker ci.
50
37
 
51
- #### ✨ Features
38
+ #### 💄 Styles
52
39
 
53
- - **misc**: Try with new docker ci.
40
+ - **misc**: Add new components, modify display properties, and update settings feature, Replace 100vh with 100% to fix mobile scroll problem.
54
41
 
55
42
  <br/>
56
43
 
@@ -59,7 +46,12 @@
59
46
 
60
47
  #### What's improved
61
48
 
62
- - **misc**: Try with new docker ci ([728172e](https://github.com/lobehub/lobe-chat/commit/728172e))
49
+ - **misc**: Try with docker ci ([0e1ecf7](https://github.com/lobehub/lobe-chat/commit/0e1ecf7))
50
+
51
+ #### Styles
52
+
53
+ - **misc**: Add new components, modify display properties, and update settings feature ([87a4a46](https://github.com/lobehub/lobe-chat/commit/87a4a46))
54
+ - **misc**: Replace 100vh with 100% to fix mobile scroll problem ([2ef3c94](https://github.com/lobehub/lobe-chat/commit/2ef3c94))
63
55
 
64
56
  </details>
65
57
 
@@ -69,23 +61,23 @@
69
61
 
70
62
  </div>
71
63
 
72
- ## [Version 0.86.0-beta.2](https://github.com/lobehub/lobe-chat/compare/v0.86.0-beta.1...v0.86.0-beta.2)
64
+ ### [Version 0.85.3](https://github.com/lobehub/lobe-chat/compare/v0.85.2...v0.85.3)
73
65
 
74
66
  <sup>Released on **2023-10-10**</sup>
75
67
 
76
- #### 🐛 Bug Fixes
68
+ #### 💄 Styles
77
69
 
78
- - **misc**: Add apikey form when there is no default api key in env, Fix mobile safearea (fix.
70
+ - **misc**: Add new components, modify display properties, and update settings feature, Replace 100vh with 100% to fix mobile scroll problem.
79
71
 
80
72
  <br/>
81
73
 
82
74
  <details>
83
75
  <summary><kbd>Improvements and Fixes</kbd></summary>
84
76
 
85
- #### What's fixed
77
+ #### Styles
86
78
 
87
- - **misc**: Add apikey form when there is no default api key in env, closes [#290](https://github.com/lobehub/lobe-chat/issues/290) ([2c907e9](https://github.com/lobehub/lobe-chat/commit/2c907e9))
88
- - **misc**: Fix mobile safearea (fix, closes [#211](https://github.com/lobehub/lobe-chat/issues/211) ([68775b8](https://github.com/lobehub/lobe-chat/commit/68775b8))
79
+ - **misc**: Add new components, modify display properties, and update settings feature ([87a4a46](https://github.com/lobehub/lobe-chat/commit/87a4a46))
80
+ - **misc**: Replace 100vh with 100% to fix mobile scroll problem ([2ef3c94](https://github.com/lobehub/lobe-chat/commit/2ef3c94))
89
81
 
90
82
  </details>
91
83
 
package/Dockerfile CHANGED
@@ -45,5 +45,7 @@ EXPOSE 3000
45
45
  ENV HOSTNAME "0.0.0.0"
46
46
 
47
47
  ENV ACCESS_CODE "lobe66"
48
+ ENV OPENAI_API_KEY ""
49
+ ENV OPENAI_PROXY_URL ""
48
50
 
49
51
  CMD ["node", "server.js"]
package/next.config.mjs CHANGED
@@ -17,8 +17,7 @@ const withPWA = nextPWA({
17
17
  /** @type {import('next').NextConfig} */
18
18
  const nextConfig = {
19
19
  reactStrictMode: true,
20
- // not sure why antd-style cause multi ThemeProvider instance
21
- // So we need to transpile it to lib mode
20
+ swcMinify: true,
22
21
  transpilePackages: ['@lobehub/ui', 'antd-style'],
23
22
  webpack(config) {
24
23
  config.experiments = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lobehub/chat",
3
- "version": "0.86.0-beta.5",
3
+ "version": "0.86.0-beta.7",
4
4
  "description": "An open-source, extensible (Function Calling), high-performance chatbot framework. It supports one-click free deployment of your private ChatGPT/LLM web application",
5
5
  "keywords": [
6
6
  "chatbot",
@@ -130,6 +130,7 @@
130
130
  "@testing-library/jest-dom": "^6",
131
131
  "@testing-library/react": "^14",
132
132
  "@types/chroma-js": "^2",
133
+ "@types/lodash": "^4",
133
134
  "@types/lodash-es": "^4",
134
135
  "@types/mixpanel-browser": "^2",
135
136
  "@types/node": "^20",
@@ -148,6 +149,7 @@
148
149
  "husky": "^8",
149
150
  "jsdom": "^22",
150
151
  "lint-staged": "^14",
152
+ "lodash": "^4",
151
153
  "next-pwa": "^5",
152
154
  "node-fetch": "^3",
153
155
  "prettier": "^3",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "background_color": "#000000",
3
3
  "description": "An open-source, extensible (Function Calling), high-performance chatbot framework. It supports one-click free deployment of your private ChatGPT/LLM web application",
4
- "display": "fullscreen",
4
+ "display": "standalone",
5
5
  "icons": [
6
6
  {
7
7
  "src": "/icons/icon-192x192.png",
@@ -1,5 +1,6 @@
1
1
  import { consola } from 'consola';
2
2
  import { colors } from 'consola/utils';
3
+ import { unset } from 'lodash';
3
4
  import { existsSync } from 'node:fs';
4
5
 
5
6
  import {
@@ -8,7 +9,7 @@ import {
8
9
  localesResourcesFilepath,
9
10
  outputLocaleJsonFilepath,
10
11
  } from './const';
11
- import { diff, readJSON, tagWhite, tagYellow, unset, writeJSON } from './utils';
12
+ import { diff, readJSON, tagWhite, tagYellow, writeJSON } from './utils';
12
13
 
13
14
  export const genDiff = () => {
14
15
  consola.start(`Diff between Dev/Prod local...`);
@@ -1,6 +1,7 @@
1
1
  import { consola } from 'consola';
2
2
  import { colors } from 'consola/utils';
3
3
  import { tocForResources } from 'i18next-resources-for-ts';
4
+ import { isObject } from 'lodash';
4
5
  import { readFileSync, writeFileSync } from 'node:fs';
5
6
  import { resolve } from 'node:path';
6
7
 
@@ -58,8 +59,8 @@ export const diff = (obj1: any, obj2: any, prefix: string = ''): string[] => {
58
59
  let result: string[] = [];
59
60
  for (const key in obj1) {
60
61
  if (!obj2[key]) continue;
61
- if (typeof obj1[key] === 'object' && obj1[key] !== null && obj2[key]) {
62
- result = result.concat(diff(obj1[key], obj2[key], `${key}.`));
62
+ if (isObject(obj1[key]) && isObject(obj2[key])) {
63
+ result = [...result, ...diff(obj1[key], obj2[key], `${prefix}${key}.`)];
63
64
  } else if (obj1[key] !== obj2[key]) {
64
65
  result.push(`${prefix}${key}`);
65
66
  }
@@ -67,13 +68,6 @@ export const diff = (obj1: any, obj2: any, prefix: string = ''): string[] => {
67
68
  return result;
68
69
  };
69
70
 
70
- export const unset = (obj: any, key: string) => {
71
- const keys = key.split('.');
72
- const lastKey = keys.pop();
73
- const lastObj = keys.reduce((obj, key) => (obj[key] = obj[key] || {}), obj);
74
- if (lastKey) delete lastObj[lastKey];
75
- };
76
-
77
71
  export const tagBlue = (text: string) => colors.bgBlueBright(colors.black(` ${text} `));
78
72
  export const tagYellow = (text: string) => colors.bgYellowBright(colors.black(` ${text} `));
79
73
  export const tagGreen = (text: string) => colors.bgGreenBright(colors.black(` ${text} `));
@@ -18,7 +18,7 @@ const DesktopPage = memo(() => (
18
18
  <Layout>
19
19
  <PageTitle />
20
20
  <ChatHeader />
21
- <Flexbox flex={1} height={'calc(100vh - 64px)'} horizontal>
21
+ <Flexbox flex={1} height={'calc(100% - 64px)'} horizontal>
22
22
  <Conversation chatInput={<ChatInput />} />
23
23
  <SideBar />
24
24
  </Flexbox>
@@ -16,7 +16,7 @@ export default memo(({ children }: PropsWithChildren) => {
16
16
  <ResponsiveSessionList />
17
17
  <Flexbox
18
18
  flex={1}
19
- height={'100vh'}
19
+ height={'100%'}
20
20
  id={'lobe-conversion-container'}
21
21
  style={{ position: 'relative' }}
22
22
  >
@@ -10,7 +10,7 @@ import Layout from './layout.mobile';
10
10
 
11
11
  const Chat = memo(() => (
12
12
  <Layout>
13
- <Flexbox height={'calc(100vh - 44px)'} horizontal>
13
+ <Flexbox height={'calc(100% - 44px)'} horizontal>
14
14
  <Conversation chatInput={<ChatInput />} mobile />
15
15
  <TopicList />
16
16
  </Flexbox>
@@ -37,6 +37,7 @@ const Inbox = memo(() => {
37
37
 
38
38
  return (
39
39
  <Link
40
+ aria-label={INBOX_SESSION_ID}
40
41
  href={SESSION_CHAT_URL(INBOX_SESSION_ID, mobile)}
41
42
  onClick={(e) => {
42
43
  e.preventDefault();
@@ -24,6 +24,7 @@ const SessionList = memo(() => {
24
24
  ) : list.length > 0 ? (
25
25
  list.map(({ id }) => (
26
26
  <Link
27
+ aria-label={id}
27
28
  href={SESSION_CHAT_URL(id, mobile)}
28
29
  key={id}
29
30
  onClick={(e) => {
@@ -9,7 +9,7 @@ const Loading = () => {
9
9
  const { t } = useTranslation();
10
10
 
11
11
  return (
12
- <Flexbox height={'100vh'} width={'100%'}>
12
+ <Flexbox height={'100%'} width={'100%'}>
13
13
  <Center flex={1} gap={12} width={'100%'}>
14
14
  <Logo extra={'Chat'} size={48} type={'combine'} />
15
15
  <Center gap={16} horizontal>
@@ -53,7 +53,7 @@ const SideBar = memo(() => {
53
53
  <DraggablePanelContainer
54
54
  style={{
55
55
  flex: 'none',
56
- height: '100vh',
56
+ height: '100%',
57
57
  minWidth: MARKET_SIDEBAR_WIDTH,
58
58
  }}
59
59
  >
@@ -22,7 +22,7 @@ const Header = memo(() => {
22
22
  return (
23
23
  <ChatHeader
24
24
  left={
25
- <Link href={'/'}>
25
+ <Link aria-label={'home'} href={'/'}>
26
26
  <Logo className={styles.logo} extra={'Discover'} size={36} type={'text'} />
27
27
  </Link>
28
28
  }
@@ -34,12 +34,12 @@ const MarketLayout = memo<PropsWithChildren>(({ children }) => {
34
34
  <AppLayoutDesktop>
35
35
  <Flexbox
36
36
  flex={1}
37
- height={'100vh'}
37
+ height={'100%'}
38
38
  id={'lobe-market-container'}
39
39
  style={{ position: 'relative' }}
40
40
  >
41
41
  <Header />
42
- <Flexbox flex={1} height={'calc(100vh - 64px)'} horizontal>
42
+ <Flexbox flex={1} height={'calc(100% - 64px)'} horizontal>
43
43
  <Flexbox align={'center'} flex={1} style={{ overflow: 'auto', padding: 16 }}>
44
44
  <SafeSpacing />
45
45
 
@@ -50,6 +50,7 @@ const AgentCardBanner = memo<AgentCardBannerProps>(
50
50
  {...props}
51
51
  >
52
52
  <Avatar
53
+ alt={'banner'}
53
54
  avatar={meta.avatar}
54
55
  background={meta.backgroundColor || theme.colorBgContainer}
55
56
  className={styles.bannerImg}
@@ -47,7 +47,7 @@ const Header = memo(() => {
47
47
  ))}
48
48
  </Center>
49
49
  <div className={styles.desc}>{description}</div>
50
- <Link className={styles.author} href={homepage} target={'_blank'}>
50
+ <Link aria-label={author} className={styles.author} href={homepage} target={'_blank'}>
51
51
  @{author}
52
52
  </Link>
53
53
  <Button
@@ -14,7 +14,7 @@ export default memo(({ children }: PropsWithChildren) => {
14
14
  return (
15
15
  <AppLayoutDesktop>
16
16
  <SideBar />
17
- <Flexbox flex={1} height={'100vh'} style={{ position: 'relative' }}>
17
+ <Flexbox flex={1} height={'100%'} style={{ position: 'relative' }}>
18
18
  <Header />
19
19
  <Flexbox align={'center'} flex={1} padding={24} style={{ overflow: 'auto' }}>
20
20
  <SafeSpacing />
@@ -4,20 +4,24 @@ import { memo } from 'react';
4
4
  import { useTranslation } from 'react-i18next';
5
5
 
6
6
  import PageTitle from '@/components/PageTitle';
7
+ import { CURRENT_VERSION } from '@/const/version';
7
8
  import { useSwitchSideBarOnInit } from '@/store/global/hooks/useSwitchSettingsOnInit';
8
9
  import { SettingsTabs } from '@/store/global/initialState';
9
10
  import { genSiteHeadTitle } from '@/utils/genSiteHeadTitle';
10
11
 
12
+ import Footer from '../features/Footer';
11
13
  import Common from './Common';
12
14
 
13
15
  export default memo(() => {
14
16
  useSwitchSideBarOnInit(SettingsTabs.Common);
15
17
  const { t } = useTranslation('setting');
16
18
  const pageTitle = genSiteHeadTitle(t('tab.common'));
19
+
17
20
  return (
18
21
  <>
19
22
  <PageTitle title={pageTitle} />
20
23
  <Common />
24
+ <Footer>LobeChat v{CURRENT_VERSION}</Footer>
21
25
  </>
22
26
  );
23
27
  });
@@ -0,0 +1,24 @@
1
+ import { Divider } from 'antd';
2
+ import { createStyles } from 'antd-style';
3
+ import { PropsWithChildren, memo } from 'react';
4
+ import { Center } from 'react-layout-kit';
5
+
6
+ const useStyles = createStyles(
7
+ ({ css, token }) => css`
8
+ font-size: 14px;
9
+ color: ${token.colorTextDescription};
10
+ `,
11
+ );
12
+
13
+ const Footer = memo<PropsWithChildren>(({ children }) => {
14
+ const { styles } = useStyles();
15
+ return (
16
+ <Center style={{ maxWidth: 600, width: '100%' }}>
17
+ <Divider>
18
+ <span className={styles}>{children}</span>
19
+ </Divider>
20
+ </Center>
21
+ );
22
+ });
23
+
24
+ export default Footer;
@@ -22,6 +22,7 @@ const List = memo(() => {
22
22
 
23
23
  return items.map(({ value, icon, label }) => (
24
24
  <Link
25
+ aria-label={label}
25
26
  href={`/settings/${value}`}
26
27
  key={value}
27
28
  onClick={() => {
@@ -27,7 +27,7 @@ const SideBar = memo(() => {
27
27
  <DraggablePanelBody className={styles.body} style={{ padding: 0 }}>
28
28
  <Flexbox className={styles.top} padding={16}>
29
29
  <div>
30
- <Logo className={styles.logo} size={36} type={'text'} />
30
+ <Logo className={styles.logo} extra={'Settings'} size={36} type={'text'} />
31
31
  </div>
32
32
  </Flexbox>
33
33
  <UpgradeAlert />
@@ -14,7 +14,7 @@ const UpgradeAlert = memo(() => {
14
14
  hasNewVersion && (
15
15
  <Alert
16
16
  action={
17
- <Link href={MANUAL_UPGRADE_URL} target={'_blank'}>
17
+ <Link aria-label={t('upgradeVersion.action')} href={MANUAL_UPGRADE_URL} target={'_blank'}>
18
18
  <Button size={'small'} type={'primary'}>
19
19
  {t('upgradeVersion.action')}
20
20
  </Button>
@@ -3,10 +3,8 @@ import { Form as AntForm, AutoComplete, Input, Switch } from 'antd';
3
3
  import { createStyles } from 'antd-style';
4
4
  import { debounce } from 'lodash-es';
5
5
  import { Webhook } from 'lucide-react';
6
- import Link from 'next/link';
7
6
  import { memo } from 'react';
8
- import { Trans, useTranslation } from 'react-i18next';
9
- import { Flexbox } from 'react-layout-kit';
7
+ import { useTranslation } from 'react-i18next';
10
8
 
11
9
  import { FORM_STYLE } from '@/const/layoutTokens';
12
10
  import { settingsSelectors, useEffectAfterGlobalHydrated, useGlobalStore } from '@/store/global';
@@ -24,9 +22,6 @@ const useStyles = createStyles(({ css, token }) => ({
24
22
  color: ${token.colorTextDescription} !important;
25
23
  }
26
24
  `,
27
- plan: css`
28
- color: ${token.colorTextDescription};
29
- `,
30
25
  tip: css`
31
26
  font-size: 12px;
32
27
  color: ${token.colorTextDescription};
@@ -139,25 +134,12 @@ const LLM = memo(() => {
139
134
  };
140
135
 
141
136
  return (
142
- <Flexbox align={'center'} gap={24} width={'100%'}>
143
- <Form
144
- form={form}
145
- items={[openAI]}
146
- onValuesChange={debounce(setSettings, 100)}
147
- {...FORM_STYLE}
148
- />
149
- <Flexbox align={'center'} className={styles.plan}>
150
- <div>
151
- <Trans i18nKey="llm.waitingForMore" ns={'setting'}>
152
- 更多模型正在
153
- <Link href="https://github.com/lobehub/lobe-chat/issues/151" target="_blank">
154
- 计划接入
155
- </Link>
156
- 中 ,敬请期待 ✨
157
- </Trans>
158
- </div>
159
- </Flexbox>
160
- </Flexbox>
137
+ <Form
138
+ form={form}
139
+ items={[openAI]}
140
+ onValuesChange={debounce(setSettings, 100)}
141
+ {...FORM_STYLE}
142
+ />
161
143
  );
162
144
  });
163
145
 
@@ -1,8 +1,10 @@
1
1
  'use client';
2
2
 
3
+ import Link from 'next/link';
3
4
  import { memo } from 'react';
4
- import { useTranslation } from 'react-i18next';
5
+ import { Trans, useTranslation } from 'react-i18next';
5
6
 
7
+ import Footer from '@/app/settings/features/Footer';
6
8
  import PageTitle from '@/components/PageTitle';
7
9
  import { useSwitchSideBarOnInit } from '@/store/global/hooks/useSwitchSettingsOnInit';
8
10
  import { SettingsTabs } from '@/store/global/initialState';
@@ -18,6 +20,19 @@ export default memo(() => {
18
20
  <>
19
21
  <PageTitle title={pageTitle} />
20
22
  <LLM />
23
+ <Footer>
24
+ <Trans i18nKey="llm.waitingForMore" ns={'setting'}>
25
+ 更多模型正在
26
+ <Link
27
+ aria-label={'todo'}
28
+ href="https://github.com/lobehub/lobe-chat/issues/151"
29
+ target="_blank"
30
+ >
31
+ 计划接入
32
+ </Link>
33
+ 中 ,敬请期待 ✨
34
+ </Trans>
35
+ </Footer>
21
36
  </>
22
37
  );
23
38
  });
@@ -10,7 +10,7 @@ const Showcase = memo(() => (
10
10
  <Flexbox
11
11
  flex={1}
12
12
  justify={'center'}
13
- style={{ height: '100vh', position: 'relative', width: '100%' }}
13
+ style={{ height: '100%', position: 'relative', width: '100%' }}
14
14
  >
15
15
  <GridShowcase>
16
16
  <Banner />
@@ -13,7 +13,7 @@ const Desktop = memo<PropsWithChildren>(({ children }) => {
13
13
  <Center
14
14
  className={styles.layout}
15
15
  flex={1}
16
- height={'100vh'}
16
+ height={'100%'}
17
17
  horizontal
18
18
  style={{ position: 'relative' }}
19
19
  >
@@ -4,7 +4,7 @@ import { Center, Flexbox } from 'react-layout-kit';
4
4
  import Banner from '@/app/welcome/features/Banner';
5
5
 
6
6
  const Showcase = memo(() => (
7
- <Flexbox align={'center'} justify={'center'} style={{ height: 'calc(100vh - 44px)' }}>
7
+ <Flexbox align={'center'} justify={'center'} style={{ height: 'calc(100% - 44px)' }}>
8
8
  <Center gap={16}>
9
9
  <Banner mobile />
10
10
  </Center>
@@ -12,7 +12,7 @@ const MobileLayout = memo<PropsWithChildren>(({ children }) => {
12
12
 
13
13
  return (
14
14
  <AppLayoutMobile navBar={<Header />} showTabBar style={{ background: theme.colorBgLayout }}>
15
- <div style={{ paddingInline: 16 }}>{children}</div>
15
+ <div style={{ height: '100%', paddingInline: 16 }}>{children}</div>
16
16
  </AppLayoutMobile>
17
17
  );
18
18
  });
@@ -60,7 +60,7 @@ export const useStyles = createStyles(({ css, token, stylish, cx, prefixCls }) =
60
60
  overflow-y: auto;
61
61
 
62
62
  max-width: 1024px;
63
- height: 100vh;
63
+ height: 100%;
64
64
  padding: 32px 16px;
65
65
  `,
66
66
  ),
@@ -8,7 +8,7 @@ import { useGlobalStore } from '@/store/global';
8
8
 
9
9
  export const useStyles = createStyles(({ css, token }) => ({
10
10
  panel: css`
11
- height: 100vh;
11
+ height: 100%;
12
12
  color: ${token.colorTextSecondary};
13
13
  background: ${token.colorBgContainer};
14
14
  `,
@@ -48,7 +48,7 @@ const FolderPanel = memo<PropsWithChildren>(({ children }) => {
48
48
  updatePreference({ sessionsWidth: nextWidth });
49
49
  }}
50
50
  placement="left"
51
- size={{ height: '100vh', width: sessionsWidth }}
51
+ size={{ height: '100%', width: sessionsWidth }}
52
52
  >
53
53
  <DraggablePanelContainer style={{ flex: 'none', height: '100%', minWidth: FOLDER_WIDTH }}>
54
54
  {children}
@@ -14,7 +14,7 @@ export default memo(() => {
14
14
  <SideNav
15
15
  avatar={<AvatarWithUpload id={'avatar'} />}
16
16
  bottomActions={<BottomActions setTab={setTab} tab={tab} />}
17
- style={{ height: '100vh' }}
17
+ style={{ height: '100%' }}
18
18
  topActions={<TopActions setTab={setTab} tab={tab} />}
19
19
  />
20
20
  );
@@ -10,6 +10,7 @@ const AppLayoutDesktop = memo<PropsWithChildren>(({ children }) => {
10
10
  const theme = useTheme();
11
11
  return (
12
12
  <Flexbox
13
+ height={'100%'}
13
14
  horizontal
14
15
  style={isPWA ? { borderTop: `1px solid ${theme.colorBorder}` } : {}}
15
16
  width={'100%'}
@@ -16,7 +16,7 @@ const useStyles = createStyles(({ css, cx, stylish }) => ({
16
16
  overflow-y: auto;
17
17
 
18
18
  width: 100vw;
19
- height: 100vh;
19
+ height: 100%;
20
20
  `,
21
21
  ),
22
22
  mobileNavBar: css`
@@ -62,7 +62,6 @@ const AppLayoutMobile = memo<AppMobileLayoutProps>(
62
62
  <MobileTabBar className={styles.mobileTabBar} />
63
63
  </>
64
64
  )}
65
- <SafeSpacing mobile position={'bottom'} />
66
65
  </Flexbox>
67
66
  );
68
67
  },
@@ -7,7 +7,7 @@ const Loading = memo(() => (
7
7
  <div
8
8
  style={{
9
9
  backdropFilter: 'blur(3px)',
10
- height: '100vh',
10
+ height: '100%',
11
11
  width: '100vw',
12
12
  zIndex: 100,
13
13
  }}
@@ -3,20 +3,20 @@ import { css } from 'antd-style';
3
3
  export default ({ prefixCls }: { prefixCls: string }) => css`
4
4
  html,
5
5
  body,
6
+ #__next,
6
7
  .${prefixCls}-app {
7
- overflow: hidden;
8
+ position: relative;
8
9
  overscroll-behavior: none;
10
+ height: 100% !important;
11
+ min-height: 100% !important;
9
12
 
10
13
  ::-webkit-scrollbar {
14
+ display: none;
11
15
  width: 0;
12
16
  height: 0;
13
17
  }
14
18
  }
15
19
 
16
- #__next {
17
- height: 100%;
18
- }
19
-
20
20
  p {
21
21
  margin-bottom: 0;
22
22
  }
@@ -24,6 +24,7 @@ export default ({ prefixCls }: { prefixCls: string }) => css`
24
24
  @media (max-width: 575px) {
25
25
  * {
26
26
  ::-webkit-scrollbar {
27
+ display: none;
27
28
  width: 0;
28
29
  height: 0;
29
30
  }