From 90826fde6d3da32959757d451cd68b7de0b35c4e Mon Sep 17 00:00:00 2001 From: vjrj <vjrj@comunes.org> Date: Mon, 24 Apr 2023 23:31:30 +0200 Subject: [PATCH] Improved Tutorials --- assets/img/pos.png | Bin 0 -> 7762 bytes assets/img/pos.svg | 143 ++++++++++++++++++ assets/translations/en.json | 11 +- assets/translations/es.json | 15 +- lib/app_bloc_observer.dart | 2 +- lib/data/models/app_state.g.dart | 4 + lib/ui/screens/first_screen.dart | 2 +- lib/ui/screens/fourth_screen.dart | 4 +- lib/ui/screens/second_screen.dart | 3 +- lib/ui/screens/third_screen.dart | 85 +++++------ lib/ui/tutorial.dart | 5 +- lib/ui/tutorial_target.dart | 26 ++-- lib/ui/widgets/bottom_nav_bar.dart | 33 +++- .../widgets/fifth_screen/fifth_tutorial.dart | 7 +- .../widgets/first_screen/first_tutorial.dart | 8 +- .../widgets/second_screen/card_terminal.dart | 2 +- .../second_screen/card_terminal_screen.dart | 22 +-- lib/ui/widgets/second_screen/pos_widget.dart | 18 +++ .../second_screen/second_tutorial.dart | 9 +- .../widgets/third_screen/third_tutorial.dart | 6 +- pubspec.yaml | 2 +- 21 files changed, 303 insertions(+), 104 deletions(-) create mode 100644 assets/img/pos.png create mode 100644 assets/img/pos.svg create mode 100644 lib/ui/widgets/second_screen/pos_widget.dart diff --git a/assets/img/pos.png b/assets/img/pos.png new file mode 100644 index 0000000000000000000000000000000000000000..8aa96b59b9437f2aea8356be021874745f4c3eec GIT binary patch literal 7762 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×oB1DWzk?bM6$4je(d4AVk4w;z3;u0Kau6eHAMS&I{9#6y)=tce%Z#DxUnQv z5+$-H{pVaSkp+u=(*Qh;U!?96oh3vo+9#EDkHI)DVBBt`_kn6%M78y)3YPcdSm3aj zBcdNQpIMH|$~f7|Nf@Rw<T-b-nCR#8l*n9O9?bA}9r7~aSzo#LVIinJtV=Sf*pxm( zY>T_`Q1%vrL7M-v=j{vhdD|Q%GfoQE#WTDm$V6BfcbmR$qA0yG0p4oC>A|_aVK&fr zX%$lWP~KfJHpNqz(eX-OY50nBV4=i{qUZQtCg<3JW4L?inwg=i@7%xzDZOl*d^kaB z0pDL^Ym&PW3F7qxd^xj2FGVHTV`>HsTzaIhb7kY~hwo%vJZCn@Ruk%+nC_k0*;c@I z;-6zP8ODitgqNuPo_8Ev{zYby;mC&f{o!C@&Ri}@I9mhZPzt5@m#;I1P1;btJsHDc zhAMB!_(wZRgo$p@_*>n(9XDrGkh)ak(Ijd6X~XQD=&$2wlD2#`Uv#^5-E~|?lIAmq zy-@z;7&)3OM2Ugk<tc$B5|`&SQc`R#=Y#RCcsdYO2E~_|#W|HOO~yYrC1x%+p-_{c z3sL@hbRZ#jRYopc02Zy6l;p*l`$E3N+}GgSkRYA9S=uRHDOH6gvu6k<w92v1{1|`! zm^+MYD58y)EyQ*IyG#-mH%gpk{*ds6`UioOr>{|?)H}9rW<LiTYIT@3#l|x4sfv~H z_#fV}D&s%ZI3vt&PeyeV&elOO42uXimAWVFuiJ&rcWe8#hdWKVv_%w$urJY^CJku& zEv9MbU<@pB9cQW%tu-xDNZsV0CJnWFc;Tj5gBHHsbz;Y3cAq!>d}d0bUf7Dq{<9Jg zS)RNzIt_>n7Asn_uqZBc^YwC6r_jRsE(($G&J)I6#5(O}&hs#LbCC}W1@tOJVzp$T zl3A#9HBS~>zoHB;HqLU3*L0va4S)IOBU&J1xXAmQ=c&N|!60SmYx!zfv(WzmgGuM# literal 0 HcmV?d00001 diff --git a/assets/img/pos.svg b/assets/img/pos.svg new file mode 100644 index 00000000..914c7813 --- /dev/null +++ b/assets/img/pos.svg @@ -0,0 +1,143 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 19.2.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0 960 960" style="enable-background:new 0 0 960 960;" xml:space="preserve"> +<style type="text/css"> + .st0{fill:#1A1A1A;} + .st1{fill:#4D4D4D;} + .st2{fill:#333333;} + .st3{fill:#B3E2E5;} + .st4{fill:#D3F1F2;} + .st5{fill:#FFFFFF;} + .st6{fill:#F2F2F2;} + .st7{fill:#CC333F;} + .st8{fill:#F7E277;} + .st9{fill:#39B54A;} + .st10{font-family:'MyriadPro-Bold';} + .st11{font-size:38.1837px;} + .st12{clip-path:url(#SVGID_2_);} + .st13{fill:#4B9CB2;} + .st14{opacity:0.1;fill:#FFFFFF;enable-background:new ;} + .st15{fill:#37808C;} + .st16{fill:#FBB03B;} + .st17{fill:#C1272D;} + .st18{fill:#E5CD65;} + .st19{font-size:49.7356px;} + .st20{fill:#CCCCCC;} + .st21{fill:#6DBCDB;} + .st22{font-size:50.6622px;} +</style> +<g> + <path class="st0" d="M631.8,715H304.9c-14.5,0-26.3-11.8-26.3-26.3V199.5c0-14.5,11.8-26.3,26.3-26.3h326.9 + c14.5,0,26.3,11.8,26.3,26.3v489.2C658,703.2,646.3,715,631.8,715z"/> + <path class="st1" d="M632.4,667.2H304.3c-14.2,0-25.7-11.5-25.7-25.7V176.1c0-14.2,11.5-25.7,25.7-25.7h328.1 + c14.2,0,25.7,11.5,25.7,25.7v465.4C658,655.7,646.6,667.2,632.4,667.2z"/> + <path class="st2" d="M618.2,362.5H319.4c-6.4,0-11.6-5.2-11.6-11.6V216.4c0-6.4,5.2-11.6,11.6-11.6h298.8c6.4,0,11.6,5.2,11.6,11.6 + V351C629.7,357.3,624.6,362.5,618.2,362.5z"/> + <path class="st2" d="M618.2,667.2H319.4c-6.4,0-11.6-5.2-11.6-11.6V404.8c0-6.4,5.2-11.6,11.6-11.6h298.8c6.4,0,11.6,5.2,11.6,11.6 + v250.8C629.7,662,624.6,667.2,618.2,667.2z"/> + <path class="st3" d="M597,338.3H344.1c-6.4,0-11.6-5.2-11.6-11.6v-85.1c0-6.4,5.2-11.6,11.6-11.6H597c6.4,0,11.6,5.2,11.6,11.6 + v85.1C608.5,333.1,603.3,338.3,597,338.3z"/> + <path class="st4" d="M343.2,337.3v-85.1c0-6.4,5.2-11.6,11.6-11.6h252.8c0.3,0,0.6,0.1,0.9,0.1c-0.4-6-5.4-10.7-11.5-10.7H344.1 + c-6.4,0-11.6,5.2-11.6,11.6v85.1c0,6.1,4.7,11,10.7,11.5C343.2,337.9,343.2,337.6,343.2,337.3z"/> + <rect x="380.8" y="111.6" class="st5" width="180.4" height="93.2"/> + <path class="st0" d="M405,469h-63.5c-4.9,0-8.9-4-8.9-8.9v-25.9c0-4.9,4-8.9,8.9-8.9H405c4.9,0,8.9,4,8.9,8.9v25.9 + C413.9,465,409.9,469,405,469z"/> + <path class="st0" d="M502.3,469h-63.5c-4.9,0-8.9-4-8.9-8.9v-25.9c0-4.9,4-8.9,8.9-8.9h63.5c4.9,0,8.9,4,8.9,8.9v25.9 + C511.2,465,507.2,469,502.3,469z"/> + <path class="st0" d="M599.6,469h-63.5c-4.9,0-8.9-4-8.9-8.9v-25.9c0-4.9,4-8.9,8.9-8.9h63.5c4.9,0,8.9,4,8.9,8.9v25.9 + C608.5,465,604.5,469,599.6,469z"/> + <path class="st0" d="M405,525.4h-63.5c-4.9,0-8.9-4-8.9-8.9v-25.9c0-4.9,4-8.9,8.9-8.9H405c4.9,0,8.9,4,8.9,8.9v25.9 + C413.9,521.4,409.9,525.4,405,525.4z"/> + <path class="st0" d="M502.3,525.4h-63.5c-4.9,0-8.9-4-8.9-8.9v-25.9c0-4.9,4-8.9,8.9-8.9h63.5c4.9,0,8.9,4,8.9,8.9v25.9 + C511.2,521.4,507.2,525.4,502.3,525.4z"/> + <path class="st0" d="M599.6,525.4h-63.5c-4.9,0-8.9-4-8.9-8.9v-25.9c0-4.9,4-8.9,8.9-8.9h63.5c4.9,0,8.9,4,8.9,8.9v25.9 + C608.5,521.4,604.5,525.4,599.6,525.4z"/> + <path class="st0" d="M405,581.9h-63.5c-4.9,0-8.9-4-8.9-8.9v-25.9c0-4.9,4-8.9,8.9-8.9H405c4.9,0,8.9,4,8.9,8.9V573 + C413.9,577.9,409.9,581.9,405,581.9z"/> + <path class="st0" d="M502.3,581.9h-63.5c-4.9,0-8.9-4-8.9-8.9v-25.9c0-4.9,4-8.9,8.9-8.9h63.5c4.9,0,8.9,4,8.9,8.9V573 + C511.2,577.9,507.2,581.9,502.3,581.9z"/> + <path class="st0" d="M599.6,581.9h-63.5c-4.9,0-8.9-4-8.9-8.9v-25.9c0-4.9,4-8.9,8.9-8.9h63.5c4.9,0,8.9,4,8.9,8.9V573 + C608.5,577.9,604.5,581.9,599.6,581.9z"/> + <path class="st0" d="M405,638.3h-63.5c-4.9,0-8.9-4-8.9-8.9v-25.9c0-4.9,4-8.9,8.9-8.9H405c4.9,0,8.9,4,8.9,8.9v25.9 + C413.9,634.3,409.9,638.3,405,638.3z"/> + <path class="st0" d="M502.3,638.3h-63.5c-4.9,0-8.9-4-8.9-8.9v-25.9c0-4.9,4-8.9,8.9-8.9h63.5c4.9,0,8.9,4,8.9,8.9v25.9 + C511.2,634.3,507.2,638.3,502.3,638.3z"/> + <path class="st0" d="M599.6,638.3h-63.5c-4.9,0-8.9-4-8.9-8.9v-25.9c0-4.9,4-8.9,8.9-8.9h63.5c4.9,0,8.9,4,8.9,8.9v25.9 + C608.5,634.3,604.5,638.3,599.6,638.3z"/> + <path class="st6" d="M405,462.7h-63.5c-4.9,0-8.9-4-8.9-8.9v-25.9c0-4.9,4-8.9,8.9-8.9H405c4.9,0,8.9,4,8.9,8.9v25.9 + C413.9,458.7,409.9,462.7,405,462.7z"/> + <path class="st6" d="M502.3,462.7h-63.5c-4.9,0-8.9-4-8.9-8.9v-25.9c0-4.9,4-8.9,8.9-8.9h63.5c4.9,0,8.9,4,8.9,8.9v25.9 + C511.2,458.7,507.2,462.7,502.3,462.7z"/> + <path class="st6" d="M599.6,462.7h-63.5c-4.9,0-8.9-4-8.9-8.9v-25.9c0-4.9,4-8.9,8.9-8.9h63.5c4.9,0,8.9,4,8.9,8.9v25.9 + C608.5,458.7,604.5,462.7,599.6,462.7z"/> + <path class="st6" d="M405,519.1h-63.5c-4.9,0-8.9-4-8.9-8.9v-25.9c0-4.9,4-8.9,8.9-8.9H405c4.9,0,8.9,4,8.9,8.9v25.9 + C413.9,515.1,409.9,519.1,405,519.1z"/> + <path class="st6" d="M502.3,519.1h-63.5c-4.9,0-8.9-4-8.9-8.9v-25.9c0-4.9,4-8.9,8.9-8.9h63.5c4.9,0,8.9,4,8.9,8.9v25.9 + C511.2,515.1,507.2,519.1,502.3,519.1z"/> + <path class="st6" d="M599.6,519.1h-63.5c-4.9,0-8.9-4-8.9-8.9v-25.9c0-4.9,4-8.9,8.9-8.9h63.5c4.9,0,8.9,4,8.9,8.9v25.9 + C608.5,515.1,604.5,519.1,599.6,519.1z"/> + <path class="st6" d="M405,575.6h-63.5c-4.9,0-8.9-4-8.9-8.9v-25.9c0-4.9,4-8.9,8.9-8.9H405c4.9,0,8.9,4,8.9,8.9v25.9 + C413.9,571.6,409.9,575.6,405,575.6z"/> + <path class="st6" d="M502.3,575.6h-63.5c-4.9,0-8.9-4-8.9-8.9v-25.9c0-4.9,4-8.9,8.9-8.9h63.5c4.9,0,8.9,4,8.9,8.9v25.9 + C511.2,571.6,507.2,575.6,502.3,575.6z"/> + <path class="st6" d="M599.6,575.6h-63.5c-4.9,0-8.9-4-8.9-8.9v-25.9c0-4.9,4-8.9,8.9-8.9h63.5c4.9,0,8.9,4,8.9,8.9v25.9 + C608.5,571.6,604.5,575.6,599.6,575.6z"/> + <path class="st7" d="M405,632h-63.5c-4.9,0-8.9-4-8.9-8.9v-25.9c0-4.9,4-8.9,8.9-8.9H405c4.9,0,8.9,4,8.9,8.9v25.9 + C413.9,628,409.9,632,405,632z"/> + <path class="st8" d="M502.3,632h-63.5c-4.9,0-8.9-4-8.9-8.9v-25.9c0-4.9,4-8.9,8.9-8.9h63.5c4.9,0,8.9,4,8.9,8.9v25.9 + C511.2,628,507.2,632,502.3,632z"/> + <path class="st9" d="M599.6,632h-63.5c-4.9,0-8.9-4-8.9-8.9v-25.9c0-4.9,4-8.9,8.9-8.9h63.5c4.9,0,8.9,4,8.9,8.9v25.9 + C608.5,628,604.5,632,599.6,632z"/> + <text transform="matrix(1 0 0 1 362.6211 453.7075)" class="st2 st10 st11">1</text> + <text transform="matrix(1 0 0 1 459.9131 453.7075)" class="st2 st10 st11">2</text> + <text transform="matrix(1 0 0 1 558.5283 453.7075)" class="st2 st10 st11">3</text> + <text transform="matrix(1 0 0 1 362.6211 509.8701)" class="st2 st10 st11">4</text> + <text transform="matrix(1 0 0 1 459.9131 509.8701)" class="st2 st10 st11">5</text> + <text transform="matrix(1 0 0 1 558.5283 509.8701)" class="st2 st10 st11">6</text> + <text transform="matrix(1 0 0 1 362.6211 565.5908)" class="st2 st10 st11">7</text> + <text transform="matrix(1 0 0 1 459.9131 565.5908)" class="st2 st10 st11">8</text> + <text transform="matrix(1 0 0 1 558.5283 565.5908)" class="st2 st10 st11">9</text> + <path class="st2" d="M658.7,650.7h-1.1V380.3h1.1c12.5,0,22.6,10.1,22.6,22.6v225.2C681.4,640.6,671.2,650.7,658.7,650.7z"/> + <g> + <g> + <defs> + <rect id="SVGID_1_" x="326.4" y="692" width="293.2" height="216.4"/> + </defs> + <clipPath id="SVGID_2_"> + <use xlink:href="#SVGID_1_" style="overflow:visible;"/> + </clipPath> + <g class="st12"> + <path class="st13" d="M349,819.9l-3.2-377c-0.1-11.3,9-20.5,20.2-20.6l197-1.7c11.3-0.1,20.5,9,20.6,20.2l3.2,377 + c0.1,11.3-9,20.5-20.2,20.6l-197,1.7C358.4,840.2,349.1,831.2,349,819.9z"/> + <path class="st14" d="M583.6,440.8c-0.1-11.3-9.3-20.3-20.6-20.2l-147.8,1.3c0,0,45.4,101.5,85.2,190.5s86.3,193,86.3,193 + L583.6,440.8z"/> + + <rect x="377.7" y="464.5" transform="matrix(1 -8.613788e-03 8.613788e-03 1 -4.6566 3.3299)" class="st15" width="13" height="155.6"/> + + <ellipse transform="matrix(0.3414 -0.9399 0.9399 0.3414 -471.8543 898.984)" class="st16" cx="405.6" cy="786.2" rx="24.5" ry="24.5"/> + + <ellipse transform="matrix(0.906 -0.4232 0.4232 0.906 -279.8294 242.1063)" class="st17" cx="405.3" cy="751.2" rx="24.5" ry="24.5"/> + <rect x="518.8" y="670.8" class="st15" width="39.8" height="140"/> + <path class="st18" d="M444.2,541.9v-61.7c0-5,4.1-9.1,9.1-9.1H490c5,0,9.1,4.1,9.1,9.1v61.7c0,5-4.1,9.1-9.1,9.1h-36.7 + C448.3,551,444.2,547,444.2,541.9z"/> + <g> + <path class="st8" d="M485.7,521.3c6,0,10.8-4.9,10.8-10.8c0-6-4.9-10.8-10.8-10.8h-28.2c-6,0-10.8,4.9-10.8,10.8 + c0,6,4.9,10.8,10.8,10.8H485.7z"/> + <rect x="465.2" y="526.3" class="st8" width="13" height="24.7"/> + <path class="st8" d="M485.7,526.3h-2.6V551h5.3c5.9,0,10.6-4.8,10.6-10.6v-21.5C496.3,523.4,491.3,526.3,485.7,526.3z"/> + <path class="st8" d="M485.7,494.6c5.6,0,10.5,3,13.3,7.4v-20.3c0-5.9-4.8-10.6-10.6-10.6h-5.3v23.5H485.7z"/> + <path class="st8" d="M460.2,526.3h-2.6c-5.6,0-10.5-3-13.3-7.4v21.5c0,5.9,4.8,10.6,10.6,10.6h5.3V526.3z"/> + <path class="st8" d="M457.6,494.6h2.6v-23.5h-5.3c-5.9,0-10.6,4.8-10.6,10.6V502C447,497.6,452,494.6,457.6,494.6z"/> + <rect x="465.2" y="471.1" class="st8" width="13" height="23.5"/> + </g> + <text transform="matrix(0 1 -1 0 403.2148 464.4761)" class="st15 st10 st19">xxx xxx xxx</text> + </g> + </g> + </g> + <rect x="401.3" y="135" class="st20" width="116.3" height="7.3"/> + <rect x="401.3" y="157.5" class="st20" width="136" height="7.3"/> + <rect x="401.3" y="180.1" class="st20" width="98.1" height="7.3"/> + <text transform="matrix(1 0 0 1 422.1377 301.4038)" class="st21 st10 st22">xxxx</text> +</g> +</svg> diff --git a/assets/translations/en.json b/assets/translations/en.json index ffb8b074..cf442068 100644 --- a/assets/translations/en.json +++ b/assets/translations/en.json @@ -145,7 +145,7 @@ "creditCardKey_title": "Wallet Created!", "creditCardKey_desc": "Congratulations! You have successfully created your Äž1 wallet. Please note that everything is stored on this device, so make sure not to delete this application to avoid losing your wallet. Soon we will show you how to make a backup of your wallet, in case your device has any issues and you need to access your wallet.", "creditCardKey_web_title": "Wallet Created!", - "creditCardKey_web_desc": "Congratulations! You have successfully created your Äž1 wallet. It is important to note that this wallet is stored only in your browser. Therefore, if you close the browser and open it again, make sure that the same wallet appears. If not, you may be using an unsupported browser. Remember that we also have an app. Soon we will show you how to make a backup of your wallet, in case your device has any issues and you need to access your wallet.", + "creditCardKey_web_desc": "Congratulations! You have successfully created your Äž1 wallet. It is important to note that this wallet is stored only in your browser. Therefore, if you close the browser and open it again, make sure that the same wallet appears. If not, you may be using an unsupported browser. Remember that we also have an app. Soon we will show you how to make a backup of your wallet, in case your device has any issues.", "creditCardPubKey_title": "Wallet Public Address", "creditCardPubKey_desc": "On this screen you will find the abbreviated public address of your wallet. You can copy it by tapping on it to share it with others.", "paySearchUserKey_title": "Making Payments with Äž1", @@ -155,22 +155,23 @@ "paySentKey_title": "Sending Äž1", "paySentKey_desc": "Once you have indicated the payment amount, you only need to press the 'Send' button to make the payment. It is important to note that this wallet does not have a password, so it operates like a pocket wallet for quick transactions with small amounts.", "receiveMainKey_title": "Receiving Äž1", - "receiveMainKey_desc": "This works like the card machines in stores for customers to make payments, but here we operate with QR codes. Here you can generate QR codes so that other people can scan them and make payments to you.", + "receiveMainKey_desc": "This works similarly to point of sale machines in stores, but instead of credit card payments, we use QR codes. Here you can generate QR codes for others to scan and make payments to you.", "receiveQrKey_desc": "On this screen you will find your own QR code that you can share with others to receive payments in Äž1.", "receiveAmountKey_title": "QR with Amounts", - "receiveAmountKey_desc": "If you want to sell a product or service, you can generate a QR code with your address and the amount to be charged in Äž1. Please note that these QR codes only work between Äž1nkgo wallets for now.", + "receiveAmountKey_desc": "If you want to sell a product or service, you can generate a QR code with your public key and the amount to be charged in Äž1. Please note that these QR codes only work between Äž1nkgo wallets for now.", "receiveSumKey_title": "Quick Total", "receiveSumKey_desc": "You can also generate a QR code with the total amount of a purchase by adding up the prices of the items you are selling.", "contactsMainKey_title": "Contacts", "contactsMainKey_desc": "In this section you can save your most frequent contacts and scan QR codes from other people.", + "contactsQrKey_desc": "Here you can scan QR codes from other people to add them to your contacts.", "txMainKey_title": "Transactions", "txMainKey_desc": "Here you can see the history of your transactions. If your wallet is empty, to start using Äž1, you can offer your services on markets or web platforms such as Girala, Gchange, among others. If you already have Äž1, you can transfer them to this Äž1nkgo wallet and start using it.", "txBalanceKey_title": "Balance", "txBalanceKey_desc": "On this screen you can see the current balance of your Äž1nkgo wallet.", "txRefreshKey_title": "Refresh", "txRefreshKey_desc": "If you are waiting for a payment, you can press this button to refresh the screen. However, this wallet will also do it periodically for you and send you notifications of new payments.", - "infoMainKey_title": "More Information About the Wallet", - "infoMainKey_desc": "Here you will find more information about your virtual wallet.", + "infoMainKey_title": "More Information", + "infoMainKey_desc": "Here you will find more information about your wallet.", "exportMainKey_title": "Exporting the Wallet", "exportMainKey_desc": "It is important that you make a backup of your wallet as soon as possible and keep it safe, so that you can import it into another browser or the app, or restore your wallet in case you lose your device. To do this, press this 'Export' button, which will allow you to download a file with all the information from your wallet. This way, you can import your wallet into another browser or device and have access to your funds at all times." } diff --git a/assets/translations/es.json b/assets/translations/es.json index 1a06801a..15dc10c7 100644 --- a/assets/translations/es.json +++ b/assets/translations/es.json @@ -143,7 +143,7 @@ "fetch_tx_error": "Algo ha ido mal al obtener tus transacciones", "retry": "REINTENTAR", "creditCardKey_title": "¡Monedero creado!", - "creditCardKey_desc": "¡Felicidades! Has creado tu monedero Äž1 con éxito. Ten en cuenta que todo se almacena en este dispositivo, asà que asegúrate de no borrar esta aplicación para no perder tu monedero. En breve te enseñaremos cómo hacer un backup del monedero, por si tu dispositivo sufre algún problema, puedas acceder a tu monedero sin problemas.", + "creditCardKey_desc": "¡Felicidades! Has creado tu monedero Äž1 con éxito. Ten en cuenta que todo se almacena en este dispositivo, asà que asegúrate de no borrar esta aplicación para no perder tu monedero. En breve te enseñaremos cómo hacer un backup del monedero, por si tu dispositivo sufre algún problema.", "creditCardKey_web_title": "¡Monedero creado!", "creditCardKey_web_desc": "¡Felicidades! Has creado tu monedero Äž1 con éxito. Es importante que sepas que este monedero está almacenado sólo en tu navegador. Por eso, si cierras el navegador y lo abres de nuevo, asegúrate de que te sale el mismo monedero. Si no es asÃ, puede que estés usando un navegador no soportado. Recuerda que también tenemos una app. En breve te enseñaremos cómo hacer un backup del monedero, por si tu dispositivo sufre algún problema, puedas acceder a tu monedero sin problemas.", "creditCardPubKey_title": "Dirección Pública del Monedero", @@ -152,25 +152,26 @@ "paySearchUserKey_desc": "Desde esta sección puedes hacer pagos en Junas. Puedes buscar usuarios/as en la red o escanear códigos QR para hacer tus pagos.", "payAmountKey_title": "Indicar cantidad a pagar", "payAmountKey_desc": "En este campo deberás indicar la cantidad que deseas pagar en Junas.", - "paySentKey_title": "Una vez indicada la cantidad, solo necesitas presionar el botón 'Enviar' para realizar el pago. Es importante tener en cuenta que este monedero no tiene contraseña, asà que es como un monedero de bolsillo para operar rápidamente con pequeñas cantidades.", - "paySentKey_desc": "Recibiendo Junas", + "paySentKey_title": "Recibiendo Junas", + "paySentKey_desc": "Una vez indicada la cantidad, solo necesitas presionar el botón 'Enviar' para realizar el pago. Es importante tener en cuenta que este monedero no tiene contraseña, asà que es como un monedero de bolsillo para operar rápidamente con pequeñas cantidades.", "receiveMainKey_title": "Si deseas recibir Junas, esta sección es para ti.", - "receiveMainKey_desc": "Esto es como los datafonos de las tiendas para cobrar a clientes, pero aquà funcionamos con QRs. Aquà podrás generar códigos QR para que otras personas puedan escanearlos y realizarte pagos.", + "receiveMainKey_desc": "Esto funciona de manera similar a los datáfonos que se usan en las tiendas para cobrar, pero en lugar de pagos con tarjeta de crédito, usamos códigos QR. Aquà puedes generar códigos QR para que otras personas los escaneen y te hagan pagos.", "receiveQrKey_desc": "En esta pantalla encontrarás tu propio código QR que podrás compartir con otras personas para recibir pagos en Junas.", "receiveAmountKey_title": "QR con cantidades", - "receiveAmountKey_desc": "Si quieres vender algún producto o servicio, puedes generar un código QR con tu dirección y la cantidad a cobrar en Junas. Ten en cuenta que estos QRs por ahora solo funcionan entre monederos Äž1nkgo.", + "receiveAmountKey_desc": "Si quieres vender algún producto o servicio, puedes generar un código QR con tu llave pública y la cantidad a cobrar en Junas. Ten en cuenta que estos QRs por ahora solo funcionan entre monederos Äž1nkgo.", "receiveSumKey_title": "Cuenta rápida", "receiveSumKey_desc": "También puedes generar un código QR con el total de una compra, sumando el precio de los artÃculos que estás vendiendo.", "contactsMainKey_title": "Contactos", "contactsMainKey_desc": "En esta sección puedes guardar tus contactos más frecuentes y escanear códigos QR de otras personas.", + "contactsQrKey_desc": "Aquà puedes escanear el QR de otras personas para añadirlas a tus contactos.", "txMainKey_title": "Transacciones", "txMainKey_desc": "Aquà podrás ver el historial de tus transacciones. Si tu monedero está vacÃo, para empezar a usar Junas, puedes ofrecer tus servicios en mercados o plataformas webs como Girala, Gchange, entre otros. Si ya tienes Junas, puedes transferirlos a este monedero Äž1nkgo y empezar a usarlo.", "txBalanceKey_title": "Balance", "txBalanceKey_desc": "En esta pantalla podrás ver el balance actual de tu monedero Äž1nkgo.", "txRefreshKey_title": "Actualización", "txRefreshKey_desc": "Si estás esperando un pago, puedes presionar este botón para refrescar la pantalla. Sin embargo, este monedero también lo hará periódicamente por ti y te enviará notificaciones de nuevos pagos.", - "infoMainKey_title": "Más información del Monedero", - "infoMainKey_desc": "Aquà encontrarás más información acerca de tu monedero virtual.", + "infoMainKey_title": "Más información", + "infoMainKey_desc": "Aquà encontrarás más información acerca de tu monedero.", "exportMainKey_title": "Exportación del Monedero", "exportMainKey_desc": "Es importante que realices un backup de tu monedero cuanto antes y ponerlo a buen recaudo, para poder importarlo en otro navegador o en la App, o en cualquier caso restaurar tu monedero en caso de perder tu dispositivo. Para hacerlo, presiona este botón de 'Exportar', que te permitirá descargar un archivo con toda la información de tu monedero. De esta forma, podrás importar tu monedero en otro navegador o dispositivo y tener acceso a tus fondos en todo momento." } diff --git a/lib/app_bloc_observer.dart b/lib/app_bloc_observer.dart index e200dbc4..f2ea007c 100644 --- a/lib/app_bloc_observer.dart +++ b/lib/app_bloc_observer.dart @@ -13,7 +13,7 @@ class AppBlocObserver extends BlocObserver { @override void onChange(BlocBase<dynamic> bloc, Change<dynamic> change) { super.onChange(bloc, change); - // logger('============= ${bloc.runtimeType} $change ============='); + logger('============= ${bloc.runtimeType} $change ============='); } @override diff --git a/lib/data/models/app_state.g.dart b/lib/data/models/app_state.g.dart index 1ae258e7..539e4f6e 100644 --- a/lib/data/models/app_state.g.dart +++ b/lib/data/models/app_state.g.dart @@ -11,6 +11,9 @@ AppState _$AppStateFromJson(Map<String, dynamic> json) => AppState( warningViewed: json['warningViewed'] as bool? ?? false, warningBrowserViewed: json['warningBrowserViewed'] as bool? ?? false, expertMode: json['expertMode'] as bool? ?? false, + tutorials: (json['tutorials'] as Map<String, dynamic>?)?.map( + (k, e) => MapEntry(k, e as bool), + ), ); Map<String, dynamic> _$AppStateToJson(AppState instance) => <String, dynamic>{ @@ -18,4 +21,5 @@ Map<String, dynamic> _$AppStateToJson(AppState instance) => <String, dynamic>{ 'warningViewed': instance.warningViewed, 'warningBrowserViewed': instance.warningBrowserViewed, 'expertMode': instance.expertMode, + 'tutorials': instance.tutorials, }; diff --git a/lib/ui/screens/first_screen.dart b/lib/ui/screens/first_screen.dart index ce94f0c3..71bca9e2 100644 --- a/lib/ui/screens/first_screen.dart +++ b/lib/ui/screens/first_screen.dart @@ -31,10 +31,10 @@ class _FirstScreenState extends State<FirstScreen> { @override void initState() { tutorial = FirstTutorial(context); + super.initState(); if (context.read<BottomNavCubit>().state == 0) { Future<void>.delayed(Duration.zero, () => tutorial.showTutorial()); } - super.initState(); } @override diff --git a/lib/ui/screens/fourth_screen.dart b/lib/ui/screens/fourth_screen.dart index 3df8abeb..ee985635 100644 --- a/lib/ui/screens/fourth_screen.dart +++ b/lib/ui/screens/fourth_screen.dart @@ -18,11 +18,11 @@ class _FourthScreenState extends State<FourthScreen> { @override void initState() { - tutorial = FourthTutorial(context); + super.initState(); if (context.read<BottomNavCubit>().state == 3) { + tutorial = FourthTutorial(context); Future<void>.delayed(Duration.zero, () => tutorial.showTutorial()); } - super.initState(); } @override diff --git a/lib/ui/screens/second_screen.dart b/lib/ui/screens/second_screen.dart index a17dc0a3..ebf78b28 100644 --- a/lib/ui/screens/second_screen.dart +++ b/lib/ui/screens/second_screen.dart @@ -4,7 +4,6 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import '../../cubit/bottom_nav_cubit.dart'; import '../tutorial.dart'; -import '../tutorial_keys.dart'; import '../widgets/card_drawer.dart'; import '../widgets/second_screen/card_terminal.dart'; import '../widgets/second_screen/second_tutorial.dart'; @@ -31,7 +30,7 @@ class _SecondScreenState extends State<SecondScreen> { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar(key: receiveMainKey, title: Text(tr('receive_g1'))), + appBar: AppBar(title: Text(tr('receive_g1'))), drawer: const CardDrawer(), body: Column(children: const <Widget>[SizedBox(height: 2), CardTerminal()]), diff --git a/lib/ui/screens/third_screen.dart b/lib/ui/screens/third_screen.dart index 5d84d968..04c00866 100644 --- a/lib/ui/screens/third_screen.dart +++ b/lib/ui/screens/third_screen.dart @@ -27,7 +27,9 @@ class _ThirdScreenState extends State<ThirdScreen> { @override void initState() { tutorial = ThirdTutorial(context); - if (context.read<BottomNavCubit>().state == 2) { + if (context + .read<BottomNavCubit>() + .state == 2) { Future<void>.delayed(Duration.zero, () => tutorial.showTutorial()); } super.initState(); @@ -36,48 +38,45 @@ class _ThirdScreenState extends State<ThirdScreen> { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - key: contactsMainKey, - title: Text(tr('bottom_nav_trd')), - actions: <Widget>[ - IconButton( - key: contactsQrKey, - icon: const Icon(Icons.qr_code), - onPressed: () async { - final String? pubKey = await QrManager.qrScan(context); - if (pubKey != null && validateKey(pubKey)) { - final Contact contact = - await ContactsCache().getContact(pubKey); - if (!mounted) { - return; - } - if (!context.read<ContactsCubit>().isContact(pubKey)) { - context.read<ContactsCubit>().addContact(contact); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text(tr('contact_added')), - ), - ); - } else { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text(tr('contact_already_exists')), - ), - ); - } - } else { - if (!mounted) { - return; - } - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text(tr('wrong_public_key')), - ), - ); - } - }), - const SizedBox(width: 5), - ]), + appBar: AppBar(title: Text(tr('bottom_nav_trd')), actions: <Widget>[ + IconButton( + key: contactsQrKey, + icon: const Icon(Icons.qr_code), + onPressed: () async { + final String? pubKey = await QrManager.qrScan(context); + if (pubKey != null && validateKey(pubKey)) { + final Contact contact = + await ContactsCache().getContact(pubKey); + if (!mounted) { + return; + } + if (!context.read<ContactsCubit>().isContact(pubKey)) { + context.read<ContactsCubit>().addContact(contact); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(tr('contact_added')), + ), + ); + } else { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(tr('contact_already_exists')), + ), + ); + } + } else { + if (!mounted) { + return; + } + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(tr('wrong_public_key')), + ), + ); + } + }), + const SizedBox(width: 5), + ]), drawer: const CardDrawer(), body: const ContactsPage(), ); diff --git a/lib/ui/tutorial.dart b/lib/ui/tutorial.dart index 71803b4c..3d3aa3d5 100644 --- a/lib/ui/tutorial.dart +++ b/lib/ui/tutorial.dart @@ -1,4 +1,5 @@ import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:tutorial_coach_mark/tutorial_coach_mark.dart'; @@ -14,6 +15,7 @@ abstract class Tutorial { targets: createTargets(), // colorShadow: Colors.red, textSkip: tr('skip').toUpperCase(), + // hideSkip: true, // paddingFocus: 10, // opacityShadow: 0.8, onFinish: () { @@ -36,7 +38,8 @@ abstract class Tutorial { List<TargetFocus> createTargets(); void showTutorial() { - if (!context.read<AppCubit>().wasTutorialShown(tutorialId)) { + if (!kReleaseMode || + !context.read<AppCubit>().wasTutorialShown(tutorialId)) { _tutorial.show(context: context); } } diff --git a/lib/ui/tutorial_target.dart b/lib/ui/tutorial_target.dart index 2db7d48b..c356f4ba 100644 --- a/lib/ui/tutorial_target.dart +++ b/lib/ui/tutorial_target.dart @@ -3,15 +3,17 @@ import 'package:flutter/material.dart'; import 'package:tutorial_coach_mark/tutorial_coach_mark.dart'; class TutorialTarget extends TargetFocus { - TutorialTarget({ - required String super.identify, - required GlobalKey super.keyTarget, - super.shape = ShapeLightFocus.Circle, - super.enableOverlayTab = true, - super.enableTargetTab = true, - bool? title = true, - ContentAlign align = ContentAlign.bottom, - }) : super(contents: <TargetContent>[ + TutorialTarget( + {required String super.identify, + super.color = Colors.black, + required GlobalKey super.keyTarget, + super.shape = ShapeLightFocus.Circle, + super.enableOverlayTab = true, + super.enableTargetTab = true, + bool? title = true, + ContentAlign align = ContentAlign.bottom, + Widget? extraWidget}) + : super(contents: <TargetContent>[ TargetContent( align: align, child: Column( @@ -32,7 +34,11 @@ class TutorialTarget extends TargetFocus { tr('${identify}_desc'), style: const TextStyle(color: Colors.white), ), - ) + ), + if (extraWidget != null) + Padding( + padding: const EdgeInsets.fromLTRB(0, 20, 0, 20), + child: extraWidget) ], )) ]); diff --git a/lib/ui/widgets/bottom_nav_bar.dart b/lib/ui/widgets/bottom_nav_bar.dart index 60f250c4..d7a598b6 100644 --- a/lib/ui/widgets/bottom_nav_bar.dart +++ b/lib/ui/widgets/bottom_nav_bar.dart @@ -3,12 +3,39 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import '../../cubit/bottom_nav_cubit.dart'; +import '../tutorial_keys.dart'; -class BottomNavBar extends StatelessWidget { +class BottomNavBar extends StatefulWidget { /// It is okay not to use a const constructor here. /// Using const breaks updating of selected BottomNavigationBarItem. const BottomNavBar({super.key}); + @override + State<BottomNavBar> createState() => _BottomNavBarState(); +} + +class _BottomNavBarState extends State<BottomNavBar> { + /* late Tutorial sndTutorial;* + late Tutorial trdTutorial; + late Tutorial fifthTutorial; */ + + @override + void initState() { + /* if (context.read<BottomNavCubit>().state == 1) { + sndTutorial = SecondTutorial(context); + Future<void>.delayed(Duration.zero, () => sndTutorial.showTutorial()); + } + if (context.read<BottomNavCubit>().state == 2) { + trdTutorial = ThirdTutorial(context); + Future<void>.delayed(Duration.zero, () => trdTutorial.showTutorial()); + } + if (context.read<BottomNavCubit>().state == 4) { + fifthTutorial = FifthTutorial(context); + Future<void>.delayed(Duration.zero, () => fifthTutorial.showTutorial()); + } */ + super.initState(); + } + @override Widget build(BuildContext context) { return Card( @@ -39,11 +66,11 @@ class BottomNavBar extends StatelessWidget { label: tr('bottom_nav_first'), ), BottomNavigationBarItem( - icon: const Icon(Icons.payments), + icon: Icon(key: receiveMainKey, Icons.payments), label: tr('bottom_nav_second'), ), BottomNavigationBarItem( - icon: const Icon(Icons.contacts), + icon: Icon(key: contactsMainKey, Icons.contacts), label: tr('bottom_nav_trd'), ), BottomNavigationBarItem( diff --git a/lib/ui/widgets/fifth_screen/fifth_tutorial.dart b/lib/ui/widgets/fifth_screen/fifth_tutorial.dart index d42d3d3c..50cdba79 100644 --- a/lib/ui/widgets/fifth_screen/fifth_tutorial.dart +++ b/lib/ui/widgets/fifth_screen/fifth_tutorial.dart @@ -12,11 +12,8 @@ class FifthTutorial extends Tutorial { @override List<TargetFocus> createTargets() { final List<TargetFocus> targets = <TargetFocus>[]; - targets.add(TutorialTarget( - identify: 'infoMainKey', - keyTarget: infoMainKey, - shape: ShapeLightFocus.RRect, - )); + targets + .add(TutorialTarget(identify: 'infoMainKey', keyTarget: infoMainKey)); targets.add(TutorialTarget( identify: 'exportMainKey', keyTarget: exportMainKey, diff --git a/lib/ui/widgets/first_screen/first_tutorial.dart b/lib/ui/widgets/first_screen/first_tutorial.dart index e1d1b9e8..1255f6cf 100644 --- a/lib/ui/widgets/first_screen/first_tutorial.dart +++ b/lib/ui/widgets/first_screen/first_tutorial.dart @@ -1,3 +1,4 @@ +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:tutorial_coach_mark/tutorial_coach_mark.dart'; @@ -13,14 +14,13 @@ class FirstTutorial extends Tutorial { List<TargetFocus> createTargets() { final List<TargetFocus> targets = <TargetFocus>[]; targets.add(TutorialTarget( - identify: 'creditCardKey', + identify: !kIsWeb ? 'creditCardKey' : 'creditCardKey_web', keyTarget: creditCardKey, shape: ShapeLightFocus.RRect, )); targets.add(TutorialTarget( identify: 'creditCardPubKey', keyTarget: creditCardPubKey, - shape: ShapeLightFocus.RRect, align: ContentAlign.right)); targets.add(TutorialTarget( identify: 'paySearchUserKey', @@ -32,11 +32,11 @@ class FirstTutorial extends Tutorial { keyTarget: payAmountKey, align: ContentAlign.top, shape: ShapeLightFocus.RRect)); - /* targets.add(TutorialTarget( + targets.add(TutorialTarget( identify: 'paySentKey', keyTarget: paySentKey, align: ContentAlign.top, - shape: ShapeLightFocus.RRect));*/ + shape: ShapeLightFocus.RRect)); return targets; } } diff --git a/lib/ui/widgets/second_screen/card_terminal.dart b/lib/ui/widgets/second_screen/card_terminal.dart index 774194f5..fbbf5e03 100644 --- a/lib/ui/widgets/second_screen/card_terminal.dart +++ b/lib/ui/widgets/second_screen/card_terminal.dart @@ -43,7 +43,7 @@ class _CardTerminalState extends State<CardTerminal> { child: ListView(children: <Widget>[ Padding( padding: EdgeInsets.symmetric( - horizontal: bigScreen(context) ? 50.0 : 10.0), + horizontal: bigScreen(context) ? 50.0 : 50.0), child: Card( elevation: 8.0, shape: RoundedRectangleBorder( diff --git a/lib/ui/widgets/second_screen/card_terminal_screen.dart b/lib/ui/widgets/second_screen/card_terminal_screen.dart index 5223faed..b3c0b854 100644 --- a/lib/ui/widgets/second_screen/card_terminal_screen.dart +++ b/lib/ui/widgets/second_screen/card_terminal_screen.dart @@ -22,7 +22,7 @@ class CardTerminalScreen extends StatelessWidget { shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), child: Container( width: double.infinity, - height: smallScreen(context) ? 212 : 252, + height: smallScreen(context) ? 200 : 252, decoration: BoxDecoration( borderRadius: BorderRadius.circular(8), gradient: const LinearGradient( @@ -88,14 +88,14 @@ class CardTerminalScreen extends StatelessWidget { Expanded( child: Column(children: <Widget>[ if (!amount.contains('+')) - QrImage( - data: getQrUri( - pubKey: SharedPreferencesHelper().getPubKey(), - locale: context.locale.toLanguageTag(), - amount: amount), - size: smallScreen(context) ? 100.0 : 140.0 - //: (smallScreen(context) ? 120.0 : 160.0), - ) + Expanded( + child: QrImage( + data: getQrUri( + pubKey: SharedPreferencesHelper().getPubKey(), + locale: context.locale.toLanguageTag(), + amount: amount), + // size: smallScreen(context) ? 95.0 : 140.0) + )) ])), Container( decoration: const BoxDecoration( @@ -117,7 +117,7 @@ class CardTerminalScreen extends StatelessWidget { Expanded( child: Padding( padding: const EdgeInsets.symmetric( - horizontal: 10, vertical: 5), + horizontal: 10, vertical: 6), child: Text.rich( TextSpan( children: <TextSpan>[ @@ -128,7 +128,7 @@ class CardTerminalScreen extends StatelessWidget { style: TextStyle( fontFamily: 'Roboto Mono', color: Colors.grey, - fontSize: smallScreen(context) ? 11 : 14, + fontSize: smallScreen(context) ? 12 : 14, ), ), ], diff --git a/lib/ui/widgets/second_screen/pos_widget.dart b/lib/ui/widgets/second_screen/pos_widget.dart new file mode 100644 index 00000000..f5742811 --- /dev/null +++ b/lib/ui/widgets/second_screen/pos_widget.dart @@ -0,0 +1,18 @@ +import 'package:flutter/material.dart'; + +class POSWidget extends StatelessWidget { + const POSWidget({ + super.key, + required this.context, + }); + + final BuildContext context; + + @override + Widget build(BuildContext context) { + return Image.asset( + //width: MediaQuery.of(context).size.width < smallScreenWidth ? 200 : 200, + 'assets/img/pos.png', + ); + } +} diff --git a/lib/ui/widgets/second_screen/second_tutorial.dart b/lib/ui/widgets/second_screen/second_tutorial.dart index f6dc5ca3..0ceaf6ca 100644 --- a/lib/ui/widgets/second_screen/second_tutorial.dart +++ b/lib/ui/widgets/second_screen/second_tutorial.dart @@ -4,6 +4,7 @@ import 'package:tutorial_coach_mark/tutorial_coach_mark.dart'; import '../../tutorial.dart'; import '../../tutorial_keys.dart'; import '../../tutorial_target.dart'; +import 'pos_widget.dart'; class SecondTutorial extends Tutorial { SecondTutorial(BuildContext context) @@ -13,10 +14,10 @@ class SecondTutorial extends Tutorial { List<TargetFocus> createTargets() { final List<TargetFocus> targets = <TargetFocus>[]; targets.add(TutorialTarget( - identify: 'receiveMainKey', - keyTarget: receiveMainKey, - shape: ShapeLightFocus.RRect, - )); + identify: 'receiveMainKey', + keyTarget: receiveMainKey, + align: ContentAlign.top, + extraWidget: POSWidget(context: context))); targets.add(TutorialTarget( identify: 'receiveQrKey', keyTarget: receiveQrKey, diff --git a/lib/ui/widgets/third_screen/third_tutorial.dart b/lib/ui/widgets/third_screen/third_tutorial.dart index bb89c1f3..a7c0a1e6 100644 --- a/lib/ui/widgets/third_screen/third_tutorial.dart +++ b/lib/ui/widgets/third_screen/third_tutorial.dart @@ -15,9 +15,9 @@ class ThirdTutorial extends Tutorial { targets.add(TutorialTarget( identify: 'contactsMainKey', keyTarget: contactsMainKey, - shape: ShapeLightFocus.RRect)); - targets.add( - TutorialTarget(identify: 'contactsQrKey', keyTarget: contactsQrKey)); + align: ContentAlign.top)); + targets.add(TutorialTarget( + identify: 'contactsQrKey', title: false, keyTarget: contactsQrKey)); return targets; } } diff --git a/pubspec.yaml b/pubspec.yaml index f8fa99a1..026f4381 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -126,7 +126,7 @@ flutter: - assets/tx.json - assets/gva-tx.json - assets/img/animated-bell.gif - - assets/img/pos.svg + - assets/img/pos.png fonts: - family: Nunito -- GitLab