Selfie Plus: Loyalty Program Mobile App

Client

PT Intinya Technologi

My Role

Mobile App Owner (React Native)

Duration

July 2025 - Present

Tech Stack

React Native 0.79.6 (React 19), TypeScript, TanStack Query v5, Redux Toolkit + Persist, NativeWind, Firebase (FCM + Crashlytics), Notifee

Key Features

Auth + onboarding, points wallet, voucher marketplace + QR redemption, transaction gallery (download + share), queue monitoring, push + local notifications, feeds (news/IG/blog/YT), product catalog

Selfie Plus App Screenshot

Project Overview

Selfie Plus is a membership and loyalty mobile app for Selfie Time. It connects real-world outlet activity (transactions, queueing, photo delivery) with loyalty mechanics (points and vouchers) and engagement loops (feeds, reminders, and limited-time mini games).

The app is built with React Native 0.79.6 + React 19 and ships to both Android and iOS. Data fetching uses TanStack Query (v5) on top of an Axios client with auth handling; global app state uses Redux Toolkit with persisted user session.

At PT Intinya Technologi, I own the Selfie Time mobile application end to end: product delivery, architecture decisions, release readiness, and critical feature implementation.

Business Flows (End-to-End)

  • Authentication & onboarding: email/password login, social login (Google; Apple on iOS; Facebook flow exists), OTP/email verification, then profile completion gating (e.g., DOB) before entering the main app.
  • Loyalty wallet: users have a points balance; balance refresh is integrated into user/profile workflows.
  • Voucher marketplace: browse redeemable vouchers (infinite list), view detail, and redeem with points; users then manage "My Vouchers" and redeem in-store using QR.
  • Transactions: transaction history and detail, including paid items, status, and a photo/video gallery delivered from sessions.
  • Queueing: users with active sessions receive live queue status polling; the app surfaces an always-on queue monitor when your turn is close.
  • Engagement: news feed, Instagram feed, blog, YouTube viewer, plus a seasonal mini-game (THR Catcher) that can grant bonus points with a server-side daily claim limit.

Key Features

Vouchers + QR Redemption

Users can redeem vouchers with points, then present a QR code in outlet for redemption. Voucher detail supports rules and restrictions (valid dates, outlet/product/day constraints) and gracefully handles expired/used states.

Transaction Gallery

Transaction detail aggregates session metadata and gallery items (photos + videos). Users can preview, download to device, and open a web-based "unlock photos" flow when needed.

Queue Monitoring

The app polls queue status (per-user, per-outlet session) and shows a floating, dismissible monitor when the turn is near; it triggers haptics/vibration when the order becomes 1.

Share to Instagram Stories

From the gallery, users can share an image to Instagram Stories. The flow downloads the remote image, composes a branded 1080x1920 story image with a frame, then launches Instagram Stories sharing with platform-specific handling and cleanup.

THR Catcher Mini-Game

A seasonal, gamified campaign: users play a 3-level catching game and can claim a points reward upon completion. The claim flow is enforced server-side (max 1 reward per day) while the client handles the game loop, UI, and reward submission.

Content Feeds

In-app content distribution surfaces updates via news feed, Instagram feed, blog detail, and YouTube viewer screens to keep members engaged between visits.

Architecture (How It Works)

The app uses React Navigation (native stack + bottom tabs) with deep linking (custom scheme) for notifications and marketing links. Most server communication goes through a single Axios client that injects a bearer token and triggers a safe logout on 401/Unauthenticated.

  • State: Redux Toolkit for app/global state; Redux Persist keeps the authenticated user session across restarts.
  • Data: TanStack Query v5 for queries, infinite lists, and mutations; sensible defaults (retry + caching) configured at app root.
  • Networking: Axios client under `/api` with auth header injection and centralized 401 handling.
  • UI: NativeWind (Tailwind for React Native) plus reusable UI primitives (buttons, inputs, modals) and custom tab bar.
  • Reliability: Error boundary + global error handler with Firebase Crashlytics (production) for crash capture.

Notifications & Deep Linking

  • Push notifications: Firebase Cloud Messaging; foreground and background handlers display notifications via Notifee.
  • Local notifications: scheduled voucher expiry reminders (1, 7, 14 days before expiration) using timestamp triggers.
  • Deep links: notification payloads can include a `link` field; when pressed, the app opens the deep link and routes the user to the correct screen.

Technical Challenges & Solutions

React Native Upgrade + 16KB Page Size Compliance

Migrated the app across multiple major React Native versions to React Native 0.79.6 + React 19, modernizing Android build tooling for upcoming Play Store 16KB page size requirements.

  • Android: AGP 8.6, JDK 17, SDK 35, NDK 27.x, Hermes
  • Enabled New Architecture (TurboModules + Fabric) and Bridgeless mode
  • Implementing support for Android 16KB page sizes
  • Used patch-package to keep critical third-party libraries working during upgrades

Instagram Stories Sharing (Anti-Crop + Cross-Platform)

Built a deterministic share pipeline for Instagram Stories that is reliable on both platforms.

  • Downloads remote images to local cache first for stable processing
  • Composes a branded story image at 1080x1920 using ViewShot and tuned transforms (scale/rotate) to avoid unwanted cropping
  • Uses Instagram Stories share integration with platform-specific behaviors (Android FileProvider/content URIs; iOS scheme checks)
  • Cleans up temporary files after share to avoid cache bloat

Performance Optimization

Enhanced app performance through:

  • Efficient image loading/caching and thumbnail handling for media heavy screens
  • Stabilizing navigation and background handlers to reduce UI jank
  • Using TanStack Query caching + infinite queries for long lists (vouchers, transactions)
  • Avoiding repeated side effects with explicit "run once" guards for profile fetch and push token registration

Type Safety Implementation

Improved code quality and maintainability by:

  • Migrating key components from JavaScript to TypeScript
  • Implementing comprehensive type definitions for API responses and state management
  • Creating reusable typed custom hooks for common functionality
  • Establishing type-safe patterns for component props and state management

Results & Impact

The Selfie Plus app has delivered significant value to both users and the business:

  • Modernized React Native stack (0.79.6 + React 19) and Android build toolchain to meet upcoming platform requirements
  • Shipped media-heavy transaction gallery flows (images + videos) with download and sharing capabilities
  • Improved engagement loops with notifications, feed content, and queue monitoring
  • Increased maintainability via typed hooks, centralized networking, and consistent state/data boundaries
  • Created a platform-ready application compliant with the latest Android and iOS requirements

My Key Contributions

  • Delivered the end-to-end Instagram Stories sharing pipeline (download -> compose -> share -> cleanup)
  • Led major framework/tooling upgrades (React Native 0.79.6, New Architecture, Bridgeless mode, Android build modernization)
  • Implemented 16KB page size readiness work and coordinated related dependency migrations
  • Migrated/typed key flows and hooks to improve type safety and reduce runtime errors
  • Improved reliability of push + local notifications (FCM + Notifee) including deep link handling
  • Created reusable components and custom hooks for common functionality
  • Implemented comprehensive error handling and logging for development and production environments