Book Club Kit Reservation System

GitHub repo

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

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.

Form with fields for creating a new kit record

Form with fields for creating a new kit record

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.

A table displaying all kit records in the system, with tools for searching, sorting and filtering.

The staff view of the collection is a table that allows searching, sorting and filtering.

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.

A list of the items in the collection and their details.

The patron view of the collection is a list of each kit’s details.

A list of the items in the collection and their details on the smaller screen of a mobile device.

The collection list on mobile.

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.

An alert displays when the user chooses a start checkout date that would mean a conflicting checkout period with existing reservations.

An alert displays when a chosen checkout period conflicts with existing reservations.

An existing reservation displays on the calendar in gray and the user-chosen reservation displays in purple.

An existing reservation displays on the calendar in gray and the user-chosen reservation displays in purple.

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.

A table showing all reservations in the system.

Staff can view a table of all reservations, which can be searched, sorted and filtered.

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.