|
| 1 | +"use client"; |
| 2 | + |
| 3 | +import { useActionState, useEffect, useState } from "react"; |
| 4 | +import { removeDummyGpCode, type RemoveDummyGpCodeState } from "@/app/lib/removeDummyGpCode"; |
| 5 | + |
| 6 | +export default function RemoveDummyGpCodeForm() { |
| 7 | + const [state, formAction] = useActionState<RemoveDummyGpCodeState, FormData>(removeDummyGpCode, null); |
| 8 | + const [formKey, setFormKey] = useState(0); |
| 9 | + |
| 10 | + useEffect(() => { |
| 11 | + if (state?.error) { |
| 12 | + setFormKey((prev) => prev + 1); |
| 13 | + } |
| 14 | + }, [state]); |
| 15 | + |
| 16 | + const hasError = !!state?.error; |
| 17 | + const errorField = state?.field; |
| 18 | + const errorMessage = state?.error; |
| 19 | + const values = state?.values; |
| 20 | + |
| 21 | + return ( |
| 22 | + <> |
| 23 | + {hasError && ( |
| 24 | + <div className="nhsuk-error-summary" aria-labelledby="error-summary-title" role="alert" tabIndex={-1} data-testid="error-summary"> |
| 25 | + <h2 className="nhsuk-error-summary__title" id="error-summary-title">There is a problem</h2> |
| 26 | + <div className="nhsuk-error-summary__body"> |
| 27 | + <ul className="nhsuk-list nhsuk-error-summary__list"> |
| 28 | + <li> |
| 29 | + {errorField ? ( |
| 30 | + <a href={`#${errorField}`}>{errorMessage}</a> |
| 31 | + ) : ( |
| 32 | + <span>{errorMessage}</span> |
| 33 | + )} |
| 34 | + </li> |
| 35 | + </ul> |
| 36 | + </div> |
| 37 | + </div> |
| 38 | + )} |
| 39 | + |
| 40 | + <h1>Remove Dummy GP Code</h1> |
| 41 | + <form action={formAction} key={formKey}> |
| 42 | + <div className={`nhsuk-form-group ${hasError && errorField === "nhsNumber" ? "nhsuk-form-group--error" : ""}`}> |
| 43 | + <label className="nhsuk-label nhsuk-u-font-weight-bold" htmlFor="nhsNumber">NHS Number</label> |
| 44 | + <div className="nhsuk-hint" id="nhsNumber-hint">A 10 digit number, for example 485 777 3456</div> |
| 45 | + {hasError && errorField === "nhsNumber" && ( |
| 46 | + <span className="nhsuk-error-message" id="nhsNumber-error"> |
| 47 | + <span className="nhsuk-u-visually-hidden">Error:</span>{" "} |
| 48 | + {errorMessage} |
| 49 | + </span> |
| 50 | + )} |
| 51 | + <input |
| 52 | + className={`nhsuk-input nhsuk-input--width-10 ${hasError && errorField === "nhsNumber" ? "nhsuk-input--error" : ""}`} |
| 53 | + id="nhsNumber" |
| 54 | + name="nhsNumber" |
| 55 | + type="text" |
| 56 | + inputMode="numeric" |
| 57 | + defaultValue={values?.nhsNumber} |
| 58 | + aria-describedby={`nhsNumber-hint${hasError && errorField === "nhsNumber" ? " nhsNumber-error" : ""}`} |
| 59 | + data-testid="nhs-number-input" |
| 60 | + /> |
| 61 | + </div> |
| 62 | + |
| 63 | + <div className={`nhsuk-form-group ${hasError && errorField === "forename" ? "nhsuk-form-group--error" : ""}`}> |
| 64 | + <label className="nhsuk-label nhsuk-u-font-weight-bold" htmlFor="forename">Forename</label> |
| 65 | + {hasError && errorField === "forename" && ( |
| 66 | + <span className="nhsuk-error-message" id="forename-error"> |
| 67 | + <span className="nhsuk-u-visually-hidden">Error:</span>{" "} |
| 68 | + {errorMessage} |
| 69 | + </span> |
| 70 | + )} |
| 71 | + <input className={`nhsuk-input ${hasError && errorField === "forename" ? "nhsuk-input--error" : ""}`} id="forename" name="forename" type="text" defaultValue={values?.forename} data-testid="forename-input" /> |
| 72 | + </div> |
| 73 | + |
| 74 | + <div className={`nhsuk-form-group ${hasError && errorField === "surname" ? "nhsuk-form-group--error" : ""}`}> |
| 75 | + <label className="nhsuk-label nhsuk-u-font-weight-bold" htmlFor="surname">Surname</label> |
| 76 | + {hasError && errorField === "surname" && ( |
| 77 | + <span className="nhsuk-error-message" id="surname-error"> |
| 78 | + <span className="nhsuk-u-visually-hidden">Error:</span>{" "} |
| 79 | + {errorMessage} |
| 80 | + </span> |
| 81 | + )} |
| 82 | + <input className={`nhsuk-input ${hasError && errorField === "surname" ? "nhsuk-input--error" : ""}`} id="surname" name="surname" type="text" defaultValue={values?.surname} data-testid="surname-input" /> |
| 83 | + </div> |
| 84 | + |
| 85 | + <div className={`nhsuk-form-group ${hasError && errorField === "dob-day" ? "nhsuk-form-group--error" : ""}`}> |
| 86 | + <fieldset className="nhsuk-fieldset" aria-describedby="dob-hint" role="group"> |
| 87 | + <legend className="nhsuk-fieldset__legend nhsuk-label nhsuk-u-font-weight-bold">Date of Birth</legend> |
| 88 | + <div className="nhsuk-hint" id="dob-hint">For example, 15 3 1984</div> |
| 89 | + {hasError && errorField === "dob-day" && ( |
| 90 | + <span className="nhsuk-error-message" id="dob-error"> |
| 91 | + <span className="nhsuk-u-visually-hidden">Error:</span>{" "} |
| 92 | + {errorMessage} |
| 93 | + </span> |
| 94 | + )} |
| 95 | + <div className="nhsuk-date-input" id="dob"> |
| 96 | + <div className="nhsuk-date-input__item"> |
| 97 | + <div className="nhsuk-form-group"> |
| 98 | + <label className="nhsuk-label nhsuk-date-input__label" htmlFor="dob-day">Day</label> |
| 99 | + <input className={`nhsuk-input nhsuk-date-input__input nhsuk-input--width-2 ${hasError && errorField === "dob-day" ? "nhsuk-input--error" : ""}`} id="dob-day" name="dob-day" type="text" inputMode="numeric" maxLength={2} defaultValue={values?.dobDay} data-testid="dob-day-input" /> |
| 100 | + </div> |
| 101 | + </div> |
| 102 | + <div className="nhsuk-date-input__item"> |
| 103 | + <div className="nhsuk-form-group"> |
| 104 | + <label className="nhsuk-label nhsuk-date-input__label" htmlFor="dob-month">Month</label> |
| 105 | + <input className={`nhsuk-input nhsuk-date-input__input nhsuk-input--width-2 ${hasError && errorField === "dob-day" ? "nhsuk-input--error" : ""}`} id="dob-month" name="dob-month" type="text" inputMode="numeric" maxLength={2} defaultValue={values?.dobMonth} data-testid="dob-month-input" /> |
| 106 | + </div> |
| 107 | + </div> |
| 108 | + <div className="nhsuk-date-input__item"> |
| 109 | + <div className="nhsuk-form-group"> |
| 110 | + <label className="nhsuk-label nhsuk-date-input__label" htmlFor="dob-year">Year</label> |
| 111 | + <input className={`nhsuk-input nhsuk-date-input__input nhsuk-input--width-4 ${hasError && errorField === "dob-day" ? "nhsuk-input--error" : ""}`} id="dob-year" name="dob-year" type="text" inputMode="numeric" maxLength={4} defaultValue={values?.dobYear} data-testid="dob-year-input" /> |
| 112 | + </div> |
| 113 | + </div> |
| 114 | + </div> |
| 115 | + </fieldset> |
| 116 | + </div> |
| 117 | + |
| 118 | + <div className={`nhsuk-form-group ${hasError && errorField === "serviceNowTicketNumber" ? "nhsuk-form-group--error" : ""}`}> |
| 119 | + <label className="nhsuk-label nhsuk-u-font-weight-bold" htmlFor="serviceNowTicketNumber">Service Now Ticket Number</label> |
| 120 | + <div className="nhsuk-hint" id="serviceNowTicketNumber-hint">For example, CS1234567</div> |
| 121 | + {hasError && errorField === "serviceNowTicketNumber" && ( |
| 122 | + <span className="nhsuk-error-message" id="serviceNowTicketNumber-error"> |
| 123 | + <span className="nhsuk-u-visually-hidden">Error:</span>{" "} |
| 124 | + {errorMessage} |
| 125 | + </span> |
| 126 | + )} |
| 127 | + <input className={`nhsuk-input nhsuk-input--width-10 ${hasError && errorField === "serviceNowTicketNumber" ? "nhsuk-input--error" : ""}`} id="serviceNowTicketNumber" name="serviceNowTicketNumber" type="text" defaultValue={values?.serviceNowTicketNumber} aria-describedby="serviceNowTicketNumber-hint" data-testid="service-now-ticket-input"/> |
| 128 | + </div> |
| 129 | + |
| 130 | + <button className="nhsuk-button" data-module="nhsuk-button" type="submit" data-testid="submit-button">Submit</button> |
| 131 | + </form> |
| 132 | + </> |
| 133 | + ); |
| 134 | +} |
0 commit comments