Back to projects
Laptop Harbor logo

Laptop Harbor

Laptop Harbor is a mobile app for purchasing laptops & related accessories.

Accomplishments

  • Built a cross-platform (Android, iOS, Web) laptop & accessories e-commerce app in Flutter/Dart using Provider for reactive state across four global controllers (AuthProvider, CartProvider, ProductProvider, WishlistProvider) injected via MultiProvider at the app root.
  • Implemented Firebase email/password authentication plus a forgot-password flow using Firebase Phone OTP with an international phone picker and SMS verify/resend.
  • Designed a per-user Firestore data model (users/{uid} with cart, wishlist, addresses, orders, reviews, notifications, and fcmTokens subcollections) secured with Firestore security rules scoped to request.auth.uid.
  • Built product discovery: category browsing (Laptop, Mouse, Keyboard, Charger, Bag), a search screen with price-range filtering, persistent recent searches, and randomized home suggestions.
  • Integrated the TechSpecs API (TechSpecsService) to enrich laptop products with detailed hardware specifications.
  • Implemented a persistent Firestore-backed shopping cart with quantity controls, add-to-cart from product details/search/wishlist, live cart badge counts, and consistent order totals (shipping ₦5000, tax ₦2000).
  • Added a per-user wishlist with add/remove toggles from product cards and details, category chip filters with counts, and inline search.
  • Built a product review system stored both per-product (products/{id}/reviews/{uid}) and mirrored per-user (users/{uid}/reviews/{id}), with star ratings, a "My Reviews" screen, star-rating filter chips, latest-first ordering, and a backfill step for legacy reviews.
  • Implemented saved shipping addresses per user (create/edit/delete, set default) and passed the selected address into checkout.
  • Integrated Paystack payments (flutter_paystack_plus) initiated from the order review screen; on success creates an immutable order snapshot (items, totals, shipping) in Firestore, clears the cart, and routes to order confirmation.
  • Built order management and package tracking: My Orders with chip filters and counts (All/Active/Completed/Cancelled), order details from the snapshot, and a tracking screen with delivery address and createdAt-based ETA (placed time +2h window, arrival on day 3).
  • Wrote a scheduled Firebase Cloud Function (dailyOrderStatusUpdate, runs 08:00 Africa/Lagos) that derives order status over time (processing → shipped → in_transit → delivered) and notifies users only when the status changes.
  • Delivered multi-channel order notifications gated by per-user preferences (emailNotificationsEnabled / appNotificationsEnabled): SMTP HTML emails via nodemailer, in-app Firestore notifications, and FCM push, including stale-token cleanup and app-side FCM token sync.
  • Built a support system: a support screen writes tickets to Firestore and an authenticated HTTPS Cloud Function (sendSupportEmail) verifies the Firebase ID token and relays the message via Gmail SMTP.
  • Added Cloudinary unsigned image upload for user profile photos, plus profile/settings/edit-password screens and dynamic profile stats.
  • Handled Nigerian localization: converted product prices to NGN, formatted currency with comma separators (no decimals), generated unique short product descriptions, and rendered category-specific specs.

Links

Skills used

DartFlutterFirebase AuthenticationCloud FirestoreFirebase Cloud Functions (Node.js)FCMPaystackCloudinaryTechSpecs APINodemailer/SMTPProvider

Status

Completed
Live
Has Users