fix(picker): fix picker files disappearing on refresh

This commit is contained in:
Waleed Latif
2025-05-04 10:29:06 -07:00
parent 7a385fce67
commit 3e01258c9e
5 changed files with 43 additions and 74 deletions
@@ -330,23 +330,19 @@ export function ConfluenceFileSelector({
}
}
// Update selected file when value changes externally
// Fetch the selected page metadata once credentials and domain are ready or changed
useEffect(() => {
if (value && selectedCredentialId && !selectedFile && domain && domain.includes('.')) {
fetchPageInfo(value)
}
}, [value, selectedCredentialId, selectedFile, domain, fetchPageInfo])
// Keep internal selectedFileId in sync with the value prop
useEffect(() => {
if (value !== selectedFileId) {
setSelectedFileId(value)
// Find file info if we have files loaded
if (files.length > 0) {
const fileInfo = files.find((file) => file.id === value) || null
setSelectedFile(fileInfo)
onFileInfoChange?.(fileInfo)
} else if (value && !selectedFile && selectedCredentialId && domain && domain.includes('.')) {
// If we don't have files loaded yet but have a value, try to fetch the file info
// Only make the API call if we have everything we need and a proper domain
fetchPageInfo(value)
}
}
}, [value, files, selectedFile, selectedCredentialId, domain, onFileInfoChange, fetchPageInfo])
}, [value])
// Handle file selection
const handleSelectFile = (file: ConfluenceFileInfo) => {
@@ -176,17 +176,20 @@ export function GoogleDrivePicker({
}
}, [fetchCredentials])
// Update selected file when value changes externally
// Fetch the selected file metadata once credentials are loaded or changed
useEffect(() => {
// If we have a file ID selected and credentials are ready but we still don't have the file info, fetch it
if (value && selectedCredentialId && !selectedFile) {
fetchFileById(value)
}
}, [value, selectedCredentialId, selectedFile, fetchFileById])
// Keep internal selectedFileId in sync with the value prop
useEffect(() => {
if (value !== selectedFileId) {
setSelectedFileId(value)
// If we have a value but no file info, try to fetch it
if (value && selectedCredentialId && !selectedFile) {
fetchFileById(value)
}
}
}, [value, selectedCredentialId, selectedFile, fetchFileById])
}, [value])
// Fetch the access token for the selected credential
const fetchAccessToken = async (): Promise<string | null> => {
@@ -373,29 +373,19 @@ export function JiraIssueSelector({
}
}
// Update selected issue when value changes externally
// Fetch selected issue metadata once credentials are ready or changed
useEffect(() => {
if (value && selectedCredentialId && !selectedIssue && domain && domain.includes('.')) {
fetchIssueInfo(value)
}
}, [value, selectedCredentialId, selectedIssue, domain, fetchIssueInfo])
// Keep internal selectedIssueId in sync with the value prop
useEffect(() => {
if (value !== selectedIssueId) {
setSelectedIssueId(value)
// Only fetch issue info if we have a valid value
if (value && value.trim() !== '') {
// Find issue info if we have issues loaded
if (issues.length > 0) {
const issueInfo = issues.find((issue) => issue.id === value) || null
setSelectedIssue(issueInfo)
onIssueInfoChange?.(issueInfo)
} else if (!selectedIssue && selectedCredentialId && domain && domain.includes('.')) {
// If we don't have issues loaded yet but have a value, try to fetch the issue info
fetchIssueInfo(value)
}
} else {
// If value is empty or undefined, clear the selection without triggering API calls
setSelectedIssue(null)
onIssueInfoChange?.(null)
}
}
}, [value, issues, selectedIssue, selectedCredentialId, domain, onIssueInfoChange, fetchIssueInfo])
}, [value])
// Handle issue selection
const handleSelectIssue = (issue: JiraIssueInfo) => {
@@ -214,29 +214,19 @@ export function FolderSelector({
}
}, [selectedCredentialId, fetchFolders])
// Update selected folder when value changes externally
// Keep internal selectedFolderId in sync with the value prop
useEffect(() => {
if (value !== selectedFolderId) {
setSelectedFolderId(value)
// Find folder info if we have folders loaded
if (folders.length > 0) {
const folderInfo = folders.find((folder) => folder.id === value) || null
setSelectedFolder(folderInfo)
onFolderInfoChange?.(folderInfo)
} else if (value && selectedCredentialId) {
// If we have a value but no folders loaded yet, try to fetch the folder by ID
fetchFolderById(value)
}
}
}, [value, folders, onFolderInfoChange, selectedCredentialId, fetchFolderById])
}, [value])
// Try to fetch the folder by ID when credentials become available
// Fetch the selected folder metadata once credentials are ready
useEffect(() => {
if (selectedCredentialId && selectedFolderId && !selectedFolder) {
fetchFolderById(selectedFolderId)
if (value && selectedCredentialId && !selectedFolder) {
fetchFolderById(value)
}
}, [selectedCredentialId, selectedFolderId, selectedFolder, fetchFolderById])
}, [value, selectedCredentialId, selectedFolder, fetchFolderById])
// Handle folder selection
const handleSelectFolder = (folder: FolderInfo) => {
@@ -331,29 +331,19 @@ export function JiraProjectSelector({
}
}, [fetchCredentials])
// Update selected project when value changes externally
// Fetch the selected project metadata once credentials are ready or changed
useEffect(() => {
if (value && selectedCredentialId && !selectedProject && domain && domain.includes('.')) {
fetchProjectInfo(value)
}
}, [value, selectedCredentialId, selectedProject, domain, fetchProjectInfo])
// Keep internal selectedProjectId in sync with the value prop
useEffect(() => {
if (value !== selectedProjectId) {
setSelectedProjectId(value)
// Only fetch project info if we have a valid value
if (value && value.trim() !== '') {
// Find project info if we have projects loaded
if (projects.length > 0) {
const projectInfo = projects.find((project) => project.id === value) || null
setSelectedProject(projectInfo)
onProjectInfoChange?.(projectInfo)
} else if (!selectedProject && selectedCredentialId && domain && domain.includes('.')) {
// If we don't have projects loaded yet but have a value, try to fetch the project info
fetchProjectInfo(value)
}
} else {
// If value is empty or undefined, clear the selection without triggering API calls
setSelectedProject(null)
onProjectInfoChange?.(null)
}
}
}, [value, projects, selectedProject, selectedCredentialId, domain, onProjectInfoChange, fetchProjectInfo])
}, [value])
// Handle open change
const handleOpenChange = (isOpen: boolean) => {