From e35e3c5b689058f18ec2cff81be89877d7e93c15 Mon Sep 17 00:00:00 2001 From: sindhu Date: Mon, 15 Jan 2024 15:22:08 +0700 Subject: [PATCH] step 10 : proses insert transaksi --- app_petty_cash/images/logo_splash_screen.png | Bin 0 -> 9373 bytes .../lib/repository/transaksi_repository.dart | 44 ++ .../transaksi/insert_transaksi_provider.dart | 84 +++ .../screen/transaksi/transaksi_screen.dart | 503 +++++++++++------- 4 files changed, 440 insertions(+), 191 deletions(-) create mode 100644 app_petty_cash/images/logo_splash_screen.png create mode 100644 app_petty_cash/lib/screen/transaksi/insert_transaksi_provider.dart diff --git a/app_petty_cash/images/logo_splash_screen.png b/app_petty_cash/images/logo_splash_screen.png new file mode 100644 index 0000000000000000000000000000000000000000..6b056db1bf8ab550bada5689944c608778a5f84a GIT binary patch literal 9373 zcmV;OBx2i%P)#g=AHr~j(^tLo}IccdXXmzn~H_uM}H-(OdK zUESwgN2hY%<@R%rZ%q?j@ZOy#N9QL`y9YG?ioCmV?(g5ves&vEq=_O?ElHRpZ>=!S|iz@Q#rCk)3-5A7d*}3&pknN);8&X1Qn8Y z{H}$y+dOCc$x^P9*^F5{v^XEWo&xMalVtiHeRyl(HlFs5F48=onS&33hyGA41w5;Q zC7H{RG=`KFW6Fw?02fQ2sR&Q&CZ_-!NYGN7(}sK69R$-iWz*-AhRWC|rmQe_&`?SN z@h#w0HI8FA708j+UO}T(;vZrx+(hdprvL-F{oEggRp0)FFuE7R*Yk7`Ms=DT`DXfr zX3603hA9+Z#mdnT?|K!;X<6IR>QwGT$>$niz3JOO6SazPAw-cYy9zQFz*j*O1yvT_ z$gT$8fuw=9nMB3mN&zmrEatVdk)Jz&Mbo#j5dd{?5LSKu0&^jnn;RhsI6OT`Xb24k zfDk5gK=8Fi_04@D7Y1Bb0a^T<{rau?KNkSY4$oxvo(?1Qn4b?KMXw}14K#v8nKE1y z3XN3)ISp!{nvb@Au{_EkMLx#&NYw-UV6^b-$MPRYfF;xS#V=f3P}o3r(?#@6`7-o% z04p~VVZ4eVE0Wr(-%f2xTnY|Ge*98tn$F- zL8WR1o3~y1q>7oUNJP$5(qUWyoU#zm+d!DV<>^QqudF0vMvLiGgWXd}rq8)}BH`&U z0FTWF`(>oq4NydzKMfP=Np{sV3>KxCiism)fau0Es|D{{&$MM$- zV9oReFM3$@1?_YO2JKLXCx9jgfOhbjXqkkoi7Q)$9Wc<$#gDMtjqVCT_6b&{xN-#e zLw=_w@@`0Vc*eaxPg}Y3y(>OXZxQ2~SP#Bh-BmY(Ce~%}yR;=tl!M>l9G92rWL)n# ze-hy4Bxr(5x)^`q*3U$q$QhwcA1SUPTujEQFNw8WGJcprwi5gfb0j_uCQ--*{Wg}?pq_W*-u z6}hJX%cjpi9Y*D17_ZF~sJ2uvzBVNyzA`^WOg|M7iBk+EeTLD^N{Fs6 zdl*PMFEd#VT4xH}C-a>t@EyOG!1K{ZyPs#1b+6@E0d{-)@lE$z|E6=(`5I`ftW18C z9EtPLTymV0MRPIihL8_t@9u=?zX~9_9kRH?(c|7-_8moJfy(1L@5z2iEXeQW?r{;J8n z>*8jzt!eC4*2ur4osuKIL`z&1mW=9f1aqxjC8HwhiPgg*TJ=JW4t*3aCcWjP+g?+H zLCA60K};*Guy@1FoiH!2e-^rMY)2#)({wd_Y&J5~8k6@tybS_&5Rv5jg1KwXmQN%! zU#51hc9}u8`2b<0yRf7o~=kNtMRek*Jp_kJ_n>Nv*1D8&u`= zd~tAlHYRbmO%=v61a61!`ryu`$FI_-lw;9gx3|xqoj(5U?e2zJ@vS^#E%EA9s2_Xj zah5vRcB#NP>f)lM?p!0C1{wOo#%)TP2_3dp9Sm&??aVw@0#9swIt9#;7Pi_G6EDbp zswd2kM}zJE=DZmW+DU7Qq)AlVG@C)|>DfQ$qf{+#lG-38%YSvVx_&Z%t)3Mssn=j- zYsVaXgG(;eF5(o9pkgpLKIt~L+mtEtOawf}aX>F(TQui=r=bKw%^33`vja#`BXKS>J z&84XUEe={VEJ1Tge?hLL>ZZ%7Mn;trRKkmqYts?r?mVV49XBMZ=(1ZpTU0q(TP`cNmR}Yv^;*PpB)~`})suOStZTkeSMR2u(3t!s@2;$n z{6#u~96P|Ea=vm5lBO&@V5$gq?PTn2m~owHLG$C(`K_)p9f9p;YbTf|2Qe`9>W&N$ zu3Lz8*vH0}fJ?Gg#3K@T~RTHk)Mdq$M29G*@^}PYzrmL%2z<3)xTC z%ulU|H8Po#V8lg56oWD_4;1ks-qdh;cH_}6{4uR4$F9McU{npJXM`r_Q7o-fB8#*} zekM6pM4QZtj zqTmd#$?-k|lyAaAuyrI=8S^~L;xX?-L?Td{S2RVnEoIiD39e>bwWWfL$ke=EaVVG^ zw)>*=O&4F48#Se65n}Xdnn;yZ(;Y0`5|eUlCQ{D^R`VYA7ez;dn7o`b?J|Z2qqZo3 zs$~Sgq1jS+Bjy|$+**U`x_0#)X;kEAhft}pE$hpZ32R?@vOnwFGa$I0nrT{AzL$%mmZ#EY!mL4AI8fN(ow@V_M=}^v?zjzsJRC)4a|~Gd7`;PuIT!Oh^Ujg^hB;B>`u8|Ac5*X z4}DSN)wYnDAi6$-dWy-R<*tj0xyVmsD-3frZf#yEIl(V&dq@gK-Y;hGu~v z?7-8#)nGzeP1@}B;IhERYmTBdN&}MFNe&0t$yF7Hci<$$M%8PfedsW=rP|Ua8A*aZ z#UPIFdS1yUo6UBeaJ8UTDAsAlEk|9)MoS3u8Cp&#&z$Etd5$2*XCk2@x)Ng6M*#rU zfnv$m{SE-8L&9fh1dMNKA+w81MKB+%uK=#9g1n&ad&;LQcB+X5KF4JVGgP#l*_X8) zO4Aq=LAQ0#AKtpQ+T&?;?G@$tJ^9qBb>DFgBd*XEkffR-Yg%bDP{M|tq-J?XpDp?tqVe1)>Zg(8Gm&TlM+V&hn$s3b zr{_G7nbHhz%rr&iIq7F7^_Vwud1{cY zd{mpqqKTaboDok?(k11#G4l1ul#E)mzpxUV$d$K0rhZu64|cpSKWUX{gUxjm=qmG-4&!&etW?RXh6|is4j6I$M11Vjq6w1uDhl`9zT#{ z1(=w{YE{#j!}7_E!?-vW%9`-(6J|B5KY4|f%zqd;#RE~$_mqldN3T!$69oE7si8cpBJ@E$~(GAox zY5-~Q-h&b4IA9zg1L0HOY3(bRZVYYW5G&BJ@5WUTXi)}&20jIU;pht3)K*ch<5P!}?^NE_ z@>4-MX&Q~K`fYdyQuo4u!#?T&&eaNlxAq|$6OnxtC)$*?!8C+3aW9sf@ zc`e@A#h1QxHGKYnPOvyyW4Zm@@DBJn&x5bD|bbEuNom1sBFGG~H_ruqgSR81znP%2zdrY9zn>w}N_Mik3&G`rx7{ z1Xz|;W#yM~x|9bMw~gknM7=}W8yeJVAG%7Y2XoDfZ_4_XDp0rjH`~^g@2{PC?fvUD zlXaK!;+205jY*tDxkLO&i?Akhiu6|vhrf1qSYIszl7|-#gK*tqG6Ap^KuJdXYEsa; z6=X_7GgriGGjH9Ot54DdvIhcSQQ|wvg66+z-CNc%mI+)cqj)fjEe+bGS&~n#*x~U} zkBv-l`Z}tMaa}P^Z9!w^bC`s5VR}CKzyK`DolAchJk0h_8Vew?z<|{b1wk#Q^UG;` zBJE4f+*VW@QnD$On>U1^Y^rQ9rh07%p=<3h;npHn6 z{o7s||A9D6S44OSAU}@deA~+upDG{x-nm7*aZHEfx4O5DZt$5|qtC7%QE#grWpTrw zSpOI&Jv2jNhpu)?O^dt``-tO*$@xJ27*^<#e+wU%D(-J!+}R0jyK>UEh8*+}x8T9jU=v*^gUth6S7hA_KhPYa=_IP=sV?Y< z%o7-*Y^sL2X*}xvSC)z9?*hc7enBt3a_;r_w`mQ8`#xQVt2qtH10wMa*I|^N5CaFZ zNm)Mus5I`1467{a^(ZcqYvgTKMo5^`hcdYwDP;K8x!2#@rgagVu#~m_0|T(>fmA@16%;Sg>uS=u29~DvdcgYj!Z}~vyzSXD1aG(>2>g7a_Zf#$ z+V#L_u>ZOAweN>vxts=P8XV^Z&=jAS*Y}y2ie>cU~|KZi||J8rKeRFrT_2 zY~SN`bamC=k4JA+2?woMumSfx6?cYLVdNYV`QosxitLg7k9U9gmw){VEs-bRcy;@C zKia!|?*D$h`O!mP*!%BCzjEu7N9g)LK67Q4?t}czpME<&n^C%{sqwW1*w#;fytQ!d zYG}mPzx>|g;+`iy8RKeOOAul(OQiqvj2Z>8kjZ{LqdrYuxY4LveL8WCE6aF2O$;bk z>!;Fkc-UikiI&JW-gy1yO!M}Ceeo>Czar;@O}f1Gv)8WdeDl&$aNZ61=ii4h0G43_ zZ0pUNXCID(P2G zAT0k1N+9$8d{}dxDFZFUHzWlc=G$PpsR0RBI|!NpA}W4O&l;|Pt(t&%pL*#Qh9Qk> zye_5Vy13pCC&GjI9sZ2VQ*XR}^}ru&Tb_=Xe&PL%KYR1$FYmP`W5UJ#&I(@uECOqy zN3Mpo@e6ZYAbUBpQlyG0-+`#~P7kiA4dO9(2v6NV=W|A^RswFA}0T%pZTHX)Xs3_D!>BjH$Rylem8_~mWrkiYsTdq z;eIMQ#n;rmb&@j9kFyWqOC%PrJ6Eolp8BmfU*8PN)Pu4sOEBiEOm zJPDTi>3KsVH*U&3#LqB#?MH+!r2-NxPOiG#vRThFpTC=*z^QyTioAduf>f6^`tF$D zsc`*ApvAl-fuapvA1#york+lNin`qg>D&=zoKtwT>#VtIg{9Ao_#S@N@G!&YOhUxK z)q#{w&ip~H>(ScbUOhCVW+)YY(}2@U(KN}tiFV2Qdr>a+W{b6$?t{7zpnjsbWHFoq ze6D+^`E=WZY~8$RKFqQ6%y)Lf*3};O3#XIgk>=5{{1o3&WF|EkLtCSXoN|@sZ5(j7 z#Qd~CUo}--Rq>29v^#OIW=vo7MJ&Au!d{ zv{Tm~&_+F}=5nY7x{Li~eo&F76~FZGCJiL4oL>@v7oL**Z=R;>bdRMR>=*qQPw7uj zh2?&@-dtub#7yH(N}9#v4=q5)W$19H*|W?wz4dm@-pAX=1Z(;is_^(AxNB3Cp&F0*eXg#KR za@iG82b?-n$M>_AM?h4CBjYA51EvHdcc$}7t2GU&fY9Zw8`iWC6z{1UL_h2HjPrAi zMntT@}mJ^nc+G?uH(G`rKJ0maA#pqV`U(8~s8S9}=1un`XwX891P_bGa z=4hnx@H<}@$5-CjVKWFmGAp01YvetlVY#2QR)qLlPrdo$t+$`~-p(lh0Hl{GAM!g9 z5)a_JN$}Pb9^6oF4+lL(Zcas+OCi|l7OO!|)e*@+ocnz#5ugW{L%Z;1MqwpLmGiau zV{W5Gg97uYKvVnWeJ0LhC)RqQ)`Kw7CZg<{JH$`s=jrB%?5~qdi|Lb{c;U*g6m}7C zW403P^0jux?DVmgI!k%QXAPDE?V;|Y)=c>qK=F~8E+b426G29Ea@8qFx1pf5+1J<8 zBmh!*7i=X}?alXN43$nuD`#`#E00{IHId4}px@If@}Hi$aw{}yCvK%6A!a_rJN%k2 z)y|}P9Jtd`DIL2B!~tQ~zQbDO z>;!FlojSWn@Zm)=v!7oGo7!svvTF5e!Mh4j89G02M61?}sa=P$m5(%_*D zkYGh(|89q!mUq7Xv)3-u2^MjTF4jFys3uST^vBnN*|^G)tIun++DXSy`2Ju}K6|bG z5ajy)VQ~lb8`aq&;aCn5dL{rOEj|LVtlpG%-lTs`l~K%BhG{h`)VU^1uy7m&0Ee-7KrtVoX+~}twa78sumaF2_w2Z=Ql8f*IhIjS9IF*4 zTZ&483zKm=H94DcEI54W_j$fPtUx@vv$4N%e)iKQhP(I7)ke^X7jN@^* zPHV~No-Y5ee5^QD{1`S*bS7MGh5o$|hUZ)iw?JHhkE`n<8muY4n2=I4Vc77#%Dcu( zfpfOI23T;?V%n+|i7P259G2JBe;^!pqDJHk?K%}L@mS2XzrP*a2|rw=a}gBjtJVnh zDQ`BNV-1|bwKlJdBu68yZ02AOb2%Yy!oi+(A??thti-U)-P*EcjN76Fa6+wdilw5%g&!ae`}ik zGwBPj5H*1MGyF@~$NVdiSDEM#(@J29hmo|;dIc)h9VG-Q_t3%gKUdI@G*-Nx4s zxG8Lo`@P7MiW4;5o`FB%HQ$?PcG1d5CvdtS!5McW=H`w{$D$_MJJ|d96+DsqK)pKP zZb=~jFD>Q*F!X^%!P6CW*7GetbaABn)Hb~x0bnpsC_|cG@5I@34zFgDz~?w$fBReC zyGHjxPBqwy61?djgpW;4oD+zu=IS|)MToU26MX1!;@t7PScjxtlpCSQ2fujs`9Glh zB&Qr~RdN28=~HcbrvWXS*C`rsEbAN@$C(IrG^~wu{EkPhjnk|dpT*&T2R1X1KcxF8 zrvO`3@YzsJ$h~#4x4cYeU?n^}SJ2(lVWZV%-D@pCQ{=pqeg1wP`#A;J>hf6pFAY8n zw zUijYclvkKc)G-_6RP{_9*`9fnQMiZ`R*wP6{IpRmhpcoM-i{hUGZ#1B{^oN(rxoOM z6}f`M2V>@pfb20V7zJW8KgKJ?k1f)e1$T2hez>UYv0QEra{ zz_a1M3mhH`#@8E2w+XZj4vg}#aZmd%(~5FxB3BSUO*aqI5K(YIB{_E$2>R?CF!t@$p4bzf zazGx%<_%8*Yra$#0O_*im$hCwA6JV(zE(s$bLqem>)ior`<@~{g2_Preq^qW%ny0y ze9ZHjO;sKUlG&fxgT@ue~Rnk#k z{#jlh#_uX~@H(g*UgFN`JEV=0AAOHR*k7RdX@E)&Xe|XI$o)cnVnXmJG*M2y)J~P1 zb_(KNpV~rlYB3St9_r&8g!I`idBnTcHAN^#iLy(DxuRY?YS69D#ZD~1zVXJZ+o9<% zQuzh7GGe}U3`8#PB!hv|VxLaps8aw}|SgqmN|;oMx! zVXA6Rk)$6|gOB6axFu}|ED6-ZHlj&==R9N?Ucc%HVn>VN}sIn}@B`!^qzxGDaE z7PP9IG!uETHaxS^+}H{^d2}V-pVanAy#y`b2ev20Q?Bo7z*fwIBJk>so5CU>?tVK~B|aP;^Fe z5SRi4ftH*PPe@nK)pI$VZ)YwceSBOF@1^}kIt0+-NpGb&skE^OVJ6yBGu=&|zyz?`ftwYcmJVgRJUwg;CBY)h+zjue1r9g0+|0~|3+x` z?eZ=EZxHuvR;E0u4fBWbG*^jIxrYK$IpOKY6*NFi%H;v4DuiE_8nO1!EMbPbO>gQp zy=%KjzDrD2(+i%a>tD-L<%7m1v-$IU{ituSK2ZSM`OcNy(6}GvZ_KlrnPDmRGP^I( z!CH@ye^IU6^!^b3hUB+%A$VzSTbllQw4xJrHa5G3c516epMN$-S#!`t zsHv)%cKoa6eS1O+UU}!+M}M~R#BCM5^XzwTgj&52uRYJLem2UP-qe9(le%ng4F^#_ zT2=>~wTHpqWIpY6R6=_ZZXM0TJfch{`1*%-J$UcC{D6-ZW=>`t1ewOOFTcwK-_tXf zj&8jDtxMbVDda?McK_m;=U)o8{;Q#-uhdyZB-K7{k)XGKz|By2#v<{~SQ)P*Elr5p zM{6Ry-}t-z{s>PBkR{EsNrG*yIqCK)vukg9JJPGuoSWYZUv`2{f8y insertTransaksi( + String tanggal, + String tipe, + String kategoriid, + String jumlah, + String catatan, + String userid, + String sender, + String url) async { + String paramPostInUrl = ""; + if (tipe == "KREDIT") { + sender = ""; + paramPostInUrl = + "?tanggal=$tanggal&tipe=$tipe&kategoriid=$kategoriid&jumlah=$jumlah&catatan=$catatan&url=$url&userid=$userid&sender=$sender"; + } else { + if (tipe == "DEBIT") { + kategoriid = "0"; + paramPostInUrl = + "?tanggal=$tanggal&tipe=$tipe&kategoriid=$kategoriid&jumlah=$jumlah&catatan=$catatan&url=$url&userid=$userid&sender=$sender"; + } + } + // /?tanggal=2023-12-29&tipe=KREDIT&kategoriid=3&jumlah=5000&catatan=Lakban%20Besar&url=&userid=1&sender= + + final service = + "${Constant.baseUrlDevone}transaction/addtransaction/$paramPostInUrl"; + final resp = await get( + // param: { + // "": "", + // }, + service: service, + ); + + print("url insert transaksi : $service"); + + // final result = List.empty(growable: true); + // resp['data'].forEach((e) { + // final model = ListCategory.fromJson(e); + // result.add(model); + // }); + + return resp['status']; + } } diff --git a/app_petty_cash/lib/screen/transaksi/insert_transaksi_provider.dart b/app_petty_cash/lib/screen/transaksi/insert_transaksi_provider.dart new file mode 100644 index 0000000..c38e916 --- /dev/null +++ b/app_petty_cash/lib/screen/transaksi/insert_transaksi_provider.dart @@ -0,0 +1,84 @@ + +import 'package:equatable/equatable.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; + +import '../../repository/transaksi_repository.dart'; +import '../../provider/dio_provider.dart'; +import '../../repository/base_repository.dart'; + +abstract class InsertTransaksiState extends Equatable { + final DateTime date; + const InsertTransaksiState(this.date); + @override + List get props => [date]; +} + +class InsertTransaksiStateInit extends InsertTransaksiState { + InsertTransaksiStateInit() : super(DateTime.now()); +} + +class InsertTransaksiStateLoading extends InsertTransaksiState { + InsertTransaksiStateLoading() : super(DateTime.now()); +} + +class InsertTransaksiStateError extends InsertTransaksiState { + final String message; + InsertTransaksiStateError({ + required this.message, + }) : super(DateTime.now()); +} + +class InsertTransaksiStateDone extends InsertTransaksiState { + // final List model; + final String resp; + InsertTransaksiStateDone({ + required this.resp, + }) : super(DateTime.now()); +} + +//notifier +class InsertTransaksiNotifier extends StateNotifier { + final Ref ref; + InsertTransaksiNotifier({ + required this.ref, + }) : super(InsertTransaksiStateInit()); + + void insertTransaksi( + String tanggal, + String tipe, + String kategoriid, + String jumlah, + String catatan, + String userid, + String sender, + String url, + ) async { + try { + state = InsertTransaksiStateLoading(); + final dio = ref.read(dioProvider); + final resp = await TransaksiRepository(dio: dio).insertTransaksi( + tanggal, + tipe, + kategoriid, + jumlah, + catatan, + userid, + sender, + url, + ); + state = InsertTransaksiStateDone(resp: resp); + } catch (e) { + if (e is BaseRepositoryException) { + state = InsertTransaksiStateError(message: e.message.toString()); + } else { + state = InsertTransaksiStateError(message: e.toString()); + } + } + } +} + +//provider +final insertTransaksiProvider = + StateNotifierProvider( + (ref) => InsertTransaksiNotifier(ref: ref), +); diff --git a/app_petty_cash/lib/screen/transaksi/transaksi_screen.dart b/app_petty_cash/lib/screen/transaksi/transaksi_screen.dart index a5b8270..48d5a87 100644 --- a/app_petty_cash/lib/screen/transaksi/transaksi_screen.dart +++ b/app_petty_cash/lib/screen/transaksi/transaksi_screen.dart @@ -1,5 +1,7 @@ import 'package:app_petty_cash/app/app_extension.dart'; +import 'package:app_petty_cash/app/route.dart'; import 'package:app_petty_cash/model/list_type_model.dart'; +import 'package:app_petty_cash/screen/transaksi/insert_transaksi_provider.dart'; import 'package:app_petty_cash/screen/transaksi/list_category_provider.dart'; import 'package:app_petty_cash/screen/transaksi/list_type_provider.dart'; import 'package:dropdown_button2/dropdown_button2.dart'; @@ -66,6 +68,9 @@ class TransaksiScreen extends HookConsumerWidget { ), ); + // transaksi + final transaksiIsLoading = useState(false); + // A. LISTEN PROVIDER ref.listen( listTypeProvider, @@ -73,7 +78,7 @@ class TransaksiScreen extends HookConsumerWidget { if (next is ListTypeStateLoading) { listTypeLoading.value = true; } else if (next is ListTypeStateError) { - print(next.message); + // print(next.message); listTypeLoading.value = false; SanckbarWidget(context, next.message, snackbarType.error); } else if (next is ListTypeStateDone) { @@ -100,7 +105,7 @@ class TransaksiScreen extends HookConsumerWidget { if (next is ListCategoryStateLoading) { listCategoryLoading.value = true; } else if (next is ListCategoryStateError) { - print(next.message); + // print(next.message); listCategoryLoading.value = false; SanckbarWidget(context, next.message, snackbarType.error); } else if (next is ListCategoryStateDone) { @@ -113,6 +118,31 @@ class TransaksiScreen extends HookConsumerWidget { }, ); + // insert transaksi provider + ref.listen( + insertTransaksiProvider, + (previous, next) { + if (next is InsertTransaksiStateLoading) { + transaksiIsLoading.value = true; + } else if (next is InsertTransaksiStateError) { + print(next.message); + transaksiIsLoading.value = false; + SanckbarWidget(context, next.message, snackbarType.error); + } else if (next is InsertTransaksiStateDone) { + // print(jsonEncode(next.model)); + // print(next.model.length); + transaksiIsLoading.value = false; + SanckbarWidget( + context, + 'Data Berhasil Disimpan', + snackbarType.success, + ); + Navigator.of(context).pop(); + Navigator.of(context).pushNamed(homeRoute); + } + }, + ); + useEffect(() { WidgetsBinding.instance.addPostFrameCallback((timeStamp) async { // list Type Provider @@ -254,42 +284,57 @@ class TransaksiScreen extends HookConsumerWidget { SizedBox( width: Constant.getActualXPhone(context: context, x: 340), height: Constant.getActualYPhone(context: context, y: 36), - child: Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - if (listTypeData.value.isEmpty) - Text('Radio Button Empty') - else - for (var i = 0; i < listTypeData.value.length; i++) - Padding( - padding: const EdgeInsets.only(right: 20), - child: Row( - children: [ - Radio( - activeColor: Constant.confirmed, - value: listTypeData.value[i], - groupValue: selectedListTypeData.value, - onChanged: (ListType? index) { - if (isMounted()) { - selectedListTypeData.value = index!; - } else { - return; - } - }, - ), - Text( - listTypeData.value[i].typename ?? "", - style: Constant.body1(context: context) - .copyWith( - color: Constant.textBlack, - fontWeight: FontWeight.w400, + child: (listTypeLoading.value) + ? SizedBox( + width: Constant.getActualXPhone( + context: context, x: 24), + height: Constant.getActualYPhone( + context: context, y: 32), + child: Center( + child: CircularProgressIndicator(), + ), + ) + : Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + if (listTypeData.value.isEmpty) + Text('Radio Button Empty') + else + for (var i = 0; + i < listTypeData.value.length; + i++) + Padding( + padding: const EdgeInsets.only(right: 20), + child: Row( + children: [ + Radio( + activeColor: Constant.confirmed, + value: listTypeData.value[i], + groupValue: + selectedListTypeData.value, + onChanged: (ListType? index) { + if (isMounted()) { + selectedListTypeData.value = + index!; + } else { + return; + } + }, + ), + Text( + listTypeData.value[i].typename ?? "", + style: + Constant.body1(context: context) + .copyWith( + color: Constant.textBlack, + fontWeight: FontWeight.w400, + ), + ), + ], ), ), - ], - ), - ), - ], - ), + ], + ), ), SizedBox( @@ -297,9 +342,156 @@ class TransaksiScreen extends HookConsumerWidget { ), // Kategori - if (selectedListTypeData.value.typeid != "KREDIT") ...[ + if (selectedListTypeData.value.typeid == "KREDIT") ...[ Text( 'Kategori', + style: Constant.body1(context: context).copyWith( + fontWeight: FontWeight.w600, + color: Constant.textBlack, + ), + ), + SizedBox( + height: Constant.getActualYPhone(context: context, y: 10), + ), + // Dropdown kategori + (listCategoryLoading.value) + ? SizedBox( + width: Constant.getActualXPhone( + context: context, x: 24), + height: Constant.getActualYPhone( + context: context, y: 32), + child: Center( + child: CircularProgressIndicator(), + ), + ) + : SizedBox( + width: Constant.getActualXPhone( + context: context, x: 390), + child: DropdownButtonHideUnderline( + child: DropdownButton2( + isExpanded: true, + hint: Row( + children: [ + Expanded( + child: Text( + 'Select Item', + style: Constant.body1(context: context) + .copyWith( + fontWeight: FontWeight.w600, + color: Constant.textBlack), + overflow: TextOverflow.ellipsis, + ), + ), + ], + ), + items: listCategoryData.value + .map((ListCategory option) { + return DropdownMenuItem( + value: option, + child: Text( + option.categoryname ?? "", + style: Constant.body1(context: context) + .copyWith( + color: Constant.textBlack, + fontWeight: FontWeight.w600), + ), + ); + }).toList(), + value: selectedListCategory.value, + onChanged: (ListCategory? newValue) { + // if (newValue) { + selectedListCategory.value = newValue!; + print(selectedListCategory.value.categoryid); + // } + }, + buttonStyleData: ButtonStyleData( + height: Constant.getActualY( + context: context, y: 56), + width: Constant.getActualX( + context: context, x: 320), + padding: EdgeInsets.only( + left: Constant.getActualX( + context: context, x: 10), + right: Constant.getActualX( + context: context, x: 10), + ), + decoration: BoxDecoration( + color: Constant.white, + border: Border.all( + color: Constant.textBlack, width: 1), + borderRadius: BorderRadius.circular(8), + ), + elevation: 2, + ), + iconStyleData: IconStyleData( + icon: Icon( + Icons.keyboard_arrow_down_outlined, + ), + iconSize: 24, + iconEnabledColor: Constant.textBlack, + iconDisabledColor: Colors.grey, + ), + dropdownStyleData: DropdownStyleData( + maxHeight: Constant.getActualY( + context: context, y: 200), + // width: Constant.getActualX(context: context, x: 320), + padding: EdgeInsets.only( + top: Constant.getActualY( + context: context, y: 10), + left: Constant.getActualX( + context: context, x: 10), + right: Constant.getActualX( + context: context, x: 10), + bottom: Constant.getActualY( + context: context, y: 10), + ), + decoration: BoxDecoration( + color: Constant.white, + borderRadius: BorderRadius.circular(8), + boxShadow: [ + BoxShadow( + color: Colors.grey, + blurRadius: 20.0, + spreadRadius: 2.0, + offset: Offset(0.0, 0.0), + ), + ], + ), + elevation: 8, + offset: const Offset(0, -10), + scrollbarTheme: ScrollbarThemeData( + radius: const Radius.circular(40), + thickness: + MaterialStateProperty.all(6), + thumbVisibility: + MaterialStateProperty.all(true), + ), + ), + menuItemStyleData: MenuItemStyleData( + height: Constant.getActualY( + context: context, y: 56), + padding: EdgeInsets.only( + top: Constant.getActualY( + context: context, y: 10), + left: Constant.getActualX( + context: context, x: 10), + right: Constant.getActualX( + context: context, x: 10), + ), + ), + ), + ), + ), + + SizedBox( + height: Constant.getActualYPhone(context: context, y: 20), + ), + ], + + // Nama Pengirim + if (selectedListTypeData.value.typeid == "DEBIT") ...[ + Text( + 'Nama Pengirim', style: Constant.body1(context: context).copyWith( fontWeight: FontWeight.w600, color: Constant.textBlack), @@ -307,160 +499,34 @@ class TransaksiScreen extends HookConsumerWidget { SizedBox( height: Constant.getActualYPhone(context: context, y: 10), ), - // Dropdown kategori - SizedBox( - width: Constant.getActualXPhone(context: context, x: 390), - child: DropdownButtonHideUnderline( - child: DropdownButton2( - isExpanded: true, - hint: Row( - children: [ - Expanded( - child: Text( - 'Select Item', - style: Constant.body1(context: context) - .copyWith( - fontWeight: FontWeight.w600, - color: Constant.textBlack), - overflow: TextOverflow.ellipsis, - ), - ), - ], - ), - items: - listCategoryData.value.map((ListCategory option) { - return DropdownMenuItem( - value: option, - child: Text( - option.categoryname ?? "", - style: Constant.body1(context: context) - .copyWith( - color: Constant.textBlack, - fontWeight: FontWeight.w600), - ), - ); - }).toList(), - value: selectedListCategory.value, - onChanged: (ListCategory? newValue) { - // if (newValue) { - selectedListCategory.value = newValue!; - print(selectedListCategory.value.categoryid); - // } - }, - buttonStyleData: ButtonStyleData( - height: - Constant.getActualY(context: context, y: 56), - width: - Constant.getActualX(context: context, x: 320), - padding: EdgeInsets.only( - left: - Constant.getActualX(context: context, x: 10), - right: - Constant.getActualX(context: context, x: 10), - ), - decoration: BoxDecoration( - color: Constant.white, - border: Border.all( - color: Constant.textBlack, width: 1), - borderRadius: BorderRadius.circular(8), - ), - elevation: 2, - ), - iconStyleData: IconStyleData( - icon: Icon( - Icons.keyboard_arrow_down_outlined, - ), - iconSize: 24, - iconEnabledColor: Constant.textBlack, - iconDisabledColor: Colors.grey, - ), - dropdownStyleData: DropdownStyleData( - maxHeight: - Constant.getActualY(context: context, y: 200), - // width: Constant.getActualX(context: context, x: 320), - padding: EdgeInsets.only( - top: Constant.getActualY(context: context, y: 10), - left: - Constant.getActualX(context: context, x: 10), - right: - Constant.getActualX(context: context, x: 10), - bottom: - Constant.getActualY(context: context, y: 10), - ), - decoration: BoxDecoration( - color: Constant.white, - borderRadius: BorderRadius.circular(8), - boxShadow: [ - BoxShadow( - color: Colors.grey, - blurRadius: 20.0, - spreadRadius: 2.0, - offset: Offset(0.0, 0.0), - ), - ], - ), - elevation: 8, - offset: const Offset(0, -10), - scrollbarTheme: ScrollbarThemeData( - radius: const Radius.circular(40), - thickness: MaterialStateProperty.all(6), - thumbVisibility: - MaterialStateProperty.all(true), - ), - ), - menuItemStyleData: MenuItemStyleData( - height: - Constant.getActualY(context: context, y: 56), - padding: EdgeInsets.only( - top: Constant.getActualY(context: context, y: 10), - left: - Constant.getActualX(context: context, x: 10), - right: - Constant.getActualX(context: context, x: 10), - ), + TextField( + controller: ctrlNamaPengirim, + decoration: InputDecoration( + hintStyle: + Constant.body2_400(context: context).copyWith( + color: Colors.orange, + ), + labelStyle: + Constant.body2_400(context: context).copyWith( + color: Colors.orange, + ), + border: OutlineInputBorder( + borderSide: BorderSide( + color: Colors.orange, + width: 1, ), ), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide( + color: Colors.orange, + width: 1, + ), + ), + // labelText: "Nama Pengirim", + // hintText: 'Nama Pengirim', ), ), - - SizedBox( - height: Constant.getActualYPhone(context: context, y: 20), - ), ], - - Text( - 'Nama Pengirim', - style: Constant.body1(context: context).copyWith( - fontWeight: FontWeight.w600, color: Constant.textBlack), - ), - SizedBox( - height: Constant.getActualYPhone(context: context, y: 10), - ), - TextField( - controller: ctrlNamaPengirim, - decoration: InputDecoration( - hintStyle: Constant.body2_400(context: context).copyWith( - color: Colors.orange, - ), - labelStyle: Constant.body2_400(context: context).copyWith( - color: Colors.orange, - ), - border: OutlineInputBorder( - borderSide: BorderSide( - color: Colors.orange, - width: 1, - ), - ), - focusedBorder: OutlineInputBorder( - borderSide: BorderSide( - color: Colors.orange, - width: 1, - ), - ), - // labelText: "Nama Pengirim", - // hintText: 'Nama Pengirim', - ), - ), // CustomTextField( // isNumber: false, // isReadOnly: false, @@ -618,12 +684,67 @@ class TransaksiScreen extends HookConsumerWidget { width: Constant.getActualXPhone(context: context, x: 336), height: Constant.getActualYPhone(context: context, y: 42), child: ElevatedButton( - child: Text( - 'Simpan', - style: Constant.body1(context: context).copyWith( - fontWeight: FontWeight.w600, color: Constant.textBlack), + child: Stack( + children: [ + (transaksiIsLoading.value) + ? SizedBox( + width: Constant.getActualXPhone( + context: context, x: 24), + height: Constant.getActualYPhone( + context: context, y: 32), + child: CircularProgressIndicator( + color: Colors.white, + ), + ) + : Text( + 'Simpan', + style: Constant.body1(context: context).copyWith( + fontWeight: FontWeight.w600, + color: Constant.textBlack), + ), + ], ), - onPressed: () {}, + onPressed: () { + if (selectedListTypeData.value.typeid.toString() == + "KREDIT") { + ctrlNamaPengirim.text = ""; + // validasi form + } else { + if (selectedListTypeData.value.typeid.toString() == + "DEBIT") { + selectedListCategory.value.categoryid = "0"; + // validasi form + } + } + + DateTime parsedDate = DateFormat('dd-MM-yyyy').parse( + ctrlTglAwal.value.text.toString(), + ); + String formattedDateTransaksi = + DateFormat('yyyy-MM-dd').format(parsedDate); + var param = { + "tgltransaksi": formattedDateTransaksi, + "typeid": selectedListTypeData.value.typeid.toString(), + "categoryid": + selectedListCategory.value.categoryid.toString(), + "jumlah": ctrlJumlah.value.text.toString(), + "catatan": ctrlCatatan.value.text.toString(), + "userid": "1", + "namapengirim": ctrlNamaPengirim.value.text.toString(), + "url": "", + }; + print(param); + ref.read(insertTransaksiProvider.notifier).insertTransaksi( + formattedDateTransaksi, + selectedListTypeData.value.typeid.toString(), + selectedListCategory.value.categoryid.toString(), + ctrlJumlah.value.text.toString(), + ctrlCatatan.value.text.toString(), + "1", + ctrlNamaPengirim.value.text.toString(), + "", + ); + }, ), ), ),