feat: home ui update and update api url
Build & Deploy iOS to TestFlight / build-and-deploy (push) Has been cancelled

This commit is contained in:
Efril
2026-07-03 16:00:57 +07:00
parent d02d3b5fbd
commit f9bfb69254
6 changed files with 248 additions and 85 deletions
+2 -2
View File
@@ -9,12 +9,12 @@ abstract class Env {
@dev @dev
class DevEnv implements Env { class DevEnv implements Env {
@override @override
String get baseUrl => 'https://api-pos.apskel.id'; // example value String get baseUrl => 'https://enaklo-pos-api.altru.id'; // example value
} }
@Injectable(as: Env) @Injectable(as: Env)
@prod @prod
class ProdEnv implements Env { class ProdEnv implements Env {
@override @override
String get baseUrl => 'https://api-pos.apskel.id'; String get baseUrl => 'https://enaklo-pos-api.altru.id';
} }
@@ -99,8 +99,8 @@ class _HomeHeaderState extends State<HomeHeader>
decoration: BoxDecoration( decoration: BoxDecoration(
gradient: LinearGradient( gradient: LinearGradient(
colors: [ colors: [
AppColor.primary, AppColor.primaryDark,
AppColor.primary.withOpacity(0.9), AppColor.primaryDark.withOpacity(0.9),
AppColor.primaryLight.withOpacity(0.85), AppColor.primaryLight.withOpacity(0.85),
], ],
begin: Alignment.topLeft, begin: Alignment.topLeft,
@@ -17,8 +17,16 @@ class HeaderDateFilter extends StatelessWidget {
return Container( return Container(
padding: const EdgeInsets.all(4), padding: const EdgeInsets.all(4),
decoration: BoxDecoration( decoration: BoxDecoration(
color: AppColor.white.withOpacity(0.15), color: AppColor.primary.withOpacity(0.8),
borderRadius: BorderRadius.circular(12), borderRadius: BorderRadius.circular(12),
border: Border.all(color: AppColor.white.withOpacity(0.3)),
boxShadow: [
BoxShadow(
color: Colors.black.withOpacity(0.15),
blurRadius: 8,
offset: const Offset(0, 3),
),
],
), ),
child: Row( child: Row(
children: [ children: [
@@ -39,11 +47,22 @@ class HeaderDateFilter extends StatelessWidget {
} }
}, },
child: AnimatedContainer( child: AnimatedContainer(
duration: const Duration(milliseconds: 200), duration: const Duration(milliseconds: 220),
curve: Curves.easeOutCubic,
padding: const EdgeInsets.symmetric(vertical: 10), padding: const EdgeInsets.symmetric(vertical: 10),
decoration: BoxDecoration( decoration: BoxDecoration(
color: isSelected ? AppColor.white : Colors.transparent, color: isSelected ? AppColor.white : Colors.transparent,
borderRadius: BorderRadius.circular(10), borderRadius: BorderRadius.circular(10),
boxShadow: isSelected
? [
BoxShadow(
color: Colors.black.withOpacity(0.18),
blurRadius: 8,
spreadRadius: 0,
offset: const Offset(0, 3),
),
]
: null,
), ),
alignment: Alignment.center, alignment: Alignment.center,
child: Text( child: Text(
@@ -18,9 +18,17 @@ class HeaderOutletSelector extends StatelessWidget {
child: Container( child: Container(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12),
decoration: BoxDecoration( decoration: BoxDecoration(
color: AppColor.white.withOpacity(0.15), color: AppColor.primary.withOpacity(0.8),
borderRadius: BorderRadius.circular(12), borderRadius: BorderRadius.circular(12),
border: Border.all(color: AppColor.white.withOpacity(0.3)), border: Border.all(color: AppColor.white.withOpacity(0.3)),
boxShadow: [
BoxShadow(
color: Colors.black.withOpacity(0.15),
blurRadius: 10,
spreadRadius: 0,
offset: const Offset(0, 4),
),
],
), ),
child: Row( child: Row(
children: [ children: [
@@ -34,23 +34,122 @@ class HeaderSummaryCard extends StatelessWidget {
return GestureDetector( return GestureDetector(
onTap: onTap, onTap: onTap,
child: Container( child: Container(
padding: const EdgeInsets.all(16),
decoration: BoxDecoration( decoration: BoxDecoration(
color: AppColor.white.withOpacity(0.15), borderRadius: BorderRadius.circular(18),
borderRadius: BorderRadius.circular(16), gradient: const LinearGradient(
border: Border.all(color: AppColor.white.withOpacity(0.2)), colors: [
Color(0xFFE8000A), // sedikit lebih terang di atas
Color(0xFFC40202), // primary di tengah
Color(0xFF990000), // gelap di bawah
],
begin: Alignment.topLeft,
end: Alignment.bottomRight,
stops: [0.0, 0.5, 1.0],
), ),
boxShadow: [
// Shadow merah di bawah — efek floating/3D
BoxShadow(
color: const Color(0xFFC40202).withOpacity(0.55),
blurRadius: 16,
spreadRadius: 0,
offset: const Offset(0, 8),
),
// Inner highlight di atas kiri (simulasi cahaya)
BoxShadow(
color: AppColor.white.withOpacity(0.08),
blurRadius: 0,
spreadRadius: -1,
offset: const Offset(0, 1),
),
],
),
child: ClipRRect(
borderRadius: BorderRadius.circular(18),
child: Stack(
children: [
// Top highlight strip — efek glossy
Positioned(
top: 0,
left: 0,
right: 0,
child: Container(
height: 1.5,
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [
AppColor.white.withOpacity(0.0),
AppColor.white.withOpacity(0.35),
AppColor.white.withOpacity(0.0),
],
),
),
),
),
// Decorative circles
Positioned(
top: -30,
right: -30,
child: Container(
width: 120,
height: 120,
decoration: BoxDecoration(
shape: BoxShape.circle,
color: AppColor.white.withOpacity(0.07),
),
),
),
Positioned(
bottom: -20,
right: 20,
child: Container(
width: 70,
height: 70,
decoration: BoxDecoration(
shape: BoxShape.circle,
color: AppColor.white.withOpacity(0.05),
),
),
),
Positioned(
top: 40,
left: -20,
child: Container(
width: 60,
height: 60,
decoration: BoxDecoration(
shape: BoxShape.circle,
color: AppColor.white.withOpacity(0.04),
),
),
),
// Content
Padding(
padding: const EdgeInsets.all(16),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
// Top: Icon + Title + Percentage + Chevron // Top: Icon + Title + Percentage + Chevron
Row( Row(
children: [ children: [
// Icon dengan shadow
Container( Container(
padding: const EdgeInsets.all(8), padding: const EdgeInsets.all(8),
decoration: BoxDecoration( decoration: BoxDecoration(
color: iconColor, gradient: LinearGradient(
colors: [iconColor.withOpacity(0.9), iconColor],
begin: Alignment.topLeft,
end: Alignment.bottomRight,
),
borderRadius: BorderRadius.circular(10), borderRadius: BorderRadius.circular(10),
boxShadow: [
BoxShadow(
color: iconColor.withOpacity(0.5),
blurRadius: 8,
offset: const Offset(0, 4),
),
],
), ),
child: Icon(icon, color: Colors.white, size: 20), child: Icon(icon, color: Colors.white, size: 20),
), ),
@@ -60,6 +159,13 @@ class HeaderSummaryCard extends StatelessWidget {
style: AppStyle.md.copyWith( style: AppStyle.md.copyWith(
color: AppColor.white, color: AppColor.white,
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
shadows: [
Shadow(
color: Colors.black.withOpacity(0.2),
blurRadius: 4,
offset: const Offset(0, 1),
),
],
), ),
), ),
const Spacer(), const Spacer(),
@@ -75,7 +181,7 @@ class HeaderSummaryCard extends StatelessWidget {
const SpaceHeight(12), const SpaceHeight(12),
// Value (hidden or visible) // Value
isValueVisible isValueVisible
? Text( ? Text(
value.currencyFormatRp, value.currencyFormatRp,
@@ -83,6 +189,13 @@ class HeaderSummaryCard extends StatelessWidget {
color: AppColor.white, color: AppColor.white,
fontWeight: FontWeight.w900, fontWeight: FontWeight.w900,
fontSize: 26, fontSize: 26,
shadows: [
Shadow(
color: Colors.black.withOpacity(0.25),
blurRadius: 6,
offset: const Offset(0, 2),
),
],
), ),
) )
: Text( : Text(
@@ -114,6 +227,10 @@ class HeaderSummaryCard extends StatelessWidget {
], ],
), ),
), ),
],
),
),
),
); );
} }
@@ -126,6 +243,12 @@ class HeaderSummaryCard extends StatelessWidget {
? const Color(0xFF4CAF50).withOpacity(0.25) ? const Color(0xFF4CAF50).withOpacity(0.25)
: const Color(0xFFE53E3E).withOpacity(0.25), : const Color(0xFFE53E3E).withOpacity(0.25),
borderRadius: BorderRadius.circular(8), borderRadius: BorderRadius.circular(8),
border: Border.all(
color: isPositive
? const Color(0xFF4CAF50).withOpacity(0.4)
: const Color(0xFFE53E3E).withOpacity(0.4),
width: 0.5,
),
), ),
child: Row( child: Row(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
@@ -162,18 +285,31 @@ class HeaderSummaryCard extends StatelessWidget {
.fold<int>(0, (a, b) => a > b ? a : b); .fold<int>(0, (a, b) => a > b ? a : b);
return SizedBox( return SizedBox(
height: 24, height: 28,
child: Row( child: Row(
crossAxisAlignment: CrossAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.end,
children: dailyData.map((d) { children: dailyData.map((d) {
final ratio = maxVal > 0 ? d.totalCost / maxVal : 0.0; final ratio = maxVal > 0 ? d.totalCost / maxVal : 0.0;
final isMax = maxVal > 0 && d.totalCost == maxVal;
return Expanded( return Expanded(
child: Container( child: Container(
margin: const EdgeInsets.symmetric(horizontal: 1.5), margin: const EdgeInsets.symmetric(horizontal: 1.5),
height: 6 + (18 * ratio), height: 6 + (22 * ratio),
decoration: BoxDecoration( decoration: BoxDecoration(
color: AppColor.white.withOpacity(0.4), // Bar tertinggi lebih terang
color: isMax
? AppColor.white.withOpacity(0.75)
: AppColor.white.withOpacity(0.35),
borderRadius: BorderRadius.circular(3), borderRadius: BorderRadius.circular(3),
boxShadow: isMax
? [
BoxShadow(
color: AppColor.white.withOpacity(0.3),
blurRadius: 4,
offset: const Offset(0, -2),
),
]
: null,
), ),
), ),
); );
+1 -1
View File
@@ -3,7 +3,7 @@ description: "A new Flutter project."
publish_to: "none" publish_to: "none"
version: 1.0.4+9 version: 1.0.4+10
environment: environment:
sdk: ^3.8.1 sdk: ^3.8.1