From 3f6575d41e2c6f8c9832f5f6ac869f144eebf416 Mon Sep 17 00:00:00 2001 From: Dawid Jankowiak Date: Thu, 10 Oct 2024 17:46:23 +0200 Subject: [PATCH] work in progress --- .../MetadataInstanceEditor.tsx | 5 ++ .../MetadataSidebarRedesign.tsx | 73 +++++++++---------- .../hooks/useSidebarMetadataFetcher.ts | 38 ++++------ 3 files changed, 54 insertions(+), 62 deletions(-) diff --git a/src/elements/content-sidebar/MetadataInstanceEditor.tsx b/src/elements/content-sidebar/MetadataInstanceEditor.tsx index 1b3cd05f68..b3f8742c64 100644 --- a/src/elements/content-sidebar/MetadataInstanceEditor.tsx +++ b/src/elements/content-sidebar/MetadataInstanceEditor.tsx @@ -4,9 +4,13 @@ import { type FormValues, type JSONPatchOperations, type MetadataTemplateInstance, + type FetcherResponse, + type BaseOptionType, } from '@box/metadata-editor'; import React from 'react'; +const noopTaxonomyFetcher = () => Promise.resolve({ options: [] } satisfies FetcherResponse); + export interface MetadataInstanceEditorProps { areAiSuggestionsAvailable: boolean; isBoxAiSuggestionsEnabled: boolean; @@ -44,6 +48,7 @@ export const MetadataInstanceEditor: React.FC = ({ onSubmit={onSubmit} selectedTemplateInstance={template} setIsUnsavedChangesModalOpen={setIsUnsavedChangesModalOpen} + taxonomyOptionsFetcher={noopTaxonomyFetcher} /> ); }; diff --git a/src/elements/content-sidebar/MetadataSidebarRedesign.tsx b/src/elements/content-sidebar/MetadataSidebarRedesign.tsx index 7a3a4b51b2..b11c923f37 100644 --- a/src/elements/content-sidebar/MetadataSidebarRedesign.tsx +++ b/src/elements/content-sidebar/MetadataSidebarRedesign.tsx @@ -8,12 +8,13 @@ import { FormattedMessage, useIntl } from 'react-intl'; import { InlineError, LoadingIndicator } from '@box/blueprint-web'; import { AddMetadataTemplateDropdown, + AutofillContextProvider, MetadataEmptyState, MetadataInstanceList, type FormValues, type JSONPatchOperations, - type MetadataTemplateInstance, type MetadataTemplate, + type MetadataTemplateInstance, } from '@box/metadata-editor'; import API from '../../api'; @@ -27,13 +28,11 @@ import { EVENT_JS_READY } from '../common/logger/constants'; import { mark } from '../../utils/performance'; import useSidebarMetadataFetcher, { STATUS } from './hooks/useSidebarMetadataFetcher'; -import { type ElementsXhrError } from '../../common/types/api'; -import { type ElementOrigin } from '../common/flowTypes'; import { type WithLoggerProps } from '../../common/types/logging'; import messages from '../common/messages'; import './MetadataSidebarRedesign.scss'; -import MetadataInstanceEditor from './MetadataInstanceEditor'; +import { MetadataInstanceEditor } from './MetadataInstanceEditor'; import { convertTemplateToTemplateInstance } from './utils/convertTemplateToTemplateInstance'; import { isExtensionSupportedForMetadataSuggestions } from './utils/isExtensionSupportedForMetadataSuggestions'; @@ -51,13 +50,8 @@ interface PropsWithoutContext extends ExternalProps { hasSidebarInitialized?: boolean; } -interface ContextInfo { - isErrorDisplayed: boolean; - error: ElementsXhrError | Error; -} - export interface ErrorContextProps { - onError: (error: ElementsXhrError | Error, code: string, contextInfo?: ContextInfo, origin?: ElementOrigin) => void; + onError: (error: Error, code: string, contextInfo?: Record) => void; } export interface MetadataSidebarRedesignProps extends PropsWithoutContext, ErrorContextProps, WithLoggerProps { @@ -189,35 +183,36 @@ function MetadataSidebarRedesign({ api, elementId, fileId, onError, isFeatureEna {showEmptyState && ( )} - {editingTemplate && ( - - )} - {showList && ( - { - setEditingTemplate(templateInstance); - setIsDeleteButtonDisabled(false); - }} - onEditWithAutofill={templateInstance => { - setEditingTemplate(templateInstance); - }} - templateInstances={templateInstances} - /> - )} + + {editingTemplate && ( + + )} + {showList && ( + { + setEditingTemplate(templateInstance); + setIsDeleteButtonDisabled(false); + }} + templateInstances={templateInstances} + /> + )} + ); diff --git a/src/elements/content-sidebar/hooks/useSidebarMetadataFetcher.ts b/src/elements/content-sidebar/hooks/useSidebarMetadataFetcher.ts index 0a7ed6b1e5..97e01e3b9c 100644 --- a/src/elements/content-sidebar/hooks/useSidebarMetadataFetcher.ts +++ b/src/elements/content-sidebar/hooks/useSidebarMetadataFetcher.ts @@ -31,22 +31,7 @@ export enum STATUS { SUCCESS = 'success', } -class ElementsError extends Error { - code: string; - - type: 'error'; - - constructor(message: string, errorCode: string) { - super(message); - this.name = 'ElementsError'; - this.code = errorCode; - this.message = message; - this.type = 'error'; - - // Set the prototype explicitly to maintain the instanceof check - Object.setPrototypeOf(this, ElementsError.prototype); - } -} +const wait = async ms => new Promise(resolve => setTimeout(resolve, ms)); interface DataFetcher { errorMessage: MessageDescriptor | null; @@ -208,18 +193,25 @@ function useSidebarMetadataFetcher( const extractSuggestions = React.useCallback( async (templateKey: string, fields: MetadataTemplateField[]) => { const aiAPI = api.getIntelligenceAPI(); + + await wait(1000); + let answer = {}; try { - answer = await aiAPI.extractStructured({ - items: [file], - fields, - }); + // answer = await aiAPI.extractStructured({ + // items: [{ id: file.id, type: file.type }], + // fields, + // }); + answer = { + projectName: 'P1691981c2ec540d0187c51fe0f12bf5225', + }; } catch (error) { - throw new ElementsError(error.message, ERROR_CODE_FETCH_METADATA_SUGGESTIONS); + onError(error, ERROR_CODE_FETCH_METADATA_SUGGESTIONS, { showNotification: true }); } if (isEmpty(answer)) { - throw new ElementsError('No suggestions found.', ERROR_CODE_EMPTY_METADATA_SUGGESTIONS); + const error = new Error('No suggestions found.'); + onError(error, ERROR_CODE_EMPTY_METADATA_SUGGESTIONS, { showNotification: true }); } return fields.map(field => { @@ -233,7 +225,7 @@ function useSidebarMetadataFetcher( }; }); }, - [api, file], + [api, file, onError], ); React.useEffect(() => {