Skip to content

Commit

Permalink
fix: app submission edge cases (bloom-housing#4550) (#833)
Browse files Browse the repository at this point in the history
* fix: block duplicate submissions

* fix: redirect with toast

* fix: linting

* fix: copy update

---------

Co-authored-by: Eric McGarry <[email protected]>
  • Loading branch information
ColinBuyck and mcgarrye authored Feb 6, 2025
1 parent fabcb6a commit 07eb52d
Show file tree
Hide file tree
Showing 8 changed files with 64 additions and 42 deletions.
1 change: 1 addition & 0 deletions shared-helpers/src/locales/ar.json
Original file line number Diff line number Diff line change
Expand Up @@ -574,6 +574,7 @@
"listings.annualIncome": "٪ {الدخل} في السنة",
"listings.annualIncomeRange": "٪ {from} إلى٪ {to} سنويًا",
"listings.applicationAddress": "تبوك",
"listings.applicationAlreadySubmitted": "لقد تم تقديم هذا الطلب بالفعل.",
"listings.applicationDeadline": "تاريخ استحقاق الطلب",
"listings.applicationDropOffQuestion": "هل يمكن إسقاط الطلبات؟",
"listings.applicationDueTime": "وقت التقديم",
Expand Down
1 change: 1 addition & 0 deletions shared-helpers/src/locales/bn.json
Original file line number Diff line number Diff line change
Expand Up @@ -570,6 +570,7 @@
"listings.annualIncome": "%{আয়} প্রতি বছর",
"listings.annualIncomeRange": "%{থেকে} থেকে %{থেকে} প্রতি বছর",
"listings.applicationAddress": "ঠিকানা",
"listings.applicationAlreadySubmitted": "এই আবেদনটি ইতিমধ্যেই জমা দেওয়া হয়েছে।",
"listings.applicationDeadline": "আবেদনের শেষ তারিখ",
"listings.applicationDropOffQuestion": "আবেদন কি বাদ দেওয়া যাবে?",
"listings.applicationDueTime": "আবেদনের নির্ধারিত সময়",
Expand Down
3 changes: 2 additions & 1 deletion shared-helpers/src/locales/es.json
Original file line number Diff line number Diff line change
Expand Up @@ -579,6 +579,7 @@
"listings.allUnits": "Todas las viviendas",
"listings.allUnitsReservedFor": "Todas las viviendas reservadas para %{type}",
"listings.annualIncome": "%{income} al año",
"listings.applicationAlreadySubmitted": "Ya ha enviado una solicitud para este listado.",
"listings.applicationDeadline": "Fecha límite de solicitud",
"listings.applicationFCFS": "Atención por orden de llegada",
"listings.applicationFee": "Cargo de solicitud",
Expand All @@ -587,7 +588,7 @@
"listings.applicationPerApplicantAgeDescription": "por solicitante de 18 años o más",
"listings.applications": "Solicitudes",
"listings.applicationsClosed": "Solicitudes cerradas",
"listings.applicationsClosedRedirect": "Esta lista ya no acepta solicitudes.",
"listings.applicationsClosedRedirect": "Esta solicitud ya ha sido enviada.",
"listings.apply.applicationWillBeAvailableOn": "La solicitud podrá ser descargada y recogida el %{openDate}",
"listings.apply.applyOnline": "Haga su solicitud por Internet",
"listings.apply.downloadApplication": "Descargar la Solicitud",
Expand Down
1 change: 1 addition & 0 deletions shared-helpers/src/locales/general.json
Original file line number Diff line number Diff line change
Expand Up @@ -570,6 +570,7 @@
"listings.allUnits": "All Units",
"listings.allUnitsReservedFor": "All units reserved for %{type}",
"listings.annualIncome": "%{income} per year",
"listings.applicationAlreadySubmitted": "This application has already been submitted.",
"listings.applicationDeadline": "Application Due Date",
"listings.applicationFCFS": "First Come First Serve",
"listings.applicationFee": "Application Fee",
Expand Down
3 changes: 2 additions & 1 deletion shared-helpers/src/locales/tl.json
Original file line number Diff line number Diff line change
Expand Up @@ -574,6 +574,7 @@
"listings.allUnits": "Lahat ng Unit",
"listings.allUnitsReservedFor": "Ang lahat ng unit ay nakareserba para sa %{type}",
"listings.annualIncome": "%{income} kada taon",
"listings.applicationAlreadySubmitted": "Nagsumite ka na ng aplikasyon para sa listahang ito.",
"listings.applicationDeadline": "Due Date ng Application",
"listings.applicationFCFS": "Kung Sino Ang Mauna Ay Siyang Makakakuha",
"listings.applicationFee": "Bayad sa Application",
Expand All @@ -582,7 +583,7 @@
"listings.applicationPerApplicantAgeDescription": "bawat aplikante na edad 18 at mas matanda",
"listings.applications": "Mga Application",
"listings.applicationsClosed": "Mga Isinarang Application",
"listings.applicationsClosedRedirect": "Ang listahang ito ay hindi na tumatanggap ng mga aplikasyon.",
"listings.applicationsClosedRedirect": "Naisumite na ang application na ito.",
"listings.apply.applicationWillBeAvailableOn": "Magiging available ang application para i-download at kunin sa %{openDate}",
"listings.apply.applyOnline": "Mag-apply Online",
"listings.apply.downloadApplication": "I-download ang Application",
Expand Down
3 changes: 2 additions & 1 deletion shared-helpers/src/locales/vi.json
Original file line number Diff line number Diff line change
Expand Up @@ -575,6 +575,7 @@
"listings.allUnits": "Tất cả các Căn nhà",
"listings.allUnitsReservedFor": "Tất cả các căn nhà được dành cho %{type}",
"listings.annualIncome": "%{income} mỗi năm",
"listings.applicationAlreadySubmitted": "Bạn đã nộp đơn đăng ký cho danh sách này.",
"listings.applicationDeadline": "Hạn nộp Đơn ghi danh",
"listings.applicationFCFS": "Ai Nộp đơn Trước Được Nhận trước",
"listings.applicationFee": "Lệ phí Ghi danh",
Expand All @@ -583,7 +584,7 @@
"listings.applicationPerApplicantAgeDescription": "mỗi ứng viên từ 18 tuổi trở lên",
"listings.applications": "Đơn đăng ký",
"listings.applicationsClosed": "Ngừng nhận Đơn ghi danh",
"listings.applicationsClosedRedirect": "Danh sách này không còn chấp nhận các ứng dụng.",
"listings.applicationsClosedRedirect": "Đơn này đã được nộp rồi.",
"listings.apply.applicationWillBeAvailableOn": "Đơn ghi danh sẽ có sẵn để tải xuống và tới nhận vào %{openDate}",
"listings.apply.applyOnline": "Ghi danh Trực tuyến",
"listings.apply.downloadApplication": "Tải xuống Đơn ghi danh",
Expand Down
3 changes: 2 additions & 1 deletion shared-helpers/src/locales/zh.json
Original file line number Diff line number Diff line change
Expand Up @@ -575,6 +575,7 @@
"listings.allUnits": "所有單位",
"listings.allUnitsReservedFor": "保留給 %{type} 的所有單位",
"listings.annualIncome": "每年 %{income}",
"listings.applicationAlreadySubmitted": "您已經提交了此清單的申請。",
"listings.applicationDeadline": "申請截止日期",
"listings.applicationFCFS": "先申請先服務",
"listings.applicationFee": "申請費",
Expand All @@ -583,7 +584,7 @@
"listings.applicationPerApplicantAgeDescription": "每位年滿 18 歲的申請人",
"listings.applications": "申請",
"listings.applicationsClosed": "申請期限已經結束",
"listings.applicationsClosedRedirect": "此房源不再接受申请",
"listings.applicationsClosedRedirect": "此申請已經提交",
"listings.apply.applicationWillBeAvailableOn": "申請表將可供下載,亦可在 %{openDate} 領取",
"listings.apply.applyOnline": "線上申請",
"listings.apply.downloadApplication": "下載申請表",
Expand Down
91 changes: 53 additions & 38 deletions sites/public/src/pages/applications/review/terms.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import {
pushGtmEvent,
AuthContext,
listingSectionQuestions,
useToastyRef,
} from "@bloom-housing/shared-helpers"
import FormsLayout from "../../../layouts/forms"
import { useFormConductor } from "../../../lib/hooks"
Expand All @@ -27,6 +28,7 @@ const ApplicationTerms = () => {
const router = useRouter()
const { conductor, application, listing } = useFormConductor("terms")
const { applicationsService, profile } = useContext(AuthContext)
const toastyRef = useToastyRef()
const [apiError, setApiError] = useState(false)
const [submitting, setSubmitting] = useState(false)

Expand All @@ -42,47 +44,50 @@ const ApplicationTerms = () => {
// eslint-disable-next-line @typescript-eslint/unbound-method
const { register, handleSubmit, errors } = useForm()
const onSubmit = (data) => {
setSubmitting(true)
const acceptedTerms = data.agree === "agree"
conductor.currentStep.save({ acceptedTerms })
application.acceptedTerms = acceptedTerms
application.completedSections = 6
// blocks multiple clicks and previously submitted applications
if (!submitting && !application.confirmationCode) {
setSubmitting(true)
const acceptedTerms = data.agree === "agree"
conductor.currentStep.save({ acceptedTerms })
application.acceptedTerms = acceptedTerms
application.completedSections = 6

if (application?.programs?.length) {
untranslateMultiselectQuestion(application.programs, listing)
}
if (application?.preferences?.length) {
untranslateMultiselectQuestion(application.preferences, listing)
}
if (application?.programs?.length) {
untranslateMultiselectQuestion(application.programs, listing)
}
if (application?.preferences?.length) {
untranslateMultiselectQuestion(application.preferences, listing)
}

applicationsService
.submit({
body: {
...application,
reviewStatus: ApplicationReviewStatusEnum.pending,
listings: {
id: listing.id,
},
appUrl: window.location.origin,
...(profile && {
user: {
id: profile.id,
applicationsService
.submit({
body: {
...application,
reviewStatus: ApplicationReviewStatusEnum.pending,
listings: {
id: listing.id,
},
}),
// TODO remove this once this call is changed to the new backend
},
})
.then((result) => {
conductor.currentStep.save({ confirmationCode: result.confirmationCode })
return router.push("/applications/review/confirmation")
})
.catch((err) => {
setSubmitting(false)
setApiError(true)
window.scrollTo(0, 0)
console.error(`Error creating application: ${err}`)
throw err
})
appUrl: window.location.origin,
...(profile && {
user: {
id: profile.id,
},
}),
// TODO remove this once this call is changed to the new backend
},
})
.then((result) => {
conductor.currentStep.save({ confirmationCode: result.confirmationCode })
return router.push("/applications/review/confirmation")
})
.catch((err) => {
setSubmitting(false)
setApiError(true)
window.scrollTo(0, 0)
console.error(`Error creating application: ${err}`)
throw err
})
}
}

const agreeField = [
Expand Down Expand Up @@ -111,6 +116,16 @@ const ApplicationTerms = () => {
}
}, [listing])

useEffect(() => {
if (application.confirmationCode && router.isReady) {
const { addToast } = toastyRef.current
addToast(t("listings.applicationAlreadySubmitted"), { variant: "alert" })
profile
? void router.push(`/${router.locale}/account/applications`)
: void router.push(`/${router.locale}/listing/${listing.id}/${listing.urlSlug}`)
}
}, [application, listing, profile, router, toastyRef])

useEffect(() => {
pushGtmEvent<PageView>({
event: "pageView",
Expand Down

0 comments on commit 07eb52d

Please sign in to comment.