refactor: add useEnqueueSnackbar with data-test attr
This commit is contained in:
@@ -31,7 +31,7 @@
|
|||||||
"lodash": "^4.17.21",
|
"lodash": "^4.17.21",
|
||||||
"luxon": "^2.3.1",
|
"luxon": "^2.3.1",
|
||||||
"mui-color-input": "^2.0.0",
|
"mui-color-input": "^2.0.0",
|
||||||
"notistack": "^2.0.2",
|
"notistack": "^3.0.1",
|
||||||
"react": "^17.0.2",
|
"react": "^17.0.2",
|
||||||
"react-dom": "^17.0.2",
|
"react-dom": "^17.0.2",
|
||||||
"react-hook-form": "^7.45.2",
|
"react-hook-form": "^7.45.2",
|
||||||
|
@@ -1,16 +1,16 @@
|
|||||||
import * as React from 'react';
|
|
||||||
import { ApolloProvider as BaseApolloProvider } from '@apollo/client';
|
import { ApolloProvider as BaseApolloProvider } from '@apollo/client';
|
||||||
import { useSnackbar } from 'notistack';
|
import * as React from 'react';
|
||||||
|
|
||||||
import { mutateAndGetClient } from 'graphql/client';
|
import { mutateAndGetClient } from 'graphql/client';
|
||||||
import useAuthentication from 'hooks/useAuthentication';
|
import useAuthentication from 'hooks/useAuthentication';
|
||||||
|
import useEnqueueSnackbar from 'hooks/useEnqueueSnackbar';
|
||||||
|
|
||||||
type ApolloProviderProps = {
|
type ApolloProviderProps = {
|
||||||
children: React.ReactNode;
|
children: React.ReactNode;
|
||||||
};
|
};
|
||||||
|
|
||||||
const ApolloProvider = (props: ApolloProviderProps): React.ReactElement => {
|
const ApolloProvider = (props: ApolloProviderProps): React.ReactElement => {
|
||||||
const { enqueueSnackbar } = useSnackbar();
|
const enqueueSnackbar = useEnqueueSnackbar();
|
||||||
const authentication = useAuthentication();
|
const authentication = useAuthentication();
|
||||||
|
|
||||||
const onError = React.useCallback(
|
const onError = React.useCallback(
|
||||||
|
@@ -1,20 +1,20 @@
|
|||||||
import * as React from 'react';
|
|
||||||
import { useLazyQuery, useMutation } from '@apollo/client';
|
import { useLazyQuery, useMutation } from '@apollo/client';
|
||||||
import Card from '@mui/material/Card';
|
|
||||||
import Box from '@mui/material/Box';
|
|
||||||
import Stack from '@mui/material/Stack';
|
|
||||||
import CircularProgress from '@mui/material/CircularProgress';
|
|
||||||
import CardActionArea from '@mui/material/CardActionArea';
|
|
||||||
import MoreHorizIcon from '@mui/icons-material/MoreHoriz';
|
|
||||||
import CheckCircleIcon from '@mui/icons-material/CheckCircle';
|
import CheckCircleIcon from '@mui/icons-material/CheckCircle';
|
||||||
import ErrorIcon from '@mui/icons-material/Error';
|
import ErrorIcon from '@mui/icons-material/Error';
|
||||||
import { useSnackbar } from 'notistack';
|
import MoreHorizIcon from '@mui/icons-material/MoreHoriz';
|
||||||
|
import Box from '@mui/material/Box';
|
||||||
|
import Card from '@mui/material/Card';
|
||||||
|
import CardActionArea from '@mui/material/CardActionArea';
|
||||||
|
import CircularProgress from '@mui/material/CircularProgress';
|
||||||
|
import Stack from '@mui/material/Stack';
|
||||||
|
import useEnqueueSnackbar from 'hooks/useEnqueueSnackbar';
|
||||||
import { DateTime } from 'luxon';
|
import { DateTime } from 'luxon';
|
||||||
|
import * as React from 'react';
|
||||||
|
|
||||||
import type { IConnection } from '@automatisch/types';
|
import type { IConnection } from '@automatisch/types';
|
||||||
|
import ConnectionContextMenu from 'components/AppConnectionContextMenu';
|
||||||
import { DELETE_CONNECTION } from 'graphql/mutations/delete-connection';
|
import { DELETE_CONNECTION } from 'graphql/mutations/delete-connection';
|
||||||
import { TEST_CONNECTION } from 'graphql/queries/test-connection';
|
import { TEST_CONNECTION } from 'graphql/queries/test-connection';
|
||||||
import ConnectionContextMenu from 'components/AppConnectionContextMenu';
|
|
||||||
import useFormatMessage from 'hooks/useFormatMessage';
|
import useFormatMessage from 'hooks/useFormatMessage';
|
||||||
import { CardContent, Typography } from './style';
|
import { CardContent, Typography } from './style';
|
||||||
|
|
||||||
@@ -30,7 +30,7 @@ const countTranslation = (value: React.ReactNode) => (
|
|||||||
);
|
);
|
||||||
|
|
||||||
function AppConnectionRow(props: AppConnectionRowProps): React.ReactElement {
|
function AppConnectionRow(props: AppConnectionRowProps): React.ReactElement {
|
||||||
const { enqueueSnackbar } = useSnackbar();
|
const enqueueSnackbar = useEnqueueSnackbar();
|
||||||
const [verificationVisible, setVerificationVisible] = React.useState(false);
|
const [verificationVisible, setVerificationVisible] = React.useState(false);
|
||||||
const [testConnection, { called: testCalled, loading: testLoading }] =
|
const [testConnection, { called: testCalled, loading: testLoading }] =
|
||||||
useLazyQuery(TEST_CONNECTION, {
|
useLazyQuery(TEST_CONNECTION, {
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
import * as React from 'react';
|
|
||||||
import { useMutation } from '@apollo/client';
|
import { useMutation } from '@apollo/client';
|
||||||
import IconButton from '@mui/material/IconButton';
|
|
||||||
import DeleteIcon from '@mui/icons-material/Delete';
|
import DeleteIcon from '@mui/icons-material/Delete';
|
||||||
import { useSnackbar } from 'notistack';
|
import IconButton from '@mui/material/IconButton';
|
||||||
|
import useEnqueueSnackbar from 'hooks/useEnqueueSnackbar';
|
||||||
|
import * as React from 'react';
|
||||||
|
|
||||||
import Can from 'components/Can';
|
import Can from 'components/Can';
|
||||||
import ConfirmationDialog from 'components/ConfirmationDialog';
|
import ConfirmationDialog from 'components/ConfirmationDialog';
|
||||||
@@ -22,7 +22,7 @@ export default function DeleteRoleButton(props: DeleteRoleButtonProps) {
|
|||||||
refetchQueries: ['GetRoles'],
|
refetchQueries: ['GetRoles'],
|
||||||
});
|
});
|
||||||
const formatMessage = useFormatMessage();
|
const formatMessage = useFormatMessage();
|
||||||
const { enqueueSnackbar } = useSnackbar();
|
const enqueueSnackbar = useEnqueueSnackbar();
|
||||||
|
|
||||||
const handleConfirm = React.useCallback(async () => {
|
const handleConfirm = React.useCallback(async () => {
|
||||||
try {
|
try {
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
import * as React from 'react';
|
|
||||||
import { useMutation } from '@apollo/client';
|
import { useMutation } from '@apollo/client';
|
||||||
import IconButton from '@mui/material/IconButton';
|
|
||||||
import DeleteIcon from '@mui/icons-material/Delete';
|
import DeleteIcon from '@mui/icons-material/Delete';
|
||||||
import { useSnackbar } from 'notistack';
|
import IconButton from '@mui/material/IconButton';
|
||||||
|
import useEnqueueSnackbar from 'hooks/useEnqueueSnackbar';
|
||||||
|
import * as React from 'react';
|
||||||
|
|
||||||
import ConfirmationDialog from 'components/ConfirmationDialog';
|
import ConfirmationDialog from 'components/ConfirmationDialog';
|
||||||
import { DELETE_USER } from 'graphql/mutations/delete-user.ee';
|
import { DELETE_USER } from 'graphql/mutations/delete-user.ee';
|
||||||
@@ -20,7 +20,7 @@ export default function DeleteUserButton(props: DeleteUserButtonProps) {
|
|||||||
refetchQueries: ['GetUsers'],
|
refetchQueries: ['GetUsers'],
|
||||||
});
|
});
|
||||||
const formatMessage = useFormatMessage();
|
const formatMessage = useFormatMessage();
|
||||||
const { enqueueSnackbar } = useSnackbar();
|
const enqueueSnackbar = useEnqueueSnackbar();
|
||||||
|
|
||||||
const handleConfirm = React.useCallback(async () => {
|
const handleConfirm = React.useCallback(async () => {
|
||||||
try {
|
try {
|
||||||
|
@@ -1,15 +1,15 @@
|
|||||||
import * as React from 'react';
|
|
||||||
import { useMutation } from '@apollo/client';
|
import { useMutation } from '@apollo/client';
|
||||||
import { Link } from 'react-router-dom';
|
|
||||||
import Menu from '@mui/material/Menu';
|
import Menu from '@mui/material/Menu';
|
||||||
import type { PopoverProps } from '@mui/material/Popover';
|
|
||||||
import MenuItem from '@mui/material/MenuItem';
|
import MenuItem from '@mui/material/MenuItem';
|
||||||
import { useSnackbar } from 'notistack';
|
import type { PopoverProps } from '@mui/material/Popover';
|
||||||
|
import useEnqueueSnackbar from 'hooks/useEnqueueSnackbar';
|
||||||
|
import * as React from 'react';
|
||||||
|
import { Link } from 'react-router-dom';
|
||||||
|
|
||||||
import Can from 'components/Can';
|
import Can from 'components/Can';
|
||||||
|
import * as URLS from 'config/urls';
|
||||||
import { DELETE_FLOW } from 'graphql/mutations/delete-flow';
|
import { DELETE_FLOW } from 'graphql/mutations/delete-flow';
|
||||||
import { DUPLICATE_FLOW } from 'graphql/mutations/duplicate-flow';
|
import { DUPLICATE_FLOW } from 'graphql/mutations/duplicate-flow';
|
||||||
import * as URLS from 'config/urls';
|
|
||||||
import useFormatMessage from 'hooks/useFormatMessage';
|
import useFormatMessage from 'hooks/useFormatMessage';
|
||||||
|
|
||||||
type ContextMenuProps = {
|
type ContextMenuProps = {
|
||||||
@@ -22,14 +22,11 @@ export default function ContextMenu(
|
|||||||
props: ContextMenuProps
|
props: ContextMenuProps
|
||||||
): React.ReactElement {
|
): React.ReactElement {
|
||||||
const { flowId, onClose, anchorEl } = props;
|
const { flowId, onClose, anchorEl } = props;
|
||||||
const { enqueueSnackbar } = useSnackbar();
|
const enqueueSnackbar = useEnqueueSnackbar();
|
||||||
const [deleteFlow] = useMutation(DELETE_FLOW);
|
const [deleteFlow] = useMutation(DELETE_FLOW);
|
||||||
const [duplicateFlow] = useMutation(
|
const [duplicateFlow] = useMutation(DUPLICATE_FLOW, {
|
||||||
DUPLICATE_FLOW,
|
refetchQueries: ['GetFlows'],
|
||||||
{
|
});
|
||||||
refetchQueries: ['GetFlows'],
|
|
||||||
}
|
|
||||||
);
|
|
||||||
const formatMessage = useFormatMessage();
|
const formatMessage = useFormatMessage();
|
||||||
|
|
||||||
const onFlowDuplicate = React.useCallback(async () => {
|
const onFlowDuplicate = React.useCallback(async () => {
|
||||||
@@ -75,11 +72,7 @@ export default function ContextMenu(
|
|||||||
>
|
>
|
||||||
<Can I="read" a="Flow" passThrough>
|
<Can I="read" a="Flow" passThrough>
|
||||||
{(allowed) => (
|
{(allowed) => (
|
||||||
<MenuItem
|
<MenuItem disabled={!allowed} component={Link} to={URLS.FLOW(flowId)}>
|
||||||
disabled={!allowed}
|
|
||||||
component={Link}
|
|
||||||
to={URLS.FLOW(flowId)}
|
|
||||||
>
|
|
||||||
{formatMessage('flow.view')}
|
{formatMessage('flow.view')}
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
)}
|
)}
|
||||||
@@ -87,10 +80,7 @@ export default function ContextMenu(
|
|||||||
|
|
||||||
<Can I="create" a="Flow" passThrough>
|
<Can I="create" a="Flow" passThrough>
|
||||||
{(allowed) => (
|
{(allowed) => (
|
||||||
<MenuItem
|
<MenuItem disabled={!allowed} onClick={onFlowDuplicate}>
|
||||||
disabled={!allowed}
|
|
||||||
onClick={onFlowDuplicate}
|
|
||||||
>
|
|
||||||
{formatMessage('flow.duplicate')}
|
{formatMessage('flow.duplicate')}
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
)}
|
)}
|
||||||
@@ -98,10 +88,7 @@ export default function ContextMenu(
|
|||||||
|
|
||||||
<Can I="delete" a="Flow" passThrough>
|
<Can I="delete" a="Flow" passThrough>
|
||||||
{(allowed) => (
|
{(allowed) => (
|
||||||
<MenuItem
|
<MenuItem disabled={!allowed} onClick={onFlowDelete}>
|
||||||
disabled={!allowed}
|
|
||||||
onClick={onFlowDelete}
|
|
||||||
>
|
|
||||||
{formatMessage('flow.delete')}
|
{formatMessage('flow.delete')}
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
)}
|
)}
|
||||||
|
@@ -1,18 +1,18 @@
|
|||||||
import * as React from 'react';
|
|
||||||
import { useSearchParams, useNavigate } from 'react-router-dom';
|
|
||||||
import { useMutation } from '@apollo/client';
|
import { useMutation } from '@apollo/client';
|
||||||
|
import { yupResolver } from '@hookform/resolvers/yup';
|
||||||
|
import LoadingButton from '@mui/lab/LoadingButton';
|
||||||
import Paper from '@mui/material/Paper';
|
import Paper from '@mui/material/Paper';
|
||||||
import Typography from '@mui/material/Typography';
|
import Typography from '@mui/material/Typography';
|
||||||
import LoadingButton from '@mui/lab/LoadingButton';
|
import useEnqueueSnackbar from 'hooks/useEnqueueSnackbar';
|
||||||
import { useSnackbar } from 'notistack';
|
import * as React from 'react';
|
||||||
|
import { useNavigate, useSearchParams } from 'react-router-dom';
|
||||||
import * as yup from 'yup';
|
import * as yup from 'yup';
|
||||||
import { yupResolver } from '@hookform/resolvers/yup';
|
|
||||||
|
|
||||||
import * as URLS from 'config/urls';
|
|
||||||
import Form from 'components/Form';
|
import Form from 'components/Form';
|
||||||
import TextField from 'components/TextField';
|
import TextField from 'components/TextField';
|
||||||
import useFormatMessage from 'hooks/useFormatMessage';
|
import * as URLS from 'config/urls';
|
||||||
import { RESET_PASSWORD } from 'graphql/mutations/reset-password.ee';
|
import { RESET_PASSWORD } from 'graphql/mutations/reset-password.ee';
|
||||||
|
import useFormatMessage from 'hooks/useFormatMessage';
|
||||||
|
|
||||||
const validationSchema = yup.object().shape({
|
const validationSchema = yup.object().shape({
|
||||||
password: yup.string().required('resetPasswordForm.mandatoryInput'),
|
password: yup.string().required('resetPasswordForm.mandatoryInput'),
|
||||||
@@ -23,7 +23,7 @@ const validationSchema = yup.object().shape({
|
|||||||
});
|
});
|
||||||
|
|
||||||
export default function ResetPasswordForm() {
|
export default function ResetPasswordForm() {
|
||||||
const { enqueueSnackbar } = useSnackbar();
|
const enqueueSnackbar = useEnqueueSnackbar();
|
||||||
const formatMessage = useFormatMessage();
|
const formatMessage = useFormatMessage();
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
const [searchParams] = useSearchParams();
|
const [searchParams] = useSearchParams();
|
||||||
@@ -41,7 +41,9 @@ export default function ResetPasswordForm() {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
enqueueSnackbar(formatMessage('resetPasswordForm.passwordUpdated'), { variant: 'success' });
|
enqueueSnackbar(formatMessage('resetPasswordForm.passwordUpdated'), {
|
||||||
|
variant: 'success',
|
||||||
|
});
|
||||||
|
|
||||||
navigate(URLS.LOGIN);
|
navigate(URLS.LOGIN);
|
||||||
};
|
};
|
||||||
@@ -78,14 +80,18 @@ export default function ResetPasswordForm() {
|
|||||||
helperText={
|
helperText={
|
||||||
touchedFields.password && errors?.password?.message
|
touchedFields.password && errors?.password?.message
|
||||||
? formatMessage(errors?.password?.message as string, {
|
? formatMessage(errors?.password?.message as string, {
|
||||||
inputName: formatMessage('resetPasswordForm.passwordFieldLabel'),
|
inputName: formatMessage(
|
||||||
|
'resetPasswordForm.passwordFieldLabel'
|
||||||
|
),
|
||||||
})
|
})
|
||||||
: ''
|
: ''
|
||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<TextField
|
<TextField
|
||||||
label={formatMessage('resetPasswordForm.confirmPasswordFieldLabel')}
|
label={formatMessage(
|
||||||
|
'resetPasswordForm.confirmPasswordFieldLabel'
|
||||||
|
)}
|
||||||
name="confirmPassword"
|
name="confirmPassword"
|
||||||
fullWidth
|
fullWidth
|
||||||
margin="dense"
|
margin="dense"
|
||||||
|
18
packages/web/src/hooks/useEnqueueSnackbar.ts
Normal file
18
packages/web/src/hooks/useEnqueueSnackbar.ts
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
import type {
|
||||||
|
OptionsWithExtraProps,
|
||||||
|
SnackbarMessage,
|
||||||
|
VariantType
|
||||||
|
} from 'notistack';
|
||||||
|
import { useSnackbar } from 'notistack';
|
||||||
|
|
||||||
|
type ExtendedOptionsWithExtraProps<V extends VariantType> = OptionsWithExtraProps<V> & {
|
||||||
|
SnackbarProps?: OptionsWithExtraProps<V> & { 'data-test'?: string; }
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function useEnqueueSnackbar() {
|
||||||
|
const { enqueueSnackbar } = useSnackbar();
|
||||||
|
|
||||||
|
return function wrappedEnqueueSnackbar<V extends VariantType>(message: SnackbarMessage, options: ExtendedOptionsWithExtraProps<V>) {
|
||||||
|
return enqueueSnackbar(message, options);
|
||||||
|
};
|
||||||
|
}
|
@@ -1,16 +1,16 @@
|
|||||||
import { useMemo } from 'react';
|
import { useMutation } from '@apollo/client';
|
||||||
import Stack from '@mui/material/Stack';
|
|
||||||
import { TSamlAuthProvider, TSamlAuthProviderRole } from '@automatisch/types';
|
import { TSamlAuthProvider, TSamlAuthProviderRole } from '@automatisch/types';
|
||||||
import Typography from '@mui/material/Typography';
|
|
||||||
import LoadingButton from '@mui/lab/LoadingButton';
|
import LoadingButton from '@mui/lab/LoadingButton';
|
||||||
import Divider from '@mui/material/Divider';
|
import Divider from '@mui/material/Divider';
|
||||||
import { useMutation } from '@apollo/client';
|
import Stack from '@mui/material/Stack';
|
||||||
import { useSnackbar } from 'notistack';
|
import Typography from '@mui/material/Typography';
|
||||||
|
import useEnqueueSnackbar from 'hooks/useEnqueueSnackbar';
|
||||||
|
import { useMemo } from 'react';
|
||||||
|
|
||||||
|
import Form from 'components/Form';
|
||||||
import { UPSERT_SAML_AUTH_PROVIDERS_ROLE_MAPPINGS } from 'graphql/mutations/upsert-saml-auth-providers-role-mappings';
|
import { UPSERT_SAML_AUTH_PROVIDERS_ROLE_MAPPINGS } from 'graphql/mutations/upsert-saml-auth-providers-role-mappings';
|
||||||
import useFormatMessage from 'hooks/useFormatMessage';
|
import useFormatMessage from 'hooks/useFormatMessage';
|
||||||
import useSamlAuthProviderRoleMappings from 'hooks/useSamlAuthProviderRoleMappings';
|
import useSamlAuthProviderRoleMappings from 'hooks/useSamlAuthProviderRoleMappings';
|
||||||
import Form from 'components/Form';
|
|
||||||
|
|
||||||
import RoleMappingsFieldArray from './RoleMappingsFieldsArray';
|
import RoleMappingsFieldArray from './RoleMappingsFieldsArray';
|
||||||
|
|
||||||
@@ -32,7 +32,7 @@ function generateFormRoleMappings(roleMappings: TSamlAuthProviderRole[]) {
|
|||||||
|
|
||||||
function RoleMappings({ provider, providerLoading }: RoleMappingsProps) {
|
function RoleMappings({ provider, providerLoading }: RoleMappingsProps) {
|
||||||
const formatMessage = useFormatMessage();
|
const formatMessage = useFormatMessage();
|
||||||
const { enqueueSnackbar } = useSnackbar();
|
const enqueueSnackbar = useEnqueueSnackbar();
|
||||||
const { roleMappings, loading: roleMappingsLoading } =
|
const { roleMappings, loading: roleMappingsLoading } =
|
||||||
useSamlAuthProviderRoleMappings(provider?.id);
|
useSamlAuthProviderRoleMappings(provider?.id);
|
||||||
const [
|
const [
|
||||||
|
@@ -1,16 +1,15 @@
|
|||||||
import * as React from 'react';
|
import { QueryResult, useMutation } from '@apollo/client';
|
||||||
|
import { IRole, TSamlAuthProvider } from '@automatisch/types';
|
||||||
|
import LoadingButton from '@mui/lab/LoadingButton';
|
||||||
import Stack from '@mui/material/Stack';
|
import Stack from '@mui/material/Stack';
|
||||||
import MuiTextField from '@mui/material/TextField';
|
import MuiTextField from '@mui/material/TextField';
|
||||||
import LoadingButton from '@mui/lab/LoadingButton';
|
import useEnqueueSnackbar from 'hooks/useEnqueueSnackbar';
|
||||||
import { IRole } from '@automatisch/types';
|
import * as React from 'react';
|
||||||
import { useSnackbar } from 'notistack';
|
|
||||||
import { TSamlAuthProvider } from '@automatisch/types';
|
|
||||||
import { QueryResult, useMutation } from '@apollo/client';
|
|
||||||
|
|
||||||
import Form from 'components/Form';
|
|
||||||
import TextField from 'components/TextField';
|
|
||||||
import ControlledAutocomplete from 'components/ControlledAutocomplete';
|
import ControlledAutocomplete from 'components/ControlledAutocomplete';
|
||||||
|
import Form from 'components/Form';
|
||||||
import Switch from 'components/Switch';
|
import Switch from 'components/Switch';
|
||||||
|
import TextField from 'components/TextField';
|
||||||
|
|
||||||
import { UPSERT_SAML_AUTH_PROVIDER } from 'graphql/mutations/upsert-saml-auth-provider';
|
import { UPSERT_SAML_AUTH_PROVIDER } from 'graphql/mutations/upsert-saml-auth-provider';
|
||||||
import useFormatMessage from 'hooks/useFormatMessage';
|
import useFormatMessage from 'hooks/useFormatMessage';
|
||||||
@@ -47,7 +46,7 @@ function SamlConfiguration({
|
|||||||
}: SamlConfigurationProps) {
|
}: SamlConfigurationProps) {
|
||||||
const formatMessage = useFormatMessage();
|
const formatMessage = useFormatMessage();
|
||||||
const { roles, loading: rolesLoading } = useRoles();
|
const { roles, loading: rolesLoading } = useRoles();
|
||||||
const { enqueueSnackbar } = useSnackbar();
|
const enqueueSnackbar = useEnqueueSnackbar();
|
||||||
const [upsertSamlAuthProvider, { loading }] = useMutation(
|
const [upsertSamlAuthProvider, { loading }] = useMutation(
|
||||||
UPSERT_SAML_AUTH_PROVIDER
|
UPSERT_SAML_AUTH_PROVIDER
|
||||||
);
|
);
|
||||||
|
@@ -2,14 +2,14 @@ import { useMutation } from '@apollo/client';
|
|||||||
import LoadingButton from '@mui/lab/LoadingButton';
|
import LoadingButton from '@mui/lab/LoadingButton';
|
||||||
import Grid from '@mui/material/Grid';
|
import Grid from '@mui/material/Grid';
|
||||||
import Stack from '@mui/material/Stack';
|
import Stack from '@mui/material/Stack';
|
||||||
|
import PermissionCatalogField from 'components/PermissionCatalogField/index.ee';
|
||||||
|
import useEnqueueSnackbar from 'hooks/useEnqueueSnackbar';
|
||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
import { useNavigate } from 'react-router-dom';
|
import { useNavigate } from 'react-router-dom';
|
||||||
import PermissionCatalogField from 'components/PermissionCatalogField/index.ee';
|
|
||||||
import { useSnackbar } from 'notistack';
|
|
||||||
|
|
||||||
|
import Container from 'components/Container';
|
||||||
import Form from 'components/Form';
|
import Form from 'components/Form';
|
||||||
import PageTitle from 'components/PageTitle';
|
import PageTitle from 'components/PageTitle';
|
||||||
import Container from 'components/Container';
|
|
||||||
import TextField from 'components/TextField';
|
import TextField from 'components/TextField';
|
||||||
import * as URLS from 'config/urls';
|
import * as URLS from 'config/urls';
|
||||||
import { CREATE_ROLE } from 'graphql/mutations/create-role.ee';
|
import { CREATE_ROLE } from 'graphql/mutations/create-role.ee';
|
||||||
@@ -23,7 +23,7 @@ export default function CreateRole(): React.ReactElement {
|
|||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
const formatMessage = useFormatMessage();
|
const formatMessage = useFormatMessage();
|
||||||
const [createRole, { loading }] = useMutation(CREATE_ROLE);
|
const [createRole, { loading }] = useMutation(CREATE_ROLE);
|
||||||
const { enqueueSnackbar } = useSnackbar();
|
const enqueueSnackbar = useEnqueueSnackbar();
|
||||||
|
|
||||||
const handleRoleCreation = async (
|
const handleRoleCreation = async (
|
||||||
roleData: Partial<RoleWithComputedPermissions>
|
roleData: Partial<RoleWithComputedPermissions>
|
||||||
|
@@ -1,23 +1,23 @@
|
|||||||
import * as React from 'react';
|
|
||||||
import { useNavigate } from 'react-router-dom';
|
|
||||||
import { useMutation } from '@apollo/client';
|
import { useMutation } from '@apollo/client';
|
||||||
|
import { IRole, IUser } from '@automatisch/types';
|
||||||
|
import LoadingButton from '@mui/lab/LoadingButton';
|
||||||
import Grid from '@mui/material/Grid';
|
import Grid from '@mui/material/Grid';
|
||||||
import Stack from '@mui/material/Stack';
|
import Stack from '@mui/material/Stack';
|
||||||
import MuiTextField from '@mui/material/TextField';
|
import MuiTextField from '@mui/material/TextField';
|
||||||
import LoadingButton from '@mui/lab/LoadingButton';
|
import useEnqueueSnackbar from 'hooks/useEnqueueSnackbar';
|
||||||
import { IUser, IRole } from '@automatisch/types';
|
import * as React from 'react';
|
||||||
import { useSnackbar } from 'notistack';
|
import { useNavigate } from 'react-router-dom';
|
||||||
|
|
||||||
import { CREATE_USER } from 'graphql/mutations/create-user.ee';
|
|
||||||
import * as URLS from 'config/urls';
|
|
||||||
import Can from 'components/Can';
|
import Can from 'components/Can';
|
||||||
import useRoles from 'hooks/useRoles.ee';
|
|
||||||
import PageTitle from 'components/PageTitle';
|
|
||||||
import Container from 'components/Container';
|
import Container from 'components/Container';
|
||||||
import Form from 'components/Form';
|
|
||||||
import ControlledAutocomplete from 'components/ControlledAutocomplete';
|
import ControlledAutocomplete from 'components/ControlledAutocomplete';
|
||||||
|
import Form from 'components/Form';
|
||||||
|
import PageTitle from 'components/PageTitle';
|
||||||
import TextField from 'components/TextField';
|
import TextField from 'components/TextField';
|
||||||
|
import * as URLS from 'config/urls';
|
||||||
|
import { CREATE_USER } from 'graphql/mutations/create-user.ee';
|
||||||
import useFormatMessage from 'hooks/useFormatMessage';
|
import useFormatMessage from 'hooks/useFormatMessage';
|
||||||
|
import useRoles from 'hooks/useRoles.ee';
|
||||||
|
|
||||||
function generateRoleOptions(roles: IRole[]) {
|
function generateRoleOptions(roles: IRole[]) {
|
||||||
return roles?.map(({ name: label, id: value }) => ({ label, value }));
|
return roles?.map(({ name: label, id: value }) => ({ label, value }));
|
||||||
@@ -28,7 +28,7 @@ export default function CreateUser(): React.ReactElement {
|
|||||||
const formatMessage = useFormatMessage();
|
const formatMessage = useFormatMessage();
|
||||||
const [createUser, { loading }] = useMutation(CREATE_USER);
|
const [createUser, { loading }] = useMutation(CREATE_USER);
|
||||||
const { roles, loading: rolesLoading } = useRoles();
|
const { roles, loading: rolesLoading } = useRoles();
|
||||||
const { enqueueSnackbar } = useSnackbar();
|
const enqueueSnackbar = useEnqueueSnackbar();
|
||||||
|
|
||||||
const handleUserCreation = async (userData: Partial<IUser>) => {
|
const handleUserCreation = async (userData: Partial<IUser>) => {
|
||||||
try {
|
try {
|
||||||
|
@@ -1,15 +1,15 @@
|
|||||||
import { useMutation } from '@apollo/client';
|
import { useMutation } from '@apollo/client';
|
||||||
import LoadingButton from '@mui/lab/LoadingButton';
|
import LoadingButton from '@mui/lab/LoadingButton';
|
||||||
import Grid from '@mui/material/Grid';
|
import Grid from '@mui/material/Grid';
|
||||||
import Stack from '@mui/material/Stack';
|
|
||||||
import Skeleton from '@mui/material/Skeleton';
|
import Skeleton from '@mui/material/Skeleton';
|
||||||
|
import Stack from '@mui/material/Stack';
|
||||||
|
import useEnqueueSnackbar from 'hooks/useEnqueueSnackbar';
|
||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
import { useNavigate, useParams } from 'react-router-dom';
|
import { useNavigate, useParams } from 'react-router-dom';
|
||||||
import { useSnackbar } from 'notistack';
|
|
||||||
|
|
||||||
|
import Container from 'components/Container';
|
||||||
import Form from 'components/Form';
|
import Form from 'components/Form';
|
||||||
import PageTitle from 'components/PageTitle';
|
import PageTitle from 'components/PageTitle';
|
||||||
import Container from 'components/Container';
|
|
||||||
import PermissionCatalogField from 'components/PermissionCatalogField/index.ee';
|
import PermissionCatalogField from 'components/PermissionCatalogField/index.ee';
|
||||||
import TextField from 'components/TextField';
|
import TextField from 'components/TextField';
|
||||||
import * as URLS from 'config/urls';
|
import * as URLS from 'config/urls';
|
||||||
@@ -32,7 +32,7 @@ export default function EditRole(): React.ReactElement {
|
|||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
const { roleId } = useParams<EditRoleParams>();
|
const { roleId } = useParams<EditRoleParams>();
|
||||||
const { role, loading: roleLoading } = useRole(roleId);
|
const { role, loading: roleLoading } = useRole(roleId);
|
||||||
const { enqueueSnackbar } = useSnackbar();
|
const enqueueSnackbar = useEnqueueSnackbar();
|
||||||
|
|
||||||
const handleRoleUpdate = async (
|
const handleRoleUpdate = async (
|
||||||
roleData: Partial<RoleWithComputedPermissions>
|
roleData: Partial<RoleWithComputedPermissions>
|
||||||
|
@@ -1,25 +1,25 @@
|
|||||||
import * as React from 'react';
|
|
||||||
import { useParams, useNavigate } from 'react-router-dom';
|
|
||||||
import { useMutation } from '@apollo/client';
|
import { useMutation } from '@apollo/client';
|
||||||
|
import { IRole, IUser } from '@automatisch/types';
|
||||||
|
import LoadingButton from '@mui/lab/LoadingButton';
|
||||||
import Grid from '@mui/material/Grid';
|
import Grid from '@mui/material/Grid';
|
||||||
|
import Skeleton from '@mui/material/Skeleton';
|
||||||
import Stack from '@mui/material/Stack';
|
import Stack from '@mui/material/Stack';
|
||||||
import MuiTextField from '@mui/material/TextField';
|
import MuiTextField from '@mui/material/TextField';
|
||||||
import Skeleton from '@mui/material/Skeleton';
|
import useEnqueueSnackbar from 'hooks/useEnqueueSnackbar';
|
||||||
import LoadingButton from '@mui/lab/LoadingButton';
|
import * as React from 'react';
|
||||||
import { IUser, IRole } from '@automatisch/types';
|
import { useNavigate, useParams } from 'react-router-dom';
|
||||||
import { useSnackbar } from 'notistack';
|
|
||||||
|
|
||||||
import { UPDATE_USER } from 'graphql/mutations/update-user.ee';
|
|
||||||
import Can from 'components/Can';
|
import Can from 'components/Can';
|
||||||
import * as URLS from 'config/urls';
|
|
||||||
import useUser from 'hooks/useUser';
|
|
||||||
import useRoles from 'hooks/useRoles.ee';
|
|
||||||
import PageTitle from 'components/PageTitle';
|
|
||||||
import Container from 'components/Container';
|
import Container from 'components/Container';
|
||||||
import Form from 'components/Form';
|
|
||||||
import ControlledAutocomplete from 'components/ControlledAutocomplete';
|
import ControlledAutocomplete from 'components/ControlledAutocomplete';
|
||||||
|
import Form from 'components/Form';
|
||||||
|
import PageTitle from 'components/PageTitle';
|
||||||
import TextField from 'components/TextField';
|
import TextField from 'components/TextField';
|
||||||
|
import * as URLS from 'config/urls';
|
||||||
|
import { UPDATE_USER } from 'graphql/mutations/update-user.ee';
|
||||||
import useFormatMessage from 'hooks/useFormatMessage';
|
import useFormatMessage from 'hooks/useFormatMessage';
|
||||||
|
import useRoles from 'hooks/useRoles.ee';
|
||||||
|
import useUser from 'hooks/useUser';
|
||||||
|
|
||||||
type EditUserParams = {
|
type EditUserParams = {
|
||||||
userId: string;
|
userId: string;
|
||||||
@@ -35,7 +35,7 @@ export default function EditUser(): React.ReactElement {
|
|||||||
const { userId } = useParams<EditUserParams>();
|
const { userId } = useParams<EditUserParams>();
|
||||||
const { user, loading: userLoading } = useUser(userId);
|
const { user, loading: userLoading } = useUser(userId);
|
||||||
const { roles, loading: rolesLoading } = useRoles();
|
const { roles, loading: rolesLoading } = useRoles();
|
||||||
const { enqueueSnackbar } = useSnackbar();
|
const enqueueSnackbar = useEnqueueSnackbar();
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
|
|
||||||
const handleUserUpdate = async (userDataToUpdate: Partial<IUser>) => {
|
const handleUserUpdate = async (userDataToUpdate: Partial<IUser>) => {
|
||||||
|
@@ -1,29 +1,29 @@
|
|||||||
import * as React from 'react';
|
|
||||||
import { useMutation } from '@apollo/client';
|
import { useMutation } from '@apollo/client';
|
||||||
|
import { yupResolver } from '@hookform/resolvers/yup';
|
||||||
import Alert from '@mui/material/Alert';
|
import Alert from '@mui/material/Alert';
|
||||||
import AlertTitle from '@mui/material/AlertTitle';
|
import AlertTitle from '@mui/material/AlertTitle';
|
||||||
|
import Button from '@mui/material/Button';
|
||||||
|
import Grid from '@mui/material/Grid';
|
||||||
import Typography from '@mui/material/Typography';
|
import Typography from '@mui/material/Typography';
|
||||||
import { styled } from '@mui/material/styles';
|
import { styled } from '@mui/material/styles';
|
||||||
import Grid from '@mui/material/Grid';
|
import useEnqueueSnackbar from 'hooks/useEnqueueSnackbar';
|
||||||
import Button from '@mui/material/Button';
|
import * as React from 'react';
|
||||||
import { useSnackbar } from 'notistack';
|
|
||||||
import { yupResolver } from '@hookform/resolvers/yup';
|
|
||||||
import * as yup from 'yup';
|
import * as yup from 'yup';
|
||||||
|
|
||||||
import PageTitle from 'components/PageTitle';
|
|
||||||
import Container from 'components/Container';
|
import Container from 'components/Container';
|
||||||
import Form from 'components/Form';
|
|
||||||
import TextField from 'components/TextField';
|
|
||||||
import DeleteAccountDialog from 'components/DeleteAccountDialog/index.ee';
|
import DeleteAccountDialog from 'components/DeleteAccountDialog/index.ee';
|
||||||
|
import Form from 'components/Form';
|
||||||
|
import PageTitle from 'components/PageTitle';
|
||||||
|
import TextField from 'components/TextField';
|
||||||
import { UPDATE_CURRENT_USER } from 'graphql/mutations/update-current-user';
|
import { UPDATE_CURRENT_USER } from 'graphql/mutations/update-current-user';
|
||||||
import useFormatMessage from 'hooks/useFormatMessage';
|
|
||||||
import useCurrentUser from 'hooks/useCurrentUser';
|
import useCurrentUser from 'hooks/useCurrentUser';
|
||||||
|
import useFormatMessage from 'hooks/useFormatMessage';
|
||||||
|
|
||||||
type TMutationInput = {
|
type TMutationInput = {
|
||||||
fullName: string;
|
fullName: string;
|
||||||
email: string;
|
email: string;
|
||||||
password?: string;
|
password?: string;
|
||||||
}
|
};
|
||||||
|
|
||||||
const validationSchema = yup
|
const validationSchema = yup
|
||||||
.object({
|
.object({
|
||||||
@@ -43,8 +43,9 @@ const StyledForm = styled(Form)`
|
|||||||
`;
|
`;
|
||||||
|
|
||||||
function ProfileSettings() {
|
function ProfileSettings() {
|
||||||
const [showDeleteAccountConfirmation, setShowDeleteAccountConfirmation] = React.useState(false);
|
const [showDeleteAccountConfirmation, setShowDeleteAccountConfirmation] =
|
||||||
const { enqueueSnackbar } = useSnackbar();
|
React.useState(false);
|
||||||
|
const enqueueSnackbar = useEnqueueSnackbar();
|
||||||
const currentUser = useCurrentUser();
|
const currentUser = useCurrentUser();
|
||||||
const formatMessage = useFormatMessage();
|
const formatMessage = useFormatMessage();
|
||||||
const [updateCurrentUser] = useMutation(UPDATE_CURRENT_USER);
|
const [updateCurrentUser] = useMutation(UPDATE_CURRENT_USER);
|
||||||
@@ -55,7 +56,7 @@ function ProfileSettings() {
|
|||||||
const mutationInput: TMutationInput = {
|
const mutationInput: TMutationInput = {
|
||||||
fullName,
|
fullName,
|
||||||
email,
|
email,
|
||||||
}
|
};
|
||||||
|
|
||||||
if (password) {
|
if (password) {
|
||||||
mutationInput.password = password;
|
mutationInput.password = password;
|
||||||
@@ -80,7 +81,6 @@ function ProfileSettings() {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Container sx={{ py: 3, display: 'flex', justifyContent: 'center' }}>
|
<Container sx={{ py: 3, display: 'flex', justifyContent: 'center' }}>
|
||||||
<Grid container item xs={12} sm={9} md={8} lg={6}>
|
<Grid container item xs={12} sm={9} md={8} lg={6}>
|
||||||
@@ -90,7 +90,11 @@ function ProfileSettings() {
|
|||||||
|
|
||||||
<Grid item xs={12} justifyContent="flex-end">
|
<Grid item xs={12} justifyContent="flex-end">
|
||||||
<StyledForm
|
<StyledForm
|
||||||
defaultValues={{ ...currentUser, password: '', confirmPassword: '' }}
|
defaultValues={{
|
||||||
|
...currentUser,
|
||||||
|
password: '',
|
||||||
|
confirmPassword: '',
|
||||||
|
}}
|
||||||
onSubmit={handleProfileSettingsUpdate}
|
onSubmit={handleProfileSettingsUpdate}
|
||||||
resolver={yupResolver(validationSchema)}
|
resolver={yupResolver(validationSchema)}
|
||||||
mode="onChange"
|
mode="onChange"
|
||||||
@@ -109,7 +113,7 @@ function ProfileSettings() {
|
|||||||
fullWidth
|
fullWidth
|
||||||
name="fullName"
|
name="fullName"
|
||||||
label={formatMessage('profileSettings.fullName')}
|
label={formatMessage('profileSettings.fullName')}
|
||||||
margin='dense'
|
margin="dense"
|
||||||
error={touchedFields.fullName && !!errors?.fullName}
|
error={touchedFields.fullName && !!errors?.fullName}
|
||||||
helperText={errors?.fullName?.message || ' '}
|
helperText={errors?.fullName?.message || ' '}
|
||||||
/>
|
/>
|
||||||
@@ -118,7 +122,7 @@ function ProfileSettings() {
|
|||||||
fullWidth
|
fullWidth
|
||||||
name="email"
|
name="email"
|
||||||
label={formatMessage('profileSettings.email')}
|
label={formatMessage('profileSettings.email')}
|
||||||
margin='dense'
|
margin="dense"
|
||||||
error={touchedFields.email && !!errors?.email}
|
error={touchedFields.email && !!errors?.email}
|
||||||
helperText={errors?.email?.message || ' '}
|
helperText={errors?.email?.message || ' '}
|
||||||
/>
|
/>
|
||||||
@@ -127,7 +131,7 @@ function ProfileSettings() {
|
|||||||
fullWidth
|
fullWidth
|
||||||
name="password"
|
name="password"
|
||||||
label={formatMessage('profileSettings.newPassword')}
|
label={formatMessage('profileSettings.newPassword')}
|
||||||
margin='dense'
|
margin="dense"
|
||||||
type="password"
|
type="password"
|
||||||
error={touchedFields.password && !!errors?.password}
|
error={touchedFields.password && !!errors?.password}
|
||||||
helperText={
|
helperText={
|
||||||
@@ -139,7 +143,7 @@ function ProfileSettings() {
|
|||||||
fullWidth
|
fullWidth
|
||||||
name="confirmPassword"
|
name="confirmPassword"
|
||||||
label={formatMessage('profileSettings.confirmNewPassword')}
|
label={formatMessage('profileSettings.confirmNewPassword')}
|
||||||
margin='dense'
|
margin="dense"
|
||||||
type="password"
|
type="password"
|
||||||
error={
|
error={
|
||||||
touchedFields.confirmPassword && !!errors?.confirmPassword
|
touchedFields.confirmPassword && !!errors?.confirmPassword
|
||||||
@@ -163,9 +167,11 @@ function ProfileSettings() {
|
|||||||
/>
|
/>
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|
||||||
<Grid item xs={12} justifyContent="flex-end" sx={{pt: 5 }}>
|
<Grid item xs={12} justifyContent="flex-end" sx={{ pt: 5 }}>
|
||||||
<Alert variant="outlined" severity="error" sx={{ fontWeight: 500 }}>
|
<Alert variant="outlined" severity="error" sx={{ fontWeight: 500 }}>
|
||||||
<AlertTitle sx={{ fontWeight: 700 }}>{formatMessage('profileSettings.deleteMyAccount')}</AlertTitle>
|
<AlertTitle sx={{ fontWeight: 700 }}>
|
||||||
|
{formatMessage('profileSettings.deleteMyAccount')}
|
||||||
|
</AlertTitle>
|
||||||
|
|
||||||
<Typography variant="body1" gutterBottom>
|
<Typography variant="body1" gutterBottom>
|
||||||
{formatMessage('profileSettings.deleteAccountSubtitle')}
|
{formatMessage('profileSettings.deleteAccountSubtitle')}
|
||||||
|
@@ -1,26 +1,26 @@
|
|||||||
import * as React from 'react';
|
|
||||||
import { useMutation } from '@apollo/client';
|
import { useMutation } from '@apollo/client';
|
||||||
import Grid from '@mui/material/Grid';
|
|
||||||
import Stack from '@mui/material/Stack';
|
|
||||||
import Skeleton from '@mui/material/Skeleton';
|
|
||||||
import LoadingButton from '@mui/lab/LoadingButton';
|
import LoadingButton from '@mui/lab/LoadingButton';
|
||||||
import { useSnackbar } from 'notistack';
|
import Grid from '@mui/material/Grid';
|
||||||
|
import Skeleton from '@mui/material/Skeleton';
|
||||||
|
import Stack from '@mui/material/Stack';
|
||||||
|
import useEnqueueSnackbar from 'hooks/useEnqueueSnackbar';
|
||||||
import merge from 'lodash/merge';
|
import merge from 'lodash/merge';
|
||||||
|
import * as React from 'react';
|
||||||
|
|
||||||
import { GET_CONFIG } from 'graphql/queries/get-config.ee';
|
import ColorInput from 'components/ColorInput';
|
||||||
import { UPDATE_CONFIG } from 'graphql/mutations/update-config.ee';
|
|
||||||
import useConfig from 'hooks/useConfig';
|
|
||||||
import PageTitle from 'components/PageTitle';
|
|
||||||
import Container from 'components/Container';
|
import Container from 'components/Container';
|
||||||
import Form from 'components/Form';
|
import Form from 'components/Form';
|
||||||
|
import PageTitle from 'components/PageTitle';
|
||||||
import TextField from 'components/TextField';
|
import TextField from 'components/TextField';
|
||||||
import useFormatMessage from 'hooks/useFormatMessage';
|
import { UPDATE_CONFIG } from 'graphql/mutations/update-config.ee';
|
||||||
import ColorInput from 'components/ColorInput';
|
import { GET_CONFIG } from 'graphql/queries/get-config.ee';
|
||||||
import nestObject from 'helpers/nestObject';
|
import nestObject from 'helpers/nestObject';
|
||||||
|
import useConfig from 'hooks/useConfig';
|
||||||
|
import useFormatMessage from 'hooks/useFormatMessage';
|
||||||
import {
|
import {
|
||||||
primaryMainColor,
|
|
||||||
primaryDarkColor,
|
primaryDarkColor,
|
||||||
primaryLightColor,
|
primaryLightColor,
|
||||||
|
primaryMainColor,
|
||||||
} from 'styles/theme';
|
} from 'styles/theme';
|
||||||
|
|
||||||
type UserInterface = {
|
type UserInterface = {
|
||||||
@@ -58,7 +58,7 @@ export default function UserInterface(): React.ReactElement {
|
|||||||
'palette.primary.dark',
|
'palette.primary.dark',
|
||||||
'logo.svgData',
|
'logo.svgData',
|
||||||
]);
|
]);
|
||||||
const { enqueueSnackbar } = useSnackbar();
|
const enqueueSnackbar = useEnqueueSnackbar();
|
||||||
const configWithDefaults = merge(
|
const configWithDefaults = merge(
|
||||||
{},
|
{},
|
||||||
defaultValues,
|
defaultValues,
|
||||||
|
15
yarn.lock
15
yarn.lock
@@ -9799,6 +9799,11 @@ globby@^11, globby@^11.0.1, globby@^11.0.2, globby@^11.0.3, globby@^11.0.4:
|
|||||||
merge2 "^1.4.1"
|
merge2 "^1.4.1"
|
||||||
slash "^3.0.0"
|
slash "^3.0.0"
|
||||||
|
|
||||||
|
goober@^2.0.33:
|
||||||
|
version "2.1.13"
|
||||||
|
resolved "https://registry.yarnpkg.com/goober/-/goober-2.1.13.tgz#e3c06d5578486212a76c9eba860cbc3232ff6d7c"
|
||||||
|
integrity sha512-jFj3BQeleOoy7t93E9rZ2de+ScC4lQICLwiAQmKMg9F6roKGaLSHoCDYKkWlSafg138jejvq/mTdvmnwDQgqoQ==
|
||||||
|
|
||||||
got@^9.6.0:
|
got@^9.6.0:
|
||||||
version "9.6.0"
|
version "9.6.0"
|
||||||
resolved "https://registry.npmjs.org/got/-/got-9.6.0.tgz"
|
resolved "https://registry.npmjs.org/got/-/got-9.6.0.tgz"
|
||||||
@@ -13274,13 +13279,13 @@ normalize-url@^6.0.1, normalize-url@^6.1.0:
|
|||||||
resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz"
|
resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz"
|
||||||
integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==
|
integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==
|
||||||
|
|
||||||
notistack@^2.0.2:
|
notistack@^3.0.1:
|
||||||
version "2.0.3"
|
version "3.0.1"
|
||||||
resolved "https://registry.npmjs.org/notistack/-/notistack-2.0.3.tgz"
|
resolved "https://registry.yarnpkg.com/notistack/-/notistack-3.0.1.tgz#daf59888ab7e2c30a1fa8f71f9cba2978773236e"
|
||||||
integrity sha512-krmVFtTO9kEY1Pa4NrbyexrjiRcV6TqBM2xLx8nuDea1g96Z/OZfkvVLmYKkTvoSJ3jyQntWK16z86ssW5kt4A==
|
integrity sha512-ntVZXXgSQH5WYfyU+3HfcXuKaapzAJ8fBLQ/G618rn3yvSzEbnOB8ZSOwhX+dAORy/lw+GC2N061JA0+gYWTVA==
|
||||||
dependencies:
|
dependencies:
|
||||||
clsx "^1.1.0"
|
clsx "^1.1.0"
|
||||||
hoist-non-react-statics "^3.3.0"
|
goober "^2.0.33"
|
||||||
|
|
||||||
npm-bundled@^1.1.1:
|
npm-bundled@^1.1.1:
|
||||||
version "1.1.2"
|
version "1.1.2"
|
||||||
|
Reference in New Issue
Block a user