import type { Meta, StoryObj } from '@storybook/nextjs-vite';
import { useEffect, useRef } from 'react';
import { WaitlistForm } from '../components/features/waitlist-form';
import { Toaster } from '../components/ui/toaster';
const meta = {
title: 'Features/WaitlistForm',
component: WaitlistForm,
parameters: {
layout: 'padded',
backgrounds: { default: 'dark' },
},
decorators: [
(Story) => (
),
],
args: {
onRegister: async () => {
await new Promise((r) => setTimeout(r, 1500));
},
geoApiUrl: null,
privacyPolicyUrl: 'https://flamingo.ai/privacy',
termsOfServiceUrl: 'https://flamingo.ai/terms',
},
} satisfies Meta;
export default meta;
type Story = StoryObj;
/**
* Default waitlist form with all defaults.
*/
export const Default: Story = {};
/**
* With a pre-filled email address.
*/
export const WithDefaultEmail: Story = {
args: {
defaultEmail: 'john@acme-msp.com',
},
};
/**
* Generic email domain warning (gmail.com triggers it).
*/
export const GenericEmailWarning: Story = {
args: {
defaultEmail: 'user@gmail.com',
},
};
/**
* Submitting state — button shows loading spinner.
*/
export const Submitting: Story = {
args: {
defaultEmail: 'team@enterprise.io',
isSubmitting: true,
},
};
/**
* Success state — button text changes.
*/
export const Success: Story = {
args: {
defaultEmail: 'team@enterprise.io',
isSuccess: true,
},
};
/**
* Custom labels and hints.
*/
export const CustomLabels: Story = {
args: {
submitLabel: 'Join Early Access',
successLabel: 'Welcome aboard!',
smsCheckboxLabel: 'Notify me via SMS',
genericEmailHint: 'Business emails only please.',
invalidPhoneHint: 'Check your phone number.',
consentText: 'By signing up, you agree to our terms.',
privacyPolicyUrl: 'https://example.com/privacy',
termsOfServiceUrl: 'https://example.com/terms',
},
};
/**
* In a narrow container (360px) to test mobile-like layout.
*/
export const NarrowContainer: Story = {
decorators: [
(Story) => (
),
],
};
/**
* Registration that fails — shows toast.
*/
export const FailingRegistration: Story = {
args: {
onRegister: async () => {
await new Promise((r) => setTimeout(r, 1000));
throw new Error('Registration failed');
},
},
};
/**
* Flamingo theme (pink accent) with checkbox error state.
* Phone is pre-filled and submit is auto-triggered to show the error.
*/
export const FlamingoWithCheckboxError: Story = {
args: {
defaultEmail: 'user@msp-company.com',
defaultPhone: '5551234567',
onRegister: async () => {
await new Promise((r) => setTimeout(r, 1500));
},
},
decorators: [
(Story) => (
),
],
render: function FlamingoError(args) {
const ref = useRef(null);
useEffect(() => {
const btn = ref.current?.querySelector('button');
btn?.click();
}, []);
return (
);
},
};