From 5ddc748bc9c540428a6c0fe9e98892b8cf3bcfbf Mon Sep 17 00:00:00 2001 From: Syaroful Date: Wed, 9 Oct 2024 11:45:19 +0700 Subject: [PATCH] feat: add status bar in control screen --- agrilink_vocpro/assets/images/coming_soon.png | Bin 0 -> 23814 bytes .../features/control/view/control_screen.dart | 128 ++++++++++-------- .../widgets/control_button_widget.dart | 85 ++++++++++++ .../features/plants/view/plants_screen.dart | 16 ++- 4 files changed, 168 insertions(+), 61 deletions(-) create mode 100644 agrilink_vocpro/assets/images/coming_soon.png create mode 100644 agrilink_vocpro/lib/features/control/widgets/control_button_widget.dart diff --git a/agrilink_vocpro/assets/images/coming_soon.png b/agrilink_vocpro/assets/images/coming_soon.png new file mode 100644 index 0000000000000000000000000000000000000000..f12977181152af7f8d734d323f07804b8a8827b6 GIT binary patch literal 23814 zcmdQ~1ydZ&7DX0Vd~t_`;10o^MS}%rad!z0A?V`n5+u00y9Rf+;E>=JNFeCr`x&ol zx~96PrfyH4p03mPoQ_mgk;6nIMT3Kb!~7sGtqunVAM#%TBEPlpb?Yp=-B6w7b=~0L z(DD8&@Nk*g#BYu8Zt8LnxSDD5?8k&w;TFqL%$)^M^ z70hUa{^xbUM%P|pp=B7+y@FL`i-{F>Svh3BIYq6jO~Aj#0;ss4_AEVm%}ek)ocznXu2XZfo6mmg3zdObLIkT z@7DiCi_wO;z_9`e8;?hXeFm|6QeCYDs-%Ut9)G?2W=sx-%m1Au%!KPmB>c*DusI~I zZ$^{Pm=hH*w3cLohJ+3aHF#Y#zpI=(Gn9$+<}Jx<4_J)o2t@)5@3EJ%_d+@m@<%BN zf%H^$VCZNGgO>=0N=pK27Y!OH$V7L?ALn+HrpMA5evROO4Gj$1d(DY5UTZe(H=9;5 zcL+l2hlGGJ5_!>$b;@&{j(ttCDm_C{X=Wv340pcFF-e>0MAjB1H)ax7nn>0G7s(ja zij%AMzk2mFpToNf=!r2xX<=>OAp(e}bOEco^bgToA7UEgYe zQ;az3RQ`AR+n=+^;W|SMM%dd@YYdwf|B@2b@9;+@Z{v+HN3lKad>k4G5b=N9KCM9! z$7$_`#1#J5Q}lh5Mj*@FUr0&eh3LY^n+lciX@M;Z zM2FOX*HAM;iB^G!LC2ZXi|8Ne5r_j^AIU#O{J0zW)ER9Cft_yAl$gBruCIjZIo|Vk zDmgfdQS%qh24pUxBc~c38^??3Ydz^8f`70;yFR(r-f9V6sKUD%@O2x9#$*Q^;@*9t z_qXqZ2NYCXC2D>_S!1&JUt2G?m#%N)y3VGl0goz_0ivW@!nznDVfP|hGM}xs%X=uV zNyMvp;U9-fjN)Gic zsn61X$|ybx9gn8qW2JRQR{+Vof^J)igb625tnxxZ(`$vorW^Sie3 z?=wB@cFybL-*eT17fM1zD?WwFy&KU5ak2IHT)ZCWLk(e8L0g9T@`l(apWK;N&ijF) zxhG%igU}K_t=t;pUe`k_y#qL^!boZ%gS3M|>y+e7xyki$a9ky-n#EGZPX$O{ht@n& z-aV?^`3aXX|A<_W`^v+krJZbit(8mK-E{mk2rYJI`Ih}tK|Qrdv;vGpmb-D?^%18t zKuZPHp?I~Z&xlt+-_@fQP3=A~qpR<2jP7kFA+tT#Bf_3%&%at6*ER&Tb;&o&hy4dJ zlG7ru@ReoWx%(qTN+}5AVoG2ABk^MkCOs`r!N1O0EvQ&Hq_YdlN#-appe@O(n;50_ z)MT)JZq@Q3URayolyk%0MX6?HMON}Oz)%?;k{GF~Dq_4-{!PpZq)$MyMUuTY_9}^D z=n6Qw&*@hWhzG&KBTcz?H1L_REp~Yl1~`}6O-+BajzMU|I+8PBZ;&F;fkp!)KJ)#F zl(DZv`e>vj5t;gNL{)V~)>mXZPMhnXNB z-tYeiR(o*Eo~uIO7Ay;AVn-08T1rWcZj(%bB+9S9y>?9P^Rw|HW@ZhlD^vMvDt)9u z(9PD=(QtS~0-sN`ec#p$4FM%pS+y_lH|v$u!)bSIt6ao_{MU`I8b;I~Ih2Yn#S%YY z)E(7kt|(c)z{Q5p+d4bMz!EuA9~EtkEO`xE%TnpTo1O@LNm4OXAd%W)W(_rEGeu~| z%9r=ZS&^L(!eLi>ACyC(6054F4v9DD{rXE&6ZiW8#7&Dg6AW9^0H}OT9Fd@{D;%R8O``jjpP+k4|IjtjQ9F1fuk*77& zUaz)mg*twdDY5fOX6b3ES8DZ&|2s`ymCNmugm(PWpb0H;k?)QM0j=U>S%$2frXx3* zITj(HFd~p!Fyj#GC6lt<^t~3amor%ynq41VONc`Fdv`4I7*ah~o?viPAGk-1m(EN7 zUBlh|$ans5kY<~~_m&RA1LpQN(gfJ^Xlp7*qe@$;p3T3ve99;`@D(QnvLN>#P+xyq z9Hoy2u1ReoTHnwkOLT=&yyvJq9U9|v>5$6m8zv4nlpVIELkXr5;D!*Jo4C}(>cgkQ zk{eug%newV5%a-HQ}=cj#s%D(VO@`wh=Fy+_hv|x zK;MLQYNp!0O7N-ONd&Av4mQM@*_IN5h0Ey;O3R6{m+IkKKr#FGe4tOa{<1o}&2^`Y zn00^(1%;n`*f>js{;bpf^*|KIt^Cs<0UK=~K!SrOLdHgNb$1648wRmJlE;pHKL7eU z%{#?r#?_np&HECQR3RxUD)ePFba5YbhqSZYqrD4Ty0N7x`@*POyCjRU)A^gLY`(RE zUlZF0ea9kE%wgd6=nUKP?!S&YS$jxQ_{aUHh;jGt zo7;;qqkj)>l2ByKV=Gq9!lb_(uF`%`Ks&Fc?yt)Gk8B1ky6nvZKoH~h(N}5d5<0_8J7nb6^Z%bpH z{V~ddKV(h`pdgGq+08#cpW0qAD9*%{hcF10+YFs;Ou{i&62$6G-N9xLtB4^crXo`W z$5jvbD-K*qb1CeW_(;~}2vgn$x|!}j#_(tKON!XxhAf)z-Fb&;zY&B;Nl7WXBw$8R z8M3rvSWvXv?lz*aCV=2sGl7c*v9R<&POt|-sWWx~G7VKxW&Wt9aiaaRBw=3Gr7_5y z^dlMW1kzQWRq6uZfCd;X|z${V3<&C;G==0b72Nk57U@r5(nu|)siM%Ry2 zqNbszu(T(SvcXSxof%;$h^%P_-`OUM9^xhH90~dWVh1!UH3?@Uf0 zEtZ&W$49EaJw)>!g!rHC=X7xnz0cs}oNN`9)D1X*Tso>&Tp7rnUv?E9rX*f-li{;D z>83D@JSqC0^P9tFt#|QRtmVw%-P&w%zcAbOg(9OftMOb5_rcY{J}>~nn`hEw=t)OHY`5(WGrF}81knPpm& z;qld5qgMxR+V#-wzzMl!Ik9~nx4LQFb{h!HPKl-Q6ql&=WdeesJjQ*o038xDbW`5U z-~MB)Wu@ZY4CZdaP1SwV;uO%Gp-Uw_{NpMd&G)&ucT6T(-B2UBqw_-S z%mHN!uPzhDm!5WB0qj;a{b%xHBgGNr>fAzyzQC+k=OKmf1z?oZLE#dsxba*q533ZMQ0C=LTC4ietBvYb^P_uM;qK-)}60(aw0v z#DWBSG6yKKvElXShr5}EF9tFnY%hiH#21S@(Q;IJ!C1bG;gMXioos;L`lmBG1=z1v zJ7+=e?6gaJ7=>0iXDok+RMNdDUJ^EtA0EJ8kZ(`tS*xWR0WW_y`HvoRdXvucc)8$! z)8gF$wLhKsMW|lr;|htY;&1w3Fn!F<>-GD(Z<@ZJ|DBMePiWkJpO=QeNvi)bW5L$P zyjo{dt|a*^E+?k4wsKVQ550)db|iRzid=g`98G6ox+&~_I_oD3osSY9_26P{$;klaKqH? zd|#My7e1Poj>9JyykDr!>b&FQt{o~9I?&|xKIX?0+jUMC+mIJ7Dm9s2+S4bOzr7Lr zh&ZZSA7be0z(o??1>pp#EwxT|{ssZvAOQX-^cO=Pw)IT|%W*Nn!_6+G_rb$d!=E5B z2^CS#4($>2x_1GPvq`rhG)ZN8WS=u!uT6ySKQyrm~Z z6aO6IdzFcMY-ZgY$%3K6hQ zLs#b>QKFxuyVObRvAS}dCwLO`{?6dL!3jm>W`BMgaJaqwHwa|xZ! zDh<$DmVM5H1{D55JrsbxKt^M8R0Q{)v}q|Kkk$ZGBFUTs#Yl?3=40@+ianTxnolJ@&aj=XueX^@(Xs*sIe7$4 z73criF#bi78&=D&2HbzI)m=QvfVdS%8LAQ#i$eFp_3z-#l=@)_h%iK5_Xo~Okzx| z#KnneGaRhp3wwMSYficD6 zr}t=^*(HX^!#M?18tY!Bnj#_;Bav0@AqZCa8%{B@iWl z`7u0tf|B2}0jC1l@5rjj6cfqLCDO=_ zh@SfxA(KX}!+nT_4#8T@L9azh&N<*isP+AIAt@ATLhYf^1tz%X$JfK(Sq@_Pu-%UD zM9X?BpnB9I0R@4OV{vnh(Ex*hA?H%L2Kyh0@5?OW!g8tU?G4y~6&2nU+&C@(3o^km zM?gXt+Feu**fYTn)RpQjgTaHwh6dO9kXO^7oAom$v80a1`N-=z0zL0f2;sZBX0?0> z#arINQV=uI#bdo3a#H8!W2E<;#FWlN3}Hi7MP7U?&!LZ6dw@~_Ikc> z0j&jJZ}lSu6;kJ~ud{R6)HoEioP=r`Yb#<}@@ih>3WBY;af|YIfPZ4L3w9Hrj3d>K zv*piO*^91&YBgEkvR)m%2V@>?mLqoT+uxL3eH;- zlB}_r<$qklf*;b*gS+k4Sgt~WUg<1x6nez6*hEjS10F6E%hU5g*Xsz=%0CT`9Ee zvT=IHpo=O$)m47(mZpztV}uf8LD(-Oze0AnNO#&51>N9}lJV16&=Y#kCBON7npdeJ6# zQ|!>UaOqv2;^Y%z?X8zQAD}BIO=d@bWSWil}-&*4c+-SaART%S@ z=m{G22|+q2+miLkp2u9e2)!h%w-4Wb9m4yhzLNJjT}23tu_-ljuN2gS$d@0CQ(THCrM{#Ueh%{g^%)p)oaJ{YF}CQH=P$$r1Z zl8IHKp-K3b!IFHymm}-Xc!;8PgjneI{Z5==jRIQ684D2s*nJ6cB`U?9g+{>4?$S6q+o-K|m@=M47{I9h( zJcGQIXAIJ4hKs1$<@7EI-s&Pk z2=A^mhj~$vaA(j5c}gLW*mpXJsSK_jQ0R!pIlC!;4lm1T)aZ<=E8}N-?oJ^=ZH63L zl(8ubCRJ<2dylz74I2BPNSC!$Vsjw&!@gzxQ8ROcX5qZ)#JB5E`?h(Qd(smbfVivl--Vxb2G0mSaqd6a~`B5hsB$9c1)$uB-C zv@P|@o2#|yN+M0ID4G?}xvYRAqMcNfubp;a3<}(G1eiLTDI<*XrkT*SPm2b20vD#R zu*p8*1RY8+EWY0lZkUqkU@vRKG*sroN2%tTbmwV~BGXS_kRo%k;+i#K>3@cqcs!y( zQAcAxwoFtrGAYgK8aJOEWC9ZGhZD6hVh^n-`f3A)4;U5C{$is_N=kJ&M6ZErk0>t^ zmm&Fq(MQu-ItzxC%YTlF()o$=U=@MHzT)1ORnCw7Nk;oKll*B5lS+@V8KBBV$w70SC#0#~qMo>iDXBU(FMtr38tDK0z_Zw%s-?+zONh{y4JcIy zvY670#L%712IH7V3!0(SaZYOT-JzWVxG)Nt%Dpk$hpA2eG(9LqJtkGPCd537c?pKbGXfh7t6DI~to$@TDl}=wDq@FzY}u>eQ6> zno74yKrcM{LK0K%>@S!jMKT^#GLngUs9SX)-(`KE35^q-jcu75OJ#Y&q$`=AKpO^H zs>>j!cAo4ao2G>~1hiPrw4bauFIo#ie1n^>0vG=0IKrbb-lnVyHoNeeLPiX6?q^PF z%Fet2UrUY+ZCS)0Karzo$;bsh&y1Bx>ql4Tgfam7;}$hArxYY4YHF%zF4^kv{_&VP z6ekByfQ{d9h^8=Lm)(@rlUR-UfePjnb(sAV((5?rICu~U`P1JZp;nyN(c=*sXXHXW zy)W!}!Afx|{@$-$kM%|CXMK}Kgyh$&weASvM8mG1xW>l6Z&E{PrXAu;r<7}lr4f9* z+|F{N7*KT%$z%!raoAPAsJ009_4{|;)cPtVb-|!1*z5CP$c;9yG81?Biz!FL)KMM4 z_rbaJfdG4EEea)_pB35_9tC#^glHbC6Yy3({xv2q$a%F+#|H?j7OF+j#)QQ{+k)3U z9xzDg%7Op<8f$MXd)UA3(Bkz(v~8c}x-W#u)T3IbI(Mgj{dgGqv;Oo-&H`{Ysb*k> z-xm89o3f6a%^Iu(Q_dUJA;v{9Q~!NS4_Rbw}x zAO0>YT3CAYmyUnX_Zk^-(wQh9eN{Xe%sf%t0^RZ1V^BzMkGEpF>$ z+~46-s1MFpNd}trZGTBwxxd3=w3mrP5KRNgj<1|&szOO2bxs!wYZVCf=n+A4X+$R7 z5#q#5F^z?mp({fYG_VPcpFz!<0Bsm=Fo1j@zrRrwGOeGyiOfG2@N&IPP;I$`G+t3z z?r%E5N|dfvm+<{hQso2#$tdx_jji$x7){T|PRceG1e3H?gR1R5jb=U`=f?G9Xh@L4 z|KuxnU#D@X%5n6Ys?1>`PW}0Fz%J{2U9oAS$`xLSG*zfpzv+PRw}8<&_q-2jGkvG6 z^;_Iby6WH1Z;!g@%r{?F*_blftsxToQBpywr)sEp zGgR)+&NE%HC$7n3?itwAKyn=XuESh}$E`FbN)te59}-VEfIB-C(dQ_TG?mv9tgM)p zxCFLz_uE&nBY-z8Md;_&=uC*9N0W^v+7@t)`1a$DK8LbL!f5aC%XSK(6m!?s_<+8o zW#l|lTF-IR&-%zn-Mhfbqvgt##H@arDz9_Rd&CA7mMYk4fjF-twe-+&d;OxYpva6o zW5#d3CVC*F7?Y5|ZKym5sElDE_@*YWW=2Jnd$9cCn@hYo9A(~Ne)v37>F#w}%^l05 zAu8DuR0+JnzFMyW6gdAp(YlSDsZCFh9W3Unwe|8aU?vH8{oOmi|9Tytw0-2#ns^AH zu8j?clSObUhAh|Sxzc2`b%D^@ar;RSS-5 z_p*hRjxUjnsHPyaSW$jrQjr8%oo0cqO3Y}ZQjzdsB1!IUmpAB`5 z;Da_^9tc_$C;HgA;Cj0s6wr{TCvKuhKjP0;AEEuTHY#RrFlS5q9tuJ8qLijv!fWv5-dYocEz7&I+Jo(#mJ2??lto99Vp8Cgsjq%A}biUTN(9K zVZaxMD3qm)`=zS$z)onDE7J7~x7$q%-8IgAU5H3z+hVuG))xGq3tG-5F^P6RNM
  • Q2;(7z*|*1qF!fJErh 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 await context.read().getRelayStatus(), child: SafeArea( child: ListView( children: [ + Consumer(builder: (context, provider, child) { + switch (provider.relayState) { + case ResultState.loading: + return const StatusBarWidget( + text: 'Memuat...', + icon: BootstrapIcons.cloud, + color: Colors.cyan, + isLoading: true, + ); + case ResultState.hasData: + return const StatusBarWidget( + text: 'Berhasil terhubung', + icon: BootstrapIcons.check_circle, + color: Colors.teal, + ); + case ResultState.noData: + return const StatusBarWidget( + text: 'Data tidak ditemukan', + icon: BootstrapIcons.exclamation_circle, + color: Colors.amber, + ); + case ResultState.initial: + return const SizedBox.shrink(); + case ResultState.error: + return const StatusBarWidget( + text: 'Tidak dapat terhubung', + icon: BootstrapIcons.exclamation_circle, + color: Colors.red, + ); + } + }), SizedBox(height: 16.h), GridView( padding: EdgeInsets.all(16.r), @@ -43,7 +75,11 @@ class ControlScreen extends StatelessWidget { title: 'Katup Air', subtitle: 'Relay 1', isActive: provider.control_1, - onTap: () {}, + onTap: () { + provider.control_1 != true + ? provider.switchControl1(true) + : provider.switchControl1(false); + }, ), ControlButtonWidget( title: 'Lampu Utama', @@ -60,74 +96,46 @@ class ControlScreen extends StatelessWidget { } } -class ControlButtonWidget extends StatelessWidget { - const ControlButtonWidget({ +class StatusBarWidget extends StatelessWidget { + const StatusBarWidget({ super.key, - required this.title, - required this.subtitle, - required this.isActive, - required this.onTap, + required this.text, + required this.icon, + required this.color, + this.isLoading = false, }); - final String title; - final String subtitle; - final bool isActive; - final Function() onTap; - + final String text; + final IconData icon; + final Color color; + final bool isLoading; @override Widget build(BuildContext context) { return Container( - padding: EdgeInsets.all(16.r), + padding: EdgeInsets.symmetric(vertical: 8.h, horizontal: 16.w), + margin: EdgeInsets.all(16.r), decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(16.r), - boxShadow: [ - BoxShadow( - color: Colors.grey.withOpacity(0.2), - spreadRadius: 1.r, - blurRadius: 16.r, - offset: Offset(0, 12.r), - ), - ], + color: color.withAlpha(50), + borderRadius: BorderRadius.circular(8.r), ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, children: [ - Text(title, style: AppTheme.labelMedium), - Text(subtitle, style: AppTheme.labelSmall), + Icon( + icon, + color: color, + size: 16.r, + ), + SizedBox(width: 8.w), + Text(text, style: AppTheme.titleSmall.copyWith(color: color)), const Spacer(), - Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - Consumer( - builder: (context, provider, child) { - switch (provider.relayState) { - case ResultState.loading: - return CircleAvatar( - radius: 20.r, - backgroundColor: Colors.transparent, - child: const CupertinoActivityIndicator(), - ); - default: - return InkWell( - highlightColor: Colors.black, - onTap: onTap, - child: CircleAvatar( - radius: 20.r, - backgroundColor: isActive - ? AppColor.secondary - : Colors.grey.shade400, - child: const Icon( - BootstrapIcons.power, - color: Colors.white, - ), - ), - ); - } - }, - ), - ], - ) + if (isLoading) + Center( + child: CupertinoActivityIndicator( + radius: 8.r, + )) + else + const SizedBox.shrink(), ], ), ); diff --git a/agrilink_vocpro/lib/features/control/widgets/control_button_widget.dart b/agrilink_vocpro/lib/features/control/widgets/control_button_widget.dart new file mode 100644 index 0000000..0857526 --- /dev/null +++ b/agrilink_vocpro/lib/features/control/widgets/control_button_widget.dart @@ -0,0 +1,85 @@ +import 'package:agrilink_vocpro/core/constant/app_color.dart'; +import 'package:agrilink_vocpro/core/constant/app_theme.dart'; +import 'package:agrilink_vocpro/core/state/result_state.dart'; +import 'package:agrilink_vocpro/features/control/provider/control_provider.dart'; +import 'package:bootstrap_icons/bootstrap_icons.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:provider/provider.dart'; + +class ControlButtonWidget extends StatelessWidget { + const ControlButtonWidget({ + super.key, + required this.title, + required this.subtitle, + required this.isActive, + required this.onTap, + }); + + final String title; + final String subtitle; + final bool isActive; + final Function() onTap; + + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.all(16.r), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(16.r), + boxShadow: [ + BoxShadow( + color: isActive + ? AppColor.secondary.withOpacity(0.2) + : Colors.grey.withOpacity(0.2), + spreadRadius: 1.r, + blurRadius: 16.r, + offset: Offset(0, 12.r), + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(title, style: AppTheme.labelMedium), + Text(subtitle, style: AppTheme.labelSmall), + const Spacer(), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Consumer( + builder: (context, provider, child) { + switch (provider.relayState) { + case ResultState.loading: + return CircleAvatar( + radius: 20.r, + backgroundColor: Colors.transparent, + child: const CupertinoActivityIndicator(), + ); + default: + return InkWell( + highlightColor: Colors.black, + onTap: onTap, + child: CircleAvatar( + radius: 20.r, + backgroundColor: isActive + ? AppColor.secondary + : Colors.grey.shade400, + child: const Icon( + BootstrapIcons.power, + color: Colors.white, + ), + ), + ); + } + }, + ), + ], + ) + ], + ), + ); + } +} diff --git a/agrilink_vocpro/lib/features/plants/view/plants_screen.dart b/agrilink_vocpro/lib/features/plants/view/plants_screen.dart index ec4a78f..1a5d423 100644 --- a/agrilink_vocpro/lib/features/plants/view/plants_screen.dart +++ b/agrilink_vocpro/lib/features/plants/view/plants_screen.dart @@ -1,5 +1,7 @@ +import 'package:agrilink_vocpro/core/constant/app_color.dart'; import 'package:agrilink_vocpro/core/constant/app_theme.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; class PlantsScreen extends StatelessWidget { const PlantsScreen({super.key}); @@ -9,7 +11,19 @@ class PlantsScreen extends StatelessWidget { return Scaffold( body: SafeArea( child: Center( - child: Text('Coming Soon', style: AppTheme.labelMedium), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon(Icons.eco_rounded, size: 100.r, color: AppColor.secondary), + Text('Coming Soon', style: AppTheme.titleLarge), + SizedBox(height: 8.h), + Text( + 'This featureis under development', + textAlign: TextAlign.center, + style: AppTheme.labelSmall, + ), + ], + ), )), ); }