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
cfbfd59b
Unverified
Commit
cfbfd59b
authored
Nov 16, 2023
by
zxhlyh
Committed by
GitHub
Nov 16, 2023
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix: upload image (#1522)
parent
d9336d9a
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
40 additions
and
7 deletions
+40
-7
index.tsx
...components/app/configuration/prompt-value-panel/index.tsx
+1
-1
hooks.ts
web/app/components/base/image-uploader/hooks.ts
+34
-5
uploader.tsx
web/app/components/base/image-uploader/uploader.tsx
+1
-0
index.tsx
web/app/components/share/text-generation/run-once/index.tsx
+1
-1
common.en.ts
web/i18n/lang/common.en.ts
+1
-0
common.zh.ts
web/i18n/lang/common.zh.ts
+1
-0
app.ts
web/types/app.ts
+1
-0
No files found.
web/app/components/app/configuration/prompt-value-panel/index.tsx
View file @
cfbfd59b
...
...
@@ -161,7 +161,7 @@ const PromptValuePanel: FC<IPromptValuePanelProps> = ({
{
appType
===
AppType
.
completion
&&
visionConfig
?.
enabled
&&
(
<
div
className=
"mt-3 xl:flex justify-between"
>
<
div
className=
"mr-1 py-2 shrink-0 w-[120px] text-sm text-gray-900"
>
Image Upload
</
div
>
<
div
className=
"mr-1 py-2 shrink-0 w-[120px] text-sm text-gray-900"
>
{
t
(
'common.imageUploader.imageUpload'
)
}
</
div
>
<
div
className=
'grow'
>
<
TextGenerationImageUploader
settings=
{
visionConfig
}
...
...
web/app/components/base/image-uploader/hooks.ts
View file @
cfbfd59b
import
{
useState
}
from
'react'
import
{
use
Memo
,
useRef
,
use
State
}
from
'react'
import
{
useParams
}
from
'next/navigation'
import
{
useTranslation
}
from
'react-i18next'
import
{
imageUpload
}
from
'./utils'
...
...
@@ -10,38 +10,59 @@ export const useImageFiles = () => {
const
{
t
}
=
useTranslation
()
const
{
notify
}
=
useToastContext
()
const
[
files
,
setFiles
]
=
useState
<
ImageFile
[]
>
([])
const
filesRef
=
useRef
<
ImageFile
[]
>
([])
const
handleUpload
=
(
imageFile
:
ImageFile
)
=>
{
const
newFiles
=
[...
files
,
imageFile
]
setFiles
(
newFiles
)
const
files
=
filesRef
.
current
const
index
=
files
.
findIndex
(
file
=>
file
.
_id
===
imageFile
.
_id
)
if
(
index
>
-
1
)
{
const
currentFile
=
files
[
index
]
const
newFiles
=
[...
files
.
slice
(
0
,
index
),
{
...
currentFile
,
...
imageFile
},
...
files
.
slice
(
index
+
1
)]
setFiles
(
newFiles
)
filesRef
.
current
=
newFiles
}
else
{
const
newFiles
=
[...
files
,
imageFile
]
setFiles
(
newFiles
)
filesRef
.
current
=
newFiles
}
}
const
handleRemove
=
(
imageFileId
:
string
)
=>
{
const
files
=
filesRef
.
current
const
index
=
files
.
findIndex
(
file
=>
file
.
_id
===
imageFileId
)
if
(
index
>
-
1
)
{
const
newFiles
=
[...
files
.
slice
(
0
,
index
),
...
files
.
slice
(
index
+
1
)]
const
currentFile
=
files
[
index
]
const
newFiles
=
[...
files
.
slice
(
0
,
index
),
{
...
currentFile
,
deleted
:
true
},
...
files
.
slice
(
index
+
1
)]
setFiles
(
newFiles
)
filesRef
.
current
=
newFiles
}
}
const
handleImageLinkLoadError
=
(
imageFileId
:
string
)
=>
{
const
files
=
filesRef
.
current
const
index
=
files
.
findIndex
(
file
=>
file
.
_id
===
imageFileId
)
if
(
index
>
-
1
)
{
const
currentFile
=
files
[
index
]
const
newFiles
=
[...
files
.
slice
(
0
,
index
),
{
...
currentFile
,
progress
:
-
1
},
...
files
.
slice
(
index
+
1
)]
filesRef
.
current
=
newFiles
setFiles
(
newFiles
)
}
}
const
handleImageLinkLoadSuccess
=
(
imageFileId
:
string
)
=>
{
const
files
=
filesRef
.
current
const
index
=
files
.
findIndex
(
file
=>
file
.
_id
===
imageFileId
)
if
(
index
>
-
1
)
{
const
currentImageFile
=
files
[
index
]
const
newFiles
=
[...
files
.
slice
(
0
,
index
),
{
...
currentImageFile
,
progress
:
100
},
...
files
.
slice
(
index
+
1
)]
filesRef
.
current
=
newFiles
setFiles
(
newFiles
)
}
}
const
handleReUpload
=
(
imageFileId
:
string
)
=>
{
const
files
=
filesRef
.
current
const
index
=
files
.
findIndex
(
file
=>
file
.
_id
===
imageFileId
)
if
(
index
>
-
1
)
{
...
...
@@ -50,15 +71,18 @@ export const useImageFiles = () => {
file
:
currentImageFile
.
file
!
,
onProgressCallback
:
(
progress
)
=>
{
const
newFiles
=
[...
files
.
slice
(
0
,
index
),
{
...
currentImageFile
,
progress
},
...
files
.
slice
(
index
+
1
)]
filesRef
.
current
=
newFiles
setFiles
(
newFiles
)
},
onSuccessCallback
:
(
res
)
=>
{
const
newFiles
=
[...
files
.
slice
(
0
,
index
),
{
...
currentImageFile
,
fileId
:
res
.
id
,
progress
:
100
},
...
files
.
slice
(
index
+
1
)]
filesRef
.
current
=
newFiles
setFiles
(
newFiles
)
},
onErrorCallback
:
()
=>
{
notify
({
type
:
'error'
,
message
:
t
(
'common.imageUploader.uploadFromComputerUploadError'
)
})
const
newFiles
=
[...
files
.
slice
(
0
,
index
),
{
...
currentImageFile
,
progress
:
-
1
},
...
files
.
slice
(
index
+
1
)]
filesRef
.
current
=
newFiles
setFiles
(
newFiles
)
},
},
!!
params
.
token
)
...
...
@@ -67,10 +91,15 @@ export const useImageFiles = () => {
const
handleClear
=
()
=>
{
setFiles
([])
filesRef
.
current
=
[]
}
const
filteredFiles
=
useMemo
(()
=>
{
return
files
.
filter
(
file
=>
!
file
.
deleted
)
},
[
files
])
return
{
files
,
files
:
filteredFiles
,
onUpload
:
handleUpload
,
onRemove
:
handleRemove
,
onImageLinkLoadError
:
handleImageLinkLoadError
,
...
...
web/app/components/base/image-uploader/uploader.tsx
View file @
cfbfd59b
...
...
@@ -88,6 +88,7 @@ const Uploader: FC<UploaderProps> = ({
absolute block inset-0 opacity-0 text-[0]
${disabled ? 'cursor-not-allowed' : 'cursor-pointer'}
`
}
onClick=
{
e
=>
(
e
.
target
as
HTMLInputElement
).
value
=
''
}
type=
'file'
accept=
'.png, .jpg, .jpeg, .webp, .gif'
onChange=
{
handleChange
}
...
...
web/app/components/share/text-generation/run-once/index.tsx
View file @
cfbfd59b
...
...
@@ -82,7 +82,7 @@ const RunOnce: FC<IRunOnceProps> = ({
{
visionConfig
?.
enabled
&&
(
<
div
className=
"w-full mt-4"
>
<
div
className=
"text-gray-900 text-sm font-medium"
>
Image Upload
</
div
>
<
div
className=
"text-gray-900 text-sm font-medium"
>
{
t
(
'common.imageUploader.imageUpload'
)
}
</
div
>
<
div
className=
'mt-2'
>
<
TextGenerationImageUploader
settings=
{
visionConfig
}
...
...
web/i18n/lang/common.en.ts
View file @
cfbfd59b
...
...
@@ -438,6 +438,7 @@ const translation = {
pasteImageLink
:
'Paste image link'
,
pasteImageLinkInputPlaceholder
:
'Paste image link here'
,
pasteImageLinkInvalid
:
'Invalid image link'
,
imageUpload
:
'Image Upload'
,
},
}
...
...
web/i18n/lang/common.zh.ts
View file @
cfbfd59b
...
...
@@ -438,6 +438,7 @@ const translation = {
pasteImageLink
:
'粘贴图片链接'
,
pasteImageLinkInputPlaceholder
:
'将图像链接粘贴到此处'
,
pasteImageLinkInvalid
:
'图片链接无效'
,
imageUpload
:
'图片上传'
,
},
}
...
...
web/types/app.ts
View file @
cfbfd59b
...
...
@@ -301,6 +301,7 @@ export type ImageFile = {
progress
:
number
url
:
string
base64Url
?:
string
deleted
?:
boolean
}
export
type
VisionFile
=
{
...
...
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