Book Club Kit Reservation System
This project focused on creating an app that would allow public libraries to show book clubs what titles they offer as kits and allow people to reserve kits for specific periods up to a year in advance.
- Why I chose this project
- Software design process
- Challenges faced
- Lessons learned
- Future development ideas
Why I chose this project
Public libraries commonly bundle together multiple copies of the same book, along with a discussion guide, into kits targeted toward local book clubs. This type of offering doesn’t integrate well with existing library catalogs: In the catalog, when patrons put a hold on an item, they must wait their turn in the queue. So when, exactly, the patron will get that item is uncertain.
This conflicts with the book clubs’ operate. Club members need those books in the period leading up to the date they’ve scheduled to discuss that title.
In addition, libraries have few options when it comes to reservation software for managing kits,There’s only one vendor I know who specifically offers kit reservation software for public libraries.
For my project, I built my own basic version to better understand the workflows required for a system like this. The app has different interfaces for patrons and staff members: Patrons can view their library’s book club kits and availability as well as place reservations up to a year in advance for the set checkout period (in this case, three weeks). When logged in, patrons can also see a record of their past and current reservations. Staff can create records for new book club kits. They can view, search and filter through all kit records and patron reservations.
Software design process
Initiation
I first met with a public library colleague who deals with the library’s book club kits to discuss the state of kit-related software in the library sphere. This is where I learned how there’s really only one vendor who specifically offers kit reservation software (whether for book clubs kits or items packaged together for other purposes) for public libraries.
Planning
I researched the lone existing software system geared toward public libraries for managing kit reservations, as well as two other lending reservation systems meant for more general, mainstream use. I assembled a list of requirements based on my knowledge of library needs and workflows and organized them into tiers, from critical to wish list.
Execution
Based on the requirements, I implemented the app, first starting with a skeleton that allowed for user account creation and login. User accounts were saved to Firebase.
I fleshed the skeleton out on the staff side, creating a form for creating book club kit records that saved to Firebase.
Once these records could be retrieved from Firebase and displayed on the app, I reviewed different software packages for displaying data as a table before choosing one that gave staff a robust view of the records, allowing them to search, sort and filter, to allow for quick location of records.
The patron’s view of the collection, on the other hand, was more text-based to allow for browsing and more user-friendly review of each kit’s details.
Next, I moved on to the calendar functionality. Similarly, I tried different calendar libraries until settling on one that met the project’s needs. This required also adding a library for date-handling.
The final step, now that creating reservations was possible, was displaying all reservations as a table in the staff view and, for patrons, filtering the table to show only the patron’s own reservations.
Technical details
- App built with JavaScript and React Native framework.
- User and collection data stored in Firebase.
- Reservations compiled as JSON objects containing dates and calendar formatting for all 21 days of checkout, plus patron info. This is appended to an array attached to the book’s entry in Firebase.
- Packages useful to the project’s implementation:
Challenges faced
The biggest challenge for me on this project was implementing the calendar functionality, as it required figuring out a number of tasks, including how to:
- Dynamically generate dates
- Ensure a requested reservation didn’t conflict with an existing reservation
- Format the calendar view
- Correctly construct the JSON object holding reservation data.
This was wrapped up with the creation of a confirmation form to the patron displaying the kit’s book title and author, checkout date and due date and the patron’s contact info.
JSON object construction
Below is an example of how I constructed the JSON object for each kit record, which held both the kit details as well as reservations tied to the kit.
{
"ageGroup": "Juvenile",
"authorFirstName": "J.K.",
"authorLastName": "Rowling",
"genre": "Fiction",
"kitContents": "12 Books Total",
"location": "SC",
"reservations": [
{
dates: ["2021-12-06", "2021-12-07", "2021-12-08", ... "2021-12-26"]
patronEmail: "mail@mail.com"
patronFirstName: "Patron"
patronID: "123456789"
patronLastName: "Test"
patronPhone: "123-123-1234"
}
{
dates: ["2022-01-08", "2022-01-09", "2022-01-10", ... "2022-01-28"]
patronEmail: "mail2@mail.com"
patronFirstName: "Patron2"
patronID: "987654321"
patronLastName: "Test"
patronPhone: "234-567-8901"
}
],
synopsis: "Harry Potter learns he is a wizard."
title: "Harry Potter and the Sorcerer's Stone"
}
Lessons learned
I learned how to dynamically generate the data I needed for the reservation functionality, updating the page’s state with the new data and assembling it into a JSON object to be written to and retrieved from Firebase.
For example, this code pulled a reservation’s start date from Firebase and added calendar formatting for a three-week period to be displayed on the calendar of a book kit’s Schedule page.
// Generate object holding 21 days / 3 weeks' worth of dates with calendar formatting
const threeWeeks = (startDate) => {
const formattedDates = {};
const parsedStartDate = parseISO(startDate);
for (let i = 0; i < 21; i++) {
if (i === 0) {
formattedDates[startDate] = {
startingDay: true,
color: '#415CE0',
textColor: 'white'
};
} else if (i === 20) {
const date = convert(addDays(parsedStartDate, i));
formattedDates[date] = {
endingDay: true,
color: '#415CE0',
textColor: 'white'
};
} else {
const date = convert(addDays(parsedStartDate, i));
formattedDates[date] = { color: '#415CE0', textColor: 'white' };
}
}
return formattedDates;
}
I gained experience judging the pros and cons of the numerous code libraries available for use: Even though these code libraries saved time on having to create some features from scratch, I had to gauge whether they sufficiently served my needs:
- Could I get them to run in my app?
- Did they have the features I needed?
- Were they too simple or too complex?
- Did they have adequate documentation?
Future development ideas
- The ability to edit reservations once they are made.
- Ideally, reservation functionality should be directly integrated into a library’s catalog for maximum user-friendliness rather than siloed as a separate, non-connected app. This will be challenge; there are numerous library catalog software products used by libraries (although there are about 2-3 dominant providers), most of which are proprietary.
- The staff-side functionality needs to better support the administrative workflow: Libraries require windows of time before and after a kit is checked out for retrieval, processing, transit and, when needed, repair. The system should be able to account for and document these phases.
- Similarly, the staff-side reservation data should be made more detailed, providing information on a kit’s location as it travels through a library system and its status.
- A helpful addition to the app would be staff and patron email notifications and push alerts.