import { useState } from 'react';
import type { Meta, StoryObj } from '@storybook/react';
import { ProvidersStep } from './ProvidersStep';
import type { ProviderData, ProviderFilter } from './ProvidersStep';
import { Navigation } from '../../organisms/Navigation';
import Box from '@mui/material/Box';
// ─── Helpers ─────────────────────────────────────────────────────────────────
const FALogo = () => (
);
const nav = (
}
items={[
{ label: 'FAQ', href: '/faq' },
{ label: 'Contact Us', href: '/contact' },
{ label: 'Log in', href: '/login' },
]}
/>
);
const mockProviders: ProviderData[] = [
{
id: 'parsons',
name: 'H.Parsons Funeral Directors',
location: 'Wentworth, NSW',
verified: true,
imageUrl: 'https://placehold.co/600x200/E8E0D6/8B6F47?text=H.Parsons',
logoUrl: 'https://placehold.co/64x64/FEF9F5/BA834E?text=HP',
rating: 4.6,
reviewCount: 7,
startingPrice: 900,
distanceKm: 2.3,
description:
'H.Parsons delivers premium funeral services with exceptional care and support, guiding families through every step with empathy and expertise.',
},
{
id: 'rankins',
name: 'Rankins Funeral Services',
location: 'Wollongong, NSW',
verified: true,
imageUrl: 'https://placehold.co/600x200/D7E1E2/4C5B6B?text=Rankins',
logoUrl: 'https://placehold.co/64x64/F2F5F6/4C5B6B?text=R',
rating: 4.8,
reviewCount: 23,
startingPrice: 1200,
distanceKm: 5.1,
},
{
id: 'wollongong-city',
name: 'Wollongong City Funerals',
location: 'Wollongong, NSW',
verified: false,
rating: 4.2,
reviewCount: 15,
startingPrice: 750,
distanceKm: 6.8,
},
{
id: 'easy-funerals',
name: 'Easy Funerals',
location: 'Sydney, NSW',
verified: true,
imageUrl: 'https://placehold.co/600x200/F0F7F0/3B7A3B?text=Easy+Funerals',
logoUrl: 'https://placehold.co/64x64/F0F7F0/3B7A3B?text=EF',
rating: 4.5,
reviewCount: 42,
startingPrice: 850,
distanceKm: 12.4,
},
{
id: 'botanical',
name: 'Botanical Funerals',
location: 'Newtown, NSW',
verified: false,
rating: 4.9,
reviewCount: 8,
startingPrice: 2100,
distanceKm: 15.0,
},
];
const defaultFilters: ProviderFilter[] = [
{ label: 'Funeral Type', active: false },
{ label: 'Verified Only', active: false },
{ label: 'Under $1,500', active: false },
];
// ─── Meta ────────────────────────────────────────────────────────────────────
const meta: Meta = {
title: 'Pages/ProvidersStep',
component: ProvidersStep,
tags: ['autodocs'],
parameters: {
layout: 'fullscreen',
},
};
export default meta;
type Story = StoryObj;
// ─── Interactive (default) ──────────────────────────────────────────────────
/** Fully interactive — search, filter, select a provider, continue */
export const Default: Story = {
render: () => {
const [selectedId, setSelectedId] = useState(null);
const [query, setQuery] = useState('');
const [filters, setFilters] = useState(defaultFilters);
const [error, setError] = useState();
const filtered = mockProviders.filter((p) =>
p.name.toLowerCase().includes(query.toLowerCase()),
);
const handleContinue = () => {
if (!selectedId) {
setError('Please choose a funeral provider to continue.');
return;
}
setError(undefined);
alert(`Continue with provider: ${selectedId}`);
};
return (
{
setSelectedId(id);
setError(undefined);
}}
searchQuery={query}
onSearchChange={setQuery}
filters={filters}
onFilterToggle={(i) =>
setFilters((prev) => prev.map((f, idx) => (idx === i ? { ...f, active: !f.active } : f)))
}
onContinue={handleContinue}
onBack={() => alert('Back')}
error={error}
navigation={nav}
/>
);
},
};
// ─── With selected provider ─────────────────────────────────────────────────
/** Provider already selected — ready to continue */
export const WithSelection: Story = {
render: () => {
const [selectedId, setSelectedId] = useState('parsons');
const [query, setQuery] = useState('');
return (
alert('Continue')}
onBack={() => alert('Back')}
navigation={nav}
/>
);
},
};
// ─── Pre-planning variant ───────────────────────────────────────────────────
/** Pre-planning flow — softer copy */
export const PrePlanning: Story = {
render: () => {
const [selectedId, setSelectedId] = useState(null);
const [query, setQuery] = useState('');
return (
alert('Continue')}
onBack={() => alert('Back')}
navigation={nav}
isPrePlanning
/>
);
},
};
// ─── Validation error ───────────────────────────────────────────────────────
/** No provider selected, error shown */
export const WithError: Story = {
render: () => {
const [selectedId, setSelectedId] = useState(null);
const [query, setQuery] = useState('');
return (
{}}
onBack={() => alert('Back')}
error="Please choose a funeral provider to continue."
navigation={nav}
/>
);
},
};
// ─── Empty results ──────────────────────────────────────────────────────────
/** Search yielded no results */
export const EmptyResults: Story = {
render: () => {
const [query, setQuery] = useState('xyz');
return (
{}}
searchQuery={query}
onSearchChange={setQuery}
onContinue={() => {}}
onBack={() => alert('Back')}
navigation={nav}
/>
);
},
};
// ─── Loading state ──────────────────────────────────────────────────────────
/** Continue button loading */
export const Loading: Story = {
render: () => {
const [query, setQuery] = useState('');
return (
{}}
searchQuery={query}
onSearchChange={setQuery}
onContinue={() => {}}
onBack={() => alert('Back')}
loading
navigation={nav}
/>
);
},
};
// ─── Single provider ────────────────────────────────────────────────────────
/** Only one provider available */
export const SingleProvider: Story = {
render: () => {
const [selectedId, setSelectedId] = useState(null);
const [query, setQuery] = useState('');
return (
alert('Continue')}
onBack={() => alert('Back')}
navigation={nav}
/>
);
},
};