Great work! I really like how you use both a red notification and an alert when a duplicate name is used. I also really like the additional formatting you use in the appointments tilelist. That makes it a little easier to understand what you are looking at.
One thing I noticed is that the ContactPicker input in your AppointmentForm component doesn’t update after each submission even though you are using the setContact hook in your AppointmentPage component. You should be able to fix that by passing in the contact state to your ContactPicker component/select input as the value.