/** * @license * SPDX-License-Identifier: Apache-2.0 */ import React, { useState, useEffect } from 'react'; import { ApplicationData, DocumentTypeId, CountyROI } from './types'; import { FORMS_CATALOG } from './data/formsCatalog'; import { COUNTY_VENUE_MAPPINGS } from './data/counties'; import { SAMPLE_SAFETY_ORDER, SAMPLE_MAINTENANCE, SAMPLE_CUSTODY_ACCESS, SAMPLE_DIVORCE, } from './data/sampleData'; import { TopBar } from './components/TopBar'; import { JurisdictionBanner } from './components/JurisdictionBanner'; import { FormSelector } from './components/FormSelector'; import { ApplicationWizard } from './components/ApplicationWizard'; import { DocumentViewer } from './components/DocumentViewer'; import { PricingModal } from './components/PricingModal'; import { NorthernIrelandWarningModal } from './components/NorthernIrelandWarningModal'; import { FilingGuideModal } from './components/FilingGuideModal'; import { ChecklistModal } from './components/ChecklistModal'; import { CourtPrepGuideModal } from './components/CourtPrepGuideModal'; import { ApplicationGuidesModal } from './components/ApplicationGuidesModal'; import { ContactUsModal } from './components/ContactUsModal'; import { PhoneCall, Mail, BookOpen } from 'lucide-react'; const INITIAL_EMPTY_DATA: ApplicationData = { documentType: 'dv_safety_order', year: 2026, recordNumber: '', county: 'Dublin', courtArea: 'Dublin Metropolitan District', districtNumber: 'Dublin Metropolitan District', circuitName: 'Dublin Circuit', courtTier: 'District Court', courtVenueAddress: 'Dolphin House, East Essex Street, Dublin 2, D02 RR76', applicantName: '', applicantAddress: '', applicantAddressWithheld: false, applicantPhone: '', applicantEmail: '', applicantOccupation: '', applicantRelationshipToRespondent: '', respondentName: '', respondentAddress: '', respondentPhone: '', respondentOccupation: '', relationshipStartDate: '', children: [], groundsSummary: '', incidentDatesAndDetails: '', gardaInvolvement: false, medicalAttentionSought: false, interimProtectionSought: false, weaponsSurrenderClause: false, requestedWeeklyAmountPerChild: 0, requestedSpousalWeeklyAmount: 0, applicantNetWeeklyIncome: 0, applicantWeeklyRentMortgage: 0, applicantWeeklyUtilitiesFood: 0, applicantWeeklyChildCosts: 0, applicantChildBenefit: 0, respondentEstimatedIncome: 0, bankIbanForPayment: '', custodyTypeSought: 'Joint Custody', proposedAccessSchedule: '', holidayArrangements: '', handoverLocation: '', livingApartTwoYearsConfirmed: false, noProspectOfReconciliation: false, pensionAdjustmentSought: false, successionRightsExtinguished: false, applicantDeclarationAgreed: false, roiJurisdictionAgreed: false, nonSolicitorNoticeAgreed: false, creationTimestamp: new Date().toISOString(), }; export default function App() { const [currentStep, setCurrentStep] = useState(1); const [applicationData, setApplicationData] = useState(INITIAL_EMPTY_DATA); useEffect(() => { window.scrollTo({ top: 0, behavior: 'smooth' }); }, [currentStep]); // Modal States const [isPricingOpen, setIsPricingOpen] = useState(false); const [isFilingGuideOpen, setIsFilingGuideOpen] = useState(false); const [isNiWarningOpen, setIsNiWarningOpen] = useState(false); const [isChecklistOpen, setIsChecklistOpen] = useState(false); const [isPrepGuideOpen, setIsPrepGuideOpen] = useState(false); const [isGuidesOpen, setIsGuidesOpen] = useState(false); const [activeGuideId, setActiveGuideId] = useState('maintenance'); const [isContactOpen, setIsContactOpen] = useState(false); const handleOpenGuides = (guideId?: string) => { if (guideId) setActiveGuideId(guideId); setIsGuidesOpen(true); }; const handleCountyChange = (county: CountyROI) => { const venueInfo = COUNTY_VENUE_MAPPINGS[county] || COUNTY_VENUE_MAPPINGS.Dublin; const meta = FORMS_CATALOG.find((f) => f.id === applicationData.documentType); const isDivorce = meta?.category === 'diy_divorce'; setApplicationData((prev) => ({ ...prev, county, courtArea: venueInfo.courtArea, districtNumber: venueInfo.districtNumber, circuitName: venueInfo.circuitName, courtTier: isDivorce ? 'Circuit Court' : 'District Court', courtVenueAddress: isDivorce ? venueInfo.circuitVenue : venueInfo.courtVenueAddress, })); }; const handleSelectForm = (id: DocumentTypeId) => { const meta = FORMS_CATALOG.find((f) => f.id === id); const venueInfo = COUNTY_VENUE_MAPPINGS[applicationData.county] || COUNTY_VENUE_MAPPINGS.Dublin; const isDivorce = meta?.category === 'diy_divorce'; const isDV = meta?.category === 'domestic_violence'; setApplicationData((prev) => ({ ...prev, documentType: id, courtTier: meta?.courtTier || (isDivorce ? 'Circuit Court' : 'District Court'), circuitName: venueInfo.circuitName, courtArea: venueInfo.courtArea, districtNumber: venueInfo.districtNumber, courtVenueAddress: isDivorce ? venueInfo.circuitVenue : venueInfo.courtVenueAddress, interimProtectionSought: isDV ? true : false, groundsSummary: prev.groundsSummary || '', })); }; const handleLoadSample = (sampleType: 'safety' | 'maintenance' | 'custody' | 'divorce') => { if (sampleType === 'safety') setApplicationData(SAMPLE_SAFETY_ORDER); else if (sampleType === 'maintenance') setApplicationData(SAMPLE_MAINTENANCE); else if (sampleType === 'custody') setApplicationData(SAMPLE_CUSTODY_ACCESS); else if (sampleType === 'divorce') setApplicationData(SAMPLE_DIVORCE); }; const handleSelectDivorceDirect = () => { const venueInfo = COUNTY_VENUE_MAPPINGS[applicationData.county] || COUNTY_VENUE_MAPPINGS.Dublin; setApplicationData((prev) => ({ ...prev, documentType: 'divorce_civil_bill_2n', courtTier: 'Circuit Court', circuitName: venueInfo.circuitName, courtArea: venueInfo.courtArea, districtNumber: venueInfo.districtNumber, courtVenueAddress: venueInfo.circuitVenue, livingApartTwoYearsConfirmed: true, noProspectOfReconciliation: true, pensionAdjustmentSought: true, successionRightsExtinguished: true, })); setCurrentStep(2); }; const handleResetNew = () => { setApplicationData({ ...INITIAL_EMPTY_DATA, creationTimestamp: new Date().toISOString(), }); setCurrentStep(1); }; return (
setCurrentStep(step)} onOpenPricing={() => setIsPricingOpen(true)} onOpenFilingGuide={() => setIsFilingGuideOpen(true)} onOpenNiWarning={() => setIsNiWarningOpen(true)} onOpenChecklist={() => setIsChecklistOpen(true)} onOpenPrepGuide={() => setIsPrepGuideOpen(true)} onOpenGuides={handleOpenGuides} onOpenContact={() => setIsContactOpen(true)} onResetNew={handleResetNew} /> setIsNiWarningOpen(true)} />
{currentStep === 1 && ( setCurrentStep(2)} onOpenChecklist={() => setIsChecklistOpen(true)} onOpenPrepGuide={() => setIsPrepGuideOpen(true)} onSelectDivorceDirect={handleSelectDivorceDirect} onOpenGuides={handleOpenGuides} onOpenContact={() => setIsContactOpen(true)} /> )} {currentStep === 2 && ( setApplicationData(updated)} onProceedToDocument={() => setCurrentStep(3)} onBackToSelector={() => setCurrentStep(1)} /> )} {currentStep === 3 && ( setCurrentStep(2)} onUpdateCounty={handleCountyChange} onOpenPricing={() => setIsPricingOpen(true)} onOpenFilingGuide={() => setIsFilingGuideOpen(true)} /> )}
FS
Family Support Ireland

Automated legal document preparation supporting citizens in Irish District and Circuit Court family proceedings.

familysupportireland.ie

Main Offerings

Court Forms Supported

Support & Contact

Direct questions regarding applications or court procedures can be sent directly to our team:

Urgent Emergency: Call 999 or 112
© 2026 Family Support Ireland (familysupportireland.ie). All rights reserved.
· · · ·
{/* Modals */} setIsChecklistOpen(false)} /> setIsPrepGuideOpen(false)} /> setIsPricingOpen(false)} onOpenGuides={handleOpenGuides} onOpenContact={() => setIsContactOpen(true)} /> setIsNiWarningOpen(false)} /> setIsFilingGuideOpen(false)} /> setIsGuidesOpen(false)} onContactSupport={() => { setIsGuidesOpen(false); setIsContactOpen(true); }} /> setIsContactOpen(false)} />
); }