apps/web: add close button to Overlay
This commit is contained in:
parent
2ff3589715
commit
aaaa6fffbb
@ -1,44 +1,61 @@
|
|||||||
'use client';
|
'use client';
|
||||||
import { FormContext } from './context/form-context';
|
import { FormContext } from './context/form-context';
|
||||||
import { CheckCircleIcon, XCircleIcon } from '@heroicons/react/24/solid';
|
import { CheckCircleIcon, XCircleIcon } from '@heroicons/react/24/solid';
|
||||||
import { Background, LoadingSpinner } from '@repo/ui';
|
import { Background, Button, LoadingSpinner } from '@repo/ui';
|
||||||
import type { PropsWithChildren } from 'react';
|
import type { PropsWithChildren } from 'react';
|
||||||
import { useContext } from 'react';
|
import { useContext } from 'react';
|
||||||
|
|
||||||
function OverlayWrapper({ children }: PropsWithChildren) {
|
function OverlayWrapper({ children }: PropsWithChildren) {
|
||||||
return (
|
return (
|
||||||
<Background className="absolute left-0 top-0 grid h-full w-full place-items-center bg-opacity-80 backdrop-blur-sm">
|
<Background className="absolute left-0 top-0 grid h-full w-full place-items-center bg-opacity-80 backdrop-blur-sm">
|
||||||
<div className="absolute bottom-[50vh] flex flex-row items-center gap-2 md:relative md:bottom-0">
|
<div className="absolute bottom-[50vh] flex flex-col items-center gap-2 md:relative md:bottom-0">
|
||||||
{children}
|
{children}
|
||||||
</div>
|
</div>
|
||||||
</Background>
|
</Background>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function StateContentWrapper({ children }: PropsWithChildren) {
|
||||||
|
return <div className="flex flex-row items-center gap-2">{children}</div>;
|
||||||
|
}
|
||||||
|
|
||||||
export function Overlay() {
|
export function Overlay() {
|
||||||
const { formState } = useContext(FormContext);
|
const { formState, setFormState } = useContext(FormContext);
|
||||||
const { status, text } = formState;
|
const { status, text } = formState;
|
||||||
|
|
||||||
if (status === 'pending')
|
let stateContent: JSX.Element | false = false;
|
||||||
return (
|
|
||||||
<OverlayWrapper>
|
if (status === 'pending') {
|
||||||
|
stateContent = (
|
||||||
|
<StateContentWrapper>
|
||||||
{LoadingSpinner} <p className="font-medium">Загрузка...</p>
|
{LoadingSpinner} <p className="font-medium">Загрузка...</p>
|
||||||
</OverlayWrapper>
|
</StateContentWrapper>
|
||||||
);
|
);
|
||||||
if (status === 'success')
|
}
|
||||||
return (
|
if (status === 'success') {
|
||||||
<OverlayWrapper>
|
stateContent = (
|
||||||
<CheckCircleIcon className="h-10 w-10 fill-green-500" title="OK" />{' '}
|
<StateContentWrapper>
|
||||||
|
<CheckCircleIcon className="h-10 w-10 fill-green-500" title="OK" />
|
||||||
<p className="font-medium">Данные сохранены</p>
|
<p className="font-medium">Данные сохранены</p>
|
||||||
</OverlayWrapper>
|
</StateContentWrapper>
|
||||||
);
|
|
||||||
if (status === 'error') {
|
|
||||||
return (
|
|
||||||
<OverlayWrapper>
|
|
||||||
<XCircleIcon className="h-10 w-10 fill-red-500" title="Error" />{' '}
|
|
||||||
<p className="font-medium">{text}</p>
|
|
||||||
</OverlayWrapper>
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
if (status === 'error') {
|
||||||
|
stateContent = (
|
||||||
|
<>
|
||||||
|
<StateContentWrapper>
|
||||||
|
<XCircleIcon className="h-10 w-10 fill-red-500" title="Error" />
|
||||||
|
<p className="font-medium">{text}</p>
|
||||||
|
</StateContentWrapper>{' '}
|
||||||
|
<Button type="button" intent="text" onClick={() => setFormState({ status: 'edit' })}>
|
||||||
|
Закрыть
|
||||||
|
</Button>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!stateContent) return false;
|
||||||
|
|
||||||
|
return <OverlayWrapper>{stateContent}</OverlayWrapper>;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -22,6 +22,7 @@ const variants = cva(
|
|||||||
'border border-primary text-primary-500 hover:bg-primary-500 hover:text-white',
|
'border border-primary text-primary-500 hover:bg-primary-500 hover:text-white',
|
||||||
secondary:
|
secondary:
|
||||||
'bg-primary-50 text-primary-500 border border-transparent hover:bg-primary-100 hover:text-primary-600',
|
'bg-primary-50 text-primary-500 border border-transparent hover:bg-primary-100 hover:text-primary-600',
|
||||||
|
text: 'bg-none text-primary-500 hover:bg-primary-50',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user