diff --git a/app/package.json b/app/package.json index 6ad0dcf..4239d60 100644 --- a/app/package.json +++ b/app/package.json @@ -39,7 +39,7 @@ "cmdk": "^0.2.0", "i18next": "^23.4.6", "localforage": "^1.10.0", - "lucide-react": "^0.289.0", + "lucide-react": "^0.309.0", "match-sorter": "^6.3.1", "next-themes": "^0.2.1", "react": "^18.2.0", diff --git a/app/pnpm-lock.yaml b/app/pnpm-lock.yaml index 98c4141..666ce2e 100644 --- a/app/pnpm-lock.yaml +++ b/app/pnpm-lock.yaml @@ -87,8 +87,8 @@ dependencies: specifier: ^1.10.0 version: 1.10.0 lucide-react: - specifier: ^0.289.0 - version: 0.289.0(react@18.2.0) + specifier: ^0.309.0 + version: 0.309.0(react@18.2.0) match-sorter: specifier: ^6.3.1 version: 6.3.1 @@ -548,6 +548,13 @@ packages: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 + /@jridgewell/trace-mapping@0.3.21: + resolution: {integrity: sha512-SRfKmRe1KvYnxjEMtxEr+J4HIeMX5YBg/qhRHpxEIGjhX1rshcHlnFUE9K0GazhVKWM7B+nARSkV8LuvJdJ5/g==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + /@kurkle/color@0.3.2: resolution: {integrity: sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==} dev: false @@ -2092,12 +2099,12 @@ packages: /@types/eslint-scope@3.7.7: resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} dependencies: - '@types/eslint': 8.44.8 + '@types/eslint': 8.56.2 '@types/estree': 1.0.5 dev: true - /@types/eslint@8.44.8: - resolution: {integrity: sha512-4K8GavROwhrYl2QXDXm0Rv9epkA8GBFu0EI+XrrnnuCl7u8CWBRusX7fXJfanhZTDWSAL24gDI/UqXyUM0Injw==} + /@types/eslint@8.56.2: + resolution: {integrity: sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw==} dependencies: '@types/estree': 1.0.5 '@types/json-schema': 7.0.15 @@ -2152,8 +2159,8 @@ packages: resolution: {integrity: sha512-AuHIyzR5Hea7ij0P9q7vx7xu4z0C28ucwjAZC0ja7JhINyCnOw8/DnvAPQQ9TfOlCtZAmCERKQX9+o1mgQhuOQ==} dev: false - /@types/node@20.10.1: - resolution: {integrity: sha512-T2qwhjWwGH81vUEx4EXmBKsTJRXFXNZTL4v0gi01+zyBmCwzE6TyHszqX01m+QHTEq+EZNo13NeJIdEqf+Myrg==} + /@types/node@20.11.3: + resolution: {integrity: sha512-nrlmbvGPNGaj84IJZXMPhQuCMEVTT/hXZMJJG/aIqVL9fKxqk814sGGtJA4GI6hpJSLQjpi6cn0Qx9eOf9SDVg==} dependencies: undici-types: 5.26.5 dev: true @@ -2483,12 +2490,12 @@ packages: resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} dev: true - /acorn-import-assertions@1.9.0(acorn@8.11.2): + /acorn-import-assertions@1.9.0(acorn@8.11.3): resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} peerDependencies: acorn: ^8 dependencies: - acorn: 8.11.2 + acorn: 8.11.3 dev: true /acorn-jsx@5.3.2(acorn@8.10.0): @@ -2505,8 +2512,8 @@ packages: hasBin: true dev: true - /acorn@8.11.2: - resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} + /acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} engines: {node: '>=0.4.0'} hasBin: true dev: true @@ -2647,6 +2654,17 @@ packages: update-browserslist-db: 1.0.13(browserslist@4.22.1) dev: true + /browserslist@4.22.2: + resolution: {integrity: sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001576 + electron-to-chromium: 1.4.631 + node-releases: 2.0.14 + update-browserslist-db: 1.0.13(browserslist@4.22.2) + dev: true + /buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} dev: true @@ -2676,6 +2694,10 @@ packages: /caniuse-lite@1.0.30001554: resolution: {integrity: sha512-A2E3U//MBwbJVzebddm1YfNp7Nud5Ip+IPn4BozBmn4KqVX7AvluoIDFWjsv5OkGnKUXQVmMSoMKLa3ScCblcQ==} + dev: true + + /caniuse-lite@1.0.30001576: + resolution: {integrity: sha512-ff5BdakGe2P3SQsMsiqmt1Lc8221NR1VzHj5jXN5vBny9A6fpze94HiVV/n7XRosOlsShJcvMv5mdnpjOGCEgg==} /ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -2869,19 +2891,6 @@ packages: /csstype@3.1.2: resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} - /debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - requiresBuild: true - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.3 - dev: true - optional: true - /debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} @@ -3004,6 +3013,10 @@ packages: resolution: {integrity: sha512-8KR114CAYQ4/r5EIEsOmOMqQ9j0MRbJZR3aXD/KFA8RuKzyoUB4XrUCg+l8RUGqTVQgKNIgTpjaG8YHRPAbX2w==} dev: true + /electron-to-chromium@1.4.631: + resolution: {integrity: sha512-g73CJB/rMPjdxpiNJYmV1homV7mLVUNe/R0z/HhqMfpjkt58FpYmkTjbtuv3zymdbTTJ+VOEqe1c+lkTjSOhmQ==} + dev: true + /enhanced-resolve@5.15.0: resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} engines: {node: '>=10.13.0'} @@ -3689,7 +3702,7 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 20.10.1 + '@types/node': 20.11.3 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true @@ -3776,10 +3789,8 @@ packages: image-size: 0.5.5 make-dir: 2.1.0 mime: 1.6.0 - needle: 3.2.0 + needle: 3.3.1 source-map: 0.6.1 - transitivePeerDependencies: - - supports-color dev: true /levn@0.4.1: @@ -3856,8 +3867,8 @@ packages: yallist: 4.0.0 dev: true - /lucide-react@0.289.0(react@18.2.0): - resolution: {integrity: sha512-D3/kt5h4KVmO9Bqlhky/szWI3puEU/KJfQWCeX8Zhvx3xx0SQ4t6vbwiK9ORBbiaqXefkBbXjoq7fOBd7s5yXQ==} + /lucide-react@0.309.0(react@18.2.0): + resolution: {integrity: sha512-zNVPczuwFrCfksZH3zbd1UDE6/WYhYAdbe2k7CImVyPAkXLgIwbs6eXQ4loigqDnUFjyFYCI5jZ1y10Kqal0dg==} peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 dependencies: @@ -4356,12 +4367,6 @@ packages: /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - requiresBuild: true - dev: true - optional: true - /mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} dependencies: @@ -4378,17 +4383,14 @@ packages: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true - /needle@3.2.0: - resolution: {integrity: sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==} + /needle@3.3.1: + resolution: {integrity: sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==} engines: {node: '>= 4.4.x'} hasBin: true requiresBuild: true dependencies: - debug: 3.2.7 iconv-lite: 0.6.3 sax: 1.3.0 - transitivePeerDependencies: - - supports-color dev: true optional: true @@ -4426,7 +4428,7 @@ packages: '@next/env': 14.0.4 '@swc/helpers': 0.5.2 busboy: 1.6.0 - caniuse-lite: 1.0.30001554 + caniuse-lite: 1.0.30001576 graceful-fs: 4.2.11 postcss: 8.4.31 react: 18.2.0 @@ -4466,6 +4468,10 @@ packages: resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} dev: true + /node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + dev: true + /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -5212,8 +5218,8 @@ packages: lru-cache: 6.0.0 dev: true - /serialize-javascript@6.0.1: - resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} + /serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} dependencies: randombytes: 2.1.0 dev: true @@ -5393,8 +5399,8 @@ packages: engines: {node: '>=6'} dev: true - /terser-webpack-plugin@5.3.9(webpack@5.89.0): - resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} + /terser-webpack-plugin@5.3.10(webpack@5.89.0): + resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} engines: {node: '>= 10.13.0'} peerDependencies: '@swc/core': '*' @@ -5409,11 +5415,11 @@ packages: uglify-js: optional: true dependencies: - '@jridgewell/trace-mapping': 0.3.20 + '@jridgewell/trace-mapping': 0.3.21 jest-worker: 27.5.1 schema-utils: 3.3.0 - serialize-javascript: 6.0.1 - terser: 5.24.0 + serialize-javascript: 6.0.2 + terser: 5.26.0 webpack: 5.89.0 dev: true @@ -5428,13 +5434,13 @@ packages: source-map-support: 0.5.21 dev: true - /terser@5.24.0: - resolution: {integrity: sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==} + /terser@5.26.0: + resolution: {integrity: sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ==} engines: {node: '>=10'} hasBin: true dependencies: '@jridgewell/source-map': 0.3.5 - acorn: 8.11.2 + acorn: 8.11.3 commander: 2.20.3 source-map-support: 0.5.21 dev: true @@ -5619,6 +5625,17 @@ packages: picocolors: 1.0.0 dev: true + /update-browserslist-db@1.0.13(browserslist@4.22.2): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.22.2 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true + /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: @@ -5817,9 +5834,9 @@ packages: '@webassemblyjs/ast': 1.11.6 '@webassemblyjs/wasm-edit': 1.11.6 '@webassemblyjs/wasm-parser': 1.11.6 - acorn: 8.11.2 - acorn-import-assertions: 1.9.0(acorn@8.11.2) - browserslist: 4.22.1 + acorn: 8.11.3 + acorn-import-assertions: 1.9.0(acorn@8.11.3) + browserslist: 4.22.2 chrome-trace-event: 1.0.3 enhanced-resolve: 5.15.0 es-module-lexer: 1.4.1 @@ -5833,7 +5850,7 @@ packages: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.9(webpack@5.89.0) + terser-webpack-plugin: 5.3.10(webpack@5.89.0) watchpack: 2.4.0 webpack-sources: 3.2.3 transitivePeerDependencies: diff --git a/app/src/admin/api/info.ts b/app/src/admin/api/info.ts index 377068f..233d247 100644 --- a/app/src/admin/api/info.ts +++ b/app/src/admin/api/info.ts @@ -4,7 +4,7 @@ import { setAppName, setBlobEndpoint, setDocsUrl, -} from "@/utils/env.ts"; +} from "@/conf/env.ts"; export type SiteInfo = { title: string; diff --git a/app/src/api/connection.ts b/app/src/api/connection.ts index 3927eef..fd28c2e 100644 --- a/app/src/api/connection.ts +++ b/app/src/api/connection.ts @@ -1,7 +1,7 @@ -import { tokenField, ws_api } from "@/conf.ts"; +import { tokenField, websocketEndpoint } from "@/conf"; import { getMemory } from "@/utils/memory.ts"; -export const endpoint = `${ws_api}/chat`; +export const endpoint = `${websocketEndpoint}/chat`; export type StreamMessage = { conversation?: number; diff --git a/app/src/api/file.ts b/app/src/api/file.ts index 09610fe..9e67164 100644 --- a/app/src/api/file.ts +++ b/app/src/api/file.ts @@ -1,5 +1,5 @@ import axios from "axios"; -import { blobEndpoint } from "@/utils/env.ts"; +import { blobEndpoint } from "@/conf/env.ts"; export type BlobParserResponse = { status: boolean; diff --git a/app/src/api/generation.ts b/app/src/api/generation.ts index 81e5e8f..e348e37 100644 --- a/app/src/api/generation.ts +++ b/app/src/api/generation.ts @@ -1,7 +1,7 @@ -import { tokenField, ws_api } from "@/conf.ts"; +import { tokenField, websocketEndpoint } from "@/conf"; import { getMemory } from "@/utils/memory.ts"; -export const endpoint = `${ws_api}/generation/create`; +export const endpoint = `${websocketEndpoint}/generation/create`; export type GenerationForm = { token: string; diff --git a/app/src/api/types.ts b/app/src/api/types.ts index 3f5adad..439d830 100644 --- a/app/src/api/types.ts +++ b/app/src/api/types.ts @@ -42,7 +42,7 @@ export type ConversationMapper = Record; export type PlanItem = { id: string; name: string; - value: string; + value: number; icon: string; models: string[]; }; @@ -53,6 +53,8 @@ export type Plan = { items: PlanItem[]; }; +export type Plans = Plan[]; + export type SubscriptionUsage = Record< string, { diff --git a/app/src/assets/pages/home.less b/app/src/assets/pages/home.less index bd551fa..3858fcc 100644 --- a/app/src/assets/pages/home.less +++ b/app/src/assets/pages/home.less @@ -110,6 +110,9 @@ } .model-name { + display: flex; + flex-direction: row; + align-items: center; color: hsl(var(--text)); } @@ -200,12 +203,31 @@ } } + .market-tip { + transform: translateY(1px); + } + .model-name { + display: flex; + flex-direction: row; + align-items: center; + + .badge { + transform: translateY(-2px); + } + &.pro { - // gold color gradient - background: linear-gradient(to right, hsl(45, 100%, 70%) 0%, hsl(46, 100%, 58%) 50%, hsl(46, 100%, 50%) 100%); - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; + p { + // gold color gradient + background: linear-gradient(to right, hsl(45, 100%, 70%) 0%, hsl(46, 100%, 58%) 50%, hsl(46, 100%, 50%) 100%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + } + + .badge { + color: rgb(164, 128, 0) !important; + background: rgb(255, 231, 145) !important; + } } } diff --git a/app/src/assets/pages/subscription.less b/app/src/assets/pages/subscription.less index aede469..7cce368 100644 --- a/app/src/assets/pages/subscription.less +++ b/app/src/assets/pages/subscription.less @@ -83,14 +83,6 @@ border-color: hsl(var(--text-secondary)); } - &.enterprise { - border-color: hsl(var(--accent)); - - .desc { - margin-top: 12px; - } - } - .title { text-align: center; font-size: 16px; @@ -157,6 +149,12 @@ gap: 6px; margin: 24px 0; + .api-tip { + display: flex; + flex-direction: column; + align-items: center; + } + div { display: flex; flex-direction: row; diff --git a/app/src/components/Avatar.tsx b/app/src/components/Avatar.tsx index c3ab492..4b7a617 100644 --- a/app/src/components/Avatar.tsx +++ b/app/src/components/Avatar.tsx @@ -1,4 +1,4 @@ -import { deeptrainApiEndpoint, useDeeptrain } from "@/utils/env.ts"; +import { deeptrainApiEndpoint, useDeeptrain } from "@/conf/env.ts"; import { ImgHTMLAttributes, useMemo } from "react"; import { cn } from "@/components/ui/lib/utils.ts"; diff --git a/app/src/components/ErrorBoundary.tsx b/app/src/components/ErrorBoundary.tsx index 6a37b64..09d24b9 100644 --- a/app/src/components/ErrorBoundary.tsx +++ b/app/src/components/ErrorBoundary.tsx @@ -1,7 +1,7 @@ import React from "react"; import { AlertCircle, Download } from "lucide-react"; import { withTranslation, WithTranslation } from "react-i18next"; -import { version } from "@/conf.ts"; +import { version } from "@/conf"; import { getMemoryPerformance } from "@/utils/app.ts"; import { Button } from "@/components/ui/button.tsx"; import { saveAsFile } from "@/utils/dom.ts"; diff --git a/app/src/components/FileProvider.tsx b/app/src/components/FileProvider.tsx index c8a0a3a..b0e1325 100644 --- a/app/src/components/FileProvider.tsx +++ b/app/src/components/FileProvider.tsx @@ -24,7 +24,7 @@ import { useDraggableInput } from "@/utils/dom.ts"; import { FileObject, FileArray, blobParser } from "@/api/file.ts"; import { Button } from "@/components/ui/button.tsx"; import { useSelector } from "react-redux"; -import { isHighContextModel } from "@/conf.ts"; +import { isHighContextModel } from "@/conf/model.ts"; import { selectModel } from "@/store/chat.ts"; import { ChatAction } from "@/components/home/assemblies/ChatAction.tsx"; import { cn } from "@/components/ui/lib/utils.ts"; diff --git a/app/src/components/ReloadService.tsx b/app/src/components/ReloadService.tsx index b2cd402..13d0787 100644 --- a/app/src/components/ReloadService.tsx +++ b/app/src/components/ReloadService.tsx @@ -1,4 +1,4 @@ -import { version } from "@/conf.ts"; +import { version } from "@/conf"; import { useTranslation } from "react-i18next"; import { useToast } from "./ui/use-toast.ts"; import { getMemory, setMemory } from "@/utils/memory.ts"; diff --git a/app/src/components/Tips.tsx b/app/src/components/Tips.tsx index 3f6f2df..3a3d3ec 100644 --- a/app/src/components/Tips.tsx +++ b/app/src/components/Tips.tsx @@ -5,21 +5,25 @@ import { TooltipTrigger, } from "@/components/ui/tooltip.tsx"; import { HelpCircle } from "lucide-react"; +import React from "react"; +import { cn } from "@/components/ui/lib/utils.ts"; type TipsProps = { - content: string; + content?: string; + children?: React.ReactNode; className?: string; }; -function Tips({ content, className }: TipsProps) { +function Tips({ content, children, className }: TipsProps) { return ( - + -

{content}

+ {content &&

{content}

} + {children}
diff --git a/app/src/components/admin/ChargeWidget.tsx b/app/src/components/admin/ChargeWidget.tsx index eb4def6..2662d10 100644 --- a/app/src/components/admin/ChargeWidget.tsx +++ b/app/src/components/admin/ChargeWidget.tsx @@ -55,7 +55,7 @@ import { useToast } from "@/components/ui/use-toast"; import { deleteCharge, listCharge, setCharge } from "@/admin/api/charge.ts"; import { useEffectAsync } from "@/utils/hook.ts"; import { cn } from "@/components/ui/lib/utils.ts"; -import { allModels } from "@/conf.ts"; +import { allModels } from "@/conf"; import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert.tsx"; import Tips from "@/components/Tips.tsx"; diff --git a/app/src/components/app/AppProvider.tsx b/app/src/components/app/AppProvider.tsx index 0343672..7f662e1 100644 --- a/app/src/components/app/AppProvider.tsx +++ b/app/src/components/app/AppProvider.tsx @@ -3,7 +3,7 @@ import { ThemeProvider } from "@/components/ThemeProvider.tsx"; import DialogManager from "@/dialogs"; import Broadcast from "@/components/Broadcast.tsx"; import { useEffectAsync } from "@/utils/hook.ts"; -import { allModels, supportModels } from "@/conf.ts"; +import { allModels, supportModels } from "@/conf"; import { channelModels } from "@/admin/channel.ts"; import { getApiCharge, getApiMarket, getApiModels } from "@/api/v1.ts"; import { loadPreferenceModels } from "@/utils/storage.ts"; diff --git a/app/src/components/app/MenuBar.tsx b/app/src/components/app/MenuBar.tsx index 9518877..a53596d 100644 --- a/app/src/components/app/MenuBar.tsx +++ b/app/src/components/app/MenuBar.tsx @@ -27,7 +27,7 @@ import { openDialog as openInvitationDialog } from "@/store/invitation.ts"; import { openDialog as openSharingDialog } from "@/store/sharing.ts"; import { openDialog as openApiDialog } from "@/store/api.ts"; import router from "@/router.tsx"; -import { useDeeptrain } from "@/utils/env.ts"; +import { useDeeptrain } from "@/conf/env.ts"; import React from "react"; type MenuBarProps = { diff --git a/app/src/components/app/NavBar.tsx b/app/src/components/app/NavBar.tsx index 23be637..4c49aff 100644 --- a/app/src/components/app/NavBar.tsx +++ b/app/src/components/app/NavBar.tsx @@ -9,7 +9,7 @@ import { import { Button } from "@/components/ui/button.tsx"; import { Menu } from "lucide-react"; import { useEffect } from "react"; -import { tokenField } from "@/conf.ts"; +import { tokenField } from "@/conf"; import { toggleMenu } from "@/store/menu.ts"; import ProjectLink from "@/components/ProjectLink.tsx"; import ModeToggle from "@/components/ThemeProvider.tsx"; @@ -18,7 +18,7 @@ import MenuBar from "./MenuBar.tsx"; import { getMemory } from "@/utils/memory.ts"; import { goAuth } from "@/utils/app.ts"; import Avatar from "@/components/Avatar.tsx"; -import { appLogo } from "@/utils/env.ts"; +import { appLogo } from "@/conf/env.ts"; function NavMenu() { const username = useSelector(selectUsername); diff --git a/app/src/components/home/ChatSpace.tsx b/app/src/components/home/ChatSpace.tsx index aaf1848..4dbed30 100644 --- a/app/src/components/home/ChatSpace.tsx +++ b/app/src/components/home/ChatSpace.tsx @@ -20,7 +20,7 @@ import { } from "@/components/ui/dialog.tsx"; import { getLanguage } from "@/i18n.ts"; import { selectAuthenticated } from "@/store/auth.ts"; -import { docsEndpoint, useDeeptrain } from "@/utils/env.ts"; +import { docsEndpoint, useDeeptrain } from "@/conf/env.ts"; function ChatSpace() { const [open, setOpen] = useState(false); diff --git a/app/src/components/home/ModelFinder.tsx b/app/src/components/home/ModelFinder.tsx index de1d720..5f3b79f 100644 --- a/app/src/components/home/ModelFinder.tsx +++ b/app/src/components/home/ModelFinder.tsx @@ -1,7 +1,6 @@ import SelectGroup, { SelectItemProps } from "@/components/SelectGroup.tsx"; -import { supportModels } from "@/conf.ts"; +import { supportModels } from "@/conf"; import { - getPlanModels, openMarket, selectModel, selectModelList, @@ -19,6 +18,7 @@ import { ToastAction } from "@/components/ui/toast.tsx"; import { useEffect, useMemo, useState } from "react"; import { Sparkles } from "lucide-react"; import { goAuth } from "@/utils/app.ts"; +import { includingModelFromPlan } from "@/conf/subscription.tsx"; function GetModel(name: string): Model { return supportModels.find((model) => model.id === name) as Model; @@ -29,7 +29,7 @@ type ModelSelectorProps = { }; function filterModel(model: Model, level: number) { - if (getPlanModels(level).includes(model.id)) { + if (includingModelFromPlan(level, model.id)) { return { name: model.id, value: model.name, diff --git a/app/src/components/home/ModelMarket.tsx b/app/src/components/home/ModelMarket.tsx index 8fe57b2..3a4517d 100644 --- a/app/src/components/home/ModelMarket.tsx +++ b/app/src/components/home/ModelMarket.tsx @@ -11,14 +11,13 @@ import { X, } from "lucide-react"; import React, { useMemo, useState } from "react"; -import { supportModels } from "@/conf.ts"; +import { supportModels } from "@/conf"; import { isUrl, splitList } from "@/utils/base.ts"; import { Model } from "@/api/types.ts"; import { useDispatch, useSelector } from "react-redux"; import { addModelList, closeMarket, - getPlanModels, removeModelList, selectModel, selectModelList, @@ -30,7 +29,7 @@ import { teenagerSelector } from "@/store/package.ts"; import { ToastAction } from "@/components/ui/toast.tsx"; import { selectAuthenticated } from "@/store/auth.ts"; import { useToast } from "@/components/ui/use-toast.ts"; -import { docsEndpoint } from "@/utils/env.ts"; +import { docsEndpoint } from "@/conf/env.ts"; import { goAuth } from "@/utils/app.ts"; import { DragDropContext, @@ -40,6 +39,16 @@ import { } from "react-beautiful-dnd"; import { savePreferenceModels } from "@/utils/storage.ts"; import { cn } from "@/components/ui/lib/utils.ts"; +import { Badge } from "@/components/ui/badge.tsx"; +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from "@/components/ui/tooltip.tsx"; +import { useMobile } from "@/utils/device.ts"; +import Tips from "@/components/Tips.tsx"; +import { includingModelFromPlan } from "@/conf/subscription.tsx"; type SearchBarProps = { value: string; @@ -100,6 +109,8 @@ function ModelItem({ const list = useSelector(selectModelList); const current = useSelector(selectModel); + const mobile = useMobile(); + const level = useSelector(levelSelector); const student = useSelector(teenagerSelector); const auth = useSelector(selectAuthenticated); @@ -111,7 +122,7 @@ function ModelItem({ }, [model, current, list]); const pro = useMemo(() => { - return getPlanModels(level).includes(model.id); + return includingModelFromPlan(level, model.id); }, [model, level, student]); const avatar = useMemo(() => { @@ -148,7 +159,32 @@ function ModelItem({ {model.name}
-

{model.name}

+
+

{model.name}

+ {mobile ? ( + +
+

{t("market.model-api")}

+ + {model.id} + +
+
+ ) : ( + + + + + {model.id} + + + {t("market.model-api")} + + + )} +
{model.description && (

{model.description}

)} diff --git a/app/src/components/home/subscription/BuyDialog.tsx b/app/src/components/home/subscription/BuyDialog.tsx index 16ca8bf..ab21f09 100644 --- a/app/src/components/home/subscription/BuyDialog.tsx +++ b/app/src/components/home/subscription/BuyDialog.tsx @@ -23,37 +23,38 @@ import { DialogClose } from "@radix-ui/react-dialog"; import { Button } from "@/components/ui/button.tsx"; import { expiredSelector, refreshSubscription } from "@/store/subscription.ts"; import { Plus } from "lucide-react"; -import { subscriptionPrize } from "@/conf.ts"; import { ToastAction } from "@/components/ui/toast.tsx"; -import { deeptrainEndpoint, useDeeptrain } from "@/utils/env.ts"; +import { deeptrainEndpoint, useDeeptrain } from "@/conf/env.ts"; import { AppDispatch } from "@/store"; import { openDialog } from "@/store/quota.ts"; +import { getPlanPrice } from "@/conf/subscription.tsx"; -function countPrize(base: number, month: number): number { - const prize = subscriptionPrize[base] * month; +function countPrice(base: number, month: number): number { + const price = getPlanPrice(base) * month; if (month >= 36) { - return prize * 0.7; + return price * 0.7; } else if (month >= 12) { - return prize * 0.8; + return price * 0.8; } else if (month >= 6) { - return prize * 0.9; + return price * 0.9; } - return prize; + return price; } -function countUpgradePrize( +function countUpgradePrice( level: number, target: number, days: number, ): number { - const bias = subscriptionPrize[target] - subscriptionPrize[level]; - return (bias / 30) * days; + const bias = getPlanPrice(target) - getPlanPrice(level); + const v = (bias / 30) * days; + return v > 0 ? v + 1 : 0; // time count offset } type UpgradeProps = { - base: number; level: number; + current: number; }; async function callBuyAction( @@ -118,7 +119,7 @@ async function callMigrateAction( return res.status; } -export function Upgrade({ base, level }: UpgradeProps) { +export function Upgrade({ level, current }: UpgradeProps) { const { t } = useTranslation(); const expired = useSelector(expiredSelector); const [open, setOpen] = React.useState(false); @@ -126,10 +127,10 @@ export function Upgrade({ base, level }: UpgradeProps) { const dispatch = useDispatch(); const { toast } = useToast(); - const isCurrent = useMemo(() => level === base, [level, base]); - const isUpgrade = useMemo(() => level < base, [level, base]); + const isCurrent = useMemo(() => current === level, [current, level]); + const isUpgrade = useMemo(() => current < level, [current, level]); - return level === 0 || level === base ? ( + return current === 0 || current === level ? (