Merge branch 'master' into fatima

# Conflicts:
#	lib/generated/codegen_loader.g.dart
merge-requests/37/head
Fatimah Alshammari 3 years ago
commit 79774416b4

@ -1,3 +1,3 @@
org.gradle.jvmargs=-Xmx1536M
org.gradle.jvmargs=-Xmx1836M
android.useAndroidX=true
android.enableJetifier=true

@ -0,0 +1,72 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="49.66" height="111.094" viewBox="0 0 49.66 111.094">
<defs>
<clipPath id="clip-path">
<rect id="Rectangle_17685" data-name="Rectangle 17685" width="111.63" height="15.945" transform="translate(0 0)" fill="none"/>
</clipPath>
<clipPath id="clip-path-2">
<rect id="Rectangle_17626" data-name="Rectangle 17626" width="111.63" height="15.947" transform="translate(0 0)" fill="none"/>
</clipPath>
<clipPath id="clip-path-4">
<rect id="Rectangle_17684" data-name="Rectangle 17684" width="111.63" height="15.894" transform="translate(0 0)" fill="none"/>
</clipPath>
<clipPath id="clip-path-5">
<rect id="Rectangle_17683" data-name="Rectangle 17683" width="111.63" height="15.748" transform="translate(0 0)" fill="none"/>
</clipPath>
</defs>
<g id="Group_8908" data-name="Group 8908" transform="translate(-84.633 11.461)">
<g id="Group_8886" data-name="Group 8886" transform="matrix(0.309, -0.951, 0.951, 0.309, 84.633, 94.705)">
<g id="Group_8885" data-name="Group 8885" transform="translate(0)" clip-path="url(#clip-path)">
<rect id="Rectangle_17623" data-name="Rectangle 17623" width="111.63" height="15.948" transform="translate(0 0)" fill="#407bff"/>
<g id="Group_8879" data-name="Group 8879" transform="translate(0 0)">
<g id="Group_8878" data-name="Group 8878" clip-path="url(#clip-path-2)">
<g id="Group_8877" data-name="Group 8877" transform="translate(0 0)" style="isolation: isolate">
<g id="Group_8876" data-name="Group 8876" transform="translate(0)">
<g id="Group_8875" data-name="Group 8875" clip-path="url(#clip-path-2)">
<rect id="Rectangle_17624" data-name="Rectangle 17624" width="111.63" height="15.894" transform="translate(0 0)" fill="#fff"/>
</g>
</g>
</g>
</g>
</g>
<rect id="Rectangle_17628" data-name="Rectangle 17628" width="7.973" height="7.973" transform="translate(0 7.974)" fill="#2e353a"/>
<rect id="Rectangle_17631" data-name="Rectangle 17631" width="7.974" height="7.973" transform="translate(7.973 0.001)" fill="#2e353a"/>
<rect id="Rectangle_17632" data-name="Rectangle 17632" width="7.974" height="7.974" transform="translate(15.947 7.973)" fill="#2e353a"/>
<rect id="Rectangle_17635" data-name="Rectangle 17635" width="7.973" height="7.973" transform="translate(23.921 0.001)" fill="#2e353a"/>
<rect id="Rectangle_17636" data-name="Rectangle 17636" width="7.974" height="7.974" transform="translate(31.894 7.973)" fill="#2e353a"/>
<rect id="Rectangle_17639" data-name="Rectangle 17639" width="7.974" height="7.973" transform="translate(39.868 0.001)" fill="#2e353a"/>
<rect id="Rectangle_17640" data-name="Rectangle 17640" width="7.974" height="7.974" transform="translate(47.842 7.973)" fill="#2e353a"/>
<rect id="Rectangle_17643" data-name="Rectangle 17643" width="7.974" height="7.973" transform="translate(55.815 0.001)" fill="#2e353a"/>
<rect id="Rectangle_17644" data-name="Rectangle 17644" width="7.974" height="7.974" transform="translate(63.788 7.973)" fill="#2e353a"/>
<rect id="Rectangle_17647" data-name="Rectangle 17647" width="7.973" height="7.973" transform="translate(71.762 0.001)" fill="#2e353a"/>
<rect id="Rectangle_17648" data-name="Rectangle 17648" width="7.974" height="7.974" transform="translate(79.736 7.973)" fill="#2e353a"/>
<rect id="Rectangle_17651" data-name="Rectangle 17651" width="7.973" height="7.973" transform="translate(87.71 0.001)" fill="#2e353a"/>
<rect id="Rectangle_17652" data-name="Rectangle 17652" width="7.974" height="7.974" transform="translate(95.683 7.973)" fill="#2e353a"/>
<rect id="Rectangle_17654" data-name="Rectangle 17654" width="7.974" height="7.973" transform="translate(103.656 0.001)" fill="#2e353a"/>
<g id="Group_8884" data-name="Group 8884" transform="translate(0 0)">
<g id="Group_8883" data-name="Group 8883" clip-path="url(#clip-path-4)">
<g id="Group_8882" data-name="Group 8882" transform="translate(0 0)" opacity="0.1" style="isolation: isolate">
<g id="Group_8881" data-name="Group 8881" transform="translate(0)">
<g id="Group_8880" data-name="Group 8880" clip-path="url(#clip-path-5)">
<rect id="Rectangle_17656" data-name="Rectangle 17656" width="7.974" height="7.974" transform="translate(0 7.973)" fill="#fff"/>
<rect id="Rectangle_17659" data-name="Rectangle 17659" width="7.974" height="7.974" transform="translate(7.974 0)" fill="#fff"/>
<rect id="Rectangle_17660" data-name="Rectangle 17660" width="7.974" height="7.974" transform="translate(15.947 7.973)" fill="#fff"/>
<rect id="Rectangle_17663" data-name="Rectangle 17663" width="7.974" height="7.974" transform="translate(23.921 0)" fill="#fff"/>
<rect id="Rectangle_17664" data-name="Rectangle 17664" width="7.974" height="7.974" transform="translate(31.894 7.973)" fill="#fff"/>
<rect id="Rectangle_17667" data-name="Rectangle 17667" width="7.974" height="7.974" transform="translate(39.868 0)" fill="#fff"/>
<rect id="Rectangle_17668" data-name="Rectangle 17668" width="7.974" height="7.974" transform="translate(47.842 7.973)" fill="#fff"/>
<rect id="Rectangle_17671" data-name="Rectangle 17671" width="7.974" height="7.974" transform="translate(55.815 0)" fill="#fff"/>
<rect id="Rectangle_17672" data-name="Rectangle 17672" width="7.974" height="7.974" transform="translate(63.788 7.973)" fill="#fff"/>
<rect id="Rectangle_17675" data-name="Rectangle 17675" width="7.974" height="7.974" transform="translate(71.762 0)" fill="#fff"/>
<rect id="Rectangle_17676" data-name="Rectangle 17676" width="7.974" height="7.974" transform="translate(79.736 7.973)" fill="#fff"/>
<rect id="Rectangle_17679" data-name="Rectangle 17679" width="7.974" height="7.974" transform="translate(87.71 0)" fill="#fff"/>
<rect id="Rectangle_17680" data-name="Rectangle 17680" width="7.974" height="7.974" transform="translate(95.683 7.973)" fill="#fff"/>
<rect id="Rectangle_17682" data-name="Rectangle 17682" width="7.974" height="7.974" transform="translate(103.656 0)" fill="#fff"/>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.5 KiB

@ -0,0 +1,223 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="111.471" height="81.697" viewBox="0 0 111.471 81.697">
<defs>
<clipPath id="clip-path">
<rect id="Rectangle_17532" data-name="Rectangle 17532" width="54.986" height="20.029" fill="none"/>
</clipPath>
<clipPath id="clip-path-2">
<rect id="Rectangle_17534" data-name="Rectangle 17534" width="53.565" height="20.029" fill="none"/>
</clipPath>
<clipPath id="clip-path-5">
<rect id="Rectangle_17611" data-name="Rectangle 17611" width="3.17" height="3.078" fill="none"/>
</clipPath>
<clipPath id="clip-path-6">
<rect id="Rectangle_17612" data-name="Rectangle 17612" width="24.935" height="20.245" fill="none"/>
</clipPath>
<clipPath id="clip-path-7">
<rect id="Rectangle_17613" data-name="Rectangle 17613" width="3.055" height="3.482" fill="none"/>
</clipPath>
<clipPath id="clip-path-8">
<rect id="Rectangle_17614" data-name="Rectangle 17614" width="28.702" height="40.403" fill="none"/>
</clipPath>
<clipPath id="clip-path-9">
<rect id="Rectangle_17615" data-name="Rectangle 17615" width="5.095" height="7.494" fill="none"/>
</clipPath>
<clipPath id="clip-path-10">
<rect id="Rectangle_17616" data-name="Rectangle 17616" width="2.545" height="2.051" fill="none"/>
</clipPath>
<clipPath id="clip-path-11">
<rect id="Rectangle_17617" data-name="Rectangle 17617" width="10.274" height="13.454" fill="none"/>
</clipPath>
<clipPath id="clip-path-12">
<rect id="Rectangle_17619" data-name="Rectangle 17619" width="6.621" height="5.261" fill="none"/>
</clipPath>
<clipPath id="clip-path-13">
<rect id="Rectangle_17620" data-name="Rectangle 17620" width="61.469" height="15.006" fill="none"/>
</clipPath>
</defs>
<g id="Group_8889" data-name="Group 8889" transform="translate(-0.31 -9.077)">
<g id="Group_8902" data-name="Group 8902">
<rect id="Rectangle_17523" data-name="Rectangle 17523" width="26.188" height="0.075" transform="translate(22.754 84.584)" fill="#ebebeb"/>
<g id="Group_8796" data-name="Group 8796" transform="translate(-14 -13.831)">
<g id="Group_8903" data-name="Group 8903">
<path id="Path_13976" data-name="Path 13976" d="M375.306,83.743l1.573-.7H389.2l2.8,5.96v1.567Z" transform="translate(-270.385 -58.043)" fill="#e0e0e0"/>
<rect id="Rectangle_17524" data-name="Rectangle 17524" width="1.229" height="49.47" transform="translate(114.478 30.231)" fill="#e0e0e0"/>
<path id="Path_13977" data-name="Path 13977" d="M392.3,92.514H378.694l-3.123-6.829h13.605Z" transform="translate(-270.576 -59.887)" fill="#f0f0f0"/>
<path id="Path_13978" data-name="Path 13978" d="M383.558,88.875c.321.7.022,1.271-.667,1.271a2.248,2.248,0,0,1-1.829-1.271c-.321-.7-.022-1.271.667-1.271a2.247,2.247,0,0,1,1.829,1.271" transform="translate(-274.439 -61.228)" fill="#fafafa"/>
<path id="Path_13979" data-name="Path 13979" d="M394.938,88.875c.321.7.022,1.271-.667,1.271a2.247,2.247,0,0,1-1.829-1.271c-.321-.7-.022-1.271.667-1.271a2.247,2.247,0,0,1,1.829,1.271" transform="translate(-282.637 -61.228)" fill="#fafafa"/>
<path id="Path_13980" data-name="Path 13980" d="M406.318,88.875c.321.7.022,1.271-.667,1.271a2.248,2.248,0,0,1-1.829-1.271c-.321-.7-.022-1.271.667-1.271a2.247,2.247,0,0,1,1.829,1.271" transform="translate(-290.836 -61.228)" fill="#fafafa"/>
<path id="Path_13981" data-name="Path 13981" d="M417.7,88.875c.321.7.022,1.271-.667,1.271a2.247,2.247,0,0,1-1.829-1.271c-.321-.7-.022-1.271.667-1.271a2.247,2.247,0,0,1,1.829,1.271" transform="translate(-299.034 -61.228)" fill="#fafafa"/>
<path id="Path_13982" data-name="Path 13982" d="M388.681,99.278c.321.7.022,1.271-.667,1.271a2.247,2.247,0,0,1-1.829-1.271c-.321-.7-.022-1.271.667-1.271a2.247,2.247,0,0,1,1.829,1.271" transform="translate(-278.13 -68.499)" fill="#fafafa"/>
<path id="Path_13983" data-name="Path 13983" d="M400.061,99.278c.321.7.022,1.271-.667,1.271a2.247,2.247,0,0,1-1.829-1.271c-.321-.7-.022-1.271.667-1.271a2.247,2.247,0,0,1,1.829,1.271" transform="translate(-286.328 -68.499)" fill="#fafafa"/>
<path id="Path_13984" data-name="Path 13984" d="M411.442,99.278c.321.7.022,1.271-.667,1.271a2.247,2.247,0,0,1-1.829-1.271c-.321-.7-.022-1.271.667-1.271a2.247,2.247,0,0,1,1.829,1.271" transform="translate(-294.527 -68.499)" fill="#fafafa"/>
<path id="Path_13985" data-name="Path 13985" d="M422.821,99.278c.321.7.022,1.271-.667,1.271a2.247,2.247,0,0,1-1.829-1.271c-.321-.7-.022-1.271.667-1.271a2.247,2.247,0,0,1,1.829,1.271" transform="translate(-302.725 -68.499)" fill="#fafafa"/>
<path id="Path_13986" data-name="Path 13986" d="M106.306,83.743l1.573-.7H120.2l2.8,5.96v1.567Z" transform="translate(-76.587 -58.043)" fill="#e0e0e0"/>
<rect id="Rectangle_17525" data-name="Rectangle 17525" width="1.229" height="49.47" transform="translate(39.276 30.231)" fill="#e0e0e0"/>
<path id="Path_13987" data-name="Path 13987" d="M123.3,92.514H109.694l-3.123-6.829h13.605Z" transform="translate(-76.778 -59.887)" fill="#f0f0f0"/>
<path id="Path_13988" data-name="Path 13988" d="M114.558,88.875c.321.7.022,1.271-.667,1.271a2.247,2.247,0,0,1-1.829-1.271c-.321-.7-.022-1.271.667-1.271a2.247,2.247,0,0,1,1.829,1.271" transform="translate(-80.641 -61.228)" fill="#fafafa"/>
<path id="Path_13989" data-name="Path 13989" d="M125.939,88.875c.321.7.022,1.271-.667,1.271a2.247,2.247,0,0,1-1.829-1.271c-.321-.7-.022-1.271.667-1.271a2.247,2.247,0,0,1,1.829,1.271" transform="translate(-88.84 -61.228)" fill="#fafafa"/>
<path id="Path_13990" data-name="Path 13990" d="M137.318,88.875c.321.7.022,1.271-.667,1.271a2.247,2.247,0,0,1-1.829-1.271c-.321-.7-.022-1.271.667-1.271a2.247,2.247,0,0,1,1.829,1.271" transform="translate(-97.037 -61.228)" fill="#fafafa"/>
<path id="Path_13991" data-name="Path 13991" d="M148.7,88.875c.321.7.022,1.271-.667,1.271a2.247,2.247,0,0,1-1.829-1.271c-.321-.7-.022-1.271.667-1.271a2.247,2.247,0,0,1,1.829,1.271" transform="translate(-105.236 -61.228)" fill="#fafafa"/>
<path id="Path_13992" data-name="Path 13992" d="M119.681,99.278c.321.7.022,1.271-.667,1.271a2.247,2.247,0,0,1-1.829-1.271c-.321-.7-.022-1.271.667-1.271a2.247,2.247,0,0,1,1.829,1.271" transform="translate(-84.332 -68.499)" fill="#fafafa"/>
<path id="Path_13993" data-name="Path 13993" d="M131.061,99.278c.321.7.022,1.271-.667,1.271a2.247,2.247,0,0,1-1.829-1.271c-.321-.7-.022-1.271.667-1.271a2.247,2.247,0,0,1,1.829,1.271" transform="translate(-92.53 -68.499)" fill="#fafafa"/>
<path id="Path_13994" data-name="Path 13994" d="M142.441,99.278c.321.7.022,1.271-.667,1.271a2.248,2.248,0,0,1-1.829-1.271c-.321-.7-.022-1.271.667-1.271a2.247,2.247,0,0,1,1.829,1.271" transform="translate(-100.729 -68.499)" fill="#fafafa"/>
<path id="Path_13995" data-name="Path 13995" d="M153.822,99.278c.321.7.022,1.271-.667,1.271a2.247,2.247,0,0,1-1.829-1.271c-.321-.7-.022-1.271.667-1.271a2.247,2.247,0,0,1,1.829,1.271" transform="translate(-108.928 -68.499)" fill="#fafafa"/>
<path id="Path_13996" data-name="Path 13996" d="M227.482,166.051H170.545v6.925h-7.227V180.2h-7.012v6.925h-7.288v22.882h78.464Z" transform="translate(-107.359 -116.056)" fill="#e0e0e0"/>
<rect id="Rectangle_17526" data-name="Rectangle 17526" width="48.83" height="6.254" transform="translate(63.186 50.666)" fill="#ebebeb"/>
<rect id="Rectangle_17527" data-name="Rectangle 17527" width="48.872" height="6.457" transform="translate(55.959 57.689)" fill="#ebebeb"/>
<rect id="Rectangle_17528" data-name="Rectangle 17528" width="48.849" height="6.358" transform="translate(48.948 64.712)" fill="#ebebeb"/>
<rect id="Rectangle_17529" data-name="Rectangle 17529" width="48.83" height="6.254" transform="translate(41.66 71.823)" fill="#ebebeb"/>
</g>
</g>
<g id="Group_8803" data-name="Group 8803" transform="translate(-14 -17.831)">
<g id="Group_8904" data-name="Group 8904">
<g id="Group_8801" data-name="Group 8801" transform="translate(17.645 78.597)" style="isolation: isolate">
<g id="Group_8800" data-name="Group 8800">
<g id="Group_8799" data-name="Group 8799" clip-path="url(#clip-path)">
<path id="Path_13998" data-name="Path 13998" d="M118.1,281.077H67.812l1.112-19.237,44.482-.792Z" transform="translate(-63.115 -261.048)" fill="#126055"/>
</g>
</g>
</g>
</g>
</g>
<path id="Path_13999" data-name="Path 13999" d="M101.091,261.048l-44.6,1.146-7.765,18.883h47.67Z" transform="translate(-47.216 -200.282)" fill="#407bff"/>
<g id="Group_8811" data-name="Group 8811" transform="translate(-14 -17.831)">
<g id="Group_8905" data-name="Group 8905">
<g id="Group_8806" data-name="Group 8806" transform="translate(14.31 78.597)" style="isolation: isolate">
<g id="Group_8805" data-name="Group 8805">
<g id="Group_8804" data-name="Group 8804" clip-path="url(#clip-path-2)">
<path id="Path_14000" data-name="Path 14000" d="M98.713,261.048l-44.552.705L46.1,281.076H94.22Z" transform="translate(-45.148 -261.048)" fill="#2bb8a6"/>
</g>
</g>
</g>
<g id="Group_8809" data-name="Group 8809" transform="translate(70.795 78.597)" style="isolation: isolate">
<g id="Group_8808" data-name="Group 8808">
<g id="Group_8807" data-name="Group 8807" clip-path="url(#clip-path)">
<path id="Path_14001" data-name="Path 14001" d="M308.221,281.077h-50.29l-4.7-20.029h50.29Z" transform="translate(-253.235 -261.048)" fill="#126055"/>
</g>
</g>
</g>
</g>
</g>
<path id="Path_14002" data-name="Path 14002" d="M291.211,261.048h-50.29l-4.7,20.029h50.29Z" transform="translate(-184.185 -200.282)" fill="#407bff"/>
<g id="Group_8816" data-name="Group 8816" transform="translate(-14 -17.831)">
<g id="Group_8906" data-name="Group 8906">
<g id="Group_8814" data-name="Group 8814" transform="translate(66.039 78.597)" style="isolation: isolate">
<g id="Group_8813" data-name="Group 8813">
<g id="Group_8812" data-name="Group 8812" clip-path="url(#clip-path)">
<path id="Path_14003" data-name="Path 14003" d="M291.211,261.048h-50.29l-4.7,20.029h50.29Z" transform="translate(-236.224 -261.048)" fill="#2bb8a6"/>
</g>
</g>
</g>
</g>
</g>
<g id="Group_8865" data-name="Group 8865" transform="translate(-14 -17.831)">
<g id="Group_8901" data-name="Group 8901">
<path id="Path_14006" data-name="Path 14006" d="M233.648,116.585a3.128,3.128,0,0,0-3.22-1.913c-2.516.25-4.939,3.663-7.222,2.961s-2-2.249-2-2.249-.839,2.227,2,4.095,6.7-2.849,9.921-1.444Z" transform="translate(-159.279 -80.134)" fill="#2e353a"/>
<path id="Path_14007" data-name="Path 14007" d="M240.7,114.478a4.2,4.2,0,0,0-3.5-2.829c-2.691-.226-4.263,3.437-6.325,2.829" transform="translate(-166.331 -78.027)" fill="none" stroke="#263238" stroke-linecap="round" stroke-linejoin="round" stroke-width="0.48"/>
<path id="Path_14008" data-name="Path 14008" d="M267.912,122.383s.956-4.252-2.358-5.11-4.805,1.234-5.364,3.55.851,5.538,3.85,5.006,3.751-2.438,3.871-3.446" transform="translate(-187.365 -81.827)" fill="#2e353a"/>
<path id="Path_14009" data-name="Path 14009" d="M288.639,115.829c2.724-1.365,6.3-4.351,6.235-5.439s-2.813-8.4-2.813-8.4a2.068,2.068,0,0,1-.631-.323c-.27-.218-.607-2.908-.2-3.054a11.433,11.433,0,0,1,2.093-.364c.337,0,.2,2.4.067,2.981,0,0,4.357,6.539,4.069,9.668s-7.04,8.572-9.4,9.341.585-4.41.585-4.41" transform="translate(-206.865 -68.668)" fill="#e4897b"/>
<path id="Path_14010" data-name="Path 14010" d="M186.8,270.838l.772-1.769,2.415.868,2.214.8-.6,2.261-2.542-1.142Z" transform="translate(-134.582 -188.057)" fill="#e4897b"/>
<path id="Path_14011" data-name="Path 14011" d="M177.621,264.516c.179.1-1.009,2.421-1.009,2.421a7.677,7.677,0,0,0-2.974,2.043c-.938,1.274-1.387.07-.688-1.531l1.728-3.96c.5-1.137,1.086.029,2.943,1.027" transform="translate(-124.355 -183.83)" fill="#2e353a"/>
<path id="Path_14012" data-name="Path 14012" d="M183.027,277.67a.233.233,0,0,1-.049-.005.242.242,0,0,1-.212-.178c-.078-.333.615-.966.755-1.089a.063.063,0,0,1,.027-.014h0s.008,0,.013,0a.076.076,0,0,1,.038.013h0s0,0,0,0h0l0,0h0a1.566,1.566,0,0,1,.434.873.417.417,0,0,1-.143.306c-.1.085-.181.106-.256.063-.114-.066-.157-.3-.168-.54a1.1,1.1,0,0,1-.289.51.261.261,0,0,1-.157.057m.435-1.034c-.293.283-.607.661-.57.817,0,.014.013.055.111.076a.132.132,0,0,0,.108-.029,1.8,1.8,0,0,0,.352-.863m.15-.021c-.03.419-.006.849.091.906.03.018.083-.023.112-.048a.277.277,0,0,0,.1-.2,1.2,1.2,0,0,0-.3-.654" transform="translate(-131.667 -193.169)" fill="#407bff"/>
<g id="Group_8845" data-name="Group 8845" transform="translate(54.432 81.856)" opacity="0.2" style="isolation: isolate">
<g id="Group_8844" data-name="Group 8844">
<g id="Group_8843" data-name="Group 8843" clip-path="url(#clip-path-5)">
<path id="Path_14013" data-name="Path 14013" d="M194.7,273.79l.934-1.916,2.236.811-.588,2.267Z" transform="translate(-194.704 -271.874)"/>
</g>
</g>
</g>
<path id="Path_14014" data-name="Path 14014" d="M223.861,235.868c-1.012,4.721-5.537,20.832-12.57,20.228s-12.2-4.774-12.345-6.678.4-2.95,2.159-2.954,6.907,1.7,9.153,1.524,4.342-10.438,4.342-10.438Z" transform="translate(-143.313 -164.853)" fill="#407bff"/>
<g id="Group_8848" data-name="Group 8848" transform="translate(55.612 71.015)" style="isolation: isolate">
<g id="Group_8847" data-name="Group 8847">
<g id="Group_8846" data-name="Group 8846" clip-path="url(#clip-path-6)">
<path id="Path_14015" data-name="Path 14015" d="M223.861,235.868c-1.012,4.721-5.537,20.832-12.57,20.228s-12.2-4.774-12.345-6.678.4-2.95,2.159-2.954,6.907,1.7,9.153,1.524,4.342-10.438,4.342-10.438Z" transform="translate(-198.925 -235.868)" fill="#157e8c"/>
</g>
</g>
</g>
<path id="Path_14016" data-name="Path 14016" d="M341.771,336.388l-1.666.776-1.276-2.372-1.168-2.178,1.839-1.267,1.2,2.668Z" transform="translate(-243.263 -231.585)" fill="#e4897b"/>
<path id="Path_14017" data-name="Path 14017" d="M344.957,348.294c-.075-.2,2.244-1.1,2.244-1.1a7.267,7.267,0,0,0,3.485.589c1.486-.286,1.082.937-.425,1.639l-3.729,1.736c-1.071.5-.8-.8-1.575-2.868" transform="translate(-248.519 -242.663)" fill="#2e353a"/>
<path id="Path_14018" data-name="Path 14018" d="M354.247,345.2a1.5,1.5,0,0,0-.169.026h-.038a.2.2,0,0,1-.058-.034v-.022a.028.028,0,0,0-.006-.02s.006-.011.006-.016h0c0-.009.013-.019.013-.029a1.661,1.661,0,0,1,.221-.963.365.365,0,0,1,.3-.127c.124,0,.2.05.233.135.044.131-.064.334-.2.524a.948.948,0,0,1,.531-.176.258.258,0,0,1,.187.108.3.3,0,0,1,.049.3c-.119.248-.739.3-1.065.3m.784-.567a1.708,1.708,0,0,0-.763.4c.393,0,.861-.062.929-.206.006-.013.024-.051-.037-.135a.135.135,0,0,0-.1-.055l-.03,0m-.525-.611c-.074,0-.135.092-.186.149a1.327,1.327,0,0,0-.177.735c.279-.292.526-.68.488-.792a.172.172,0,0,0-.113-.092Z" transform="translate(-255.017 -240.437)" fill="#407bff"/>
<g id="Group_8851" data-name="Group 8851" transform="translate(94.406 99.775)" opacity="0.2" style="isolation: isolate">
<g id="Group_8850" data-name="Group 8850">
<g id="Group_8849" data-name="Group 8849" clip-path="url(#clip-path-7)">
<path id="Path_14019" data-name="Path 14019" d="M340.75,334.1l-1.878.77-1.178-2.2,1.834-1.28Z" transform="translate(-337.695 -331.388)"/>
</g>
</g>
</g>
<path id="Path_14020" data-name="Path 14020" d="M249.431,204.77s-3.9,6.256-3.1,10.916c.942,5.5,13.25,11.694,16.6,14.431s4.927,13.073,9.1,15.056l2.274-.878a5.739,5.739,0,0,0,.292-4.65c-3.631-12.285-6.636-18.156-16.666-25.512a62.225,62.225,0,0,0,.383-8.972Z" transform="translate(-177.386 -143.118)" fill="#407bff"/>
<g id="Group_8854" data-name="Group 8854" transform="translate(68.833 61.652)" style="isolation: isolate">
<g id="Group_8853" data-name="Group 8853">
<g id="Group_8852" data-name="Group 8852" clip-path="url(#clip-path-8)">
<path id="Path_14021" data-name="Path 14021" d="M249.431,204.77s-3.9,6.256-3.1,10.916c.942,5.5,13.25,11.694,16.6,14.431s4.927,13.073,9.1,15.056l2.274-.878a5.739,5.739,0,0,0,.292-4.65c-3.631-12.285-6.636-18.156-16.666-25.512a62.225,62.225,0,0,0,.383-8.972Z" transform="translate(-246.219 -204.77)" fill="#1d92aa"/>
</g>
</g>
</g>
<path id="Path_14022" data-name="Path 14022" d="M278.512,244.82l-.559.217c-1.269-1.74-2.306-4.878-3.394-8.171-1.155-3.49-2.348-7.1-3.754-8.53a57.1,57.1,0,0,0-5.661-4.384c-5.13-3.712-10.948-7.918-11.336-10.484-.411-2.728.883-6.612,1.658-8.611l.6.027c-.735,1.876-2.105,5.844-1.7,8.488.349,2.306,6.559,6.8,11.093,10.08a57.033,57.033,0,0,1,5.737,4.447c1.5,1.532,2.664,5.043,3.894,8.764,1.062,3.213,2.158,6.527,3.427,8.156" transform="translate(-182.796 -143.179)" fill="#126055"/>
<g id="Group_8857" data-name="Group 8857" transform="translate(75.901 63.521)" opacity="0.1" style="isolation: isolate">
<g id="Group_8856" data-name="Group 8856">
<g id="Group_8855" data-name="Group 8855" clip-path="url(#clip-path-9)">
<path id="Path_14023" data-name="Path 14023" d="M276.146,218.472s-2.06-1.451-4.646-3.258l3.777,1.629a17.714,17.714,0,0,0,1.317-5.865c.034,3.146-.447,7.494-.447,7.494" transform="translate(-271.5 -210.978)"/>
</g>
</g>
</g>
<path id="Path_14024" data-name="Path 14024" d="M254.676,166.173l8.951.987a85.559,85.559,0,0,0,2.188-16.281,16.509,16.509,0,0,1-6.508.8,16.257,16.257,0,0,1-5.807-2.133,110.806,110.806,0,0,1,1.176,16.627" transform="translate(-182.631 -104.521)" fill="#2e353a"/>
<path id="Path_14025" data-name="Path 14025" d="M270.6,150.361a4.087,4.087,0,0,1-2.663-1.682c1.54-1.207.685-3.784.685-3.784l2.545.882a8.849,8.849,0,0,0-.242,1.168c-.222,1.7.492,1.816.492,1.816.348.986-.816,1.6-.816,1.6" transform="translate(-193.029 -101.27)" fill="#e4897b"/>
<g id="Group_8860" data-name="Group 8860" transform="translate(75.589 43.625)" opacity="0.2" style="isolation: isolate">
<g id="Group_8859" data-name="Group 8859">
<g id="Group_8858" data-name="Group 8858" clip-path="url(#clip-path-10)">
<path id="Path_14026" data-name="Path 14026" d="M272.928,145.777a8.851,8.851,0,0,0-.242,1.168,3.024,3.024,0,0,1-2.3-2.05Z" transform="translate(-270.383 -144.895)"/>
</g>
</g>
</g>
<path id="Path_14027" data-name="Path 14027" d="M269.361,121.076c2.282.178,2.928,1.551,2.925,4.1,0,3.181-.806,5.379-3.614,4.481-3.813-1.22-3.1-8.872.689-8.577" transform="translate(-191.738 -84.616)" fill="#e4897b"/>
<path id="Path_14028" data-name="Path 14028" d="M282.814,133.863a5.312,5.312,0,0,0,.6,1.071.61.61,0,0,1-.62.231Z" transform="translate(-203.732 -93.559)" fill="#de5753"/>
<path id="Path_14029" data-name="Path 14029" d="M276.76,131.956c-.009.2-.118.361-.243.354s-.219-.176-.21-.378.118-.361.243-.354.219.176.21.378" transform="translate(-199.062 -91.962)" fill="#2e353a"/>
<path id="Path_14030" data-name="Path 14030" d="M276.99,131.251l.416-.151s-.22.359-.416.151" transform="translate(-199.554 -91.628)" fill="#2e353a"/>
<path id="Path_14031" data-name="Path 14031" d="M285.117,132.224c-.009.2-.118.361-.243.354s-.219-.176-.21-.378.118-.361.243-.354.219.176.21.378" transform="translate(-205.082 -92.15)" fill="#2e353a"/>
<path id="Path_14032" data-name="Path 14032" d="M285.346,131.52l.416-.151s-.22.359-.416.151" transform="translate(-205.574 -91.816)" fill="#2e353a"/>
<path id="Path_14033" data-name="Path 14033" d="M275.641,127.141a1.127,1.127,0,0,0-1.015.294" transform="translate(-197.851 -88.846)" fill="none" stroke="#263238" stroke-linecap="round" stroke-linejoin="round" stroke-width="0.696"/>
<path id="Path_14034" data-name="Path 14034" d="M284.213,127.23a1.009,1.009,0,0,1,.9.273" transform="translate(-204.758 -88.909)" fill="none" stroke="#263238" stroke-linecap="round" stroke-linejoin="round" stroke-width="0.696"/>
<path id="Path_14035" data-name="Path 14035" d="M277.4,139.972a6.506,6.506,0,0,0-.323.833c-.049-.008-.1-.016-.146-.026-.659-.124-.927-.416-1.024-.7a1,1,0,0,1-.037-.438.959.959,0,0,1,.059-.244,3.027,3.027,0,0,0,1.247.532c.137.033.224.046.224.046" transform="translate(-198.74 -97.425)" fill="#2e353a"/>
<path id="Path_14036" data-name="Path 14036" d="M277.2,139.926l-.1.243a1.926,1.926,0,0,1-1.2-.531.952.952,0,0,1,.059-.244,3.026,3.026,0,0,0,1.247.532" transform="translate(-198.765 -97.425)" fill="#fff"/>
<path id="Path_14037" data-name="Path 14037" d="M277.048,142.361c-.659-.124-.927-.416-1.024-.7a2.066,2.066,0,0,1,.707.294.86.86,0,0,1,.317.409" transform="translate(-198.858 -99.008)" fill="#de5753"/>
<path id="Path_14038" data-name="Path 14038" d="M265.157,122.691a7.738,7.738,0,0,0,1.146-3.507s4.656-1.637,4.547,3.323c0,0,.737-4.355-3.179-4.758s-4.315,5.778-2.413,7.778a3.252,3.252,0,0,1-.1-2.835" transform="translate(-190.307 -82.283)" fill="#2e353a"/>
<path id="Path_14039" data-name="Path 14039" d="M264.724,133.543a1.048,1.048,0,0,0-1.011-1.069c-.713.028-1.155,1.565.579,2.078.249.074.409-.181.432-1.009" transform="translate(-189.536 -92.588)" fill="#e4897b"/>
<path id="Path_14040" data-name="Path 14040" d="M237.873,107.488a8.912,8.912,0,0,1,.736,6.06s-6.188-7.417-6.747-9.109,3.469-11.327,3.469-11.327a9.2,9.2,0,0,1-.533-2.484c.14-.452,1.887-1.505,2.306-1.2s.28,3.613.07,4.065l-.21.452s-2.154,8.725-1.881,9.368,2.789,4.18,2.789,4.18" transform="translate(-167.005 -62.462)" fill="#e4897b"/>
<path id="Path_14041" data-name="Path 14041" d="M267.432,119.779s-2.449,3.95-5.7,3.317c0,0-.159-2.991,2.016-3.648a4.62,4.62,0,0,1,3.683.33" transform="translate(-188.561 -83.327)" fill="#2e353a"/>
<path id="Path_14042" data-name="Path 14042" d="M276.032,121.068s1.02,1.65-1.759,2.741" transform="translate(-197.597 -84.617)" fill="none" stroke="#263238" stroke-linecap="round" stroke-linejoin="round" stroke-width="0.48"/>
<path id="Path_14043" data-name="Path 14043" d="M284.369,119.5s1.17,1.158,1.656-.5" transform="translate(-204.87 -83.169)" fill="none" stroke="#263238" stroke-linecap="round" stroke-linejoin="round" stroke-width="0.48"/>
<path id="Path_14044" data-name="Path 14044" d="M266.271,166.48l.253-.464s-.312-.1-.854-.235c.227-1.683.93-8.052-.785-12.184l-.318.263a8.484,8.484,0,0,1,.874,3.876l-5.924-.038s-.68-3.575-1.522-4.673l-.212.107a28.5,28.5,0,0,1,1.248,12.016,16.047,16.047,0,0,0-2.78.416l.226.452a32.211,32.211,0,0,1,5.022-.216l3.113.306a15.805,15.805,0,0,1,1.66.374" transform="translate(-184.612 -106.953)" fill="#407bff"/>
<g id="Group_8863" data-name="Group 8863" transform="translate(71.638 46.074)" style="isolation: isolate">
<g id="Group_8862" data-name="Group 8862">
<g id="Group_8861" data-name="Group 8861" clip-path="url(#clip-path-11)">
<path id="Path_14045" data-name="Path 14045" d="M266.271,166.48l.253-.464s-.312-.1-.854-.235c.227-1.683.93-8.052-.785-12.184l-.318.263a8.484,8.484,0,0,1,.874,3.876l-5.924-.038s-.68-3.575-1.522-4.673l-.212.107a28.5,28.5,0,0,1,1.248,12.016,16.047,16.047,0,0,0-2.78.416l.226.452a32.211,32.211,0,0,1,5.022-.216l3.113.306a15.805,15.805,0,0,1,1.66.374" transform="translate(-256.25 -153.026)" fill="#fff"/>
</g>
</g>
</g>
<path id="Path_14046" data-name="Path 14046" d="M274.7,176.706a1.261,1.261,0,0,1-.229.816.864.864,0,0,1-.71.28.848.848,0,0,1-.685-.274,1.184,1.184,0,0,1-.232-.786v-.108h.582v.15a.471.471,0,0,0,.087.322.3.3,0,0,0,.232.093.308.308,0,0,0,.252-.108.675.675,0,0,0,.089-.409v-.771a.636.636,0,0,1-1.082.126,1.256,1.256,0,0,1-.171-.717v-.771a1.156,1.156,0,0,1,.24-.786,1.014,1.014,0,0,1,1.387,0,1.156,1.156,0,0,1,.24.786Zm-.934-1.024a.3.3,0,0,0,.232-.094.47.47,0,0,0,.087-.322v-.759a.459.459,0,0,0-.087-.319.343.343,0,0,0-.464,0,.459.459,0,0,0-.087.319v.759a.469.469,0,0,0,.087.322.3.3,0,0,0,.232.094" transform="translate(-196.557 -121.255)" fill="#125765"/>
<path id="Path_14047" data-name="Path 14047" d="M282.617,176.706a1.261,1.261,0,0,1-.229.816.864.864,0,0,1-.71.28.848.848,0,0,1-.685-.274,1.184,1.184,0,0,1-.232-.786v-.108h.582v.15a.471.471,0,0,0,.087.322.3.3,0,0,0,.232.093.308.308,0,0,0,.252-.108.674.674,0,0,0,.09-.409v-.771a.636.636,0,0,1-1.082.126,1.257,1.257,0,0,1-.171-.717v-.771a1.156,1.156,0,0,1,.24-.786,1.014,1.014,0,0,1,1.387,0,1.156,1.156,0,0,1,.24.786Zm-.934-1.024a.3.3,0,0,0,.232-.094.469.469,0,0,0,.087-.322v-.759a.459.459,0,0,0-.087-.319.343.343,0,0,0-.464,0,.459.459,0,0,0-.087.319v.759a.469.469,0,0,0,.087.322.3.3,0,0,0,.232.094" transform="translate(-202.263 -121.255)" fill="#125765"/>
</g>
</g>
<g id="Group_8873" data-name="Group 8873" transform="translate(-14 -17.831)">
<g id="Group_8907" data-name="Group 8907">
<path id="Path_14048" data-name="Path 14048" d="M335.17,173.594a35.718,35.718,0,0,0-24.292-.479c-3.483,1.135-7.173,2.571-10.74,3.962q-1.448.564-2.9,1.126c-.542.209-1.5.615-1.581,1.194l.877,2.27c1.8-.674,2.709-1.04,4.557-1.76,3.534-1.376,7.19-2.8,10.6-3.911a34.29,34.29,0,0,1,20.62-.271l.763-.527-.372-.7h1.026l-1.026-.9h2.469Z" transform="translate(-213.001 -119.689)" fill="#2bb8a6"/>
<path id="Path_14049" data-name="Path 14049" d="M295.981,198.514s4.729.235,6.243,1.154l.047-2.47s-.022-.151-.452-.161c-1.46-.032-4.659-.34-5.414-.763-1.717-.963.781-1.868.781-1.868s-1.578.532-1.535,1.176a10.421,10.421,0,0,1,.33,2.931" transform="translate(-212.998 -135.875)" fill="#407bff"/>
<g id="Group_8868" data-name="Group 8868" transform="translate(82.653 58.532)" style="isolation: isolate">
<g id="Group_8867" data-name="Group 8867">
<g id="Group_8866" data-name="Group 8866" clip-path="url(#clip-path-12)">
<path id="Path_14050" data-name="Path 14050" d="M295.981,198.514s4.729.235,6.243,1.154l.047-2.47s-.022-.151-.452-.161c-1.46-.032-4.659-.34-5.414-.763-1.717-.963.781-1.868.781-1.868s-1.578.532-1.535,1.176a10.421,10.421,0,0,1,.33,2.931" transform="translate(-295.651 -194.407)" fill="#126055"/>
</g>
</g>
</g>
<g id="Group_8871" data-name="Group 8871" transform="translate(28.236 50.054)" style="isolation: isolate">
<g id="Group_8870" data-name="Group 8870">
<g id="Group_8869" data-name="Group 8869" clip-path="url(#clip-path-13)">
<path id="Path_14051" data-name="Path 14051" d="M162.458,180.077a.486.486,0,0,1-.308.569,14.681,14.681,0,0,1-4.38.608c-6.352,0-14.316-3.1-22.642-6.347-3.534-1.376-7.19-2.8-10.6-3.911a34.288,34.288,0,0,0-20.62-.271l-.763-.527.372-.7H102.49l1.026-.9H101v0a35.8,35.8,0,0,1,24.316-.479c3.483,1.135,7.185,2.572,10.752,3.962,9.673,3.77,20.479,7,25.608,5.573.328-.092.3-.186.212-.237a.369.369,0,0,0-.136-.042c.248.015.294.12.3.216a21.119,21.119,0,0,0,.409,2.491" transform="translate(-101 -166.248)" fill="#2bb8a6"/>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 27 KiB

@ -0,0 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" width="68.328" height="71.199" viewBox="0 0 68.328 71.199">
<g id="light-bulb" transform="translate(-9.8)" opacity="0.07">
<path id="XMLID_49_" d="M52.08,62.218V64.3a3.3,3.3,0,0,1-2.8,3.267l-.513,1.89A2.352,2.352,0,0,1,46.5,71.2H41.415a2.352,2.352,0,0,1-2.271-1.743l-.5-1.89a3.314,3.314,0,0,1-2.813-3.282V62.2A2,2,0,0,1,37.84,60.2H50.073A2.023,2.023,0,0,1,52.08,62.218Zm9.42-28.04a17.452,17.452,0,0,1-4.922,12.174,16.084,16.084,0,0,0-4.307,8.731A2.9,2.9,0,0,1,49.4,57.53H38.514A2.872,2.872,0,0,1,35.657,55.1a16.263,16.263,0,0,0-4.336-8.761A17.538,17.538,0,1,1,61.5,34.178ZM45.942,23.557a1.979,1.979,0,0,0-1.978-1.978A12.67,12.67,0,0,0,31.306,34.237a1.978,1.978,0,1,0,3.955,0,8.713,8.713,0,0,1,8.7-8.7A1.97,1.97,0,0,0,45.942,23.557ZM43.964,10.885a1.979,1.979,0,0,0,1.978-1.978V1.978a1.978,1.978,0,0,0-3.955,0V8.907A1.979,1.979,0,0,0,43.964,10.885ZM20.685,34.164a1.979,1.979,0,0,0-1.978-1.978H11.778a1.978,1.978,0,0,0,0,3.955h6.929A1.97,1.97,0,0,0,20.685,34.164ZM76.15,32.186H69.22a1.978,1.978,0,0,0,0,3.955H76.15a1.978,1.978,0,0,0,0-3.955ZM24.714,50.63l-4.908,4.908a1.973,1.973,0,0,0,2.783,2.8L27.5,53.428a1.973,1.973,0,1,0-2.783-2.8ZM61.822,18.283a1.975,1.975,0,0,0,1.392-.571L68.122,12.8a1.979,1.979,0,1,0-2.8-2.8l-4.908,4.908a1.972,1.972,0,0,0,0,2.8A2.009,2.009,0,0,0,61.822,18.283ZM24.714,17.7A1.973,1.973,0,1,0,27.5,14.9L22.589,9.991a1.979,1.979,0,0,0-2.8,2.8Zm38.5,32.933a1.979,1.979,0,0,0-2.8,2.8l4.908,4.908a1.973,1.973,0,0,0,2.784-2.8Z" fill="#fff"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

@ -0,0 +1,309 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="333" height="88.222" viewBox="0 0 333 88.222">
<defs>
<clipPath id="clip-path">
<rect id="Rectangle_17532" data-name="Rectangle 17532" width="54.986" height="20.029" fill="none"/>
</clipPath>
<clipPath id="clip-path-2">
<rect id="Rectangle_17534" data-name="Rectangle 17534" width="53.565" height="20.029" fill="none"/>
</clipPath>
<clipPath id="clip-path-5">
<rect id="Rectangle_17611" data-name="Rectangle 17611" width="3.17" height="3.078" fill="none"/>
</clipPath>
<clipPath id="clip-path-6">
<rect id="Rectangle_17612" data-name="Rectangle 17612" width="24.935" height="20.245" fill="none"/>
</clipPath>
<clipPath id="clip-path-7">
<rect id="Rectangle_17613" data-name="Rectangle 17613" width="3.055" height="3.482" fill="none"/>
</clipPath>
<clipPath id="clip-path-8">
<rect id="Rectangle_17614" data-name="Rectangle 17614" width="28.702" height="40.403" fill="none"/>
</clipPath>
<clipPath id="clip-path-9">
<rect id="Rectangle_17615" data-name="Rectangle 17615" width="5.095" height="7.494" fill="none"/>
</clipPath>
<clipPath id="clip-path-10">
<rect id="Rectangle_17616" data-name="Rectangle 17616" width="2.545" height="2.051" fill="none"/>
</clipPath>
<clipPath id="clip-path-11">
<rect id="Rectangle_17617" data-name="Rectangle 17617" width="10.274" height="13.454" fill="none"/>
</clipPath>
<clipPath id="clip-path-12">
<rect id="Rectangle_17619" data-name="Rectangle 17619" width="6.621" height="5.261" fill="none"/>
</clipPath>
<clipPath id="clip-path-13">
<rect id="Rectangle_17620" data-name="Rectangle 17620" width="61.469" height="15.006" fill="none"/>
</clipPath>
<clipPath id="clip-path-14">
<rect id="Rectangle_17693" data-name="Rectangle 17693" width="333" height="88" rx="15" transform="translate(1 4.523)" fill="#fff"/>
</clipPath>
<clipPath id="clip-path-15">
<rect id="Rectangle_17685" data-name="Rectangle 17685" width="111.63" height="15.945" transform="translate(0 0)" fill="none"/>
</clipPath>
<clipPath id="clip-path-16">
<rect id="Rectangle_17626" data-name="Rectangle 17626" width="111.63" height="15.947" transform="translate(0 0)" fill="none"/>
</clipPath>
<clipPath id="clip-path-18">
<rect id="Rectangle_17684" data-name="Rectangle 17684" width="111.63" height="15.894" transform="translate(0 0)" fill="none"/>
</clipPath>
<clipPath id="clip-path-19">
<rect id="Rectangle_17683" data-name="Rectangle 17683" width="111.63" height="15.748" transform="translate(0 0)" fill="none"/>
</clipPath>
</defs>
<g id="Group_8897" data-name="Group 8897" transform="translate(-21 -321.778)">
<g id="Group_8890" data-name="Group 8890" transform="translate(20 317.477)">
<g id="Group_8745" data-name="Group 8745">
<rect id="Rectangle_17692" data-name="Rectangle 17692" width="333" height="88" rx="15" transform="translate(1 4.523)" fill="#fff"/>
<g id="Group_8889" data-name="Group 8889" transform="translate(1)">
<g id="Group_8902" data-name="Group 8902">
<rect id="Rectangle_17523" data-name="Rectangle 17523" width="26.188" height="0.075" transform="translate(22.754 84.584)" fill="#ebebeb"/>
<g id="Group_8796" data-name="Group 8796" transform="translate(-14 -13.831)">
<g id="Group_8903" data-name="Group 8903">
<path id="Path_13976" data-name="Path 13976" d="M375.306,83.743l1.573-.7H389.2l2.8,5.96v1.567Z" transform="translate(-270.385 -58.043)" fill="#e0e0e0"/>
<rect id="Rectangle_17524" data-name="Rectangle 17524" width="1.229" height="49.47" transform="translate(114.478 30.231)" fill="#e0e0e0"/>
<path id="Path_13977" data-name="Path 13977" d="M392.3,92.514H378.694l-3.123-6.829h13.605Z" transform="translate(-270.576 -59.887)" fill="#f0f0f0"/>
<path id="Path_13978" data-name="Path 13978" d="M383.558,88.875c.321.7.022,1.271-.667,1.271a2.248,2.248,0,0,1-1.829-1.271c-.321-.7-.022-1.271.667-1.271a2.247,2.247,0,0,1,1.829,1.271" transform="translate(-274.439 -61.228)" fill="#fafafa"/>
<path id="Path_13979" data-name="Path 13979" d="M394.938,88.875c.321.7.022,1.271-.667,1.271a2.247,2.247,0,0,1-1.829-1.271c-.321-.7-.022-1.271.667-1.271a2.247,2.247,0,0,1,1.829,1.271" transform="translate(-282.637 -61.228)" fill="#fafafa"/>
<path id="Path_13980" data-name="Path 13980" d="M406.318,88.875c.321.7.022,1.271-.667,1.271a2.248,2.248,0,0,1-1.829-1.271c-.321-.7-.022-1.271.667-1.271a2.247,2.247,0,0,1,1.829,1.271" transform="translate(-290.836 -61.228)" fill="#fafafa"/>
<path id="Path_13981" data-name="Path 13981" d="M417.7,88.875c.321.7.022,1.271-.667,1.271a2.247,2.247,0,0,1-1.829-1.271c-.321-.7-.022-1.271.667-1.271a2.247,2.247,0,0,1,1.829,1.271" transform="translate(-299.034 -61.228)" fill="#fafafa"/>
<path id="Path_13982" data-name="Path 13982" d="M388.681,99.278c.321.7.022,1.271-.667,1.271a2.247,2.247,0,0,1-1.829-1.271c-.321-.7-.022-1.271.667-1.271a2.247,2.247,0,0,1,1.829,1.271" transform="translate(-278.13 -68.499)" fill="#fafafa"/>
<path id="Path_13983" data-name="Path 13983" d="M400.061,99.278c.321.7.022,1.271-.667,1.271a2.247,2.247,0,0,1-1.829-1.271c-.321-.7-.022-1.271.667-1.271a2.247,2.247,0,0,1,1.829,1.271" transform="translate(-286.328 -68.499)" fill="#fafafa"/>
<path id="Path_13984" data-name="Path 13984" d="M411.442,99.278c.321.7.022,1.271-.667,1.271a2.247,2.247,0,0,1-1.829-1.271c-.321-.7-.022-1.271.667-1.271a2.247,2.247,0,0,1,1.829,1.271" transform="translate(-294.527 -68.499)" fill="#fafafa"/>
<path id="Path_13985" data-name="Path 13985" d="M422.821,99.278c.321.7.022,1.271-.667,1.271a2.247,2.247,0,0,1-1.829-1.271c-.321-.7-.022-1.271.667-1.271a2.247,2.247,0,0,1,1.829,1.271" transform="translate(-302.725 -68.499)" fill="#fafafa"/>
<path id="Path_13986" data-name="Path 13986" d="M106.306,83.743l1.573-.7H120.2l2.8,5.96v1.567Z" transform="translate(-76.587 -58.043)" fill="#e0e0e0"/>
<rect id="Rectangle_17525" data-name="Rectangle 17525" width="1.229" height="49.47" transform="translate(39.276 30.231)" fill="#e0e0e0"/>
<path id="Path_13987" data-name="Path 13987" d="M123.3,92.514H109.694l-3.123-6.829h13.605Z" transform="translate(-76.778 -59.887)" fill="#f0f0f0"/>
<path id="Path_13988" data-name="Path 13988" d="M114.558,88.875c.321.7.022,1.271-.667,1.271a2.247,2.247,0,0,1-1.829-1.271c-.321-.7-.022-1.271.667-1.271a2.247,2.247,0,0,1,1.829,1.271" transform="translate(-80.641 -61.228)" fill="#fafafa"/>
<path id="Path_13989" data-name="Path 13989" d="M125.939,88.875c.321.7.022,1.271-.667,1.271a2.247,2.247,0,0,1-1.829-1.271c-.321-.7-.022-1.271.667-1.271a2.247,2.247,0,0,1,1.829,1.271" transform="translate(-88.84 -61.228)" fill="#fafafa"/>
<path id="Path_13990" data-name="Path 13990" d="M137.318,88.875c.321.7.022,1.271-.667,1.271a2.247,2.247,0,0,1-1.829-1.271c-.321-.7-.022-1.271.667-1.271a2.247,2.247,0,0,1,1.829,1.271" transform="translate(-97.037 -61.228)" fill="#fafafa"/>
<path id="Path_13991" data-name="Path 13991" d="M148.7,88.875c.321.7.022,1.271-.667,1.271a2.247,2.247,0,0,1-1.829-1.271c-.321-.7-.022-1.271.667-1.271a2.247,2.247,0,0,1,1.829,1.271" transform="translate(-105.236 -61.228)" fill="#fafafa"/>
<path id="Path_13992" data-name="Path 13992" d="M119.681,99.278c.321.7.022,1.271-.667,1.271a2.247,2.247,0,0,1-1.829-1.271c-.321-.7-.022-1.271.667-1.271a2.247,2.247,0,0,1,1.829,1.271" transform="translate(-84.332 -68.499)" fill="#fafafa"/>
<path id="Path_13993" data-name="Path 13993" d="M131.061,99.278c.321.7.022,1.271-.667,1.271a2.247,2.247,0,0,1-1.829-1.271c-.321-.7-.022-1.271.667-1.271a2.247,2.247,0,0,1,1.829,1.271" transform="translate(-92.53 -68.499)" fill="#fafafa"/>
<path id="Path_13994" data-name="Path 13994" d="M142.441,99.278c.321.7.022,1.271-.667,1.271a2.248,2.248,0,0,1-1.829-1.271c-.321-.7-.022-1.271.667-1.271a2.247,2.247,0,0,1,1.829,1.271" transform="translate(-100.729 -68.499)" fill="#fafafa"/>
<path id="Path_13995" data-name="Path 13995" d="M153.822,99.278c.321.7.022,1.271-.667,1.271a2.247,2.247,0,0,1-1.829-1.271c-.321-.7-.022-1.271.667-1.271a2.247,2.247,0,0,1,1.829,1.271" transform="translate(-108.928 -68.499)" fill="#fafafa"/>
<path id="Path_13996" data-name="Path 13996" d="M227.482,166.051H170.545v6.925h-7.227V180.2h-7.012v6.925h-7.288v22.882h78.464Z" transform="translate(-107.359 -116.056)" fill="#e0e0e0"/>
<rect id="Rectangle_17526" data-name="Rectangle 17526" width="48.83" height="6.254" transform="translate(63.186 50.666)" fill="#ebebeb"/>
<rect id="Rectangle_17527" data-name="Rectangle 17527" width="48.872" height="6.457" transform="translate(55.959 57.689)" fill="#ebebeb"/>
<rect id="Rectangle_17528" data-name="Rectangle 17528" width="48.849" height="6.358" transform="translate(48.948 64.712)" fill="#ebebeb"/>
<rect id="Rectangle_17529" data-name="Rectangle 17529" width="48.83" height="6.254" transform="translate(41.66 71.823)" fill="#ebebeb"/>
</g>
</g>
<g id="Group_8803" data-name="Group 8803" transform="translate(-14 -17.831)">
<g id="Group_8904" data-name="Group 8904">
<g id="Group_8801" data-name="Group 8801" transform="translate(17.645 78.597)" style="isolation: isolate">
<g id="Group_8800" data-name="Group 8800">
<g id="Group_8799" data-name="Group 8799" clip-path="url(#clip-path)">
<path id="Path_13998" data-name="Path 13998" d="M118.1,281.077H67.812l1.112-19.237,44.482-.792Z" transform="translate(-63.115 -261.048)" fill="#126055"/>
</g>
</g>
</g>
</g>
</g>
<path id="Path_13999" data-name="Path 13999" d="M101.091,261.048l-44.6,1.146-7.765,18.883h47.67Z" transform="translate(-47.216 -200.282)" fill="#407bff"/>
<g id="Group_8811" data-name="Group 8811" transform="translate(-14 -17.831)">
<g id="Group_8905" data-name="Group 8905">
<g id="Group_8806" data-name="Group 8806" transform="translate(14.31 78.597)" style="isolation: isolate">
<g id="Group_8805" data-name="Group 8805">
<g id="Group_8804" data-name="Group 8804" clip-path="url(#clip-path-2)">
<path id="Path_14000" data-name="Path 14000" d="M98.713,261.048l-44.552.705L46.1,281.076H94.22Z" transform="translate(-45.148 -261.048)" fill="#2bb8a6"/>
</g>
</g>
</g>
<g id="Group_8809" data-name="Group 8809" transform="translate(70.795 78.597)" style="isolation: isolate">
<g id="Group_8808" data-name="Group 8808">
<g id="Group_8807" data-name="Group 8807" clip-path="url(#clip-path)">
<path id="Path_14001" data-name="Path 14001" d="M308.221,281.077h-50.29l-4.7-20.029h50.29Z" transform="translate(-253.235 -261.048)" fill="#126055"/>
</g>
</g>
</g>
</g>
</g>
<path id="Path_14002" data-name="Path 14002" d="M291.211,261.048h-50.29l-4.7,20.029h50.29Z" transform="translate(-184.185 -200.282)" fill="#407bff"/>
<g id="Group_8816" data-name="Group 8816" transform="translate(-14 -17.831)">
<g id="Group_8906" data-name="Group 8906">
<g id="Group_8814" data-name="Group 8814" transform="translate(66.039 78.597)" style="isolation: isolate">
<g id="Group_8813" data-name="Group 8813">
<g id="Group_8812" data-name="Group 8812" clip-path="url(#clip-path)">
<path id="Path_14003" data-name="Path 14003" d="M291.211,261.048h-50.29l-4.7,20.029h50.29Z" transform="translate(-236.224 -261.048)" fill="#2bb8a6"/>
</g>
</g>
</g>
</g>
</g>
<g id="Group_8865" data-name="Group 8865" transform="translate(-14 -17.831)">
<g id="Group_8901" data-name="Group 8901">
<path id="Path_14006" data-name="Path 14006" d="M233.648,116.585a3.128,3.128,0,0,0-3.22-1.913c-2.516.25-4.939,3.663-7.222,2.961s-2-2.249-2-2.249-.839,2.227,2,4.095,6.7-2.849,9.921-1.444Z" transform="translate(-159.279 -80.134)" fill="#2e353a"/>
<path id="Path_14007" data-name="Path 14007" d="M240.7,114.478a4.2,4.2,0,0,0-3.5-2.829c-2.691-.226-4.263,3.437-6.325,2.829" transform="translate(-166.331 -78.027)" fill="none" stroke="#263238" stroke-linecap="round" stroke-linejoin="round" stroke-width="0.48"/>
<path id="Path_14008" data-name="Path 14008" d="M267.912,122.383s.956-4.252-2.358-5.11-4.805,1.234-5.364,3.55.851,5.538,3.85,5.006,3.751-2.438,3.871-3.446" transform="translate(-187.365 -81.827)" fill="#2e353a"/>
<path id="Path_14009" data-name="Path 14009" d="M288.639,115.829c2.724-1.365,6.3-4.351,6.235-5.439s-2.813-8.4-2.813-8.4a2.068,2.068,0,0,1-.631-.323c-.27-.218-.607-2.908-.2-3.054a11.433,11.433,0,0,1,2.093-.364c.337,0,.2,2.4.067,2.981,0,0,4.357,6.539,4.069,9.668s-7.04,8.572-9.4,9.341.585-4.41.585-4.41" transform="translate(-206.865 -68.668)" fill="#e4897b"/>
<path id="Path_14010" data-name="Path 14010" d="M186.8,270.838l.772-1.769,2.415.868,2.214.8-.6,2.261-2.542-1.142Z" transform="translate(-134.582 -188.057)" fill="#e4897b"/>
<path id="Path_14011" data-name="Path 14011" d="M177.621,264.516c.179.1-1.009,2.421-1.009,2.421a7.677,7.677,0,0,0-2.974,2.043c-.938,1.274-1.387.07-.688-1.531l1.728-3.96c.5-1.137,1.086.029,2.943,1.027" transform="translate(-124.355 -183.83)" fill="#2e353a"/>
<path id="Path_14012" data-name="Path 14012" d="M183.027,277.67a.233.233,0,0,1-.049-.005.242.242,0,0,1-.212-.178c-.078-.333.615-.966.755-1.089a.063.063,0,0,1,.027-.014h0s.008,0,.013,0a.076.076,0,0,1,.038.013h0s0,0,0,0h0l0,0h0a1.566,1.566,0,0,1,.434.873.417.417,0,0,1-.143.306c-.1.085-.181.106-.256.063-.114-.066-.157-.3-.168-.54a1.1,1.1,0,0,1-.289.51.261.261,0,0,1-.157.057m.435-1.034c-.293.283-.607.661-.57.817,0,.014.013.055.111.076a.132.132,0,0,0,.108-.029,1.8,1.8,0,0,0,.352-.863m.15-.021c-.03.419-.006.849.091.906.03.018.083-.023.112-.048a.277.277,0,0,0,.1-.2,1.2,1.2,0,0,0-.3-.654" transform="translate(-131.667 -193.169)" fill="#407bff"/>
<g id="Group_8845" data-name="Group 8845" transform="translate(54.432 81.856)" opacity="0.2" style="isolation: isolate">
<g id="Group_8844" data-name="Group 8844">
<g id="Group_8843" data-name="Group 8843" clip-path="url(#clip-path-5)">
<path id="Path_14013" data-name="Path 14013" d="M194.7,273.79l.934-1.916,2.236.811-.588,2.267Z" transform="translate(-194.704 -271.874)"/>
</g>
</g>
</g>
<path id="Path_14014" data-name="Path 14014" d="M223.861,235.868c-1.012,4.721-5.537,20.832-12.57,20.228s-12.2-4.774-12.345-6.678.4-2.95,2.159-2.954,6.907,1.7,9.153,1.524,4.342-10.438,4.342-10.438Z" transform="translate(-143.313 -164.853)" fill="#407bff"/>
<g id="Group_8848" data-name="Group 8848" transform="translate(55.612 71.015)" style="isolation: isolate">
<g id="Group_8847" data-name="Group 8847">
<g id="Group_8846" data-name="Group 8846" clip-path="url(#clip-path-6)">
<path id="Path_14015" data-name="Path 14015" d="M223.861,235.868c-1.012,4.721-5.537,20.832-12.57,20.228s-12.2-4.774-12.345-6.678.4-2.95,2.159-2.954,6.907,1.7,9.153,1.524,4.342-10.438,4.342-10.438Z" transform="translate(-198.925 -235.868)" fill="#157e8c"/>
</g>
</g>
</g>
<path id="Path_14016" data-name="Path 14016" d="M341.771,336.388l-1.666.776-1.276-2.372-1.168-2.178,1.839-1.267,1.2,2.668Z" transform="translate(-243.263 -231.585)" fill="#e4897b"/>
<path id="Path_14017" data-name="Path 14017" d="M344.957,348.294c-.075-.2,2.244-1.1,2.244-1.1a7.267,7.267,0,0,0,3.485.589c1.486-.286,1.082.937-.425,1.639l-3.729,1.736c-1.071.5-.8-.8-1.575-2.868" transform="translate(-248.519 -242.663)" fill="#2e353a"/>
<path id="Path_14018" data-name="Path 14018" d="M354.247,345.2a1.5,1.5,0,0,0-.169.026h-.038a.2.2,0,0,1-.058-.034v-.022a.028.028,0,0,0-.006-.02s.006-.011.006-.016h0c0-.009.013-.019.013-.029a1.661,1.661,0,0,1,.221-.963.365.365,0,0,1,.3-.127c.124,0,.2.05.233.135.044.131-.064.334-.2.524a.948.948,0,0,1,.531-.176.258.258,0,0,1,.187.108.3.3,0,0,1,.049.3c-.119.248-.739.3-1.065.3m.784-.567a1.708,1.708,0,0,0-.763.4c.393,0,.861-.062.929-.206.006-.013.024-.051-.037-.135a.135.135,0,0,0-.1-.055l-.03,0m-.525-.611c-.074,0-.135.092-.186.149a1.327,1.327,0,0,0-.177.735c.279-.292.526-.68.488-.792a.172.172,0,0,0-.113-.092Z" transform="translate(-255.017 -240.437)" fill="#407bff"/>
<g id="Group_8851" data-name="Group 8851" transform="translate(94.406 99.775)" opacity="0.2" style="isolation: isolate">
<g id="Group_8850" data-name="Group 8850">
<g id="Group_8849" data-name="Group 8849" clip-path="url(#clip-path-7)">
<path id="Path_14019" data-name="Path 14019" d="M340.75,334.1l-1.878.77-1.178-2.2,1.834-1.28Z" transform="translate(-337.695 -331.388)"/>
</g>
</g>
</g>
<path id="Path_14020" data-name="Path 14020" d="M249.431,204.77s-3.9,6.256-3.1,10.916c.942,5.5,13.25,11.694,16.6,14.431s4.927,13.073,9.1,15.056l2.274-.878a5.739,5.739,0,0,0,.292-4.65c-3.631-12.285-6.636-18.156-16.666-25.512a62.225,62.225,0,0,0,.383-8.972Z" transform="translate(-177.386 -143.118)" fill="#407bff"/>
<g id="Group_8854" data-name="Group 8854" transform="translate(68.833 61.652)" style="isolation: isolate">
<g id="Group_8853" data-name="Group 8853">
<g id="Group_8852" data-name="Group 8852" clip-path="url(#clip-path-8)">
<path id="Path_14021" data-name="Path 14021" d="M249.431,204.77s-3.9,6.256-3.1,10.916c.942,5.5,13.25,11.694,16.6,14.431s4.927,13.073,9.1,15.056l2.274-.878a5.739,5.739,0,0,0,.292-4.65c-3.631-12.285-6.636-18.156-16.666-25.512a62.225,62.225,0,0,0,.383-8.972Z" transform="translate(-246.219 -204.77)" fill="#1d92aa"/>
</g>
</g>
</g>
<path id="Path_14022" data-name="Path 14022" d="M278.512,244.82l-.559.217c-1.269-1.74-2.306-4.878-3.394-8.171-1.155-3.49-2.348-7.1-3.754-8.53a57.1,57.1,0,0,0-5.661-4.384c-5.13-3.712-10.948-7.918-11.336-10.484-.411-2.728.883-6.612,1.658-8.611l.6.027c-.735,1.876-2.105,5.844-1.7,8.488.349,2.306,6.559,6.8,11.093,10.08a57.033,57.033,0,0,1,5.737,4.447c1.5,1.532,2.664,5.043,3.894,8.764,1.062,3.213,2.158,6.527,3.427,8.156" transform="translate(-182.796 -143.179)" fill="#126055"/>
<g id="Group_8857" data-name="Group 8857" transform="translate(75.901 63.521)" opacity="0.1" style="isolation: isolate">
<g id="Group_8856" data-name="Group 8856">
<g id="Group_8855" data-name="Group 8855" clip-path="url(#clip-path-9)">
<path id="Path_14023" data-name="Path 14023" d="M276.146,218.472s-2.06-1.451-4.646-3.258l3.777,1.629a17.714,17.714,0,0,0,1.317-5.865c.034,3.146-.447,7.494-.447,7.494" transform="translate(-271.5 -210.978)"/>
</g>
</g>
</g>
<path id="Path_14024" data-name="Path 14024" d="M254.676,166.173l8.951.987a85.559,85.559,0,0,0,2.188-16.281,16.509,16.509,0,0,1-6.508.8,16.257,16.257,0,0,1-5.807-2.133,110.806,110.806,0,0,1,1.176,16.627" transform="translate(-182.631 -104.521)" fill="#2e353a"/>
<path id="Path_14025" data-name="Path 14025" d="M270.6,150.361a4.087,4.087,0,0,1-2.663-1.682c1.54-1.207.685-3.784.685-3.784l2.545.882a8.849,8.849,0,0,0-.242,1.168c-.222,1.7.492,1.816.492,1.816.348.986-.816,1.6-.816,1.6" transform="translate(-193.029 -101.27)" fill="#e4897b"/>
<g id="Group_8860" data-name="Group 8860" transform="translate(75.589 43.625)" opacity="0.2" style="isolation: isolate">
<g id="Group_8859" data-name="Group 8859">
<g id="Group_8858" data-name="Group 8858" clip-path="url(#clip-path-10)">
<path id="Path_14026" data-name="Path 14026" d="M272.928,145.777a8.851,8.851,0,0,0-.242,1.168,3.024,3.024,0,0,1-2.3-2.05Z" transform="translate(-270.383 -144.895)"/>
</g>
</g>
</g>
<path id="Path_14027" data-name="Path 14027" d="M269.361,121.076c2.282.178,2.928,1.551,2.925,4.1,0,3.181-.806,5.379-3.614,4.481-3.813-1.22-3.1-8.872.689-8.577" transform="translate(-191.738 -84.616)" fill="#e4897b"/>
<path id="Path_14028" data-name="Path 14028" d="M282.814,133.863a5.312,5.312,0,0,0,.6,1.071.61.61,0,0,1-.62.231Z" transform="translate(-203.732 -93.559)" fill="#de5753"/>
<path id="Path_14029" data-name="Path 14029" d="M276.76,131.956c-.009.2-.118.361-.243.354s-.219-.176-.21-.378.118-.361.243-.354.219.176.21.378" transform="translate(-199.062 -91.962)" fill="#2e353a"/>
<path id="Path_14030" data-name="Path 14030" d="M276.99,131.251l.416-.151s-.22.359-.416.151" transform="translate(-199.554 -91.628)" fill="#2e353a"/>
<path id="Path_14031" data-name="Path 14031" d="M285.117,132.224c-.009.2-.118.361-.243.354s-.219-.176-.21-.378.118-.361.243-.354.219.176.21.378" transform="translate(-205.082 -92.15)" fill="#2e353a"/>
<path id="Path_14032" data-name="Path 14032" d="M285.346,131.52l.416-.151s-.22.359-.416.151" transform="translate(-205.574 -91.816)" fill="#2e353a"/>
<path id="Path_14033" data-name="Path 14033" d="M275.641,127.141a1.127,1.127,0,0,0-1.015.294" transform="translate(-197.851 -88.846)" fill="none" stroke="#263238" stroke-linecap="round" stroke-linejoin="round" stroke-width="0.696"/>
<path id="Path_14034" data-name="Path 14034" d="M284.213,127.23a1.009,1.009,0,0,1,.9.273" transform="translate(-204.758 -88.909)" fill="none" stroke="#263238" stroke-linecap="round" stroke-linejoin="round" stroke-width="0.696"/>
<path id="Path_14035" data-name="Path 14035" d="M277.4,139.972a6.506,6.506,0,0,0-.323.833c-.049-.008-.1-.016-.146-.026-.659-.124-.927-.416-1.024-.7a1,1,0,0,1-.037-.438.959.959,0,0,1,.059-.244,3.027,3.027,0,0,0,1.247.532c.137.033.224.046.224.046" transform="translate(-198.74 -97.425)" fill="#2e353a"/>
<path id="Path_14036" data-name="Path 14036" d="M277.2,139.926l-.1.243a1.926,1.926,0,0,1-1.2-.531.952.952,0,0,1,.059-.244,3.026,3.026,0,0,0,1.247.532" transform="translate(-198.765 -97.425)" fill="#fff"/>
<path id="Path_14037" data-name="Path 14037" d="M277.048,142.361c-.659-.124-.927-.416-1.024-.7a2.066,2.066,0,0,1,.707.294.86.86,0,0,1,.317.409" transform="translate(-198.858 -99.008)" fill="#de5753"/>
<path id="Path_14038" data-name="Path 14038" d="M265.157,122.691a7.738,7.738,0,0,0,1.146-3.507s4.656-1.637,4.547,3.323c0,0,.737-4.355-3.179-4.758s-4.315,5.778-2.413,7.778a3.252,3.252,0,0,1-.1-2.835" transform="translate(-190.307 -82.283)" fill="#2e353a"/>
<path id="Path_14039" data-name="Path 14039" d="M264.724,133.543a1.048,1.048,0,0,0-1.011-1.069c-.713.028-1.155,1.565.579,2.078.249.074.409-.181.432-1.009" transform="translate(-189.536 -92.588)" fill="#e4897b"/>
<path id="Path_14040" data-name="Path 14040" d="M237.873,107.488a8.912,8.912,0,0,1,.736,6.06s-6.188-7.417-6.747-9.109,3.469-11.327,3.469-11.327a9.2,9.2,0,0,1-.533-2.484c.14-.452,1.887-1.505,2.306-1.2s.28,3.613.07,4.065l-.21.452s-2.154,8.725-1.881,9.368,2.789,4.18,2.789,4.18" transform="translate(-167.005 -62.462)" fill="#e4897b"/>
<path id="Path_14041" data-name="Path 14041" d="M267.432,119.779s-2.449,3.95-5.7,3.317c0,0-.159-2.991,2.016-3.648a4.62,4.62,0,0,1,3.683.33" transform="translate(-188.561 -83.327)" fill="#2e353a"/>
<path id="Path_14042" data-name="Path 14042" d="M276.032,121.068s1.02,1.65-1.759,2.741" transform="translate(-197.597 -84.617)" fill="none" stroke="#263238" stroke-linecap="round" stroke-linejoin="round" stroke-width="0.48"/>
<path id="Path_14043" data-name="Path 14043" d="M284.369,119.5s1.17,1.158,1.656-.5" transform="translate(-204.87 -83.169)" fill="none" stroke="#263238" stroke-linecap="round" stroke-linejoin="round" stroke-width="0.48"/>
<path id="Path_14044" data-name="Path 14044" d="M266.271,166.48l.253-.464s-.312-.1-.854-.235c.227-1.683.93-8.052-.785-12.184l-.318.263a8.484,8.484,0,0,1,.874,3.876l-5.924-.038s-.68-3.575-1.522-4.673l-.212.107a28.5,28.5,0,0,1,1.248,12.016,16.047,16.047,0,0,0-2.78.416l.226.452a32.211,32.211,0,0,1,5.022-.216l3.113.306a15.805,15.805,0,0,1,1.66.374" transform="translate(-184.612 -106.953)" fill="#407bff"/>
<g id="Group_8863" data-name="Group 8863" transform="translate(71.638 46.074)" style="isolation: isolate">
<g id="Group_8862" data-name="Group 8862">
<g id="Group_8861" data-name="Group 8861" clip-path="url(#clip-path-11)">
<path id="Path_14045" data-name="Path 14045" d="M266.271,166.48l.253-.464s-.312-.1-.854-.235c.227-1.683.93-8.052-.785-12.184l-.318.263a8.484,8.484,0,0,1,.874,3.876l-5.924-.038s-.68-3.575-1.522-4.673l-.212.107a28.5,28.5,0,0,1,1.248,12.016,16.047,16.047,0,0,0-2.78.416l.226.452a32.211,32.211,0,0,1,5.022-.216l3.113.306a15.805,15.805,0,0,1,1.66.374" transform="translate(-256.25 -153.026)" fill="#fff"/>
</g>
</g>
</g>
<path id="Path_14046" data-name="Path 14046" d="M274.7,176.706a1.261,1.261,0,0,1-.229.816.864.864,0,0,1-.71.28.848.848,0,0,1-.685-.274,1.184,1.184,0,0,1-.232-.786v-.108h.582v.15a.471.471,0,0,0,.087.322.3.3,0,0,0,.232.093.308.308,0,0,0,.252-.108.675.675,0,0,0,.089-.409v-.771a.636.636,0,0,1-1.082.126,1.256,1.256,0,0,1-.171-.717v-.771a1.156,1.156,0,0,1,.24-.786,1.014,1.014,0,0,1,1.387,0,1.156,1.156,0,0,1,.24.786Zm-.934-1.024a.3.3,0,0,0,.232-.094.47.47,0,0,0,.087-.322v-.759a.459.459,0,0,0-.087-.319.343.343,0,0,0-.464,0,.459.459,0,0,0-.087.319v.759a.469.469,0,0,0,.087.322.3.3,0,0,0,.232.094" transform="translate(-196.557 -121.255)" fill="#125765"/>
<path id="Path_14047" data-name="Path 14047" d="M282.617,176.706a1.261,1.261,0,0,1-.229.816.864.864,0,0,1-.71.28.848.848,0,0,1-.685-.274,1.184,1.184,0,0,1-.232-.786v-.108h.582v.15a.471.471,0,0,0,.087.322.3.3,0,0,0,.232.093.308.308,0,0,0,.252-.108.674.674,0,0,0,.09-.409v-.771a.636.636,0,0,1-1.082.126,1.257,1.257,0,0,1-.171-.717v-.771a1.156,1.156,0,0,1,.24-.786,1.014,1.014,0,0,1,1.387,0,1.156,1.156,0,0,1,.24.786Zm-.934-1.024a.3.3,0,0,0,.232-.094.469.469,0,0,0,.087-.322v-.759a.459.459,0,0,0-.087-.319.343.343,0,0,0-.464,0,.459.459,0,0,0-.087.319v.759a.469.469,0,0,0,.087.322.3.3,0,0,0,.232.094" transform="translate(-202.263 -121.255)" fill="#125765"/>
</g>
</g>
<g id="Group_8873" data-name="Group 8873" transform="translate(-14 -17.831)">
<g id="Group_8907" data-name="Group 8907">
<path id="Path_14048" data-name="Path 14048" d="M335.17,173.594a35.718,35.718,0,0,0-24.292-.479c-3.483,1.135-7.173,2.571-10.74,3.962q-1.448.564-2.9,1.126c-.542.209-1.5.615-1.581,1.194l.877,2.27c1.8-.674,2.709-1.04,4.557-1.76,3.534-1.376,7.19-2.8,10.6-3.911a34.29,34.29,0,0,1,20.62-.271l.763-.527-.372-.7h1.026l-1.026-.9h2.469Z" transform="translate(-213.001 -119.689)" fill="#2bb8a6"/>
<path id="Path_14049" data-name="Path 14049" d="M295.981,198.514s4.729.235,6.243,1.154l.047-2.47s-.022-.151-.452-.161c-1.46-.032-4.659-.34-5.414-.763-1.717-.963.781-1.868.781-1.868s-1.578.532-1.535,1.176a10.421,10.421,0,0,1,.33,2.931" transform="translate(-212.998 -135.875)" fill="#407bff"/>
<g id="Group_8868" data-name="Group 8868" transform="translate(82.653 58.532)" style="isolation: isolate">
<g id="Group_8867" data-name="Group 8867">
<g id="Group_8866" data-name="Group 8866" clip-path="url(#clip-path-12)">
<path id="Path_14050" data-name="Path 14050" d="M295.981,198.514s4.729.235,6.243,1.154l.047-2.47s-.022-.151-.452-.161c-1.46-.032-4.659-.34-5.414-.763-1.717-.963.781-1.868.781-1.868s-1.578.532-1.535,1.176a10.421,10.421,0,0,1,.33,2.931" transform="translate(-295.651 -194.407)" fill="#126055"/>
</g>
</g>
</g>
<g id="Group_8871" data-name="Group 8871" transform="translate(28.236 50.054)" style="isolation: isolate">
<g id="Group_8870" data-name="Group 8870">
<g id="Group_8869" data-name="Group 8869" clip-path="url(#clip-path-13)">
<path id="Path_14051" data-name="Path 14051" d="M162.458,180.077a.486.486,0,0,1-.308.569,14.681,14.681,0,0,1-4.38.608c-6.352,0-14.316-3.1-22.642-6.347-3.534-1.376-7.19-2.8-10.6-3.911a34.288,34.288,0,0,0-20.62-.271l-.763-.527.372-.7H102.49l1.026-.9H101v0a35.8,35.8,0,0,1,24.316-.479c3.483,1.135,7.185,2.572,10.752,3.962,9.673,3.77,20.479,7,25.608,5.573.328-.092.3-.186.212-.237a.369.369,0,0,0-.136-.042c.248.015.294.12.3.216a21.119,21.119,0,0,0,.409,2.491" transform="translate(-101 -166.248)" fill="#2bb8a6"/>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
<path id="Path_13973" data-name="Path 13973" d="M-122.1,0,64.718-.222A14.962,14.962,0,0,1,79.68,14.741V72.595A14.962,14.962,0,0,1,64.718,87.557l-215.6.221Z" transform="translate(254 4.523)" fill="#125765"/>
<g id="Mask_Group_9" data-name="Mask Group 9" clip-path="url(#clip-path-14)">
<g id="Group_8909" data-name="Group 8909">
<g id="Group_8908" data-name="Group 8908" transform="translate(0 4.523)">
<g id="Group_8886" data-name="Group 8886" transform="matrix(0.309, -0.951, 0.951, 0.309, 84.633, 94.705)">
<g id="Group_8885" data-name="Group 8885" transform="translate(0)" clip-path="url(#clip-path-15)">
<rect id="Rectangle_17623" data-name="Rectangle 17623" width="111.63" height="15.948" transform="translate(0 0)" fill="#407bff"/>
<g id="Group_8879" data-name="Group 8879" transform="translate(0 0)">
<g id="Group_8878" data-name="Group 8878" clip-path="url(#clip-path-16)">
<g id="Group_8877" data-name="Group 8877" transform="translate(0 0)" style="isolation: isolate">
<g id="Group_8876" data-name="Group 8876" transform="translate(0)">
<g id="Group_8875" data-name="Group 8875" clip-path="url(#clip-path-16)">
<rect id="Rectangle_17624" data-name="Rectangle 17624" width="111.63" height="15.894" transform="translate(0 0)" fill="#fff"/>
</g>
</g>
</g>
</g>
</g>
<rect id="Rectangle_17628" data-name="Rectangle 17628" width="7.973" height="7.973" transform="translate(0 7.974)" fill="#2e353a"/>
<rect id="Rectangle_17631" data-name="Rectangle 17631" width="7.974" height="7.973" transform="translate(7.973 0.001)" fill="#2e353a"/>
<rect id="Rectangle_17632" data-name="Rectangle 17632" width="7.974" height="7.974" transform="translate(15.947 7.973)" fill="#2e353a"/>
<rect id="Rectangle_17635" data-name="Rectangle 17635" width="7.973" height="7.973" transform="translate(23.921 0.001)" fill="#2e353a"/>
<rect id="Rectangle_17636" data-name="Rectangle 17636" width="7.974" height="7.974" transform="translate(31.894 7.973)" fill="#2e353a"/>
<rect id="Rectangle_17639" data-name="Rectangle 17639" width="7.974" height="7.973" transform="translate(39.868 0.001)" fill="#2e353a"/>
<rect id="Rectangle_17640" data-name="Rectangle 17640" width="7.974" height="7.974" transform="translate(47.842 7.973)" fill="#2e353a"/>
<rect id="Rectangle_17643" data-name="Rectangle 17643" width="7.974" height="7.973" transform="translate(55.815 0.001)" fill="#2e353a"/>
<rect id="Rectangle_17644" data-name="Rectangle 17644" width="7.974" height="7.974" transform="translate(63.788 7.973)" fill="#2e353a"/>
<rect id="Rectangle_17647" data-name="Rectangle 17647" width="7.973" height="7.973" transform="translate(71.762 0.001)" fill="#2e353a"/>
<rect id="Rectangle_17648" data-name="Rectangle 17648" width="7.974" height="7.974" transform="translate(79.736 7.973)" fill="#2e353a"/>
<rect id="Rectangle_17651" data-name="Rectangle 17651" width="7.973" height="7.973" transform="translate(87.71 0.001)" fill="#2e353a"/>
<rect id="Rectangle_17652" data-name="Rectangle 17652" width="7.974" height="7.974" transform="translate(95.683 7.973)" fill="#2e353a"/>
<rect id="Rectangle_17654" data-name="Rectangle 17654" width="7.974" height="7.973" transform="translate(103.656 0.001)" fill="#2e353a"/>
<g id="Group_8884" data-name="Group 8884" transform="translate(0 0)">
<g id="Group_8883" data-name="Group 8883" clip-path="url(#clip-path-18)">
<g id="Group_8882" data-name="Group 8882" transform="translate(0 0)" opacity="0.1" style="isolation: isolate">
<g id="Group_8881" data-name="Group 8881" transform="translate(0)">
<g id="Group_8880" data-name="Group 8880" clip-path="url(#clip-path-19)">
<rect id="Rectangle_17656" data-name="Rectangle 17656" width="7.974" height="7.974" transform="translate(0 7.973)" fill="#fff"/>
<rect id="Rectangle_17659" data-name="Rectangle 17659" width="7.974" height="7.974" transform="translate(7.974 0)" fill="#fff"/>
<rect id="Rectangle_17660" data-name="Rectangle 17660" width="7.974" height="7.974" transform="translate(15.947 7.973)" fill="#fff"/>
<rect id="Rectangle_17663" data-name="Rectangle 17663" width="7.974" height="7.974" transform="translate(23.921 0)" fill="#fff"/>
<rect id="Rectangle_17664" data-name="Rectangle 17664" width="7.974" height="7.974" transform="translate(31.894 7.973)" fill="#fff"/>
<rect id="Rectangle_17667" data-name="Rectangle 17667" width="7.974" height="7.974" transform="translate(39.868 0)" fill="#fff"/>
<rect id="Rectangle_17668" data-name="Rectangle 17668" width="7.974" height="7.974" transform="translate(47.842 7.973)" fill="#fff"/>
<rect id="Rectangle_17671" data-name="Rectangle 17671" width="7.974" height="7.974" transform="translate(55.815 0)" fill="#fff"/>
<rect id="Rectangle_17672" data-name="Rectangle 17672" width="7.974" height="7.974" transform="translate(63.788 7.973)" fill="#fff"/>
<rect id="Rectangle_17675" data-name="Rectangle 17675" width="7.974" height="7.974" transform="translate(71.762 0)" fill="#fff"/>
<rect id="Rectangle_17676" data-name="Rectangle 17676" width="7.974" height="7.974" transform="translate(79.736 7.973)" fill="#fff"/>
<rect id="Rectangle_17679" data-name="Rectangle 17679" width="7.974" height="7.974" transform="translate(87.71 0)" fill="#fff"/>
<rect id="Rectangle_17680" data-name="Rectangle 17680" width="7.974" height="7.974" transform="translate(95.683 7.973)" fill="#fff"/>
<rect id="Rectangle_17682" data-name="Rectangle 17682" width="7.974" height="7.974" transform="translate(103.656 0)" fill="#fff"/>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
<g id="light-bulb" transform="translate(272.396 326.738)" opacity="0.07">
<path id="XMLID_49_" d="M52.08,62.218V64.3a3.3,3.3,0,0,1-2.8,3.267l-.513,1.89A2.352,2.352,0,0,1,46.5,71.2H41.415a2.352,2.352,0,0,1-2.271-1.743l-.5-1.89a3.314,3.314,0,0,1-2.813-3.282V62.2A2,2,0,0,1,37.84,60.2H50.073A2.023,2.023,0,0,1,52.08,62.218Zm9.42-28.04a17.452,17.452,0,0,1-4.922,12.174,16.084,16.084,0,0,0-4.307,8.731A2.9,2.9,0,0,1,49.4,57.53H38.514A2.872,2.872,0,0,1,35.657,55.1a16.263,16.263,0,0,0-4.336-8.761A17.538,17.538,0,1,1,61.5,34.178ZM45.942,23.557a1.979,1.979,0,0,0-1.978-1.978A12.67,12.67,0,0,0,31.306,34.237a1.978,1.978,0,1,0,3.955,0,8.713,8.713,0,0,1,8.7-8.7A1.97,1.97,0,0,0,45.942,23.557ZM43.964,10.885a1.979,1.979,0,0,0,1.978-1.978V1.978a1.978,1.978,0,0,0-3.955,0V8.907A1.979,1.979,0,0,0,43.964,10.885ZM20.685,34.164a1.979,1.979,0,0,0-1.978-1.978H11.778a1.978,1.978,0,0,0,0,3.955h6.929A1.97,1.97,0,0,0,20.685,34.164ZM76.15,32.186H69.22a1.978,1.978,0,0,0,0,3.955H76.15a1.978,1.978,0,0,0,0-3.955ZM24.714,50.63l-4.908,4.908a1.973,1.973,0,0,0,2.783,2.8L27.5,53.428a1.973,1.973,0,1,0-2.783-2.8ZM61.822,18.283a1.975,1.975,0,0,0,1.392-.571L68.122,12.8a1.979,1.979,0,1,0-2.8-2.8l-4.908,4.908a1.972,1.972,0,0,0,0,2.8A2.009,2.009,0,0,0,61.822,18.283ZM24.714,17.7A1.973,1.973,0,1,0,27.5,14.9L22.589,9.991a1.979,1.979,0,0,0-2.8,2.8Zm38.5,32.933a1.979,1.979,0,0,0-2.8,2.8l4.908,4.908a1.973,1.973,0,0,0,2.784-2.8Z" fill="#fff"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 37 KiB

@ -410,12 +410,12 @@
"infoDetail": "تفاصيل المعلومات",
"amount_detail": "تفاصيل المبلغ",
"currentBalance": "الرصيد الحالي",
"currentLeaveBalance" : "رصيد الاجازات الحالي",
"currentLeaveBalance": "رصيد الاجازات الحالي",
"calculatedDays": "الايام المحسوبه",
"totalDays": "مجموع الأيام",
"usedBalance": "المستخدم",
"infants":"رضيع",
"child":"طفل",
"infants": "رضيع",
"child": "طفل",
"adult": "بالغ",
"updateMember": "هل انت متأكد تريد تحديث بيانات هذا العضو؟",
"fieldIsEmpty": "'{data}' الحقل فارغ. الرجاء التحديد",
@ -456,10 +456,9 @@
"female": "Hello girl :) {}"
}
},
"reset_locale": "Reset Language",
"reset_locale": "إعادة ضبط اللغة",
"chat": "دردشة",
"mychats": "دردشاتي",
"createNewChat": "Create New Chat",
"advancedSearch": "بحث متقدم",
"openNot": "التبليغات المفتوحة",
"fyi": "تبليغات للعلم",
@ -470,5 +469,30 @@
"fromUserName": "من",
"sentDate": "تاريخ الإرسال",
"itemTypeDisplayName": "اسم العرض",
"none": "بدون"
"none": "بدون",
"createNewChat": "إنشاء محادثة جديدة",
"brainMarathon": "ماراثون الدماغ",
"contestTopicAbout": "سيكون موضوع المسابقة حول:",
"gameDate": "تاريخ اللعبة:",
"gameTime": "وقت اللعب:",
"joinMarathon": "انضم إلى ماراثون",
"joinDemoMarathon": "انضم إلى الماراثون التجريبي",
"minutes": "الدقائق",
"seconds": "ثواني",
"note": "ملحوظة:",
"demoMarathonNoteP1": "يمكنك لعب ماراثون العرض لتتعلم كيف يعمل. يمكنك الانضمام إلى ماراثون",
"demoMarathonNoteP2": "خمس دقائق",
"demoMarathonNoteP3": "قبل الوقت الفعلي.",
"sponsoredBy": "برعاية:",
"question": "سؤال",
"marathoners": "الماراثون",
"prize": "جائزة:",
"winnerSelection": "اختيار الفائز",
"qualifiers": "تصفيات",
"getReadyForContest": "استعد للمسابقة القادمة:",
"winnerSelectedRandomly": "سيتم اختيار الفائز عشوائياً من بين التصفيات.",
"fingersCrossed": "تشابك الاصابع!!!",
"congrats": "مبروك !!!",
"allQuestionsCorrect": "لقد أجبت على جميع الأسئلة بشكل صحيح."
}

@ -405,22 +405,22 @@
"addFavoriteList": "Do you want to add {name} in your favorite list",
"feedbackUserExperience": "This is to get the feedback about the user experience",
"rateUI": "1. How would you rate this UI?",
"submitSurvey":"Submit Survey",
"submitSurvey": "Submit Survey",
"typeHere": "Type here",
"infoDetail": "Info Detail",
"amount_detail": "Amount Detail",
"currentBalance": "Current Balance",
"currentLeaveBalance" : "Current Leave Balance",
"currentLeaveBalance": "Current Leave Balance",
"calculatedDays": "Calculated Days",
"totalDays": "Total Days",
"usedBalance": "Used",
"infants":"Infants",
"child":"Child",
"infants": "Infants",
"child": "Child",
"adult": "Adult",
"updateMember": "Are You Sure You Want to Update this Member?",
"fieldIsEmpty": "'{data}' Field is empty. Please select",
"pleaseEnterComments": "Please enter comments",
"skip": "skip",
"skip": "Skip",
"typeCurrentPasswordBelow": "Type Your Current password below",
"currentPassword": "Current password",
"concurrentReports": "Concurrent Reports",
@ -460,6 +460,22 @@
"chat": "Chat",
"mychats": "My Chats",
"createNewChat": "Create New Chat",
"brainMarathon": "Brain Marathon",
"contestTopicAbout": "Contest Topic will be about:",
"gameDate": "Game Date:",
"gameTime": "Game Time:",
"joinMarathon": "Join Marathon",
"joinDemoMarathon": "Join Demo Marathon",
"minutes": "Minutes",
"seconds": "Seconds",
"note": "Note:",
"demoMarathonNoteP1": "You can play the demo Marathon to learn how it works. You can join the Marathon",
"demoMarathonNoteP2": "5 Minutes",
"demoMarathonNoteP3": "before the actual time.",
"sponsoredBy": "Sponsored By:",
"question": "Question",
"marathoners": "Marathoners",
"prize": "Prize:",
"advancedSearch": "Advanced Search",
"openNot": "Open Notifications",
"fyi": "FYI Notifications",
@ -470,5 +486,12 @@
"fromUserName": "From User Name",
"sentDate": "Sent Date",
"itemTypeDisplayName": "Item Type Display Name",
"none": "None"
"none": "None",
"winnerSelection": "Winner Selection",
"qualifiers": "Qualifiers",
"getReadyForContest": "Get Ready for the coming contest:",
"winnerSelectedRandomly": "The winner will be selected randomly among the qualifiers.",
"fingersCrossed": "Fingers Crossed!!!",
"congrats": "Congratulations!!!",
"allQuestionsCorrect": "You have answered all questions correct"
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -345,6 +345,7 @@
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
@ -363,7 +364,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
@ -382,11 +383,11 @@
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = 99Z3UD3LJM;
DEVELOPMENT_TEAM = 3A359E86ZF;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = Mohemm;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
@ -423,6 +424,7 @@
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
@ -447,7 +449,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
@ -478,6 +480,7 @@
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
@ -496,10 +499,11 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
@ -516,11 +520,11 @@
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = 99Z3UD3LJM;
DEVELOPMENT_TEAM = 3A359E86ZF;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = Mohemm;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
@ -545,11 +549,11 @@
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = 99Z3UD3LJM;
DEVELOPMENT_TEAM = 3A359E86ZF;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = Mohemm;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",

@ -27,8 +27,6 @@
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
@ -38,8 +36,8 @@
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
<Testables>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
@ -61,8 +59,6 @@
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Profile"

@ -81,8 +81,8 @@ class ApiClient {
}
if (!kReleaseMode) {
print("Url:$url");
// var bodyJson = json.encode(jsonObject);
// print("body:$bodyJson");
var bodyJson = json.encode(jsonObject);
print("body:$bodyJson");
}
var response = await postJsonForResponse(url, jsonObject,
token: token,

@ -13,7 +13,6 @@ import 'package:mohem_flutter_app/models/chat/get_search_user_chat_model.dart';
import 'package:mohem_flutter_app/models/chat/get_single_user_chat_list_Model.dart';
import 'package:mohem_flutter_app/models/chat/get_user_login_token_model.dart' as login;
import 'package:shared_preferences/shared_preferences.dart';
import 'package:signalr_netcore/hub_connection.dart';
import 'package:signalr_netcore/signalr_client.dart';
import 'package:logger/logger.dart' as L;

@ -1,4 +1,5 @@
import 'dart:async';
import 'dart:convert';
import 'package:mohem_flutter_app/api/api_client.dart';
import 'package:mohem_flutter_app/app_state/app_state.dart';
@ -9,8 +10,12 @@ import 'package:mohem_flutter_app/models/dashboard/get_attendance_tracking_list_
import 'package:mohem_flutter_app/models/dashboard/itg_forms_model.dart';
import 'package:mohem_flutter_app/models/dashboard/list_menu.dart';
import 'package:mohem_flutter_app/models/generic_response_model.dart';
import 'package:mohem_flutter_app/models/itg/itg_main_response.dart';
import 'package:mohem_flutter_app/models/itg/itg_response_model.dart';
import 'package:uuid/uuid.dart';
class DashboardApiClient {
static final DashboardApiClient _instance = DashboardApiClient._internal();
@ -40,10 +45,7 @@ class DashboardApiClient {
Future<GenericResponseModel?> getCOCNotifications() async {
String url = "${ApiConsts.cocRest}Mohemm_ITG_ReviewerAdmin_Pending_Tasks";
Map<String, dynamic> postParams = {
"Date": DateUtil.getISODateFormat(DateTime.now()),
"EmployeeNumber": AppState().memberInformationList?.eMPLOYEENUMBER
};
Map<String, dynamic> postParams = {"Date": DateUtil.getISODateFormat(DateTime.now()), "EmployeeNumber": AppState().memberInformationList?.eMPLOYEENUMBER};
postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject((json) {
@ -62,8 +64,7 @@ class DashboardApiClient {
}, url, postParams);
}
Future<List<GetAccrualBalancesList>> getAccrualBalances(
String effectiveDate) async {
Future<List<GetAccrualBalancesList>> getAccrualBalances(String effectiveDate) async {
String url = "${ApiConsts.erpRest}GET_ACCRUAL_BALANCES";
Map<String, dynamic> postParams = {"P_EFFECTIVE_DATE": effectiveDate};
postParams.addAll(AppState().postParamsJson);
@ -97,10 +98,7 @@ class DashboardApiClient {
//GET_MENU_ENTRIES
Future<GenericResponseModel?> getGetMenuEntries() async {
String url = "${ApiConsts.erpRest}GET_MENU_ENTRIES";
Map<String, dynamic> postParams = {
"P_SELECTED_RESP_ID": -999,
"P_MENU_TYPE": "E"
};
Map<String, dynamic> postParams = {"P_SELECTED_RESP_ID": -999, "P_MENU_TYPE": "E"};
postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject((json) {
GenericResponseModel responseData = GenericResponseModel.fromJson(json);
@ -109,13 +107,7 @@ class DashboardApiClient {
}
//Mark Attendance
Future<GenericResponseModel?> markAttendance(
{String lat = "0",
String? long = "0",
required int pointType,
String nfcValue = "",
bool isGpsRequired = false,
String QRValue = ""}) async {
Future<GenericResponseModel?> markAttendance({String lat = "0", String? long = "0", required int pointType, String nfcValue = "", bool isGpsRequired = false, String QRValue = ""}) async {
String url = "${ApiConsts.swpRest}AuthenticateAndSwipeUserSupportNFC";
var uuid = Uuid();
// Generate a v4 (random) id
@ -136,4 +128,54 @@ class DashboardApiClient {
return responseData;
}, url, postParams);
}
//Check ITG Type
Future<MohemmItgResponseItem?> getITGPageNotification() async {
String url = "${ApiConsts.cocRest}Mohemm_ITG_GetPageNotification";
Map<String, dynamic> postParams = {
"EmployeeNumber": AppState().getUserName,
"ItgEnableAt": "After Service Submission", //Mobile Id
"ItgServiceName": "Login"
};
postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject((json) {
GenericResponseModel responseData = GenericResponseModel.fromJson(json);
MohemmItgResponseItem res = MohemmItgResponseItem.fromJson(jsonDecode(responseData.mohemmITGResponseItem ?? ""));
// var jsonDecodedData = jsonDecode(jsonDecode(responseData.mohemmITGResponseItem!)['result']['data']);
return res;
}, url, postParams);
}
//Submit ITG
Future<ItgMainRes?> submitItgForm({required String comment, required String masterId, required List<Map<String, dynamic>> itgList, required int serviceId}) async {
String url = "${ApiConsts.cocRest}Mohemm_ITG_Survey_Response";
Map<String, dynamic> postParams = {
"EmployeeNumber": AppState().getUserName,
"ItgComments": comment,
"ItgNotificationMasterId": masterId,
"ItgQuestionResponses": itgList,
"ItgSurveyId": serviceId
};
postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject((json) {
ItgMainRes responseData = ItgMainRes.fromJson(json);
return responseData;
}, url, postParams);
}
Future<ItgMainRes?> getAdvertisementDetail(String masterID) async {
String url = "${ApiConsts.cocRest}Mohemm_ITG_GetPageNotificationDetails";
Map<String, dynamic> postParams = {
"EmployeeNumber": AppState().getUserName,
"ItgNotificationMasterId": masterID, //Mobile Id
};
postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject((json) {
ItgMainRes responseData = ItgMainRes.fromJson(json);
return responseData;
}, url, postParams);
}
}

@ -357,6 +357,39 @@ class WorkListApiClient {
}, url, postParams);
}
Future<ITGRequest?> delegateITGRequest(String requestType, int taskId, int itemId, String employeeNumber,String newUserEMPId, String comments) async {
String url = "${ApiConsts.cocRest}ITGDelegateRequest";
Map<String, dynamic> postParams = {
"RequestType": requestType,
"TaskID": taskId,
"ItemID": itemId,
"EmployeeNumber": employeeNumber,
"NewUserEMPId": newUserEMPId,
"Comments": comments,
};
postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject((json) {
ItgFormsModel responseData = ItgFormsModel.fromJson(json);
return responseData.itgRequest;
}, url, postParams);
}
Future<ITGRequest?> informationITGRequest(String requestType, int taskId, int itemId, String employeeNumber,String newUserEMPId, String comments) async {
String url = "${ApiConsts.cocRest}ITGRequestInformation";
Map<String, dynamic> postParams = {
"RequestType": requestType,
"TaskID": taskId,
"ItemID": itemId,
"EmployeeNumber": employeeNumber,
"NewUserEMPId": newUserEMPId,
"Comments": comments,
};
postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject((json) {
ItgFormsModel responseData = ItgFormsModel.fromJson(json);
return responseData.itgRequest;
}, url, postParams);
}
//HR Detail Screen Requests
Future<List<GetEitCollectionNotificationBodyList>?> GetEitNotificationBody(int? notificationId) async {
String url = "${ApiConsts.erpRest}GET_EIT_NOTIFICATION_BODY";

@ -1,6 +1,7 @@
import 'package:flutter/cupertino.dart';
class MyColors {
static const Color kWhiteColor = Color(0xffffffff);
static const Color darkIconColor = Color(0xff28323A);
static const Color darkTextColor = Color(0xff2B353E);
static const Color normalTextColor = Color(0xff5A5A5A);
@ -31,6 +32,7 @@ class MyColors {
static const Color yellowColor = Color(0xffF4E31C);
static const Color orange = Color(0xFFCC9B14);
static const Color yellowFavColor = Color(0xffEAC321);
static const Color yellowColorII = Color(0xffEAA118);
static const Color backgroundBlackColor = Color(0xff202529);
static const Color black = Color(0xff000000);
static const Color white = Color(0xffffffff);

@ -0,0 +1,22 @@
import 'package:flutter/material.dart';
import 'package:mohem_flutter_app/classes/colors.dart';
class MyDecorations {
static Decoration shadowDecoration = BoxDecoration(
color: MyColors.kWhiteColor,
borderRadius: BorderRadius.circular(15),
boxShadow: [
BoxShadow(
color: const Color(0xff000000).withOpacity(.05),
blurRadius: 26,
offset: const Offset(0, -3),
),
],
);
static Decoration answerContainerDecoration = BoxDecoration(
borderRadius: BorderRadius.circular(10),
color: MyColors.greyF7Color,
border: Border.all(width: 1, color: MyColors.lightGreyEFColor),
);
}

@ -0,0 +1,7 @@
class MyLottieConsts {
static const String hourGlassLottie = "assets/lottie/hourglass.json";
static const String celebrate1Lottie = "assets/lottie/celebrate1.json";
static const String celebrate2Lottie = "assets/lottie/celebrate2.json";
static const String winnerLottie = "assets/lottie/winner3.json";
static const String allQuestions = "assets/lottie/all_questions.json";
}

@ -6,7 +6,7 @@ import 'package:mohem_flutter_app/ui/bottom_sheets/attendence_details_bottom_she
import 'package:mohem_flutter_app/ui/chat/chat_detailed_screen.dart';
import 'package:mohem_flutter_app/ui/chat/chat_home.dart';
import 'package:mohem_flutter_app/ui/landing/dashboard_screen.dart';
import 'package:mohem_flutter_app/ui/landing/survey_screen.dart';
import 'package:mohem_flutter_app/ui/landing/itg/survey_screen.dart';
import 'package:mohem_flutter_app/ui/landing/today_attendance_screen.dart';
import 'package:mohem_flutter_app/ui/leave_balance/add_leave_balance_screen.dart';
import 'package:mohem_flutter_app/ui/leave_balance/leave_balance_screen.dart';
@ -16,6 +16,10 @@ import 'package:mohem_flutter_app/ui/login/login_screen.dart';
import 'package:mohem_flutter_app/ui/login/new_password_screen.dart';
import 'package:mohem_flutter_app/ui/login/verify_last_login_screen.dart';
import 'package:mohem_flutter_app/ui/login/verify_login_screen.dart';
import 'package:mohem_flutter_app/ui/marathon/marathon_intro_screen.dart';
import 'package:mohem_flutter_app/ui/marathon/marathon_screen.dart';
import 'package:mohem_flutter_app/ui/marathon/marathon_winner_selection.dart';
import 'package:mohem_flutter_app/ui/marathon/winner_screen.dart';
import 'package:mohem_flutter_app/ui/misc/request_submit_screen.dart';
import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart';
import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart';
@ -110,7 +114,8 @@ class AppRoutes {
static const String addVacationRule = "/addVacationRule";
//Bottom Sheet
static const String attendanceDetailsBottomSheet = "/attendanceDetailsBottomSheet";
static const String attendanceDetailsBottomSheet =
"/attendanceDetailsBottomSheet";
//Profile
static const String profile = "/profile";
@ -128,7 +133,8 @@ class AppRoutes {
// Pending Transactions
static const String pendingTransactions = "/pendingTransactions";
static const String pendingTransactionsDetails = "/pendingTransactionsDetails";
static const String pendingTransactionsDetails =
"/pendingTransactionsDetails";
// Announcements
static const String announcements = "/announcements";
@ -154,7 +160,6 @@ class AppRoutes {
static const String performanceEvaluation = "/performanceEvaluation";
static const String endEmploymentScreen = "/endEmploymentScreen";
//My Team
@ -172,105 +177,123 @@ class AppRoutes {
static const String chat = "/chat";
static const String chatDetailed = "/chatDetailed";
//Marathon
static const String marathonIntroScreen = "/marathonIntroScreen";
static const String marathonScreen = "/marathonScreen";
static const String marathonWinnerSelection = "/marathonWinnerSelection";
static const String marathonWinnerScreen = "/marathonWinnerScreen";
static final Map<String, WidgetBuilder> routes = {
login: (context) => LoginScreen(),
verifyLogin: (context) => VerifyLoginScreen(),
verifyLastLogin: (context) => VerifyLastLoginScreen(),
dashboard: (context) => DashboardScreen(),
survey: (context) => SurveyScreen(),
subMenuScreen: (context) => SubMenuScreen(),
newPassword: (context) => NewPasswordScreen(),
forgotPassword: (context) => ForgotPasswordScreen(),
todayAttendance: (context) => TodayAttendanceScreen(),
login: (BuildContext context) => LoginScreen(),
verifyLogin: (BuildContext context) => VerifyLoginScreen(),
verifyLastLogin: (BuildContext context) => VerifyLastLoginScreen(),
dashboard: (BuildContext context) => DashboardScreen(),
survey: (BuildContext context) => SurveyScreen(),
subMenuScreen: (BuildContext context) => SubMenuScreen(),
newPassword: (BuildContext context) => NewPasswordScreen(),
forgotPassword: (BuildContext context) => ForgotPasswordScreen(),
todayAttendance: (BuildContext context) => TodayAttendanceScreen(),
//eit
addEitScreen: (context) => AddEITScreen(),
addEitScreen: (BuildContext context) => AddEITScreen(),
//Work List
workList: (context) => WorkListScreen(),
workListDetail: (context) => WorkListDetailScreen(),
itgDetail: (context) => ItgDetailScreen(),
itemHistory: (context) => ItemHistoryScreen(),
worklistSettings: (context) => WorklistSettings(),
workList: (BuildContext context) => WorkListScreen(),
workListDetail: (BuildContext context) => WorkListDetailScreen(),
itgDetail: (BuildContext context) => ItgDetailScreen(),
itemHistory: (BuildContext context) => ItemHistoryScreen(),
worklistSettings: (BuildContext context) => WorklistSettings(),
// Leave Balance
leaveBalance: (context) => LeaveBalance(),
addLeaveBalance: (context) => AddLeaveBalanceScreen(),
leaveBalance: (BuildContext context) => LeaveBalance(),
addLeaveBalance: (BuildContext context) => AddLeaveBalanceScreen(),
servicesMenuListScreen: (context) => ServicesMenuListScreen(),
// workFromHome: (context) => WorkFromHomeScreen(),
// addWorkFromHome: (context) => AddWorkFromHomeScreen(),
profile: (context) => ProfileScreen(),
servicesMenuListScreen: (BuildContext context) => ServicesMenuListScreen(),
// workFromHome: (BuildContext context) => WorkFromHomeScreen(),
// addWorkFromHome: (BuildContext context) => AddWorkFromHomeScreen(),
profile: (BuildContext context) => ProfileScreen(),
//Attendance
monthlyAttendance: (context) => MonthlyAttendanceScreen(),
vacationRule: (context) => VacationRuleScreen(),
addVacationRule: (context) => AddVacationRuleScreen(),
monthlyAttendance: (BuildContext context) => MonthlyAttendanceScreen(),
vacationRule: (BuildContext context) => VacationRuleScreen(),
addVacationRule: (BuildContext context) => AddVacationRuleScreen(),
//Bottom Sheet
attendanceDetailsBottomSheet: (context) => AttendenceDetailsBottomSheet(),
attendanceDetailsBottomSheet: (BuildContext context) =>
AttendenceDetailsBottomSheet(),
//Profile
//profile: (context) => Profile(),
//profile: (context) => Profile(),
personalInfo: (context) => PersonalInfo(),
basicDetails: (context) => BasicDetails(),
contactDetails: (context) => ContactDetails(),
familyMembers: (context) => FamilyMembers(),
dynamicScreen: (context) => DynamicListViewScreen(),
addDynamicInput: (context) => DynamicInputScreen(),
addDynamicInputProfile: (context) => DynamicInputScreenProfile(),
addDynamicAddressScreen: (context) => DynamicInputScreenAddress(),
deleteFamilyMember: (context) => DeleteFamilyMember(ModalRoute.of(context)!.settings.arguments as int),
requestSubmitScreen: (context) => RequestSubmitScreen(),
addUpdateFamilyMember: (context) => AddUpdateFamilyMember(),
//profile: (BuildContext context) => Profile(),
//profile: (BuildContext context) => Profile(),
personalInfo: (BuildContext context) => PersonalInfo(),
basicDetails: (BuildContext context) => BasicDetails(),
contactDetails: (BuildContext context) => ContactDetails(),
familyMembers: (BuildContext context) => FamilyMembers(),
dynamicScreen: (BuildContext context) => DynamicListViewScreen(),
addDynamicInput: (BuildContext context) => DynamicInputScreen(),
addDynamicInputProfile: (BuildContext context) =>
DynamicInputScreenProfile(),
addDynamicAddressScreen: (BuildContext context) =>
DynamicInputScreenAddress(),
deleteFamilyMember: (BuildContext context) =>
DeleteFamilyMember(ModalRoute.of(context)!.settings.arguments as int),
requestSubmitScreen: (BuildContext context) => RequestSubmitScreen(),
addUpdateFamilyMember: (BuildContext context) => AddUpdateFamilyMember(),
//mowadhafhi
mowadhafhi: (context) => MowadhafhiHome(),
mowadhafhiDetails: (context) => MowadhafhiRequestDetails(),
mowadhafhiHRRequest: (context) => MowadhafhiHRRequest(),
mowadhafhi: (BuildContext context) => MowadhafhiHome(),
mowadhafhiDetails: (BuildContext context) => MowadhafhiRequestDetails(),
mowadhafhiHRRequest: (BuildContext context) => MowadhafhiHRRequest(),
pendingTransactions: (context) => PendingTransactions(),
pendingTransactionsDetails: (context) => PendingTransactionsDetails(),
pendingTransactions: (BuildContext context) => PendingTransactions(),
pendingTransactionsDetails: (BuildContext context) =>
PendingTransactionsDetails(),
announcements: (context) => Announcements(),
announcementsDetails: (context) => AnnouncementDetails(),
announcements: (BuildContext context) => Announcements(),
announcementsDetails: (BuildContext context) => AnnouncementDetails(),
//My Requests
myRequests: (context) => MyRequests(),
newRequest: (context) => NewRequest(),
myRequests: (BuildContext context) => MyRequests(),
newRequest: (BuildContext context) => NewRequest(),
// Items for sale
itemsForSale: (context) => ItemsForSale(),
itemsForSaleDetail: (context) => ItemForSaleDetailPage(),
addNewItemForSale: (context) => AddNewItemForSale(),
itemsForSale: (BuildContext context) => ItemsForSale(),
itemsForSaleDetail: (BuildContext context) => ItemForSaleDetailPage(),
addNewItemForSale: (BuildContext context) => AddNewItemForSale(),
// Offers & Discounts
offersAndDiscounts: (context) => OffersAndDiscountsHome(),
offersAndDiscountsDetails: (context) => OffersAndDiscountsDetails(),
offersAndDiscounts: (BuildContext context) => OffersAndDiscountsHome(),
offersAndDiscountsDetails: (BuildContext context) =>
OffersAndDiscountsDetails(),
//pay slip
monthlyPaySlip: (context) => MonthlyPaySlipScreen(),
performanceEvaluation: (context) => PerformanceAppraisal(),
monthlyPaySlip: (BuildContext context) => MonthlyPaySlipScreen(),
performanceEvaluation: (BuildContext context) => PerformanceAppraisal(),
endEmploymentScreen: (context) => EndEmploymentScreen(),
endEmploymentScreen: (BuildContext context) => EndEmploymentScreen(),
//My Team
myTeam: (context) => MyTeam(),
employeeDetails: (context) => EmployeeDetails(),
profileDetails: (context) => ProfileDetails(),
viewAttendance: (context) => ViewAttendance(),
teamMembers: (context) => TeamMembers(),
createRequest: (context) => CreateRequest(),
subordinateLeave: (context) => SubordinateLeave(),
myTeam: (BuildContext context) => MyTeam(),
employeeDetails: (BuildContext context) => EmployeeDetails(),
profileDetails: (BuildContext context) => ProfileDetails(),
viewAttendance: (BuildContext context) => ViewAttendance(),
teamMembers: (BuildContext context) => TeamMembers(),
createRequest: (BuildContext context) => CreateRequest(),
subordinateLeave: (BuildContext context) => SubordinateLeave(),
changePassword: (context) => ChangePasswordScreen(),
changePassword: (BuildContext context) => ChangePasswordScreen(),
//Chat
chat: (context) => ChatHomeScreen(),
chatDetailed: (context) => ChatDetailScreen(),
chat: (BuildContext context) => ChatHomeScreen(),
chatDetailed: (BuildContext context) => ChatDetailScreen(),
// Marathon
marathonIntroScreen: (BuildContext context) => MarathonIntroScreen(),
marathonScreen: (BuildContext context) => MarathonScreen(),
marathonWinnerSelection: (BuildContext context) =>
MarathonWinnerSelection(),
marathonWinnerScreen: (BuildContext context) => WinnerScreen(),
};
}

@ -16,10 +16,10 @@ extension CapExtension on String {
extension EmailValidator on String {
Widget get toWidget => Text(this);
Widget toText10({Color? color, bool isBold = false, int? maxlines}) => Text(
Widget toText10({Color? color, bool isBold = false, int? maxlines, FontStyle? fontStyle}) => Text(
this,
//maxLines: maxlines,
style: TextStyle(fontSize: 10, fontWeight: isBold ? FontWeight.bold : FontWeight.w600, color: color ?? MyColors.darkTextColor, letterSpacing: -0.4),
style: TextStyle(fontSize: 10, fontStyle: fontStyle ?? FontStyle.normal, fontWeight: isBold ? FontWeight.bold : FontWeight.w600, color: color ?? MyColors.darkTextColor, letterSpacing: -0.4),
);
Widget toText11({Color? color, FontWeight? weight, bool isUnderLine = false, bool isBold = false}) => Text(
@ -47,18 +47,42 @@ extension EmailValidator on String {
);
Widget toText12Auto({Color? color, bool isUnderLine = false, bool isBold = false, bool isCenter = false, int maxLine = 0}) => AutoSizeText(
this,
textAlign: isCenter ? TextAlign.center : null,
maxLines: (maxLine > 0) ? maxLine : null,
minFontSize: 8,
style: TextStyle(
fontSize: 12,
fontWeight: isBold ? FontWeight.bold : FontWeight.w600,
color: color ?? MyColors.darkTextColor,
letterSpacing: -0.72,
decoration: isUnderLine ? TextDecoration.underline : null,
),
);
this,
textAlign: isCenter ? TextAlign.center : null,
maxLines: (maxLine > 0) ? maxLine : null,
minFontSize: 8,
style: TextStyle(
fontSize: 12,
fontWeight: isBold ? FontWeight.bold : FontWeight.w600,
color: color ?? MyColors.darkTextColor,
letterSpacing: -0.72,
decoration: isUnderLine ? TextDecoration.underline : null,
),
);
Widget toTextAuto({
Color? color,
bool isUnderLine = false,
bool isBold = false,
bool isCenter = false,
int maxLine = 0,
double fontSize = 12,
double letterSpacing = -0.72,
double height = 1,
}) =>
AutoSizeText(
this,
textAlign: isCenter ? TextAlign.center : null,
maxLines: (maxLine > 0) ? maxLine : null,
minFontSize: 8,
style: TextStyle(
fontSize: fontSize,
fontWeight: isBold ? FontWeight.bold : FontWeight.w600,
color: color ?? MyColors.darkTextColor,
letterSpacing: letterSpacing,
decoration: isUnderLine ? TextDecoration.underline : null,
),
);
Widget toText13({Color? color, bool isUnderLine = false}) => Text(
this,
@ -68,7 +92,12 @@ extension EmailValidator on String {
Widget toText14({Color? color, bool isUnderLine = false, bool isBold = false, FontWeight? weight, int? maxlines}) => Text(
this,
maxLines: maxlines,
style: TextStyle(color: color ?? MyColors.darkTextColor, fontSize: 14, letterSpacing: -0.48, fontWeight: weight ?? (isBold ? FontWeight.bold : FontWeight.w600), decoration: isUnderLine ? TextDecoration.underline : null),
style: TextStyle(
color: color ?? MyColors.darkTextColor,
fontSize: 14,
letterSpacing: -0.48,
fontWeight: weight ?? (isBold ? FontWeight.bold : FontWeight.w600),
decoration: isUnderLine ? TextDecoration.underline : null),
);
Widget toText16({Color? color, bool isUnderLine = false, bool isBold = false, int? maxlines}) => Text(
@ -94,9 +123,9 @@ extension EmailValidator on String {
);
Widget toText19({Color? color, bool isBold = false}) => Text(
this,
style: TextStyle(fontSize: 19, fontWeight: isBold ? FontWeight.bold : FontWeight.w600, color: color ?? MyColors.darkTextColor, letterSpacing: -1.14),
);
this,
style: TextStyle(fontSize: 19, fontWeight: isBold ? FontWeight.bold : FontWeight.w600, color: color ?? MyColors.darkTextColor, letterSpacing: -1.14),
);
Widget toText20({Color? color, bool isBold = false}) => Text(
this,
@ -104,10 +133,10 @@ extension EmailValidator on String {
);
Widget toText21({Color? color, bool isBold = false, FontWeight? weight, int? maxlines}) => Text(
this,
maxLines: maxlines,
style: TextStyle(color: color ?? MyColors.grey3AColor, fontSize: 21, letterSpacing: -0.31, fontWeight: weight ?? (isBold ? FontWeight.bold : FontWeight.w600)),
);
this,
maxLines: maxlines,
style: TextStyle(color: color ?? MyColors.grey3AColor, fontSize: 21, letterSpacing: -0.31, fontWeight: weight ?? (isBold ? FontWeight.bold : FontWeight.w600)),
);
Widget toText22({Color? color, bool isBold = false}) => Text(
this,

@ -12,12 +12,21 @@ extension WidgetExtensions on Widget {
Widget get center => Center(child: this);
Widget circle(double _value) => ClipRRect(borderRadius: BorderRadius.circular(_value), child: this);
Widget circle(double _value) =>
ClipRRect(borderRadius: BorderRadius.circular(_value), child: this);
Widget paddingAll(double _value) => Padding(padding: EdgeInsets.all(_value), 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);
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);
Widget toShimmer({bool isShow = true}) => isShow
? Shimmer.fromColors(
@ -42,9 +51,15 @@ extension WidgetExtensions on Widget {
child: this,
);
Widget objectContainerView({String title = "", String note = "", bool disablePadding = false, double radius = 15}) {
Widget objectContainerView(
{String title = "",
String note = "",
bool disablePadding = false,
double radius = 15}) {
return Container(
padding: disablePadding ? EdgeInsets.zero : const EdgeInsets.only(top: 15, bottom: 15, left: 14, right: 14),
padding: disablePadding
? EdgeInsets.zero
: const EdgeInsets.only(top: 15, bottom: 15, left: 14, right: 14),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(radius),
@ -55,7 +70,8 @@ extension WidgetExtensions on Widget {
offset: const Offset(0, -3),
),
],
),alignment: Alignment.center,
),
alignment: Alignment.center,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
@ -69,9 +85,19 @@ extension WidgetExtensions on Widget {
);
}
Widget objectContainerBorderView({String title = "", String note = "", bool disablePadding = false, double radius = 15, Color? color, Color borderColor = MyColors.lightGreyEFColor,bool disableWidth = false,bool isAlignment = false }) {
Widget objectContainerBorderView(
{String title = "",
String note = "",
bool disablePadding = false,
double radius = 15,
Color? color,
Color borderColor = MyColors.lightGreyEFColor,
bool disableWidth = false,
bool isAlignment = false}) {
return Container(
padding: disablePadding ? EdgeInsets.zero : const EdgeInsets.only(top: 15, bottom: 15, left: 14, right: 14),
padding: disablePadding
? EdgeInsets.zero
: const EdgeInsets.only(top: 15, bottom: 15, left: 14, right: 14),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(radius),
color: color,
@ -80,7 +106,7 @@ extension WidgetExtensions on Widget {
width: disableWidth ? 2 : 1,
),
),
alignment: isAlignment? Alignment.center : null,
alignment: isAlignment ? Alignment.center : null,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,

@ -472,10 +472,9 @@ class CodegenLoader extends AssetLoader{
"female": "Hello girl :) {}"
}
},
"reset_locale": "Reset Language",
"reset_locale": "إعادة ضبط اللغة",
"chat": "دردشة",
"mychats": "دردشاتي",
"createNewChat": "Create New Chat",
"advancedSearch": "بحث متقدم",
"openNot": "التبليغات المفتوحة",
"fyi": "تبليغات للعلم",
@ -486,7 +485,31 @@ class CodegenLoader extends AssetLoader{
"fromUserName": "من",
"sentDate": "تاريخ الإرسال",
"itemTypeDisplayName": "اسم العرض",
"none": "بدون"
"none": "بدون",
"createNewChat": "إنشاء محادثة جديدة",
"brainMarathon": "ماراثون الدماغ",
"contestTopicAbout": "سيكون موضوع المسابقة حول:",
"gameDate": "تاريخ اللعبة:",
"gameTime": "وقت اللعب:",
"joinMarathon": "انضم إلى ماراثون",
"joinDemoMarathon": "انضم إلى الماراثون التجريبي",
"minutes": "الدقائق",
"seconds": "ثواني",
"note": "ملحوظة:",
"demoMarathonNoteP1": "يمكنك لعب ماراثون العرض لتتعلم كيف يعمل. يمكنك الانضمام إلى ماراثون",
"demoMarathonNoteP2": "خمس دقائق",
"demoMarathonNoteP3": "قبل الوقت الفعلي.",
"sponsoredBy": "برعاية:",
"question": "سؤال",
"marathoners": "الماراثون",
"prize": "جائزة:",
"winnerSelection": "اختيار الفائز",
"qualifiers": "تصفيات",
"getReadyForContest": "استعد للمسابقة القادمة:",
"winnerSelectedRandomly": "سيتم اختيار الفائز عشوائياً من بين التصفيات.",
"fingersCrossed": "تشابك الاصابع!!!",
"congrats": "مبروك !!!",
"allQuestionsCorrect": "لقد أجبت على جميع الأسئلة بشكل صحيح."
};
static const Map<String,dynamic> en_US = {
"mohemm": "Mohemm",
@ -910,7 +933,7 @@ static const Map<String,dynamic> en_US = {
"updateMember": "Are You Sure You Want to Update this Member?",
"fieldIsEmpty": "'{data}' Field is empty. Please select",
"pleaseEnterComments": "Please enter comments",
"skip": "skip",
"skip": "Skip",
"typeCurrentPasswordBelow": "Type Your Current password below",
"currentPassword": "Current password",
"concurrentReports": "Concurrent Reports",
@ -950,6 +973,22 @@ static const Map<String,dynamic> en_US = {
"chat": "Chat",
"mychats": "My Chats",
"createNewChat": "Create New Chat",
"brainMarathon": "Brain Marathon",
"contestTopicAbout": "Contest Topic will be about:",
"gameDate": "Game Date:",
"gameTime": "Game Time:",
"joinMarathon": "Join Marathon",
"joinDemoMarathon": "Join Demo Marathon",
"minutes": "Minutes",
"seconds": "Seconds",
"note": "Note:",
"demoMarathonNoteP1": "You can play the demo Marathon to learn how it works. You can join the Marathon",
"demoMarathonNoteP2": "5 Minutes",
"demoMarathonNoteP3": "before the actual time.",
"sponsoredBy": "Sponsored By:",
"question": "Question",
"marathoners": "Marathoners",
"prize": "Prize:",
"advancedSearch": "Advanced Search",
"openNot": "Open Notifications",
"fyi": "FYI Notifications",
@ -960,7 +999,14 @@ static const Map<String,dynamic> en_US = {
"fromUserName": "From User Name",
"sentDate": "Sent Date",
"itemTypeDisplayName": "Item Type Display Name",
"none": "None"
"none": "None",
"winnerSelection": "Winner Selection",
"qualifiers": "Qualifiers",
"getReadyForContest": "Get Ready for the coming contest:",
"winnerSelectedRandomly": "The winner will be selected randomly among the qualifiers.",
"fingersCrossed": "Fingers Crossed!!!",
"congrats": "Congratulations!!!",
"allQuestionsCorrect": "You have answered all questions correct"
};
static const Map<String, Map<String,dynamic>> mapLocales = {"ar_SA": ar_SA, "en_US": en_US};
}

@ -445,7 +445,6 @@ abstract class LocaleKeys {
static const reset_locale = 'reset_locale';
static const chat = 'chat';
static const mychats = 'mychats';
static const createNewChat = 'createNewChat';
static const advancedSearch = 'advancedSearch';
static const openNot = 'openNot';
static const fyi = 'fyi';
@ -457,5 +456,29 @@ abstract class LocaleKeys {
static const sentDate = 'sentDate';
static const itemTypeDisplayName = 'itemTypeDisplayName';
static const none = 'none';
static const createNewChat = 'createNewChat';
static const brainMarathon = 'brainMarathon';
static const contestTopicAbout = 'contestTopicAbout';
static const gameDate = 'gameDate';
static const gameTime = 'gameTime';
static const joinMarathon = 'joinMarathon';
static const joinDemoMarathon = 'joinDemoMarathon';
static const minutes = 'minutes';
static const seconds = 'seconds';
static const note = 'note';
static const demoMarathonNoteP1 = 'demoMarathonNoteP1';
static const demoMarathonNoteP2 = 'demoMarathonNoteP2';
static const demoMarathonNoteP3 = 'demoMarathonNoteP3';
static const sponsoredBy = 'sponsoredBy';
static const question = 'question';
static const marathoners = 'marathoners';
static const prize = 'prize';
static const winnerSelection = 'winnerSelection';
static const qualifiers = 'qualifiers';
static const getReadyForContest = 'getReadyForContest';
static const winnerSelectedRandomly = 'winnerSelectedRandomly';
static const fingersCrossed = 'fingersCrossed';
static const congrats = 'congrats';
static const allQuestionsCorrect = 'allQuestionsCorrect';
}

@ -7,23 +7,30 @@ import 'package:mohem_flutter_app/api/chat/chat_provider_model.dart';
import 'package:mohem_flutter_app/app_state/app_state.dart';
import 'package:mohem_flutter_app/config/routes.dart';
import 'package:mohem_flutter_app/generated/codegen_loader.g.dart';
import 'package:mohem_flutter_app/models/post_params_model.dart';
import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart';
import 'package:mohem_flutter_app/provider/eit_provider_model.dart';
import 'package:mohem_flutter_app/theme/app_theme.dart';
import 'package:mohem_flutter_app/ui/marathon/marathon_provider.dart';
import 'package:month_year_picker/month_year_picker.dart';
import 'package:provider/provider.dart';
import 'package:provider/single_child_widget.dart';
import 'package:sizer/sizer.dart';
var logger = Logger(
Logger logger = Logger(
// filter: null, // Use the default LogFilter (-> only log in debug mode)
printer: PrettyPrinter(lineLength: 0), // Use the PrettyPrinter to format and print log
printer: PrettyPrinter(
lineLength: 0,
), // Use the PrettyPrinter to format and print log
// output: null, // U
);
class MyHttpOverrides extends HttpOverrides {
@override
HttpClient createHttpClient(SecurityContext? context) {
return super.createHttpClient(context)..badCertificateCallback = (X509Certificate cert, String host, int port) => true;
return super.createHttpClient(context)
..badCertificateCallback =
(X509Certificate cert, String host, int port) => true;
}
}
@ -34,49 +41,64 @@ Future<void> main() async {
HttpOverrides.global = MyHttpOverrides();
runApp(
EasyLocalization(
supportedLocales: const [
supportedLocales: const <Locale>[
Locale('en', 'US'),
Locale('ar', 'SA'),
],
path: 'assets/langs',
assetLoader: CodegenLoader(),
assetLoader: const CodegenLoader(),
child: MultiProvider(
providers: [
ChangeNotifierProvider(create: (_) => DashboardProviderModel()),
ChangeNotifierProvider(create: (_) => EITProviderModel()),
ChangeNotifierProvider(create: (_) => ChatProviderModel())
providers: <SingleChildWidget>[
ChangeNotifierProvider<DashboardProviderModel>(
create: (_) => DashboardProviderModel(),
),
ChangeNotifierProvider<EITProviderModel>(
create: (_) => EITProviderModel(),
),
ChangeNotifierProvider<ChatProviderModel>(
create: (_) => ChatProviderModel(),
),
ChangeNotifierProvider<MarathonProvider>(
create: (_) => MarathonProvider(),
)
],
child: MyApp(),
child: const MyApp(),
),
),
);
}
// todo terminal command to genertate translation files
// todo terminal command to generate translation files
// flutter pub run easy_localization:generate --source-dir ./assets/langs
// todo terminal command to genertate translation keys
// todo terminal command to generate translation keys
// flutter pub run easy_localization:generate --source-dir ./assets/langs -f keys -o locale_keys.g.dart
// command to generate languages data from json
class MyApp extends StatelessWidget {
MyApp() {
// AppDependencies.addDependencies();
}
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Sizer(
builder: (context, orientation, deviceType) {
var obj = AppState().postParamsObject;
obj?.languageID = EasyLocalization.of(context)?.locale.languageCode == "ar" ? 1 : 2;
builder: (
BuildContext context,
Orientation orientation,
DeviceType deviceType,
) {
PostParamsModel? obj = AppState().postParamsObject;
obj?.languageID =
EasyLocalization.of(context)?.locale.languageCode == "ar" ? 1 : 2;
AppState().setPostParamsModel(obj!);
List<LocalizationsDelegate> delegates = context.localizationDelegates;
List<LocalizationsDelegate<dynamic>> delegates =
context.localizationDelegates;
// delegates.add(GlobalMaterialLocalizations.delegate);
delegates.add(
MonthYearPickerLocalizations.delegate,
);
return MaterialApp(
theme: AppTheme.getTheme(EasyLocalization.of(context)?.locale.languageCode == "ar"),
theme: AppTheme.getTheme(
EasyLocalization.of(context)?.locale.languageCode == "ar",
),
debugShowCheckedModeBanner: false,
localizationsDelegates: delegates,
supportedLocales: context.supportedLocales,

@ -0,0 +1,99 @@
class Advertisement {
Advertisement({
this.advertisementId,
this.advertisementTitle,
this.durationInSeconds,
this.showDelete,
this.acknowledgment,
this.viewAttachFileColl,
this.isActive,
this.pageSize,
this.pageNo,
this.languageId,
});
final int? advertisementId;
final String? advertisementTitle;
final int? durationInSeconds;
final bool? showDelete;
final dynamic acknowledgment;
final List<ViewAttachFileColl>? viewAttachFileColl;
final bool? isActive;
final dynamic pageSize;
final dynamic pageNo;
final dynamic languageId;
factory Advertisement.fromJson(Map<String, dynamic> json) => Advertisement(
advertisementId: json["advertisementId"] == null ? null : json["advertisementId"],
advertisementTitle: json["advertisementTitle"] == null ? null : json["advertisementTitle"],
durationInSeconds: json["durationInSeconds"] == null ? null : json["durationInSeconds"],
showDelete: json["showDelete"] == null ? null : json["showDelete"],
acknowledgment: json["acknowledgment"],
viewAttachFileColl: json["viewAttachFileColl"] == null ? null : List<ViewAttachFileColl>.from(json["viewAttachFileColl"].map((x) => ViewAttachFileColl.fromJson(x))),
isActive: json["isActive"] == null ? null : json["isActive"],
pageSize: json["pageSize"],
pageNo: json["pageNo"],
languageId: json["languageId"],
);
Map<String, dynamic> toJson() => {
"advertisementId": advertisementId == null ? null : advertisementId,
"advertisementTitle": advertisementTitle == null ? null : advertisementTitle,
"durationInSeconds": durationInSeconds == null ? null : durationInSeconds,
"showDelete": showDelete == null ? null : showDelete,
"acknowledgment": acknowledgment,
"viewAttachFileColl": viewAttachFileColl == null ? null : List<dynamic>.from(viewAttachFileColl!.map((x) => x.toJson())),
"isActive": isActive == null ? null : isActive,
"pageSize": pageSize,
"pageNo": pageNo,
"languageId": languageId,
};
}
class ViewAttachFileColl {
ViewAttachFileColl({
this.attachmentId,
this.fileName,
this.contentType,
this.attachFileStream,
this.base64String,
this.isActive,
this.referenceItemId,
this.content,
this.filePath,
});
final dynamic attachmentId;
final String? fileName;
final String? contentType;
final dynamic attachFileStream;
final String? base64String;
final dynamic isActive;
final dynamic referenceItemId;
final dynamic content;
final dynamic filePath;
factory ViewAttachFileColl.fromJson(Map<String, dynamic> json) => ViewAttachFileColl(
attachmentId: json["attachmentId"],
fileName: json["fileName"] == null ? null : json["fileName"],
contentType: json["contentType"] == null ? null : json["contentType"],
attachFileStream: json["attachFileStream"],
base64String: json["base64String"] == null ? null : json["base64String"],
isActive: json["isActive"],
referenceItemId: json["referenceItemId"],
content: json["content"],
filePath: json["filePath"],
);
Map<String, dynamic> toJson() => {
"attachmentId": attachmentId,
"fileName": fileName == null ? null : fileName,
"contentType": contentType == null ? null : contentType,
"attachFileStream": attachFileStream,
"base64String": base64String == null ? null : base64String,
"isActive": isActive,
"referenceItemId": referenceItemId,
"content": content,
"filePath": filePath,
};
}

@ -0,0 +1,195 @@
// To parse this JSON data, do
//
// final itgRes = itgResFromJson(jsonString);
import 'dart:convert';
import 'package:mohem_flutter_app/models/itg/itg_response_model.dart';
ItgMainRes itgResFromJson(String str) => ItgMainRes.fromJson(json.decode(str));
String itgResToJson(ItgMainRes data) => json.encode(data.toJson());
class ItgMainRes {
ItgMainRes({
this.date,
this.languageId,
this.serviceName,
this.time,
this.androidLink,
this.authenticationTokenId,
this.data,
this.dataw,
this.dietType,
this.dietTypeId,
this.errorCode,
this.errorEndUserMessage,
this.errorEndUserMessageN,
this.errorMessage,
this.errorType,
this.foodCategory,
this.iosLink,
this.isAuthenticated,
this.mealOrderStatus,
this.mealType,
this.messageStatus,
this.numberOfResultRecords,
this.patientBlodType,
this.successMsg,
this.successMsgN,
this.vidaUpdatedResponse,
this.itgRequest,
this.itgFormAttachmentsList,
this.message,
this.mohemmItgDepartmentSectionsList,
this.mohemmItgPendingTaskResponseItem,
this.mohemmItgProjectDepartmentsList,
this.mohemmItgResponseItem,
this.mohemmItgSectionTopicsList,
this.mohemmItgTicketDetailsList,
this.mohemmItgTicketTransactionsList,
this.mohemmItgTicketsByEmployeeList,
this.mohemmItgProjectsList,
this.mohemmItgTicketTypesList,
this.referenceNumber,
this.requestType,
this.totalCount,
this.statuseCode,
});
final dynamic date;
final int? languageId;
final int? serviceName;
final dynamic time;
final dynamic androidLink;
final dynamic authenticationTokenId;
final dynamic data;
final bool? dataw;
final int? dietType;
final int? dietTypeId;
final dynamic errorCode;
final dynamic errorEndUserMessage;
final dynamic errorEndUserMessageN;
final dynamic errorMessage;
final int? errorType;
final int? foodCategory;
final dynamic iosLink;
final bool? isAuthenticated;
final int? mealOrderStatus;
final int? mealType;
final int? messageStatus;
final int? numberOfResultRecords;
final dynamic patientBlodType;
final dynamic successMsg;
final dynamic successMsgN;
final dynamic vidaUpdatedResponse;
final dynamic itgRequest;
final dynamic itgFormAttachmentsList;
final dynamic message;
final dynamic mohemmItgDepartmentSectionsList;
final dynamic mohemmItgPendingTaskResponseItem;
final dynamic mohemmItgProjectDepartmentsList;
final MohemmItgResponseItem? mohemmItgResponseItem;
final dynamic mohemmItgSectionTopicsList;
final dynamic mohemmItgTicketDetailsList;
final dynamic mohemmItgTicketTransactionsList;
final dynamic mohemmItgTicketsByEmployeeList;
final dynamic mohemmItgProjectsList;
final dynamic mohemmItgTicketTypesList;
final dynamic referenceNumber;
final dynamic requestType;
final int? totalCount;
final int? statuseCode;
factory ItgMainRes.fromJson(Map<String, dynamic> json) => ItgMainRes(
date: json["Date"],
languageId: json["LanguageID"] == null ? null : json["LanguageID"],
serviceName: json["ServiceName"] == null ? null : json["ServiceName"],
time: json["Time"],
androidLink: json["AndroidLink"],
authenticationTokenId: json["AuthenticationTokenID"],
data: json["Data"],
dataw: json["Dataw"] == null ? null : json["Dataw"],
dietType: json["DietType"] == null ? null : json["DietType"],
dietTypeId: json["DietTypeID"] == null ? null : json["DietTypeID"],
errorCode: json["ErrorCode"],
errorEndUserMessage: json["ErrorEndUserMessage"],
errorEndUserMessageN: json["ErrorEndUserMessageN"],
errorMessage: json["ErrorMessage"],
errorType: json["ErrorType"] == null ? null : json["ErrorType"],
foodCategory: json["FoodCategory"] == null ? null : json["FoodCategory"],
iosLink: json["IOSLink"],
isAuthenticated: json["IsAuthenticated"] == null ? null : json["IsAuthenticated"],
mealOrderStatus: json["MealOrderStatus"] == null ? null : json["MealOrderStatus"],
mealType: json["MealType"] == null ? null : json["MealType"],
messageStatus: json["MessageStatus"] == null ? null : json["MessageStatus"],
numberOfResultRecords: json["NumberOfResultRecords"] == null ? null : json["NumberOfResultRecords"],
patientBlodType: json["PatientBlodType"],
successMsg: json["SuccessMsg"],
successMsgN: json["SuccessMsgN"],
vidaUpdatedResponse: json["VidaUpdatedResponse"],
itgRequest: json["ITGRequest"],
itgFormAttachmentsList: json["Itg_FormAttachmentsList"],
message: json["Message"],
mohemmItgDepartmentSectionsList: json["Mohemm_ITG_DepartmentSectionsList"],
mohemmItgPendingTaskResponseItem: json["Mohemm_ITG_Pending_Task_ResponseItem"],
mohemmItgProjectDepartmentsList: json["Mohemm_ITG_ProjectDepartmentsList"],
mohemmItgResponseItem: json["Mohemm_ITG_ResponseItem"] ==null ? null : MohemmItgResponseItem.fromJson(jsonDecode(json["Mohemm_ITG_ResponseItem"])),
mohemmItgSectionTopicsList: json["Mohemm_ITG_SectionTopicsList"],
mohemmItgTicketDetailsList: json["Mohemm_ITG_TicketDetailsList"],
mohemmItgTicketTransactionsList: json["Mohemm_ITG_TicketTransactionsList"],
mohemmItgTicketsByEmployeeList: json["Mohemm_ITG_TicketsByEmployeeList"],
mohemmItgProjectsList: json["Mohemm_Itg_ProjectsList"],
mohemmItgTicketTypesList: json["Mohemm_Itg_TicketTypesList"],
referenceNumber: json["ReferenceNumber"],
requestType: json["RequestType"],
totalCount: json["TotalCount"] == null ? null : json["TotalCount"],
statuseCode: json["statuseCode"] == null ? null : json["statuseCode"],
);
Map<String, dynamic> toJson() => {
"Date": date,
"LanguageID": languageId == null ? null : languageId,
"ServiceName": serviceName == null ? null : serviceName,
"Time": time,
"AndroidLink": androidLink,
"AuthenticationTokenID": authenticationTokenId,
"Data": data,
"Dataw": dataw == null ? null : dataw,
"DietType": dietType == null ? null : dietType,
"DietTypeID": dietTypeId == null ? null : dietTypeId,
"ErrorCode": errorCode,
"ErrorEndUserMessage": errorEndUserMessage,
"ErrorEndUserMessageN": errorEndUserMessageN,
"ErrorMessage": errorMessage,
"ErrorType": errorType == null ? null : errorType,
"FoodCategory": foodCategory == null ? null : foodCategory,
"IOSLink": iosLink,
"IsAuthenticated": isAuthenticated == null ? null : isAuthenticated,
"MealOrderStatus": mealOrderStatus == null ? null : mealOrderStatus,
"MealType": mealType == null ? null : mealType,
"MessageStatus": messageStatus == null ? null : messageStatus,
"NumberOfResultRecords": numberOfResultRecords == null ? null : numberOfResultRecords,
"PatientBlodType": patientBlodType,
"SuccessMsg": successMsg,
"SuccessMsgN": successMsgN,
"VidaUpdatedResponse": vidaUpdatedResponse,
"ITGRequest": itgRequest,
"Itg_FormAttachmentsList": itgFormAttachmentsList,
"Message": message,
"Mohemm_ITG_DepartmentSectionsList": mohemmItgDepartmentSectionsList,
"Mohemm_ITG_Pending_Task_ResponseItem": mohemmItgPendingTaskResponseItem,
"Mohemm_ITG_ProjectDepartmentsList": mohemmItgProjectDepartmentsList,
"Mohemm_ITG_ResponseItem": mohemmItgResponseItem == null ? null : mohemmItgResponseItem,
"Mohemm_ITG_SectionTopicsList": mohemmItgSectionTopicsList,
"Mohemm_ITG_TicketDetailsList": mohemmItgTicketDetailsList,
"Mohemm_ITG_TicketTransactionsList": mohemmItgTicketTransactionsList,
"Mohemm_ITG_TicketsByEmployeeList": mohemmItgTicketsByEmployeeList,
"Mohemm_Itg_ProjectsList": mohemmItgProjectsList,
"Mohemm_Itg_TicketTypesList": mohemmItgTicketTypesList,
"ReferenceNumber": referenceNumber,
"RequestType": requestType,
"TotalCount": totalCount == null ? null : totalCount,
"statuseCode": statuseCode == null ? null : statuseCode,
};
}

@ -0,0 +1,159 @@
// To parse this JSON data, do
//
// final mohemmItgResponseItem = mohemmItgResponseItemFromJson(jsonString);
import 'dart:convert';
import 'package:mohem_flutter_app/models/itg/advertisement.dart';
MohemmItgResponseItem mohemmItgResponseItemFromJson(String str) => MohemmItgResponseItem.fromJson(json.decode(str));
String mohemmItgResponseItemToJson(MohemmItgResponseItem data) => json.encode(data.toJson());
class MohemmItgResponseItem {
MohemmItgResponseItem({
this.statusCode,
this.message,
this.originalErrMsg,
this.result,
});
final int? statusCode;
final dynamic? message;
final dynamic? originalErrMsg;
final ItgResponseResult? result;
factory MohemmItgResponseItem.fromJson(Map<String, dynamic> json) => MohemmItgResponseItem(
statusCode: json["statusCode"] == null ? null : json["statusCode"],
message: json["message"],
originalErrMsg: json["originalErrMsg"],
result: json["result"] == null ? null : ItgResponseResult.fromJson(json["result"]),
);
Map<String, dynamic> toJson() => {
"statusCode": statusCode == null ? null : statusCode,
"message": message,
"originalErrMsg": originalErrMsg,
"result": result == null ? null : result!.toJson(),
};
}
class ItgResponseResult {
ItgResponseResult({
this.totalItemsCount,
this.data,
this.errormsg,
});
final dynamic totalItemsCount;
final ItgResponseData? data;
final dynamic errormsg;
factory ItgResponseResult.fromJson(Map<String, dynamic> json) => ItgResponseResult(
totalItemsCount: json["totalItemsCount"],
data: json["data"] == null ? null : ItgResponseData.fromJson(json["data"]),
errormsg: json["errormsg"],
);
Map<String, dynamic> toJson() => {
"totalItemsCount": totalItemsCount,
"data": data == null ? null : data!.toJson(),
"errormsg": errormsg,
};
}
class ItgResponseData {
ItgResponseData({
this.notificationMasterId,
this.notificationType,
this.referenceItemId,
this.notificationTitle,
this.enableAt,
this.applicationItemId,
this.startDate,
this.endDate,
this.isRepeat,
this.channelId,
this.serviceId,
this.channelName,
this.serviceName,
this.isDeleted,
this.showDelete,
this.advertisement,
this.survey,
this.isActive,
this.pageSize,
this.pageNo,
this.languageId,
});
final String? notificationMasterId;
final String? notificationType;
final int? referenceItemId;
final String? notificationTitle;
final String? enableAt;
final dynamic applicationItemId;
final dynamic startDate;
final dynamic endDate;
final bool? isRepeat;
final int? channelId;
final int? serviceId;
final String? channelName;
final String? serviceName;
final bool? isDeleted;
final bool? showDelete;
final Advertisement? advertisement;
final dynamic survey;
final dynamic isActive;
final dynamic pageSize;
final dynamic pageNo;
final dynamic languageId;
factory ItgResponseData.fromJson(Map<String, dynamic> json) => ItgResponseData(
notificationMasterId: json["notificationMasterId"] == null ? null : json["notificationMasterId"],
notificationType: json["notificationType"] == null ? null : json["notificationType"],
referenceItemId: json["referenceItemId"] == null ? null : json["referenceItemId"],
notificationTitle: json["notificationTitle"] == null ? null : json["notificationTitle"],
enableAt: json["enableAt"] == null ? null : json["enableAt"],
applicationItemId: json["applicationItemId"],
startDate: json["startDate"],
endDate: json["endDate"],
isRepeat: json["isRepeat"] == null ? null : json["isRepeat"],
channelId: json["channelId"] == null ? null : json["channelId"],
serviceId: json["serviceId"] == null ? null : json["serviceId"],
channelName: json["channelName"] == null ? null : json["channelName"],
serviceName: json["serviceName"] == null ? null : json["serviceName"],
isDeleted: json["isDeleted"] == null ? null : json["isDeleted"],
showDelete: json["showDelete"] == null ? null : json["showDelete"],
advertisement: json["advertisement"] == null ? null : Advertisement.fromJson(json["advertisement"]),
survey: json["survey"],
isActive: json["isActive"],
pageSize: json["pageSize"],
pageNo: json["pageNo"],
languageId: json["languageId"],
);
Map<String, dynamic> toJson() => {
"notificationMasterId": notificationMasterId == null ? null : notificationMasterId,
"notificationType": notificationType == null ? null : notificationType,
"referenceItemId": referenceItemId == null ? null : referenceItemId,
"notificationTitle": notificationTitle == null ? null : notificationTitle,
"enableAt": enableAt == null ? null : enableAt,
"applicationItemId": applicationItemId,
"startDate": startDate,
"endDate": endDate,
"isRepeat": isRepeat == null ? null : isRepeat,
"channelId": channelId == null ? null : channelId,
"serviceId": serviceId == null ? null : serviceId,
"channelName": channelName == null ? null : channelName,
"serviceName": serviceName == null ? null : serviceName,
"isDeleted": isDeleted == null ? null : isDeleted,
"showDelete": showDelete == null ? null : showDelete,
"advertisement": advertisement,
"survey": survey,
"isActive": isActive,
"pageSize": pageSize,
"pageNo": pageNo,
"languageId": languageId,
};
}

@ -0,0 +1,56 @@
import 'package:flutter/cupertino.dart';
class DummyQuestionModel {
String? opt1;
String? opt2;
String? opt3;
DummyQuestionModel({
this.opt1,
this.opt2,
this.opt3,
});
}
List<DummyQuestionModel> questions = <DummyQuestionModel>[
DummyQuestionModel(
opt1: 'Riyadh 8',
opt2: 'Dammam',
opt3: 'Mecca',
),
DummyQuestionModel(
opt1: 'Riyadh 7',
opt2: 'Dammam',
opt3: 'Mecca',
),
DummyQuestionModel(
opt1: 'Riyadh 6',
opt2: 'Dammam',
opt3: 'Mecca',
),
DummyQuestionModel(
opt1: 'Riyadh 5',
opt2: 'Dammam',
opt3: 'Mecca',
),
DummyQuestionModel(
opt1: 'Riyadh 4',
opt2: 'Dammam',
opt3: 'Mecca',
),
DummyQuestionModel(
opt1: 'Riyadh 3',
opt2: 'Dammam',
opt3: 'Mecca',
),
DummyQuestionModel(
opt1: 'Riyadh 2',
opt2: 'Dammam',
opt3: 'Mecca',
),
DummyQuestionModel(
opt1: 'Riyadh 1',
opt2: 'Dammam',
opt3: 'Mecca',
),
];

@ -17,6 +17,7 @@ import 'package:mohem_flutter_app/models/dashboard/menu_entries.dart';
import 'package:mohem_flutter_app/models/dashboard/menus.dart';
import 'package:mohem_flutter_app/models/dashboard/mohemm_itg_pending_task_responseitem.dart';
import 'package:mohem_flutter_app/models/generic_response_model.dart';
import 'package:mohem_flutter_app/models/itg/itg_response_model.dart';
import 'package:mohem_flutter_app/models/offers_and_discounts/get_offers_list.dart';
/// Mix-in [DiagnosticableTreeMixin] to have access to [debugFillProperties] for the devtool
@ -65,7 +66,6 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
progress = (isTimeRemainingInSeconds / totalShiftTimeInSeconds);
endTime = DateTime.now().millisecondsSinceEpoch + Duration(seconds: isTimeRemainingInSeconds).inMilliseconds;
}
notifyListeners();
} catch (ex) {
Utils.handleException(ex, context, null);
@ -102,6 +102,7 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
DrawerMenuItem("assets/images/drawer/performance_evaluation.svg", LocaleKeys.performanceEvaluation.tr(), AppRoutes.performanceEvaluation),
DrawerMenuItem("assets/images/drawer/mowadhafi.svg", LocaleKeys.mowadhafhi.tr(), AppRoutes.mowadhafhi),
DrawerMenuItem("assets/images/drawer/pending_trasactions.svg", LocaleKeys.pendingTransactions.tr(), AppRoutes.pendingTransactions),
DrawerMenuItem("assets/images/drawer/pending_trasactions.svg", LocaleKeys.brainMarathon.tr(), AppRoutes.marathonIntroScreen),
DrawerMenuItem("assets/images/drawer/change_password.svg", LocaleKeys.changePassword.tr(), AppRoutes.changePassword),
];
@ -123,6 +124,7 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
List<GetOpenNotificationsList>? getOpenNotificationsList;
MohemmITGPendingTaskResponseItem? cocCount;
int cocFinalCount = 0;
//Work List API's & Methods
Future fetchWorkListCounter(context, {bool showLoading = false}) async {
try {
@ -247,6 +249,13 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
return menus;
}
Future<MohemmItgResponseItem?> getITGNotification() async {
MohemmItgResponseItem? res = await DashboardApiClient().getITGPageNotification();
return res;
}
void notify() {
notifyListeners();
}

@ -0,0 +1,33 @@
import 'package:flutter/material.dart';
import 'package:lottie/lottie.dart';
class SuccessDialog extends StatelessWidget {
bool isFromDashboard;
SuccessDialog(this.isFromDashboard);
@override
Widget build(BuildContext context) {
double size = MediaQuery.of(context).size.width / 1.8;
return Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
mainAxisSize: MainAxisSize.min,
children: [
Container(
width: size,
height: size,
child: Card(
child: Lottie.asset('assets/lottie/lt_success.json', repeat: false, reverse: false, onLoaded: (v) {
print("calling_lottie " + v.seconds.toString());
Future.delayed(Duration(seconds: 2)).then((value) {
Navigator.pop(context);
if (isFromDashboard) Navigator.pop(context);
});
}),
),
),
],
);
}
}

@ -1,10 +1,10 @@
import 'dart:async';
import 'dart:io';
import 'package:easy_localization/src/public_ext.dart';
import 'package:flutter/cupertino.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_countdown_timer/flutter_countdown_timer.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:mohem_flutter_app/api/dashboard_api_client.dart';
import 'package:mohem_flutter_app/app_state/app_state.dart';
import 'package:mohem_flutter_app/classes/colors.dart';
import 'package:mohem_flutter_app/classes/utils.dart';
@ -13,12 +13,17 @@ 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/models/itg/itg_response_model.dart';
import 'package:mohem_flutter_app/models/offers_and_discounts/get_offers_list.dart';
import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart';
import 'package:mohem_flutter_app/ui/dialogs/success_dialog.dart';
import 'package:mohem_flutter_app/ui/landing/itg/video_page.dart';
import 'package:mohem_flutter_app/ui/landing/widget/app_drawer.dart';
import 'package:mohem_flutter_app/ui/landing/widget/menus_widget.dart';
import 'package:mohem_flutter_app/ui/landing/widget/services_widget.dart';
import 'package:mohem_flutter_app/ui/marathon/widgets/marathon_banner.dart';
import 'package:mohem_flutter_app/widgets/bottom_sheet.dart';
import 'package:mohem_flutter_app/widgets/dialogs/dialogs.dart';
import 'package:mohem_flutter_app/widgets/mark_attendance_widget.dart';
import 'package:mohem_flutter_app/widgets/shimmer/dashboard_shimmer_widget.dart';
import 'package:mohem_flutter_app/widgets/shimmer/offers_shimmer_widget.dart';
@ -45,8 +50,10 @@ class _DashboardScreenState extends State<DashboardScreen> {
@override
void initState() {
super.initState();
data = Provider.of<DashboardProviderModel>(context, listen: false);
_onRefresh();
scheduleMicrotask(() {
data = Provider.of<DashboardProviderModel>(context, listen: false);
_onRefresh();
});
}
@override
@ -56,6 +63,11 @@ class _DashboardScreenState extends State<DashboardScreen> {
void _onRefresh() async {
data.initProvider();
// data.getITGNotification().then((value) {
// print("--------------------detail_1-----------------");
// print(value!.result!.data!.notificationMasterId);
// print(value.result!.data!.notificationTitle);
// });
data.fetchListMenu();
data.fetchAttendanceTracking(context);
data.fetchWorkListCounter(context);
@ -68,14 +80,51 @@ class _DashboardScreenState extends State<DashboardScreen> {
@override
Widget build(BuildContext context) {
GlobalKey<ScaffoldState> _key = GlobalKey(); //
return Scaffold(
key: _scaffoldState,
// appBar: AppBar(
// actions: [
// IconButton(
// onPressed: () {
// data.getITGNotification().then((value) {
// print("--------------------detail_1-----------------");
// if (value!.result!.data != null) {
// print(value.result!.data!.notificationMasterId);
// print(value.result!.data!.notificationType);
// if (value.result!.data!.notificationType == "Survey") {
// Navigator.pushNamed(context, AppRoutes.survey, arguments: value.result!.data);
// } else {
// DashboardApiClient().getAdvertisementDetail(value.result!.data!.notificationMasterId ?? "").then(
// (value) {
// if (value!.mohemmItgResponseItem!.statusCode == 200) {
// if (value.mohemmItgResponseItem!.result!.data != null) {
// String? image64 = value.mohemmItgResponseItem!.result!.data!.advertisement!.viewAttachFileColl!.first.base64String;
// print(image64);
// var sp = image64!.split("base64,");
// Navigator.push(
// context,
// MaterialPageRoute(
// builder: (context) => MovieTheaterBody(
// encodedBytes: sp[1],
// ),
// ),
// );
// }
// }
// },
// );
// }
// }
// });
// },
// icon: Icon(Icons.add))
// ],
// ),
body: Column(
children: [
Row(
children: [
Builder(builder: (context) {
Builder(builder: (BuildContext context) {
return Row(
mainAxisSize: MainAxisSize.min,
children: [
@ -83,7 +132,7 @@ class _DashboardScreenState extends State<DashboardScreen> {
Utils.dataFromBase64String(
AppState().memberInformationList!.eMPLOYEEIMAGE ?? "",
),
errorBuilder: (BuildContext context, error, stackTrace) {
errorBuilder: (BuildContext context, Object error, StackTrace? stackTrace) {
return SvgPicture.asset(
"assets/images/user.svg",
height: 34,
@ -109,6 +158,7 @@ class _DashboardScreenState extends State<DashboardScreen> {
Image.asset("assets/images/logos/main_mohemm_logo.png", width: 134, height: 28).expanded,
SvgPicture.asset(
"assets/images/announcements.svg",
matchTextDirection: true,
).onPress(() async {
await Navigator.pushNamed(context, AppRoutes.announcements);
})
@ -138,7 +188,7 @@ class _DashboardScreenState extends State<DashboardScreen> {
child: AspectRatio(
aspectRatio: 159 / 159,
child: Consumer<DashboardProviderModel>(
builder: (context, model, child) {
builder: (BuildContext context, DashboardProviderModel model, Widget? child) {
return (model.isAttendanceTrackingLoading
? GetAttendanceTrackingShimmer()
: Container(
@ -169,21 +219,16 @@ class _DashboardScreenState extends State<DashboardScreen> {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
9.height,
Directionality(
textDirection: TextDirection.ltr,
child: CountdownTimer(
endTime: model.endTime,
onEnd: null,
endWidget: "00:00:00".toText14(color: Colors.white, isBold: true),
textStyle: const TextStyle(color: Colors.white, fontSize: 14, letterSpacing: -0.48, fontWeight: FontWeight.bold),
),
CountdownTimer(
endTime: model.endTime,
onEnd: null,
endWidget: "00:00:00".toText14(color: Colors.white, isBold: true),
textStyle: const TextStyle(color: Colors.white, fontSize: 14, letterSpacing: -0.48, fontWeight: FontWeight.bold),
),
LocaleKeys.timeLeftToday.tr().toText12(color: Colors.white),
9.height,
ClipRRect(
borderRadius: BorderRadius.all(
Radius.circular(20),
),
borderRadius: const BorderRadius.all(Radius.circular(20)),
child: LinearProgressIndicator(
value: model.progress,
minHeight: 8,
@ -225,7 +270,10 @@ class _DashboardScreenState extends State<DashboardScreen> {
),
child: SvgPicture.asset(model.isTimeRemainingInSeconds == 0 ? "assets/images/play.svg" : "assets/images/stop.svg"),
).onPress(() {
showMyBottomSheet(context, child: MarkAttendanceWidget(model));
showMyBottomSheet(
context,
child: MarkAttendanceWidget(model, isFromDashboard: true),
);
}),
],
),
@ -251,6 +299,7 @@ class _DashboardScreenState extends State<DashboardScreen> {
),
],
).paddingOnly(left: 21, right: 21, top: 7),
MarathonBanner().paddingAll(20),
ServicesWidget(),
// 8.height,
Container(
@ -262,7 +311,8 @@ class _DashboardScreenState extends State<DashboardScreen> {
border: Border.all(color: MyColors.lightGreyEDColor, width: 1),
),
child: Column(
mainAxisSize: MainAxisSize.min,crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
crossAxisAlignment: CrossAxisAlignment.center,
@ -303,7 +353,7 @@ class _DashboardScreenState extends State<DashboardScreen> {
physics: const BouncingScrollPhysics(),
padding: const EdgeInsets.only(left: 21, right: 21, top: 13),
scrollDirection: Axis.horizontal,
itemBuilder: (cxt, index) {
itemBuilder: (BuildContext cxt, int index) {
return model.isOffersLoading
? const OffersShimmerWidget()
: InkWell(
@ -349,7 +399,7 @@ class _DashboardScreenState extends State<DashboardScreen> {
),
);
},
separatorBuilder: (cxt, index) => 8.width,
separatorBuilder: (BuildContext cxt, int index) => 8.width,
itemCount: 6),
);
},
@ -394,7 +444,7 @@ class _DashboardScreenState extends State<DashboardScreen> {
color: currentIndex == 2 ? MyColors.grey3AColor : MyColors.grey98Color,
).paddingAll(4),
Consumer<DashboardProviderModel>(
builder: (cxt, data, child) {
builder: (BuildContext cxt, DashboardProviderModel data, Widget? child) {
if (data.workListCounter == 0) {
return const SizedBox();
}
@ -424,9 +474,7 @@ class _DashboardScreenState extends State<DashboardScreen> {
BottomNavigationBarItem(
icon: SvgPicture.asset(
"assets/icons/chat/chat.svg",
color: currentIndex == 4
? MyColors.grey3AColor
: MyColors.grey98Color,
color: currentIndex == 4 ? MyColors.grey3AColor : MyColors.grey98Color,
).paddingAll(4),
label: LocaleKeys.chat.tr(),
),
@ -446,7 +494,7 @@ class _DashboardScreenState extends State<DashboardScreen> {
Navigator.pushNamed(context, AppRoutes.workList);
} else if (index == 3) {
Navigator.pushNamed(context, AppRoutes.itemsForSale);
}else if (index == 4) {
} else if (index == 4) {
Navigator.pushNamed(context, AppRoutes.chat);
}
},
@ -462,7 +510,7 @@ class _DashboardScreenState extends State<DashboardScreen> {
getOffersDetailList.add(offersListModelObj);
data.getOffersList.forEach((element) {
data.getOffersList.forEach((OffersListModel element) {
if (counter <= 4) {
if (element.rowID != offersListModelObj.rowID) {
getOffersDetailList.add(element);

@ -1,13 +1,19 @@
import 'dart:convert';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_rating_bar/flutter_rating_bar.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:mohem_flutter_app/api/dashboard_api_client.dart';
import 'package:mohem_flutter_app/classes/colors.dart';
import 'package:mohem_flutter_app/classes/utils.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/models/itg/itg_main_response.dart';
import 'package:mohem_flutter_app/models/itg/itg_response_model.dart';
import 'package:mohem_flutter_app/widgets/button/default_button.dart';
import 'package:mohem_flutter_app/widgets/dynamic_forms/dynamic_textfield_widget.dart';
@ -20,10 +26,14 @@ class SurveyScreen extends StatefulWidget {
class _SurveyScreenState extends State<SurveyScreen> {
String reviewText = "";
int _selectedIndex = -1;
double starRating = 1;
int _selectedIndex = 5;
ItgResponseData? itgResponseData;
@override
Widget build(BuildContext context) {
if (itgResponseData == null) itgResponseData = ModalRoute.of(context)!.settings.arguments as ItgResponseData;
return Scaffold(
backgroundColor: MyColors.backgroundColor,
body: Column(
@ -41,19 +51,23 @@ class _SurveyScreenState extends State<SurveyScreen> {
LocaleKeys.rateUI.tr().toText16(),
22.height,
Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
RatingBar.builder(
initialRating: 3,
minRating: 1,
minRating: starRating,
direction: Axis.horizontal,
allowHalfRating: true,
allowHalfRating: false,
itemCount: 5,
itemPadding: EdgeInsets.symmetric(horizontal: 12),
itemPadding: EdgeInsets.symmetric(horizontal: 8),
itemBuilder: (context, _) => Icon(
Icons.star,
color: Colors.amber,
),
onRatingUpdate: (rating) {},
onRatingUpdate: (rating) {
starRating = rating;
},
)
],
).paddingOnly(left: 22, right: 22, top: 12, bottom: 12).objectContainerView(disablePadding: true),
@ -66,11 +80,11 @@ class _SurveyScreenState extends State<SurveyScreen> {
padding: const EdgeInsets.only(top: 0),
shrinkWrap: true,
children: [
optionUI("poor.svg", 0),
optionUI("bad.svg", 1),
optionUI("normal.svg", 2),
optionUI("good.svg", 3),
optionUI("xcellent.svg", 4),
optionUI("poor.svg", 1),
optionUI("bad.svg", 2),
optionUI("normal.svg", 3),
optionUI("good.svg", 4),
optionUI("xcellent.svg", 5),
],
),
27.height,
@ -78,13 +92,21 @@ class _SurveyScreenState extends State<SurveyScreen> {
LocaleKeys.description.tr(),
LocaleKeys.typeHere.tr(),
lines: 3,
onChange: (v) {
reviewText = v;
},
),
150.height
],
).paddingOnly(left: 21, right: 21),
],
)),
DefaultButton(LocaleKeys.submitSurvey.tr(), () async {}).insideContainer,
DefaultButton(
LocaleKeys.submitSurvey.tr(),
() {
performAPI();
},
).insideContainer,
],
));
}
@ -108,4 +130,34 @@ class _SurveyScreenState extends State<SurveyScreen> {
setState(() {});
});
}
void performAPI() async {
Utils.showLoading(context);
try {
ItgMainRes? res= await DashboardApiClient().submitItgForm(
comment: reviewText,
masterId: itgResponseData!.notificationMasterId ?? "",
itgList: [
{"questionId": "1", "optionId": null, "starRating": starRating},
{"questionId": "2", "optionId": "4", "starRating": _selectedIndex}
],
serviceId: itgResponseData!.serviceId ?? 0);
Utils.hideLoading(context);
if(res!.mohemmItgResponseItem!.statusCode==200){
Utils.showToast("Survey has been submitted successfully");
Navigator.pop(context);
}else{
Utils.showToast(res.mohemmItgResponseItem!.message.toString());
}
} catch (ex) {
Utils.hideLoading(context);
Utils.handleException(ex, context, (msg) {
Utils.confirmDialog(context, msg);
});
}
}
}

@ -0,0 +1,96 @@
import 'dart:convert';
import 'dart:io' as Io;
import 'package:flutter/material.dart';
import 'package:video_player/video_player.dart';
class MovieTheaterBody extends StatefulWidget {
final String encodedBytes;
const MovieTheaterBody({required this.encodedBytes});
@override
_MovieTheaterBodyState createState() => _MovieTheaterBodyState();
}
class _MovieTheaterBodyState extends State<MovieTheaterBody> {
late Future<VideoPlayerController> _futureController;
late VideoPlayerController _controller;
Future<VideoPlayerController> createVideoPlayer() async {
try {
var decodedBytes = base64Decode(widget.encodedBytes);
var file = Io.File("decodedBezkoder.mp4");
file.writeAsBytesSync(decodedBytes);
VideoPlayerController controller = VideoPlayerController.file(file);
await controller.initialize();
await controller.setLooping(true);
return controller;
} catch (e) {
print("object0000000");
print(e);
return new VideoPlayerController.asset("dataSource");
}
}
@override
void initState() {
_futureController = createVideoPlayer();
super.initState();
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Expanded(
child: FutureBuilder(
future: _futureController,
builder: (context, snapshot) {
//UST: 05/2021 - MovieTheaterBody - id:11 - 2pts - Criação
if (snapshot.connectionState == ConnectionState.done && snapshot.data != null) {
_controller = snapshot.data as VideoPlayerController;
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
AspectRatio(
aspectRatio: _controller.value.aspectRatio,
child: VideoPlayer(_controller),
),
const SizedBox(
height: 50,
),
FloatingActionButton(
onPressed: () {
setState(() {
if (_controller.value.isPlaying) {
_controller.pause();
} else {
// If the video is paused, play it.
_controller.play();
}
});
},
backgroundColor: Colors.green[700],
child: Icon(
_controller.value.isPlaying ? Icons.pause : Icons.play_arrow,
),
)
],
);
} else {
return const Center(child: CircularProgressIndicator());
}
},
),
),
);
}
}

@ -1,3 +1,4 @@
import 'package:auto_size_text/auto_size_text.dart';
import 'package:easy_localization/src/public_ext.dart';
import 'package:flutter/material.dart';
import 'package:flutter_countdown_timer/flutter_countdown_timer.dart';
@ -95,6 +96,7 @@ class _TodayAttendanceScreenState extends State<TodayAttendanceScreen> {
: Column(
children: [
Container(
width: double.infinity,
color: MyColors.backgroundBlackColor,
padding: EdgeInsets.only(top: 4, left: 21, right: 21, bottom: 21),
child: Column(
@ -132,6 +134,7 @@ class _TodayAttendanceScreenState extends State<TodayAttendanceScreen> {
),
).paddingAll(21),
).expanded,
],
),
).expanded,
@ -316,6 +319,16 @@ class _TodayAttendanceScreenState extends State<TodayAttendanceScreen> {
// }
// }
String getValue(int? v) {
if (v == null) {
return "00";
} else if (v.toString().length == 1) {
return "0" + v.toString();
} else {
return v.toString();
}
}
Future<bool> closeWifiRequest() async {
await WiFiForIoTPlugin.forceWifiUsage(false);
bool v = await WiFiForIoTPlugin.disconnect();

@ -18,7 +18,6 @@ class MenusWidget extends StatelessWidget {
return Consumer<DashboardProviderModel>(
builder: (cxt, data, child) {
print("data.workListCounter:${data.workListCounter}");
return GridView(
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2, childAspectRatio: 2 / 2, crossAxisSpacing: 9, mainAxisSpacing: 9),
padding: EdgeInsets.zero,

@ -34,12 +34,12 @@ class ServicesWidget extends StatelessWidget {
return data.isServicesMenusLoading
? whileLoading()
: ListView.separated(
padding: const EdgeInsets.only(top: 21),
padding: const EdgeInsets.only(top: 0),
itemBuilder: (context, parentIndex) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
children: [
data.homeMenus![parentIndex].menuEntry.prompt!.toSectionHeading().paddingOnly(left: 21, right: 21),
SizedBox(
height: 105 + 26,

@ -92,7 +92,7 @@ class _AddLeaveBalanceScreenState extends State<AddLeaveBalanceScreen> {
}
void validateAbsenceTransaction() async {
try {
// try {
Utils.showLoading(context);
Map<String, String?> dffDataMap = {};
for (int i = 1; i <= 20; i++) {
@ -100,7 +100,7 @@ class _AddLeaveBalanceScreenState extends State<AddLeaveBalanceScreen> {
for (int dffIndex = 0; dffIndex < getabsenceDffStructureList.length; dffIndex++) {
if ("ATTRIBUTE$i" == getabsenceDffStructureList[dffIndex].aPPLICATIONCOLUMNNAME) {
if (getabsenceDffStructureList[dffIndex].fORMATTYPE == "X") {
dffDataMap["P_ATTRIBUTE$i"] = Utils.formatDate(getabsenceDffStructureList[dffIndex].eSERVICESDV!.pIDCOLUMNNAME!);
dffDataMap["P_ATTRIBUTE$i"] = getabsenceDffStructureList[dffIndex].eSERVICESDV!.pIDCOLUMNNAME != null ? Utils.formatDate(getabsenceDffStructureList[dffIndex].eSERVICESDV!.pIDCOLUMNNAME!) : "";
} else {
dffDataMap["P_ATTRIBUTE$i"] = getabsenceDffStructureList[dffIndex].eSERVICESDV?.pIDCOLUMNNAME;
}
@ -129,10 +129,10 @@ class _AddLeaveBalanceScreenState extends State<AddLeaveBalanceScreen> {
// Utils.showLoading(context);
await LeaveBalanceApiClient().cancelHrTransaction(submit.pTRANSACTIONID!);
// Utils.hideLoading(context);
} catch (ex) {
Utils.hideLoading(context);
Utils.handleException(ex, context, null);
}
// } catch (ex) {
// Utils.hideLoading(context);
// Utils.handleException(ex, context, null);
// }
}
@override

@ -51,7 +51,7 @@ class _LoginScreenState extends State<LoginScreen> {
@override
void initState() {
super.initState();
// checkFirebaseToken();
// checkFirebaseToken();
}
@override
@ -68,7 +68,8 @@ class _LoginScreenState extends State<LoginScreen> {
await Firebase.initializeApp();
_firebaseMessaging = FirebaseMessaging.instance;
firebaseToken = await _firebaseMessaging.getToken();
loginInfo = await LoginApiClient().getMobileLoginInfoNEW(firebaseToken ?? "", Platform.isAndroid ? "android" : "ios");
loginInfo = await LoginApiClient().getMobileLoginInfoNEW(
firebaseToken ?? "", Platform.isAndroid ? "android" : "ios");
if (loginInfo == null) {
Utils.hideLoading(context);
return;
@ -85,9 +86,11 @@ class _LoginScreenState extends State<LoginScreen> {
}
Future<void> checkPrefs() async {
String username = await Utils.getStringFromPrefs(SharedPrefsConsts.username);
String username =
await Utils.getStringFromPrefs(SharedPrefsConsts.username);
if (username.isNotEmpty) {
String password = await Utils.getStringFromPrefs(SharedPrefsConsts.password);
String password =
await Utils.getStringFromPrefs(SharedPrefsConsts.password);
// String firebaseToken = await Utils.getStringFromPrefs(SharedPrefsConsts.firebaseToken);
// print("firebaseToken:$firebaseToken");
this.username.text = username;
@ -100,23 +103,30 @@ class _LoginScreenState extends State<LoginScreen> {
Utils.showLoading(context);
try {
_checkMobileAppVersion = await LoginApiClient().checkMobileAppVersion();
_memberLoginList = await LoginApiClient().memberLogin(username.text, password.text);
_memberLoginList =
await LoginApiClient().memberLogin(username.text, password.text);
AppState().setMemberLoginListModel = _memberLoginList;
AppState().setUserName = username.text;
AppState().password = password.text;
if (_autoLogin) {
AppState().setMemberInformationListModel = (await MemberInformationListModel.getFromPrefs()).first;
AppState().setPrivilegeListModel = await PrivilegeListModel.getFromPrefs();
String mohemmWifiSSID = await Utils.getStringFromPrefs(SharedPrefsConsts.mohemmWifiSSID);
String mohemmWifiPassword = await Utils.getStringFromPrefs(SharedPrefsConsts.mohemmWifiPassword);
AppState().setMemberInformationListModel =
(await MemberInformationListModel.getFromPrefs()).first;
AppState().setPrivilegeListModel =
await PrivilegeListModel.getFromPrefs();
String mohemmWifiSSID =
await Utils.getStringFromPrefs(SharedPrefsConsts.mohemmWifiSSID);
String mohemmWifiPassword = await Utils.getStringFromPrefs(
SharedPrefsConsts.mohemmWifiPassword);
AppState().setMohemmWifiSSID = mohemmWifiSSID;
AppState().setMohemmWifiPassword = mohemmWifiPassword;
}
Utils.hideLoading(context);
if (_autoLogin) {
Navigator.pushReplacementNamed(context, AppRoutes.verifyLastLogin, arguments: loginInfo);
Navigator.pushReplacementNamed(context, AppRoutes.verifyLastLogin,
arguments: loginInfo);
} else {
Navigator.pushNamed(context, AppRoutes.verifyLogin, arguments: "$firebaseToken");
Navigator.pushNamed(context, AppRoutes.verifyLogin,
arguments: "$firebaseToken");
}
} catch (ex) {
Utils.hideLoading(context);
@ -130,14 +140,19 @@ class _LoginScreenState extends State<LoginScreen> {
Widget build(BuildContext context) {
if (isAppOpenBySystem == null) {
isAppOpenBySystem = (ModalRoute.of(context)!.settings.arguments ?? true) as bool;
if (kDebugMode) {
if (!kReleaseMode) {
// username.text = "15444"; // Maha User
username.text = "15153"; // Tamer User
password.text = "Abcd@12345";
// username.text = "15153"; // Tamer User
// password.text = "Abcd@12345";
username.text = "210038"; // Hashim User
password.text = "123";
}
if (isAppOpenBySystem!) checkFirebaseToken();
}
// username.text = "15444";
return Scaffold(
body: Column(
children: [
@ -153,7 +168,13 @@ class _LoginScreenState extends State<LoginScreen> {
Expanded(child: SizedBox()),
Row(
children: [
LocaleKeys.english.tr().toText14(color: AppState().isArabic(context) ? null : MyColors.textMixColor).onPress(() {
LocaleKeys.english
.tr()
.toText14(
color: AppState().isArabic(context)
? null
: MyColors.textMixColor)
.onPress(() {
context.setLocale(const Locale("en", "US"));
}),
Container(
@ -162,7 +183,13 @@ class _LoginScreenState extends State<LoginScreen> {
height: 16,
margin: const EdgeInsets.only(left: 10, right: 10),
),
LocaleKeys.arabic.tr().toText14(color: !AppState().isArabic(context) ? null : MyColors.textMixColor).onPress(() {
LocaleKeys.arabic
.tr()
.toText14(
color: !AppState().isArabic(context)
? null
: MyColors.textMixColor)
.onPress(() {
context.setLocale(const Locale("ar", "SA"));
}),
],
@ -178,14 +205,23 @@ class _LoginScreenState extends State<LoginScreen> {
LocaleKeys.login.tr().toText24(isBold: true),
LocaleKeys.pleaseEnterLoginDetails.tr().toText16(),
16.height,
InputWidget(LocaleKeys.username.tr(), "123456", username),
InputWidget(
LocaleKeys.username.tr(), "123456", username),
12.height,
InputWidget(LocaleKeys.password.tr(), "xxxxxx", password, isTextIsPassword: true),
InputWidget(
LocaleKeys.password.tr(), "xxxxxx", password,
isTextIsPassword: true),
9.height,
Align(
alignment: Alignment.centerRight,
child: LocaleKeys.forgotPassword.tr().toText12(isUnderLine: true, color: MyColors.textMixColor).onPress(() {
Navigator.pushNamed(context, AppRoutes.forgotPassword);
child: LocaleKeys.forgotPassword
.tr()
.toText12(
isUnderLine: true,
color: MyColors.textMixColor)
.onPress(() {
Navigator.pushNamed(
context, AppRoutes.forgotPassword);
}),
),
],
@ -196,8 +232,6 @@ class _LoginScreenState extends State<LoginScreen> {
),
),
DefaultButton(LocaleKeys.login.tr(), () async {
// context.setLocale(const Locale("en", "US")); // to change Loacle
SystemChannels.textInput.invokeMethod('TextInput.hide');
performLogin();
}).insideContainer

@ -0,0 +1,246 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:lottie/lottie.dart';
import 'package:mohem_flutter_app/classes/colors.dart';
import 'package:mohem_flutter_app/classes/decorations_helper.dart';
import 'package:mohem_flutter_app/classes/lottie_consts.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/ui/marathon/marathon_provider.dart';
import 'package:mohem_flutter_app/ui/marathon/widgets/countdown_timer.dart';
import 'package:mohem_flutter_app/ui/marathon/widgets/marathon_header.dart';
import 'package:mohem_flutter_app/widgets/button/default_button.dart';
import 'package:provider/provider.dart';
final int dummyEndTime = DateTime.now().millisecondsSinceEpoch + 1000 * 30;
class MarathonIntroScreen extends StatelessWidget {
const MarathonIntroScreen({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
MarathonProvider provider = context.watch<MarathonProvider>();
return Scaffold(
body: Stack(
children: <Widget>[
SingleChildScrollView(
child: Column(
children: <Widget>[
const MarathonHeader(),
MarathonDetailsCard(provider: provider).paddingAll(15),
MarathonTimerCard(
provider: provider,
timeToMarathon: dummyEndTime,
).paddingOnly(left: 15, right: 15, bottom: 15),
const SizedBox(height: 100,),
],
),
),
Align(
alignment: Alignment.bottomCenter,
child: MarathonFooter(provider: provider),
),
],
),
);
}
}
class MarathonDetailsCard extends StatelessWidget {
final MarathonProvider provider;
const MarathonDetailsCard({Key? key, required this.provider})
: super(key: key);
@override
Widget build(BuildContext context) {
return Container(
width: double.infinity,
decoration: MyDecorations.shadowDecoration,
padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 20),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
LocaleKeys.contestTopicAbout
.tr()
.toText16(color: MyColors.grey77Color),
"Saudi Arabia"
.toText20(color: MyColors.textMixColor, isBold: true),
Row(
children: <Widget>[
Flexible(
child:
"Nam suscipit turpis in pharetra euismsdef. Duis rutrum at nulla id aliquam"
.toText14(color: MyColors.grey77Color),
)
],
),
if (provider.itsMarathonTime) ...<Widget>[
5.height,
Row(
children: <Widget>[
LocaleKeys.prize
.tr()
.toText16(color: MyColors.grey77Color, isBold: true),
" LED 55\" Android TV"
.toText16(color: MyColors.greenColor, isBold: true),
],
),
Row(
children: <Widget>[
LocaleKeys.sponsoredBy
.tr()
.toText16(color: MyColors.grey77Color),
" Extra"
.toText16(color: MyColors.darkTextColor, isBold: true),
],
),
10.height,
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Image.network(
"https://cdn.pixabay.com/photo/2014/08/27/07/53/blog-428950_1280.jpg",
height: 50,
fit: BoxFit.fill,
width: 120,
)
],
),
]
],
),
],
),
);
}
}
class MarathonTimerCard extends StatelessWidget {
final int timeToMarathon;
final MarathonProvider provider;
const MarathonTimerCard({
Key? key,
required this.provider,
required this.timeToMarathon,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
width: double.infinity,
decoration: MyDecorations.shadowDecoration,
padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 20),
child: Column(
children: <Widget>[
Row(
children: <Widget>[
LocaleKeys.gameDate.tr().toText16(color: MyColors.grey77Color),
" 10 Oct, 2022"
.toText16(color: MyColors.darkTextColor, isBold: true),
],
),
Row(
children: <Widget>[
LocaleKeys.gameTime.tr().toText16(color: MyColors.grey77Color),
" 3:00pm".toText16(color: MyColors.darkTextColor, isBold: true),
],
),
Lottie.asset(
MyLottieConsts.hourGlassLottie,
height: 140,
),
BuildCountdownTimer(
timeToMarathon: timeToMarathon,
provider: provider,
screenFlag: 1,
),
],
),
);
}
}
class MarathonFooter extends StatelessWidget {
final MarathonProvider provider;
const MarathonFooter({
Key? key,
required this.provider,
}) : super(key: key);
Widget buildNoteForDemo() {
return RichText(
text: TextSpan(
children: <InlineSpan>[
TextSpan(
text: LocaleKeys.note.tr(),
style: const TextStyle(
color: MyColors.darkTextColor,
fontSize: 17,
letterSpacing: -0.64,
fontWeight: FontWeight.bold,
),
),
TextSpan(
text: " " + LocaleKeys.demoMarathonNoteP1.tr(),
style: const TextStyle(
color: MyColors.grey77Color,
fontSize: 17,
letterSpacing: -0.64,
fontWeight: FontWeight.w500,
),
),
TextSpan(
text: " " + LocaleKeys.demoMarathonNoteP2.tr(),
style: const TextStyle(
color: MyColors.darkTextColor,
fontSize: 17,
fontWeight: FontWeight.bold,
),
),
TextSpan(
text: " " + LocaleKeys.demoMarathonNoteP3.tr(),
style: const TextStyle(
color: MyColors.grey77Color,
fontSize: 17,
letterSpacing: -0.64,
fontWeight: FontWeight.w500,
),
)
],
),
).paddingOnly(right: 21, left: 21, top: 11, bottom: 0);
}
@override
Widget build(BuildContext context) {
return provider.itsMarathonTime
? DefaultButton(
LocaleKeys.joinMarathon.tr(),
() => Navigator.pushNamed(context, AppRoutes.marathonScreen),
).insideContainer
: Container(
color: Colors.white,
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
buildNoteForDemo(),
DefaultButton(
LocaleKeys.joinDemoMarathon.tr(),
() {},
color: MyColors.yellowColorII,
).insideContainer,
],
),
);
}
}

@ -0,0 +1,91 @@
import 'dart:async';
import 'package:appinio_swiper/appinio_swiper.dart';
import 'package:flutter/cupertino.dart';
import 'package:mohem_flutter_app/config/routes.dart';
class MarathonProvider extends ChangeNotifier {
final AppinioSwiperController swiperController = AppinioSwiperController();
bool _itsMarathonTime = false;
bool get itsMarathonTime => _itsMarathonTime;
set itsMarathonTime(bool value) {
_itsMarathonTime = value;
notifyListeners();
}
bool _isMarathonCompleted = false;
bool get isMarathonCompleted => _isMarathonCompleted;
set isMarathonCompleted(bool value) {
_isMarathonCompleted = value;
notifyListeners();
}
void swipeCardLeft() {
currentQuestionNumber = currentQuestionNumber + 1;
swiperController.swipeLeft();
notifyListeners();
}
int _currentQuestionNumber = 1;
final int totalQuestions = 10;
int get currentQuestionNumber => _currentQuestionNumber;
set currentQuestionNumber(int value) {
_currentQuestionNumber = value;
notifyListeners();
}
Timer timerU = Timer.periodic(const Duration(seconds: 1), (Timer timer) {});
int start = 5;
void startTimer(BuildContext context) {
start = 5;
const Duration oneSec = Duration(seconds: 1);
timerU = Timer.periodic(
oneSec,
(Timer timer) async {
if (start == 0) {
if (currentQuestionNumber == 9) {
timer.cancel();
cancelTimer();
isMarathonCompleted = true;
await Future<dynamic>.delayed(const Duration(seconds: 3)).whenComplete(
() => Navigator.pushReplacementNamed(
context,
AppRoutes.marathonWinnerSelection,
),
);
resetValues();
return;
}
swipeCardLeft();
timer.cancel();
cancelTimer();
} else {
start--;
}
notifyListeners();
},
);
}
void resetValues() {
timerU.cancel();
_isMarathonCompleted = false;
_currentQuestionNumber = 1;
notifyListeners();
}
void cancelTimer() {
timerU.cancel();
notifyListeners();
}
}

@ -0,0 +1,151 @@
import 'dart:async';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:lottie/lottie.dart';
import 'package:mohem_flutter_app/classes/colors.dart';
import 'package:mohem_flutter_app/classes/decorations_helper.dart';
import 'package:mohem_flutter_app/classes/lottie_consts.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/ui/marathon/marathon_provider.dart';
import 'package:mohem_flutter_app/ui/marathon/widgets/custom_status_widget.dart';
import 'package:mohem_flutter_app/ui/marathon/widgets/marathon_header.dart';
import 'package:mohem_flutter_app/ui/marathon/widgets/question_card.dart';
import 'package:provider/provider.dart';
import 'package:steps_indicator/steps_indicator.dart';
class MarathonScreen extends StatelessWidget {
const MarathonScreen({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
MarathonProvider provider = context.watch<MarathonProvider>();
return Scaffold(
body: SingleChildScrollView(
child: Column(
children: <Widget>[
const MarathonHeader(),
20.height,
MarathonProgressContainer(provider: provider).paddingOnly(left: 21, right: 21),
if (provider.isMarathonCompleted)
InkWell(
onTap: () {
Navigator.pushReplacementNamed(
context,
AppRoutes.marathonWinnerSelection,
);
},
child: CustomStatusWidget(
asset: Lottie.asset(
MyLottieConsts.allQuestions,
height: 200,
),
title: Text(
LocaleKeys.congrats.tr(),
style: const TextStyle(
height: 23 / 24,
color: MyColors.greenColor,
fontSize: 27,
letterSpacing: -1,
fontWeight: FontWeight.w600,
),
),
subTitle: Text(
LocaleKeys.allQuestionsCorrect.tr(),
textAlign: TextAlign.center,
style: const TextStyle(fontSize: 18, fontWeight: FontWeight.w600, color: MyColors.darkTextColor, letterSpacing: -1.08),
),
).paddingOnly(top: 12, left: 21, right: 21),
)
else
QuestionCard(provider: provider).paddingOnly(top: 12, left: 21, right: 21),
],
),
),
);
}
}
class MarathonProgressContainer extends StatefulWidget {
final MarathonProvider provider;
const MarathonProgressContainer({Key? key, required this.provider}) : super(key: key);
@override
State<MarathonProgressContainer> createState() => _MarathonProgressContainerState();
}
class _MarathonProgressContainerState extends State<MarathonProgressContainer> {
@override
void initState() {
scheduleMicrotask(() {
widget.provider.startTimer(context);
});
super.initState();
}
@override
void dispose() {
widget.provider.cancelTimer();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Container(
width: double.infinity,
decoration: MyDecorations.shadowDecoration,
padding: const EdgeInsets.all(21),
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Container(
decoration: BoxDecoration(
color: MyColors.greenColor,
borderRadius: BorderRadius.circular(12),
),
padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 8),
child: "${widget.provider.currentQuestionNumber.toString()} / ${widget.provider.totalQuestions.toString()} ${LocaleKeys.question.tr()}".toText12(color: MyColors.white),
),
"23 ${LocaleKeys.marathoners.tr()}".toText14(),
"00:${widget.provider.start < 10 ? "0${widget.provider.start}" : widget.provider.start}".toText18(),
],
),
15.height,
StepsIndicator(
lineLength: 21,
nbSteps: 10,
selectedStep: widget.provider.currentQuestionNumber,
doneLineColor: MyColors.greenColor,
doneStepColor: MyColors.greenColor,
doneLineThickness: 6,
undoneLineThickness: 6,
selectedStepSize: 10,
unselectedStepSize: 10,
doneStepSize: 10,
selectedStepColorIn: MyColors.greenColor,
selectedStepColorOut: MyColors.greenColor,
unselectedStepColorIn: MyColors.lightGreyDeColor,
unselectedStepColorOut: MyColors.lightGreyDeColor,
undoneLineColor: MyColors.lightGreyDeColor,
enableLineAnimation: false,
enableStepAnimation: false,
),
12.height,
Row(
children: <Widget>[
"${widget.provider.currentQuestionNumber * 10}% ${LocaleKeys.completed.tr()}".toText14(isBold: true),
],
),
],
),
);
}
}

@ -0,0 +1,155 @@
import 'dart:async';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:lottie/lottie.dart';
import 'package:mohem_flutter_app/classes/colors.dart';
import 'package:mohem_flutter_app/classes/decorations_helper.dart';
import 'package:mohem_flutter_app/classes/lottie_consts.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/ui/marathon/marathon_provider.dart';
import 'package:mohem_flutter_app/ui/marathon/widgets/custom_status_widget.dart';
import 'package:mohem_flutter_app/ui/marathon/widgets/marathon_header.dart';
import 'package:provider/provider.dart';
class MarathonWinnerSelection extends StatelessWidget {
const MarathonWinnerSelection({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
MarathonProvider provider = context.read<MarathonProvider>();
return Scaffold(
body: SingleChildScrollView(
child: Column(
children: [
const MarathonHeader(),
20.height,
QualifiersContainer(provider: provider)
.paddingOnly(left: 21, right: 21),
20.height,
InkWell(
onTap: () {
Navigator.pushNamed(context, AppRoutes.marathonWinnerScreen);
},
child: Container(
height: 50,
decoration: BoxDecoration(
color: MyColors.greenColor,
borderRadius: BorderRadius.circular(15),
boxShadow: [
BoxShadow(
color: const Color(0xff000000).withOpacity(.05),
blurRadius: 26,
offset: const Offset(0, -3),
),
],
),
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 20),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
"Muhammad Shrouff"
.toText18(isBold: true, color: MyColors.white),
"837436".toText18(isBold: true, color: MyColors.white),
],
),
),
).paddingOnly(left: 20, right: 20),
),
CustomStatusWidget(
asset: Lottie.asset(
MyLottieConsts.winnerLottie,
height: 168,
),
title: Text(
LocaleKeys.fingersCrossed.tr(),
style: const TextStyle(
height: 23 / 24,
color: MyColors.greenColor,
fontSize: 27,
letterSpacing: -1,
fontWeight: FontWeight.w600,
),
),
subTitle: Text(
LocaleKeys.winnerSelectedRandomly.tr(),
textAlign: TextAlign.center,
style: const TextStyle(
color: MyColors.grey77Color,
fontSize: 16,
letterSpacing: -0.64,
fontWeight: FontWeight.w600,
),
)).paddingOnly(left: 21, right: 21, top: 20, bottom: 20),
],
),
),
);
}
}
class QualifiersContainer extends StatefulWidget {
final MarathonProvider provider;
const QualifiersContainer({Key? key, required this.provider})
: super(key: key);
@override
State<QualifiersContainer> createState() => _QualifiersContainerState();
}
class _QualifiersContainerState extends State<QualifiersContainer> {
final int totalQuestions = 10;
final int currentQuestion = 04;
@override
void initState() {
scheduleMicrotask(() {
widget.provider.startTimer(context);
});
super.initState();
}
@override
void dispose() {
widget.provider.cancelTimer();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Container(
width: double.infinity,
decoration: MyDecorations.shadowDecoration,
padding: const EdgeInsets.symmetric(vertical: 15, horizontal: 20),
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
LocaleKeys.winnerSelection
.tr()
.toText18(isBold: true, color: MyColors.grey3AColor),
"00:${widget.provider.start < 10 ? "0${widget.provider.start}" : widget.provider.start}"
.toText18(isBold: true, color: MyColors.redColor),
],
),
10.height,
Row(
children: [
"18 ".toText32(color: MyColors.greenColor),
LocaleKeys.qualifiers.tr().toText20(color: MyColors.greenColor),
],
),
],
),
);
}
}

@ -0,0 +1,240 @@
import 'dart:async';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_countdown_timer/current_remaining_time.dart';
import 'package:flutter_countdown_timer/flutter_countdown_timer.dart';
import 'package:mohem_flutter_app/classes/colors.dart';
import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
import 'package:mohem_flutter_app/ui/marathon/marathon_provider.dart';
class BuildCountdownTimer extends StatelessWidget {
final int timeToMarathon;
final MarathonProvider provider;
final int screenFlag;
const BuildCountdownTimer({
Key? key,
required this.provider,
required this.timeToMarathon,
required this.screenFlag,
}) : super(key: key);
final TextStyle styleTextHome = const TextStyle(
fontSize: 7,
color: MyColors.greyACColor,
fontStyle: FontStyle.italic,
fontWeight: FontWeight.w600,
letterSpacing: -0.4,
);
final TextStyle styleDigitHome = const TextStyle(
height: 23 / 27,
color: MyColors.white,
fontSize: 24,
fontStyle: FontStyle.italic,
letterSpacing: -1.44,
fontWeight: FontWeight.w600,
);
final TextStyle styleTextMarathon = const TextStyle(
fontSize: 10,
fontStyle: FontStyle.normal,
fontWeight: FontWeight.w600,
color: MyColors.grey57Color,
letterSpacing: -0.4,
);
final TextStyle styleDigitMarathon = const TextStyle(
height: 23 / 24,
color: MyColors.darkTextColor,
fontSize: 34,
letterSpacing: -1.44,
fontWeight: FontWeight.bold,
);
Widget buildEmptyWidget() {
return Row(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Column(
children: <Widget>[
Text(
"00",
style: screenFlag == 0 ? styleDigitHome : styleDigitMarathon,
),
Text(
LocaleKeys.days.tr(),
style: screenFlag == 0 ? styleTextHome : styleTextMarathon,
),
],
),
buildSeparator(),
Column(
children: <Widget>[
Text(
"00",
style: screenFlag == 0 ? styleDigitHome : styleDigitMarathon,
),
Text(
LocaleKeys.hours.tr(),
style: screenFlag == 0 ? styleTextHome : styleTextMarathon,
),
],
),
buildSeparator(),
Column(
children: <Widget>[
Text(
"00",
style: screenFlag == 0 ? styleDigitHome : styleDigitMarathon,
),
Text(
LocaleKeys.minutes.tr(),
style: screenFlag == 0 ? styleTextHome : styleTextMarathon,
),
],
),
buildSeparator(),
Column(
children: <Widget>[
Text(
"00",
style: screenFlag == 0 ? styleDigitHome : styleDigitMarathon,
),
Text(
LocaleKeys.seconds.tr(),
style: screenFlag == 0 ? styleTextHome : styleTextMarathon,
),
],
),
],
);
}
Widget buildSeparator() {
return Text(
" : ",
style: screenFlag == 0 ? styleDigitHome : styleDigitMarathon,
);
}
Widget buildCountdownTimer(CurrentRemainingTime? time) {
if (time == null) {
if (!provider.itsMarathonTime) {
scheduleMicrotask(() {
provider.itsMarathonTime = true;
});
}
return buildEmptyWidget();
}
return Row(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Column(
children: <Widget>[
time.days == null
? Text(
"00",
style:
screenFlag == 0 ? styleDigitHome : styleDigitMarathon,
)
: Text(
time.days! < 10
? "0${time.days.toString()}"
: time.days.toString(),
style:
screenFlag == 0 ? styleDigitHome : styleDigitMarathon,
),
Text(
LocaleKeys.days.tr(),
style: screenFlag == 0 ? styleTextHome : styleTextMarathon,
),
],
),
buildSeparator(),
Column(
children: <Widget>[
time.hours == null
? Text(
"00",
style:
screenFlag == 0 ? styleDigitHome : styleDigitMarathon,
)
: Text(
time.hours! < 10
? "0${time.hours.toString()}"
: time.hours.toString(),
style:
screenFlag == 0 ? styleDigitHome : styleDigitMarathon,
),
Text(
LocaleKeys.hours.tr(),
style: screenFlag == 0 ? styleTextHome : styleTextMarathon,
),
],
),
buildSeparator(),
Column(
children: <Widget>[
time.min == null
? Text(
"00",
style:
screenFlag == 0 ? styleDigitHome : styleDigitMarathon,
)
: Text(
time.min! < 10
? "0${time.min.toString()}"
: time.min.toString(),
style:
screenFlag == 0 ? styleDigitHome : styleDigitMarathon,
),
Text(
LocaleKeys.minutes.tr(),
style: screenFlag == 0 ? styleTextHome : styleTextMarathon,
),
],
),
buildSeparator(),
Column(
children: <Widget>[
time.sec == null
? Text(
"00",
style:
screenFlag == 0 ? styleDigitHome : styleDigitMarathon,
)
: Text(
time.sec! < 10
? "0${time.sec.toString()}"
: time.sec.toString(),
style:
screenFlag == 0 ? styleDigitHome : styleDigitMarathon,
),
Text(
LocaleKeys.seconds.tr(),
style: screenFlag == 0 ? styleTextHome : styleTextMarathon,
),
],
),
],
);
}
@override
Widget build(BuildContext context) {
return CountdownTimer(
endTime: timeToMarathon,
onEnd: null,
widgetBuilder: (BuildContext context, CurrentRemainingTime? time) {
return buildCountdownTimer(time);
},
);
}
}

@ -0,0 +1,34 @@
import 'package:flutter/material.dart';
import 'package:mohem_flutter_app/classes/decorations_helper.dart';
import 'package:mohem_flutter_app/extensions/int_extensions.dart';
class CustomStatusWidget extends StatelessWidget {
final Widget asset;
final Widget title;
final Widget subTitle;
const CustomStatusWidget({
Key? key,
required this.asset,
required this.title,
required this.subTitle,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
width: double.infinity,
decoration: MyDecorations.shadowDecoration,
padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 20),
child: Column(
children: <Widget>[
asset,
50.height,
title,
10.height,
subTitle,
],
),
);
}
}

@ -0,0 +1,89 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:mohem_flutter_app/app_state/app_state.dart';
import 'package:mohem_flutter_app/classes/colors.dart';
import 'package:mohem_flutter_app/classes/decorations_helper.dart';
import 'package:mohem_flutter_app/config/routes.dart';
import 'package:mohem_flutter_app/extensions/int_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/ui/marathon/marathon_intro_screen.dart';
import 'package:mohem_flutter_app/ui/marathon/marathon_provider.dart';
import 'package:mohem_flutter_app/ui/marathon/widgets/countdown_timer.dart';
import 'package:provider/provider.dart';
import 'dart:math' as math;
class MarathonBanner extends StatelessWidget {
const MarathonBanner({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
MarathonProvider provider = context.read<MarathonProvider>();
return Container(
decoration: MyDecorations.shadowDecoration,
child: Stack(
children: [
Transform(
alignment: Alignment.center,
transform: Matrix4.rotationY(
AppState().isArabic(context) ? math.pi : 0,
),
child: SvgPicture.asset(
"assets/images/marathon_banner_bg.svg",
fit: BoxFit.cover,
width: MediaQuery.of(context).size.width - 40,
),
),
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
Column(
mainAxisAlignment: MainAxisAlignment.center,
mainAxisSize: MainAxisSize.min,
children: <Widget>[
AppState().isArabic(context) ? 0.height : 5.height,
Flexible(
child: Text(
LocaleKeys.getReadyForContest.tr(),
style: const TextStyle(
fontStyle: FontStyle.italic,
fontSize: 12,
fontWeight: FontWeight.w600,
color: MyColors.lightGreyEFColor,
letterSpacing: -0.4,
),
),
),
const Flexible(
child: Text(
"Saudi Arabia",
style: TextStyle(
fontStyle: FontStyle.italic,
fontSize: 19,
fontWeight: FontWeight.bold,
color: MyColors.lightGreyEFColor,
height: 32 / 22,
),
),
),
3.height,
BuildCountdownTimer(
timeToMarathon: dummyEndTime,
provider: provider,
screenFlag: 0,
),
],
).paddingOnly(
left: AppState().isArabic(context) ? 12 : 0,
right: AppState().isArabic(context) ? 0 : 12,
)
],
),
],
).onPress(
() => Navigator.pushNamed(context, AppRoutes.marathonIntroScreen),
),
);
}
}

@ -0,0 +1,41 @@
import 'package:easy_localization/easy_localization.dart';
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/generated/locale_keys.g.dart';
import 'package:mohem_flutter_app/ui/marathon/marathon_provider.dart';
import 'package:provider/provider.dart';
class MarathonHeader extends StatelessWidget {
const MarathonHeader({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return SafeArea(
child: Container(
color: MyColors.kWhiteColor,
width: double.infinity,
height: 65,
padding: const EdgeInsets.symmetric(horizontal: 25, vertical: 15),
child: Row(
crossAxisAlignment: CrossAxisAlignment.end,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
LocaleKeys.brainMarathon.tr().toText24(isBold: true),
IconButton(
padding: EdgeInsets.zero,
icon: const Icon(Icons.close, size: 28),
color: MyColors.black,
constraints: const BoxConstraints(),
onPressed: () {
Provider.of<MarathonProvider>(context, listen: false)
.resetValues();
Navigator.pop(context);
},
)
],
),
),
);
}
}

@ -0,0 +1,291 @@
import 'package:appinio_swiper/appinio_swiper.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:mohem_flutter_app/classes/colors.dart';
import 'package:mohem_flutter_app/classes/decorations_helper.dart';
import 'package:mohem_flutter_app/config/routes.dart';
import 'package:mohem_flutter_app/models/marathon_question_model.dart';
import 'package:mohem_flutter_app/ui/marathon/marathon_provider.dart';
import 'package:provider/provider.dart';
class QuestionCard extends StatefulWidget {
final MarathonProvider provider;
const QuestionCard({Key? key, required this.provider}) : super(key: key);
@override
State<QuestionCard> createState() => _QuestionCardState();
}
class _QuestionCardState extends State<QuestionCard> {
final List<QuestionContent> questionCards = <QuestionContent>[];
@override
void initState() {
_loadCards();
super.initState();
}
void _loadCards() {
for (DummyQuestionModel question in questions) {
questionCards.add(
QuestionContent(
question: question,
provider: widget.provider,
),
);
}
}
@override
Widget build(BuildContext context) {
return CupertinoPageScaffold(
child: SizedBox(
height: 420,
width: double.infinity,
child: Consumer<MarathonProvider>(
builder: (BuildContext context, MarathonProvider provider, _) {
return AppinioSwiper(
padding: EdgeInsets.zero,
isDisabled: true,
controller: provider.swiperController,
unswipe: (int index, AppinioSwiperDirection direction) {},
cards: questionCards,
onSwipe: (int index, AppinioSwiperDirection direction) {
if (direction == AppinioSwiperDirection.left) {
provider.startTimer(context);
}
},
);
},
),
),
);
}
}
class QuestionContent extends StatelessWidget {
final DummyQuestionModel question;
final MarathonProvider provider;
const QuestionContent({
Key? key,
required this.question,
required this.provider,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10),
color: CupertinoColors.white,
boxShadow: <BoxShadow>[
BoxShadow(
color: CupertinoColors.systemGrey.withOpacity(0.2),
spreadRadius: 3,
blurRadius: 7,
offset: const Offset(0, 3),
)
],
),
alignment: Alignment.center,
child: Column(
children: <Widget>[
Container(
height: 78,
width: double.infinity,
decoration: const BoxDecoration(
gradient: LinearGradient(
transform: GradientRotation(.83),
begin: Alignment.topRight,
end: Alignment.bottomLeft,
colors: <Color>[
MyColors.gradiantEndColor,
MyColors.gradiantStartColor,
],
),
borderRadius: BorderRadius.only(
topLeft: Radius.circular(10),
topRight: Radius.circular(10),
),
),
child: const Center(
child: Padding(
padding: EdgeInsets.symmetric(horizontal: 13),
child: Text(
"What is the capital of Saudi Arabia?",
style: TextStyle(
color: MyColors.white,
fontSize: 16,
fontWeight: FontWeight.w600,
),
),
),
),
),
AnswerContent(question: question, provider: provider),
],
),
);
}
}
class AnswerContent extends StatelessWidget {
final DummyQuestionModel question;
final MarathonProvider provider;
const AnswerContent({Key? key, required this.question, required this.provider}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
padding: const EdgeInsets.all(13),
decoration: const BoxDecoration(
color: MyColors.kWhiteColor,
borderRadius: BorderRadius.only(
bottomLeft: Radius.circular(10),
bottomRight: Radius.circular(10),
),
),
child: Column(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
InkWell(
onTap: () {
if (provider.currentQuestionNumber == 9) {
provider.cancelTimer();
provider.resetValues();
Navigator.pushReplacementNamed(
context,
AppRoutes.marathonWinnerSelection,
);
return;
}
provider.cancelTimer();
provider.startTimer(context);
provider.swipeCardLeft();
},
child: Container(
height: 60,
width: MediaQuery.of(context).size.width - 75,
alignment: Alignment.centerLeft,
decoration: MyDecorations.answerContainerDecoration,
child: Center(
child: Text(
question.opt1!,
style: const TextStyle(
color: MyColors.darkTextColor,
fontWeight: FontWeight.w600,
fontSize: 16,
),
),
),
),
),
const SizedBox(height: 15),
InkWell(
onTap: () {
if (provider.currentQuestionNumber == 9) {
provider.cancelTimer();
provider.resetValues();
Navigator.pushReplacementNamed(
context,
AppRoutes.marathonWinnerSelection,
);
return;
}
provider.cancelTimer();
provider.startTimer(context);
provider.swipeCardLeft();
},
child: Container(
height: 60,
width: MediaQuery.of(context).size.width - 75,
alignment: Alignment.centerLeft,
decoration: MyDecorations.answerContainerDecoration,
child: Center(
child: Text(
question.opt2!,
style: const TextStyle(
color: MyColors.darkTextColor,
fontWeight: FontWeight.w600,
fontSize: 16,
),
),
),
),
),
const SizedBox(height: 15),
InkWell(
onTap: () {
if (provider.currentQuestionNumber == 9) {
provider.cancelTimer();
provider.resetValues();
Navigator.pushReplacementNamed(
context,
AppRoutes.marathonWinnerSelection,
);
return;
}
provider.cancelTimer();
provider.startTimer(context);
provider.swipeCardLeft();
},
child: Container(
height: 60,
width: MediaQuery.of(context).size.width - 75,
alignment: Alignment.centerLeft,
decoration: MyDecorations.answerContainerDecoration,
child: Center(
child: Text(
question.opt3!,
style: const TextStyle(
color: MyColors.darkTextColor,
fontWeight: FontWeight.w600,
fontSize: 16,
),
),
),
),
),
const SizedBox(height: 15),
InkWell(
onTap: () {
if (provider.currentQuestionNumber == 9) {
provider.cancelTimer();
provider.resetValues();
Navigator.pushReplacementNamed(
context,
AppRoutes.marathonWinnerSelection,
);
return;
}
provider.cancelTimer();
provider.startTimer(context);
provider.swipeCardLeft();
},
child: Container(
height: 60,
width: MediaQuery.of(context).size.width - 75,
alignment: Alignment.centerLeft,
decoration: MyDecorations.answerContainerDecoration,
child: Center(
child: Text(
question.opt3!,
style: const TextStyle(
color: MyColors.darkTextColor,
fontWeight: FontWeight.w600,
fontSize: 16,
),
),
),
),
),
],
),
);
}
}

@ -0,0 +1,76 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:lottie/lottie.dart';
import 'package:mohem_flutter_app/classes/colors.dart';
import 'package:mohem_flutter_app/classes/decorations_helper.dart';
import 'package:mohem_flutter_app/classes/lottie_consts.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/ui/marathon/widgets/marathon_header.dart';
class WinnerScreen extends StatelessWidget {
const WinnerScreen({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: MyColors.backgroundColor,
body: SingleChildScrollView(
child: Column(
children: <Widget>[
const MarathonHeader(),
60.height,
Container(
width: double.infinity,
decoration: MyDecorations.shadowDecoration,
padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 20),
child: Column(
children: <Widget>[
SizedBox(
height: 200,
child: Stack(
children: <Widget>[
Lottie.asset(
MyLottieConsts.celebrate1Lottie,
height: 200,
),
Lottie.asset(
MyLottieConsts.celebrate2Lottie,
height: 200,
),
],
),
),
50.height,
"Muhammad Shrouff".toText22(color: MyColors.grey3AColor),
"837436".toText22(color: MyColors.grey57Color),
90.height,
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
LocaleKeys.sponsoredBy
.tr()
.toText14(color: MyColors.grey77Color),
" Extra".toText14(
color: MyColors.darkTextColor, isBold: true),
],
),
5.height,
Image.network(
"https://cdn.pixabay.com/photo/2014/08/27/07/53/blog-428950_1280.jpg",
height: 50,
fit: BoxFit.fill,
width: 120,
),
],
),
).paddingOnly(left: 21, right: 21),
10.height,
],
),
),
);
}
}

@ -260,7 +260,7 @@ class _DynamicInputScreenState extends State<DynamicInputScreen> {
for (int i = 0; i < parentsList.length; i++) {
for (int j = 0; j < (getEitDffStructureList?.length ?? 0); j++) {
if (getEitDffStructureList![j].sEGMENTNAME == parentsList[i].name) {
if (getEitDffStructureList![j].sEGMENTNAME == parentsList[i].opt1) {
if (getEitDffStructureList![j].dISPLAYFLAG != "N") {
if (getEitDffStructureList![j].vALIDATIONTYPE == "N") {
String? idColName;

@ -16,7 +16,9 @@ import 'package:mohem_flutter_app/models/itg_forms_models/itg_request_model.dart
import 'package:mohem_flutter_app/models/itg_forms_models/request_detail_model.dart';
import 'package:mohem_flutter_app/ui/work_list/itg_fragments/approval_level_fragment.dart';
import 'package:mohem_flutter_app/ui/work_list/itg_fragments/request_detail_fragment.dart';
import 'package:mohem_flutter_app/ui/work_list/sheets/delegate_sheet.dart';
import 'package:mohem_flutter_app/widgets/app_bar_widget.dart';
import 'package:mohem_flutter_app/widgets/bottom_sheet.dart';
import 'package:mohem_flutter_app/widgets/button/default_button.dart';
import 'package:mohem_flutter_app/widgets/dialogs/itg_comments_dialog.dart';
@ -203,11 +205,12 @@ class _ItgDetailScreenState extends State<ItgDetailScreen> {
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.end,
children: [
myFab(LocaleKeys.pleaseEnterComments.tr(), "assets/images/skip.svg").onPress(() {
myFab(LocaleKeys.skip.tr(), "assets/images/skip.svg").onPress(() {
if (AppState().requestAllList!.length - 1 > AppState().itgWorkListIndex!) {
AppState().itgWorkListIndex = AppState().itgWorkListIndex! + 1;
requestDetails = null;
itgRequest = null;
tabIndex = 0;
showFabOptions = false;
getDataFromState();
} else if (AppState().requestAllList!.length - 1 == AppState().itgWorkListIndex!) {
@ -257,13 +260,17 @@ class _ItgDetailScreenState extends State<ItgDetailScreen> {
}
void handleFabAction(AllowedActions action) {
print(action.toJson());
switch (action.action) {
case "DELEGATE":
// showMyBottomSheet(context, child: DelegateSheet(title: LocaleKeys.delegate.tr(), apiMode: action.action!, notificationID: workListData!.nOTIFICATIONID, actionHistoryList: actionHistoryList));
case "Delegate":
showMyBottomSheet(context,
child: DelegateSheet(title: LocaleKeys.delegate.tr(), apiMode: action.action!, notificationID: null, actionHistoryList: null, wFHistory: itgRequest?.wFHistory ?? []));
break;
case "REQUEST_INFO":
// do something else
case "RequestInformation":
showMyBottomSheet(context,
child: DelegateSheet(title: LocaleKeys.request_info.tr(), apiMode: action.action!, notificationID: null, actionHistoryList: null, wFHistory: itgRequest?.wFHistory ?? []));
break;
case "RFC":
// do something else
@ -357,11 +364,11 @@ class _ItgDetailScreenState extends State<ItgDetailScreen> {
Utils.hideLoading(context);
Utils.showToast(LocaleKeys.yourChangeHasBeenSavedSuccessfully.tr());
// Navigator.pop(context, "delegate_reload");
AppState().workList!.removeAt(AppState().workListIndex!);
if (AppState().workList!.isEmpty) {
AppState().requestAllList!.removeAt(AppState().itgWorkListIndex!);
if (AppState().requestAllList!.isEmpty) {
Navigator.pop(context, "delegate_reload");
} else {
if (AppState().workList!.length <= AppState().workListIndex!) {
if (AppState().requestAllList!.length <= AppState().itgWorkListIndex!) {
Navigator.pop(context, "delegate_reload");
} else {
requestDetails = null;
@ -381,11 +388,11 @@ class _ItgDetailScreenState extends State<ItgDetailScreen> {
Utils.hideLoading(context);
Utils.showToast(LocaleKeys.yourChangeHasBeenSavedSuccessfully.tr());
// Navigator.pop(context, "delegate_reload");
AppState().workList!.removeAt(AppState().workListIndex!);
if (AppState().workList!.isEmpty) {
AppState().requestAllList!.removeAt(AppState().itgWorkListIndex!);
if (AppState().requestAllList!.isEmpty) {
Navigator.pop(context, "delegate_reload");
} else {
if (AppState().workList!.length <= AppState().workListIndex!) {
if (AppState().requestAllList!.length <= AppState().itgWorkListIndex!) {
Navigator.pop(context, "delegate_reload");
} else {
requestDetails = null;

@ -6,7 +6,7 @@ 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/models/itg_forms_models/wf_history_model.dart';
import 'package:mohem_flutter_app/ui/work_list/sheets/request_more_info_sheet.dart';
import 'package:mohem_flutter_app/ui/work_list/sheets/selected_itg_item_sheet.dart';
import 'package:mohem_flutter_app/widgets/bottom_sheet.dart';
import 'package:mohem_flutter_app/widgets/circular_avatar.dart';
@ -96,11 +96,25 @@ class ApprovalLevelfragment extends StatelessWidget {
Row(
children: [
LocaleKeys.request_info.tr().toText12(color: MyColors.grey67Color).center.paddingOnly(top: 6, bottom: 6).onPress(() {
showMyBottomSheet(context, child: RequestMoreInfoSheet());
showMyBottomSheet(
context,
child: SelectedItgItemSheet(
LocaleKeys.comments.tr(),
wfHistory: history,
apiMode: 'RequestInformation',
),
);
}).expanded,
Container(width: 1, height: 30, color: MyColors.lightGreyEFColor),
LocaleKeys.delegate.tr().toText12(color: MyColors.gradiantEndColor).center.paddingOnly(top: 6, bottom: 6).onPress(() {
// showMyBottomSheet(context, child: DelegateSheet());
showMyBottomSheet(
context,
child: SelectedItgItemSheet(
LocaleKeys.comments.tr(),
wfHistory: history,
apiMode: 'Delegate',
),
);
}).expanded,
],
),

@ -17,6 +17,7 @@ import 'package:mohem_flutter_app/models/worklist/get_favorite_replacements_mode
import 'package:mohem_flutter_app/models/worklist/replacement_list_model.dart';
import 'package:mohem_flutter_app/ui/work_list/sheets/search_options_sheet.dart';
import 'package:mohem_flutter_app/ui/work_list/sheets/selected_item_sheet.dart';
import 'package:mohem_flutter_app/ui/work_list/sheets/selected_itg_item_sheet.dart';
import 'package:mohem_flutter_app/widgets/bottom_sheet.dart';
import 'package:mohem_flutter_app/widgets/button/default_button.dart';
import 'package:mohem_flutter_app/widgets/circular_avatar.dart';
@ -28,7 +29,7 @@ class DelegateSheet extends StatefulWidget {
List<GetActionHistoryList>? actionHistoryList;
List<WFHistory>? wFHistory;
DelegateSheet({required this.title, required this.apiMode, this.notificationID, this.actionHistoryList,this.wFHistory});
DelegateSheet({required this.title, required this.apiMode, this.notificationID, this.actionHistoryList, this.wFHistory});
@override
State<DelegateSheet> createState() => _DelegateSheetState();
@ -45,6 +46,27 @@ class _DelegateSheetState extends State<DelegateSheet> {
List<GetFavoriteReplacements>? favUsersList;
List<ReplacementList>? replacementList;
@override
void initState() {
super.initState();
if (widget.wFHistory != null) {
widget.wFHistory = widget.wFHistory!.reversed.toList();
var ids = widget.wFHistory!.map((e) => e.employeeID).toSet();
widget.wFHistory!.retainWhere((x) => ids.remove(x.employeeID));
}
if (widget.actionHistoryList != null) {
widget.actionHistoryList = widget.actionHistoryList!.reversed.toList();
var ids = widget.actionHistoryList!.map((e) => e.uSERNAME).toSet();
widget.actionHistoryList!.retainWhere((x) => ids.remove(x.uSERNAME));
}
}
@override
void dispose() {
super.dispose();
}
Future fetchFavLetters({bool isNeedLoading = true}) async {
favLetters = [];
if (isNeedLoading) Utils.showLoading(context);
@ -276,23 +298,41 @@ class _DelegateSheetState extends State<DelegateSheet> {
itemCount: replacementList!.length,
padding: EdgeInsets.only(top: 8, bottom: 8),
)
: ListView.separated(
itemBuilder: (context, index) {
return showItem(widget.actionHistoryList![index]);
},
separatorBuilder: (context, index) {
return Container(
color: MyColors.borderE3Color,
width: double.infinity,
height: 1,
margin: EdgeInsets.only(top: 8, bottom: 8),
);
},
physics: NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemCount: widget.actionHistoryList!.length,
padding: EdgeInsets.only(top: 8, bottom: 8),
),
: (widget.wFHistory != null
? ListView.separated(
itemBuilder: (context, index) {
return showItgItem(widget.wFHistory![index]);
},
separatorBuilder: (context, index) {
return Container(
color: MyColors.borderE3Color,
width: double.infinity,
height: 1,
margin: EdgeInsets.only(top: 8, bottom: 8),
);
},
physics: NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemCount: widget.wFHistory!.length,
padding: EdgeInsets.only(top: 8, bottom: 8),
)
: ListView.separated(
itemBuilder: (context, index) {
return showItem(widget.actionHistoryList![index]);
},
separatorBuilder: (context, index) {
return Container(
color: MyColors.borderE3Color,
width: double.infinity,
height: 1,
margin: EdgeInsets.only(top: 8, bottom: 8),
);
},
physics: NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemCount: widget.actionHistoryList!.length,
padding: EdgeInsets.only(top: 8, bottom: 8),
)),
),
),
if (favLetters != null)
@ -393,6 +433,30 @@ class _DelegateSheetState extends State<DelegateSheet> {
);
}
Widget showItgItem(WFHistory wfHistory) {
return InkWell(
onTap: () {
showMyBottomSheet(context,
child: SelectedItgItemSheet(
"Comment",
apiMode: widget.apiMode,
wfHistory: wfHistory,
// notificationID: widget.notificationID,
));
},
child: Row(
children: [
CircularAvatar(
height: 30,
width: 30,
),
9.width,
(wfHistory.name ?? "").toText12().expanded,
],
),
);
}
Widget showFavUserItem(GetFavoriteReplacements actionHistory) {
return InkWell(
onTap: () {
@ -407,10 +471,10 @@ class _DelegateSheetState extends State<DelegateSheet> {
child: Row(
children: [
CircularAvatar(
url: actionHistory.employeeImage ?? "",
url: actionHistory.employeeImage,
height: 30,
width: 30,
isImageBase64: true,
isImageBase64: (actionHistory.employeeImage != null || actionHistory.employeeImage!.isNotEmpty) ? true : false,
),
16.width,
Expanded(
@ -452,10 +516,10 @@ class _DelegateSheetState extends State<DelegateSheet> {
child: Row(
children: [
CircularAvatar(
url: actionHistory.employeeImage ?? "",
url: actionHistory.employeeImage,
height: 30,
width: 30,
isImageBase64: true,
isImageBase64: actionHistory.employeeImage != null ? true : false,
),
16.width,
Expanded(

@ -142,10 +142,17 @@ class SelectedItemSheet extends StatelessWidget {
padding: EdgeInsets.only(top: 16, bottom: 16, left: 21, right: 21),
child: Row(
children: [
CircularAvatar(
height: 30,
width: 30,
),
actionHistoryList != null
? CircularAvatar(
height: 30,
width: 30,
url: actionHistoryList!.eMPLOYEEIMAGE,
isImageBase64: true,
)
: CircularAvatar(
height: 30,
width: 30,
),
16.width,
Expanded(
child: (name ?? "").toText12(),

@ -0,0 +1,170 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:mohem_flutter_app/api/worklist/worklist_api_client.dart';
import 'package:mohem_flutter_app/app_state/app_state.dart';
import 'package:mohem_flutter_app/classes/colors.dart';
import 'package:mohem_flutter_app/classes/utils.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/models/itg_forms_models/wf_history_model.dart';
import 'package:mohem_flutter_app/models/worklist/get_favorite_replacements_model.dart';
import 'package:mohem_flutter_app/models/worklist/replacement_list_model.dart';
import 'package:mohem_flutter_app/widgets/button/default_button.dart';
import 'package:mohem_flutter_app/widgets/circular_avatar.dart';
import 'package:mohem_flutter_app/widgets/input_widget.dart';
class SelectedItgItemSheet extends StatelessWidget {
String title, apiMode;
int? notificationID;
WFHistory wfHistory;
GetFavoriteReplacements? favoriteReplacements;
ReplacementList? replacementList;
SelectedItgItemSheet(this.title, {required this.apiMode, this.notificationID, required this.wfHistory, this.favoriteReplacements, this.replacementList});
TextEditingController username = TextEditingController();
String comment = "";
@override
Widget build(BuildContext context) {
return Container(
width: double.infinity,
height: MediaQuery.of(context).size.height - 80,
child: Column(
children: [
Expanded(
child: SingleChildScrollView(
child: Padding(
padding: EdgeInsets.all(21),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
title.toText24(isBold: true),
21.height,
if (wfHistory != null) showItem(wfHistory.name, false),
if (favoriteReplacements != null) showItem(favoriteReplacements!.employeeDisplayName, true),
if (replacementList != null) showItem(replacementList!.employeeDisplayName, replacementList!.isFavorite),
14.height,
InputWidget(
"Enter a note",
"This is simple note",
username,
isBackgroundEnable: true,
lines: 5,
onChange: (v) {
comment = v;
},
),
],
),
),
),
),
Container(
width: double.infinity,
height: 1,
color: MyColors.borderE3Color,
),
Row(
children: [
Expanded(
child: DefaultButton(
LocaleKeys.cancel.tr(),
() {
Navigator.pop(context);
},
textColor: Colors.black,
colors: [
Color(0xffE6E6E6),
Color(0xffE6E6E6),
],
),
),
16.width,
Expanded(
child: DefaultButton(
LocaleKeys.submit.tr(),
() {
if (comment.trim() != "") {
String? email = "", userId = "";
if (wfHistory != null) {
email = wfHistory.email;
userId = wfHistory.employeeID;
} else if (favoriteReplacements != null) {
email = favoriteReplacements!.emailAddress;
userId = favoriteReplacements!.userName;
} else {
email = replacementList!.emailAddress;
userId = replacementList!.userName;
}
performNetworkCall(context, email: email ?? "", userId: userId ?? "");
} else {
Utils.showToast("Please enter comments");
}
},
colors: const [
Color(0xff32D892),
Color(0xff1AB170),
],
),
),
],
).insideContainer
],
),
);
}
Future<void> performNetworkCall(BuildContext context, {String? email, String? userId}) async {
Utils.showLoading(context);
try {
var requestDetails = AppState().requestAllList![AppState().itgWorkListIndex!];
if (apiMode == "Delegate") {
await WorkListApiClient()
.delegateITGRequest(requestDetails.requestType!, requestDetails.iD!, requestDetails.itemID!, AppState().memberInformationList?.eMPLOYEENUMBER ?? "", wfHistory.employeeID!, comment);
} else if (apiMode == "RequestInformation") {
await WorkListApiClient()
.informationITGRequest(requestDetails.requestType!, requestDetails.iD!, requestDetails.itemID!, AppState().memberInformationList?.eMPLOYEENUMBER ?? "", wfHistory.employeeID!, comment);
}
Utils.hideLoading(context);
Navigator.pop(context);
Navigator.pop(context);
Navigator.pop(context, "delegate_reload");
} catch (ex) {
Utils.hideLoading(context);
Utils.handleException(ex, context, null);
}
}
Widget showItem(String? name, bool? isFav) {
return Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(15),
color: Color(0xffF7F7F7),
border: Border.all(
color: Color(0xffefefef),
width: 1,
),
),
padding: EdgeInsets.only(top: 16, bottom: 16, left: 21, right: 21),
child: Row(
children: [
CircularAvatar(
height: 30,
width: 30,
),
16.width,
Expanded(
child: (name ?? "").toText12(),
),
Icon(
Icons.star,
size: 12,
color: (isFav ?? false) ? MyColors.yellowColor : MyColors.borderColor,
),
],
),
);
}
}

@ -117,6 +117,45 @@ class _WorkListScreenState extends State<WorkListScreen> {
});
}
void verifyWorkListCounter() {
workListItemTypes.forEach((workListElement) {
if (workListElement.key == "ITG" && workListItemTypes[workListItemIndex].key == "ITG") {
workListElement.value = providerData.itgFormsModel?.totalCount ?? 0;
if ((AppState().requestAllList?.length ?? 0) != workListElement.value) {
workListElement.value = AppState().requestAllList?.length ?? 0;
providerData.workListCounter = providerData.workListCounter - (providerData.itgFormsModel?.totalCount ?? 0);
providerData.itgFormsModel?.totalCount = ((providerData.itgFormsModel!.totalCount ?? 0) - ((providerData.itgFormsModel?.totalCount ?? 0) - (AppState().requestAllList?.length ?? 0)));
providerData.workListCounter = providerData.workListCounter + (providerData.itgFormsModel?.totalCount ?? 0);
providerData.notify();
}
} else if (workListElement.key == "COC") {
workListElement.value = providerData.cocFinalCount;
} else {
providerData.getOpenNotificationsList?.forEach((element) {
if ((element.itemType == workListItemTypes[workListItemIndex].key) && element.itemType == workListElement.key) {
if ((AppState().workList?.length ?? 0) != (element.openNtfNumber ?? 0)) {
workListElement.value = AppState().workList?.length ?? 0;
providerData.workListCounter = providerData.workListCounter - ((element.openNtfNumber ?? 0) - (AppState().workList?.length ?? 0));
element.openNtfNumber = workListElement.value;
providerData.notify();
}
}
});
// var tempList = providerData.getOpenNotificationsList?.where((notificationElement) {
// return (notificationElement.itemType == workListItemTypes[workListItemIndex].key) && notificationElement.itemType == workListElement.key;
// }).toList();
// if (tempList!.isNotEmpty) {
// if ((AppState().workList?.length ?? 0) != (tempList.first.openNtfNumber ?? 0)) {
// workListElement.value = AppState().workList?.length ?? 0;
// providerData.workListCounter = providerData.workListCounter - ((tempList.first.openNtfNumber ?? 0) - (AppState().workList?.length ?? 0));
// providerData.notify();
// }
// }
}
});
}
ItgFormsModel? itgFormsModel;
int? itgRequestTypeIndex;
@ -331,6 +370,9 @@ class _WorkListScreenState extends State<WorkListScreen> {
// }
// calculateCounter();
// if (mounted) setState(() {});
} else {
verifyWorkListCounter();
if (mounted) setState(() {});
}
},
child: Container(
@ -390,7 +432,7 @@ class _WorkListScreenState extends State<WorkListScreen> {
child: WorkListAdvanceSearch((selectedViewID, selectedItemTypeID, searchByInput, searchByDate) async {
itgRequestTypeIndex = null;
pNotificationType = selectedViewID;
int index = -1;
int index = 0;
for (int i = 0; i < workListItemTypes.length; i++) {
if (workListItemTypes[i].key == selectedItemTypeID) {
index = i;
@ -424,7 +466,7 @@ class _WorkListScreenState extends State<WorkListScreen> {
var shouldReloadData = await Navigator.pushNamed(context, AppRoutes.workListDetail, arguments: workData);
if (shouldReloadData != null) {
if (shouldReloadData.toString() == "delegate_reload") {
calculateCounter();
verifyWorkListCounter();
getWorkList();
} else {
workList!.remove(data);
@ -443,6 +485,7 @@ class _WorkListScreenState extends State<WorkListScreen> {
if (mounted) setState(() {});
}
} else {
verifyWorkListCounter();
if (mounted) setState(() {});
}
},

@ -136,6 +136,8 @@ class _WorkListDetailScreenState extends State<WorkListDetailScreen> {
getPRNotification();
}
controller.jumpToPage(0);
// List dataToFetch = await Future.wait([
//
// WorkListApiClient().getActionHistory(workListData!.nOTIFICATIONID!),
@ -307,11 +309,12 @@ class _WorkListDetailScreenState extends State<WorkListDetailScreen> {
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.end,
children: [
myFab(LocaleKeys.pleaseEnterComments.tr(), "assets/images/skip.svg").onPress(() {
myFab(LocaleKeys.skip.tr(), "assets/images/skip.svg").onPress(() {
if (AppState().workList!.length - 1 > AppState().workListIndex!) {
AppState().setWorkListIndex = AppState().workListIndex! + 1;
workListData = null;
showFabOptions = false;
tabIndex = 0;
getDataFromState();
} else if (AppState().workList!.length - 1 == AppState().workListIndex!) {
Navigator.pop(context);
@ -354,25 +357,35 @@ class _WorkListDetailScreenState extends State<WorkListDetailScreen> {
if (notificationButtonsList[i].bUTTONACTION! == "REJECTED" || notificationButtonsList[i].bUTTONACTION! == "APPROVED" || notificationButtonsList[i].bUTTONACTION! == "CLOSE") {
continue;
}
fabs.add(myFab(notificationButtonsList[i].bUTTONLABEL!, notificationButtonsList[i].bUTTONICON ?? "", isIconAsset: false)
.paddingOnly(bottom: 12)
.onPress(() => handleFabAction(notificationButtonsList[i])));
fabs.add(myFab(
notificationButtonsList[i].bUTTONLABEL!,
notificationButtonsList[i].bUTTONACTION == "DELEGATE" ? "assets/images/delegate.svg" : notificationButtonsList[i].bUTTONICON ?? "",
isIconAsset: notificationButtonsList[i].bUTTONACTION == "DELEGATE" ? true : false,
).paddingOnly(bottom: 12).onPress(() => handleFabAction(notificationButtonsList[i])));
}
return fabs;
}
void handleFabAction(GetNotificationButtonsList notificationButton) {
print("notificationButton:${notificationButton.bUTTONACTION}");
switch (notificationButton.bUTTONACTION) {
case "DELEGATE":
showMyBottomSheet(context,
child: DelegateSheet(title: LocaleKeys.delegate.tr(), apiMode: notificationButton.bUTTONACTION!, notificationID: workListData!.nOTIFICATIONID, actionHistoryList: actionHistoryList));
break;
case "REQUEST_INFO":
// do something else
showMyBottomSheet(context,
child: DelegateSheet(title: LocaleKeys.request_info.tr(), apiMode: "REQUEST_INFO", notificationID: workListData!.nOTIFICATIONID, actionHistoryList: actionHistoryList));
break;
case "TRANSFER_INFO":
// do something else
showMyBottomSheet(context,
child: DelegateSheet(title: notificationButton.bUTTONLABEL!, apiMode: notificationButton.bUTTONACTION!, notificationID: workListData!.nOTIFICATIONID, actionHistoryList: actionHistoryList));
break;
case "ANSWER_INFO":
performAction(notificationButton.bUTTONACTION!,title: notificationButton.bUTTONLABEL);
break;
case "RFC":
// do something else
break;
@ -383,10 +396,10 @@ class _WorkListDetailScreenState extends State<WorkListDetailScreen> {
// do something else
case "APPROVE_AND_FORWARD":
showMyBottomSheet(context,
child: DelegateSheet(title: "Approve and Forward", apiMode: "APPROVE_AND_FORWARD", notificationID: workListData!.nOTIFICATIONID, actionHistoryList: actionHistoryList));
child: DelegateSheet(title: "Approve and Forward", apiMode: notificationButton.bUTTONACTION!, notificationID: workListData!.nOTIFICATIONID, actionHistoryList: actionHistoryList));
break;
case "FORWARD":
showMyBottomSheet(context, child: DelegateSheet(title: "Forward", apiMode: "FORWARD", notificationID: workListData!.nOTIFICATIONID, actionHistoryList: actionHistoryList));
showMyBottomSheet(context, child: DelegateSheet(title: "Forward", apiMode: notificationButton.bUTTONACTION!, notificationID: workListData!.nOTIFICATIONID, actionHistoryList: actionHistoryList));
break;
case "REJECT":
performNetworkCall(context, email: "", userId: "");
@ -479,13 +492,13 @@ class _WorkListDetailScreenState extends State<WorkListDetailScreen> {
);
}
void performAction(String actionMode) {
void performAction(String actionMode,{String? title}) {
TextEditingController textEditingController = TextEditingController();
print("actionMode:$actionMode");
showDialog(
context: context,
builder: (cxt) => AcceptRejectInputDialog(
message: LocaleKeys.requestedItems.tr(),
message: title !=null ? null:LocaleKeys.requestedItems.tr(),
title: title,
notificationGetRespond: notificationNoteInput,
onTap: (note) {
Map<String, dynamic> payload = {
@ -502,7 +515,7 @@ class _WorkListDetailScreenState extends State<WorkListDetailScreen> {
}
],
};
if (actionMode == "APPROVED" || actionMode == "APPROVE") {
if (actionMode == "APPROVED" || actionMode == "APPROVE" || actionMode == "CLOSE") {
performNotificationAction(payload);
} else if (note.isNotEmpty && (actionMode != "APPROVED" || actionMode != "APPROVE")) {
performNotificationAction(payload);
@ -778,7 +791,7 @@ class _WorkListDetailScreenState extends State<WorkListDetailScreen> {
// apiCallCount--;
// if (apiCallCount == 0) {
// Utils.hideLoading(context);
setState(() {});
setState(() {});
// }
} catch (ex) {
// apiCallCount--;

@ -99,7 +99,8 @@ class ActionsFragment extends StatelessWidget {
Row(
children: [
LocaleKeys.request_info.tr().toText12(color: MyColors.grey67Color).center.paddingOnly(top: 6, bottom: 6).onPress(() {
showMyBottomSheet(context, child: DelegateSheet(title: "Request Info", apiMode: "REQUEST_INFO", notificationID: notificationID, actionHistoryList: actionHistoryList));
showMyBottomSheet(context,
child: DelegateSheet(title: LocaleKeys.request_info.tr(), apiMode: "REQUEST_INFO", notificationID: notificationID, actionHistoryList: actionHistoryList));
}).expanded,
Container(width: 1, height: 30, color: MyColors.lightGreyEFColor),
LocaleKeys.delegate.tr().toText12(color: MyColors.gradiantEndColor).center.paddingOnly(top: 6, bottom: 6).onPress(() {
@ -123,6 +124,7 @@ class ActionsFragment extends StatelessWidget {
}
Color getStatusColor(String code) {
print("code:$code");
if (code == "SUBMIT") {
return const Color(0xff2E303A);
} else if (code == "REJECTED") {
@ -133,10 +135,10 @@ class ActionsFragment extends StatelessWidget {
return MyColors.orange;
} else if (code == "APPROVED" || code == "APPROVE") {
return const Color(0xff1FA269);
} else if (code != "SUBMIT" && code != "REJECT" && code != "PENDING") {
return MyColors.orange;
} else if (code == "REQUEST_INFO") {
return const Color(0xff2E303A);
} else if (code != "SUBMIT" && code != "REJECT" && code != "PENDING") {
return MyColors.orange;
} else {
return const Color(0xff2E303A);
}

@ -440,7 +440,7 @@ class InfoFragment extends StatelessWidget {
Widget getPRNotificationBodyListWidget(GetPrNotificationBodyList getPrNotificationBodyList) {
return Column(
children: [
getPrNotificationBodyList.pINFORMATION.toString().toText14(color: MyColors.textMixColor).objectContainerView(),
getPrNotificationBodyList.pINFORMATION != null ? getPrNotificationBodyList.pINFORMATION.toString().toText14(color: MyColors.textMixColor).objectContainerView() : Container(),
12.height,
Column(
children: [
@ -456,21 +456,23 @@ class InfoFragment extends StatelessWidget {
ItemDetailViewCol(LocaleKeys.id.tr(), workListData!.nOTIFICATIONID?.toString() ?? ""),
ItemDetailViewCol(LocaleKeys.responder.tr(), workListData!.rESPONDER ?? ""),
),
ItemDetailGrid(
ItemDetailViewCol(getPrNotificationBodyList.pRHeader![2].hDRATTRIBUTENAME!, getPrNotificationBodyList.pRHeader![2].hDRATTRIBUTEVALUE ?? ""),
ItemDetailViewCol(getPrNotificationBodyList.pRHeader![0].hDRATTRIBUTENAME!, getPrNotificationBodyList.pRHeader![0].hDRATTRIBUTEVALUE ?? ""),
),
ItemDetailGrid(
ItemDetailViewCol(getPrNotificationBodyList.pRHeader![1].hDRATTRIBUTENAME!, getPrNotificationBodyList.pRHeader![1].hDRATTRIBUTEVALUE ?? ""),
Container(),
isItLast: true,
),
Column(
children: getPRHeaderValues(),
)
],
).objectContainerView(),
],
);
}
List<Widget> getPRHeaderValues() {
List<Widget> pRHeaders = [];
getPrNotificationBodyList!.pRHeader!.forEach((element) {
pRHeaders.add(ItemDetailGrid(ItemDetailViewCol(element.hDRATTRIBUTENAME!, element.hDRATTRIBUTEVALUE!), Container()));
});
return pRHeaders;
}
Widget getContactNotificationBodyListWidget(GetContactNotificationBodyList data) {
bool isOdd = false;
try {

@ -115,37 +115,42 @@ class RequestFragment extends StatelessWidget {
}
Widget prLinesDataView() {
return Column(
children: [
prLinesList[0].dESCRIPTION.toString().toText14(color: MyColors.textMixColor).objectContainerView(),
12.height,
Column(
children: [
ItemDetailGrid(
ItemDetailViewCol("Cost Center", prLinesList[0].cOSTCENTER ?? ""),
ItemDetailViewCol("Code", prLinesList[0].iTEMCODE ?? ""),
),
ItemDetailGrid(
ItemDetailViewCol("Unit", prLinesList[0].uOM ?? ""),
ItemDetailViewCol("Price (SAR)", prLinesList[0].uNITPRICE.toString() ?? ""),
),
ItemDetailGrid(
ItemDetailViewCol("Amount (SAR)", prLinesList[0].lINEAMOUNT.toString() ?? ""),
ItemDetailViewCol("Quantity", prLinesList[0].qUANTITY.toString() ?? ""),
),
ItemDetailGrid(
ItemDetailViewCol("AMU (Last 3 months)", prLinesList[0].iTEMAMU.toString() ?? ""),
Container(),
isItLast: true,
),
// ItemDetailGrid(
// ItemDetailViewCol(getPrNotificationBodyList.pRHeader![1].hDRATTRIBUTENAME!, getPrNotificationBodyList.pRHeader![1].hDRATTRIBUTEVALUE ?? ""),
// Container(),
// isItLast: true,
// ),
],
).objectContainerView(),
],
return ExpandableNotifier(
child: ListView.separated(
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
itemBuilder: (cxt, index) => ExpandablePanel(
header: prLinesList[index].dESCRIPTION.toString().toText14(color: MyColors.textMixColor),
collapsed: Column(
children: [
ItemDetailGrid(
ItemDetailViewCol("Cost Center", prLinesList[index].cOSTCENTER ?? ""),
ItemDetailViewCol("Code", prLinesList[index].iTEMCODE ?? ""),
),
ItemDetailGrid(
ItemDetailViewCol("Unit", prLinesList[index].uOM ?? ""),
ItemDetailViewCol("Price (SAR)", prLinesList[index].uNITPRICE.toString() ?? ""),
),
ItemDetailGrid(
ItemDetailViewCol("Amount (SAR)", prLinesList[index].lINEAMOUNT.toString() ?? ""),
ItemDetailViewCol("Quantity", prLinesList[index].qUANTITY.toString() ?? ""),
),
ItemDetailGrid(
ItemDetailViewCol("AMU (Last 3 months)", prLinesList[index].iTEMAMU.toString() ?? ""),
Container(),
isItLast: true,
),
// ItemDetailGrid(
// ItemDetailViewCol(getPrNotificationBodyList.pRHeader![1].hDRATTRIBUTENAME!, getPrNotificationBodyList.pRHeader![1].hDRATTRIBUTEVALUE ?? ""),
// Container(),
// isItLast: true,
// ),
],
),
expanded: const SizedBox(),
).objectContainerView(),
separatorBuilder: (cxt, index) => 12.height,
itemCount: prLinesList.length),
);
}

@ -3,7 +3,12 @@ import 'package:flutter_svg/svg.dart';
import 'package:mohem_flutter_app/classes/colors.dart';
extension WithContainer on Widget {
Widget get insideContainer => Container(color: Colors.white, padding: const EdgeInsets.only(top: 16, bottom: 16, right: 21, left: 21), child: this);
Widget get insideContainer => Container(
color: Colors.white,
padding:
const EdgeInsets.only(top: 16, bottom: 16, right: 21, left: 21),
child: this,
);
}
class DefaultButton extends StatelessWidget {
@ -19,8 +24,20 @@ class DefaultButton extends StatelessWidget {
final int count;
final List<Color>? colors;
DefaultButton(this.text, this.onPress,
{this.color, this.isTextExpanded = true, this.svgIcon, this.disabledColor, this.count = 0, this.textColor = Colors.white, this.iconData, this.fontSize, this.colors});
const DefaultButton(
this.text,
this.onPress, {
Key? key,
this.color,
this.isTextExpanded = true,
this.svgIcon,
this.disabledColor,
this.count = 0,
this.textColor = Colors.white,
this.iconData,
this.fontSize,
this.colors,
}) : super(key: key);
@override
Widget build(BuildContext context) {
@ -31,29 +48,50 @@ class DefaultButton extends StatelessWidget {
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(6.0),
gradient: onPress == null
? const LinearGradient(colors: [Color(0xffEAEAEA), Color(0xffEAEAEA)])
: LinearGradient(
transform: GradientRotation(.83),
begin: Alignment.topRight,
end: Alignment.bottomLeft,
colors: colors ??
[
MyColors.gradiantEndColor,
MyColors.gradiantStartColor,
]),
? const LinearGradient(
colors: <Color>[
Color(0xffEAEAEA),
Color(0xffEAEAEA),
],
)
: color == MyColors.yellowColorII
? const LinearGradient(
colors: <Color>[
MyColors.yellowColorII,
MyColors.yellowColorII,
],
)
: LinearGradient(
transform: const GradientRotation(.83),
begin: Alignment.topRight,
end: Alignment.bottomLeft,
colors: colors ??
<Color>[
MyColors.gradiantEndColor,
MyColors.gradiantStartColor,
],
),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
children: <Widget>[
if (iconData != null) Icon(iconData, color: textColor),
if (svgIcon != null) SvgPicture.asset(svgIcon ?? "", color: textColor),
if (svgIcon != null)
SvgPicture.asset(svgIcon ?? "", color: textColor),
if (!isTextExpanded)
Padding(
padding: EdgeInsets.only(left: (iconData ?? svgIcon) != null ? 6 : 0),
padding: EdgeInsets.only(
left: (iconData ?? svgIcon) != null ? 6 : 0,
),
child: Text(
text,
textAlign: TextAlign.center,
style: TextStyle(fontSize: fontSize ?? 16, fontWeight: FontWeight.w600, color: textColor, letterSpacing: -0.48),
style: TextStyle(
fontSize: fontSize ?? 16,
fontWeight: FontWeight.w600,
color: textColor,
letterSpacing: -0.48,
),
),
),
if (isTextExpanded)
@ -61,7 +99,12 @@ class DefaultButton extends StatelessWidget {
child: Text(
text,
textAlign: TextAlign.center,
style: TextStyle(fontSize: fontSize ?? 16, fontWeight: FontWeight.w600, color: textColor, letterSpacing: -0.48),
style: TextStyle(
fontSize: fontSize ?? 16,
fontWeight: FontWeight.w600,
color: textColor,
letterSpacing: -0.48,
),
),
),
if (count > 0)
@ -72,11 +115,19 @@ class DefaultButton extends StatelessWidget {
padding: const EdgeInsets.only(left: 5, right: 5),
alignment: Alignment.center,
height: 16,
decoration: BoxDecoration(borderRadius: BorderRadius.circular(10.0), color: Colors.white),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10.0),
color: Colors.white,
),
child: Text(
"$count",
textAlign: TextAlign.center,
style: const TextStyle(fontSize: 12, fontWeight: FontWeight.w700, color: Color(0xffD02127), letterSpacing: -0.6),
style: const TextStyle(
fontSize: 12,
fontWeight: FontWeight.w700,
color: Color(0xffD02127),
letterSpacing: -0.6,
),
),
),
)

@ -1,11 +1,12 @@
import 'package:flutter/material.dart';
void showMDialog(context, {Widget? child}) async {
void showMDialog(context, {Widget? child,Color? backgroundColor,bool isDismissable=true}) async {
return showDialog(
context: context,
barrierDismissible: true,
barrierDismissible: isDismissable,
builder: (context) {
return Dialog(
backgroundColor: backgroundColor,
child: child,
);
},

@ -13,6 +13,8 @@ import 'package:mohem_flutter_app/extensions/widget_extensions.dart';
import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
import 'package:mohem_flutter_app/models/generic_response_model.dart';
import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart';
import 'package:mohem_flutter_app/ui/dialogs/success_dialog.dart';
import 'package:mohem_flutter_app/widgets/dialogs/dialogs.dart';
import 'package:mohem_flutter_app/widgets/location/Location.dart';
import 'package:mohem_flutter_app/widgets/nfc/nfc_reader_sheet.dart';
import 'package:mohem_flutter_app/widgets/qr_scanner_dialog.dart';
@ -22,8 +24,9 @@ import 'package:wifi_iot/wifi_iot.dart';
class MarkAttendanceWidget extends StatefulWidget {
DashboardProviderModel model;
double topPadding;
bool isFromDashboard;
MarkAttendanceWidget(this.model, {Key? key, this.topPadding = 0}) : super(key: key);
MarkAttendanceWidget(this.model, {Key? key, this.topPadding = 0, this.isFromDashboard = false}) : super(key: key);
@override
_MarkAttendanceWidgetState createState() {
@ -141,6 +144,12 @@ class _MarkAttendanceWidgetState extends State<MarkAttendanceWidget> {
GenericResponseModel? g = await DashboardApiClient().markAttendance(pointType: 2, nfcValue: nfcId ?? "", isGpsRequired: isNfcLocationEnabled, lat: lat, long: lng);
bool status = await model.fetchAttendanceTracking(context);
Utils.hideLoading(context);
showMDialog(
context,
backgroundColor: Colors.transparent,
isDismissable: false,
child: SuccessDialog(widget.isFromDashboard),
);
} catch (ex) {
print(ex);
Utils.hideLoading(context);
@ -175,6 +184,12 @@ class _MarkAttendanceWidgetState extends State<MarkAttendanceWidget> {
if (Platform.isAndroid) {
await closeWifiRequest();
}
showMDialog(
context,
backgroundColor: Colors.transparent,
isDismissable: false,
child: SuccessDialog(widget.isFromDashboard),
);
} catch (ex) {
print("performWifiAttendance: " + ex.toString());
await closeWifiRequest();
@ -208,6 +223,12 @@ class _MarkAttendanceWidgetState extends State<MarkAttendanceWidget> {
GenericResponseModel? g = await DashboardApiClient().markAttendance(pointType: 1, isGpsRequired: isQrLocationEnabled, lat: lat, long: lng, QRValue: qrCodeValue);
bool status = await model.fetchAttendanceTracking(context);
Utils.hideLoading(context);
showMDialog(
context,
backgroundColor: Colors.transparent,
isDismissable: false,
child: SuccessDialog(widget.isFromDashboard),
);
} catch (ex) {
print(ex);
Utils.hideLoading(context);

@ -7,7 +7,7 @@ description: A new Flutter application.
publish_to: 'none' # Remove this line if you wish to publish to pub.dev
# The following defines the version and build number for your application.
# A version number is three numbers separated by dots, like 1.2.43
# A version number is three numbers separated by dots, like 1.2.43v
# followed by an optional build number separated by a +.
# Both the version and the builder number may be overridden in flutter
# build by specifying --build-name and --build-number, respectively.
@ -53,7 +53,7 @@ dependencies:
shimmer: ^2.0.0
logger: ^1.1.0
flutter_countdown_timer: ^4.1.0
nfc_manager: ^3.1.1
nfc_manager: ^3.2.0
uuid: ^3.0.6
image_picker: ^0.8.5+3
file_picker: ^4.6.1
@ -77,6 +77,12 @@ dependencies:
flutter_rating_bar: ^4.0.1
auto_size_text: ^3.0.0
pull_to_refresh: ^2.0.0
# lottie json animations
lottie: any
# Steps Progress
steps_indicator: ^1.3.0
# Marathon Card Swipe
appinio_swiper: ^1.1.1
expandable: ^5.0.1
#Chat
@ -85,6 +91,8 @@ dependencies:
video_player: ^2.4.7
dev_dependencies:
flutter_test:
sdk: flutter
@ -115,6 +123,7 @@ flutter:
- assets/
- assets/langs/
- assets/icons/
- assets/lottie/
- assets/images/
- assets/images/login/
- assets/icons/chat/

Loading…
Cancel
Save