Skip to content

YeboIDUser Model

The YeboIDUser class represents an authenticated user with their profile data and KYC status.

Properties

PropertyTypeDescription
idStringUnique YeboID user identifier (UUID)
phoneStringUser's phone number (primary identifier)
nameString?User's display name
emailString?Email address (optional)
avatarUrlString?Profile avatar URL
kycStatusKycStatusKYC verification status
kycCountryString?Country from KYC verification
kycBirthdayString?Date of birth (YYYY-MM-DD)
kycVerifiedAtDateTime?When user was KYC verified
createdAtDateTimeWhen user account was created

Computed Properties

PropertyTypeDescription
isVerifiedboolTrue if KYC status is verified
isPendingVerificationboolTrue if KYC is pending
displayNameStringName or formatted phone
firstNameString?First name (if available)

KycStatus Enum

dart
enum KycStatus {
  none,      // Not verified
  pending,   // Verification in progress
  verified,  // Successfully verified
  rejected,  // Verification rejected
}

Usage Examples

Accessing User Data

dart
final user = context.yeboIdUser;

if (user != null) {
  print('ID: ${user.id}');
  print('Phone: ${user.phone}');
  print('Name: ${user.displayName}');
  print('Verified: ${user.isVerified}');
}

Checking Verification Status

dart
final user = context.yeboIdUser;

if (user == null) {
  return LoginScreen();
}

if (user.isPendingVerification) {
  return VerificationPendingScreen();
}

if (!user.isVerified) {
  return VerificationPromptScreen();
}

return HomeScreen(user: user);

Displaying User Info

dart
Widget buildUserInfo(YeboIDUser user) {
  return Column(
    children: [
      Text(user.displayName),
      Text(user.phone),
      if (user.email != null) Text(user.email!),
      if (user.isVerified) ...[
        Icon(Icons.verified, color: Colors.green),
        if (user.kycCountry != null) Text('Country: ${user.kycCountry}'),
      ],
    ],
  );
}

JSON Serialization

From JSON

dart
final user = YeboIDUser.fromJson({
  'id': 'usr_abc123',
  'phone': '+26878422613',
  'name': 'John Doe',
  'email': '[email protected]',
  'avatar_url': 'https://api.yeboid.com/avatars/usr_abc123.jpg',
  'kyc_status': 'VERIFIED',
  'kyc_country': 'SZ',
  'kyc_birthday': '1990-05-15',
  'kyc_verified_at': '2024-01-15T10:30:00Z',
  'created_at': '2023-06-01T08:00:00Z',
});

To JSON

dart
final json = user.toJson();
// {
//   'id': 'usr_abc123',
//   'phone': '+26878422613',
//   'name': 'John Doe',
//   ...
// }

copyWith

Create a modified copy of the user:

dart
final updatedUser = user.copyWith(
  name: 'Jane Doe',
  kycStatus: KycStatus.verified,
);

Display Name Logic

The displayName property returns:

  1. User's name if available
  2. Formatted phone number if no name
dart
// With name:
// user.name = "John Doe"
// user.displayName → "John Doe"

// Without name:
// user.phone = "+26878422613"
// user.displayName → "+268 7842 2613"

First Name

Extracts the first name from full name:

dart
// user.name = "John Doe"
// user.firstName → "John"

// user.name = "Alice"
// user.firstName → "Alice"

// user.name = null
// user.firstName → null

OAuth Claims Mapping

When created from OAuth userinfo response:

OAuth ClaimYeboIDUser Property
subid
phone / phone_numberphone
namename
emailemail
picture / avatar_urlavatarUrl
kyc_status / kycStatuskycStatus
kyc_country / kycCountrykycCountry
kyc_birthday / kycBirthdaykycBirthday
kyc_verified_at / kycVerifiedAtkycVerifiedAt
created_at / createdAtcreatedAt

Complete Example

dart
import 'package:flutter/material.dart';
import 'package:yeboid_flutter/yeboid_flutter.dart';

class UserProfileWidget extends StatelessWidget {
  final YeboIDUser user;

  const UserProfileWidget({required this.user, super.key});

  @override
  Widget build(BuildContext context) {
    return Card(
      color: const Color(0xFF1A1A2E),
      child: Padding(
        padding: const EdgeInsets.all(16),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            // Header
            Row(
              children: [
                YeboIDAvatar(user: user, size: 56),
                const SizedBox(width: 16),
                Expanded(
                  child: Column(
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: [
                      Text(
                        user.displayName,
                        style: const TextStyle(
                          color: Colors.white,
                          fontSize: 18,
                          fontWeight: FontWeight.bold,
                        ),
                      ),
                      Text(
                        user.phone,
                        style: const TextStyle(color: Colors.white70),
                      ),
                    ],
                  ),
                ),
              ],
            ),
            
            const SizedBox(height: 16),
            const Divider(color: Colors.white24),
            const SizedBox(height: 16),
            
            // Details
            _buildRow('User ID', user.id),
            if (user.email != null) _buildRow('Email', user.email!),
            _buildRow('Status', _getStatusText(user.kycStatus)),
            if (user.kycCountry != null) _buildRow('Country', user.kycCountry!),
            if (user.kycVerifiedAt != null) 
              _buildRow('Verified', _formatDate(user.kycVerifiedAt!)),
            _buildRow('Member since', _formatDate(user.createdAt)),
          ],
        ),
      ),
    );
  }

  Widget _buildRow(String label, String value) {
    return Padding(
      padding: const EdgeInsets.symmetric(vertical: 4),
      child: Row(
        mainAxisAlignment: MainAxisAlignment.spaceBetween,
        children: [
          Text(label, style: const TextStyle(color: Colors.white54)),
          Text(value, style: const TextStyle(color: Colors.white)),
        ],
      ),
    );
  }

  String _getStatusText(KycStatus status) {
    switch (status) {
      case KycStatus.verified:
        return '✅ Verified';
      case KycStatus.pending:
        return '⏳ Pending';
      case KycStatus.rejected:
        return '❌ Rejected';
      case KycStatus.none:
        return '⚪ Not verified';
    }
  }

  String _formatDate(DateTime date) {
    return '${date.day}/${date.month}/${date.year}';
  }
}

Universal Authentication for Africa