Bug Fix: Fix workflow knowledge retrieval cache bug (#23597)
Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: crazywoola <100913391+crazywoola@users.noreply.github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
@@ -5,6 +5,7 @@ import { useRouter } from 'next/navigation'
|
|||||||
import { useCallback, useEffect, useState } from 'react'
|
import { useCallback, useEffect, useState } from 'react'
|
||||||
import { useTranslation } from 'react-i18next'
|
import { useTranslation } from 'react-i18next'
|
||||||
import { RiMoreFill } from '@remixicon/react'
|
import { RiMoreFill } from '@remixicon/react'
|
||||||
|
import { mutate } from 'swr'
|
||||||
import cn from '@/utils/classnames'
|
import cn from '@/utils/classnames'
|
||||||
import Confirm from '@/app/components/base/confirm'
|
import Confirm from '@/app/components/base/confirm'
|
||||||
import { ToastContext } from '@/app/components/base/toast'
|
import { ToastContext } from '@/app/components/base/toast'
|
||||||
@@ -57,6 +58,19 @@ const DatasetCard = ({
|
|||||||
const onConfirmDelete = useCallback(async () => {
|
const onConfirmDelete = useCallback(async () => {
|
||||||
try {
|
try {
|
||||||
await deleteDataset(dataset.id)
|
await deleteDataset(dataset.id)
|
||||||
|
|
||||||
|
// Clear SWR cache to prevent stale data in knowledge retrieval nodes
|
||||||
|
mutate(
|
||||||
|
(key) => {
|
||||||
|
if (typeof key === 'string') return key.includes('/datasets')
|
||||||
|
if (typeof key === 'object' && key !== null)
|
||||||
|
return key.url === '/datasets' || key.url?.includes('/datasets')
|
||||||
|
return false
|
||||||
|
},
|
||||||
|
undefined,
|
||||||
|
{ revalidate: true },
|
||||||
|
)
|
||||||
|
|
||||||
notify({ type: 'success', message: t('dataset.datasetDeleted') })
|
notify({ type: 'success', message: t('dataset.datasetDeleted') })
|
||||||
if (onSuccess)
|
if (onSuccess)
|
||||||
onSuccess()
|
onSuccess()
|
||||||
|
@@ -4,7 +4,6 @@ import React, { useRef, useState } from 'react'
|
|||||||
import { useGetState, useInfiniteScroll } from 'ahooks'
|
import { useGetState, useInfiniteScroll } from 'ahooks'
|
||||||
import { useTranslation } from 'react-i18next'
|
import { useTranslation } from 'react-i18next'
|
||||||
import Link from 'next/link'
|
import Link from 'next/link'
|
||||||
import produce from 'immer'
|
|
||||||
import TypeIcon from '../type-icon'
|
import TypeIcon from '../type-icon'
|
||||||
import Modal from '@/app/components/base/modal'
|
import Modal from '@/app/components/base/modal'
|
||||||
import type { DataSet } from '@/models/datasets'
|
import type { DataSet } from '@/models/datasets'
|
||||||
@@ -29,9 +28,10 @@ const SelectDataSet: FC<ISelectDataSetProps> = ({
|
|||||||
onSelect,
|
onSelect,
|
||||||
}) => {
|
}) => {
|
||||||
const { t } = useTranslation()
|
const { t } = useTranslation()
|
||||||
const [selected, setSelected] = React.useState<DataSet[]>(selectedIds.map(id => ({ id }) as any))
|
const [selected, setSelected] = React.useState<DataSet[]>([])
|
||||||
const [loaded, setLoaded] = React.useState(false)
|
const [loaded, setLoaded] = React.useState(false)
|
||||||
const [datasets, setDataSets] = React.useState<DataSet[] | null>(null)
|
const [datasets, setDataSets] = React.useState<DataSet[] | null>(null)
|
||||||
|
const [hasInitialized, setHasInitialized] = React.useState(false)
|
||||||
const hasNoData = !datasets || datasets?.length === 0
|
const hasNoData = !datasets || datasets?.length === 0
|
||||||
const canSelectMulti = true
|
const canSelectMulti = true
|
||||||
|
|
||||||
@@ -49,19 +49,17 @@ const SelectDataSet: FC<ISelectDataSetProps> = ({
|
|||||||
const newList = [...(datasets || []), ...data.filter(item => item.indexing_technique || item.provider === 'external')]
|
const newList = [...(datasets || []), ...data.filter(item => item.indexing_technique || item.provider === 'external')]
|
||||||
setDataSets(newList)
|
setDataSets(newList)
|
||||||
setLoaded(true)
|
setLoaded(true)
|
||||||
if (!selected.find(item => !item.name))
|
|
||||||
return { list: [] }
|
|
||||||
|
|
||||||
const newSelected = produce(selected, (draft) => {
|
// Initialize selected datasets based on selectedIds and available datasets
|
||||||
selected.forEach((item, index) => {
|
if (!hasInitialized) {
|
||||||
if (!item.name) { // not fetched database
|
if (selectedIds.length > 0) {
|
||||||
const newItem = newList.find(i => i.id === item.id)
|
const validSelectedDatasets = selectedIds
|
||||||
if (newItem)
|
.map(id => newList.find(item => item.id === id))
|
||||||
draft[index] = newItem
|
.filter(Boolean) as DataSet[]
|
||||||
|
setSelected(validSelectedDatasets)
|
||||||
|
}
|
||||||
|
setHasInitialized(true)
|
||||||
}
|
}
|
||||||
})
|
|
||||||
})
|
|
||||||
setSelected(newSelected)
|
|
||||||
}
|
}
|
||||||
return { list: [] }
|
return { list: [] }
|
||||||
},
|
},
|
||||||
|
@@ -3,9 +3,6 @@ const translation = {
|
|||||||
welcome: 'आपका स्वागत है',
|
welcome: 'आपका स्वागत है',
|
||||||
appUnavailable: 'ऐप उपलब्ध नहीं है',
|
appUnavailable: 'ऐप उपलब्ध नहीं है',
|
||||||
appUnknownError: 'अज्ञात त्रुटि, कृपया पुनः प्रयास करें',
|
appUnknownError: 'अज्ञात त्रुटि, कृपया पुनः प्रयास करें',
|
||||||
// @ts-expect-error TODO: fix this
|
|
||||||
|
|
||||||
appUnknownError: 'ऐप अनुपलब्ध है',
|
|
||||||
},
|
},
|
||||||
chat: {
|
chat: {
|
||||||
newChat: 'नया चैट',
|
newChat: 'नया चैट',
|
||||||
|
Reference in New Issue
Block a user