import type { Meta, StoryObj } from '@storybook/nextjs' import { useState } from 'react' import Confirm from '.' import Button from '../button' const meta = { title: 'Base/Feedback/Confirm', component: Confirm, parameters: { layout: 'centered', docs: { description: { component: 'Confirmation dialog component that supports warning and info types, with customizable button text and behavior.', }, }, }, tags: ['autodocs'], argTypes: { type: { control: 'select', options: ['info', 'warning'], description: 'Dialog type', }, isShow: { control: 'boolean', description: 'Whether to show the dialog', }, title: { control: 'text', description: 'Dialog title', }, content: { control: 'text', description: 'Dialog content', }, confirmText: { control: 'text', description: 'Confirm button text', }, cancelText: { control: 'text', description: 'Cancel button text', }, isLoading: { control: 'boolean', description: 'Confirm button loading state', }, isDisabled: { control: 'boolean', description: 'Confirm button disabled state', }, showConfirm: { control: 'boolean', description: 'Whether to show confirm button', }, showCancel: { control: 'boolean', description: 'Whether to show cancel button', }, maskClosable: { control: 'boolean', description: 'Whether clicking mask closes dialog', }, }, args: { onConfirm: () => { console.log('✅ User clicked confirm') }, onCancel: () => { console.log('❌ User clicked cancel') }, }, } satisfies Meta export default meta type Story = StoryObj // Interactive demo wrapper const ConfirmDemo = (args: any) => { const [isShow, setIsShow] = useState(false) return (
{ console.log('✅ User clicked confirm') setIsShow(false) }} onCancel={() => { console.log('❌ User clicked cancel') setIsShow(false) }} />
) } // Basic warning dialog - Delete action export const WarningDialog: Story = { render: args => , args: { type: 'warning', title: 'Delete Confirmation', content: 'Are you sure you want to delete this project? This action cannot be undone.', isShow: false, }, } // Info dialog export const InfoDialog: Story = { render: args => , args: { type: 'info', title: 'Notice', content: 'Your changes have been saved. Do you want to proceed to the next step?', isShow: false, }, } // Custom button text export const CustomButtonText: Story = { render: args => , args: { type: 'warning', title: 'Exit Editor', content: 'You have unsaved changes. Are you sure you want to exit?', confirmText: 'Discard Changes', cancelText: 'Continue Editing', isShow: false, }, } // Loading state export const LoadingState: Story = { render: args => , args: { type: 'warning', title: 'Deleting...', content: 'Please wait while we delete the file...', isLoading: true, isShow: false, }, } // Disabled state export const DisabledState: Story = { render: args => , args: { type: 'info', title: 'Verification Required', content: 'Please complete email verification before proceeding.', isDisabled: true, isShow: false, }, } // Alert style - Confirm button only export const AlertStyle: Story = { render: args => , args: { type: 'info', title: 'Success', content: 'Your settings have been updated!', showCancel: false, confirmText: 'Got it', isShow: false, }, } // Dangerous action - Long content export const DangerousAction: Story = { render: args => , args: { type: 'warning', title: 'Permanently Delete Account', content: 'This action will permanently delete your account and all associated data, including: all projects and files, collaboration history, and personal settings. This action cannot be reversed!', confirmText: 'Delete My Account', cancelText: 'Keep My Account', isShow: false, }, } // Non-closable mask export const NotMaskClosable: Story = { render: args => , args: { type: 'warning', title: 'Important Action', content: 'This action requires your explicit choice. Clicking outside will not close this dialog.', maskClosable: false, isShow: false, }, } // Full feature demo - Playground export const Playground: Story = { render: args => , args: { type: 'warning', title: 'This is a title', content: 'This is the dialog content text...', confirmText: undefined, cancelText: undefined, isLoading: false, isDisabled: false, showConfirm: true, showCancel: true, maskClosable: true, isShow: false, }, }