Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
D
dify
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
ai-tech
dify
Commits
4779fcf6
Unverified
Commit
4779fcf6
authored
May 20, 2023
by
Nite Knite
Committed by
GitHub
May 20, 2023
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feature: infinite scroll (#119)
Add infinite scroll support to app list and dataset list.
parent
e8239ae6
Changes
11
Show whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
147 additions
and
34 deletions
+147
-34
_layout-client.tsx
web/app/(commonLayout)/_layout-client.tsx
+7
-6
Apps.tsx
web/app/(commonLayout)/apps/Apps.tsx
+34
-7
NewAppCard.tsx
web/app/(commonLayout)/apps/NewAppCard.tsx
+9
-5
NewAppDialog.tsx
web/app/(commonLayout)/apps/NewAppDialog.tsx
+4
-1
Datasets.tsx
web/app/(commonLayout)/datasets/Datasets.tsx
+33
-8
NewDatasetCard.tsx
web/app/(commonLayout)/datasets/NewDatasetCard.tsx
+4
-4
index.tsx
web/app/components/base/dialog/index.tsx
+1
-1
app-context.tsx
web/context/app-context.tsx
+45
-0
app.ts
web/models/app.ts
+4
-0
datasets.ts
web/models/datasets.ts
+4
-0
apps.ts
web/service/apps.ts
+2
-2
No files found.
web/app/(commonLayout)/_layout-client.tsx
View file @
4779fcf6
'use client'
'use client'
import
type
{
FC
}
from
'react'
import
{
FC
,
useRef
}
from
'react'
import
React
,
{
useEffect
,
useState
}
from
'react'
import
React
,
{
useEffect
,
useState
}
from
'react'
import
{
usePathname
,
useRouter
,
useSelectedLayoutSegments
}
from
'next/navigation'
import
{
usePathname
,
useRouter
,
useSelectedLayoutSegments
}
from
'next/navigation'
import
useSWR
,
{
SWRConfig
}
from
'swr'
import
useSWR
,
{
SWRConfig
}
from
'swr'
...
@@ -8,7 +8,7 @@ import { fetchAppList } from '@/service/apps'
...
@@ -8,7 +8,7 @@ import { fetchAppList } from '@/service/apps'
import
{
fetchDatasets
}
from
'@/service/datasets'
import
{
fetchDatasets
}
from
'@/service/datasets'
import
{
fetchLanggeniusVersion
,
fetchUserProfile
,
logout
}
from
'@/service/common'
import
{
fetchLanggeniusVersion
,
fetchUserProfile
,
logout
}
from
'@/service/common'
import
Loading
from
'@/app/components/base/loading'
import
Loading
from
'@/app/components/base/loading'
import
AppContext
from
'@/context/app-context'
import
{
AppContextProvider
}
from
'@/context/app-context'
import
DatasetsContext
from
'@/context/datasets-context'
import
DatasetsContext
from
'@/context/datasets-context'
import
type
{
LangGeniusVersionResponse
,
UserProfileResponse
}
from
'@/models/common'
import
type
{
LangGeniusVersionResponse
,
UserProfileResponse
}
from
'@/models/common'
...
@@ -23,6 +23,7 @@ const CommonLayout: FC<ICommonLayoutProps> = ({ children }) => {
...
@@ -23,6 +23,7 @@ const CommonLayout: FC<ICommonLayoutProps> = ({ children }) => {
const
pattern
=
pathname
.
replace
(
/.*
\/
app
\/
/
,
''
)
const
pattern
=
pathname
.
replace
(
/.*
\/
app
\/
/
,
''
)
const
[
idOrMethod
]
=
pattern
.
split
(
'/'
)
const
[
idOrMethod
]
=
pattern
.
split
(
'/'
)
const
isNotDetailPage
=
idOrMethod
===
'list'
const
isNotDetailPage
=
idOrMethod
===
'list'
const
pageContainerRef
=
useRef
<
HTMLDivElement
>
(
null
)
const
appId
=
isNotDetailPage
?
''
:
idOrMethod
const
appId
=
isNotDetailPage
?
''
:
idOrMethod
...
@@ -71,14 +72,14 @@ const CommonLayout: FC<ICommonLayoutProps> = ({ children }) => {
...
@@ -71,14 +72,14 @@ const CommonLayout: FC<ICommonLayoutProps> = ({ children }) => {
<
SWRConfig
value=
{
{
<
SWRConfig
value=
{
{
shouldRetryOnError
:
false
shouldRetryOnError
:
false
}
}
>
}
}
>
<
AppContext
.
Provider
value=
{
{
apps
:
appList
.
data
,
mutateApps
,
userProfile
,
mutateUserProfile
}
}
>
<
AppContext
Provider
value=
{
{
apps
:
appList
.
data
,
mutateApps
,
userProfile
,
mutateUserProfile
,
pageContainerRef
}
}
>
<
DatasetsContext
.
Provider
value=
{
{
datasets
:
datasetList
?.
data
||
[],
mutateDatasets
,
currentDataset
}
}
>
<
DatasetsContext
.
Provider
value=
{
{
datasets
:
datasetList
?.
data
||
[],
mutateDatasets
,
currentDataset
}
}
>
<
div
className=
'relative flex flex-col h-full overflow-scroll
bg-gray-100'
>
<
div
ref=
{
pageContainerRef
}
className=
'relative flex flex-col h-full overflow-auto
bg-gray-100'
>
<
Header
isBordered=
{
[
'/apps'
,
'/datasets'
].
includes
(
pathname
)
}
curApp=
{
curApp
as
any
}
appItems=
{
appList
.
data
}
userProfile=
{
userProfile
}
onLogout=
{
onLogout
}
langeniusVersionInfo=
{
langeniusVersionInfo
}
/>
<
Header
isBordered=
{
[
'/apps'
,
'/datasets'
].
includes
(
pathname
)
}
curApp=
{
curApp
as
any
}
appItems=
{
appList
.
data
}
userProfile=
{
userProfile
}
onLogout=
{
onLogout
}
langeniusVersionInfo=
{
langeniusVersionInfo
}
/>
{
children
}
{
children
}
</
div
>
</
div
>
</
DatasetsContext
.
Provider
>
</
DatasetsContext
.
Provider
>
</
AppContext
.
Provider
>
</
AppContextProvider
>
</
SWRConfig
>
</
SWRConfig
>
)
)
}
}
...
...
web/app/(commonLayout)/apps/Apps.tsx
View file @
4779fcf6
'use client'
'use client'
import
{
useEffect
}
from
'react'
import
{
useEffect
,
useRef
}
from
'react'
import
useSWRInfinite
from
'swr/infinite'
import
{
debounce
}
from
'lodash-es'
import
AppCard
from
'./AppCard'
import
AppCard
from
'./AppCard'
import
NewAppCard
from
'./NewAppCard'
import
NewAppCard
from
'./NewAppCard'
import
{
useAppContext
}
from
'@/context/app-context'
import
{
AppListResponse
}
from
'@/models/app'
import
{
fetchAppList
}
from
'@/service/apps'
import
{
useSelector
}
from
'@/context/app-context'
const
getKey
=
(
pageIndex
:
number
,
previousPageData
:
AppListResponse
)
=>
{
if
(
!
pageIndex
||
previousPageData
.
has_more
)
return
{
url
:
'apps'
,
params
:
{
page
:
pageIndex
+
1
,
limit
:
30
}
}
return
null
}
const
Apps
=
()
=>
{
const
Apps
=
()
=>
{
const
{
apps
,
mutateApps
}
=
useAppContext
()
const
{
data
,
isLoading
,
setSize
,
mutate
}
=
useSWRInfinite
(
getKey
,
fetchAppList
,
{
revalidateFirstPage
:
false
})
const
loadingStateRef
=
useRef
(
false
)
const
pageContainerRef
=
useSelector
(
state
=>
state
.
pageContainerRef
)
const
anchorRef
=
useRef
<
HTMLAnchorElement
>
(
null
)
useEffect
(()
=>
{
loadingStateRef
.
current
=
isLoading
},
[
isLoading
])
useEffect
(()
=>
{
useEffect
(()
=>
{
mutateApps
()
const
onScroll
=
debounce
(()
=>
{
if
(
!
loadingStateRef
.
current
)
{
const
{
scrollTop
,
clientHeight
}
=
pageContainerRef
.
current
!
const
anchorOffset
=
anchorRef
.
current
!
.
offsetTop
if
(
anchorOffset
-
scrollTop
-
clientHeight
<
100
)
{
setSize
(
size
=>
size
+
1
)
}
}
},
50
)
pageContainerRef
.
current
?.
addEventListener
(
'scroll'
,
onScroll
)
return
()
=>
pageContainerRef
.
current
?.
removeEventListener
(
'scroll'
,
onScroll
)
},
[])
},
[])
return
(
return
(
<
nav
className=
'grid content-start grid-cols-1 gap-4 px-12 pt-8 sm:grid-cols-2 lg:grid-cols-4 grow shrink-0'
>
<
nav
className=
'grid content-start grid-cols-1 gap-4 px-12 pt-8 sm:grid-cols-2 lg:grid-cols-4 grow shrink-0'
>
{
apps
.
map
(
app
=>
(<
AppCard
key=
{
app
.
id
}
app=
{
app
}
/>
))
}
{
data
?.
map
(({
data
:
apps
})
=>
apps
.
map
(
app
=>
(<
AppCard
key=
{
app
.
id
}
app=
{
app
}
/>)
))
}
<
NewAppCard
/>
<
NewAppCard
ref=
{
anchorRef
}
onSuccess=
{
mutate
}
/>
</
nav
>
</
nav
>
)
)
}
}
...
...
web/app/(commonLayout)/apps/NewAppCard.tsx
View file @
4779fcf6
'use client'
'use client'
import
{
useState
}
from
'react'
import
{
forwardRef
,
useState
}
from
'react'
import
classNames
from
'classnames'
import
classNames
from
'classnames'
import
{
useTranslation
}
from
'react-i18next'
import
{
useTranslation
}
from
'react-i18next'
import
style
from
'../list.module.css'
import
style
from
'../list.module.css'
import
NewAppDialog
from
'./NewAppDialog'
import
NewAppDialog
from
'./NewAppDialog'
const
CreateAppCard
=
()
=>
{
export
type
CreateAppCardProps
=
{
onSuccess
?:
()
=>
void
}
const
CreateAppCard
=
forwardRef
<
HTMLAnchorElement
,
CreateAppCardProps
>
(({
onSuccess
},
ref
)
=>
{
const
{
t
}
=
useTranslation
()
const
{
t
}
=
useTranslation
()
const
[
showNewAppDialog
,
setShowNewAppDialog
]
=
useState
(
false
)
const
[
showNewAppDialog
,
setShowNewAppDialog
]
=
useState
(
false
)
return
(
return
(
<
a
className=
{
classNames
(
style
.
listItem
,
style
.
newItemCard
)
}
onClick=
{
()
=>
setShowNewAppDialog
(
true
)
}
>
<
a
ref=
{
ref
}
className=
{
classNames
(
style
.
listItem
,
style
.
newItemCard
)
}
onClick=
{
()
=>
setShowNewAppDialog
(
true
)
}
>
<
div
className=
{
style
.
listItemTitle
}
>
<
div
className=
{
style
.
listItemTitle
}
>
<
span
className=
{
style
.
newItemIcon
}
>
<
span
className=
{
style
.
newItemIcon
}
>
<
span
className=
{
classNames
(
style
.
newItemIconImage
,
style
.
newItemIconAdd
)
}
/>
<
span
className=
{
classNames
(
style
.
newItemIconImage
,
style
.
newItemIconAdd
)
}
/>
...
@@ -20,9 +24,9 @@ const CreateAppCard = () => {
...
@@ -20,9 +24,9 @@ const CreateAppCard = () => {
</
div
>
</
div
>
</
div
>
</
div
>
{
/* <div className='text-xs text-gray-500'>{t('app.createFromConfigFile')}</div> */
}
{
/* <div className='text-xs text-gray-500'>{t('app.createFromConfigFile')}</div> */
}
<
NewAppDialog
show=
{
showNewAppDialog
}
onClose=
{
()
=>
setShowNewAppDialog
(
false
)
}
/>
<
NewAppDialog
show=
{
showNewAppDialog
}
on
Success=
{
onSuccess
}
on
Close=
{
()
=>
setShowNewAppDialog
(
false
)
}
/>
</
a
>
</
a
>
)
)
}
}
)
export
default
CreateAppCard
export
default
CreateAppCard
web/app/(commonLayout)/apps/NewAppDialog.tsx
View file @
4779fcf6
...
@@ -21,10 +21,11 @@ import EmojiPicker from '@/app/components/base/emoji-picker'
...
@@ -21,10 +21,11 @@ import EmojiPicker from '@/app/components/base/emoji-picker'
type
NewAppDialogProps
=
{
type
NewAppDialogProps
=
{
show
:
boolean
show
:
boolean
onSuccess
?:
()
=>
void
onClose
?:
()
=>
void
onClose
?:
()
=>
void
}
}
const
NewAppDialog
=
({
show
,
onClose
}:
NewAppDialogProps
)
=>
{
const
NewAppDialog
=
({
show
,
on
Success
,
on
Close
}:
NewAppDialogProps
)
=>
{
const
router
=
useRouter
()
const
router
=
useRouter
()
const
{
notify
}
=
useContext
(
ToastContext
)
const
{
notify
}
=
useContext
(
ToastContext
)
const
{
t
}
=
useTranslation
()
const
{
t
}
=
useTranslation
()
...
@@ -79,6 +80,8 @@ const NewAppDialog = ({ show, onClose }: NewAppDialogProps) => {
...
@@ -79,6 +80,8 @@ const NewAppDialog = ({ show, onClose }: NewAppDialogProps) => {
mode
:
isWithTemplate
?
templates
.
data
[
selectedTemplateIndex
].
mode
:
newAppMode
!
,
mode
:
isWithTemplate
?
templates
.
data
[
selectedTemplateIndex
].
mode
:
newAppMode
!
,
config
:
isWithTemplate
?
templates
.
data
[
selectedTemplateIndex
].
model_config
:
undefined
,
config
:
isWithTemplate
?
templates
.
data
[
selectedTemplateIndex
].
model_config
:
undefined
,
})
})
if
(
onSuccess
)
onSuccess
()
if
(
onClose
)
if
(
onClose
)
onClose
()
onClose
()
notify
({
type
:
'success'
,
message
:
t
(
'app.newApp.appCreated'
)
})
notify
({
type
:
'success'
,
message
:
t
(
'app.newApp.appCreated'
)
})
...
...
web/app/(commonLayout)/datasets/Datasets.tsx
View file @
4779fcf6
'use client'
'use client'
import
{
useEffect
}
from
'react'
import
{
useEffect
,
useRef
}
from
'react'
import
useSWR
from
'swr'
import
useSWRInfinite
from
'swr/infinite'
import
{
DataSet
}
from
'@/models/datasets'
;
import
{
debounce
}
from
'lodash-es'
;
import
{
DataSetListResponse
}
from
'@/models/datasets'
;
import
NewDatasetCard
from
'./NewDatasetCard'
import
NewDatasetCard
from
'./NewDatasetCard'
import
DatasetCard
from
'./DatasetCard'
;
import
DatasetCard
from
'./DatasetCard'
;
import
{
fetchDatasets
}
from
'@/service/datasets'
;
import
{
fetchDatasets
}
from
'@/service/datasets'
;
import
{
useSelector
}
from
'@/context/app-context'
;
const
getKey
=
(
pageIndex
:
number
,
previousPageData
:
DataSetListResponse
)
=>
{
if
(
!
pageIndex
||
previousPageData
.
has_more
)
return
{
url
:
'datasets'
,
params
:
{
page
:
pageIndex
+
1
,
limit
:
30
}
}
return
null
}
const
Datasets
=
()
=>
{
const
Datasets
=
()
=>
{
// const { datasets, mutateDatasets } = useAppContext()
const
{
data
,
isLoading
,
setSize
,
mutate
}
=
useSWRInfinite
(
getKey
,
fetchDatasets
,
{
revalidateFirstPage
:
false
})
const
{
data
:
datasetList
,
mutate
:
mutateDatasets
}
=
useSWR
({
url
:
'/datasets'
,
params
:
{
page
:
1
}
},
fetchDatasets
)
const
loadingStateRef
=
useRef
(
false
)
const
pageContainerRef
=
useSelector
(
state
=>
state
.
pageContainerRef
)
const
anchorRef
=
useRef
<
HTMLAnchorElement
>
(
null
)
useEffect
(()
=>
{
useEffect
(()
=>
{
mutateDatasets
()
loadingStateRef
.
current
=
isLoading
},
[
isLoading
])
useEffect
(()
=>
{
const
onScroll
=
debounce
(()
=>
{
if
(
!
loadingStateRef
.
current
)
{
const
{
scrollTop
,
clientHeight
}
=
pageContainerRef
.
current
!
const
anchorOffset
=
anchorRef
.
current
!
.
offsetTop
if
(
anchorOffset
-
scrollTop
-
clientHeight
<
100
)
{
setSize
(
size
=>
size
+
1
)
}
}
},
50
)
pageContainerRef
.
current
?.
addEventListener
(
'scroll'
,
onScroll
)
return
()
=>
pageContainerRef
.
current
?.
removeEventListener
(
'scroll'
,
onScroll
)
},
[])
},
[])
return
(
return
(
<
nav
className=
'grid content-start grid-cols-1 gap-4 px-12 pt-8 sm:grid-cols-2 lg:grid-cols-4 grow shrink-0'
>
<
nav
className=
'grid content-start grid-cols-1 gap-4 px-12 pt-8 sm:grid-cols-2 lg:grid-cols-4 grow shrink-0'
>
{
data
setList
?.
data
.
map
(
dataset
=>
(<
DatasetCard
key=
{
dataset
.
id
}
dataset=
{
dataset
}
/>
))
}
{
data
?.
map
(({
data
:
datasets
})
=>
datasets
.
map
(
dataset
=>
(<
DatasetCard
key=
{
dataset
.
id
}
dataset=
{
dataset
}
/>)
))
}
<
NewDatasetCard
/>
<
NewDatasetCard
ref=
{
anchorRef
}
/>
</
nav
>
</
nav
>
)
)
}
}
...
...
web/app/(commonLayout)/datasets/NewDatasetCard.tsx
View file @
4779fcf6
'use client'
'use client'
import
{
useState
}
from
'react'
import
{
forwardRef
,
useState
}
from
'react'
import
classNames
from
'classnames'
import
classNames
from
'classnames'
import
{
useTranslation
}
from
'react-i18next'
import
{
useTranslation
}
from
'react-i18next'
import
style
from
'../list.module.css'
import
style
from
'../list.module.css'
const
CreateAppCard
=
(
)
=>
{
const
CreateAppCard
=
forwardRef
<
HTMLAnchorElement
>
((
_
,
ref
)
=>
{
const
{
t
}
=
useTranslation
()
const
{
t
}
=
useTranslation
()
const
[
showNewAppDialog
,
setShowNewAppDialog
]
=
useState
(
false
)
const
[
showNewAppDialog
,
setShowNewAppDialog
]
=
useState
(
false
)
return
(
return
(
<
a
className=
{
classNames
(
style
.
listItem
,
style
.
newItemCard
)
}
href=
'/datasets/create'
>
<
a
ref=
{
ref
}
className=
{
classNames
(
style
.
listItem
,
style
.
newItemCard
)
}
href=
'/datasets/create'
>
<
div
className=
{
style
.
listItemTitle
}
>
<
div
className=
{
style
.
listItemTitle
}
>
<
span
className=
{
style
.
newItemIcon
}
>
<
span
className=
{
style
.
newItemIcon
}
>
<
span
className=
{
classNames
(
style
.
newItemIconImage
,
style
.
newItemIconAdd
)
}
/>
<
span
className=
{
classNames
(
style
.
newItemIconImage
,
style
.
newItemIconAdd
)
}
/>
...
@@ -23,6 +23,6 @@ const CreateAppCard = () => {
...
@@ -23,6 +23,6 @@ const CreateAppCard = () => {
{
/* <div className='text-xs text-gray-500'>{t('app.createFromConfigFile')}</div> */
}
{
/* <div className='text-xs text-gray-500'>{t('app.createFromConfigFile')}</div> */
}
</
a
>
</
a
>
)
)
}
}
)
export
default
CreateAppCard
export
default
CreateAppCard
web/app/components/base/dialog/index.tsx
View file @
4779fcf6
...
@@ -33,7 +33,7 @@ const CustomDialog = ({
...
@@ -33,7 +33,7 @@ const CustomDialog = ({
const
close
=
useCallback
(()
=>
onClose
?.(),
[
onClose
])
const
close
=
useCallback
(()
=>
onClose
?.(),
[
onClose
])
return
(
return
(
<
Transition
appear
show=
{
show
}
as=
{
Fragment
}
>
<
Transition
appear
show=
{
show
}
as=
{
Fragment
}
>
<
Dialog
as=
"div"
className=
"relative z-
1
0"
onClose=
{
close
}
>
<
Dialog
as=
"div"
className=
"relative z-
4
0"
onClose=
{
close
}
>
<
Transition
.
Child
<
Transition
.
Child
as=
{
Fragment
}
as=
{
Fragment
}
enter=
"ease-out duration-300"
enter=
"ease-out duration-300"
...
...
web/context/app-context.ts
→
web/context/app-context.ts
x
View file @
4779fcf6
'use client'
'use client'
import
{
createContext
,
useContext
}
from
'use-context-selector'
import
{
createContext
,
useContext
,
useContextSelector
}
from
'use-context-selector'
import
type
{
App
}
from
'@/types/app'
import
type
{
App
}
from
'@/types/app'
import
type
{
UserProfileResponse
}
from
'@/models/common'
import
type
{
UserProfileResponse
}
from
'@/models/common'
import
{
createRef
,
FC
,
PropsWithChildren
}
from
'react'
export
const
useSelector
=
<
T
extends
any
>
(selector: (value: AppContextValue) =
>
T): T =
>
useContextSelector(AppContext, selector);
export type AppContextValue =
{
export type AppContextValue =
{
apps
:
App
[]
apps
:
App
[]
mutateApps
:
()
=>
void
mutateApps
:
()
=>
void
userProfile
:
UserProfileResponse
userProfile
:
UserProfileResponse
mutateUserProfile
:
()
=>
void
mutateUserProfile
:
()
=>
void
pageContainerRef
:
React
.
RefObject
<
HTMLDivElement
>
,
useSelector
:
typeof
useSelector
,
}
}
const AppContext = createContext
<
AppContextValue
>
(
{
const AppContext = createContext
<
AppContextValue
>
(
{
...
@@ -20,8 +26,20 @@ const AppContext = createContext<AppContextValue>({
...
@@ -20,8 +26,20 @@ const AppContext = createContext<AppContextValue>({
email
:
''
,
email
:
''
,
},
},
mutateUserProfile
:
()
=>
{
},
mutateUserProfile
:
()
=>
{
},
pageContainerRef
:
createRef
(),
useSelector
,
}
)
}
)
export type AppContextProviderProps = PropsWithChildren
<
{
value
:
Omit
<
AppContextValue
,
'
useSelector
'
>
}
>
export const AppContextProvider: FC
<
AppContextProviderProps
>
= (
{
value
,
children
}
) =
>
(
<
AppContext
.
Provider
value=
{
{
...
value
,
useSelector
}
}
>
{
children
}
</
AppContext
.
Provider
>
)
export const useAppContext = () =
>
useContext(AppContext)
export const useAppContext = () =
>
useContext(AppContext)
export default AppContext
export default AppContext
web/models/app.ts
View file @
4779fcf6
...
@@ -61,6 +61,10 @@ export type SiteConfig = {
...
@@ -61,6 +61,10 @@ export type SiteConfig = {
export
type
AppListResponse
=
{
export
type
AppListResponse
=
{
data
:
App
[]
data
:
App
[]
has_more
:
boolean
limit
:
number
page
:
number
total
:
number
}
}
export
type
AppDetailResponse
=
App
export
type
AppDetailResponse
=
App
...
...
web/models/datasets.ts
View file @
4779fcf6
...
@@ -29,6 +29,10 @@ export type File = {
...
@@ -29,6 +29,10 @@ export type File = {
export
type
DataSetListResponse
=
{
export
type
DataSetListResponse
=
{
data
:
DataSet
[]
data
:
DataSet
[]
has_more
:
boolean
limit
:
number
page
:
number
total
:
number
}
}
export
type
IndexingEstimateResponse
=
{
export
type
IndexingEstimateResponse
=
{
...
...
web/service/apps.ts
View file @
4779fcf6
...
@@ -4,8 +4,8 @@ import type { ApikeysListResponse, AppDailyConversationsResponse, AppDailyEndUse
...
@@ -4,8 +4,8 @@ import type { ApikeysListResponse, AppDailyConversationsResponse, AppDailyEndUse
import
type
{
CommonResponse
}
from
'@/models/common'
import
type
{
CommonResponse
}
from
'@/models/common'
import
type
{
AppMode
,
ModelConfig
}
from
'@/types/app'
import
type
{
AppMode
,
ModelConfig
}
from
'@/types/app'
export
const
fetchAppList
:
Fetcher
<
AppListResponse
,
{
params
?:
Record
<
string
,
any
>
}
>
=
({
params
})
=>
{
export
const
fetchAppList
:
Fetcher
<
AppListResponse
,
{
url
:
string
;
params
?:
Record
<
string
,
any
>
}
>
=
({
url
,
params
})
=>
{
return
get
(
'apps'
,
params
)
as
Promise
<
AppListResponse
>
return
get
(
url
,
{
params
}
)
as
Promise
<
AppListResponse
>
}
}
export
const
fetchAppDetail
:
Fetcher
<
AppDetailResponse
,
{
url
:
string
;
id
:
string
}
>
=
({
url
,
id
})
=>
{
export
const
fetchAppDetail
:
Fetcher
<
AppDetailResponse
,
{
url
:
string
;
id
:
string
}
>
=
({
url
,
id
})
=>
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment