import { Text, TextField } from "@fluentui/react"; import React, { FunctionComponent, useState } from "react"; import { Areas } from "../../../Common/Constants"; import { deleteCollection } from "../../../Common/dataAccess/deleteCollection"; import DeleteFeedback from "../../../Common/DeleteFeedback"; import { getErrorMessage, getErrorStack } from "../../../Common/ErrorHandlingUtils"; import { Collection } from "../../../Contracts/ViewModels"; import { useSidePanel } from "../../../hooks/useSidePanel"; import { DefaultExperienceUtility } from "../../../Shared/DefaultExperienceUtility"; import { Action, ActionModifiers } from "../../../Shared/Telemetry/TelemetryConstants"; import * as TelemetryProcessor from "../../../Shared/Telemetry/TelemetryProcessor"; import { userContext } from "../../../UserContext"; import { getCollectionName } from "../../../Utils/APITypeUtils"; import * as NotificationConsoleUtils from "../../../Utils/NotificationConsoleUtils"; import Explorer from "../../Explorer"; import { useDatabases } from "../../useDatabases"; import { useSelectedNode } from "../../useSelectedNode"; import { RightPaneForm, RightPaneFormProps } from "../RightPaneForm/RightPaneForm"; export interface DeleteCollectionConfirmationPaneProps { explorer: Explorer; } export const DeleteCollectionConfirmationPane: FunctionComponent = ({ explorer, }: DeleteCollectionConfirmationPaneProps) => { const closeSidePanel = useSidePanel((state) => state.closeSidePanel); const [deleteCollectionFeedback, setDeleteCollectionFeedback] = useState(""); const [inputCollectionName, setInputCollectionName] = useState(""); const [formError, setFormError] = useState(""); const [isExecuting, setIsExecuting] = useState(false); const shouldRecordFeedback = (): boolean => useDatabases.getState().isLastCollection() && !useSelectedNode.getState().findSelectedDatabase()?.isDatabaseShared(); const collectionName = getCollectionName().toLocaleLowerCase(); const paneTitle = "Delete " + collectionName; const onSubmit = async (): Promise => { const collection = useSelectedNode.getState().findSelectedCollection(); if (!collection || inputCollectionName !== collection.id()) { const errorMessage = "Input " + collectionName + " name does not match the selected " + collectionName; setFormError(errorMessage); NotificationConsoleUtils.logConsoleError( `Error while deleting ${collectionName} ${collection.id()}: ${errorMessage}` ); return; } const paneInfo = { collectionId: collection.id(), dataExplorerArea: Areas.ContextualPane, paneTitle, }; setFormError(""); setIsExecuting(true); const startKey: number = TelemetryProcessor.traceStart(Action.DeleteCollection, paneInfo); try { await deleteCollection(collection.databaseId, collection.id()); setIsExecuting(false); useSelectedNode.getState().setSelectedNode(collection.database); explorer.tabsManager?.closeTabsByComparator( (tab) => tab.node?.id() === collection.id() && (tab.node as Collection).databaseId === collection.databaseId ); explorer.refreshAllDatabases(); TelemetryProcessor.traceSuccess(Action.DeleteCollection, paneInfo, startKey); if (shouldRecordFeedback()) { const deleteFeedback = new DeleteFeedback( userContext.databaseAccount?.id, userContext.databaseAccount?.name, DefaultExperienceUtility.getApiKindFromDefaultExperience(userContext.apiType), deleteCollectionFeedback ); TelemetryProcessor.trace(Action.DeleteCollection, ActionModifiers.Mark, { message: JSON.stringify(deleteFeedback, Object.getOwnPropertyNames(deleteFeedback)), }); } closeSidePanel(); } catch (error) { const errorMessage = getErrorMessage(error); setFormError(errorMessage); setIsExecuting(false); TelemetryProcessor.traceFailure( Action.DeleteCollection, { ...paneInfo, error: errorMessage, errorStack: getErrorStack(error), }, startKey ); } }; const props: RightPaneFormProps = { formError: formError, isExecuting, submitButtonText: "OK", onSubmit, }; return (
* Confirm by typing the {collectionName.toLowerCase()} id { setInputCollectionName(newInput); }} />
{shouldRecordFeedback() && (
Help us improve Azure Cosmos DB! What is the reason why you are deleting this {collectionName}? { setDeleteCollectionFeedback(newInput); }} />
)}
); };