refactor: update color definitions and improve UI component structure; handle null safety in repository data fetching

This commit is contained in:
Achintha Isuru
2026-03-17 13:20:04 -04:00
parent a0d5a18e6f
commit e83b8fff1c
13 changed files with 49 additions and 43 deletions

View File

@@ -245,7 +245,7 @@ class UiColors {
static const Color buttonPrimaryStill = primary; static const Color buttonPrimaryStill = primary;
/// Primary button hover (#082EB2) /// Primary button hover (#082EB2)
static const Color buttonPrimaryHover = Color(0xFF082EB2); static const Color buttonPrimaryHover = Color.fromARGB(255, 8, 46, 178);
/// Primary button inactive (#F1F3F5) /// Primary button inactive (#F1F3F5)
static const Color buttonPrimaryInactive = secondary; static const Color buttonPrimaryInactive = secondary;

View File

@@ -368,7 +368,6 @@ class UiTypography {
fontWeight: FontWeight.w400, fontWeight: FontWeight.w400,
fontSize: 12, fontSize: 12,
height: 1.5, height: 1.5,
letterSpacing: -0.1,
color: UiColors.textPrimary, color: UiColors.textPrimary,
); );

View File

@@ -67,39 +67,45 @@ class UiNoticeBanner extends StatelessWidget {
color: backgroundColor ?? UiColors.primary.withValues(alpha: 0.08), color: backgroundColor ?? UiColors.primary.withValues(alpha: 0.08),
borderRadius: borderRadius ?? UiConstants.radiusLg, borderRadius: borderRadius ?? UiConstants.radiusLg,
), ),
child: Row( child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[ children: <Widget>[
if (leading != null) ...<Widget>[ Row(
leading!, crossAxisAlignment: CrossAxisAlignment.start,
const SizedBox(width: UiConstants.space3), children: <Widget>[
] else if (icon != null) ...<Widget>[ if (leading != null) ...<Widget>[
Icon(icon, color: iconColor ?? UiColors.primary, size: 24), leading!,
const SizedBox(width: UiConstants.space3), const SizedBox(width: UiConstants.space3),
], ] else if (icon != null) ...<Widget>[
Expanded( Icon(icon, color: iconColor ?? UiColors.primary, size: 24),
child: Column( const SizedBox(width: UiConstants.space3),
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text( Text(
title, title,
style: UiTypography.body2b.copyWith(color: titleColor), style: UiTypography.body2b.copyWith(
), color: titleColor ?? UiColors.primary,
if (description != null) ...<Widget>[
const SizedBox(height: 2),
Text(
description!,
style: UiTypography.body3r.copyWith(
color: descriptionColor,
),
), ),
], ),
if (action != null) ...<Widget>[
const SizedBox(height: UiConstants.space2),
action!,
],
], ],
), ],
),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
if (description != null) ...<Widget>[
const SizedBox(height: UiConstants.space2),
Text(
description!,
style: UiTypography.body3r.copyWith(
//color: descriptionColor ?? UiColors.textSecondary,
color: descriptionColor ?? UiColors.primary,
),
),
],
if (action != null) ...<Widget>[
const SizedBox(height: UiConstants.space2),
action!,
],
],
), ),
], ],
), ),

View File

@@ -29,7 +29,7 @@ class CertificatesRepositoryImpl implements CertificatesRepository {
final ApiResponse response = final ApiResponse response =
await _api.get(StaffEndpoints.certificates); await _api.get(StaffEndpoints.certificates);
final List<dynamic> items = final List<dynamic> items =
response.data['certificates'] as List<dynamic>; response.data['certificates'] as List<dynamic>? ?? <dynamic>[];
return items return items
.map((dynamic json) => .map((dynamic json) =>
StaffCertificate.fromJson(json as Map<String, dynamic>)) StaffCertificate.fromJson(json as Map<String, dynamic>))

View File

@@ -28,7 +28,7 @@ class DocumentsRepositoryImpl implements DocumentsRepository {
Future<List<ProfileDocument>> getDocuments() async { Future<List<ProfileDocument>> getDocuments() async {
final ApiResponse response = final ApiResponse response =
await _api.get(StaffEndpoints.documents); await _api.get(StaffEndpoints.documents);
final List<dynamic> items = response.data['documents'] as List<dynamic>; final List<dynamic> items = response.data['documents'] as List<dynamic>? ?? <dynamic>[];
return items return items
.map((dynamic json) => .map((dynamic json) =>
ProfileDocument.fromJson(json as Map<String, dynamic>)) ProfileDocument.fromJson(json as Map<String, dynamic>))

View File

@@ -19,7 +19,7 @@ class TaxFormsRepositoryImpl implements TaxFormsRepository {
Future<List<TaxForm>> getTaxForms() async { Future<List<TaxForm>> getTaxForms() async {
final ApiResponse response = final ApiResponse response =
await _api.get(StaffEndpoints.taxForms); await _api.get(StaffEndpoints.taxForms);
final List<dynamic> items = response.data['taxForms'] as List<dynamic>; final List<dynamic> items = response.data['taxForms'] as List<dynamic>? ?? <dynamic>[];
return items return items
.map((dynamic json) => .map((dynamic json) =>
TaxForm.fromJson(json as Map<String, dynamic>)) TaxForm.fromJson(json as Map<String, dynamic>))

View File

@@ -17,7 +17,7 @@ class BankAccountRepositoryImpl implements BankAccountRepository {
Future<List<BankAccount>> getAccounts() async { Future<List<BankAccount>> getAccounts() async {
final ApiResponse response = final ApiResponse response =
await _api.get(StaffEndpoints.bankAccounts); await _api.get(StaffEndpoints.bankAccounts);
final List<dynamic> items = response.data['accounts'] as List<dynamic>; final List<dynamic> items = response.data['accounts'] as List<dynamic>? ?? <dynamic>[];
return items return items
.map((dynamic json) => .map((dynamic json) =>
BankAccount.fromJson(json as Map<String, dynamic>)) BankAccount.fromJson(json as Map<String, dynamic>))

View File

@@ -22,7 +22,7 @@ class TimeCardRepositoryImpl implements TimeCardRepository {
'month': month.month, 'month': month.month,
}, },
); );
final List<dynamic> items = response.data['entries'] as List<dynamic>; final List<dynamic> items = response.data['entries'] as List<dynamic>? ?? <dynamic>[];
return items return items
.map((dynamic json) => .map((dynamic json) =>
TimeCardEntry.fromJson(json as Map<String, dynamic>)) TimeCardEntry.fromJson(json as Map<String, dynamic>))

View File

@@ -28,7 +28,7 @@ class AttireRepositoryImpl implements AttireRepository {
@override @override
Future<List<AttireChecklist>> getAttireOptions() async { Future<List<AttireChecklist>> getAttireOptions() async {
final ApiResponse response = await _api.get(StaffEndpoints.attire); final ApiResponse response = await _api.get(StaffEndpoints.attire);
final List<dynamic> items = response.data['items'] as List<dynamic>; final List<dynamic> items = response.data['items'] as List<dynamic>? ?? <dynamic>[];
return items return items
.map((dynamic json) => .map((dynamic json) =>
AttireChecklist.fromJson(json as Map<String, dynamic>)) AttireChecklist.fromJson(json as Map<String, dynamic>))

View File

@@ -18,7 +18,7 @@ class EmergencyContactRepositoryImpl
Future<List<EmergencyContact>> getContacts() async { Future<List<EmergencyContact>> getContacts() async {
final ApiResponse response = final ApiResponse response =
await _api.get(StaffEndpoints.emergencyContacts); await _api.get(StaffEndpoints.emergencyContacts);
final List<dynamic> items = response.data['contacts'] as List<dynamic>; final List<dynamic> items = response.data['contacts'] as List<dynamic>? ?? <dynamic>[];
return items return items
.map((dynamic json) => .map((dynamic json) =>
EmergencyContact.fromJson(json as Map<String, dynamic>)) EmergencyContact.fromJson(json as Map<String, dynamic>))

View File

@@ -17,14 +17,14 @@ class ExperienceRepositoryImpl implements ExperienceRepositoryInterface {
Future<List<String>> getIndustries() async { Future<List<String>> getIndustries() async {
final ApiResponse response = final ApiResponse response =
await _api.get(StaffEndpoints.industries); await _api.get(StaffEndpoints.industries);
final List<dynamic> items = response.data['industries'] as List<dynamic>; final List<dynamic> items = response.data['industries'] as List<dynamic>? ?? <dynamic>[];
return items.map((dynamic e) => e.toString()).toList(); return items.map((dynamic e) => e.toString()).toList();
} }
@override @override
Future<List<String>> getSkills() async { Future<List<String>> getSkills() async {
final ApiResponse response = await _api.get(StaffEndpoints.skills); final ApiResponse response = await _api.get(StaffEndpoints.skills);
final List<dynamic> items = response.data['skills'] as List<dynamic>; final List<dynamic> items = response.data['skills'] as List<dynamic>? ?? <dynamic>[];
return items.map((dynamic e) => e.toString()).toList(); return items.map((dynamic e) => e.toString()).toList();
} }

View File

@@ -9,10 +9,10 @@ import 'package:staff_faqs/src/domain/repositories/faqs_repository_interface.dar
/// Fetches FAQ data from the V2 REST backend via [ApiService]. /// Fetches FAQ data from the V2 REST backend via [ApiService].
class FaqsRepositoryImpl implements FaqsRepositoryInterface { class FaqsRepositoryImpl implements FaqsRepositoryInterface {
/// Creates a [FaqsRepositoryImpl] backed by the given [apiService]. /// Creates a [FaqsRepositoryImpl] backed by the given [apiService].
FaqsRepositoryImpl({required ApiService apiService}) FaqsRepositoryImpl({required BaseApiService apiService})
: _apiService = apiService; : _apiService = apiService;
final ApiService _apiService; final BaseApiService _apiService;
@override @override
Future<List<FaqCategory>> getFaqs() async { Future<List<FaqCategory>> getFaqs() async {
@@ -40,7 +40,7 @@ class FaqsRepositoryImpl implements FaqsRepositoryInterface {
/// Parses the `items` array from a V2 API response into [FaqCategory] list. /// Parses the `items` array from a V2 API response into [FaqCategory] list.
List<FaqCategory> _parseCategories(ApiResponse response) { List<FaqCategory> _parseCategories(ApiResponse response) {
final List<dynamic> items = response.data['items'] as List<dynamic>; final List<dynamic> items = response.data['items'] as List<dynamic>? ?? <dynamic>[];
return items return items
.map( .map(
(dynamic item) => (dynamic item) =>

View File

@@ -1,5 +1,6 @@
import 'package:flutter_modular/flutter_modular.dart'; import 'package:flutter_modular/flutter_modular.dart';
import 'package:krow_core/core.dart'; import 'package:krow_core/core.dart';
import 'package:krow_domain/krow_domain.dart' show BaseApiService;
import 'package:staff_faqs/src/data/repositories_impl/faqs_repository_impl.dart'; import 'package:staff_faqs/src/data/repositories_impl/faqs_repository_impl.dart';
import 'package:staff_faqs/src/domain/repositories/faqs_repository_interface.dart'; import 'package:staff_faqs/src/domain/repositories/faqs_repository_interface.dart';
@@ -21,7 +22,7 @@ class FaqsModule extends Module {
// Repository // Repository
i.addLazySingleton<FaqsRepositoryInterface>( i.addLazySingleton<FaqsRepositoryInterface>(
() => FaqsRepositoryImpl( () => FaqsRepositoryImpl(
apiService: i<ApiService>(), apiService: i.get<BaseApiService>(),
), ),
); );