An offline-first PWA for managing campus events, built with with React 19, TypeScript, and Vite. Events Persist locally via IndexedDB, so the app works with no network.
- Clean architecture a Repository pattern behind a
RepositoryContractinterface keeps the domain model fully decoupled from storage (swap IndexedDB in one file). - Offline-first PWA service worker + IndexedDB; degrades gracefully offline, informing users.
- Encapsulated domain model with private fields and self-validating invariants.
- Tested, test driven development (TDD) using Jest + React Testing Library; the domain model and repository layers are covered to 75-100%.
JavaScript - React 19 - TypeScript - Vite - TailwindCSS 4 - IndexedDB - Jest - ESLint - Prettier
npm install
npm run dev # http://localhost:5173
npm test # unit + component tests
npm run build # type-check + production build-
Repository Pattern: The Repository Pattern is an architectural pattern that separates the business logic from the data access layer. It provides an abstraction layer for data access, allowing the business logic to be decoupled from the specific storage implementation.
-
Dependency Injection: Dependency Injection is a design pattern that allows components to be loosely coupled and easily testable. It involves injecting dependencies into a component rather than hardcoding them.
-
Asynchronous Persistence: Asynchronous persistence refers to the use of asynchronous operations to persist data. In this project, IndexedDB is used to store events, and the repository layer handles the asynchronous operations required by IndexedDB.
