high priority low complexity frontend pending frontend specialist Tier 1

Acceptance Criteria

Organisation logo is displayed using an asset or network image sourced from the organisation record; a fallback placeholder renders if the logo URL is null or fails to load
Brand colors applied to the screen header or accent elements are read exclusively from the design token system — no hardcoded hex values in widget code
Welcome heading text is in Norwegian Bokmål (nb_NO) and uses Flutter's localization mechanism (AppLocalizations or equivalent)
Organisation name is dynamically inserted into the welcome copy from the validated referral token's linked organisation record (fetched via Riverpod provider)
If organisation name cannot be resolved, a graceful fallback string (e.g. 'din organisasjon') is shown — no empty string or null displayed to user
Text is rendered with the design token typography scale (font family, size, weight) — no hardcoded TextStyle values
Logo image respects device pixel ratio (uses correct resolution asset or cached network image)
Screen passes visual inspection on both iOS and Android at 375dp and 390dp viewport widths

Technical Requirements

frameworks
Flutter
Riverpod
flutter_localizations
apis
Supabase PostgREST (organisation name/logo fetch by org_id from referral token)
data models
contact
assignment
performance requirements
Organisation logo loads within 1.5 seconds; cached_network_image used to avoid redundant fetches
Localisation strings resolved synchronously from compiled ARB — no async delay
security requirements
Organisation logo URL fetched from Supabase Storage signed URL — not a raw public URL if org logo is in a private bucket
Organisation name displayed without HTML rendering to prevent injection
ui components
OrgLogoWidget
WelcomeHeadingWidget
NewMemberOnboardingScreen

Execution Context

Execution Tier
Tier 1

Tier 1 - 540 tasks

Can start after Tier 0 completes

Implementation Notes

Source the design tokens from the existing token system (AppColors, AppTypography constants) — do not create new constants. Use CachedNetworkImage (or equivalent) for the org logo with a CircleAvatar/placeholder fallback. The org data (name, logo URL) should be fetched in the same Riverpod provider that validated the referral token, or as a dependent provider watching the validated token state, to avoid a second async waterfall. ARB key naming: welcome_message_with_org (parameterised with orgName).

Ensure the Flutter localization delegate is registered in the app's MaterialApp.

Testing Requirements

Widget test with mocked Riverpod providers for three scenarios: org with logo + name, org with name only (null logo), and unresolvable org (fallback copy). Verify correct ARB key is used for nb_NO locale. Golden test the welcome section layout at 375dp width to catch unintended regressions. Test that no hardcoded colors appear using a lint rule or code review checklist.

Component
New Member Onboarding Screen
ui medium
Epic Risks (3)
medium impact medium prob technical

QR codes rendered at the minimum 200×200 size may fail to scan under typical indoor lighting conditions on older or lower-resolution phone cameras, causing recruitment moments to fail when a peer mentor shows the screen to a prospective member.

Mitigation & Contingency

Mitigation: Set the default QR render size to 260×260 logical pixels (not the 200px minimum) and apply a high-contrast white module background. Test scan reliability on at minimum three physical devices (budget Android, mid-range Android, iPhone SE) before marking the screen as done.

Contingency: If scan reliability remains an issue, add a 'Enlarge QR' full-screen mode triggered by tapping the code, and ensure the text referral URL with copy-to-clipboard is always visible as a fallback sharing method.

high impact medium prob integration

The onboarding screen submits attribution and then hands off to an external membership registration URL (HLF's Dynamics portal or similar). If the external URL is unavailable, changes its format, or requires authentication the new member does not have, the conversion funnel is broken at its final step.

Mitigation & Contingency

Mitigation: Confirm the external registration URL and its expected query parameters with HLF's portal team before implementing the handoff. Record the pending_signup attribution event before launching the URL so data is not lost if the external site fails. Display a fallback message with contact information if the URL launch fails.

Contingency: If the external membership URL is not available at feature launch, implement a temporary form that collects name and email and stores a pending_member record in Supabase, allowing coordinators to manually complete registration while the integration is finalised.

low impact medium prob integration

Embedding the RecruitmentStatsWidget on the peer mentor home screen may conflict with existing layout components (activity summary, badge shelf), causing overflow or requiring a redesign of the home screen that is outside this epic's scope.

Mitigation & Contingency

Mitigation: Design the widget as a horizontally constrained card with a maximum height of 96dp so it can be inserted into any vertical list without overflow. Coordinate with the home screen's existing layout owners before starting the embedding task.

Contingency: If home screen embedding creates unacceptable layout conflicts, defer embedding to a separate home-screen redesign task and make the widget accessible only via the dedicated ReferralCodeScreen for the initial release.