I did not change a lot of back-end as I was implementing my frontend. The only change I did was changing the query for the GET requests: /api/books/search and /api/book so that it got the authors' name and also sort by the book title in ascending order.
The current code relies on server side validation, as the backend processes the data, checks for errors, and returns the appropriate messages. Having server side validation ensures security, centralized validation logic, and data context awareness. The cons of this is that it's slower feedback, increased server load, and potentially poor UX.
In my frontend code, I only used the UseEffect hook. One of the things that I struggled a little with was the trigger for the hook. Figuring how and when it went off took some time. The UseEffect hook was also used in our activity and so I was referencing that code a little bit for understanding.
I did not resort to using any. Using types in the frontend felt interesting. Looking through the code, I realized there weren't a lot of places where I used types. The setup felt time-consuming and I definitely think there's a learning curve to fully leverage TypeScript (which I know I'm not doing).
I think I enjoyed writing an SPA front-end with React compared to writing a MPA front-end. Maybe it's because we're using React and everything is just a little simpler because of it. SPA front-end with React does have its challenging concepts like state management and virtual DOM but there is more customizability. Writing an MPA in CS375 felt very limited (when I was learning it since my group used React for the class project). It was definitely simpler in terms of its traditional model with it following the request-response cycle with server-side templates generating HTML. Overall, I do enjoy something like this.
//edit: after reading 4b, it seems like MPAs are, on average, better. I actually don't know which I like...