refactor: update color definitions and improve UI component structure; handle null safety in repository data fetching
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -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!,
|
||||||
|
],
|
||||||
|
],
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -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>))
|
||||||
|
|||||||
@@ -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>))
|
||||||
|
|||||||
@@ -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>))
|
||||||
|
|||||||
@@ -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>))
|
||||||
|
|||||||
@@ -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>))
|
||||||
|
|||||||
@@ -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>))
|
||||||
|
|||||||
@@ -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>))
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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) =>
|
||||||
|
|||||||
@@ -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>(),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user