Merge branch 'development_mirza' into 'master'
Development mirza See merge request mirza.shafique/mohem_flutter_app!4merge-requests/1/merge
@ -0,0 +1,3 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="25.409" height="25.409" viewBox="0 0 25.409 25.409">
|
||||||
|
<path id="close_3_" data-name="close (3)" d="M10.63,9.119l7-7A1.164,1.164,0,1,0,15.98.477l-7,7-7-7A1.164,1.164,0,0,0,.341,2.123l7,7-7,7a1.164,1.164,0,1,0,1.646,1.646l7-7,7,7a1.164,1.164,0,1,0,1.646-1.646Zm0,0" transform="translate(-0.096 12.609) rotate(-45)" fill="#fff"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 382 B |
@ -0,0 +1,6 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="22.997" height="19.414" viewBox="0 0 22.997 19.414">
|
||||||
|
<g id="promotion" transform="translate(-2 -3.116)">
|
||||||
|
<path id="Path_4626" data-name="Path 4626" d="M21.548,3.347a.23.23,0,0,0-.329-.208L9.457,8.732h.017v8.049H9.457l11.762,5.593a.23.23,0,0,0,.329-.208ZM8.324,16.493V9.019H5.584A3.663,3.663,0,0,0,2,12.756a3.724,3.724,0,0,0,2.517,3.568l1.889,6.044a.23.23,0,0,0,.22.161H9.736a.23.23,0,0,0,.22-.3L8.163,16.493ZM6.517,13.331a.575.575,0,0,0,.575-.575v-.164a.575.575,0,0,0-.575-.575H5.7a.575.575,0,0,0-.575.575v.164a.575.575,0,0,0,.575.575Z" transform="translate(0 0)" fill="#2e303a" fill-rule="evenodd"/>
|
||||||
|
<path id="Path_4627" data-name="Path 4627" d="M20.749,15.662a4.026,4.026,0,0,0,0-7.274ZM19.6,8.041a4.024,4.024,0,1,0,0,7.968Z" transform="translate(1.948 0.732)" fill="#2e303a" fill-rule="evenodd"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 871 B |
@ -0,0 +1,3 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="14.382" height="10.46" viewBox="0 0 14.382 10.46">
|
||||||
|
<path id="next_3_" data-name="next (3)" d="M15.191,8.768,10.615,4.192a.654.654,0,1,0-.924.924l3.46,3.46H1.654a.654.654,0,1,0,0,1.308h11.5l-3.46,3.46a.654.654,0,1,0,.924.924l4.576-4.576a.654.654,0,0,0,0-.924Z" transform="translate(-1 -4)" fill="#2e303a"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 362 B |
|
Before Width: | Height: | Size: 43 KiB |
@ -0,0 +1,3 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="17.186" height="17.186" viewBox="0 0 17.186 17.186">
|
||||||
|
<path id="delete_1_" data-name="delete (1)" d="M14.669,2.517A8.593,8.593,0,0,0,2.517,14.669,8.593,8.593,0,0,0,14.669,2.517Zm-2.359,8.606a.839.839,0,1,1-1.187,1.187l-2.53-2.53-2.53,2.53a.839.839,0,0,1-1.187-1.187l2.53-2.53-2.53-2.53A.839.839,0,1,1,6.063,4.876l2.53,2.53,2.53-2.53a.839.839,0,1,1,1.187,1.187l-2.53,2.53Zm0,0" fill="#ca3332"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 449 B |
@ -0,0 +1,3 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="18.537" height="18.537" viewBox="0 0 18.537 18.537">
|
||||||
|
<path id="clock_6_" data-name="clock (6)" d="M9.269,0a9.269,9.269,0,1,0,9.269,9.269A9.279,9.279,0,0,0,9.269,0Zm4.408,14.063a.772.772,0,0,1-1.092,0L8.723,10.2A.769.769,0,0,1,8.5,9.655V4.634a.772.772,0,0,1,1.545,0v4.7l3.636,3.636A.772.772,0,0,1,13.677,14.063Zm0,0" fill="#2d2f39"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 389 B |
@ -0,0 +1,3 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="17.967" height="17.967" viewBox="0 0 17.967 17.967">
|
||||||
|
<path id="close_3_" data-name="close (3)" d="M10.63,9.119l7-7A1.164,1.164,0,1,0,15.98.477l-7,7-7-7A1.164,1.164,0,0,0,.341,2.123l7,7-7,7a1.164,1.164,0,1,0,1.646,1.646l7-7,7,7a1.164,1.164,0,1,0,1.646-1.646Zm0,0" transform="translate(0 -0.136)" fill="#2e303a"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 368 B |
@ -0,0 +1,3 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="22.734" height="22.734" viewBox="0 0 22.734 22.734">
|
||||||
|
<path id="share" d="M16.03,9.319a6.71,6.71,0,0,0-5.907,3.537L7.8,11.635a4.037,4.037,0,0,0-.238-3.446l3.6-2.621a3.152,3.152,0,1,0-.818-1.053L6.731,7.149a4.042,4.042,0,1,0,.387,5.63l2.491,1.313a6.7,6.7,0,1,0,6.42-4.773ZM13.193,1.332a1.822,1.822,0,1,1-1.821,1.822A1.823,1.823,0,0,1,13.193,1.332ZM4.041,12.873a2.71,2.71,0,1,1,2.709-2.71A2.712,2.712,0,0,1,4.041,12.873ZM16.03,10.651a5.382,5.382,0,0,1,4.436,8.4,4.913,4.913,0,0,0-1.739-2.026,3.2,3.2,0,1,0-5.422-.042,4.883,4.883,0,0,0-1.764,1.99,5.381,5.381,0,0,1,4.488-8.327Zm-1.865,4.665a1.865,1.865,0,1,1,1.865,1.867A1.868,1.868,0,0,1,14.164,15.316ZM12.531,20.1a3.555,3.555,0,0,1,1.722-2.129A3.186,3.186,0,0,0,17.764,18a3.565,3.565,0,0,1,1.692,2.164,5.359,5.359,0,0,1-6.924-.061Z" transform="translate(0)" fill="#fff"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 876 B |
@ -0,0 +1,3 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="8" height="8" viewBox="0 0 8 8">
|
||||||
|
<circle id="Ellipse_205" data-name="Ellipse 205" cx="4" cy="4" r="4" fill="#fff"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 172 B |
@ -0,0 +1,3 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="14.004" height="13.318" viewBox="0 0 14.004 13.318">
|
||||||
|
<path id="Path_4" data-name="Path 4" d="M18.964,10.97a.368.368,0,0,0-.343-.255l-4.738-.1L12.328,6.157a.368.368,0,0,0-.7,0L10.077,10.62l-4.738.1a.368.368,0,0,0-.214.662L8.9,14.231,7.528,18.753a.368.368,0,0,0,.562.409l3.89-2.7,3.89,2.7a.368.368,0,0,0,.562-.409L15.06,14.231l3.775-2.854A.368.368,0,0,0,18.964,10.97Z" transform="translate(-4.978 -5.91)" fill="#eac321"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 476 B |
@ -0,0 +1,12 @@
|
|||||||
|
<svg id="jpg" xmlns="http://www.w3.org/2000/svg" width="30.502" height="34.859" viewBox="0 0 30.502 34.859">
|
||||||
|
<path id="Path_331" data-name="Path 331" d="M98.179,0A2.185,2.185,0,0,0,96,2.179v30.5a2.185,2.185,0,0,0,2.179,2.179h21.787a2.185,2.185,0,0,0,2.179-2.179V8.715L113.43,0Z" transform="translate(-91.643)" fill="#e2e5e7"/>
|
||||||
|
<path id="Path_332" data-name="Path 332" d="M354.179,8.715h6.536L352,0V6.536A2.185,2.185,0,0,0,354.179,8.715Z" transform="translate(-330.213)" fill="#b0b7bd"/>
|
||||||
|
<path id="Path_333" data-name="Path 333" d="M390.536,134.536,384,128h6.536Z" transform="translate(-360.034 -119.285)" fill="#cad1d8"/>
|
||||||
|
<path id="Path_334" data-name="Path 334" d="M58.145,251.983a1.093,1.093,0,0,1-1.089,1.089H33.089A1.093,1.093,0,0,1,32,251.983V241.089A1.093,1.093,0,0,1,33.089,240H57.055a1.093,1.093,0,0,1,1.089,1.089Z" transform="translate(-32 -223.66)" fill="#50bee8"/>
|
||||||
|
<g id="Group_692" data-name="Group 692" transform="translate(4.452 19.962)">
|
||||||
|
<path id="Path_335" data-name="Path 335" d="M100.428,295.637a.576.576,0,0,1,1.15,0v3.44a1.936,1.936,0,0,1-2.16,2.2,2.187,2.187,0,0,1-1.9-.9c-.444-.532.392-1.3.845-.741a1.3,1.3,0,0,0,1.141.54c.487-.017.915-.236.924-1.1v-3.44Z" transform="translate(-97.394 -294.959)" fill="#fff"/>
|
||||||
|
<path id="Path_336" data-name="Path 336" d="M181.344,294.921a.6.6,0,0,1,.593-.6h2.012a2.178,2.178,0,0,1,0,4.355h-1.454v1.15a.547.547,0,0,1-.558.6.588.588,0,0,1-.593-.6v-4.9Zm1.15.5v2.17h1.454a1.086,1.086,0,0,0,0-2.17Z" transform="translate(-175.628 -294.244)" fill="#fff"/>
|
||||||
|
<path id="Path_337" data-name="Path 337" d="M270.438,298.712a3.3,3.3,0,0,1-2.143.732,2.872,2.872,0,0,1-3.128-3.119,3.1,3.1,0,0,1,3.2-3.125,2.851,2.851,0,0,1,1.986.766.565.565,0,0,1-.757.837,1.841,1.841,0,0,0-1.229-.549,2.076,2.076,0,0,0-2.072,2.072A1.928,1.928,0,0,0,268.3,298.4a2.224,2.224,0,0,0,1.306-.392v-1.071H268.3a.532.532,0,1,1,0-1.063h1.742a.6.6,0,0,1,.618.514v1.855A.7.7,0,0,1,270.438,298.712Z" transform="translate(-253.745 -293.2)" fill="#fff"/>
|
||||||
|
</g>
|
||||||
|
<path id="Path_338" data-name="Path 338" d="M116.7,417.089H96v1.089h20.7a1.093,1.093,0,0,0,1.089-1.089V416A1.093,1.093,0,0,1,116.7,417.089Z" transform="translate(-91.643 -387.677)" fill="#cad1d8"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 2.1 KiB |
@ -0,0 +1,9 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="38.595" height="38.024" viewBox="0 0 38.595 38.024">
|
||||||
|
<g id="fingerprint1-scan" transform="translate(0.342 0.655)">
|
||||||
|
<path id="Path_4539" data-name="Path 4539" d="M38.892,0H33.378A1.379,1.379,0,0,0,32,1.378v8.27a1.378,1.378,0,0,0,2.757,0V2.757h4.135a1.378,1.378,0,1,0,0-2.757Z" transform="translate(-32.342 -0.655)" fill="#28323a"/>
|
||||||
|
<path id="Path_4540" data-name="Path 4540" d="M38.892,200.27H34.757v-6.892a1.378,1.378,0,1,0-2.757,0v8.27a1.379,1.379,0,0,0,1.378,1.378h5.514a1.378,1.378,0,1,0,0-2.757Z" transform="translate(-32.342 -165.658)" fill="#28323a"/>
|
||||||
|
<path id="Path_4541" data-name="Path 4541" d="M390.892,0h-5.514a1.378,1.378,0,0,0,0,2.757h4.135V9.649a1.378,1.378,0,0,0,2.757,0V1.378A1.379,1.379,0,0,0,390.892,0Z" transform="translate(-354.018 -0.655)" fill="#28323a"/>
|
||||||
|
<path id="Path_4542" data-name="Path 4542" d="M390.892,192a1.379,1.379,0,0,0-1.378,1.378v6.892h-4.135a1.378,1.378,0,0,0,0,2.757h5.514a1.379,1.379,0,0,0,1.378-1.378v-8.27A1.379,1.379,0,0,0,390.892,192Z" transform="translate(-354.018 -165.658)" fill="#28323a"/>
|
||||||
|
<path id="Path_4648" data-name="Path 4648" d="M13.343,0A13.343,13.343,0,1,0,26.686,13.343,13.343,13.343,0,0,0,13.343,0Zm4.924,8.9a1.911,1.911,0,1,1-1.911,1.911A1.912,1.912,0,0,1,18.267,8.9Zm-9.849,0a1.911,1.911,0,1,1-1.911,1.911A1.912,1.912,0,0,1,8.418,8.9Zm12.124,9.083a8.733,8.733,0,0,1-14.4,0A1.169,1.169,0,1,1,8.07,16.657a6.4,6.4,0,0,0,10.55,0,1.168,1.168,0,1,1,1.923,1.325Z" transform="translate(5.611 4.855)" fill="#28323a"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.5 KiB |
@ -0,0 +1,11 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="38.595" height="38.024" viewBox="0 0 38.595 38.024">
|
||||||
|
<g id="sms-speech-bubble" transform="translate(-1 1.645)">
|
||||||
|
<g id="textsms">
|
||||||
|
<path id="Path_4529" data-name="Path 4529" d="M21.992,0H2.444A2.451,2.451,0,0,0,0,2.444V24.436l4.887-4.887h17.1A2.451,2.451,0,0,0,24.436,17.1V2.444A2.451,2.451,0,0,0,21.992,0ZM8.552,11H6.109V8.552H8.552Zm4.887,0H11V8.552H13.44Zm4.887,0H15.883V8.552h2.444Z" transform="translate(8.144 5.013)" fill="#28323a"/>
|
||||||
|
<path id="Path_4543" data-name="Path 4543" d="M38.892,0H33.378A1.379,1.379,0,0,0,32,1.378v8.27a1.378,1.378,0,0,0,2.757,0V2.757h4.135a1.378,1.378,0,1,0,0-2.757Z" transform="translate(-31 -1.645)" fill="#28323a"/>
|
||||||
|
<path id="Path_4544" data-name="Path 4544" d="M38.892,200.27H34.757v-6.892a1.378,1.378,0,1,0-2.757,0v8.27a1.379,1.379,0,0,0,1.378,1.378h5.514a1.378,1.378,0,1,0,0-2.757Z" transform="translate(-31 -166.648)" fill="#28323a"/>
|
||||||
|
<path id="Path_4545" data-name="Path 4545" d="M390.892,0h-5.514a1.378,1.378,0,0,0,0,2.757h4.135V9.649a1.378,1.378,0,0,0,2.757,0V1.378A1.379,1.379,0,0,0,390.892,0Z" transform="translate(-352.676 -1.645)" fill="#28323a"/>
|
||||||
|
<path id="Path_4546" data-name="Path 4546" d="M390.892,192a1.379,1.379,0,0,0-1.378,1.378v6.892h-4.135a1.378,1.378,0,0,0,0,2.757h5.514a1.379,1.379,0,0,0,1.378-1.378v-8.27A1.379,1.379,0,0,0,390.892,192Z" transform="translate(-352.676 -166.648)" fill="#28323a"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.4 KiB |
@ -0,0 +1,9 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="38.595" height="38.024" viewBox="0 0 38.595 38.024">
|
||||||
|
<g id="fingerprint-scan" transform="translate(0.342 0.655)">
|
||||||
|
<path id="Path_4535" data-name="Path 4535" d="M24,0H2.909A2.913,2.913,0,0,0,0,2.909V24a2.913,2.913,0,0,0,2.909,2.909H24A2.913,2.913,0,0,0,26.913,24V2.909A2.913,2.913,0,0,0,24,0ZM5,5.182c5.592-4.061,11.49-4.018,17,.072a.789.789,0,0,1-.47,1.422c-.894,0-6.986-6.478-15.607-.218A.788.788,0,0,1,5,5.182Zm7.349,20.277a.788.788,0,0,1-1.1-.2c-1.111-1.606-3.634-3.4-3.634-6.757a6.063,6.063,0,0,1,5.835-6.255A6.063,6.063,0,0,1,19.291,18.5v.841a.788.788,0,0,1-1.577,0V18.5a4.488,4.488,0,0,0-4.258-4.678A4.488,4.488,0,0,0,9.2,18.5C9.2,22.3,14.037,24.294,12.353,25.459Zm9.8-4.08a4.132,4.132,0,0,1-7.8-2.035c0-3.4-2.327-2.255-1.811-.191a.788.788,0,0,1-1.53.383c-1.074-4.295,4.917-6.037,4.917-.191A2.544,2.544,0,0,0,17.9,21.971c3.65.861,4.733-5.161,1.093-9.037-5.033-5.363-13.16-1.227-13.16,5.148A6.378,6.378,0,0,0,6.95,22.25a.788.788,0,0,1-1.284.916,8.033,8.033,0,0,1-1.408-5.084,9.351,9.351,0,0,1,9.2-9.2c6.8,0,11.128,7.628,8.7,12.5Zm.527-9.761a.788.788,0,0,1-1.075-.293C20.033,8.578,16.234,7.1,13.457,7.1a11.282,11.282,0,0,0-8.175,4.275A.788.788,0,0,1,3.97,10.5a12.781,12.781,0,0,1,9.487-4.977c5.841,0,11.056,5.05,9.222,6.1Z" transform="translate(5.793 4.943)" fill="#28323a"/>
|
||||||
|
<path id="Path_4539" data-name="Path 4539" d="M38.892,0H33.378A1.379,1.379,0,0,0,32,1.378v8.27a1.378,1.378,0,0,0,2.757,0V2.757h4.135a1.378,1.378,0,1,0,0-2.757Z" transform="translate(-32.342 -0.655)" fill="#28323a"/>
|
||||||
|
<path id="Path_4540" data-name="Path 4540" d="M38.892,200.27H34.757v-6.892a1.378,1.378,0,1,0-2.757,0v8.27a1.379,1.379,0,0,0,1.378,1.378h5.514a1.378,1.378,0,1,0,0-2.757Z" transform="translate(-32.342 -165.658)" fill="#28323a"/>
|
||||||
|
<path id="Path_4541" data-name="Path 4541" d="M390.892,0h-5.514a1.378,1.378,0,0,0,0,2.757h4.135V9.649a1.378,1.378,0,0,0,2.757,0V1.378A1.379,1.379,0,0,0,390.892,0Z" transform="translate(-354.018 -0.655)" fill="#28323a"/>
|
||||||
|
<path id="Path_4542" data-name="Path 4542" d="M390.892,192a1.379,1.379,0,0,0-1.378,1.378v6.892h-4.135a1.378,1.378,0,0,0,0,2.757h5.514a1.379,1.379,0,0,0,1.378-1.378v-8.27A1.379,1.379,0,0,0,390.892,192Z" transform="translate(-354.018 -165.658)" fill="#28323a"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 2.2 KiB |
@ -0,0 +1,12 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="38.595" height="38.024" viewBox="0 0 38.595 38.024">
|
||||||
|
<g id="whatsapp_1_" data-name="whatsapp (1)" transform="translate(0.233 -4.309)">
|
||||||
|
<g id="Group_7424" data-name="Group 7424" transform="translate(4.808 8.729)">
|
||||||
|
<path id="Path_4537" data-name="Path 4537" d="M0,28.186l2.424-7.271a13.848,13.848,0,1,1,5.468,5.195Z" fill="#2cb742"/>
|
||||||
|
<path id="Path_4538" data-name="Path 4538" d="M29.341,23.6c-.64-1.209-3-2.591-3-2.591-.534-.3-1.177-.338-1.482.2a12.215,12.215,0,0,1-.961,1.051,1.791,1.791,0,0,1-2.547-.253l-1.935-1.935-1.935-1.935A1.791,1.791,0,0,1,17.23,15.6a12.216,12.216,0,0,1,1.051-.961c.542-.3.508-.948.2-1.482,0,0-1.382-2.358-2.591-3a1.325,1.325,0,0,0-1.557.234l-.854.854c-2.71,2.71-1.376,5.77,1.334,8.48L17.3,22.2l2.477,2.477c2.71,2.71,5.77,4.045,8.48,1.334l.854-.854A1.326,1.326,0,0,0,29.341,23.6Z" transform="translate(-6.169 -5.141)" fill="#fff"/>
|
||||||
|
</g>
|
||||||
|
<path id="Path_4547" data-name="Path 4547" d="M38.892,0H33.378A1.379,1.379,0,0,0,32,1.378v8.27a1.378,1.378,0,0,0,2.757,0V2.757h4.135a1.378,1.378,0,1,0,0-2.757Z" transform="translate(-32.233 4.309)" fill="#28323a"/>
|
||||||
|
<path id="Path_4548" data-name="Path 4548" d="M38.892,200.27H34.757v-6.892a1.378,1.378,0,1,0-2.757,0v8.27a1.379,1.379,0,0,0,1.378,1.378h5.514a1.378,1.378,0,1,0,0-2.757Z" transform="translate(-32.233 -160.693)" fill="#28323a"/>
|
||||||
|
<path id="Path_4549" data-name="Path 4549" d="M390.892,0h-5.514a1.378,1.378,0,0,0,0,2.757h4.135V9.649a1.378,1.378,0,0,0,2.757,0V1.378A1.379,1.379,0,0,0,390.892,0Z" transform="translate(-353.909 4.309)" fill="#28323a"/>
|
||||||
|
<path id="Path_4550" data-name="Path 4550" d="M390.892,192a1.379,1.379,0,0,0-1.378,1.378v6.892h-4.135a1.378,1.378,0,0,0,0,2.757h5.514a1.379,1.379,0,0,0,1.378-1.378v-8.27A1.379,1.379,0,0,0,390.892,192Z" transform="translate(-353.909 -160.693)" fill="#28323a"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.8 KiB |
@ -0,0 +1,62 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 26.0.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 161.9 115.9" style="enable-background:new 0 0 161.9 115.9;" xml:space="preserve">
|
||||||
|
<style type="text/css">
|
||||||
|
.st0{fill-rule:evenodd;clip-rule:evenodd;fill:#FFFFFF;}
|
||||||
|
.st1{fill-rule:evenodd;clip-rule:evenodd;fill:url(#SVGID_1_);}
|
||||||
|
.st2{fill-rule:evenodd;clip-rule:evenodd;fill:url(#SVGID_00000176010942276333929710000013654346438816618917_);}
|
||||||
|
.st3{fill-rule:evenodd;clip-rule:evenodd;fill:url(#SVGID_00000167385588366204257280000005677836094560819131_);}
|
||||||
|
.st4{fill-rule:evenodd;clip-rule:evenodd;fill:url(#SVGID_00000030484853887028042530000009742356117098638990_);}
|
||||||
|
</style>
|
||||||
|
<g id="Layer_2_00000008146416357898561640000016925561153751568014_">
|
||||||
|
<g id="Cover_Page">
|
||||||
|
<path class="st0" d="M23.5,110.2h4.3v-27h-5L14,95.9L5,83.2H0v27h4.3V89.5l9.1,12.8h0.9l9.2-12.8V110.2z"/>
|
||||||
|
<path class="st0" d="M41.2,90.8c-5.5,0-9.9,4.4-9.9,9.9c0,5.5,4.4,9.9,9.9,9.9c5.2,0.2,9.7-3.8,9.9-9c0-0.3,0-0.6,0-0.9
|
||||||
|
c0.2-5.3-4-9.7-9.3-9.9C41.6,90.8,41.4,90.8,41.2,90.8z M41.2,94.4c3.3,0.1,5.9,2.8,5.9,6.1c0,0.1,0,0.1,0,0.2
|
||||||
|
c0.2,3.2-2.3,6-5.6,6.1c-3.2,0.2-6-2.3-6.1-5.6c0-0.2,0-0.4,0-0.6c-0.2-3.2,2.2-6,5.4-6.2C40.9,94.4,41,94.4,41.2,94.4z"/>
|
||||||
|
<path class="st0" d="M54.2,83.1v27.1h4v-9.9c-0.2-3,2.1-5.5,5-5.7c0.1,0,0.2,0,0.2,0c2.9,0,4.8,1.8,4.8,5.4v10.2h4V99.9
|
||||||
|
c0-5.5-2.5-9.1-7.8-9.1c-2.5-0.1-4.8,1.1-6.2,3.1V83.1H54.2z"/>
|
||||||
|
<path class="st0" d="M94.8,102.2c0.7-7.8-3.4-11.5-9.6-11.5c-5.3-0.2-9.8,3.9-10,9.2c0,0.3,0,0.5,0,0.8c0,6.1,4,10.1,10.3,10.1
|
||||||
|
c3.1,0.1,6-1.1,8.2-3.3l-2.6-2.5c-1.5,1.4-3.5,2.1-5.5,2.1c-3.5,0-5.9-1.9-6.2-4.8L94.8,102.2z M79.4,98.8
|
||||||
|
c0.5-2.8,3.1-4.8,5.9-4.6c3.2,0,5.4,1.6,5.7,4.6H79.4z"/>
|
||||||
|
<path class="st0" d="M114.9,110.2V99.8c-0.2-2.6,1.7-4.9,4.3-5.1c0.1,0,0.2,0,0.3,0c2.8,0,4.2,2.2,4.2,5.1v10.5h4V99.7
|
||||||
|
c0-5.5-2.8-8.8-8.1-8.8c-2.7-0.1-5.3,1.3-6.5,3.8c-0.9-2.5-3.4-4-6-3.8c-2.2-0.1-4.2,1-5.3,2.9l-0.3-2.6h-3.7v19.1h4V99.8
|
||||||
|
c0-2.8,1.8-5.2,4.6-5.2c2.8,0,4.4,2.4,4.4,5.2v10.5H114.9z"/>
|
||||||
|
<path class="st0" d="M149,110.2V99.8c-0.2-2.6,1.7-4.9,4.4-5.1c0.1,0,0.2,0,0.3,0c2.8,0,4.2,2.2,4.2,5.1v10.5h4V99.7
|
||||||
|
c0-5.5-2.8-8.8-8.1-8.8c-2.7-0.1-5.3,1.3-6.5,3.8c-0.9-2.4-3.3-4-6-3.8c-2.2-0.1-4.2,1-5.3,2.9l-0.3-2.6h-3.8v19.1h4V99.8
|
||||||
|
c0-2.8,1.8-5.2,4.6-5.2c2.8,0,4.4,2.4,4.4,5.2v10.5H149z"/>
|
||||||
|
|
||||||
|
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="55.98" y1="-10.0986" x2="163.1928" y2="72.1628" gradientTransform="matrix(1 0 0 -1 0 49.8898)">
|
||||||
|
<stop offset="0" style="stop-color:#0086C8"/>
|
||||||
|
<stop offset="1" style="stop-color:#C1D967"/>
|
||||||
|
</linearGradient>
|
||||||
|
<path class="st1" d="M117.4,20.5c-4.2,0-7.6-3.4-7.6-7.6c0-4.2,3.4-7.6,7.6-7.6c4.2,0,7.6,3.4,7.6,7.6c0,0,0,0,0,0
|
||||||
|
C125,17.1,121.6,20.5,117.4,20.5z"/>
|
||||||
|
|
||||||
|
<linearGradient id="SVGID_00000026872133431724139420000015295225800217450885_" gradientUnits="userSpaceOnUse" x1="72.1783" y1="-15.2775" x2="150.1874" y2="44.584" gradientTransform="matrix(1 0 0 -1 0 49.8898)">
|
||||||
|
<stop offset="0" style="stop-color:#0086C8"/>
|
||||||
|
<stop offset="1" style="stop-color:#C1D967"/>
|
||||||
|
</linearGradient>
|
||||||
|
<path style="fill-rule:evenodd;clip-rule:evenodd;fill:url(#SVGID_00000026872133431724139420000015295225800217450885_);" d="
|
||||||
|
M99.2,12.7c-5.7,1.8-9.5,7.1-9.5,13.1v5.1h2.4c4.7,0,8.5,3.8,8.5,8.5c0,0.1,0,0.1,0,0.2v8.6C100.7,61,109,64,114.4,64h1.8V30.8
|
||||||
|
C107.1,30.8,99.6,21.8,99.2,12.7z"/>
|
||||||
|
|
||||||
|
<linearGradient id="SVGID_00000029033238716987721520000004689211043976606898_" gradientUnits="userSpaceOnUse" x1="54.3473" y1="-8.6399" x2="132.3564" y2="51.2215" gradientTransform="matrix(1 0 0 -1 0 49.8898)">
|
||||||
|
<stop offset="0" style="stop-color:#0086C8"/>
|
||||||
|
<stop offset="1" style="stop-color:#C1D967"/>
|
||||||
|
</linearGradient>
|
||||||
|
<path style="fill-rule:evenodd;clip-rule:evenodd;fill:url(#SVGID_00000029033238716987721520000004689211043976606898_);" d="
|
||||||
|
M72.8,12.7c-5.7,1.8-9.5,7.1-9.5,13.1v5.1h2.4c4.7,0,8.5,3.8,8.5,8.4c0,0.1,0,0.1,0,0.2v8.6C74.2,61,82.5,64,87.9,64h1.8V30.8
|
||||||
|
C80.6,30.8,73.1,21.8,72.8,12.7z"/>
|
||||||
|
|
||||||
|
<linearGradient id="SVGID_00000113332780290425602090000015103686907198383032_" gradientUnits="userSpaceOnUse" x1="36.5148" y1="-2.0006" x2="114.524" y2="57.8471" gradientTransform="matrix(1 0 0 -1 0 49.8898)">
|
||||||
|
<stop offset="0" style="stop-color:#0086C8"/>
|
||||||
|
<stop offset="1" style="stop-color:#C1D967"/>
|
||||||
|
</linearGradient>
|
||||||
|
<path style="fill-rule:evenodd;clip-rule:evenodd;fill:url(#SVGID_00000113332780290425602090000015103686907198383032_);" d="
|
||||||
|
M46.3,12.7c-5.7,1.8-9.5,7.1-9.5,13.1v5.1h2.4c4.7,0,8.5,3.8,8.5,8.4c0,0.1,0,0.1,0,0.2v8.6C47.7,61,56,64,61.4,64h1.8V30.8
|
||||||
|
C54.1,30.8,46.6,21.8,46.3,12.7z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 4.7 KiB |
@ -0,0 +1,13 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="22.07" height="21.978" viewBox="0 0 22.07 21.978">
|
||||||
|
<g id="biometric" transform="translate(-1 -1)">
|
||||||
|
<path id="Path_4700" data-name="Path 4700" d="M1.414,9.69a.415.415,0,0,0,.506-.414C2.241,4.862,4.862,1.92,8.495,1.92s6.3,2.943,6.575,7.357a.454.454,0,0,0,.46.414h.046a.415.415,0,0,0,.414-.506C15.668,4.311,12.633,1,8.495,1S1.322,4.311,1,9.23A.454.454,0,0,0,1.414,9.69Z" fill="#fff"/>
|
||||||
|
<path id="Path_4701" data-name="Path 4701" d="M9.062,40.308a.447.447,0,0,0,.046.644,5.578,5.578,0,0,0,3.678,1.563,5.362,5.362,0,0,0,3.678-1.563.456.456,0,1,0-.6-.69,4.276,4.276,0,0,1-6.161,0A.492.492,0,0,0,9.062,40.308Z" transform="translate(-4.292 -21.146)" fill="#fff"/>
|
||||||
|
<path id="Path_4702" data-name="Path 4702" d="M16.523,18.77h.092a.5.5,0,0,0,.46-.368,8.929,8.929,0,0,0,.092-1.1c0-1.977-.828-2.3-1.333-2.3s-1.333.276-1.333,2.3a8.929,8.929,0,0,0,.092,1.1.442.442,0,0,0,.874-.138,6.86,6.86,0,0,1-.092-.966c0-.69.138-1.379.414-1.379.23,0,.414.552.414,1.379a6.86,6.86,0,0,1-.092.966A.539.539,0,0,0,16.523,18.77Z" transform="translate(-7.293 -7.563)" fill="#fff"/>
|
||||||
|
<path id="Path_4703" data-name="Path 4703" d="M15.313,10.752c-.552-2.8-2.391-4.552-4.874-4.552C8,6.2,6.117,7.947,5.566,10.752a.54.54,0,0,1-.506.506.46.46,0,1,0,0,.92,1.47,1.47,0,0,0,1.425-1.241c.46-2.391,1.931-3.816,3.954-3.816s3.494,1.425,3.954,3.816a1.47,1.47,0,0,0,1.425,1.241.46.46,0,1,0,0-.92A.584.584,0,0,1,15.313,10.752Z" transform="translate(-1.945 -2.809)" fill="#fff"/>
|
||||||
|
<path id="Path_4704" data-name="Path 4704" d="M16.446,35.091c-1.839-1.563-3.816-1.012-5.747-.506-.6.184-1.241.322-1.839.46a.456.456,0,0,0-.368.506.448.448,0,0,0,.46.368h.092a13.139,13.139,0,0,0,1.931-.46c1.839-.506,3.448-.92,4.874.322a.447.447,0,0,0,.644-.046A.44.44,0,0,0,16.446,35.091Z" transform="translate(-4.043 -17.86)" fill="#fff"/>
|
||||||
|
<path id="Path_4705" data-name="Path 4705" d="M16.862,39.32a.46.46,0,1,0,0-.92h-3.4a.46.46,0,1,0,0,.92Z" transform="translate(-6.482 -20.204)" fill="#fff"/>
|
||||||
|
<path id="Path_4706" data-name="Path 4706" d="M17.967,15.328a5.3,5.3,0,0,0-2.529.644h-2.8a.742.742,0,0,1-.6-.276,1.145,1.145,0,0,1-.322-.874c0-2.069-.828-4.322-3.173-4.322s-3.173,2.207-3.173,4.322a1.452,1.452,0,0,1-.322.874.819.819,0,0,1-.6.276H1.46a.46.46,0,0,0,0,.92h2.9A1.642,1.642,0,0,0,5.6,16.339a2.156,2.156,0,0,0,.6-1.517c0-.782.184-3.4,2.253-3.4,2.115,0,2.253,2.575,2.253,3.4a2.331,2.331,0,0,0,.6,1.517,1.823,1.823,0,0,0,1.241.552H14.2a4.666,4.666,0,0,0-.874,1.241,12.691,12.691,0,0,0-9.794.046H2.058a.46.46,0,0,0,0,.92H3.667a.276.276,0,0,0,.184-.046A11.707,11.707,0,0,1,13,18.96a4.868,4.868,0,0,0-.23,1.425v.092C11.024,19.7,6.7,18.133,3.9,20.57H2.517a.46.46,0,0,0,0,.92H4.127a.417.417,0,0,0,.322-.138c2.759-2.575,7.587-.322,8.552.184a4.691,4.691,0,0,0,1.1,2.115,6.126,6.126,0,0,1-5.564,3.54,6.413,6.413,0,0,1-6.023-4.552.478.478,0,0,0-.6-.276.478.478,0,0,0-.276.6,7.211,7.211,0,0,0,6.851,5.15,7.15,7.15,0,0,0,6.253-3.77,5.177,5.177,0,0,0,3.219,1.149,5.081,5.081,0,1,0,0-10.162Zm0,9.334a4.184,4.184,0,1,1,4.184-4.184A4.2,4.2,0,0,1,17.967,24.662Z" transform="translate(0 -5.132)" fill="#fff"/>
|
||||||
|
<path id="Path_4707" data-name="Path 4707" d="M37.36,29.5a.434.434,0,0,0-.46.46v2.989a.46.46,0,0,0,.92,0V29.96A.494.494,0,0,0,37.36,29.5Z" transform="translate(-19.393 -15.396)" fill="#fff"/>
|
||||||
|
<path id="Path_4708" data-name="Path 4708" d="M37.36,26.2a.434.434,0,0,0-.46.46v.184a.46.46,0,0,0,.92,0V26.66A.494.494,0,0,0,37.36,26.2Z" transform="translate(-19.393 -13.613)" fill="#fff"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 3.4 KiB |
@ -0,0 +1,15 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="30.491" height="31.183" viewBox="0 0 30.491 31.183">
|
||||||
|
<g id="calendar_3_" data-name="calendar (3)" transform="translate(-5.411 -1)">
|
||||||
|
<g id="Group_7900" data-name="Group 7900" transform="translate(5.411 1)">
|
||||||
|
<path id="Path_4715" data-name="Path 4715" d="M120.92,258.949a.707.707,0,0,0-.708-.707h-2.47a.707.707,0,0,0-.707.707v2.47a.708.708,0,0,0,.707.708h2.47a.708.708,0,0,0,.708-.708v-2.47Z" transform="translate(-109.905 -241.746)" fill="#2bb8a6"/>
|
||||||
|
<path id="Path_4716" data-name="Path 4716" d="M217.555,258.949a.707.707,0,0,0-.707-.707h-2.47a.707.707,0,0,0-.707.707v2.47a.708.708,0,0,0,.707.708h2.47a.707.707,0,0,0,.707-.708Z" transform="translate(-200.367 -241.746)" fill="#2bb8a6"/>
|
||||||
|
<path id="Path_4717" data-name="Path 4717" d="M314.183,258.949a.707.707,0,0,0-.707-.707h-2.47a.707.707,0,0,0-.708.707v2.47a.708.708,0,0,0,.708.708h2.47a.708.708,0,0,0,.707-.708Z" transform="translate(-290.822 -241.746)" fill="#2bb8a6"/>
|
||||||
|
<path id="Path_4718" data-name="Path 4718" d="M120.92,355.582a.707.707,0,0,0-.708-.707h-2.47a.707.707,0,0,0-.707.707v2.469a.707.707,0,0,0,.707.707h2.47a.707.707,0,0,0,.708-.707v-2.469Z" transform="translate(-109.905 -332.206)" fill="#2bb8a6"/>
|
||||||
|
<path id="Path_4719" data-name="Path 4719" d="M217.555,355.582a.707.707,0,0,0-.707-.707h-2.47a.707.707,0,0,0-.707.707v2.469a.707.707,0,0,0,.707.707h2.47a.707.707,0,0,0,.707-.707Z" transform="translate(-200.367 -332.206)" fill="#2bb8a6"/>
|
||||||
|
<path id="Path_4720" data-name="Path 4720" d="M314.183,355.582a.707.707,0,0,0-.707-.707h-2.47a.707.707,0,0,0-.708.707v2.469a.707.707,0,0,0,.708.707h2.47a.707.707,0,0,0,.707-.707v-2.469Z" transform="translate(-290.822 -332.206)" fill="#2bb8a6"/>
|
||||||
|
<path id="Path_4721" data-name="Path 4721" d="M33.188,54.156v3.772A3.081,3.081,0,0,1,30.1,61.006H28.153a3.1,3.1,0,0,1-3.106-3.079V54.142h-8.78v3.786a3.1,3.1,0,0,1-3.106,3.079H11.213a3.081,3.081,0,0,1-3.088-3.079V54.156a2.808,2.808,0,0,0-2.714,2.793V79.055a2.809,2.809,0,0,0,2.8,2.812h24.9a2.812,2.812,0,0,0,2.8-2.812V56.949A2.808,2.808,0,0,0,33.188,54.156Zm-.9,23.522a1.208,1.208,0,0,1-1.208,1.208H10.185a1.208,1.208,0,0,1-1.208-1.208V66.259a1.208,1.208,0,0,1,1.208-1.209h20.89a1.209,1.209,0,0,1,1.208,1.209V77.678Z" transform="translate(-5.411 -50.683)" fill="#2bb8a6"/>
|
||||||
|
<path id="Path_4722" data-name="Path 4722" d="M80.609,8.3h1.927a1.058,1.058,0,0,0,1.059-1.058V1.059A1.059,1.059,0,0,0,82.536,0H80.609A1.059,1.059,0,0,0,79.55,1.059V7.242A1.058,1.058,0,0,0,80.609,8.3Z" transform="translate(-74.814)" fill="#2bb8a6"/>
|
||||||
|
<path id="Path_4723" data-name="Path 4723" d="M345.517,8.3h1.927A1.058,1.058,0,0,0,348.5,7.242V1.059A1.059,1.059,0,0,0,347.444,0h-1.927a1.059,1.059,0,0,0-1.059,1.059V7.242A1.058,1.058,0,0,0,345.517,8.3Z" transform="translate(-322.8)" fill="#2bb8a6"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 2.8 KiB |
@ -0,0 +1,19 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="18.728" height="5.351" viewBox="0 0 18.728 5.351">
|
||||||
|
<g id="more_1_" data-name="more (1)" transform="translate(0 -170.666)">
|
||||||
|
<g id="Group_7031" data-name="Group 7031" transform="translate(0 170.666)">
|
||||||
|
<g id="Group_7030" data-name="Group 7030" transform="translate(0 0)">
|
||||||
|
<circle id="Ellipse_145" data-name="Ellipse 145" cx="2.675" cy="2.675" r="2.675" fill="#2e303a"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="Group_7033" data-name="Group 7033" transform="translate(6.688 170.666)">
|
||||||
|
<g id="Group_7032" data-name="Group 7032" transform="translate(0 0)">
|
||||||
|
<circle id="Ellipse_146" data-name="Ellipse 146" cx="2.675" cy="2.675" r="2.675" fill="#2e303a"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="Group_7035" data-name="Group 7035" transform="translate(13.377 170.666)">
|
||||||
|
<g id="Group_7034" data-name="Group 7034" transform="translate(0 0)">
|
||||||
|
<circle id="Ellipse_147" data-name="Ellipse 147" cx="2.675" cy="2.675" r="2.675" fill="#2e303a"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.0 KiB |
@ -0,0 +1,7 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="39.229" height="38.686" viewBox="0 0 39.229 38.686">
|
||||||
|
<g id="Group_7559" data-name="Group 7559" transform="translate(0.5 0.692)">
|
||||||
|
<path id="Path_4629" data-name="Path 4629" d="M348.593,134.591l-2.953-1.927a30.2,30.2,0,0,0,0-33.448l2.953-1.927a34.663,34.663,0,0,1,5.627,18.634v.035A34.66,34.66,0,0,1,348.593,134.591Zm0,0" transform="translate(-315.992 -97.289)" fill="#fff" stroke="#fff" stroke-width="1"/>
|
||||||
|
<path id="Path_4630" data-name="Path 4630" d="M289,161.717l-2.929-1.962a22.076,22.076,0,0,0,0-25.043L289,132.75a26.542,26.542,0,0,1,4.491,14.46v.047A26.54,26.54,0,0,1,289,161.717Zm0,0" transform="translate(-263.419 -128.583)" fill="#fff" stroke="#fff" stroke-width="1"/>
|
||||||
|
<path id="Path_4631" data-name="Path 4631" d="M112.621,189.162,97.074,177.208a13.549,13.549,0,0,0-.2,2.3,10.731,10.731,0,0,0,1.557,4.967l-2.961,1.914a14.235,14.235,0,0,1-2.122-6.881,16.265,16.265,0,0,1,1.113-6l.9-2.065,15.794,12.144a14.765,14.765,0,0,0,.646-4.559,14.942,14.942,0,0,0-2.724-8.272l2.891-2.017a18.455,18.455,0,0,1,3.358,10.219,18.659,18.659,0,0,1-1.777,8.21Zm0,0" transform="translate(-93.348 -160.345)" fill="#fff" stroke="#fff" stroke-width="1"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.2 KiB |
@ -0,0 +1,12 @@
|
|||||||
|
<svg id="pdf" xmlns="http://www.w3.org/2000/svg" width="30.502" height="34.859" viewBox="0 0 30.502 34.859">
|
||||||
|
<path id="Path_339" data-name="Path 339" d="M98.179,0A2.185,2.185,0,0,0,96,2.179v30.5a2.185,2.185,0,0,0,2.179,2.179h21.787a2.185,2.185,0,0,0,2.179-2.179V8.715L113.43,0Z" transform="translate(-91.643)" fill="#e2e5e7"/>
|
||||||
|
<path id="Path_340" data-name="Path 340" d="M354.179,8.715h6.536L352,0V6.536A2.185,2.185,0,0,0,354.179,8.715Z" transform="translate(-330.213)" fill="#b0b7bd"/>
|
||||||
|
<path id="Path_341" data-name="Path 341" d="M390.536,134.536,384,128h6.536Z" transform="translate(-360.034 -119.285)" fill="#cad1d8"/>
|
||||||
|
<path id="Path_342" data-name="Path 342" d="M58.145,251.983a1.093,1.093,0,0,1-1.089,1.089H33.089A1.093,1.093,0,0,1,32,251.983V241.089A1.093,1.093,0,0,1,33.089,240H57.055a1.093,1.093,0,0,1,1.089,1.089Z" transform="translate(-32 -223.66)" fill="#f15642"/>
|
||||||
|
<g id="Group_693" data-name="Group 693" transform="translate(4.749 20.039)">
|
||||||
|
<path id="Path_343" data-name="Path 343" d="M101.744,294.921a.6.6,0,0,1,.592-.6h2.012a2.178,2.178,0,0,1,0,4.355h-1.454v1.15a.547.547,0,0,1-.558.6.587.587,0,0,1-.592-.6Zm1.149.5v2.17h1.454a1.086,1.086,0,0,0,0-2.17Z" transform="translate(-101.744 -294.32)" fill="#fff"/>
|
||||||
|
<path id="Path_344" data-name="Path 344" d="M188.425,301.5a.545.545,0,0,1-.6-.539v-4.948a.592.592,0,0,1,.6-.54h1.995c3.981,0,3.893,6.027.078,6.027Zm.549-4.964v3.9h1.446c2.352,0,2.457-3.9,0-3.9Z" transform="translate(-181.963 -295.394)" fill="#fff"/>
|
||||||
|
<path id="Path_345" data-name="Path 345" d="M288.275,296.59v1.385H290.5a.674.674,0,0,1,.627.618.605.605,0,0,1-.627.523h-2.221v1.829a.516.516,0,0,1-.522.539.553.553,0,0,1-.618-.539V296a.551.551,0,0,1,.618-.54h3.058a.543.543,0,0,1,.61.54.6.6,0,0,1-.61.593h-2.536Z" transform="translate(-274.514 -295.379)" fill="#fff"/>
|
||||||
|
</g>
|
||||||
|
<path id="Path_346" data-name="Path 346" d="M116.7,417.089H96v1.089h20.7a1.093,1.093,0,0,0,1.089-1.089V416A1.093,1.093,0,0,1,116.7,417.089Z" transform="translate(-91.643 -387.677)" fill="#cad1d8"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 2.0 KiB |
@ -0,0 +1,12 @@
|
|||||||
|
<svg id="png" xmlns="http://www.w3.org/2000/svg" width="30.5" height="34.857" viewBox="0 0 30.5 34.857">
|
||||||
|
<path id="Path_347" data-name="Path 347" d="M98.179,0A2.185,2.185,0,0,0,96,2.179v30.5a2.185,2.185,0,0,0,2.179,2.179h21.786a2.185,2.185,0,0,0,2.179-2.179V8.714L113.428,0Z" transform="translate(-91.643)" fill="#e2e5e7"/>
|
||||||
|
<path id="Path_348" data-name="Path 348" d="M354.179,8.714h6.536L352,0V6.536A2.185,2.185,0,0,0,354.179,8.714Z" transform="translate(-330.214)" fill="#b0b7bd"/>
|
||||||
|
<path id="Path_349" data-name="Path 349" d="M390.536,134.536,384,128h6.536Z" transform="translate(-360.036 -119.286)" fill="#cad1d8"/>
|
||||||
|
<path id="Path_350" data-name="Path 350" d="M58.143,251.982a1.092,1.092,0,0,1-1.089,1.089H33.089A1.092,1.092,0,0,1,32,251.982V241.089A1.092,1.092,0,0,1,33.089,240H57.053a1.092,1.092,0,0,1,1.089,1.089Z" transform="translate(-32 -223.661)" fill="#a066aa"/>
|
||||||
|
<g id="Group_694" data-name="Group 694" transform="translate(4.14 19.96)">
|
||||||
|
<path id="Path_351" data-name="Path 351" d="M92.816,294.906a.6.6,0,0,1,.591-.6H95.42a2.178,2.178,0,0,1,0,4.355H93.964v1.15a.546.546,0,0,1-.557.6.587.587,0,0,1-.591-.6Zm1.148.5v2.169h1.455a1.085,1.085,0,0,0,0-2.169Z" transform="translate(-92.816 -294.228)" fill="#fff"/>
|
||||||
|
<path id="Path_352" data-name="Path 352" d="M178.961,294.994c0-.315.07-.619.523-.619.313,0,.383.078.618.3l2.882,3.607v-3.379a.613.613,0,0,1,.549-.6.663.663,0,0,1,.618.6v4.9a.582.582,0,0,1-.462.6.876.876,0,0,1-.7-.3l-2.882-3.659v3.363a.541.541,0,0,1-.549.6.573.573,0,0,1-.593-.6v-4.817Z" transform="translate(-173.095 -294.228)" fill="#fff"/>
|
||||||
|
<path id="Path_353" data-name="Path 353" d="M279.3,298.7a3.306,3.306,0,0,1-2.143.732,2.872,2.872,0,0,1-3.127-3.119,3.1,3.1,0,0,1,3.2-3.126,2.852,2.852,0,0,1,1.986.767.565.565,0,0,1-.757.837,1.836,1.836,0,0,0-1.229-.549,2.075,2.075,0,0,0-2.072,2.072,1.927,1.927,0,0,0,1.995,2.073,2.216,2.216,0,0,0,1.306-.392v-1.07h-1.306a.532.532,0,1,1,0-1.064H278.9a.6.6,0,0,1,.618.515v1.855A.7.7,0,0,1,279.3,298.7Z" transform="translate(-261.695 -293.184)" fill="#fff"/>
|
||||||
|
</g>
|
||||||
|
<path id="Path_354" data-name="Path 354" d="M116.7,417.089H96v1.089h20.7a1.092,1.092,0,0,0,1.089-1.089V416A1.092,1.092,0,0,1,116.7,417.089Z" transform="translate(-91.643 -387.679)" fill="#cad1d8"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 2.2 KiB |
@ -0,0 +1,7 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="18.262" height="21.021" viewBox="0 0 18.262 21.021">
|
||||||
|
<g id="request_1_" data-name="request (1)" transform="translate(-8.751)">
|
||||||
|
<path id="Path_4692" data-name="Path 4692" d="M339.115,217.757a.858.858,0,1,1-.858-.858A.858.858,0,0,1,339.115,217.757Zm0,0" transform="translate(-320.374 -204.489)" fill="#fff"/>
|
||||||
|
<path id="Path_4693" data-name="Path 4693" d="M300.39,72.3a3.154,3.154,0,0,0-3.155,3.155h0a.858.858,0,1,0,1.716,0,1.44,1.44,0,1,1,1.44,1.441.858.858,0,0,0-.858.858v.919a.858.858,0,0,0,1.716,0v-.179a3.156,3.156,0,0,0-.859-6.194Zm0,0" transform="translate(-282.508 -68.164)" fill="#fff"/>
|
||||||
|
<path id="Path_4695" data-name="Path 4695" d="M207.447,0h-11.03A3.614,3.614,0,0,0,192.8,3.616V20.161a.859.859,0,0,0,1.373.687l3.448-2.586h9.825a3.614,3.614,0,0,0,3.616-3.616V3.616A3.614,3.614,0,0,0,207.447,0Zm1.9,14.646a1.9,1.9,0,0,1-1.9,1.9H197.336a.859.859,0,0,0-.515.172l-2.3,1.728V3.616a1.9,1.9,0,0,1,1.9-1.9h11.03a1.9,1.9,0,0,1,1.9,1.9Zm0,0" transform="translate(-184.049)" fill="#fff"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.0 KiB |
@ -0,0 +1,6 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="23.889" height="10.643" viewBox="0 0 23.889 10.643">
|
||||||
|
<g id="Group_7916" data-name="Group 7916" transform="translate(-61.5 -50.883)">
|
||||||
|
<path id="Path_66" data-name="Path 66" d="M4.5,18H19.3" transform="translate(58.5 42.025)" fill="none" stroke="#2e303a" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/>
|
||||||
|
<path id="Path_67" data-name="Path 67" d="M4.5,9H25.389" transform="translate(58.5 43.383)" fill="none" stroke="#2e303a" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 577 B |
@ -0,0 +1,14 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="16.821" height="17.342" viewBox="0 0 16.821 17.342">
|
||||||
|
<g id="next_4_" data-name="next (4)" transform="translate(0 -5.838)">
|
||||||
|
<g id="Group_7832" data-name="Group 7832" transform="translate(0 5.838)">
|
||||||
|
<g id="Group_7831" data-name="Group 7831">
|
||||||
|
<path id="Path_4690" data-name="Path 4690" d="M12.8,13.792,1.356,5.989A.867.867,0,0,0,0,6.7V22.312a.868.868,0,0,0,1.356.717l11.446-7.8a.867.867,0,0,0,0-1.433ZM1.734,20.672V8.345l9.039,6.163Z" transform="translate(0 -5.838)" fill="#fff"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="Group_7834" data-name="Group 7834" transform="translate(15.087 6.82)">
|
||||||
|
<g id="Group_7833" data-name="Group 7833" transform="translate(0)">
|
||||||
|
<path id="Path_4691" data-name="Path 4691" d="M462.835,34.188a.867.867,0,0,0-.867.867V48.7a.867.867,0,0,0,1.734,0V35.055A.867.867,0,0,0,462.835,34.188Z" transform="translate(-461.968 -34.188)" fill="#fff"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 970 B |
@ -0,0 +1,14 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="17" height="19.833" viewBox="0 0 17 19.833">
|
||||||
|
<g id="pause" transform="translate(-34.133)">
|
||||||
|
<g id="Group_7583" data-name="Group 7583" transform="translate(34.133)">
|
||||||
|
<g id="Group_7582" data-name="Group 7582" transform="translate(0)">
|
||||||
|
<path id="Path_4647" data-name="Path 4647" d="M40.508,0H34.841a.708.708,0,0,0-.708.708V19.125a.708.708,0,0,0,.708.708h5.667a.708.708,0,0,0,.708-.708V.708A.708.708,0,0,0,40.508,0Z" transform="translate(-34.133)" fill="#fdfdfd"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="Group_7585" data-name="Group 7585" transform="translate(44.05)">
|
||||||
|
<g id="Group_7584" data-name="Group 7584">
|
||||||
|
<path id="Path_4648" data-name="Path 4648" d="M279.441,0h-5.667a.708.708,0,0,0-.708.708V19.125a.708.708,0,0,0,.708.708h5.667a.708.708,0,0,0,.708-.708V.708A.708.708,0,0,0,279.441,0Z" transform="translate(-273.066)" fill="#fdfdfd"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 945 B |
@ -0,0 +1,6 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="32.774" height="32.788" viewBox="0 0 32.774 32.788">
|
||||||
|
<g id="park-tickets-couple" transform="translate(-0.205 0.001)">
|
||||||
|
<path id="Path_4724" data-name="Path 4724" d="M68.36,485.746a1.657,1.657,0,0,1-1.581,1.3.539.539,0,0,0-.206,1.025,1.656,1.656,0,0,1,.955,1.814l-.14.7a1.744,1.744,0,0,1-2.093,1.278c-.25-.06-.506-.106-.759-.156-.373-.073-.745-.15-1.118-.223-.493-.1-.985-.2-1.477-.3l-1.76-.353c-.655-.133-1.311-.263-1.967-.4-.7-.14-1.4-.279-2.1-.423-.719-.143-1.438-.289-2.153-.433l-2.133-.429-2.036-.409c-.622-.123-1.241-.25-1.863-.373-.539-.107-1.078-.216-1.614-.323l-1.291-.26-.888-.18c-.136-.027-.273-.057-.409-.083-.007,0-.013,0-.02,0a1.686,1.686,0,0,1-.12,1.062,1.705,1.705,0,0,1-1.87.958.5.5,0,0,0-.562.246l-.3.649a.5.5,0,0,0,.176.589c.033.027,24.018,11.084,24.058,11.094a.5.5,0,0,0,.562-.246l.3-.649a.5.5,0,0,0-.176-.589,1.7,1.7,0,0,1,1.388-3,.5.5,0,0,0,.562-.246l.3-.649a.5.5,0,0,0-.176-.589,1.7,1.7,0,0,1,1.388-3,.5.5,0,0,0,.562-.246l.3-.649a.5.5,0,0,0-.176-.589,1.7,1.7,0,0,1,1.388-3,.5.5,0,0,0,.562-.246l.329-.719a.41.41,0,0,0-.2-.546L68.416,485.5Z" transform="translate(-39.26 -469.349)" fill="#2bb8a6"/>
|
||||||
|
<path id="Path_4725" data-name="Path 4725" d="M.519,16.168c.04.02,25.932,5.214,25.975,5.214a.5.5,0,0,0,.489-.369l.14-.7a.5.5,0,0,0-.309-.532,1.7,1.7,0,0,1,.652-3.244.5.5,0,0,0,.489-.369l.1-.512.037-.19a.5.5,0,0,0-.309-.532,1.7,1.7,0,0,1,.652-3.244.5.5,0,0,0,.489-.369l.14-.7a.5.5,0,0,0-.309-.532,1.7,1.7,0,0,1,.652-3.244.5.5,0,0,0,.489-.369l.156-.775a.41.41,0,0,0-.323-.482S3.714,0,3.687,0a.412.412,0,0,0-.4.329L3.128,1.1a.5.5,0,0,0,.309.532A1.7,1.7,0,0,1,2.786,4.88.5.5,0,0,0,2.3,5.25l-.14.7a.5.5,0,0,0,.309.532,1.7,1.7,0,0,1-.652,3.244.5.5,0,0,0-.489.369l-.14.7a.5.5,0,0,0,.309.532A1.7,1.7,0,0,1,.842,14.57a.5.5,0,0,0-.489.369l-.14.7A.494.494,0,0,0,.519,16.168ZM22.7,7.639a.831.831,0,1,1,1.631.326l-1.1,5.464L22.555,16.8a.832.832,0,0,1-.815.669.9.9,0,0,1-.163-.017.833.833,0,0,1-.652-.978l.755-3.757ZM7.7,4.628a.831.831,0,0,1,1.631.326L8.948,6.84,8.519,8.98,8.173,10.7l-.616,3.081a.832.832,0,0,1-.815.669.9.9,0,0,1-.163-.017.4.4,0,0,1-.067-.017.829.829,0,0,1-.582-.962l.123-.622.323-1.611Z" fill="#2bb8a6"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 2.1 KiB |
@ -0,0 +1,3 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="14.004" height="13.318" viewBox="0 0 14.004 13.318">
|
||||||
|
<path id="Path_4" data-name="Path 4" d="M18.964,10.97a.368.368,0,0,0-.343-.255l-4.738-.1L12.328,6.157a.368.368,0,0,0-.7,0L10.077,10.62l-4.738.1a.368.368,0,0,0-.214.662L8.9,14.231,7.528,18.753a.368.368,0,0,0,.562.409l3.89-2.7,3.89,2.7a.368.368,0,0,0,.562-.409L15.06,14.231l3.775-2.854A.368.368,0,0,0,18.964,10.97Z" transform="translate(-4.978 -5.91)" fill="#cecece"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 476 B |
@ -0,0 +1,11 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="31.157" height="30.107" viewBox="0 0 31.157 30.107">
|
||||||
|
<g id="layer6" transform="translate(-0.52 -0.793)">
|
||||||
|
<g id="Group_7901" data-name="Group 7901" transform="translate(3.133 7.6)">
|
||||||
|
<path id="path856" d="M14.832,4.268,1.854,10.517V23.936A4.37,4.37,0,0,0,2.3,25.725a3.308,3.308,0,0,0,3.192,1.843H8.146l-.579-7.222a.519.519,0,0,1,.518-.564H8.23l.4-1.2a.518.518,0,0,1,.261-.3l2.588-1.293a4.468,4.468,0,0,1-.785-2.275l-1.218-.407a.517.517,0,0,1-.352-.49V10.441a4.877,4.877,0,0,1,.728-2.353c.731-1.17,2.247-2.317,4.981-2.317s4.25,1.148,4.982,2.317a4.877,4.877,0,0,1,.728,2.353v3.376a.519.519,0,0,1-.357.49l-1.213.407a4.466,4.466,0,0,1-.785,2.274l2.588,1.294a.518.518,0,0,1,.261.3l.4,1.2h.145a.519.519,0,0,1,.517.564l-.578,7.222h2.655a4.324,4.324,0,0,0,1.789-.44,3.332,3.332,0,0,0,1.847-3.192V10.517Z" transform="translate(-1.854 -4.268)" fill="#2bb8a6"/>
|
||||||
|
<path id="path854" d="M10.766,5.566c-2.457,0-3.537.925-4.1,1.831A3.753,3.753,0,0,0,6.1,9.2v3l.517.173v-1.1a.52.52,0,0,1,.4-.5A8.351,8.351,0,0,0,10.4,8.83a.52.52,0,0,1,.736,0,8.352,8.352,0,0,0,3.391,1.942.519.519,0,0,1,.394.5v1.1l.517-.173v-3a3.787,3.787,0,0,0-.571-1.8C14.3,6.49,13.223,5.566,10.766,5.566Z" transform="translate(2.211 -3.025)" fill="#2bb8a6"/>
|
||||||
|
<path id="path852" d="M8.536,11.172,5.892,12.5l-.223.666H16.682l-.223-.666-2.645-1.326a4.676,4.676,0,0,1-.542.418,5.619,5.619,0,0,1-2.023.793.52.52,0,0,1-.146,0A5.618,5.618,0,0,1,9.08,11.59,4.68,4.68,0,0,1,8.536,11.172Z" transform="translate(1.802 2.35)" fill="#2bb8a6"/>
|
||||||
|
<path id="path850" d="M5.323,12.719l.539,6.748h11.29l.538-6.748Zm6.184,1.56a1.558,1.558,0,1,1-1.555,1.555A1.562,1.562,0,0,1,11.507,14.279Z" transform="translate(1.471 3.833)" fill="#2bb8a6"/>
|
||||||
|
</g>
|
||||||
|
<path id="path831" d="M15.633.9,2,7.438A2.573,2.573,0,0,0,.618,9.029,2.689,2.689,0,0,0,2.141,12.2a2.58,2.58,0,0,0,2.112-.088L16.085,6.428,27.9,12.1a2.575,2.575,0,0,0,2.138.119,2.71,2.71,0,0,0,1.534-3.206A2.575,2.575,0,0,0,30.144,7.43L16.536.9A1.042,1.042,0,0,0,15.633.9Z" transform="translate(0)" fill="#2bb8a6"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 2.0 KiB |
@ -0,0 +1,11 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="42.791" height="30.258" viewBox="0 0 42.791 30.258">
|
||||||
|
<g id="wifi_4_" data-name="wifi (4)" transform="translate(0 -64.733)">
|
||||||
|
<g id="Group_7565" data-name="Group 7565" transform="translate(0 64.733)">
|
||||||
|
<g id="Group_7564" data-name="Group 7564" transform="translate(0 0)">
|
||||||
|
<path id="Path_4632" data-name="Path 4632" d="M170.667,312.534l5.835,5.835,5.835-5.835A8.259,8.259,0,0,0,170.667,312.534Z" transform="translate(-155.107 -288.112)" fill="#fff"/>
|
||||||
|
<path id="Path_4633" data-name="Path 4633" d="M85.333,195.065l3.89,3.89a13.758,13.758,0,0,1,19.45,0l3.89-3.89A19.258,19.258,0,0,0,85.333,195.065Z" transform="translate(-77.553 -178.422)" fill="#fff"/>
|
||||||
|
<path id="Path_4634" data-name="Path 4634" d="M0,77.6l3.89,3.89a24.758,24.758,0,0,1,35.011,0l3.89-3.89A30.258,30.258,0,0,0,0,77.6Z" transform="translate(0 -68.733)" fill="#fff"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 944 B |
@ -0,0 +1,12 @@
|
|||||||
|
<svg id="xls" xmlns="http://www.w3.org/2000/svg" width="30.5" height="34.857" viewBox="0 0 30.5 34.857">
|
||||||
|
<path id="Path_355" data-name="Path 355" d="M98.179,0A2.185,2.185,0,0,0,96,2.179v30.5a2.185,2.185,0,0,0,2.179,2.179h21.786a2.185,2.185,0,0,0,2.179-2.179V8.714L113.429,0Z" transform="translate(-91.643)" fill="#e2e5e7"/>
|
||||||
|
<path id="Path_356" data-name="Path 356" d="M354.179,8.714h6.536L352,0V6.536A2.185,2.185,0,0,0,354.179,8.714Z" transform="translate(-330.214)" fill="#b0b7bd"/>
|
||||||
|
<path id="Path_357" data-name="Path 357" d="M390.536,134.536,384,128h6.536Z" transform="translate(-360.036 -119.286)" fill="#cad1d8"/>
|
||||||
|
<path id="Path_358" data-name="Path 358" d="M58.143,251.982a1.093,1.093,0,0,1-1.089,1.089H33.089A1.093,1.093,0,0,1,32,251.982V241.089A1.092,1.092,0,0,1,33.089,240H57.054a1.092,1.092,0,0,1,1.089,1.089Z" transform="translate(-32 -223.661)" fill="#84bd5a"/>
|
||||||
|
<g id="Group_695" data-name="Group 695" transform="translate(4.985 19.839)">
|
||||||
|
<path id="Path_359" data-name="Path 359" d="M107.888,297.164l1.515-1.9c.453-.593,1.333.164.837.731-.522.619-1.071,1.29-1.594,1.977l1.777,2.212a.572.572,0,1,1-.949.635l-1.6-2.055-1.576,2.1c-.444.635-1.429-.078-.932-.671l1.75-2.221c-.549-.688-1.081-1.358-1.611-1.977a.564.564,0,1,1,.871-.712Z" transform="translate(-105.226 -294.796)" fill="#fff"/>
|
||||||
|
<path id="Path_360" data-name="Path 360" d="M197.36,295.876a.543.543,0,0,1,.549-.532.531.531,0,0,1,.514.532v4.364h2.369a.575.575,0,1,1,0,1.141H197.91a.526.526,0,0,1-.549-.53v-4.974Z" transform="translate(-191.087 -295.076)" fill="#fff"/>
|
||||||
|
<path id="Path_361" data-name="Path 361" d="M270.648,292.991c.2-1.691,2.752-1.994,3.954-1.071a.51.51,0,1,1-.558.853c-.645-.409-2.108-.6-2.291.3-.235,1.429,3.553.611,3.492,2.928-.061,2.212-3.266,2.264-4.468,1.271a.644.644,0,0,1-.122-.854.514.514,0,0,1,.776-.06c.714.487,2.552.853,2.682-.384C274,294.69,270.377,295.465,270.648,292.991Z" transform="translate(-259.291 -291.407)" fill="#fff"/>
|
||||||
|
</g>
|
||||||
|
<path id="Path_362" data-name="Path 362" d="M116.7,417.089H96v1.089h20.7a1.093,1.093,0,0,0,1.089-1.089V416A1.093,1.093,0,0,1,116.7,417.089Z" transform="translate(-91.643 -387.679)" fill="#cad1d8"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 2.1 KiB |
@ -1,9 +1,9 @@
|
|||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
|
||||||
import 'package:mohem_flutter_app/sikander_later_will_remove_to_parent_directory/classes/consts.dart';
|
import 'package:mohem_flutter_app/classes/consts.dart';
|
||||||
import 'package:mohem_flutter_app/sikander_later_will_remove_to_parent_directory/models/content_info_model.dart';
|
import 'package:mohem_flutter_app/models/content_info_model.dart';
|
||||||
import 'package:mohem_flutter_app/sikander_later_will_remove_to_parent_directory/models/member_model.dart';
|
import 'package:mohem_flutter_app/models/member_model.dart';
|
||||||
import 'package:mohem_flutter_app/sikander_later_will_remove_to_parent_directory/models/surah_model.dart';
|
import 'package:mohem_flutter_app/models/surah_model.dart';
|
||||||
|
|
||||||
import 'api_client.dart';
|
import 'api_client.dart';
|
||||||
|
|
||||||
@ -1,5 +1,5 @@
|
|||||||
import 'package:mohem_flutter_app/sikander_later_will_remove_to_parent_directory/models/content_info_model.dart';
|
import 'package:mohem_flutter_app/models/content_info_model.dart';
|
||||||
import 'package:mohem_flutter_app/sikander_later_will_remove_to_parent_directory/models/surah_model.dart';
|
import 'package:mohem_flutter_app/models/surah_model.dart';
|
||||||
|
|
||||||
class AppState {
|
class AppState {
|
||||||
static final AppState _instance = AppState._internal();
|
static final AppState _instance = AppState._internal();
|
||||||
@ -0,0 +1,23 @@
|
|||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
|
||||||
|
class MyColors {
|
||||||
|
static const Color darkIconColor = Color(0xff28323A);
|
||||||
|
static const Color darkTextColor = Color(0xff2B353E);
|
||||||
|
static const Color normalTextColor = Color(0xff5A5A5A);
|
||||||
|
static const Color lightTextColor = Color(0xffBFBFBF);
|
||||||
|
static const Color gradiantStartColor = Color(0xff33c0a5);
|
||||||
|
static const Color gradiantEndColor = Color(0xff259db7 );
|
||||||
|
static const Color textMixColor = Color(0xff2BB8A6);
|
||||||
|
static const Color backgroundColor = Color(0xffF8F8F8);
|
||||||
|
static const Color grey57Color = Color(0xff575757);
|
||||||
|
static const Color grey77Color = Color(0xff777777);
|
||||||
|
static const Color grey98Color = Color(0xff989898);
|
||||||
|
static const Color lightGreyEFColor = Color(0xffEFEFEF);
|
||||||
|
static const Color lightGreyEDColor = Color(0xffEDEDED);
|
||||||
|
static const Color darkWhiteColor = Color(0xffE0E0E0);
|
||||||
|
static const Color redColor = Color(0xffD02127);
|
||||||
|
static const Color yellowColor = Color(0xffF4E31C);
|
||||||
|
static const Color black = Color(0xff000000);
|
||||||
|
static const Color white = Color(0xffffffff);
|
||||||
|
static const Color green = Color(0xffffffff);
|
||||||
|
}
|
||||||
@ -1,7 +1,7 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
// import 'package:fluttertoast/fluttertoast.dart';
|
// import 'package:fluttertoast/fluttertoast.dart';
|
||||||
import 'package:mohem_flutter_app/sikander_later_will_remove_to_parent_directory/exceptions/api_exception.dart';
|
import 'package:mohem_flutter_app/exceptions/api_exception.dart';
|
||||||
|
|
||||||
class Utils {
|
class Utils {
|
||||||
static bool _isLoadingVisible = false;
|
static bool _isLoadingVisible = false;
|
||||||
@ -1,34 +0,0 @@
|
|||||||
//class which loads components "in the background", i.e. ui does not depend on it
|
|
||||||
|
|
||||||
import 'package:mohem_flutter_app/services/shared_preferences.dart';
|
|
||||||
import 'package:injector/injector.dart';
|
|
||||||
//import 'package:revocheckapp/services/firebase_service.dart';
|
|
||||||
|
|
||||||
|
|
||||||
class BackgroundLoader {
|
|
||||||
Future loadBackgroundData() async {
|
|
||||||
//init notification setting
|
|
||||||
try {
|
|
||||||
/*
|
|
||||||
final isPromotionNotificationEnabled = await Injector.appInstance
|
|
||||||
.getDependency<ISharedPreferences>()
|
|
||||||
.promotionNotificationsEnabled;
|
|
||||||
if (isPromotionNotificationEnabled == null) {
|
|
||||||
await Injector.appInstance
|
|
||||||
.getDependency<ISharedPreferences>()
|
|
||||||
.setPromotionNotificationEnabled(true);
|
|
||||||
Injector.appInstance
|
|
||||||
.getDependency<IFirebaseService>()
|
|
||||||
.subscribeForPromotions();
|
|
||||||
} */
|
|
||||||
} catch (_) {
|
|
||||||
//something wend wrong, set it to true
|
|
||||||
await Injector.appInstance
|
|
||||||
.getDependency<ISharedPreferences>()
|
|
||||||
.setPromotionNotificationEnabled(true);
|
|
||||||
/*Injector.appInstance
|
|
||||||
.getDependency<IFirebaseService>()
|
|
||||||
.subscribeForPromotions();*/
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
enum YesOrNo {
|
|
||||||
no,
|
|
||||||
yes,
|
|
||||||
}
|
|
||||||
|
|
||||||
const String icons = "assets/icons/";
|
|
||||||
const String categorySvgIcons = "assets/category/svg/";
|
|
||||||
const String svgIcons = "assets/svg/";
|
|
||||||
@ -1,36 +0,0 @@
|
|||||||
// import 'package:firebase_crashlytics/firebase_crashlytics.dart';
|
|
||||||
// import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
import 'package:mohem_flutter_app/config/background_loader.dart';
|
|
||||||
import 'package:mohem_flutter_app/repo/account_repository.dart';
|
|
||||||
import 'package:injector/injector.dart';
|
|
||||||
|
|
||||||
class AppDependencies {
|
|
||||||
static void addDependencies() {
|
|
||||||
Injector injector = Injector.appInstance;
|
|
||||||
|
|
||||||
//add dependencies as needed
|
|
||||||
injector.registerSingleton<IAcRepository>(() => AcRepository());
|
|
||||||
|
|
||||||
// injector.registerSingleton<IAcRepository>((injector) => AcRepository());
|
|
||||||
|
|
||||||
_addCrashlytics();
|
|
||||||
_loadBackgroundTasksNonBlocking();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void _addCrashlytics() {
|
|
||||||
// Set `enableInDevMode` to true to see reports while in debug mode
|
|
||||||
// This is only to be used for confirming that reports are being
|
|
||||||
// submitted as expected. It is not intended to be used for everyday
|
|
||||||
// development.
|
|
||||||
//Crashlytics.instance.enableInDevMode = true;
|
|
||||||
|
|
||||||
// Pass all uncaught errors from the framework to Crashlytics.
|
|
||||||
// FlutterError.onError = Crashlytics.instance.recordFlutterError;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void _loadBackgroundTasksNonBlocking() {
|
|
||||||
final backgroundLoader = BackgroundLoader();
|
|
||||||
backgroundLoader.loadBackgroundData();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,17 +1,32 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:mohem_flutter_app/pages/login/login_screen.dart';
|
import 'package:mohem_flutter_app/ui/dashboard.dart';
|
||||||
|
import 'package:mohem_flutter_app/ui/login/login_screen.dart';
|
||||||
|
import 'package:mohem_flutter_app/ui/login/verify_login_screen.dart';
|
||||||
|
import 'package:mohem_flutter_app/ui/work_list/missing_swipe/missing_swipe_screen.dart';
|
||||||
|
import 'package:mohem_flutter_app/ui/work_list/work_list_screen.dart';
|
||||||
|
|
||||||
class AppRoutes {
|
class AppRoutes {
|
||||||
static const String splash = "/splash";
|
static const String splash = "/splash";
|
||||||
static const String registerSelection = "/registerSelection";
|
static const String registerSelection = "/registerSelection";
|
||||||
static const String loginVerifyAccount = "/loginVerifyAccount";
|
static const String loginVerifyAccount = "/loginVerifyAccount";
|
||||||
static const String login = "/login";
|
static const String login = "/login";
|
||||||
|
static const String verifyLogin = "/verifyLogin";
|
||||||
static const String forgetPassword = "/forgetPassword";
|
static const String forgetPassword = "/forgetPassword";
|
||||||
static const String loginVerification = "/loginVerification";
|
static const String loginVerification = "/loginVerification";
|
||||||
static const String dashboard = "/dashboard";
|
static const String dashboard = "/dashboard";
|
||||||
static const String initialRoute = login;
|
static const String initialRoute = login;
|
||||||
|
|
||||||
|
//Work List
|
||||||
|
static const String workList = "/workList";
|
||||||
|
static const String missingSwipe = "/missingSwipe";
|
||||||
|
|
||||||
static final Map<String, WidgetBuilder> routes = {
|
static final Map<String, WidgetBuilder> routes = {
|
||||||
login: (context) => LoginScreen(),
|
login: (context) => LoginScreen(),
|
||||||
|
verifyLogin: (context) => VerifyLoginScreen(),
|
||||||
|
dashboard: (context) => Dashboard(),
|
||||||
|
|
||||||
|
//Work List
|
||||||
|
workList: (context) => WorkListScreen(),
|
||||||
|
missingSwipe: (context) => MissingSwipeScreen(),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,235 @@
|
|||||||
|
import 'dart:async';
|
||||||
|
|
||||||
|
import 'package:easy_localization/src/public_ext.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_svg/svg.dart';
|
||||||
|
import 'package:mohem_flutter_app/classes/colors.dart';
|
||||||
|
import 'package:mohem_flutter_app/extensions/int_extensions.dart';
|
||||||
|
import 'package:mohem_flutter_app/extensions/string_extensions.dart';
|
||||||
|
import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
|
||||||
|
import 'package:mohem_flutter_app/widgets/otp_widget.dart';
|
||||||
|
|
||||||
|
class OtpDialog {
|
||||||
|
final int type;
|
||||||
|
final int mobileNo;
|
||||||
|
final Function(String) onSuccess;
|
||||||
|
final Function onFailure;
|
||||||
|
final BuildContext context;
|
||||||
|
|
||||||
|
int remainingTime = 120;
|
||||||
|
|
||||||
|
Future<Null>? timer;
|
||||||
|
|
||||||
|
static BuildContext? _context;
|
||||||
|
|
||||||
|
static bool? _loading;
|
||||||
|
|
||||||
|
OtpDialog(
|
||||||
|
this.context,
|
||||||
|
this.type,
|
||||||
|
this.mobileNo,
|
||||||
|
this.onSuccess,
|
||||||
|
this.onFailure,
|
||||||
|
);
|
||||||
|
|
||||||
|
GlobalKey? verifyAccountForm = GlobalKey<FormState>();
|
||||||
|
|
||||||
|
final TextEditingController _pinPutController = TextEditingController();
|
||||||
|
|
||||||
|
TextEditingController digit1 = TextEditingController(text: "");
|
||||||
|
TextEditingController digit2 = TextEditingController(text: "");
|
||||||
|
TextEditingController digit3 = TextEditingController(text: "");
|
||||||
|
TextEditingController digit4 = TextEditingController(text: "");
|
||||||
|
|
||||||
|
Map verifyAccountFormValue = {
|
||||||
|
'digit1': '',
|
||||||
|
'digit2': '',
|
||||||
|
'digit3': '',
|
||||||
|
'digit4': '',
|
||||||
|
};
|
||||||
|
final focusD1 = FocusNode();
|
||||||
|
final focusD2 = FocusNode();
|
||||||
|
final focusD3 = FocusNode();
|
||||||
|
final focusD4 = FocusNode();
|
||||||
|
String? errorMsg;
|
||||||
|
|
||||||
|
// ProjectViewModel projectProvider;
|
||||||
|
String displayTime = '';
|
||||||
|
String? _code;
|
||||||
|
dynamic setState;
|
||||||
|
|
||||||
|
// static String signature;
|
||||||
|
|
||||||
|
displayDialog(BuildContext context) async {
|
||||||
|
return showDialog(
|
||||||
|
context: context,
|
||||||
|
barrierColor: Colors.black.withOpacity(0.63),
|
||||||
|
builder: (context) {
|
||||||
|
// projectProvider = Provider.of(context);
|
||||||
|
return Dialog(
|
||||||
|
backgroundColor: Colors.white,
|
||||||
|
shape: RoundedRectangleBorder(),
|
||||||
|
insetPadding: EdgeInsets.only(left: 21, right: 21),
|
||||||
|
child: StatefulBuilder(builder: (context, setState) {
|
||||||
|
if (displayTime == '') {
|
||||||
|
startTimer(setState);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Container(
|
||||||
|
padding: EdgeInsets.only(left: 21, right: 18, top: 39, bottom: 59),
|
||||||
|
child: Column(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: [
|
||||||
|
SvgPicture.asset(
|
||||||
|
type == 1 ? "assets/images/login/verify_sms.svg" : "assets/images/login/verify_whatsapp.svg",
|
||||||
|
height: 50,
|
||||||
|
width: 50,
|
||||||
|
),
|
||||||
|
IconButton(
|
||||||
|
padding: EdgeInsets.zero,
|
||||||
|
icon: const Icon(Icons.close),
|
||||||
|
constraints: const BoxConstraints(),
|
||||||
|
onPressed: () {
|
||||||
|
Navigator.pop(context);
|
||||||
|
this.onFailure();
|
||||||
|
},
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
22.height,
|
||||||
|
(LocaleKeys.pleaseEnterTheVerificationCodeSentTo.tr() + ' xxxxxxxx' + mobileNo.toString().substring(mobileNo.toString().length - 3)).toText16(),
|
||||||
|
18.height,
|
||||||
|
Directionality(
|
||||||
|
textDirection: TextDirection.ltr,
|
||||||
|
child: Center(
|
||||||
|
child: OTPWidget(
|
||||||
|
autoFocus: true,
|
||||||
|
controller: _pinPutController,
|
||||||
|
defaultBorderColor: const Color(0xffD8D8D8),
|
||||||
|
maxLength: 4,
|
||||||
|
onTextChanged: (text) {},
|
||||||
|
pinBoxColor: Colors.white,
|
||||||
|
onDone: (code) => _onOtpCallBack(code, null),
|
||||||
|
textBorderColor: const Color(0xffD8D8D8),
|
||||||
|
pinBoxWidth: 60,
|
||||||
|
pinBoxHeight: 60,
|
||||||
|
pinTextStyle: const TextStyle(fontSize: 24.0, color: MyColors.darkTextColor),
|
||||||
|
pinTextAnimatedSwitcherTransition: ProvidedPinBoxTextAnimation.scalingTransition,
|
||||||
|
pinTextAnimatedSwitcherDuration: const Duration(milliseconds: 300),
|
||||||
|
pinBoxRadius: 10,
|
||||||
|
keyboardType: TextInputType.number,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
30.height,
|
||||||
|
RichText(
|
||||||
|
text: TextSpan(
|
||||||
|
text: LocaleKeys.theVerificationCodeWillExpireIn.tr() + '\n',
|
||||||
|
style: const TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: MyColors.darkTextColor, letterSpacing: -0.48),
|
||||||
|
children: <TextSpan>[
|
||||||
|
TextSpan(
|
||||||
|
text: displayTime,
|
||||||
|
style: const TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: MyColors.textMixColor, letterSpacing: -0.48),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
InputDecoration buildInputDecoration(BuildContext context) {
|
||||||
|
return InputDecoration(
|
||||||
|
counterText: " ",
|
||||||
|
// ts/images/password_icon.png
|
||||||
|
// contentPadding: EdgeInsets.only(top: 20, bottom: 20),
|
||||||
|
enabledBorder: OutlineInputBorder(
|
||||||
|
borderRadius: BorderRadius.all(Radius.circular(10)),
|
||||||
|
borderSide: BorderSide(color: Colors.black),
|
||||||
|
),
|
||||||
|
focusedBorder: OutlineInputBorder(
|
||||||
|
borderRadius: BorderRadius.all(Radius.circular(10.0)),
|
||||||
|
borderSide: BorderSide(color: Theme.of(context).primaryColor),
|
||||||
|
),
|
||||||
|
errorBorder: OutlineInputBorder(
|
||||||
|
borderRadius: BorderRadius.all(Radius.circular(10.0)),
|
||||||
|
borderSide: BorderSide(color: Theme.of(context).errorColor),
|
||||||
|
),
|
||||||
|
focusedErrorBorder: OutlineInputBorder(
|
||||||
|
borderRadius: BorderRadius.all(Radius.circular(10.0)),
|
||||||
|
borderSide: BorderSide(color: Theme.of(context).errorColor),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// String validateCodeDigit(value) {
|
||||||
|
// if (value.isEmpty) {
|
||||||
|
// return ' ';
|
||||||
|
// } else if (value.length == 3) {
|
||||||
|
// print(value);
|
||||||
|
// } else {
|
||||||
|
// return null;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
checkValue() {
|
||||||
|
//print(verifyAccountFormValue);
|
||||||
|
// if (verifyAccountForm?.currentState!.validate()) {
|
||||||
|
// onSuccess(digit1.text.toString() + digit2.text.toString() + digit3.text.toString() + digit4.text.toString());
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
getSecondsAsDigitalClock(int inputSeconds) {
|
||||||
|
var sec_num = int.parse(inputSeconds.toString()); // don't forget the second param
|
||||||
|
var hours = (sec_num / 3600).floor();
|
||||||
|
var minutes = ((sec_num - hours * 3600) / 60).floor();
|
||||||
|
var seconds = sec_num - hours * 3600 - minutes * 60;
|
||||||
|
var minutesString = "";
|
||||||
|
var secondsString = "";
|
||||||
|
minutesString = minutes < 10 ? "0" + minutes.toString() : minutes.toString();
|
||||||
|
secondsString = seconds < 10 ? "0" + seconds.toString() : seconds.toString();
|
||||||
|
return minutesString + ":" + secondsString;
|
||||||
|
}
|
||||||
|
|
||||||
|
startTimer(setState) {
|
||||||
|
this.remainingTime--;
|
||||||
|
setState(() {
|
||||||
|
displayTime = this.getSecondsAsDigitalClock(this.remainingTime);
|
||||||
|
});
|
||||||
|
|
||||||
|
timer = Future.delayed(Duration(seconds: 1), () {
|
||||||
|
if (this.remainingTime > 0) {
|
||||||
|
startTimer(setState);
|
||||||
|
} else {
|
||||||
|
Navigator.pop(context);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
static void hideSMSBox(context) {
|
||||||
|
Navigator.pop(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
_onOtpCallBack(String otpCode, bool? isAutofill) {
|
||||||
|
if (otpCode.length == 4) {
|
||||||
|
onSuccess(otpCode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static getSignature() async {
|
||||||
|
// if (Platform.isAndroid) {
|
||||||
|
// return await SmsRetriever.getAppSignature();
|
||||||
|
// } else {
|
||||||
|
// return null;
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,6 +1,6 @@
|
|||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
|
|
||||||
import 'package:mohem_flutter_app/sikander_later_will_remove_to_parent_directory/api/api_client.dart';
|
import 'package:mohem_flutter_app/api/api_client.dart';
|
||||||
|
|
||||||
class APIException implements Exception {
|
class APIException implements Exception {
|
||||||
static const String BAD_REQUEST = 'api_common_bad_request';
|
static const String BAD_REQUEST = 'api_common_bad_request';
|
||||||
@ -0,0 +1,126 @@
|
|||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
import 'package:intl/intl.dart';
|
||||||
|
import 'package:mohem_flutter_app/classes/colors.dart';
|
||||||
|
|
||||||
|
extension EmailValidator on String {
|
||||||
|
Widget get toWidget => Text(this);
|
||||||
|
|
||||||
|
Widget toText10({Color? color, bool isBold = false}) => Text(
|
||||||
|
this,
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 10,
|
||||||
|
fontWeight: isBold ? FontWeight.bold : FontWeight.w600,
|
||||||
|
color: color ?? MyColors.darkTextColor,
|
||||||
|
letterSpacing: -0.4),
|
||||||
|
);
|
||||||
|
|
||||||
|
Widget toText11(
|
||||||
|
{Color? color, bool isUnderLine = false, bool isBold = false}) =>
|
||||||
|
Text(
|
||||||
|
this,
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 11,
|
||||||
|
fontWeight: isBold ? FontWeight.bold : FontWeight.w600,
|
||||||
|
color: color ?? MyColors.darkTextColor,
|
||||||
|
letterSpacing: -0.33,
|
||||||
|
decoration: isUnderLine ? TextDecoration.underline : null),
|
||||||
|
);
|
||||||
|
|
||||||
|
Widget toText12(
|
||||||
|
{Color? color,
|
||||||
|
bool isUnderLine = false,
|
||||||
|
bool isBold = false,
|
||||||
|
bool isCenter = false,
|
||||||
|
int maxLine = 0}) =>
|
||||||
|
Text(
|
||||||
|
this,
|
||||||
|
textAlign: isCenter ? TextAlign.center : null,
|
||||||
|
maxLines: (maxLine > 0) ? maxLine : null,
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 12,
|
||||||
|
fontWeight: isBold ? FontWeight.bold : FontWeight.w600,
|
||||||
|
color: color ?? MyColors.darkTextColor,
|
||||||
|
letterSpacing: -0.72,
|
||||||
|
decoration: isUnderLine ? TextDecoration.underline : null),
|
||||||
|
);
|
||||||
|
|
||||||
|
Widget toText13({Color? color, bool isUnderLine = false}) => Text(
|
||||||
|
this,
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 13,
|
||||||
|
fontWeight: FontWeight.w600,
|
||||||
|
color: color ?? MyColors.darkTextColor,
|
||||||
|
letterSpacing: -0.52,
|
||||||
|
decoration: isUnderLine ? TextDecoration.underline : null),
|
||||||
|
);
|
||||||
|
|
||||||
|
Widget toText14({Color? color, bool isBold = false}) => Text(
|
||||||
|
this,
|
||||||
|
style: TextStyle(
|
||||||
|
color: color ?? MyColors.darkTextColor,
|
||||||
|
fontSize: 14,
|
||||||
|
letterSpacing: -0.48,
|
||||||
|
fontWeight: isBold ? FontWeight.bold : FontWeight.w600),
|
||||||
|
);
|
||||||
|
|
||||||
|
Widget toText16({Color? color, bool isBold = false}) => Text(
|
||||||
|
this,
|
||||||
|
style: TextStyle(
|
||||||
|
color: color ?? MyColors.darkTextColor,
|
||||||
|
fontSize: 16,
|
||||||
|
letterSpacing: -0.64,
|
||||||
|
fontWeight: isBold ? FontWeight.bold : FontWeight.w600),
|
||||||
|
);
|
||||||
|
|
||||||
|
Widget toText24({bool isBold = false, Color? textColor}) => Text(
|
||||||
|
this,
|
||||||
|
style: TextStyle(
|
||||||
|
height: 23 / 24,
|
||||||
|
color: textColor ?? MyColors.darkTextColor,
|
||||||
|
fontSize: 24,
|
||||||
|
letterSpacing: -1.44,
|
||||||
|
fontWeight: isBold ? FontWeight.bold : FontWeight.w600),
|
||||||
|
);
|
||||||
|
|
||||||
|
bool isValidEmail() {
|
||||||
|
return RegExp(
|
||||||
|
r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$')
|
||||||
|
.hasMatch(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
String toFormattedDate() {
|
||||||
|
String date = this.split("T")[0];
|
||||||
|
String time = this.split("T")[1];
|
||||||
|
var dates = date.split("-");
|
||||||
|
return "${dates[2]} ${getMonth(int.parse(dates[1]))} ${dates[0]} ${DateFormat('hh:mm a').format(DateFormat('hh:mm:ss').parse(time))}";
|
||||||
|
}
|
||||||
|
|
||||||
|
getMonth(int month) {
|
||||||
|
switch (month) {
|
||||||
|
case 1:
|
||||||
|
return "January";
|
||||||
|
case 2:
|
||||||
|
return "February";
|
||||||
|
case 3:
|
||||||
|
return "March";
|
||||||
|
case 4:
|
||||||
|
return "April";
|
||||||
|
case 5:
|
||||||
|
return "May";
|
||||||
|
case 6:
|
||||||
|
return "June";
|
||||||
|
case 7:
|
||||||
|
return "July";
|
||||||
|
case 8:
|
||||||
|
return "August";
|
||||||
|
case 9:
|
||||||
|
return "September";
|
||||||
|
case 10:
|
||||||
|
return "October";
|
||||||
|
case 11:
|
||||||
|
return "November";
|
||||||
|
case 12:
|
||||||
|
return "December";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,11 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter/widgets.dart';
|
||||||
|
|
||||||
|
extension WidgetExtensions on Widget {
|
||||||
|
Widget onPress(VoidCallback onTap) => InkWell(onTap: onTap, child: this);
|
||||||
|
|
||||||
|
Widget paddingAll(double _value) => Padding(padding: EdgeInsets.all(_value), child: this);
|
||||||
|
|
||||||
|
Widget paddingOnly({double left = 0.0, double right = 0.0, double top = 0.0, double bottom = 0.0}) =>
|
||||||
|
Padding(padding: EdgeInsets.only(left: left, right: right, top: top, bottom: bottom), child: this);
|
||||||
|
}
|
||||||
@ -1,43 +0,0 @@
|
|||||||
// To parse this JSON data, do
|
|
||||||
//
|
|
||||||
// final account = accountFromJson(jsonString);
|
|
||||||
|
|
||||||
import 'dart:convert';
|
|
||||||
|
|
||||||
import 'package:mohem_flutter_app/models/parent_list.dart';
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Account accountFromJson(String str) => Account.fromJson(json.decode(str));
|
|
||||||
|
|
||||||
String accountToJson(Account data) => json.encode(data.toJson());
|
|
||||||
|
|
||||||
class Account {
|
|
||||||
Account({
|
|
||||||
required this.parentList,
|
|
||||||
required this.selectedItem,
|
|
||||||
});
|
|
||||||
|
|
||||||
List<ParentList>? parentList;
|
|
||||||
int selectedItem;
|
|
||||||
|
|
||||||
factory Account.fromJson(Map<String, dynamic> json) => Account(
|
|
||||||
parentList: json["parentList"] == null
|
|
||||||
? null
|
|
||||||
: List<ParentList>.from(
|
|
||||||
json["parentList"].map((x) => ParentList.fromJson(x))),
|
|
||||||
selectedItem:
|
|
||||||
json["selectedItem"] == null ? null : json["selectedItem"],
|
|
||||||
);
|
|
||||||
|
|
||||||
Map<String, dynamic> toJson() => {
|
|
||||||
"parentList": parentList == null
|
|
||||||
? null
|
|
||||||
: List<dynamic>.from(parentList!.map((x) => x.toJson())),
|
|
||||||
"selectedItem": selectedItem == null ? null : selectedItem,
|
|
||||||
};
|
|
||||||
|
|
||||||
Map<String, dynamic> toJsonData() => {
|
|
||||||
"selectedItem": selectedItem == null ? null : selectedItem,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@ -1,12 +0,0 @@
|
|||||||
class ConfigModel {
|
|
||||||
ConfigModel(this.endpoint, this.organizationName);
|
|
||||||
|
|
||||||
String endpoint;
|
|
||||||
|
|
||||||
String organizationName;
|
|
||||||
|
|
||||||
factory ConfigModel.fromJson(Map<String, dynamic> json) =>
|
|
||||||
ConfigModel("", "");
|
|
||||||
|
|
||||||
// Map<String, dynamic> toJson() => _$ConfigModelToJson(this);
|
|
||||||
}
|
|
||||||
@ -1,26 +0,0 @@
|
|||||||
class ParentList {
|
|
||||||
ParentList({
|
|
||||||
required this.dbId,
|
|
||||||
required this.text,
|
|
||||||
required this.path,
|
|
||||||
required this.isSelected,
|
|
||||||
});
|
|
||||||
|
|
||||||
int dbId;
|
|
||||||
String text;
|
|
||||||
String path;
|
|
||||||
bool isSelected;
|
|
||||||
|
|
||||||
factory ParentList.fromJson(Map<String, dynamic> json) => ParentList(
|
|
||||||
dbId: json["dbId"] == null ? null : json["dbId"],
|
|
||||||
text: json["text"] == null ? null : json["text"],
|
|
||||||
path: json["path"] == null ? null : json["path"],
|
|
||||||
isSelected: false,
|
|
||||||
);
|
|
||||||
|
|
||||||
Map<String, dynamic> toJson() => {
|
|
||||||
"dbId": dbId == null ? null : dbId,
|
|
||||||
"text": text == null ? null : text,
|
|
||||||
"path": path == null ? null : path,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@ -1,34 +0,0 @@
|
|||||||
///
|
|
||||||
/// This example was taken from
|
|
||||||
/// https://flutter.dev/docs/development/data-and-backend/json
|
|
||||||
///
|
|
||||||
|
|
||||||
/// This allows the `User` class to access private members in
|
|
||||||
/// the generated file. The value for this is *.g.dart, where
|
|
||||||
/// the star denotes the source file name.
|
|
||||||
|
|
||||||
/// An annotation for the code generator to know that this class needs the
|
|
||||||
/// JSON serialization logic to be generated.
|
|
||||||
|
|
||||||
class BackendResponse {
|
|
||||||
BackendResponse({required this.id, required this.isOk, required this.result});
|
|
||||||
|
|
||||||
int id;
|
|
||||||
bool isOk;
|
|
||||||
dynamic result;
|
|
||||||
|
|
||||||
/// A necessary factory constructor for creating a new User instance
|
|
||||||
/// from a map. Pass the map to the generated `_$UserFromJson()` constructor.
|
|
||||||
/// The constructor is named after the source class, in this case, User.
|
|
||||||
factory BackendResponse.fromJson(Map<String, dynamic> json) =>
|
|
||||||
BackendResponse(
|
|
||||||
id: 1,
|
|
||||||
isOk: false,
|
|
||||||
result: null,
|
|
||||||
);
|
|
||||||
//
|
|
||||||
// /// `toJson` is the convention for a class to declare support for serialization
|
|
||||||
// /// to JSON. The implementation simply calls the private, generated
|
|
||||||
// /// helper method `_$UserToJson`.
|
|
||||||
// Map<String, dynamic> toJson() => _$BackendResponseToJson(this);
|
|
||||||
}
|
|
||||||
@ -1,9 +0,0 @@
|
|||||||
class User {
|
|
||||||
int id;
|
|
||||||
|
|
||||||
User(this.id, this.userName, this.userImage, this.createdDate);
|
|
||||||
|
|
||||||
String userName;
|
|
||||||
String userImage;
|
|
||||||
String createdDate;
|
|
||||||
}
|
|
||||||
@ -1,48 +0,0 @@
|
|||||||
import 'dart:async';
|
|
||||||
|
|
||||||
import 'package:mohem_flutter_app/config/routes.dart';
|
|
||||||
import 'package:mohem_flutter_app/utils/navigator.dart';
|
|
||||||
import 'package:mohem_flutter_app/utils/utils.dart';
|
|
||||||
import 'package:mohem_flutter_app/widgets/txt.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
class SplashPage extends StatelessWidget {
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Scaffold(
|
|
||||||
body: Container(
|
|
||||||
width: double.infinity,
|
|
||||||
height: double.infinity,
|
|
||||||
child: Column(
|
|
||||||
children: [
|
|
||||||
mFlex(5),
|
|
||||||
Txt(
|
|
||||||
"Logo",
|
|
||||||
fontSize: 45,
|
|
||||||
bold: true,
|
|
||||||
),
|
|
||||||
mFlex(3),
|
|
||||||
Txt(
|
|
||||||
"First Time Log In",
|
|
||||||
txtType: TxtType.heading1,
|
|
||||||
isFlatButton: true,
|
|
||||||
onTap: () {
|
|
||||||
navigateWithName(context, AppRoutes.registerSelection);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
mFlex(1),
|
|
||||||
Txt(
|
|
||||||
"Already Signed Up and Logged In",
|
|
||||||
txtType: TxtType.heading1,
|
|
||||||
isFlatButton: true,
|
|
||||||
onTap: () {
|
|
||||||
navigateWithName(context, AppRoutes.loginVerification);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
mFlex(5),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,20 +0,0 @@
|
|||||||
import 'package:flutter/foundation.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
class Counter with ChangeNotifier, DiagnosticableTreeMixin {
|
|
||||||
int _count = 0;
|
|
||||||
|
|
||||||
int get count => _count;
|
|
||||||
|
|
||||||
void increment() {
|
|
||||||
_count++;
|
|
||||||
notifyListeners();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Makes `Counter` readable inside the devtools by listing all of its properties
|
|
||||||
@override
|
|
||||||
void debugFillProperties(DiagnosticPropertiesBuilder properties) {
|
|
||||||
super.debugFillProperties(properties);
|
|
||||||
properties.add(IntProperty('count', count));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,49 +0,0 @@
|
|||||||
import 'dart:convert';
|
|
||||||
import 'dart:io';
|
|
||||||
|
|
||||||
import 'package:mohem_flutter_app/models/account.dart';
|
|
||||||
import 'package:mohem_flutter_app/models/response_models.dart';
|
|
||||||
import 'package:mohem_flutter_app/services/backend_service.dart';
|
|
||||||
import 'package:injector/injector.dart';
|
|
||||||
|
|
||||||
abstract class IAcRepository {
|
|
||||||
Future<Account> getAccountList();
|
|
||||||
|
|
||||||
Future<BackendResponse> updateAccount(String dataAsJson);
|
|
||||||
}
|
|
||||||
|
|
||||||
class AcRepository implements IAcRepository {
|
|
||||||
static const String ACCOUNT_API_CONTROLLER_MOBILE =
|
|
||||||
"AccountApiControllerMobile/";
|
|
||||||
|
|
||||||
static const String ACCOUNT_LIST = ACCOUNT_API_CONTROLLER_MOBILE + "list";
|
|
||||||
static const String UPDATE_LIST =
|
|
||||||
ACCOUNT_API_CONTROLLER_MOBILE + "saveaccountselected";
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<Account> getAccountList() async {
|
|
||||||
BackendResponse response = await Injector.appInstance
|
|
||||||
.getDependency<IBackendApiService>()
|
|
||||||
.getAuthenticatedAPI(ACCOUNT_LIST);
|
|
||||||
|
|
||||||
if (response != null && response.isOk) {
|
|
||||||
return Account.fromJson(response.result);
|
|
||||||
} else {
|
|
||||||
throw Exception();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<BackendResponse> updateAccount(String dataAsJson) async {
|
|
||||||
BackendResponse response = await Injector.appInstance
|
|
||||||
.getDependency<IBackendApiService>()
|
|
||||||
.postAuthenticatedAPI(UPDATE_LIST, dataAsJson);
|
|
||||||
|
|
||||||
if (response != null && response.isOk) {
|
|
||||||
//if parsing failed, throw exception
|
|
||||||
return response;
|
|
||||||
} else {
|
|
||||||
throw Exception();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,127 +0,0 @@
|
|||||||
import 'dart:convert';
|
|
||||||
import 'dart:io';
|
|
||||||
import 'package:mohem_flutter_app/models/response_models.dart';
|
|
||||||
import 'package:mohem_flutter_app/services/secure_storage.dart';
|
|
||||||
import 'package:http/http.dart';
|
|
||||||
import 'package:injector/injector.dart';
|
|
||||||
|
|
||||||
import 'http_service.dart';
|
|
||||||
import 'network_service.dart';
|
|
||||||
|
|
||||||
abstract class IBackendApiService {
|
|
||||||
Future<BackendResponse> getUnauthenticatedAPI(String route);
|
|
||||||
|
|
||||||
Future<BackendResponse> getAuthenticatedAPI(String route);
|
|
||||||
|
|
||||||
Future<BackendResponse> postUnauthenticatedAPI(
|
|
||||||
String route, String dataAsJson);
|
|
||||||
|
|
||||||
Future<BackendResponse> postAuthenticatedAPI(String route, String dataAsJson);
|
|
||||||
|
|
||||||
Future<BackendResponse> deleteAuthenticatedAPI(String route, String id);
|
|
||||||
}
|
|
||||||
|
|
||||||
class BackendApiService implements IBackendApiService {
|
|
||||||
static String _homeUrl = "https://check.revotec.eu/check2/";
|
|
||||||
static String _serverApiBaseUrl = _homeUrl + "mapi/v1/";
|
|
||||||
|
|
||||||
static String get homeUrl => _homeUrl;
|
|
||||||
|
|
||||||
final ISecureStorage _secureStorage =
|
|
||||||
Injector.appInstance.getDependency<ISecureStorage>();
|
|
||||||
final IHttpService _httpService =
|
|
||||||
Injector.appInstance.getDependency<IHttpService>();
|
|
||||||
|
|
||||||
///internal helper functions which executes the given api call
|
|
||||||
///and wraps the response
|
|
||||||
Future<BackendResponse> _callApi(Future<dynamic> callback) async {
|
|
||||||
Response response;
|
|
||||||
try {
|
|
||||||
//execute future
|
|
||||||
response = await callback;
|
|
||||||
//check response code, and if not ok return isOk = false
|
|
||||||
//200 for Get
|
|
||||||
//201 for Post
|
|
||||||
|
|
||||||
// print("res121: " +
|
|
||||||
// response.statusCode.toString() +
|
|
||||||
// " Body:" +
|
|
||||||
// response.body.toString());
|
|
||||||
//if delete request sent so server is returning 204 in case of success.
|
|
||||||
if (response.statusCode == 204)
|
|
||||||
return BackendResponse(id: 1, isOk: true, result: null);
|
|
||||||
|
|
||||||
if (response.statusCode != 200 && response.statusCode != 201)
|
|
||||||
return BackendResponse(id: -1, isOk: false, result: null);
|
|
||||||
//if response code is good then parse message and return parsed response
|
|
||||||
return BackendResponse.fromJson(json.decode(response.body));
|
|
||||||
//return BackendResponse.fromJson(dioResponse.body);
|
|
||||||
} catch (e) {
|
|
||||||
return BackendResponse(id: -1, isOk: false, result: null);
|
|
||||||
// try {
|
|
||||||
// return BackendResponse.fromJson(json.decode(response.body));
|
|
||||||
// } catch (e) {
|
|
||||||
// return BackendResponse(id:-1, isOk:false,result: null);
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<BackendResponse> getAuthenticatedAPI(String route) async {
|
|
||||||
await checkConnection();
|
|
||||||
final token = await _secureStorage.readBearerToken();
|
|
||||||
return _callApi(_httpService.get(_serverApiBaseUrl + route, headers: {
|
|
||||||
'Content-Type': 'application/json',
|
|
||||||
'Accept': '*/*',
|
|
||||||
HttpHeaders.authorizationHeader: "Bearer $token"
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<BackendResponse> getUnauthenticatedAPI(String route) async {
|
|
||||||
await checkConnection();
|
|
||||||
return _callApi(_httpService.get(_serverApiBaseUrl + route,
|
|
||||||
headers: {'Content-Type': 'application/json', 'Accept': '*/*'}));
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<BackendResponse> postAuthenticatedAPI(
|
|
||||||
String route, String dataAsJson) async {
|
|
||||||
await checkConnection();
|
|
||||||
final token = await _secureStorage.readBearerToken();
|
|
||||||
// print("res121: " + _serverApiBaseUrl + route);
|
|
||||||
return _callApi(_httpService
|
|
||||||
.post(_serverApiBaseUrl + route, body: dataAsJson, headers: {
|
|
||||||
'Content-Type': 'application/json',
|
|
||||||
'Accept': '*/*',
|
|
||||||
HttpHeaders.authorizationHeader: "Bearer $token"
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<BackendResponse> postUnauthenticatedAPI(
|
|
||||||
String route, String dataAsJson) async {
|
|
||||||
await checkConnection();
|
|
||||||
return _callApi(_httpService.post(_serverApiBaseUrl + route,
|
|
||||||
body: dataAsJson, headers: {'Content-Type': 'application/json'}));
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> checkConnection() async {
|
|
||||||
if (!(await Injector.appInstance
|
|
||||||
.getDependency<INetworkService>()
|
|
||||||
.isHostAvailable(_homeUrl))) throw NetworkException();
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<BackendResponse> deleteAuthenticatedAPI(
|
|
||||||
String route, String id) async {
|
|
||||||
await checkConnection();
|
|
||||||
final token = await _secureStorage.readBearerToken();
|
|
||||||
return _callApi(
|
|
||||||
_httpService.delete(_serverApiBaseUrl + route + "/" + id, headers: {
|
|
||||||
'Content-Type': 'application/json',
|
|
||||||
'Accept': '*/*',
|
|
||||||
HttpHeaders.authorizationHeader: "Bearer $token"
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,180 +0,0 @@
|
|||||||
/*
|
|
||||||
import 'dart:io' show Platform;
|
|
||||||
import 'package:firebase_messaging/firebase_messaging.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
|
|
||||||
|
|
||||||
abstract class IFirebaseService {
|
|
||||||
Future<String> get token;
|
|
||||||
|
|
||||||
Future<dynamic> backgroundMessageHandler(Map<String, dynamic> message);
|
|
||||||
|
|
||||||
Future<dynamic> messageHandler(Map<String, dynamic> message);
|
|
||||||
|
|
||||||
Future<dynamic> onLaunch(Map<String, dynamic> message);
|
|
||||||
|
|
||||||
Future<dynamic> onResume(Map<String, dynamic> message);
|
|
||||||
|
|
||||||
void subscribeForPromotions();
|
|
||||||
|
|
||||||
void unsubscribeFromPromotions();
|
|
||||||
}
|
|
||||||
|
|
||||||
//https://medium.com/@SebastianEngel/easy-push-notifications-with-flutter-and-firebase-cloud-messaging-d96084f5954f
|
|
||||||
class FirebaseService implements IFirebaseService {
|
|
||||||
FirebaseMessaging _firebaseMessaging;
|
|
||||||
|
|
||||||
FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin;
|
|
||||||
|
|
||||||
FirebaseService() {.
|
|
||||||
_firebaseMessaging = FirebaseMessaging();
|
|
||||||
|
|
||||||
//https://github.com/FirebaseExtended/flutterfire/issues/1695
|
|
||||||
_firebaseMessaging.configure(
|
|
||||||
onMessage: messageHandler,
|
|
||||||
onBackgroundMessage:
|
|
||||||
Platform.isAndroid ? myBackgroundMessageHandler : null,
|
|
||||||
onLaunch: onLaunch,
|
|
||||||
onResume: onResume,
|
|
||||||
);
|
|
||||||
|
|
||||||
//monitor firebase token changes
|
|
||||||
//https://firebase.google.com/docs/cloud-messaging/android/client#sample-register
|
|
||||||
///The registration token may change when:
|
|
||||||
//
|
|
||||||
//The app deletes Instance ID
|
|
||||||
//The app is restored on a new device
|
|
||||||
//The user uninstalls/reinstall the app
|
|
||||||
//The user clears app data.
|
|
||||||
///
|
|
||||||
|
|
||||||
//for the first release we don't care about token refreshes
|
|
||||||
/*Stream<String> fcmStream = _firebaseMessaging.onTokenRefresh;
|
|
||||||
fcmStream.listen((token) {
|
|
||||||
|
|
||||||
});*/
|
|
||||||
|
|
||||||
//ios specific settings
|
|
||||||
//taken from https://github.com/FirebaseExtended/flutterfire/blob/master/packages/firebase_messaging/example/lib/main.dart
|
|
||||||
_firebaseMessaging.requestNotificationPermissions(
|
|
||||||
const IosNotificationSettings(
|
|
||||||
sound: true, badge: true, alert: true, provisional: true));
|
|
||||||
_firebaseMessaging.onIosSettingsRegistered
|
|
||||||
.listen((IosNotificationSettings settings) {
|
|
||||||
print("Settings registered: $settings");
|
|
||||||
});
|
|
||||||
|
|
||||||
var initializationSettingsAndroid =
|
|
||||||
AndroidInitializationSettings('app_icon');
|
|
||||||
var initializationSettingsIOS =
|
|
||||||
IOSInitializationSettings(onDidReceiveLocalNotification: onDidReceiveLocalNotification);
|
|
||||||
var initializationSettings = InitializationSettings(
|
|
||||||
initializationSettingsAndroid, initializationSettingsIOS);
|
|
||||||
flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();
|
|
||||||
flutterLocalNotificationsPlugin.initialize(initializationSettings,
|
|
||||||
onSelectNotification: selectNotification);
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<dynamic> onDidReceiveLocalNotification(int id, String title, String body, String payload) async{
|
|
||||||
var androidPlatformChannelSpecifics = AndroidNotificationDetails(
|
|
||||||
'new_message_channel_id',
|
|
||||||
'Neue Nachricht',
|
|
||||||
'Channel für neue Nachrichten',
|
|
||||||
importance: Importance.Max,
|
|
||||||
priority: Priority.High,
|
|
||||||
ticker: 'ticker');
|
|
||||||
var iOSPlatformChannelSpecifics = IOSNotificationDetails();
|
|
||||||
var platformChannelSpecifics = NotificationDetails(
|
|
||||||
androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics);
|
|
||||||
await flutterLocalNotificationsPlugin.show(
|
|
||||||
0,
|
|
||||||
title,
|
|
||||||
body,
|
|
||||||
platformChannelSpecifics);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future backgroundMessageHandler(Map<String, dynamic> message) async {
|
|
||||||
await myBackgroundMessageHandler(message);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future messageHandler(Map<String, dynamic> message) async {
|
|
||||||
print("onMessage: $message");
|
|
||||||
|
|
||||||
// initialise the plugin. app_icon needs to be a added as a drawable resource to the Android head project
|
|
||||||
|
|
||||||
var androidPlatformChannelSpecifics = AndroidNotificationDetails(
|
|
||||||
'new_message_channel_id',
|
|
||||||
'Neue Nachricht',
|
|
||||||
'Channel für neue Nachrichten',
|
|
||||||
importance: Importance.Max,
|
|
||||||
priority: Priority.High,
|
|
||||||
ticker: 'ticker');
|
|
||||||
var iOSPlatformChannelSpecifics = IOSNotificationDetails();
|
|
||||||
var platformChannelSpecifics = NotificationDetails(
|
|
||||||
androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics);
|
|
||||||
|
|
||||||
if(Platform.isAndroid) {
|
|
||||||
await flutterLocalNotificationsPlugin.show(
|
|
||||||
0,
|
|
||||||
message["notification"]["title"],
|
|
||||||
message["notification"]["body"],
|
|
||||||
platformChannelSpecifics);
|
|
||||||
}else if(Platform.isIOS){
|
|
||||||
await flutterLocalNotificationsPlugin.show(
|
|
||||||
0,
|
|
||||||
message["aps"]["alert"]["title"],
|
|
||||||
message["aps"]["alert"]["body"],
|
|
||||||
platformChannelSpecifics);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Future selectNotification(String payload) async {
|
|
||||||
if (payload != null) {
|
|
||||||
debugPrint('notification payload: ' + payload);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future onLaunch(Map<String, dynamic> message) async {
|
|
||||||
print("onLaunch: $message");
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future onResume(Map<String, dynamic> message) async {
|
|
||||||
print("onResume: $message");
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<String> get token => _firebaseMessaging.getToken();
|
|
||||||
|
|
||||||
@override
|
|
||||||
void subscribeForPromotions() {
|
|
||||||
_firebaseMessaging.subscribeToTopic("promotions");
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
void unsubscribeFromPromotions() {
|
|
||||||
_firebaseMessaging.unsubscribeFromTopic("promotions");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<dynamic> myBackgroundMessageHandler(Map<String, dynamic> message) {
|
|
||||||
debugPrint("BACKGROUND MESSAGE RECEIVED");
|
|
||||||
print("BACKGROUND MESSAGE RECEIVED");
|
|
||||||
return Future.value(() => true);
|
|
||||||
|
|
||||||
/*if (message.containsKey('data')) {
|
|
||||||
// Handle data message
|
|
||||||
final dynamic data = message['data'];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (message.containsKey('notification')) {
|
|
||||||
// Handle notification message
|
|
||||||
final dynamic notification = message['notification'];
|
|
||||||
}*/
|
|
||||||
|
|
||||||
// Or do other work.
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
@ -1,34 +0,0 @@
|
|||||||
import 'dart:convert';
|
|
||||||
import 'dart:io';
|
|
||||||
import 'dart:async';
|
|
||||||
|
|
||||||
|
|
||||||
import 'package:http/http.dart' as http;
|
|
||||||
import 'package:http/http.dart';
|
|
||||||
|
|
||||||
abstract class IHttpService {
|
|
||||||
Future<Response> post(url,
|
|
||||||
{Map<String, String> headers, body, Encoding encoding});
|
|
||||||
|
|
||||||
Future<Response> get(url, {Map<String, String> headers});
|
|
||||||
|
|
||||||
Future<Response> delete(url, {Map<String, String> headers});
|
|
||||||
}
|
|
||||||
|
|
||||||
class HttpService implements IHttpService {
|
|
||||||
@override
|
|
||||||
Future<Response> delete(url, {Map<String, String>? headers}) {
|
|
||||||
return http.delete(url, headers: headers);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<Response> get(url, {Map<String, String>? headers}) {
|
|
||||||
return http.get(url, headers: headers);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<Response> post(url,
|
|
||||||
{Map<String, String>? headers, body, Encoding? encoding}) {
|
|
||||||
return http.post(url, headers: headers, body: body, encoding: encoding);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,26 +0,0 @@
|
|||||||
// import 'dart:io';
|
|
||||||
//
|
|
||||||
// import 'package:image_picker/image_picker.dart';
|
|
||||||
//
|
|
||||||
// abstract class IMediaService {
|
|
||||||
// Future<File?> takePicture();
|
|
||||||
//
|
|
||||||
// Future<File?> openImageFromGallery();
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// class MediaService implements IMediaService {
|
|
||||||
// @override
|
|
||||||
// Future<File?> openImageFromGallery() async {
|
|
||||||
// final pickedFile =
|
|
||||||
// await ImagePicker().getImage(source: ImageSource.gallery);
|
|
||||||
// if (pickedFile == null) return null;
|
|
||||||
// return File(pickedFile.path);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// @override
|
|
||||||
// Future<File?> takePicture() async {
|
|
||||||
// final pickedFile = await ImagePicker().getImage(source: ImageSource.camera);
|
|
||||||
// if (pickedFile == null) return null;
|
|
||||||
// return File(pickedFile.path);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
@ -1,25 +0,0 @@
|
|||||||
|
|
||||||
import 'dart:io';
|
|
||||||
|
|
||||||
abstract class INetworkService {
|
|
||||||
Future<bool> isHostAvailable(String endpoint);
|
|
||||||
}
|
|
||||||
|
|
||||||
class NetworkService implements INetworkService{
|
|
||||||
@override
|
|
||||||
Future<bool> isHostAvailable(String endpoint) async {
|
|
||||||
try {
|
|
||||||
final result = await InternetAddress.lookup(endpoint.substring(endpoint.indexOf('//')+2).substring(0,endpoint.substring(endpoint.indexOf('//')+2).indexOf('/')));
|
|
||||||
if (result.isNotEmpty && result[0].rawAddress.isNotEmpty) {
|
|
||||||
return true;
|
|
||||||
} else{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
} on SocketException catch (_) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class NetworkException implements Exception {
|
|
||||||
}
|
|
||||||
@ -1,33 +0,0 @@
|
|||||||
abstract class ISecureStorage {
|
|
||||||
Future<String> readBearerToken();
|
|
||||||
|
|
||||||
Future<void> clearUserCredentials();
|
|
||||||
}
|
|
||||||
|
|
||||||
class SecureStorage implements ISecureStorage {
|
|
||||||
///return bearer token if present, or null if not
|
|
||||||
@override
|
|
||||||
Future<String> readBearerToken() async {
|
|
||||||
try {
|
|
||||||
return "";
|
|
||||||
} catch (_) {
|
|
||||||
//an error occured returning null
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
///returns true if write was successful, false otherwise
|
|
||||||
@override
|
|
||||||
Future<bool> writeBearerToken(String token) async {
|
|
||||||
try {
|
|
||||||
await "";
|
|
||||||
return true;
|
|
||||||
} catch (_) {
|
|
||||||
//an error occured returning false
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<void> clearUserCredentials() async {}
|
|
||||||
}
|
|
||||||
@ -1,119 +0,0 @@
|
|||||||
import 'dart:convert';
|
|
||||||
|
|
||||||
import 'package:mohem_flutter_app/models/config_model.dart';
|
|
||||||
|
|
||||||
import 'package:shared_preferences/shared_preferences.dart'
|
|
||||||
as SharedPrefsPlugin;
|
|
||||||
|
|
||||||
///
|
|
||||||
/// Taken from AlarmGuide Project
|
|
||||||
///
|
|
||||||
|
|
||||||
abstract class ISharedPreferences {
|
|
||||||
Future<int?> get authState;
|
|
||||||
|
|
||||||
Future<void> setAuthState(int authState);
|
|
||||||
|
|
||||||
Future<int?> get configState;
|
|
||||||
|
|
||||||
Future<void> setConfigState(int confState);
|
|
||||||
|
|
||||||
Future<ConfigModel?> get config;
|
|
||||||
|
|
||||||
Future<void> setConfig(ConfigModel config);
|
|
||||||
|
|
||||||
Future<bool?> get promotionNotificationsEnabled;
|
|
||||||
|
|
||||||
Future<void> setPromotionNotificationEnabled(bool newSetting);
|
|
||||||
|
|
||||||
Future<bool?> get helpAlreadyShown;
|
|
||||||
|
|
||||||
Future<void> setHelpAlreadyShown();
|
|
||||||
|
|
||||||
Future<int?> get useS3;
|
|
||||||
|
|
||||||
Future<void> setUseS3(int value);
|
|
||||||
}
|
|
||||||
|
|
||||||
class SharedPreferences implements ISharedPreferences {
|
|
||||||
static const String _AUTH_STATE_KEY = "auth_key";
|
|
||||||
static const String _CONFIG_KEY = "config";
|
|
||||||
static const String _CONFIG_STATE_KEY = "config_key";
|
|
||||||
static const String _PROMOTION_NOTIFICATION_KEY = "promotion";
|
|
||||||
static const String _HELP_ALREADY_SHOWN = "help_shown";
|
|
||||||
static const String _USE_S3 = "s3";
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<int?> get authState async {
|
|
||||||
final sharedPrefs = await SharedPrefsPlugin.SharedPreferences.getInstance();
|
|
||||||
return sharedPrefs.getInt(_AUTH_STATE_KEY);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<void> setAuthState(int authState) async {
|
|
||||||
final sharedPrefs = await SharedPrefsPlugin.SharedPreferences.getInstance();
|
|
||||||
sharedPrefs.setInt(_AUTH_STATE_KEY, authState);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<ConfigModel?> get config async {
|
|
||||||
final sharedPrefs = await SharedPrefsPlugin.SharedPreferences.getInstance();
|
|
||||||
final configAsJson = sharedPrefs.getString(_CONFIG_KEY);
|
|
||||||
return ConfigModel.fromJson(jsonDecode(configAsJson!));
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<void> setConfig(ConfigModel config) async {
|
|
||||||
final sharedPrefs = await SharedPrefsPlugin.SharedPreferences.getInstance();
|
|
||||||
sharedPrefs.setString(_CONFIG_KEY, jsonEncode(config));
|
|
||||||
setConfigState(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<bool?> get promotionNotificationsEnabled async {
|
|
||||||
final sharedPrefs = await SharedPrefsPlugin.SharedPreferences.getInstance();
|
|
||||||
return sharedPrefs.getBool(_PROMOTION_NOTIFICATION_KEY);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<void> setPromotionNotificationEnabled(bool newSetting) async {
|
|
||||||
final sharedPrefs = await SharedPrefsPlugin.SharedPreferences.getInstance();
|
|
||||||
sharedPrefs.setBool(_PROMOTION_NOTIFICATION_KEY, newSetting);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<bool?> get helpAlreadyShown async {
|
|
||||||
final sharedPrefs = await SharedPrefsPlugin.SharedPreferences.getInstance();
|
|
||||||
return sharedPrefs.getBool(_HELP_ALREADY_SHOWN);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<void> setHelpAlreadyShown() async {
|
|
||||||
final sharedPrefs = await SharedPrefsPlugin.SharedPreferences.getInstance();
|
|
||||||
sharedPrefs.setBool(_HELP_ALREADY_SHOWN, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<int?> get configState async {
|
|
||||||
final sharedPrefs = await SharedPrefsPlugin.SharedPreferences.getInstance();
|
|
||||||
return sharedPrefs.getInt(_CONFIG_STATE_KEY);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<void> setConfigState(int confState) async {
|
|
||||||
final sharedPrefs = await SharedPrefsPlugin.SharedPreferences.getInstance();
|
|
||||||
sharedPrefs.setInt(_CONFIG_STATE_KEY, confState);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<void> setUseS3(int value) async {
|
|
||||||
final sharedPrefs = await SharedPrefsPlugin.SharedPreferences.getInstance();
|
|
||||||
sharedPrefs.setInt(_USE_S3, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<int?> get useS3 async {
|
|
||||||
final sharedPrefs = await SharedPrefsPlugin.SharedPreferences.getInstance();
|
|
||||||
return sharedPrefs.getInt(_USE_S3);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,13 +0,0 @@
|
|||||||
import 'package:flutter/cupertino.dart';
|
|
||||||
|
|
||||||
class MyColors {
|
|
||||||
static const Color darkIconColor = Color(0xff28323A);
|
|
||||||
static const Color darkTextColor = Color(0xff2B353E);
|
|
||||||
static const Color gradiantStartColor = Color(0xff32D892);
|
|
||||||
static const Color gradiantEndColor = Color(0xff259CB8);
|
|
||||||
static const Color textMixColor = Color(0xff2BB8A6);
|
|
||||||
static const Color backgroundColor = Color(0xffF8F8F8);
|
|
||||||
static const Color greyColor = Color(0xff575757);
|
|
||||||
static const Color lightGreyColor = Color(0xffEFEFEF);
|
|
||||||
static const Color darkWhiteColor = Color(0xffE0E0E0);
|
|
||||||
}
|
|
||||||
@ -1,46 +0,0 @@
|
|||||||
import 'package:flutter/cupertino.dart';
|
|
||||||
import 'package:intl/intl.dart';
|
|
||||||
|
|
||||||
extension EmailValidator on String {
|
|
||||||
Widget toWidget() => Text(this);
|
|
||||||
|
|
||||||
bool isValidEmail() {
|
|
||||||
return RegExp(r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$').hasMatch(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
String toFormattedDate() {
|
|
||||||
String date = this.split("T")[0];
|
|
||||||
String time = this.split("T")[1];
|
|
||||||
var dates = date.split("-");
|
|
||||||
return "${dates[2]} ${getMonth(int.parse(dates[1]))} ${dates[0]} ${DateFormat('hh:mm a').format(DateFormat('hh:mm:ss').parse(time))}";
|
|
||||||
}
|
|
||||||
|
|
||||||
getMonth(int month) {
|
|
||||||
switch (month) {
|
|
||||||
case 1:
|
|
||||||
return "January";
|
|
||||||
case 2:
|
|
||||||
return "February";
|
|
||||||
case 3:
|
|
||||||
return "March";
|
|
||||||
case 4:
|
|
||||||
return "April";
|
|
||||||
case 5:
|
|
||||||
return "May";
|
|
||||||
case 6:
|
|
||||||
return "June";
|
|
||||||
case 7:
|
|
||||||
return "July";
|
|
||||||
case 8:
|
|
||||||
return "August";
|
|
||||||
case 9:
|
|
||||||
return "September";
|
|
||||||
case 10:
|
|
||||||
return "October";
|
|
||||||
case 11:
|
|
||||||
return "November";
|
|
||||||
case 12:
|
|
||||||
return "December";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,9 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:flutter/widgets.dart';
|
|
||||||
|
|
||||||
extension WidgetExtensions on Widget {
|
|
||||||
Widget onPress(VoidCallback onTap) => InkWell(
|
|
||||||
onTap: onTap,
|
|
||||||
child: this,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@ -1,373 +0,0 @@
|
|||||||
// import 'dart:async';
|
|
||||||
//
|
|
||||||
// import 'package:flutter/animation.dart';
|
|
||||||
// import 'package:flutter/foundation.dart';
|
|
||||||
// import 'package:flutter/material.dart';
|
|
||||||
// import 'package:flutter/rendering.dart';
|
|
||||||
// import 'package:flutter/services.dart';
|
|
||||||
//
|
|
||||||
// typedef OnDone = void Function(String text);
|
|
||||||
//
|
|
||||||
// class ProvidedPinBoxTextAnimation {
|
|
||||||
// static AnimatedSwitcherTransitionBuilder scalingTransition = (child, animation) {
|
|
||||||
// return ScaleTransition(
|
|
||||||
// child: child,
|
|
||||||
// scale: animation,
|
|
||||||
// );
|
|
||||||
// };
|
|
||||||
//
|
|
||||||
// static AnimatedSwitcherTransitionBuilder defaultNoTransition = (Widget child, Animation<double> animation) {
|
|
||||||
// return child;
|
|
||||||
// };
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// class OTPWidget extends StatefulWidget {
|
|
||||||
// final int maxLength;
|
|
||||||
// final TextEditingController controller;
|
|
||||||
//
|
|
||||||
// final Color defaultBorderColor;
|
|
||||||
// final Color pinBoxColor;
|
|
||||||
// final double pinBoxBorderWidth;
|
|
||||||
// final double pinBoxRadius;
|
|
||||||
// final bool hideDefaultKeyboard;
|
|
||||||
//
|
|
||||||
// final TextStyle pinTextStyle;
|
|
||||||
// final double pinBoxHeight;
|
|
||||||
// final double pinBoxWidth;
|
|
||||||
// final OnDone onDone;
|
|
||||||
// final bool hasError;
|
|
||||||
// final Color errorBorderColor;
|
|
||||||
// final Color textBorderColor;
|
|
||||||
// final Function(String) onTextChanged;
|
|
||||||
// final bool autoFocus;
|
|
||||||
// final FocusNode focusNode;
|
|
||||||
// final AnimatedSwitcherTransitionBuilder pinTextAnimatedSwitcherTransition;
|
|
||||||
// final Duration pinTextAnimatedSwitcherDuration;
|
|
||||||
// final TextDirection textDirection;
|
|
||||||
// final TextInputType keyboardType;
|
|
||||||
// final EdgeInsets pinBoxOuterPadding;
|
|
||||||
//
|
|
||||||
// const OTPWidget({
|
|
||||||
// Key key,
|
|
||||||
// this.maxLength: 4,
|
|
||||||
// this.controller,
|
|
||||||
// this.pinBoxWidth: 70.0,
|
|
||||||
// this.pinBoxHeight: 70.0,
|
|
||||||
// this.pinTextStyle,
|
|
||||||
// this.onDone,
|
|
||||||
// this.defaultBorderColor: Colors.black,
|
|
||||||
// this.textBorderColor: Colors.black,
|
|
||||||
// this.pinTextAnimatedSwitcherTransition,
|
|
||||||
// this.pinTextAnimatedSwitcherDuration: const Duration(),
|
|
||||||
// this.hasError: false,
|
|
||||||
// this.errorBorderColor: Colors.red,
|
|
||||||
// this.onTextChanged,
|
|
||||||
// this.autoFocus: false,
|
|
||||||
// this.focusNode,
|
|
||||||
// this.textDirection: TextDirection.ltr,
|
|
||||||
// this.keyboardType: TextInputType.number,
|
|
||||||
// this.pinBoxOuterPadding = const EdgeInsets.symmetric(horizontal: 4.0),
|
|
||||||
// this.pinBoxColor = Colors.white,
|
|
||||||
// this.pinBoxBorderWidth = 2.0,
|
|
||||||
// this.pinBoxRadius = 0,
|
|
||||||
// this.hideDefaultKeyboard = false,
|
|
||||||
// }) : super(key: key);
|
|
||||||
//
|
|
||||||
// @override
|
|
||||||
// State<StatefulWidget> createState() {
|
|
||||||
// return OTPWidgetState();
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// class OTPWidgetState extends State<OTPWidget> with SingleTickerProviderStateMixin {
|
|
||||||
// AnimationController _highlightAnimationController;
|
|
||||||
// FocusNode focusNode;
|
|
||||||
// String text = "";
|
|
||||||
// int currentIndex = 0;
|
|
||||||
// List<String> strList = [];
|
|
||||||
// bool hasFocus = false;
|
|
||||||
//
|
|
||||||
// @override
|
|
||||||
// void didUpdateWidget(OTPWidget oldWidget) {
|
|
||||||
// super.didUpdateWidget(oldWidget);
|
|
||||||
// focusNode = widget.focusNode ?? focusNode;
|
|
||||||
//
|
|
||||||
// if (oldWidget.maxLength < widget.maxLength) {
|
|
||||||
// setState(() {
|
|
||||||
// currentIndex = text.length;
|
|
||||||
// });
|
|
||||||
// widget.controller?.text = text;
|
|
||||||
// widget.controller?.selection = TextSelection.collapsed(offset: text.length);
|
|
||||||
// } else if (oldWidget.maxLength > widget.maxLength && widget.maxLength > 0 && text.length > 0 && text.length > widget.maxLength) {
|
|
||||||
// setState(() {
|
|
||||||
// text = text.substring(0, widget.maxLength);
|
|
||||||
// currentIndex = text.length;
|
|
||||||
// });
|
|
||||||
// widget.controller?.text = text;
|
|
||||||
// widget.controller?.selection = TextSelection.collapsed(offset: text.length);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// _calculateStrList() {
|
|
||||||
// if (strList.length > widget.maxLength) {
|
|
||||||
// strList.length = widget.maxLength;
|
|
||||||
// }
|
|
||||||
// while (strList.length < widget.maxLength) {
|
|
||||||
// strList.add("");
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// @override
|
|
||||||
// void initState() {
|
|
||||||
// super.initState();
|
|
||||||
// focusNode = widget.focusNode ?? FocusNode();
|
|
||||||
//
|
|
||||||
// _initTextController();
|
|
||||||
// _calculateStrList();
|
|
||||||
// widget.controller?.addListener(_controllerListener);
|
|
||||||
// focusNode?.addListener(_focusListener);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// void _controllerListener() {
|
|
||||||
// if (mounted == true) {
|
|
||||||
// setState(() {
|
|
||||||
// _initTextController();
|
|
||||||
// });
|
|
||||||
// var onTextChanged = widget.onTextChanged;
|
|
||||||
// if (onTextChanged != null) {
|
|
||||||
// onTextChanged(widget.controller?.text ?? "");
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// void _focusListener() {
|
|
||||||
// if (mounted == true) {
|
|
||||||
// setState(() {
|
|
||||||
// hasFocus = focusNode?.hasFocus ?? false;
|
|
||||||
// });
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// void _initTextController() {
|
|
||||||
// if (widget.controller == null) {
|
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
// strList.clear();
|
|
||||||
// var text = widget.controller?.text ?? "";
|
|
||||||
// if (text.isNotEmpty) {
|
|
||||||
// if (text.length > widget.maxLength) {
|
|
||||||
// throw Exception("TextEditingController length exceeded maxLength!");
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// for (var i = 0; i < text.length; i++) {
|
|
||||||
// strList.add(text[i]);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// double get _width {
|
|
||||||
// var width = 0.0;
|
|
||||||
// for (var i = 0; i < widget.maxLength; i++) {
|
|
||||||
// width += widget.pinBoxWidth;
|
|
||||||
// if (i == 0) {
|
|
||||||
// width += widget.pinBoxOuterPadding.left;
|
|
||||||
// } else if (i + 1 == widget.maxLength) {
|
|
||||||
// width += widget.pinBoxOuterPadding.right;
|
|
||||||
// } else {
|
|
||||||
// width += widget.pinBoxOuterPadding.left;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// return width;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// @override
|
|
||||||
// void dispose() {
|
|
||||||
// if (widget.focusNode == null) {
|
|
||||||
// focusNode?.dispose();
|
|
||||||
// } else {
|
|
||||||
// focusNode?.removeListener(_focusListener);
|
|
||||||
// }
|
|
||||||
// _highlightAnimationController?.dispose();
|
|
||||||
// widget.controller?.removeListener(_controllerListener);
|
|
||||||
//
|
|
||||||
// super.dispose();
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// @override
|
|
||||||
// Widget build(BuildContext context) {
|
|
||||||
// return Stack(
|
|
||||||
// children: <Widget>[
|
|
||||||
// _otpTextInput(),
|
|
||||||
// _touchPinBoxRow(),
|
|
||||||
// ],
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// Widget _touchPinBoxRow() {
|
|
||||||
// return widget.hideDefaultKeyboard
|
|
||||||
// ? _pinBoxRow(context)
|
|
||||||
// : GestureDetector(
|
|
||||||
// behavior: HitTestBehavior.opaque,
|
|
||||||
// onTap: () {
|
|
||||||
// if (hasFocus) {
|
|
||||||
// FocusScope.of(context).requestFocus(FocusNode());
|
|
||||||
// Future.delayed(Duration(milliseconds: 100), () {
|
|
||||||
// FocusScope.of(context).requestFocus(focusNode);
|
|
||||||
// });
|
|
||||||
// } else {
|
|
||||||
// FocusScope.of(context).requestFocus(focusNode);
|
|
||||||
// }
|
|
||||||
// },
|
|
||||||
// child: _pinBoxRow(context),
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// Widget _otpTextInput() {
|
|
||||||
// var transparentBorder = OutlineInputBorder(
|
|
||||||
// borderSide: BorderSide(
|
|
||||||
// color: Colors.transparent,
|
|
||||||
// width: 0.0,
|
|
||||||
// ),
|
|
||||||
// );
|
|
||||||
// return Container(
|
|
||||||
// width: _width,
|
|
||||||
// height: widget.pinBoxHeight,
|
|
||||||
// child: TextField(
|
|
||||||
// autofocus: !kIsWeb ? widget.autoFocus : false,
|
|
||||||
// enableInteractiveSelection: false,
|
|
||||||
// focusNode: focusNode,
|
|
||||||
// controller: widget.controller,
|
|
||||||
// keyboardType: widget.keyboardType,
|
|
||||||
// inputFormatters: widget.keyboardType == TextInputType.number ? <TextInputFormatter>[FilteringTextInputFormatter.digitsOnly] : null,
|
|
||||||
// style: TextStyle(
|
|
||||||
// height: 0.1,
|
|
||||||
// color: Colors.transparent,
|
|
||||||
// ),
|
|
||||||
// decoration: InputDecoration(
|
|
||||||
// contentPadding: EdgeInsets.all(0),
|
|
||||||
// focusedErrorBorder: transparentBorder,
|
|
||||||
// errorBorder: transparentBorder,
|
|
||||||
// disabledBorder: transparentBorder,
|
|
||||||
// enabledBorder: transparentBorder,
|
|
||||||
// focusedBorder: transparentBorder,
|
|
||||||
// counterText: null,
|
|
||||||
// counterStyle: null,
|
|
||||||
// helperStyle: TextStyle(
|
|
||||||
// height: 0.0,
|
|
||||||
// color: Colors.transparent,
|
|
||||||
// ),
|
|
||||||
// labelStyle: TextStyle(height: 0.1),
|
|
||||||
// fillColor: Colors.transparent,
|
|
||||||
// border: InputBorder.none,
|
|
||||||
// ),
|
|
||||||
// cursorColor: Colors.transparent,
|
|
||||||
// showCursor: false,
|
|
||||||
// maxLength: widget.maxLength,
|
|
||||||
// onChanged: _onTextChanged,
|
|
||||||
// ),
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// void _onTextChanged(text) {
|
|
||||||
// var onTextChanged = widget.onTextChanged;
|
|
||||||
// if (onTextChanged != null) {
|
|
||||||
// onTextChanged(text);
|
|
||||||
// }
|
|
||||||
// setState(() {
|
|
||||||
// this.text = text;
|
|
||||||
// if (text.length >= currentIndex) {
|
|
||||||
// for (int i = currentIndex; i < text.length; i++) {
|
|
||||||
// strList[i] = text[i];
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// currentIndex = text.length;
|
|
||||||
// });
|
|
||||||
// if (text.length == widget.maxLength) {
|
|
||||||
// FocusScope.of(context).requestFocus(FocusNode());
|
|
||||||
// var onDone = widget.onDone;
|
|
||||||
// if (onDone != null) {
|
|
||||||
// onDone(text);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// Widget _pinBoxRow(BuildContext context) {
|
|
||||||
// _calculateStrList();
|
|
||||||
// List<Widget> pinCodes = List.generate(widget.maxLength, (int i) {
|
|
||||||
// return _buildPinCode(i, context);
|
|
||||||
// });
|
|
||||||
// return Row(children: pinCodes, mainAxisSize: MainAxisSize.min);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// Widget _buildPinCode(int i, BuildContext context) {
|
|
||||||
// Color borderColor;
|
|
||||||
// Color pinBoxColor = widget.pinBoxColor;
|
|
||||||
//
|
|
||||||
// if (widget.hasError) {
|
|
||||||
// borderColor = widget.errorBorderColor;
|
|
||||||
// } else if (i < text.length) {
|
|
||||||
// borderColor = widget.textBorderColor;
|
|
||||||
// } else {
|
|
||||||
// borderColor = widget.defaultBorderColor;
|
|
||||||
// pinBoxColor = widget.pinBoxColor;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// EdgeInsets insets;
|
|
||||||
// if (i == 0) {
|
|
||||||
// insets = EdgeInsets.only(
|
|
||||||
// left: 0,
|
|
||||||
// top: widget.pinBoxOuterPadding.top,
|
|
||||||
// right: widget.pinBoxOuterPadding.right,
|
|
||||||
// bottom: widget.pinBoxOuterPadding.bottom,
|
|
||||||
// );
|
|
||||||
// } else if (i == strList.length - 1) {
|
|
||||||
// insets = EdgeInsets.only(
|
|
||||||
// left: widget.pinBoxOuterPadding.left,
|
|
||||||
// top: widget.pinBoxOuterPadding.top,
|
|
||||||
// right: 0,
|
|
||||||
// bottom: widget.pinBoxOuterPadding.bottom,
|
|
||||||
// );
|
|
||||||
// } else {
|
|
||||||
// insets = widget.pinBoxOuterPadding;
|
|
||||||
// }
|
|
||||||
// return Container(
|
|
||||||
// key: ValueKey<String>("container$i"),
|
|
||||||
// alignment: Alignment.center,
|
|
||||||
// padding: EdgeInsets.symmetric(vertical: 4.0, horizontal: 1.0),
|
|
||||||
// margin: insets,
|
|
||||||
// child: _animatedTextBox(strList[i], i),
|
|
||||||
// decoration: BoxDecoration(
|
|
||||||
// border: Border.all(
|
|
||||||
// color: borderColor,
|
|
||||||
// width: widget.pinBoxBorderWidth,
|
|
||||||
// ),
|
|
||||||
// color: pinBoxColor,
|
|
||||||
// borderRadius: BorderRadius.circular(widget.pinBoxRadius),
|
|
||||||
// ),
|
|
||||||
// width: widget.pinBoxWidth,
|
|
||||||
// height: widget.pinBoxHeight,
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// Widget _animatedTextBox(String text, int i) {
|
|
||||||
// if (widget.pinTextAnimatedSwitcherTransition != null) {
|
|
||||||
// return AnimatedSwitcher(
|
|
||||||
// duration: widget.pinTextAnimatedSwitcherDuration,
|
|
||||||
// transitionBuilder: widget.pinTextAnimatedSwitcherTransition ??
|
|
||||||
// (Widget child, Animation<double> animation) {
|
|
||||||
// return child;
|
|
||||||
// },
|
|
||||||
// child: Text(
|
|
||||||
// text,
|
|
||||||
// key: ValueKey<String>("$text$i"),
|
|
||||||
// style: widget.pinTextStyle,
|
|
||||||
// ),
|
|
||||||
// );
|
|
||||||
// } else {
|
|
||||||
// return Text(
|
|
||||||
// text,
|
|
||||||
// key: ValueKey<String>("${strList[i]}$i"),
|
|
||||||
// style: widget.pinTextStyle,
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
@ -0,0 +1,25 @@
|
|||||||
|
import 'package:easy_localization/src/public_ext.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:mohem_flutter_app/classes/colors.dart';
|
||||||
|
import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
|
||||||
|
import 'package:mohem_flutter_app/extensions/string_extensions.dart';
|
||||||
|
|
||||||
|
AppBar appBar(BuildContext context, {required String title}) {
|
||||||
|
return AppBar(
|
||||||
|
title: title.toText24(textColor: MyColors.darkTextColor),
|
||||||
|
centerTitle: false,
|
||||||
|
automaticallyImplyLeading: false,
|
||||||
|
backgroundColor: Colors.white,
|
||||||
|
actions: [
|
||||||
|
IconButton(
|
||||||
|
onPressed: () {
|
||||||
|
Navigator.pop(context);
|
||||||
|
},
|
||||||
|
icon: Icon(
|
||||||
|
Icons.close,
|
||||||
|
color: MyColors.darkIconColor,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
@ -0,0 +1,464 @@
|
|||||||
|
import 'package:easy_localization/src/public_ext.dart';
|
||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_svg/flutter_svg.dart';
|
||||||
|
import 'package:mohem_flutter_app/classes/colors.dart';
|
||||||
|
import 'package:mohem_flutter_app/config/routes.dart';
|
||||||
|
import 'package:mohem_flutter_app/extensions/int_extensions.dart';
|
||||||
|
import 'package:mohem_flutter_app/extensions/string_extensions.dart';
|
||||||
|
import 'package:mohem_flutter_app/extensions/widget_extensions.dart';
|
||||||
|
import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
|
||||||
|
import 'package:mohem_flutter_app/widgets/circular_avatar.dart';
|
||||||
|
|
||||||
|
class Dashboard extends StatefulWidget {
|
||||||
|
Dashboard({Key? key}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
_DashboardState createState() {
|
||||||
|
return _DashboardState();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class _DashboardState extends State<Dashboard> {
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
super.initState();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void dispose() {
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
List<String> names = [
|
||||||
|
LocaleKeys.workList.tr(),
|
||||||
|
LocaleKeys.missingSwipes.tr(),
|
||||||
|
LocaleKeys.leaveBalance.tr(),
|
||||||
|
LocaleKeys.ticketBalance.tr()
|
||||||
|
];
|
||||||
|
List<double> namesInt = [118, 02, 18.5, 03];
|
||||||
|
List<int> namesColor = [0xff125765, 0xff239D8F, 0xff2BB8A8, 0xff1D92AA];
|
||||||
|
|
||||||
|
List<String> namesT = [
|
||||||
|
LocaleKeys.monthlyAttendance.tr(),
|
||||||
|
LocaleKeys.workFromHome.tr(),
|
||||||
|
LocaleKeys.ticketRequest.tr(),
|
||||||
|
LocaleKeys.monthlyAttendance.tr()
|
||||||
|
];
|
||||||
|
List<String> iconT = [
|
||||||
|
"assets/images/monthly_attendance.svg",
|
||||||
|
"assets/images/work_from_home.svg",
|
||||||
|
"assets/images/ticket_request.svg",
|
||||||
|
"assets/images/work_from_home.svg"
|
||||||
|
];
|
||||||
|
|
||||||
|
List<String> namesD = [
|
||||||
|
"Nostalgia Perfume Perfume",
|
||||||
|
"Al Nafoura",
|
||||||
|
"AlJadi",
|
||||||
|
"Nostalgia Perfume"
|
||||||
|
];
|
||||||
|
|
||||||
|
return Scaffold(
|
||||||
|
body: Column(
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: [
|
||||||
|
CircularAvatar(
|
||||||
|
width: 34,
|
||||||
|
height: 34,
|
||||||
|
url:
|
||||||
|
"https://cdn4.iconfinder.com/data/icons/professions-2-2/151/89-512.png",
|
||||||
|
),
|
||||||
|
8.width,
|
||||||
|
SvgPicture.asset("assets/images/side_nav.svg"),
|
||||||
|
],
|
||||||
|
).onPress(() {}),
|
||||||
|
Expanded(
|
||||||
|
child: Row(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: [
|
||||||
|
//AppLogo(),
|
||||||
|
8.width,
|
||||||
|
LocaleKeys.mohemm.tr().toText14()
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(
|
||||||
|
width: 36,
|
||||||
|
height: 36,
|
||||||
|
child: Stack(
|
||||||
|
alignment: Alignment.centerLeft,
|
||||||
|
children: [
|
||||||
|
SvgPicture.asset("assets/images/announcements.svg"),
|
||||||
|
Positioned(
|
||||||
|
right: 0,
|
||||||
|
top: 0,
|
||||||
|
child: Container(
|
||||||
|
padding: const EdgeInsets.only(left: 5, right: 5),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: MyColors.redColor,
|
||||||
|
borderRadius: BorderRadius.circular(17)),
|
||||||
|
child: "3".toText12(color: Colors.white),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
).paddingOnly(left: 21, right: 21, top: 48, bottom: 7),
|
||||||
|
Expanded(
|
||||||
|
child: ListView(
|
||||||
|
padding: EdgeInsets.zero,
|
||||||
|
children: [
|
||||||
|
Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
LocaleKeys.goodMorning
|
||||||
|
.tr()
|
||||||
|
.toText14(color: MyColors.grey77Color),
|
||||||
|
"Mahmoud Shrouf".toText24(isBold: true),
|
||||||
|
16.height,
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: AspectRatio(
|
||||||
|
aspectRatio: 159 / 159,
|
||||||
|
child: Container(
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
borderRadius: BorderRadius.circular(15),
|
||||||
|
gradient: const LinearGradient(
|
||||||
|
transform: GradientRotation(.46),
|
||||||
|
begin: Alignment.topRight,
|
||||||
|
end: Alignment.bottomRight,
|
||||||
|
colors: [
|
||||||
|
MyColors.gradiantEndColor,
|
||||||
|
MyColors.gradiantStartColor,
|
||||||
|
]),
|
||||||
|
),
|
||||||
|
child: Stack(
|
||||||
|
alignment: Alignment.center,
|
||||||
|
children: [
|
||||||
|
SvgPicture.asset("assets/images/"),
|
||||||
|
Column(
|
||||||
|
crossAxisAlignment:
|
||||||
|
CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: Column(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
crossAxisAlignment:
|
||||||
|
CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
LocaleKeys.markAttendance
|
||||||
|
.tr()
|
||||||
|
.toText14(
|
||||||
|
color: Colors.white,
|
||||||
|
isBold: true),
|
||||||
|
9.height,
|
||||||
|
"07:55:12".toText14(
|
||||||
|
color: Colors.white,
|
||||||
|
isBold: true),
|
||||||
|
LocaleKeys.timeLeftToday
|
||||||
|
.tr()
|
||||||
|
.toText12(color: Colors.white),
|
||||||
|
9.height,
|
||||||
|
const ClipRRect(
|
||||||
|
borderRadius: BorderRadius.all(
|
||||||
|
Radius.circular(20),
|
||||||
|
),
|
||||||
|
child: LinearProgressIndicator(
|
||||||
|
value: 0.7,
|
||||||
|
minHeight: 8,
|
||||||
|
valueColor:
|
||||||
|
const AlwaysStoppedAnimation<
|
||||||
|
Color>(Colors.white),
|
||||||
|
backgroundColor:
|
||||||
|
const Color(0xff196D73),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
).paddingOnly(
|
||||||
|
top: 12, right: 15, left: 12),
|
||||||
|
),
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: Column(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
crossAxisAlignment:
|
||||||
|
CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
LocaleKeys.checkIn
|
||||||
|
.tr()
|
||||||
|
.toText12(
|
||||||
|
color: Colors.white),
|
||||||
|
"09:00".toText14(
|
||||||
|
color: Colors.white,
|
||||||
|
isBold: true),
|
||||||
|
4.height
|
||||||
|
],
|
||||||
|
).paddingOnly(left: 12),
|
||||||
|
),
|
||||||
|
Container(
|
||||||
|
width: 45,
|
||||||
|
height: 45,
|
||||||
|
padding: const EdgeInsets.only(
|
||||||
|
left: 14, right: 14),
|
||||||
|
decoration: const BoxDecoration(
|
||||||
|
color: Color(0xff259EA4),
|
||||||
|
borderRadius: BorderRadius.only(
|
||||||
|
bottomRight:
|
||||||
|
Radius.circular(15),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
child: SvgPicture.asset(
|
||||||
|
"assets/images/stop.svg"),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
9.width,
|
||||||
|
Expanded(
|
||||||
|
child: GridView.builder(
|
||||||
|
shrinkWrap: true,
|
||||||
|
primary: false,
|
||||||
|
physics: const NeverScrollableScrollPhysics(),
|
||||||
|
gridDelegate:
|
||||||
|
const SliverGridDelegateWithFixedCrossAxisCount(
|
||||||
|
crossAxisCount: 2,
|
||||||
|
childAspectRatio: 2 / 2,
|
||||||
|
crossAxisSpacing: 9,
|
||||||
|
mainAxisSpacing: 9),
|
||||||
|
padding: EdgeInsets.zero,
|
||||||
|
itemCount: 4,
|
||||||
|
itemBuilder: (BuildContext context, int index) {
|
||||||
|
return Container(
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Color(namesColor[index]),
|
||||||
|
borderRadius: BorderRadius.circular(10),
|
||||||
|
),
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment:
|
||||||
|
MainAxisAlignment.spaceBetween,
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
names[index].toText12(color: Colors.white),
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: namesInt[index]
|
||||||
|
.toStringAsFixed(1)
|
||||||
|
.toText16(
|
||||||
|
color: Colors.white,
|
||||||
|
isBold: true),
|
||||||
|
),
|
||||||
|
SvgPicture.asset(
|
||||||
|
"assets/images/arrow_next.svg",
|
||||||
|
color: Colors.white)
|
||||||
|
],
|
||||||
|
)
|
||||||
|
],
|
||||||
|
).paddingOnly(
|
||||||
|
left: 10, right: 10, bottom: 6, top: 6),
|
||||||
|
).onPress(() {
|
||||||
|
Navigator.pushNamed(
|
||||||
|
context, AppRoutes.workList);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
20.height,
|
||||||
|
Row(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: [
|
||||||
|
"Other".toText12(),
|
||||||
|
LocaleKeys.services.tr().toText24(isBold: true),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
LocaleKeys.viewAllServices
|
||||||
|
.tr()
|
||||||
|
.toText12(isUnderLine: true),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
).paddingOnly(left: 21, right: 21, top: 7),
|
||||||
|
SizedBox(
|
||||||
|
height: 105 + 26,
|
||||||
|
child: ListView.separated(
|
||||||
|
shrinkWrap: true,
|
||||||
|
physics: const BouncingScrollPhysics(),
|
||||||
|
padding: const EdgeInsets.only(
|
||||||
|
left: 21, right: 21, top: 13, bottom: 13),
|
||||||
|
scrollDirection: Axis.horizontal,
|
||||||
|
itemBuilder: (cxt, index) {
|
||||||
|
return AspectRatio(
|
||||||
|
aspectRatio: 105 / 105,
|
||||||
|
child: Container(
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.white,
|
||||||
|
borderRadius: BorderRadius.circular(15),
|
||||||
|
boxShadow: [
|
||||||
|
BoxShadow(
|
||||||
|
color:
|
||||||
|
const Color(0xff000000).withOpacity(.05),
|
||||||
|
blurRadius: 26,
|
||||||
|
offset: const Offset(0, -3),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
SvgPicture.asset(iconT[index]),
|
||||||
|
Row(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.end,
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child:
|
||||||
|
namesT[index].toText11(isBold: true),
|
||||||
|
),
|
||||||
|
SvgPicture.asset(
|
||||||
|
"assets/images/arrow_next.svg")
|
||||||
|
.paddingOnly(bottom: 4)
|
||||||
|
],
|
||||||
|
)
|
||||||
|
],
|
||||||
|
).paddingOnly(
|
||||||
|
left: 10, right: 10, bottom: 10, top: 12),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
separatorBuilder: (cxt, index) => 9.width,
|
||||||
|
itemCount: 4),
|
||||||
|
),
|
||||||
|
8.height,
|
||||||
|
Container(
|
||||||
|
width: double.infinity,
|
||||||
|
padding: EdgeInsets.only(top: 31),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.white,
|
||||||
|
borderRadius: BorderRadius.only(
|
||||||
|
topRight: Radius.circular(50),
|
||||||
|
topLeft: Radius.circular(50)),
|
||||||
|
border:
|
||||||
|
Border.all(color: MyColors.lightGreyEDColor, width: 1),
|
||||||
|
),
|
||||||
|
child: Column(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: [
|
||||||
|
LocaleKeys.offers.tr().toText12(),
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
LocaleKeys.discounts
|
||||||
|
.tr()
|
||||||
|
.toText24(isBold: true),
|
||||||
|
6.width,
|
||||||
|
Container(
|
||||||
|
padding: const EdgeInsets.only(
|
||||||
|
left: 8, right: 8),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: MyColors.yellowColor,
|
||||||
|
borderRadius:
|
||||||
|
BorderRadius.circular(10),
|
||||||
|
),
|
||||||
|
child: LocaleKeys.newString
|
||||||
|
.tr()
|
||||||
|
.toText10(isBold: true)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
LocaleKeys.viewAllOffers
|
||||||
|
.tr()
|
||||||
|
.toText12(isUnderLine: true),
|
||||||
|
],
|
||||||
|
).paddingOnly(left: 21, right: 21),
|
||||||
|
SizedBox(
|
||||||
|
height: 103 + 33,
|
||||||
|
child: ListView.separated(
|
||||||
|
shrinkWrap: true,
|
||||||
|
physics: const BouncingScrollPhysics(),
|
||||||
|
padding: const EdgeInsets.only(
|
||||||
|
left: 21, right: 21, top: 13),
|
||||||
|
scrollDirection: Axis.horizontal,
|
||||||
|
itemBuilder: (cxt, index) {
|
||||||
|
return SizedBox(
|
||||||
|
width: 73,
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
Container(
|
||||||
|
width: 73,
|
||||||
|
height: 73,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
borderRadius: const BorderRadius.all(
|
||||||
|
Radius.circular(100),
|
||||||
|
),
|
||||||
|
border: Border.all(
|
||||||
|
color: MyColors.lightGreyEDColor,
|
||||||
|
width: 1),
|
||||||
|
),
|
||||||
|
child: ClipRRect(
|
||||||
|
borderRadius: const BorderRadius.all(
|
||||||
|
Radius.circular(50),
|
||||||
|
),
|
||||||
|
child: Image.network(
|
||||||
|
"https://play-lh.googleusercontent.com/NPo88ojmhah4HDiposucJmfQIop4z4xc8kqJK9ITO9o-yCab2zxIp7PPB_XPj2iUojo",
|
||||||
|
fit: BoxFit.cover,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
4.height,
|
||||||
|
Expanded(
|
||||||
|
child: namesD[6 % (index + 1)].toText12(
|
||||||
|
isCenter: true, maxLine: 2)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
separatorBuilder: (cxt, index) => 8.width,
|
||||||
|
itemCount: 6),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,700 @@
|
|||||||
|
import 'package:easy_localization/src/public_ext.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter/services.dart';
|
||||||
|
import 'package:flutter_svg/svg.dart';
|
||||||
|
import 'package:local_auth/local_auth.dart';
|
||||||
|
import 'package:mohem_flutter_app/classes/colors.dart';
|
||||||
|
import 'package:mohem_flutter_app/config/routes.dart';
|
||||||
|
import 'package:mohem_flutter_app/dialogs/otp_dialog.dart';
|
||||||
|
import 'package:mohem_flutter_app/extensions/int_extensions.dart';
|
||||||
|
import 'package:mohem_flutter_app/extensions/string_extensions.dart';
|
||||||
|
import 'package:mohem_flutter_app/extensions/widget_extensions.dart';
|
||||||
|
import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
|
||||||
|
import 'package:mohem_flutter_app/widgets/button/default_button.dart';
|
||||||
|
|
||||||
|
class VerifyLoginScreen extends StatefulWidget {
|
||||||
|
VerifyLoginScreen({Key? key}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
_VerifyLoginScreenState createState() {
|
||||||
|
return _VerifyLoginScreenState();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class _VerifyLoginScreenState extends State<VerifyLoginScreen> {
|
||||||
|
final LocalAuthentication auth = LocalAuthentication();
|
||||||
|
List<BiometricType> _availableBioMetricType = [];
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
_getAvailableBiometrics();
|
||||||
|
// setDefault();
|
||||||
|
super.initState();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Scaffold(
|
||||||
|
appBar: AppBar(
|
||||||
|
backgroundColor: Colors.transparent,
|
||||||
|
leading: IconButton(
|
||||||
|
icon: const Icon(Icons.arrow_back_ios, color: MyColors.darkIconColor),
|
||||||
|
onPressed: () => Navigator.pop(context),
|
||||||
|
),
|
||||||
|
actions: [Center(child: "Employee Digital ID".toText12(color: MyColors.textMixColor, isUnderLine: true).onPress(() {})), 21.width],
|
||||||
|
),
|
||||||
|
body: Column(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: ListView(
|
||||||
|
padding: const EdgeInsets.all(21),
|
||||||
|
physics: const BouncingScrollPhysics(),
|
||||||
|
children: [
|
||||||
|
//12.height,
|
||||||
|
if (true)
|
||||||
|
Column(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
LocaleKeys.welcomeBack.tr().toText12(),
|
||||||
|
"Mohammad Hussain".toText24(isBold: true),
|
||||||
|
10.height,
|
||||||
|
LocaleKeys.wouldYouLikeToLoginWithCurrentUsername.tr().toText16(),
|
||||||
|
Container(
|
||||||
|
height: 72,
|
||||||
|
margin: const EdgeInsets.only(top: 23, bottom: 23),
|
||||||
|
alignment: Alignment.center,
|
||||||
|
padding: EdgeInsets.only(left: 17, right: 12),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
borderRadius: BorderRadius.circular(10),
|
||||||
|
color: Colors.white,
|
||||||
|
border: Border.all(
|
||||||
|
color: Color(0xffefefef),
|
||||||
|
width: 1,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
child: Column(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
LocaleKeys.lastLoginDetails.tr().toText16(),
|
||||||
|
// Text(
|
||||||
|
// user.editedOn != null
|
||||||
|
// ? DateUtil.getDayMonthYearDateFormatted(DateUtil.convertStringToDate(user.editedOn))
|
||||||
|
// : user.createdOn != null
|
||||||
|
// ? DateUtil.getDayMonthYearDateFormatted(DateUtil.convertStringToDate(user.createdOn))
|
||||||
|
// : '--',
|
||||||
|
// style: TextStyle(fontSize: 12, fontWeight: FontWeight.w600, color: Color(0xff2B353E), letterSpacing: -0.48),
|
||||||
|
// ),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
LocaleKeys.verificationType.tr().toText10(color: MyColors.grey57Color),
|
||||||
|
Text(
|
||||||
|
"SMS",
|
||||||
|
// " " + getType(user.logInType, context),
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 12,
|
||||||
|
fontWeight: FontWeight.w600,
|
||||||
|
color: Color(0xff2B353E),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Expanded(child: SizedBox()),
|
||||||
|
// Text(
|
||||||
|
// user.editedOn != null
|
||||||
|
// ? DateUtil.formatDateToTimeLang(DateUtil.convertStringToDate(user.editedOn), false)
|
||||||
|
// : user.createdOn != null
|
||||||
|
// ? DateUtil.formatDateToTimeLang(DateUtil.convertStringToDate(user.createdOn), false)
|
||||||
|
// : '--',
|
||||||
|
// style: TextStyle(fontSize: 12, fontWeight: FontWeight.w600, color: Color(0xff575757), letterSpacing: -0.48),
|
||||||
|
// ),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
LocaleKeys.pleaseVerify.tr().toText16(),
|
||||||
|
GridView(
|
||||||
|
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2, crossAxisSpacing: 13, mainAxisSpacing: 9),
|
||||||
|
physics: const NeverScrollableScrollPhysics(),
|
||||||
|
padding: const EdgeInsets.only(top: 9),
|
||||||
|
shrinkWrap: true,
|
||||||
|
children: [
|
||||||
|
getButton(3),
|
||||||
|
getButton(2),
|
||||||
|
getButton(1),
|
||||||
|
getButton(4),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
],
|
||||||
|
)
|
||||||
|
// else
|
||||||
|
// Column(mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: <Widget>[
|
||||||
|
// Image.asset(
|
||||||
|
// 'assets/images/habib-logo.png',
|
||||||
|
// height: 90,
|
||||||
|
// width: 90,
|
||||||
|
// ),
|
||||||
|
// SizedBox(height: 23),
|
||||||
|
// this.onlySMSBox == false
|
||||||
|
// ? Text(
|
||||||
|
// TranslationBase.of(context).verifyLoginWith,
|
||||||
|
// style: TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: Color(0xff2B353E), letterSpacing: -0.64, height: 25 / 16),
|
||||||
|
// )
|
||||||
|
// : Text(
|
||||||
|
// TranslationBase.of(context).verifyFingerprint2,
|
||||||
|
// style: TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: Color(0xff2B353E), letterSpacing: -0.64, height: 25 / 16),
|
||||||
|
// ),
|
||||||
|
// SizedBox(height: 23),
|
||||||
|
// Text(
|
||||||
|
// TranslationBase.of(context).pleaseVerify,
|
||||||
|
// style: TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: Color(0xff2E303A), letterSpacing: -0.64),
|
||||||
|
// ),
|
||||||
|
// GridView(
|
||||||
|
// gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2, crossAxisSpacing: 13, mainAxisSpacing: 9),
|
||||||
|
// physics: NeverScrollableScrollPhysics(),
|
||||||
|
// padding: EdgeInsets.only(top: 9),
|
||||||
|
// shrinkWrap: true,
|
||||||
|
// children: [
|
||||||
|
// if (onlySMSBox == false) getButton(3),
|
||||||
|
// if (onlySMSBox == false) getButton(2),
|
||||||
|
// getButton(1),
|
||||||
|
// getButton(4),
|
||||||
|
// ],
|
||||||
|
// ),
|
||||||
|
// ]),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
12.height,
|
||||||
|
DefaultButton(
|
||||||
|
LocaleKeys.useAnotherAccount.tr(),
|
||||||
|
() => {
|
||||||
|
//Navigator.of(context).pushNamed(LOGIN_TYPE)
|
||||||
|
},
|
||||||
|
).insideContainer,
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _getAvailableBiometrics() async {
|
||||||
|
try {
|
||||||
|
_availableBioMetricType = await auth.getAvailableBiometrics();
|
||||||
|
} on PlatformException catch (e) {
|
||||||
|
// AppToast.showErrorToast(message: e.message);
|
||||||
|
print(e);
|
||||||
|
}
|
||||||
|
if (mounted) setState(() {});
|
||||||
|
}
|
||||||
|
|
||||||
|
// authenticateUser(int type, {int isActive}) {
|
||||||
|
// GifLoaderDialogUtils.showMyDialog(context);
|
||||||
|
// if (type == 2 || type == 3) {
|
||||||
|
// fingrePrintBefore = type;
|
||||||
|
// }
|
||||||
|
// this.selectedOption = fingrePrintBefore != null ? fingrePrintBefore : type;
|
||||||
|
//
|
||||||
|
// switch (type) {
|
||||||
|
// case 1:
|
||||||
|
// this.loginWithSMS(type);
|
||||||
|
// break;
|
||||||
|
// case 2:
|
||||||
|
// this.loginWithFingurePrintFace(type, isActive);
|
||||||
|
// break;
|
||||||
|
// case 3:
|
||||||
|
// this.loginWithFingurePrintFace(type, isActive);
|
||||||
|
// break;
|
||||||
|
// case 4:
|
||||||
|
// this.loginWithSMS(type);
|
||||||
|
// break;
|
||||||
|
// default:
|
||||||
|
// break;
|
||||||
|
// }
|
||||||
|
// sharedPref.setInt(LAST_LOGIN, this.selectedOption); //this.cs.sharedService.setStorage(this.selectedOption, AuthenticationService.LAST_LOGIN);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// loginWithSMS(type) {
|
||||||
|
// //if (!el.disabled) {
|
||||||
|
// if (this.user != null && this.registerd_data == null) {
|
||||||
|
// this.checkUserAuthentication(type);
|
||||||
|
// } else {
|
||||||
|
// if (this.loginTokenID != null) {
|
||||||
|
// // Future.delayed(Duration(seconds: 1), () {
|
||||||
|
// this.sendActivationCode(type);
|
||||||
|
// // });
|
||||||
|
// } else {
|
||||||
|
// this.checkUserAuthentication(type);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// checkUserAuthentication(type) {
|
||||||
|
// showLoader(true);
|
||||||
|
// var req = getCommonRequest(type: type);
|
||||||
|
// req.logInTokenID = "";
|
||||||
|
//
|
||||||
|
// var request = CheckPatientAuthenticationReq.fromJson(req.toJson());
|
||||||
|
//
|
||||||
|
// sharedPref.setObject(REGISTER_DATA_FOR_REGISTER, request);
|
||||||
|
// authService
|
||||||
|
// .checkPatientAuthentication(request)
|
||||||
|
// .then((value) => {
|
||||||
|
// GifLoaderDialogUtils.hideDialog(context),
|
||||||
|
// if (value['isSMSSent'])
|
||||||
|
// {
|
||||||
|
// sharedPref.setString(LOGIN_TOKEN_ID, value['LogInTokenID']),
|
||||||
|
// this.loginTokenID = value['LogInTokenID'],
|
||||||
|
// sharedPref.setObject(REGISTER_DATA_FOR_LOGIIN, request),
|
||||||
|
// // Future.delayed(Duration(seconds: 1), () {
|
||||||
|
// this.sendActivationCode(type)
|
||||||
|
// // })
|
||||||
|
// }
|
||||||
|
// else
|
||||||
|
// {
|
||||||
|
// if (value['IsAuthenticated']) {this.checkActivationCode()}
|
||||||
|
// }
|
||||||
|
// })
|
||||||
|
// .catchError((err) {
|
||||||
|
// print(err);
|
||||||
|
// GifLoaderDialogUtils.hideDialog(context);
|
||||||
|
// });
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// sendActivationCode(type) async {
|
||||||
|
// var request = this.getCommonRequest(type: type);
|
||||||
|
// request.sMSSignature = await SMSOTP.getSignature();
|
||||||
|
// GifLoaderDialogUtils.showMyDialog(context);
|
||||||
|
// if (healthId != null) {
|
||||||
|
// // final DateFormat dateFormat = DateFormat('MM/dd/yyyy');
|
||||||
|
// // final DateFormat dateFormat2 = DateFormat('dd/MM/yyyy');
|
||||||
|
// request.dob = dob; //isHijri == 1 ? dob : dateFormat2.format(dateFormat.parse(dob));
|
||||||
|
// request.healthId = healthId;
|
||||||
|
// request.isHijri = isHijri;
|
||||||
|
// await this.authService.sendActivationCodeRegister(request).then((result) {
|
||||||
|
// GifLoaderDialogUtils.hideDialog(context);
|
||||||
|
// if (result != null && result['isSMSSent'] == true) {
|
||||||
|
// this.startSMSService(type);
|
||||||
|
// }
|
||||||
|
// }).catchError((r) {
|
||||||
|
// GifLoaderDialogUtils.hideDialog(context);
|
||||||
|
// });
|
||||||
|
// } else {
|
||||||
|
// request.dob = "";
|
||||||
|
// request.healthId = "";
|
||||||
|
// request.isHijri = 0;
|
||||||
|
// await this.authService.sendActivationCode(request).then((result) {
|
||||||
|
// GifLoaderDialogUtils.hideDialog(context);
|
||||||
|
// if (result != null && result['isSMSSent'] == true) {
|
||||||
|
// this.startSMSService(type);
|
||||||
|
// }
|
||||||
|
// }).catchError((r) {
|
||||||
|
// GifLoaderDialogUtils.hideDialog(context);
|
||||||
|
// });
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// var tempType;
|
||||||
|
//
|
||||||
|
// startSMSService(type) {
|
||||||
|
// tempType = type;
|
||||||
|
// new SMSOTP(
|
||||||
|
// context,
|
||||||
|
// type,
|
||||||
|
// this.mobileNumber,
|
||||||
|
// (value) {
|
||||||
|
// this.checkActivationCode(value: value);
|
||||||
|
// },
|
||||||
|
// () => {
|
||||||
|
// Navigator.pop(context),
|
||||||
|
// },
|
||||||
|
// ).displayDialog(context);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// loginWithFingurePrintFace(type, int isActive) async {
|
||||||
|
// if (isActive == 1 || isActive == 0) {
|
||||||
|
// const iosStrings =
|
||||||
|
// const IOSAuthMessages(cancelButton: 'cancel', goToSettingsButton: 'settings', goToSettingsDescription: 'Please set up your Touch ID.', lockOut: 'Please reenable your Touch ID');
|
||||||
|
//
|
||||||
|
// try {
|
||||||
|
// authenticated = await auth.authenticateWithBiometrics(localizedReason: 'Scan your fingerprint to authenticate', useErrorDialogs: true, stickyAuth: true, iOSAuthStrings: iosStrings);
|
||||||
|
// } on PlatformException catch (e) {
|
||||||
|
// GifLoaderDialogUtils.hideDialog(context);
|
||||||
|
// AppToast.showErrorToast(message: 'Please enable your Touch or Face ID');
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// if (authenticated == true) {
|
||||||
|
// // if (user != null && (user.logInType == 2 || user.logInType == 3)) {
|
||||||
|
// // this.checkActivationCode();
|
||||||
|
// // } else {
|
||||||
|
//
|
||||||
|
// var request = this.getCommonRequest(type: type);
|
||||||
|
// this.getMobileInfo(request);
|
||||||
|
// //}
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// getMobileInfo(request) {
|
||||||
|
// // GifLoaderDialogUtils.showMyDialog(context);
|
||||||
|
// this.authService.getLoginInfo(request).then((result) {
|
||||||
|
// GifLoaderDialogUtils.hideDialog(context);
|
||||||
|
// if (result['SMSLoginRequired'] == false) {
|
||||||
|
// this.loginTokenID = result['LogInTokenID'];
|
||||||
|
// this.patientOutSA = result['PatientOutSA'];
|
||||||
|
// // sms for register the biometric
|
||||||
|
// if (result['isSMSSent']) {
|
||||||
|
// setState(() {
|
||||||
|
// isMoreOption = true;
|
||||||
|
// this.onlySMSBox = true;
|
||||||
|
// // this.fingrePrintBefore = true;
|
||||||
|
// });
|
||||||
|
// //this.button();
|
||||||
|
// } else {
|
||||||
|
// setDefault();
|
||||||
|
// checkActivationCode();
|
||||||
|
// }
|
||||||
|
// } else {
|
||||||
|
// if (result['IsAuthenticated'] == true) {
|
||||||
|
// setState(() {
|
||||||
|
// isMoreOption = true;
|
||||||
|
// this.onlySMSBox = true;
|
||||||
|
// // this.fingrePrintBefore = true;
|
||||||
|
// });
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }).catchError((err) {
|
||||||
|
// GifLoaderDialogUtils.hideDialog(context);
|
||||||
|
// print(err);
|
||||||
|
// });
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// setDefault() async {
|
||||||
|
// if (await sharedPref.getObject(IMEI_USER_DATA) != null) user = SelectDeviceIMEIRES.fromJson(await sharedPref.getObject(IMEI_USER_DATA));
|
||||||
|
//
|
||||||
|
// if (await sharedPref.getObject(REGISTER_DATA_FOR_LOGIIN) != null) {
|
||||||
|
// isMoreOption = true;
|
||||||
|
// this.registerd_data = CheckPatientAuthenticationReq.fromJson(await sharedPref.getObject(REGISTER_DATA_FOR_LOGIIN));
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// this.mobileNumber = this.registerd_data != null ? this.registerd_data.patientMobileNumber : int.parse(this.user.mobile);
|
||||||
|
// this.zipCode = this.registerd_data != null
|
||||||
|
// ? this.registerd_data.zipCode
|
||||||
|
// : this.user.outSA == true
|
||||||
|
// ? "971"
|
||||||
|
// : "966";
|
||||||
|
// this.patientOutSA = this.registerd_data != null
|
||||||
|
// ? this.registerd_data.zipCode == "966"
|
||||||
|
// ? 0
|
||||||
|
// : 1
|
||||||
|
// : this.user.outSA;
|
||||||
|
// if (this.registerd_data != null) {
|
||||||
|
// this.loginTokenID = await sharedPref.getString(LOGIN_TOKEN_ID);
|
||||||
|
// this.loginType = this.registerd_data.searchType;
|
||||||
|
// }
|
||||||
|
// var nhic = await sharedPref.getObject(NHIC_DATA);
|
||||||
|
// if (nhic != null) {
|
||||||
|
// final DateFormat dateFormat = DateFormat('MM/dd/yyyy');
|
||||||
|
// final DateFormat dateFormat2 = DateFormat('dd/MM/yyyy');
|
||||||
|
// dob = nhic['IsHijri'] ? nhic['DateOfBirth'] : dateFormat2.format(dateFormat.parse(nhic['DateOfBirth']));
|
||||||
|
//
|
||||||
|
// isHijri = nhic['IsHijri'] ? 1 : 0;
|
||||||
|
// healthId = nhic['HealthId'];
|
||||||
|
// }
|
||||||
|
// this.deviceToken = await sharedPref.getString(PUSH_TOKEN);
|
||||||
|
// this.lastLogin = await sharedPref.getInt(LAST_LOGIN) != null
|
||||||
|
// ? await sharedPref.getInt(LAST_LOGIN)
|
||||||
|
// : user != null
|
||||||
|
// ? user.logInType
|
||||||
|
// : null;
|
||||||
|
//
|
||||||
|
// //this.cs.sharedService.getStorage(AuthenticationService.LAST_LOGIN);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// getCommonRequest({type}) {
|
||||||
|
// var request = SendActivationRequest();
|
||||||
|
// request.patientMobileNumber = this.mobileNumber;
|
||||||
|
// request.mobileNo = '0' + this.mobileNumber.toString();
|
||||||
|
// request.deviceToken = this.deviceToken;
|
||||||
|
// request.projectOutSA = this.patientOutSA == true ? true : false;
|
||||||
|
// request.loginType = this.selectedOption;
|
||||||
|
// request.oTPSendType = type == 1 ? type : 2; //this.selectedOption == 1 ? 1 : 2;
|
||||||
|
// request.zipCode = this.zipCode;
|
||||||
|
//
|
||||||
|
// request.logInTokenID = this.loginTokenID ?? "";
|
||||||
|
//
|
||||||
|
// if (this.registerd_data != null) {
|
||||||
|
// request.searchType = this.registerd_data.searchType != null ? this.registerd_data.searchType : 1;
|
||||||
|
// request.patientID = this.registerd_data.patientID != null ? this.registerd_data.patientID : 0;
|
||||||
|
// request.patientIdentificationID = request.nationalID = this.registerd_data.patientIdentificationID != null ? this.registerd_data.patientIdentificationID : '0';
|
||||||
|
//
|
||||||
|
// request.isRegister = this.registerd_data.isRegister;
|
||||||
|
// } else {
|
||||||
|
// request.searchType = request.searchType != null ? request.searchType : 2;
|
||||||
|
// request.patientID = this.user.patientID != null ? this.user.patientID : 0;
|
||||||
|
// request.nationalID = request.nationalID != null ? request.nationalID : '0';
|
||||||
|
// request.patientIdentificationID = request.patientIdentificationID != null ? request.patientIdentificationID : '0';
|
||||||
|
// request.isRegister = false;
|
||||||
|
// }
|
||||||
|
// request.deviceTypeID = request.searchType;
|
||||||
|
// return request;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// // checkActivationCode({value}) async {
|
||||||
|
// // // Navigator.pop(context);
|
||||||
|
// // GifLoaderDialogUtils.showMyDialog(context);
|
||||||
|
// // var request = this.getCommonRequest().toJson();
|
||||||
|
// // dynamic res;
|
||||||
|
// // if (healthId != null) {
|
||||||
|
// // request['DOB'] = dob;
|
||||||
|
// // request['HealthId'] = healthId;
|
||||||
|
// // request['IsHijri'] = isHijri;
|
||||||
|
// //
|
||||||
|
// // authService
|
||||||
|
// // .checkActivationCodeRegister(request, value)
|
||||||
|
// // .then((result) => {
|
||||||
|
// // res = result,
|
||||||
|
// // if (result is Map)
|
||||||
|
// // {
|
||||||
|
// // result = CheckActivationCode.fromJson(result),
|
||||||
|
// // if (this.registerd_data != null && this.registerd_data.isRegister == true)
|
||||||
|
// // {
|
||||||
|
// // widget.changePageViewIndex(1),
|
||||||
|
// // Navigator.popUntil(context, (route) => Utils.route(route, equalsTo: RegisterNew)),
|
||||||
|
// // }
|
||||||
|
// // }
|
||||||
|
// // else
|
||||||
|
// // {
|
||||||
|
// // // Navigator.of(context).pop(),
|
||||||
|
// // GifLoaderDialogUtils.hideDialog(context),
|
||||||
|
// // Future.delayed(Duration(seconds: 1), () {
|
||||||
|
// // AppToast.showErrorToast(message: result);
|
||||||
|
// // }),
|
||||||
|
// // }
|
||||||
|
// // })
|
||||||
|
// // .catchError((err) {
|
||||||
|
// // print(err);
|
||||||
|
// // GifLoaderDialogUtils.hideDialog(context);
|
||||||
|
// // Future.delayed(Duration(seconds: 1), () {
|
||||||
|
// // AppToast.showErrorToast(message: err);
|
||||||
|
// // startSMSService(tempType);
|
||||||
|
// // });
|
||||||
|
// // });
|
||||||
|
// // } else {
|
||||||
|
// // authService
|
||||||
|
// // .checkActivationCode(request, value)
|
||||||
|
// // .then((result) => {
|
||||||
|
// // res = result,
|
||||||
|
// // if (result is Map)
|
||||||
|
// // {
|
||||||
|
// // result = CheckActivationCode.fromJson(result),
|
||||||
|
// // if (this.registerd_data != null && this.registerd_data.isRegister == true)
|
||||||
|
// // {
|
||||||
|
// // widget.changePageViewIndex(1),
|
||||||
|
// // Navigator.popUntil(context, (route) => Utils.route(route, equalsTo: RegisterNew)),
|
||||||
|
// // }
|
||||||
|
// // else
|
||||||
|
// // {
|
||||||
|
// // sharedPref.remove(FAMILY_FILE),
|
||||||
|
// // result.list.isFamily = false,
|
||||||
|
// // userData = result.list,
|
||||||
|
// // sharedPref.setString(BLOOD_TYPE, result.patientBloodType),
|
||||||
|
// // authenticatedUserObject.user = result.list,
|
||||||
|
// // projectViewModel.setPrivilege(privilegeList: res),
|
||||||
|
// // sharedPref.setObject(MAIN_USER, result.list),
|
||||||
|
// // sharedPref.setObject(USER_PROFILE, result.list),
|
||||||
|
// // loginTokenID = result.logInTokenID,
|
||||||
|
// // sharedPref.setObject(LOGIN_TOKEN_ID, result.logInTokenID),
|
||||||
|
// // sharedPref.setString(TOKEN, result.authenticationTokenID),
|
||||||
|
// // checkIfUserAgreedBefore(result),
|
||||||
|
// // }
|
||||||
|
// // }
|
||||||
|
// // else
|
||||||
|
// // {
|
||||||
|
// // // // Navigator.of(context).pop(),
|
||||||
|
// // // GifLoaderDialogUtils.hideDialog(context),
|
||||||
|
// // // Future.delayed(Duration(seconds: 1), () {
|
||||||
|
// // // AppToast.showErrorToast(message: result);
|
||||||
|
// // // startSMSService(tempType);
|
||||||
|
// // // }),
|
||||||
|
// // }
|
||||||
|
// // })
|
||||||
|
// // .catchError((err) {
|
||||||
|
// // // print(err);
|
||||||
|
// // // GifLoaderDialogUtils.hideDialog(context);
|
||||||
|
// // // Future.delayed(Duration(seconds: 1), () {
|
||||||
|
// // // AppToast.showErrorToast(message: err);
|
||||||
|
// // // startSMSService(tempType);
|
||||||
|
// // // });
|
||||||
|
// // });
|
||||||
|
// // }
|
||||||
|
// // }
|
||||||
|
//
|
||||||
|
// // checkIfUserAgreedBefore(CheckActivationCode result) {
|
||||||
|
// // if (result.isNeedUserAgreement == true) {
|
||||||
|
// // //move to agreement page.
|
||||||
|
// // } else {
|
||||||
|
// // goToHome();
|
||||||
|
// // }
|
||||||
|
// // }
|
||||||
|
//
|
||||||
|
// insertIMEI() {
|
||||||
|
// authService.insertDeviceImei(selectedOption).then((value) => {}).catchError((err) {
|
||||||
|
// print(err);
|
||||||
|
// });
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// // getToDoCount() {
|
||||||
|
// // toDoProvider.setState(0, true, "0");
|
||||||
|
// // ClinicListService service = new ClinicListService();
|
||||||
|
// // service.getActiveAppointmentNo(context).then((res) {
|
||||||
|
// // if (res['MessageStatus'] == 1) {
|
||||||
|
// // toDoProvider.setState(res['AppointmentActiveNumber'], true, "0");
|
||||||
|
// // } else {}
|
||||||
|
// // }).catchError((err) {
|
||||||
|
// // print(err);
|
||||||
|
// // });
|
||||||
|
// // }
|
||||||
|
//
|
||||||
|
// // goToHome() async {
|
||||||
|
// // authenticatedUserObject.isLogin = true;
|
||||||
|
// // appointmentRateViewModel.isLogin = true;
|
||||||
|
// // projectViewModel.isLogin = true;
|
||||||
|
// // projectViewModel.user = authenticatedUserObject.user;
|
||||||
|
// // await authenticatedUserObject.getUser(getUser: true);
|
||||||
|
// //
|
||||||
|
// // // getToDoCount();
|
||||||
|
// //
|
||||||
|
// // appointmentRateViewModel
|
||||||
|
// // .getIsLastAppointmentRatedList()
|
||||||
|
// // .then((value) => {
|
||||||
|
// // getToDoCount(),
|
||||||
|
// // GifLoaderDialogUtils.hideDialog(AppGlobal.context),
|
||||||
|
// // if (appointmentRateViewModel.isHaveAppointmentNotRate)
|
||||||
|
// // {
|
||||||
|
// // Navigator.pushAndRemoveUntil(
|
||||||
|
// // context,
|
||||||
|
// // FadePage(
|
||||||
|
// // page: RateAppointmentDoctor(),
|
||||||
|
// // ),
|
||||||
|
// // (r) => false)
|
||||||
|
// // }
|
||||||
|
// // else
|
||||||
|
// // {
|
||||||
|
// // Navigator.pushAndRemoveUntil(
|
||||||
|
// // context,
|
||||||
|
// // FadePage(
|
||||||
|
// // page: LandingPage(),
|
||||||
|
// // ),
|
||||||
|
// // (r) => false)
|
||||||
|
// // },
|
||||||
|
// // insertIMEI()
|
||||||
|
// // })
|
||||||
|
// // .catchError((err) {
|
||||||
|
// // print(err);
|
||||||
|
// // });
|
||||||
|
// // }
|
||||||
|
//
|
||||||
|
// loading(flag) {
|
||||||
|
// // setState(() {
|
||||||
|
// // isLoading = flag;
|
||||||
|
// // });
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
Widget _loginOptionButton(String _title, String _icon, int _flag, int? _loginIndex) {
|
||||||
|
bool isDisable = ((_flag == 3 && !checkBiometricIsAvailable(BiometricType.face)) || (_flag == 2 && !checkBiometricIsAvailable(BiometricType.fingerprint)));
|
||||||
|
print("$_title:$isDisable");
|
||||||
|
return InkWell(
|
||||||
|
onTap: isDisable
|
||||||
|
? null
|
||||||
|
: () {
|
||||||
|
if (_flag == 0) {
|
||||||
|
setState(() {
|
||||||
|
// isMoreOption = true;
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
OtpDialog(
|
||||||
|
context,
|
||||||
|
_flag,
|
||||||
|
//this.mobileNumber
|
||||||
|
0554870506,
|
||||||
|
(value) {
|
||||||
|
Navigator.pushReplacementNamed(context, AppRoutes.dashboard);
|
||||||
|
// this.checkActivationCode(value: value);
|
||||||
|
},
|
||||||
|
() => {
|
||||||
|
Navigator.pop(context),
|
||||||
|
},
|
||||||
|
).displayDialog(context);
|
||||||
|
|
||||||
|
// authenticateUser(_flag, isActive: _loginIndex);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
child: Container(
|
||||||
|
padding: const EdgeInsets.only(left: 20, right: 20, bottom: 15, top: 28),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
borderRadius: BorderRadius.circular(15),
|
||||||
|
color: isDisable ? Colors.grey.withOpacity(0.3) : Colors.white,
|
||||||
|
border: Border.all(color: MyColors.lightGreyEFColor, width: 1),
|
||||||
|
),
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: <Widget>[
|
||||||
|
SvgPicture.asset(
|
||||||
|
_icon,
|
||||||
|
height: 38,
|
||||||
|
width: 38,
|
||||||
|
color: isDisable ? MyColors.darkTextColor.withOpacity(0.7) : null,
|
||||||
|
),
|
||||||
|
_title.toText16()
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget getButton(int flag) {
|
||||||
|
switch (flag) {
|
||||||
|
case 4:
|
||||||
|
return _loginOptionButton(LocaleKeys.verifyThroughWhatsapp.tr(), 'assets/images/login/verify_whatsapp.svg', flag, null);
|
||||||
|
case 1:
|
||||||
|
return _loginOptionButton(LocaleKeys.verifyThroughSMS.tr(), 'assets/images/login/verify_sms.svg', flag, null);
|
||||||
|
case 2:
|
||||||
|
return _loginOptionButton(LocaleKeys.verifyThroughFingerprint.tr(), 'assets/images/login/verify_thumb.svg', flag, BiometricType.fingerprint.index);
|
||||||
|
case 3:
|
||||||
|
return _loginOptionButton(LocaleKeys.verifyThroughFace.tr(), 'assets/images/login/verify_face.svg', flag, BiometricType.face.index);
|
||||||
|
default:
|
||||||
|
return const SizedBox();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool checkBiometricIsAvailable(BiometricType biometricType) {
|
||||||
|
bool isAvailable = false;
|
||||||
|
for (int i = 0; i < _availableBioMetricType.length; i++) {
|
||||||
|
if (biometricType == _availableBioMetricType[i]) {
|
||||||
|
isAvailable = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return isAvailable;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// formatDate(date) {
|
||||||
|
// return date;
|
||||||
|
// return DateFormat('MMM dd, yyy, kk:mm').format(date);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// showLoader(bool isTrue) {
|
||||||
|
// setState(() {
|
||||||
|
// // isLoading = isTrue;
|
||||||
|
// });
|
||||||
|
// }
|
||||||
|
|
||||||
|
}
|
||||||
@ -1,6 +1,6 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_svg/svg.dart';
|
import 'package:flutter_svg/svg.dart';
|
||||||
import 'package:mohem_flutter_app/sikander_later_will_remove_to_parent_directory/classes/colors.dart';
|
import 'package:mohem_flutter_app/classes/colors.dart';
|
||||||
|
|
||||||
class NoDataUI extends StatelessWidget {
|
class NoDataUI extends StatelessWidget {
|
||||||
NoDataUI({Key? key}) : super(key: key);
|
NoDataUI({Key? key}) : super(key: key);
|
||||||
@ -0,0 +1,126 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:mohem_flutter_app/classes/colors.dart';
|
||||||
|
import 'package:mohem_flutter_app/widgets/circular_avatar.dart';
|
||||||
|
import 'package:mohem_flutter_app/extensions/string_extensions.dart';
|
||||||
|
import 'package:mohem_flutter_app/extensions/int_extensions.dart';
|
||||||
|
import 'package:mohem_flutter_app/extensions/widget_extensions.dart';
|
||||||
|
import 'dart:math' as math;
|
||||||
|
|
||||||
|
class ActionsFragment extends StatelessWidget {
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Container(
|
||||||
|
width: double.infinity,
|
||||||
|
height: double.infinity,
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
showItem(),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget showItem() {
|
||||||
|
return Container(
|
||||||
|
width: double.infinity,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.white,
|
||||||
|
borderRadius: BorderRadius.circular(15),
|
||||||
|
boxShadow: [
|
||||||
|
BoxShadow(
|
||||||
|
color: const Color(0xff000000).withOpacity(.05),
|
||||||
|
blurRadius: 26,
|
||||||
|
offset: const Offset(0, -3),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
clipBehavior: Clip.antiAlias,
|
||||||
|
margin: EdgeInsets.all(21),
|
||||||
|
child: Stack(
|
||||||
|
clipBehavior: Clip.antiAlias,
|
||||||
|
children: [
|
||||||
|
Positioned(
|
||||||
|
left: -21,
|
||||||
|
child: Transform.rotate(
|
||||||
|
angle: 125,
|
||||||
|
child: Container(
|
||||||
|
width: 60,
|
||||||
|
height: 20,
|
||||||
|
color: Colors.black,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Column(
|
||||||
|
children: [
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.only(left: 12, right: 12, top: 12),
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
CircularAvatar(),
|
||||||
|
12.width,
|
||||||
|
Expanded(
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
"Mahmoud Shrouf".toText16(),
|
||||||
|
6.height,
|
||||||
|
"Missing Swipe Request for Hussain, Mohammad has been approved"
|
||||||
|
.toText12(),
|
||||||
|
3.height,
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
"Submitted".toText10(),
|
||||||
|
12.width,
|
||||||
|
"On 07 Jan 2021"
|
||||||
|
.toText12(color: MyColors.lightTextColor)
|
||||||
|
],
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
12.height,
|
||||||
|
Container(
|
||||||
|
width: double.infinity,
|
||||||
|
height: 1,
|
||||||
|
color: MyColors.lightTextColor,
|
||||||
|
),
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: Center(
|
||||||
|
child: "Request Info"
|
||||||
|
.toText12(isBold: true)
|
||||||
|
.paddingOnly(left: 21, right: 21, top: 16, bottom: 8),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Center(
|
||||||
|
child: Container(
|
||||||
|
width: 1,
|
||||||
|
height: 45,
|
||||||
|
color: MyColors.lightTextColor,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Expanded(
|
||||||
|
child: Center(
|
||||||
|
child: "Delegate"
|
||||||
|
.toText12(
|
||||||
|
color: MyColors.gradiantEndColor, isBold: true)
|
||||||
|
.paddingOnly(left: 21, right: 21, top: 16, bottom: 8),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,61 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_svg/flutter_svg.dart';
|
||||||
|
import 'package:mohem_flutter_app/extensions/string_extensions.dart';
|
||||||
|
import 'package:mohem_flutter_app/extensions/int_extensions.dart';
|
||||||
|
|
||||||
|
class AttachmentsFragment extends StatelessWidget {
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Container(
|
||||||
|
width: double.infinity,
|
||||||
|
height: double.infinity,
|
||||||
|
child: ListView.separated(
|
||||||
|
itemCount: 2,
|
||||||
|
padding: EdgeInsets.all(21),
|
||||||
|
itemBuilder: (context, index) {
|
||||||
|
return showItem(attachmentsList[index]);
|
||||||
|
},
|
||||||
|
separatorBuilder: (BuildContext context, int index) {
|
||||||
|
return 21.height;
|
||||||
|
},
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget showItem(Attachments attachments) {
|
||||||
|
return Container(
|
||||||
|
width: double.infinity,
|
||||||
|
padding: EdgeInsets.all(21),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.white,
|
||||||
|
borderRadius: BorderRadius.circular(15),
|
||||||
|
boxShadow: [
|
||||||
|
BoxShadow(
|
||||||
|
color: const Color(0xff000000).withOpacity(.05),
|
||||||
|
blurRadius: 26,
|
||||||
|
offset: const Offset(0, -3),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
SvgPicture.asset(attachments.icon),
|
||||||
|
12.width,
|
||||||
|
attachments.title.toText16()
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Attachments {
|
||||||
|
String title;
|
||||||
|
String icon;
|
||||||
|
|
||||||
|
Attachments(this.title, this.icon);
|
||||||
|
}
|
||||||
|
|
||||||
|
List<Attachments> attachmentsList = [
|
||||||
|
Attachments("Attachment File Name.png", "assets/images/png.svg"),
|
||||||
|
Attachments("Attachment File Name.pdf", "assets/images/pdf.svg"),
|
||||||
|
];
|
||||||
@ -0,0 +1,69 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:mohem_flutter_app/classes/colors.dart';
|
||||||
|
import 'package:mohem_flutter_app/extensions/int_extensions.dart';
|
||||||
|
import 'package:mohem_flutter_app/extensions/string_extensions.dart';
|
||||||
|
|
||||||
|
class InfoFragment extends StatelessWidget {
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Container(
|
||||||
|
width: double.infinity,
|
||||||
|
height: double.infinity,
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
Container(
|
||||||
|
width: double.infinity,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.white,
|
||||||
|
borderRadius: BorderRadius.circular(15),
|
||||||
|
boxShadow: [
|
||||||
|
BoxShadow(
|
||||||
|
color: const Color(0xff000000).withOpacity(.05),
|
||||||
|
blurRadius: 26,
|
||||||
|
offset: const Offset(0, -3),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
margin: EdgeInsets.all(21),
|
||||||
|
padding: EdgeInsets.only(top: 21, bottom: 21, right: 16, left: 16),
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: "Info Details".toText16(),
|
||||||
|
),
|
||||||
|
// Icon(Icons.keyboard_arrow_down_rounded),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
Column(
|
||||||
|
children: [
|
||||||
|
12.height,
|
||||||
|
showItem("From:", "Alma Linde Mendoza"),
|
||||||
|
showItem("To:", "Al Yabis, Norah"),
|
||||||
|
showItem("Sent:", "1/26/2020 10:41:07 AM"),
|
||||||
|
showItem("ID:", "30581045"),
|
||||||
|
showItem("Closed:", "-"),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget showItem(String title, String value) {
|
||||||
|
return Padding(
|
||||||
|
padding: const EdgeInsets.only(top: 2, bottom: 2),
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
title.toText12(isBold: true),
|
||||||
|
6.width,
|
||||||
|
title.toText12(isBold: false, color: MyColors.normalTextColor),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,87 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:mohem_flutter_app/classes/colors.dart';
|
||||||
|
import 'package:mohem_flutter_app/extensions/string_extensions.dart';
|
||||||
|
import 'package:mohem_flutter_app/extensions/int_extensions.dart';
|
||||||
|
|
||||||
|
class RequestFragment extends StatefulWidget {
|
||||||
|
@override
|
||||||
|
State<RequestFragment> createState() => _RequestFragmentState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _RequestFragmentState extends State<RequestFragment> {
|
||||||
|
bool isOpened = false;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Container(
|
||||||
|
width: double.infinity,
|
||||||
|
height: double.infinity,
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
Container(
|
||||||
|
width: double.infinity,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.white,
|
||||||
|
borderRadius: BorderRadius.circular(15),
|
||||||
|
boxShadow: [
|
||||||
|
BoxShadow(
|
||||||
|
color: const Color(0xff000000).withOpacity(.05),
|
||||||
|
blurRadius: 26,
|
||||||
|
offset: const Offset(0, -3),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
margin: EdgeInsets.all(21),
|
||||||
|
padding: EdgeInsets.only(top: 21, bottom: 21, right: 16, left: 16),
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: "Hardware Mobility 161 Messenger".toText16(),
|
||||||
|
),
|
||||||
|
Icon(Icons.keyboard_arrow_down_rounded),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
Column(
|
||||||
|
children: [
|
||||||
|
12.height,
|
||||||
|
showItem("Code:", "3188000067"),
|
||||||
|
showItem("Quantity:", "1"),
|
||||||
|
showItem("Line Status:", "Pending Approval"),
|
||||||
|
showItem("Transection Type:", "Move Order Issue:"),
|
||||||
|
showItem("Organization Code:", "SWD"),
|
||||||
|
showItem("From Subinventory:", "SWD_MSPS"),
|
||||||
|
showItem("To Subinventory:", "SWD_MSPS"),
|
||||||
|
showItem("Ship To Location :",
|
||||||
|
"SWD 11206-E.R. (Emergency Room)"),
|
||||||
|
showItem("Unit:", "Each"),
|
||||||
|
showItem("Date Required:", "12/23/2019 4:54:04 PM"),
|
||||||
|
showItem("Status Date:", "12/23/2019 4:54:04 PM"),
|
||||||
|
showItem("Operation Unit:", "Sehat Al Sewedi"),
|
||||||
|
showItem("Organization:", "Sehat Al Sewedi"),
|
||||||
|
showItem("From Locator:", "-"),
|
||||||
|
showItem("To Locator :", "-"),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget showItem(String title, String value) {
|
||||||
|
return Padding(
|
||||||
|
padding: const EdgeInsets.only(top: 2, bottom: 2),
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
title.toText12(isBold: true),
|
||||||
|
6.width,
|
||||||
|
title.toText12(isBold: false, color: MyColors.normalTextColor),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,104 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:mohem_flutter_app/classes/colors.dart';
|
||||||
|
import 'package:mohem_flutter_app/ui/app_bar.dart';
|
||||||
|
import 'package:mohem_flutter_app/extensions/string_extensions.dart';
|
||||||
|
import 'package:mohem_flutter_app/ui/work_list/missing_swipe/fragments/actions_fragment.dart';
|
||||||
|
import 'package:mohem_flutter_app/ui/work_list/missing_swipe/fragments/attachments_fragment.dart';
|
||||||
|
import 'package:mohem_flutter_app/ui/work_list/missing_swipe/fragments/info_fragments.dart';
|
||||||
|
import 'package:mohem_flutter_app/ui/work_list/missing_swipe/fragments/request_fragment.dart';
|
||||||
|
import 'package:mohem_flutter_app/widgets/button/default_button.dart';
|
||||||
|
import 'package:mohem_flutter_app/extensions/int_extensions.dart';
|
||||||
|
|
||||||
|
class MissingSwipeScreen extends StatelessWidget {
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return DefaultTabController(
|
||||||
|
length: 4,
|
||||||
|
child: Scaffold(
|
||||||
|
appBar: appBar(context, title: "Missing Swipe Request"),
|
||||||
|
body: Container(
|
||||||
|
width: double.infinity,
|
||||||
|
height: double.infinity,
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
Container(
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
borderRadius: BorderRadius.only(
|
||||||
|
bottomLeft: Radius.circular(20),
|
||||||
|
bottomRight: Radius.circular(20)),
|
||||||
|
gradient: LinearGradient(
|
||||||
|
transform: GradientRotation(.46),
|
||||||
|
begin: Alignment.topRight,
|
||||||
|
end: Alignment.bottomRight,
|
||||||
|
colors: [
|
||||||
|
MyColors.gradiantEndColor,
|
||||||
|
MyColors.gradiantStartColor,
|
||||||
|
]),
|
||||||
|
),
|
||||||
|
clipBehavior: Clip.antiAlias,
|
||||||
|
child: TabBar(
|
||||||
|
indicatorColor: Colors.white,
|
||||||
|
labelColor: Colors.white,
|
||||||
|
tabs: [
|
||||||
|
Tab(
|
||||||
|
text: "Request",
|
||||||
|
),
|
||||||
|
Tab(
|
||||||
|
text: "Actions",
|
||||||
|
),
|
||||||
|
Tab(
|
||||||
|
text: "Attachments",
|
||||||
|
),
|
||||||
|
Tab(
|
||||||
|
text: "Info.",
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Expanded(
|
||||||
|
child: TabBarView(
|
||||||
|
children: [
|
||||||
|
RequestFragment(),
|
||||||
|
ActionsFragment(),
|
||||||
|
AttachmentsFragment(),
|
||||||
|
InfoFragment(),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Container(
|
||||||
|
width: double.infinity,
|
||||||
|
height: 60,
|
||||||
|
padding: EdgeInsets.only(left: 21, right: 21),
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: DefaultButton(
|
||||||
|
"Reject",
|
||||||
|
() {},
|
||||||
|
colors: [
|
||||||
|
Color(0xffEB8C90),
|
||||||
|
Color(0xffDE6C70),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
12.width,
|
||||||
|
Expanded(
|
||||||
|
child: DefaultButton(
|
||||||
|
"Approve",
|
||||||
|
() {},
|
||||||
|
colors: [
|
||||||
|
Color(0xff32D892),
|
||||||
|
Color(0xff1AB170),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,206 @@
|
|||||||
|
import 'package:easy_localization/src/public_ext.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_svg/svg.dart';
|
||||||
|
import 'package:mohem_flutter_app/classes/colors.dart';
|
||||||
|
import 'package:mohem_flutter_app/config/routes.dart';
|
||||||
|
import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
|
||||||
|
import 'package:mohem_flutter_app/ui/app_bar.dart';
|
||||||
|
import 'package:mohem_flutter_app/extensions/string_extensions.dart';
|
||||||
|
import 'package:mohem_flutter_app/extensions/int_extensions.dart';
|
||||||
|
import 'package:mohem_flutter_app/extensions/widget_extensions.dart';
|
||||||
|
|
||||||
|
class WorkListScreen extends StatefulWidget {
|
||||||
|
@override
|
||||||
|
State<WorkListScreen> createState() => _WorkListScreenState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _WorkListScreenState extends State<WorkListScreen> {
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Scaffold(
|
||||||
|
backgroundColor: Colors.white,
|
||||||
|
appBar: appBar(
|
||||||
|
context,
|
||||||
|
title: LocaleKeys.workList.tr(),
|
||||||
|
),
|
||||||
|
body: Container(
|
||||||
|
width: double.infinity,
|
||||||
|
height: double.infinity,
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Container(
|
||||||
|
width: double.infinity,
|
||||||
|
height: 2,
|
||||||
|
color: MyColors.darkWhiteColor,
|
||||||
|
),
|
||||||
|
Container(
|
||||||
|
width: double.infinity,
|
||||||
|
height: 40,
|
||||||
|
margin: EdgeInsets.only(
|
||||||
|
top: 21,
|
||||||
|
),
|
||||||
|
child: ListView.separated(
|
||||||
|
itemBuilder: (context, index) {
|
||||||
|
return Container(
|
||||||
|
padding: EdgeInsets.only(
|
||||||
|
left: 30,
|
||||||
|
right: 30,
|
||||||
|
),
|
||||||
|
alignment: Alignment.center,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
borderRadius: BorderRadius.circular(6),
|
||||||
|
color: tabList[index].isSelected
|
||||||
|
? MyColors.darkIconColor
|
||||||
|
: MyColors.darkWhiteColor,
|
||||||
|
),
|
||||||
|
child: tabList[index].title.toText12(
|
||||||
|
color: tabList[index].isSelected
|
||||||
|
? MyColors.white
|
||||||
|
: MyColors.black,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
separatorBuilder: (context, index) {
|
||||||
|
return 8.width;
|
||||||
|
},
|
||||||
|
shrinkWrap: true,
|
||||||
|
itemCount: tabList.length,
|
||||||
|
scrollDirection: Axis.horizontal,
|
||||||
|
padding: const EdgeInsets.only(
|
||||||
|
left: 21,
|
||||||
|
right: 21,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: [
|
||||||
|
LocaleKeys.human.toText12(),
|
||||||
|
LocaleKeys.resources.tr().toText24(isBold: true),
|
||||||
|
],
|
||||||
|
).paddingOnly(top: 24, left: 21, right: 21),
|
||||||
|
24.height,
|
||||||
|
Expanded(
|
||||||
|
child: ListView.separated(
|
||||||
|
itemBuilder: (context, index) {
|
||||||
|
return rowItem(typesList[index]);
|
||||||
|
},
|
||||||
|
separatorBuilder: (context, index) {
|
||||||
|
return 12.height;
|
||||||
|
},
|
||||||
|
itemCount: typesList.length,
|
||||||
|
padding: EdgeInsets.only(left: 21, right: 21),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget rowItem(Types types) {
|
||||||
|
return InkWell(
|
||||||
|
onTap: (){
|
||||||
|
Navigator.pushNamed(context, AppRoutes.missingSwipe);
|
||||||
|
},
|
||||||
|
child: Container(
|
||||||
|
width: double.infinity,
|
||||||
|
padding: EdgeInsets.all(12),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.white,
|
||||||
|
borderRadius: BorderRadius.circular(10),
|
||||||
|
boxShadow: [
|
||||||
|
BoxShadow(
|
||||||
|
color: const Color(0xff000000).withOpacity(.05),
|
||||||
|
blurRadius: 26,
|
||||||
|
offset: const Offset(0, -3),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
child: Row(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
mainAxisAlignment: MainAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Container(
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
borderRadius: BorderRadius.circular(4),
|
||||||
|
gradient: LinearGradient(
|
||||||
|
transform: GradientRotation(.46),
|
||||||
|
begin: Alignment.topRight,
|
||||||
|
end: Alignment.bottomRight,
|
||||||
|
colors: types.colors),
|
||||||
|
),
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
SvgPicture.asset(
|
||||||
|
"assets/images/miss_swipe.svg",
|
||||||
|
color: Colors.white,
|
||||||
|
),
|
||||||
|
2.height,
|
||||||
|
types.title.toText10(color: Colors.white)
|
||||||
|
],
|
||||||
|
).paddingAll(6),
|
||||||
|
),
|
||||||
|
12.width,
|
||||||
|
Expanded(
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
mainAxisAlignment: MainAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
"Missing Swipe Request".toText16(),
|
||||||
|
"Missing Swipe Request for Hussain, Mohammad has been approved"
|
||||||
|
.toText10(),
|
||||||
|
12.height,
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: "07 Jan 2021"
|
||||||
|
.toText10(color: MyColors.lightTextColor)),
|
||||||
|
SvgPicture.asset(
|
||||||
|
"assets/images/arrow_next.svg",
|
||||||
|
color: MyColors.darkIconColor,
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Tabs {
|
||||||
|
String title;
|
||||||
|
bool isSelected;
|
||||||
|
|
||||||
|
Tabs(this.title, this.isSelected);
|
||||||
|
}
|
||||||
|
|
||||||
|
List<Tabs> tabList = [
|
||||||
|
Tabs("All", true),
|
||||||
|
Tabs("HR", false),
|
||||||
|
Tabs("MO", false),
|
||||||
|
Tabs("PR", false),
|
||||||
|
Tabs("PO", false),
|
||||||
|
];
|
||||||
|
|
||||||
|
class Types {
|
||||||
|
String title;
|
||||||
|
List<Color> colors;
|
||||||
|
|
||||||
|
Types(this.title, this.colors);
|
||||||
|
}
|
||||||
|
|
||||||
|
List<Types> typesList = [
|
||||||
|
Types("HR", [Color(0xff32D892), Color(0xff1AB170)]),
|
||||||
|
Types("ITG", [Color(0xffEB8C90), Color(0xffDE6C70)]),
|
||||||
|
Types("PO", [Color(0xff5099E3), Color(0xff3670AA)]),
|
||||||
|
Types("PR", [Color(0xff48EACF), Color(0xff3DCAB3)]),
|
||||||
|
Types("MO", [Color(0xff58DCFA), Color(0xff3CB9D5)]),
|
||||||
|
];
|
||||||
@ -1,36 +0,0 @@
|
|||||||
import 'package:permission_handler/permission_handler.dart';
|
|
||||||
|
|
||||||
import 'dialogs.dart';
|
|
||||||
|
|
||||||
enum ConfirmAction { CANCEL, ACCEPT }
|
|
||||||
|
|
||||||
Future<bool> requestPermissionGranted(
|
|
||||||
context, Permission requestPermissions) async {
|
|
||||||
var result = await requestPermissions.request();
|
|
||||||
|
|
||||||
switch (result) {
|
|
||||||
case PermissionStatus.granted:
|
|
||||||
// Application has been given permission to use the feature.
|
|
||||||
return true;
|
|
||||||
case PermissionStatus.denied:
|
|
||||||
// Application has been denied permission to use the feature.
|
|
||||||
return false;
|
|
||||||
case PermissionStatus.permanentlyDenied:
|
|
||||||
ConfirmAction? res = await showConfirmDialogs(
|
|
||||||
context,
|
|
||||||
'You was denied Permission. You have give manual permission from app setting. ',
|
|
||||||
'Open App Setting',
|
|
||||||
'Cancel');
|
|
||||||
if (res == ConfirmAction.ACCEPT) {
|
|
||||||
return false;
|
|
||||||
} else if (res == ConfirmAction.CANCEL) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
case PermissionStatus.restricted:
|
|
||||||
// iOS has restricted access to a specific feature.
|
|
||||||
return false;
|
|
||||||
default:
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,35 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
import 'AppPermissionHandler.dart';
|
|
||||||
|
|
||||||
Future<ConfirmAction?> showConfirmDialogs(
|
|
||||||
context, msg, positiveText, negativeText) async {
|
|
||||||
return showDialog<ConfirmAction>(
|
|
||||||
context: context,
|
|
||||||
barrierDismissible: false,
|
|
||||||
builder: (context) {
|
|
||||||
return AlertDialog(
|
|
||||||
backgroundColor: Colors.white,
|
|
||||||
title: Text(msg, style: TextStyle(fontSize: 16)),
|
|
||||||
actions: <Widget>[
|
|
||||||
TextButton(
|
|
||||||
child: Text(
|
|
||||||
negativeText,
|
|
||||||
),
|
|
||||||
onPressed: () {
|
|
||||||
Navigator.of(context).pop(ConfirmAction.CANCEL);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
TextButton(
|
|
||||||
child: Text(
|
|
||||||
positiveText,
|
|
||||||
),
|
|
||||||
onPressed: () {
|
|
||||||
Navigator.of(context).pop(ConfirmAction.ACCEPT);
|
|
||||||
},
|
|
||||||
)
|
|
||||||
],
|
|
||||||
);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@ -1,9 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
navigateWithName(BuildContext context, String routeName, {Object? arguments}) {
|
|
||||||
Navigator.pushNamed(context, routeName, arguments: arguments);
|
|
||||||
}
|
|
||||||
|
|
||||||
pop(BuildContext context) {
|
|
||||||
Navigator.of(context).pop();
|
|
||||||
}
|
|
||||||
@ -1,311 +0,0 @@
|
|||||||
import 'dart:convert';
|
|
||||||
import 'dart:io';
|
|
||||||
import 'dart:typed_data';
|
|
||||||
import 'dart:ui';
|
|
||||||
|
|
||||||
import 'package:mohem_flutter_app/config/constants.dart';
|
|
||||||
import 'package:mohem_flutter_app/theme/colors.dart';
|
|
||||||
import 'package:mohem_flutter_app/widgets/txt.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:flutter_svg/svg.dart';
|
|
||||||
|
|
||||||
import 'package:sizer/sizer.dart';
|
|
||||||
|
|
||||||
Color getColorFromHex(String hexColor) {
|
|
||||||
hexColor = hexColor.toUpperCase().replaceAll('#', '');
|
|
||||||
|
|
||||||
if (hexColor.length == 6) {
|
|
||||||
hexColor = 'FF' + hexColor;
|
|
||||||
}
|
|
||||||
|
|
||||||
return Color(int.parse(hexColor, radix: 16));
|
|
||||||
}
|
|
||||||
|
|
||||||
Widget spacerVertical(double v) {
|
|
||||||
return Container(
|
|
||||||
height: v,
|
|
||||||
width: double.infinity,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
Future delay(int millis) async {
|
|
||||||
return await Future.delayed(Duration(milliseconds: millis));
|
|
||||||
}
|
|
||||||
|
|
||||||
inkWellCorner({double? r}) {
|
|
||||||
return RoundedRectangleBorder(
|
|
||||||
borderRadius: BorderRadius.circular(r ?? 4),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Widget spacerHorizontal(double v) {
|
|
||||||
return Container(
|
|
||||||
height: v,
|
|
||||||
width: v,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Widget mHeight(double f) {
|
|
||||||
return Container(
|
|
||||||
width: f,
|
|
||||||
height: f,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Widget mDivider(Color color, {double? h}) {
|
|
||||||
return Container(
|
|
||||||
width: double.infinity,
|
|
||||||
height: h ?? 1,
|
|
||||||
color: color,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Widget mDivider3({double? h}) {
|
|
||||||
return Container(
|
|
||||||
width: double.infinity,
|
|
||||||
height: h ?? 1,
|
|
||||||
color: borderLightColor!.withOpacity(0.7)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Widget mDivider2(Color color, double w) {
|
|
||||||
return Container(
|
|
||||||
width: w,
|
|
||||||
height: 1,
|
|
||||||
color: color,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
InputDecoration txtField(String label) {
|
|
||||||
return new InputDecoration(
|
|
||||||
border: InputBorder.none,
|
|
||||||
focusedBorder: InputBorder.none,
|
|
||||||
enabledBorder: InputBorder.none,
|
|
||||||
errorBorder: InputBorder.none,
|
|
||||||
hintText: label,
|
|
||||||
hintStyle: TextStyle(color: Colors.grey),
|
|
||||||
disabledBorder: InputBorder.none,
|
|
||||||
isDense: false,
|
|
||||||
contentPadding: EdgeInsets.only(left: 15, right: 15),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Widget mWidth(double f) {
|
|
||||||
return Container(
|
|
||||||
width: f,
|
|
||||||
height: f,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Widget mFlex(int f) {
|
|
||||||
return Flexible(
|
|
||||||
flex: f,
|
|
||||||
child: Container(
|
|
||||||
width: double.infinity,
|
|
||||||
height: double.infinity,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
Widget mExp(int f) {
|
|
||||||
return Expanded(
|
|
||||||
flex: f,
|
|
||||||
child: Container(
|
|
||||||
width: double.infinity,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
spacer() {
|
|
||||||
return SizedBox(
|
|
||||||
height: 8,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Widget floatButton(String icon, {Color? color, required Function onClick, String? title}) {
|
|
||||||
return Padding(
|
|
||||||
padding: const EdgeInsets.only(top: 12, bottom: 12),
|
|
||||||
child: Column(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.center,
|
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
|
||||||
children: [
|
|
||||||
FloatingActionButton(
|
|
||||||
onPressed: () {
|
|
||||||
onClick();
|
|
||||||
},
|
|
||||||
heroTag: icon,
|
|
||||||
backgroundColor: accentColor,
|
|
||||||
elevation: 4,
|
|
||||||
child: Container(
|
|
||||||
child: SvgPicture.asset(
|
|
||||||
categorySvgIcons + icon,
|
|
||||||
color: color,
|
|
||||||
),
|
|
||||||
width: double.infinity,
|
|
||||||
height: double.infinity,
|
|
||||||
decoration: containerRadius(Colors.white, 200),
|
|
||||||
clipBehavior: Clip.antiAlias,
|
|
||||||
padding: EdgeInsets.all(15),
|
|
||||||
margin: EdgeInsets.all(1),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
if (title != null) mHeight(2.w),
|
|
||||||
if (title != null)
|
|
||||||
Txt(
|
|
||||||
title,
|
|
||||||
fontSize: 12.sp,
|
|
||||||
bold: true,
|
|
||||||
color: headingColor,
|
|
||||||
)
|
|
||||||
],
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
navigateTo(context, page) {
|
|
||||||
Navigator.push(context, MaterialPageRoute(builder: (context) => page));
|
|
||||||
}
|
|
||||||
|
|
||||||
circularImage(String im, double width, double height) {
|
|
||||||
return new Container(width: 190.0, height: 190.0, decoration: new BoxDecoration(shape: BoxShape.circle, image: new DecorationImage(fit: BoxFit.fill, image: new AssetImage(im))));
|
|
||||||
}
|
|
||||||
|
|
||||||
circularImage2(String im, double width, double height) {
|
|
||||||
return new Container(width: width, height: height, decoration: new BoxDecoration(shape: BoxShape.circle, image: new DecorationImage(fit: BoxFit.fill, image: new AssetImage(im))));
|
|
||||||
}
|
|
||||||
|
|
||||||
cardRadius(double radius) {
|
|
||||||
return RoundedRectangleBorder(
|
|
||||||
side: BorderSide(color: Colors.transparent, width: 1),
|
|
||||||
borderRadius: BorderRadius.circular(radius),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
cardRadiusWithoutBorder(double radius) {
|
|
||||||
return RoundedRectangleBorder(
|
|
||||||
side: BorderSide(color: Colors.transparent, width: 1),
|
|
||||||
borderRadius: BorderRadius.circular(radius),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Image imageFromBase64String(String base64String) {
|
|
||||||
return Image.memory(base64Decode(base64String));
|
|
||||||
}
|
|
||||||
|
|
||||||
Uint8List dataFromBase64String(String base64String) {
|
|
||||||
return base64Decode(base64String);
|
|
||||||
}
|
|
||||||
|
|
||||||
String base64String(Uint8List data) {
|
|
||||||
return base64Encode(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
Widget overLayWidget({double? width, double? height,List<Color>? color}) {
|
|
||||||
return Container(
|
|
||||||
width: width ?? double.infinity,
|
|
||||||
height: height ?? 60,
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
gradient: LinearGradient(
|
|
||||||
colors: color!=null?color:[
|
|
||||||
Colors.black.withOpacity(0.2),
|
|
||||||
Colors.black.withOpacity(0.1),
|
|
||||||
Colors.black.withOpacity(0.004),
|
|
||||||
],
|
|
||||||
begin: Alignment.topCenter,
|
|
||||||
end: Alignment.bottomCenter,
|
|
||||||
tileMode: TileMode.clamp,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Decoration containerRadius(Color color, double r) {
|
|
||||||
return BoxDecoration(
|
|
||||||
color: color,
|
|
||||||
borderRadius: BorderRadius.all(Radius.circular(r)),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Decoration containerRadiusTop({Color? color, double? r}) {
|
|
||||||
return BoxDecoration(
|
|
||||||
color: color ?? Colors.white,
|
|
||||||
borderRadius: BorderRadius.only(topRight: Radius.circular(r ?? 12), topLeft: Radius.circular(r ?? 12)),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Decoration containerRadiusBorder(Color color, double r) {
|
|
||||||
return BoxDecoration(
|
|
||||||
color: Colors.transparent,
|
|
||||||
border: Border.all(color: color, width: 1),
|
|
||||||
borderRadius: BorderRadius.all(Radius.circular(r)),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Decoration containerRadiusBottom(Color color, double r) {
|
|
||||||
return BoxDecoration(
|
|
||||||
color: color,
|
|
||||||
borderRadius: BorderRadius.only(bottomLeft: Radius.circular(r), bottomRight: Radius.circular(r)),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
ShapeBorder cardRadiusTop(double radius) {
|
|
||||||
return RoundedRectangleBorder(
|
|
||||||
side: BorderSide(color: Colors.transparent, width: 0),
|
|
||||||
borderRadius: BorderRadius.only(topLeft: Radius.circular(radius), topRight: Radius.circular(radius)),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Decoration containerColorRadiusBorderWidth(Color background, double radius, Color color, double w) {
|
|
||||||
return BoxDecoration(
|
|
||||||
color: background,
|
|
||||||
border: Border.all(
|
|
||||||
width: w, //
|
|
||||||
color: color // <--- border width here
|
|
||||||
),
|
|
||||||
borderRadius: BorderRadius.circular(radius),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
ShapeBorder cardRadiusTop2(double radius) {
|
|
||||||
return RoundedRectangleBorder(
|
|
||||||
borderRadius: BorderRadius.only(topLeft: Radius.circular(radius), topRight: Radius.circular(radius)),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
ShapeBorder cardRadiusBottom(double radius) {
|
|
||||||
return RoundedRectangleBorder(
|
|
||||||
borderRadius: BorderRadius.only(bottomLeft: Radius.circular(radius), bottomRight: Radius.circular(radius)),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Decoration containerColorRadiusBorder(Color background, double radius, Color color) {
|
|
||||||
return BoxDecoration(
|
|
||||||
color: background,
|
|
||||||
border: Border.all(
|
|
||||||
width: 1, //
|
|
||||||
color: color // <--- border width here
|
|
||||||
),
|
|
||||||
borderRadius: BorderRadius.circular(radius),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//Decoration appGradient = BoxDecoration(
|
|
||||||
// gradient: LinearGradient(
|
|
||||||
// colors: [
|
|
||||||
// Colors.green[200],
|
|
||||||
// Colors.green,
|
|
||||||
// ],
|
|
||||||
// begin: Alignment.topCenter,
|
|
||||||
// end: Alignment.bottomCenter,
|
|
||||||
// ),
|
|
||||||
//);
|
|
||||||
// launchURL(String url) async {
|
|
||||||
// if (await canLaunch(url)) {
|
|
||||||
// await launch(url);
|
|
||||||
// } else {
|
|
||||||
// throw 'Could not launch $url';
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||