Features
This page covers the member-facing features of the Association App: Profile, Events, Payments, Notifications, and supporting content features.
Authentication
Screens
| Screen | Route | Description |
|---|---|---|
| Splash | Splash | Checks token validity; routes to Home or Onboarding |
| Onboarding | Onboarding | First-launch walkthrough (shown once) |
| Login | Login | Email + password login |
| Forgot Password | ForgotPassword | Sends reset email |
| Sign-Up Request | SignUpRequest | Members request an account from the admin |
| Register | Register(code) | Completes registration via invitation code |
| Set Password | SetPassword(token, email, firstName, lastName) | Set initial password after invitation |
| Invitation | Invitation(code) | Processes deep-linked invitation URLs |
Flow
App launch
├── Token valid → Home
└── No token / expired
├── Onboarding (first launch)
└── Login
├── Success → fetch user + branding → Home
└── New member → deep link → Register / SetPassword
Organisation selection
After login, members who belong to multiple organisations see the Organisation Selection screen (OrganizationSelection) to pick their active context. Single-org members are routed directly to Home.
Profile
Screens: ProfileScreen, EditProfileScreen, AccountSettingsScreen, ChangePasswordScreen, UpdateEmailScreen, AboutScreen, LegalPageDetailScreen, ContactUsScreen
What members can do
| Action | Screen |
|---|---|
| View profile (name, email, organisation role) | Profile |
| Update display name, phone, address | Edit Profile |
| Change password | Change Password |
| Update email address | Update Email |
| View app version and build info | About |
| Read Terms of Service / Privacy Policy | Legal Page Detail |
| Send a message to the association | Contact Us |
| Log out | Account Settings |
| Delete account | Account Settings |
Edit Profile
The form uses React Hook Form–style validation within Compose:
- First name and Last name — required, max 50 chars
- Phone — optional, validated format
- Address — optional multi-line field
- Profile photo upload (handled by
ProfileRepository)
Changes are sent to the backend via PATCH /api/v1/profile and the local user state is updated in the ViewModel on success.
Account Settings
Provides access to destructive actions (log out, delete account) with confirmation dialogs. On logout, all KVault keys are cleared and the user is routed to the Login screen.
Events
Screens: EventsScreen, EventDetailScreen
Route: Bottom nav → Events tab → EventDetail(eventId)
Events list
The events list displays upcoming events in a calendar view grouped by date. Members can filter by:
- All events
- Upcoming (future events only)
- My registrations
Each event card shows: cover image, title, date/time, location type (in-person / virtual), and registration status.
Event detail
The event detail screen shows full event information:
| Field | Description |
|---|---|
| Title & description | Rich text rendered from HTML |
| Date & time | Start/end with timezone |
| Location | Venue name + address, or virtual meeting link |
| Capacity | Max attendees (if set) |
| Pricing | Free / Paid — base price, member price, early-bird price |
| Registration status | Open / Closed / Pending approval / Attending |
RSVP & Registration
Members can respond to an event with one of three intents:
| Response | EventResponseType |
|---|---|
| Attending | ATTENDING |
| Interested | INTERESTED |
| Not attending | NOT_INTERESTED |
If the event requires admin approval, the member's status shows as Pending until an admin approves or rejects it.
For paid events, tapping RSVP initiates the payment flow (see Payments below).
Event types supported
| Field value | Meaning |
|---|---|
IN_PERSON | Physical venue |
VIRTUAL | Online meeting link |
HYBRID | Both in-person and virtual |
Payments
Payments are tied to paid event registrations. There is no standalone payments screen — the payment flow is triggered from the Event Detail screen when a member taps RSVP on a paid event.
Payment flow
Event Detail → RSVP → Paid event detected
↓
Payment summary (event title, price tier, currency)
↓
Member confirms → backend creates registration + invoice
↓
Invoice sent to member's email
↓
Payment recorded by admin in Admin UI (manual reconciliation)
Pricing tiers
Events can offer up to three prices:
| Tier | Field | When applied |
|---|---|---|
| Standard | basePrice | Default for all members |
| Member price | memberPrice | For members in good standing |
| Early bird | earlyBirdPrice | Until an early-bird cut-off date |
The backend determines which price applies based on the member's status and registration date.
Invoice notifications
When an invoice is created, a push notification of type PAYMENT_INVOICE_CREATED is sent. The notification links directly to the event detail or a payment reference email.
In-app payment processing (credit card, bank transfer) is handled by the backend's payment gateway integration. The mobile app displays pricing and initiates registration; it does not process card details directly.
Notifications
Screen: NotificationsScreen
Route: Bottom nav → Notifications tab
Push notification setup
| Platform | Channel |
|---|---|
| Android | Firebase Cloud Messaging (FCM) |
| iOS | Apple Push Notification service (APNs) via Firebase |
On first launch, the app requests notification permission using Moko Permissions (shows a native permission dialog). If granted, the FCM/APNs token is synced to the backend so the server can deliver targeted notifications.
The token is refreshed automatically and re-synced on each login.
In-app notification list
The notifications screen fetches all notifications for the authenticated member. Each item shows:
- Title and message body
- Priority badge (High / Normal / Low)
- Timestamp
- Deep link action (tap to navigate to the related resource)
Notification types
| Category | Types |
|---|---|
| Membership | MEMBERSHIP_EXPIRY_REMINDER, MEMBERSHIP_RENEWED, MEMBERSHIP_APPROVED, MEMBERSHIP_SUSPENDED, MEMBERSHIP_CANCELLED |
| Events | EVENT_REMINDER, EVENT_REGISTRATION_CONFIRMED, EVENT_REGISTRATION_APPROVED, EVENT_REGISTRATION_REJECTED, EVENT_UPDATED, EVENT_CANCELLED |
| Payments | PAYMENT_INVOICE_CREATED, PAYMENT_OVERDUE, PAYMENT_RECEIVED |
| Content | NEWS_PUBLISHED, DOCUMENT_ADDED, COMMENT_RECEIVED |
| System | SYSTEM_ANNOUNCEMENT, SYSTEM_MAINTENANCE |
Notification priorities
| Priority | Behaviour |
|---|---|
HIGH | Delivered immediately; shown in Android heads-up; iOS critical alert |
NORMAL | Standard delivery |
LOW | Batched and delivered when convenient |
Deep linking from notifications
Tapping a push notification opens the app and navigates to the relevant screen:
| Notification type | Destination |
|---|---|
| Event reminder / update | EventDetail(eventId) |
| News published | NewsDetail(slug) |
| Document added | DocumentsBrowser |
| Membership / payment | AccountSettings or external payment link |
News
Screens: NewsScreen, NewsDetailScreen
Route: Bottom nav → News tab → NewsDetail(slug)
Members browse organisation news articles. The list is sorted by publish date (newest first). The detail screen renders the full article body as rich text (HTML from the backend).
Documents
Screens: DocumentsScreen, DocumentsBrowserScreen, GovernanceScreen, GuidanceScreen, PdfViewerScreen
Route: Home → Documents section → PdfViewer(id, title)
Members can access and read organisation documents. PDFs are rendered in-app using the pdfmp-compose PDF viewer library. Documents are organised into categories:
- Documents — general repository
- Governance — constitutional and policy documents
- Guidance — how-to guides and reference material
Members Directory
Screen: MembersScreen
Route: Home → Members
Displays the association's member directory. Each entry shows the member's name and any publicly visible profile details. The directory is filtered to the member's active organisation.