diff --git a/services/web/frontend/js/features/file-tree/components/file-tree-create/modes/file-tree-create-new-doc.tsx b/services/web/frontend/js/features/file-tree/components/file-tree-create/modes/file-tree-create-new-doc.tsx index c932540ba2..204f5af6da 100644 --- a/services/web/frontend/js/features/file-tree/components/file-tree-create/modes/file-tree-create-new-doc.tsx +++ b/services/web/frontend/js/features/file-tree/components/file-tree-create/modes/file-tree-create-new-doc.tsx @@ -30,7 +30,9 @@ export default function FileTreeCreateNewDoc() { extension: name.split('.').length > 1 ? name.split('.').pop() : '', }) - openDoc(doc) + if (doc) { + openDoc(doc) + } }, [finishCreatingDoc, name, openDoc] ) diff --git a/services/web/frontend/js/features/file-tree/contexts/file-tree-actionable.tsx b/services/web/frontend/js/features/file-tree/contexts/file-tree-actionable.tsx index 3a3a4c92a8..b9688edc65 100644 --- a/services/web/frontend/js/features/file-tree/contexts/file-tree-actionable.tsx +++ b/services/web/frontend/js/features/file-tree/contexts/file-tree-actionable.tsx @@ -16,6 +16,9 @@ import { syncDelete, syncMove, syncCreateEntity, + NewDocEntity, + NewLinkedFileEntity, + NewEntity, } from '../util/sync-mutation' import { findInTree, findInTreeOrThrow } from '../util/find-in-tree' import { isNameUniqueInFolder } from '../util/is-name-unique-in-folder' @@ -35,6 +38,7 @@ import { Folder } from '../../../../../types/folder' import { useReferencesContext } from '@/features/ide-react/context/references-context' import { usePermissionsContext } from '@/features/ide-react/context/permissions-context' import { FileTreeEntity } from '@ol-types/file-tree-entity' +import { Doc } from '@ol-types/doc' type DroppedFile = File & { relativePath?: string @@ -73,8 +77,12 @@ const FileTreeActionableContext = createContext< finishCreatingFolder: any startCreatingDocOrFile: any startUploadingDocOrFile: any - finishCreatingDoc: any - finishCreatingLinkedFile: any + finishCreatingDoc: ( + entity: Omit + ) => Promise + finishCreatingLinkedFile: ( + entity: Omit + ) => Promise<{ new_file_id: string } | undefined> cancel: () => void droppedFiles: { files: File[]; targetFolderId: string } | null setDroppedFiles: (value: DroppedFiles | null) => void @@ -403,7 +411,7 @@ export const FileTreeActionableProvider: FC = ({ }, [fileTreeData, selectedEntityIds]) const finishCreatingEntity = useCallback( - (entity: any) => { + (entity: NewEntity) => { const error = validateCreate(fileTreeData, parentFolderId, entity) if (error) { return Promise.reject(error) @@ -415,7 +423,7 @@ export const FileTreeActionableProvider: FC = ({ ) const finishCreatingFolder = useCallback( - (name: any) => { + (name: string) => { dispatch({ type: ACTION_TYPES.CREATING_FOLDER }) return finishCreatingEntity({ endpoint: 'folder', name }) .then(() => { @@ -440,8 +448,16 @@ export const FileTreeActionableProvider: FC = ({ startCreatingFile('upload') }, [startCreatingFile]) + type FinishCreatingDocOrFileReturn = T extends NewDocEntity + ? Promise + : T extends NewLinkedFileEntity + ? Promise<{ new_file_id: string } | undefined> + : never + const finishCreatingDocOrFile = useCallback( - (entity: any) => { + ( + entity: T + ): FinishCreatingDocOrFileReturn => { dispatch({ type: ACTION_TYPES.CREATING_FILE }) return finishCreatingEntity(entity) @@ -451,23 +467,21 @@ export const FileTreeActionableProvider: FC = ({ }) .catch(error => { dispatch({ type: ACTION_TYPES.ERROR, error }) - }) + }) as FinishCreatingDocOrFileReturn }, [finishCreatingEntity] ) const finishCreatingDoc = useCallback( - (entity: any) => { - entity.endpoint = 'doc' - return finishCreatingDocOrFile(entity) + (entity: Omit) => { + return finishCreatingDocOrFile({ ...entity, endpoint: 'doc' }) }, [finishCreatingDocOrFile] ) const finishCreatingLinkedFile = useCallback( - (entity: any) => { - entity.endpoint = 'linked_file' - return finishCreatingDocOrFile(entity) + (entity: Omit) => { + return finishCreatingDocOrFile({ ...entity, endpoint: 'linked_file' }) }, [finishCreatingDocOrFile] ) diff --git a/services/web/frontend/js/features/file-tree/util/sync-mutation.ts b/services/web/frontend/js/features/file-tree/util/sync-mutation.ts index 343a663b96..1c10ef4961 100644 --- a/services/web/frontend/js/features/file-tree/util/sync-mutation.ts +++ b/services/web/frontend/js/features/file-tree/util/sync-mutation.ts @@ -1,4 +1,6 @@ import { postJSON, deleteJSON } from '../../../infrastructure/fetch-json' +import { Folder } from '@ol-types/folder' +import { Doc } from '@ol-types/doc' export function syncRename( projectId: string, @@ -42,21 +44,45 @@ export function syncMove( ) } -export function syncCreateEntity( +export type NewDocEntity = { + endpoint: 'doc' + name: string +} + +export type NewFolderEntity = { + endpoint: 'folder' + name: string +} + +export type NewLinkedFileEntity = { + endpoint: 'linked_file' + name: string + provider: string + data: Record +} + +export type NewEntity = NewDocEntity | NewFolderEntity | NewLinkedFileEntity + +type SyncCreateEntityReturn = T extends NewDocEntity + ? Promise + : T extends NewFolderEntity + ? Promise + : T extends NewLinkedFileEntity + ? Promise<{ new_file_id: string }> + : never + +export function syncCreateEntity( projectId: string, parentFolderId: string, - newEntityData: { - endpoint: 'doc' | 'folder' | 'linked-file' - [key: string]: unknown - } -) { + newEntityData: T +): SyncCreateEntityReturn { const { endpoint, ...newEntity } = newEntityData return postJSON(`/project/${projectId}/${endpoint}`, { body: { parent_folder_id: parentFolderId, ...newEntity, }, - }) + }) as SyncCreateEntityReturn } function getEntityPathName(entityType: string) {