diff --git a/apps/onelauncher/frontend/src/components/launcher/cluster/ClusterCreation.tsx b/apps/onelauncher/frontend/src/components/launcher/cluster/ClusterCreation.tsx index 65b8dff7..29dbc97a 100644 --- a/apps/onelauncher/frontend/src/components/launcher/cluster/ClusterCreation.tsx +++ b/apps/onelauncher/frontend/src/components/launcher/cluster/ClusterCreation.tsx @@ -41,6 +41,7 @@ interface FormValidation { export function NewClusterCreate() { const queryClient = useQueryClient(); const [currentStepIndex, setCurrentStepIndex] = useState(0); + const [isModalOpen, setIsModalOpen] = useState(false); const [formData, setFormData] = useState({ loader: 'vanilla', clusterName: '', @@ -63,6 +64,15 @@ export function NewClusterCreate() { }), { onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['getClusters'] }); + // Modal'ı kapat ve formu sıfırla + setIsModalOpen(false); + setCurrentStepIndex(0); + setFormData({ + loader: 'vanilla', + clusterName: '', + clusterVersion: '', + clusterProvider: '', + }); }, }); @@ -154,32 +164,30 @@ export function NewClusterCreate() { /> - - + - -
- + +
+ -
-
- {stepContent} -
- - +
+
+ {stepContent}
+ +
- - +
+
); } diff --git a/apps/onelauncher/frontend/src/components/overlay/Modal.tsx b/apps/onelauncher/frontend/src/components/overlay/Modal.tsx index 373490c4..3f6a0e81 100644 --- a/apps/onelauncher/frontend/src/components/overlay/Modal.tsx +++ b/apps/onelauncher/frontend/src/components/overlay/Modal.tsx @@ -1,19 +1,68 @@ import type { DialogProps } from 'react-aria-components'; +import type { VariantProps } from 'tailwind-variants'; import { Dialog as AriaDialog, Modal as AriaModal, DialogTrigger, ModalOverlay, } from 'react-aria-components'; +import { twMerge } from 'tailwind-merge'; +import { tv } from 'tailwind-variants'; -interface ModalProps extends DialogProps { } +const modalVariants = tv({ + slots: { + overlay: [ + 'fixed inset-0 z-50', + 'flex items-center justify-center', + 'bg-black/50 p-4', + + 'data-[entering]:animate-in data-[entering]:fade-in data-[entering]:duration-200', + 'data-[exiting]:animate-out data-[exiting]:fade-out data-[exiting]:duration-150', + ], + modal: [ + 'data-[entering]:animate-in data-[entering]:zoom-in-95 data-[entering]:duration-200', + 'data-[exiting]:animate-out data-[exiting]:zoom-out-95 data-[exiting]:duration-150', + ], + dialog: [ + 'outline-none', + ], + }, +}); + +export interface ModalProps extends DialogProps, VariantProps { + isOpen?: boolean; + onOpenChange?: (isOpen: boolean) => void; + isDismissable?: boolean; + overlayClassName?: string; + modalClassName?: string; +} + +function Modal({ + className, + isOpen, + onOpenChange, + isDismissable = true, + overlayClassName, + modalClassName, + ...props +}: ModalProps) { + const { overlay, modal, dialog } = modalVariants(); + + const isControlled = isOpen !== undefined || onOpenChange !== undefined; + + const overlayProps = { + className: twMerge(overlay(), overlayClassName), + isDismissable, + ...(isControlled && { isOpen, onOpenChange }), + }; -function Modal({ className, ...props }: ModalProps) { return ( - - - - + + + );