import React, { useMemo, useRef, useState } from 'react'; import { useIntl } from 'react-intl'; import { SettingsPageTitle, LoadingIndicatorPage, useTracking, useNotification, useOverlayBlocker, CheckPagePermissions, useRBAC, } from '@strapi/helper-plugin'; import has from 'lodash/has'; import upperFirst from 'lodash/upperFirst'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { HeaderLayout, Layout, ContentLayout } from '@strapi/parts/Layout'; import { Main } from '@strapi/parts/Main'; import { Table, Thead, Tr, Th, Tbody, Td } from '@strapi/parts/Table'; import { Text, TableLabel } from '@strapi/parts/Text'; import { VisuallyHidden } from '@strapi/parts/VisuallyHidden'; import { IconButton } from '@strapi/parts/IconButton'; import EditIcon from '@strapi/icons/EditIcon'; import { useQuery } from 'react-query'; import forms from './utils/forms'; import { fetchData } from './utils/api'; import createProvidersArray from './utils/createProvidersArray'; import { getRequestURL, getTrad } from '../../utils'; import { useForm } from '../../hooks'; import pluginPermissions from '../../permissions'; import FormModal from '../../components/FormModal'; import { axiosInstance } from '../../../../../../core/admin/admin/src/core/utils'; export const ProvidersPage = () => { const { formatMessage } = useIntl(); const { trackUsage } = useTracking(); const trackUsageRef = useRef(trackUsage); const [isOpen, setIsOpen] = useState(false); const [isSubmiting, setIsSubmiting] = useState(false); const [providerToEditName, setProviderToEditName] = useState(null); const toggleNotification = useNotification(); const { lockApp, unlockApp } = useOverlayBlocker(); const updatePermissions = useMemo(() => { return { update: pluginPermissions.updateProviders }; }, []); const { // allowedActions: { canUpdate }, dispatchSubmitSucceeded, // isLoading, // isLoadingForPermissions, // modifiedData, } = useForm('providers', updatePermissions); const { isLoading: isLoadingForPermissions, allowedActions: { canUpdate }, } = useRBAC(updatePermissions); const { isLoading, data: modifiedData } = useQuery( 'get-providers', () => fetchData(toggleNotification), { initialData: {} } ); const providers = useMemo(() => createProvidersArray(modifiedData), [modifiedData]); const rowCount = providers.length; const isProviderWithSubdomain = useMemo(() => { if (!providerToEditName) { return false; } const providerToEdit = providers.find(obj => obj.name === providerToEditName); return has(providerToEdit, 'subdomain'); }, [providers, providerToEditName]); const pageTitle = formatMessage({ id: getTrad('HeaderNav.link.providers'), defaultMessage: 'Providers', }); const layoutToRender = useMemo(() => { if (providerToEditName === 'email') { return forms.email; } if (isProviderWithSubdomain) { return forms.providersWithSubdomain; } return forms.providers; }, [providerToEditName, isProviderWithSubdomain]); const handleToggleModal = () => { setIsOpen(prev => !prev); }; const handleClickEdit = provider => { if (canUpdate) { setProviderToEditName(provider.name); handleToggleModal(); } }; const handleSubmit = async values => { setIsSubmiting(true); lockApp(); try { trackUsageRef.current('willEditAuthenticationProvider'); const body = { ...modifiedData, [providerToEditName]: values }; const endPoint = getRequestURL('providers'); await axiosInstance.put(endPoint, { providers: body }); trackUsageRef.current('didEditAuthenticationProvider'); toggleNotification({ type: 'success', message: { id: getTrad('notification.success.submit') }, }); dispatchSubmitSucceeded(body); handleToggleModal(); } catch (err) { console.error(err); toggleNotification({ type: 'warning', message: { id: 'notification.error' }, }); } setIsSubmiting(false); unlockApp(); }; return (
{isLoading || isLoadingForPermissions ? ( ) : ( {providers.map(provider => ( ))}
{formatMessage({ id: getTrad('Providers.image'), defaultMessage: 'Image' })} {formatMessage({ id: getTrad('Providers.name'), defaultMessage: 'Name' })} {formatMessage({ id: getTrad('Providers.status'), defaultMessage: 'Status' })} {formatMessage({ id: getTrad('Providers.settings'), defaultMessage: 'Settings', })}
{provider.name} {provider.enabled ? formatMessage({ id: getTrad('Providers.enabled'), defaultMessage: 'Enabled', }) : formatMessage({ id: getTrad('Providers.disabled'), defaultMessage: 'Disabled', })} {canUpdate && ( handleClickEdit(provider)} noBorder icon={} label="Edit" /> )}
)}
); }; const ProtectedProvidersPage = () => ( ); export default ProtectedProvidersPage;