/********************************************************************************
* Copyright (c) 2020 TypeFox and others
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
********************************************************************************/
import { FunctionComponent, useContext, useEffect, useState } from 'react';
import { useNavigate, useParams } from 'react-router';
import { Button, Typography } from '@mui/material';
import { MainContext } from '../../context';
import { SearchListContainer } from './search-list-container';
import { StyledInput } from './namespace-input';
import { useAdminExtension, useDeleteExtension, usePurgeExtension } from './use-extension-admin';
import { ExtensionDetailView } from '../../components/extension/extension-detail-view';
import { AdminDashboardRoutes } from './admin-dashboard-routes';
import { createRoute } from '../../utils';
export const ExtensionAdmin: FunctionComponent = () => {
const { handleError } = useContext(MainContext);
const navigate = useNavigate();
const { namespace: nsParam, extension: extParam } = useParams<{ namespace?: string; extension?: string }>();
const [namespaceValue, setNamespaceValue] = useState(nsParam ?? '');
const [extensionValue, setExtensionValue] = useState(extParam ?? '');
useEffect(() => {
setNamespaceValue(nsParam ?? '');
setExtensionValue(extParam ?? '');
}, [nsParam, extParam]);
const [validationError, setValidationError] = useState('');
const [extensionFieldError, setExtensionFieldError] = useState(false);
const [namespaceFieldError, setNamespaceFieldError] = useState(false);
const target = nsParam && extParam ? { namespace: nsParam, extension: extParam } : null;
const { data, isFetching: loading, error: queryError, refetch } = useAdminExtension(target);
const { mutateAsync: deleteExtension } = useDeleteExtension();
const { mutateAsync: purgeExtension } = usePurgeExtension();
const is404 = !!queryError && (queryError as { status?: number }).status === 404;
const extension = queryError ? undefined : data;
const fetchError = is404 ? `Extension not found: ${target?.namespace}.${target?.extension}` : '';
const error = validationError || fetchError;
useEffect(() => {
if (queryError && !is404) {
handleError(queryError);
}
}, [queryError, is404, handleError]);
const findExtension = () => {
if (!namespaceValue) {
setNamespaceFieldError(true);
setValidationError('Name of Namespace is mandatory');
return;
}
setNamespaceFieldError(false);
if (!extensionValue) {
setExtensionFieldError(true);
setValidationError('Name of Extension is mandatory');
return;
}
setExtensionFieldError(false);
setValidationError('');
if (nsParam === namespaceValue && extParam === extensionValue) {
refetch();
} else {
navigate(createRoute([AdminDashboardRoutes.EXTENSION_ADMIN, namespaceValue, extensionValue]));
}
};
return (
,
,
,
error ? {error} : ''
]}
listContainer={
extension ? (
deleteExtension({
namespace: extension.namespace,
extension: extension.name,
targetPlatformVersions: targets
})
}
onPurgeVersion={targets =>
purgeExtension({
namespace: extension.namespace,
extension: extension.name,
targetPlatformVersions: targets
})
}
onVersionDeleted={refetch}
/>
) : (
''
)
}
loading={loading}
/>
);
};