Browse Source

Merge pull request 'add: feature intro' (#2) from feature/intro into develop

Reviewed-on: https://git.nwhco.ir/amirreza.chegini/hade_hoda_flutter/pulls/2
pull/3/head
amirreza.chegini 2 weeks ago
parent
commit
1dfdfde77f
  1. BIN
      assets/images/background_intro.png
  2. BIN
      assets/images/hadi_hoda.png
  3. 73
      assets/images/music_off.svg
  4. 60
      assets/images/music_on.svg
  5. 77
      assets/images/start.svg
  6. 60
      assets/images/theme.svg
  7. 7
      lib/common_ui/resources/my_assets.dart
  8. 5
      lib/common_ui/theme/my_theme.dart
  9. 2
      lib/core/middleware/auth_middleware.dart
  10. 13
      lib/core/params/intro_params.dart
  11. 22
      lib/core/routers/my_routes.dart
  12. 42
      lib/core/utils/my_image.dart
  13. 28
      lib/features/intro/data/datasource/intro_datasource.dart
  14. 13
      lib/features/intro/data/model/intro_model.dart
  15. 29
      lib/features/intro/data/repository_impl/intro_repository_impl.dart
  16. 14
      lib/features/intro/domain/entity/intro_entity.dart
  17. 8
      lib/features/intro/domain/repository/intro_repository.dart
  18. 17
      lib/features/intro/domain/usecases/get_intro_usecase.dart
  19. 41
      lib/features/intro/presentation/bloc/intro_bloc.dart
  20. 5
      lib/features/intro/presentation/bloc/intro_event.dart
  21. 15
      lib/features/intro/presentation/bloc/intro_state.dart
  22. 65
      lib/features/intro/presentation/ui/intro_page.dart
  23. 9
      lib/init_bindings.dart
  24. 72
      pubspec.lock
  25. 4
      pubspec.yaml

BIN
assets/images/background_intro.png

After

Width: 1080  |  Height: 2348  |  Size: 494 KiB

BIN
assets/images/hadi_hoda.png

After

Width: 570  |  Height: 570  |  Size: 298 KiB

73
assets/images/music_off.svg

@ -0,0 +1,73 @@
<svg width="156" height="145" viewBox="0 0 156 145" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_366_148)">
<g filter="url(#filter0_d_366_148)">
<path d="M2.85628 116.487C8.26689 137.561 139.29 133.055 150.501 111.165C160.673 91.2498 155.782 25.6238 147.038 11.4169C135.178 -7.94039 18.8284 -2.24914e-05 9.21916 15.2369C0.259201 29.4437 -2.77074 94.6835 2.85628 116.487Z" fill="url(#paint0_radial_366_148)"/>
</g>
<path d="M3.28953 112.796C8.70014 133.098 138.901 124.128 150.068 103.01C160.24 83.7819 155.479 25.7529 146.779 12.2757C134.962 -6.39489 19.0452 1.03042 9.47923 15.7523C0.562557 29.4441 -2.33749 91.7223 3.28953 112.796Z" fill="url(#paint1_linear_366_148)"/>
<path d="M4.93393 110.994C10.2147 130.695 137.602 121.681 148.51 101.165C158.465 82.5375 153.79 26.6116 145.263 13.3061C133.706 -4.80655 20.3433 2.23248 11.0803 16.5251C2.20692 29.7877 -0.563237 90.5637 4.93393 110.994Z" fill="url(#paint2_linear_366_148)"/>
<path d="M142.407 105.328C143.332 100.592 145.741 96.2659 149.29 92.9663C150.804 92.9663 149.289 99.7478 148.51 101.293C147.731 102.838 142.753 106.486 142.407 105.328Z" fill="white"/>
<path style="mix-blend-mode:screen" d="M10.6482 16.61C10.6482 16.61 99.2089 -11.4603 145.61 13.6055C145.61 13.6055 150.458 17.4684 152.319 32.4478C152.319 32.4478 148.597 19.2711 120.851 21.1596C96.9581 22.7477 59.9496 62.4924 21.2962 49.702C1.81806 43.2639 10.6482 16.61 10.6482 16.61Z" fill="url(#paint3_linear_366_148)"/>
<path d="M10.6477 28.1556C10.6477 28.1556 6.31923 17.3826 14.5433 13.5197C22.7675 9.65679 49.5175 6.05142 50.816 6.99568C52.1146 7.93994 39.5186 12.5325 32.9826 14.8931C26.4466 17.2538 13.9374 29.9583 10.6477 28.1556Z" fill="white"/>
<g filter="url(#filter1_i_366_148)">
<path d="M97.3196 33.2554C98.5699 33.0342 99.861 33.2236 100.987 33.7925C101.48 34.042 101.93 34.3583 102.323 34.729L84.0198 56.3755L66.8352 59.3784V76.6997L55.4895 90.1187C54.3277 90.2156 53.1515 90.1565 51.9954 89.9351C49.5866 89.4737 47.3736 88.3356 45.637 86.6636C43.9004 84.9915 42.7177 82.8607 42.2385 80.5415C41.7595 78.2225 42.0058 75.8188 42.9456 73.6343C43.8854 71.4496 45.4768 69.5818 47.5188 68.2681C49.5607 66.9544 51.9615 66.2535 54.4172 66.2534C57.2683 66.2588 60.0309 67.209 62.2405 68.9438V46.7954C62.2061 44.7291 62.932 42.7176 64.2893 41.1167C65.68 39.553 67.5873 38.4972 69.6907 38.1274L97.3196 33.2554ZM103.994 75.0112C103.989 77.7196 103.029 80.3461 101.271 82.4604C99.5127 84.5749 97.0604 86.0522 94.3167 86.6499C91.5731 87.2475 88.7002 86.9302 86.1682 85.7505C83.6361 84.5707 81.5949 82.5982 80.3792 80.1558C79.4479 78.2848 79.0444 76.2231 79.1897 74.1743L88.2366 63.4751C89.3244 63.1825 90.4558 63.0306 91.6008 63.0327C94.4138 63.038 97.1413 63.9631 99.3372 65.6558V53.6997L96.011 54.2808L103.994 44.8384V75.0112Z" fill="#847AC4"/>
</g>
<g filter="url(#filter2_i_366_148)">
<rect x="105.921" y="25.835" width="7.80405" height="90.977" rx="3.90202" transform="rotate(40.2151 105.921 25.835)" fill="#847AC4"/>
</g>
</g>
<defs>
<filter id="filter0_d_366_148" x="-3.98853" y="-0.00927734" width="164.183" height="149.156" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="15"/>
<feGaussianBlur stdDeviation="2"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_366_148"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_366_148" result="shape"/>
</filter>
<filter id="filter1_i_366_148" x="42.0001" y="33.1653" width="61.9943" height="61.9513" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="4.95302"/>
<feGaussianBlur stdDeviation="2.47651"/>
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"/>
<feBlend mode="normal" in2="shape" result="effect1_innerShadow_366_148"/>
</filter>
<filter id="filter2_i_366_148" x="48.7777" y="27.4319" width="61.5056" height="76.2704" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="4.95302"/>
<feGaussianBlur stdDeviation="2.47651"/>
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"/>
<feBlend mode="normal" in2="shape" result="effect1_innerShadow_366_148"/>
</filter>
<radialGradient id="paint0_radial_366_148" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(97.3722 120.951) scale(59.9906 112.238)">
<stop stop-color="#D0CDEA"/>
<stop offset="1" stop-color="#7D75DA"/>
</radialGradient>
<linearGradient id="paint1_linear_366_148" x1="78.129" y1="124.213" x2="78.129" y2="1.15919" gradientUnits="userSpaceOnUse">
<stop stop-color="#CADCFF"/>
<stop offset="1" stop-color="white"/>
</linearGradient>
<linearGradient id="paint2_linear_366_148" x1="78.1285" y1="121.982" x2="78.1285" y2="2.44708" gradientUnits="userSpaceOnUse">
<stop stop-color="#FAFAFD"/>
<stop offset="1" stop-color="#C3BFEE"/>
</linearGradient>
<linearGradient id="paint3_linear_366_148" x1="8.65708" y1="27.7265" x2="152.319" y2="27.7265" gradientUnits="userSpaceOnUse">
<stop stop-color="#FF9840"/>
<stop offset="0.1" stop-color="#EF8E3C"/>
<stop offset="0.29" stop-color="#C57531"/>
<stop offset="0.55" stop-color="#814D20"/>
<stop offset="0.88" stop-color="#241609"/>
<stop offset="1"/>
</linearGradient>
<clipPath id="clip0_366_148">
<rect width="156" height="145" fill="white"/>
</clipPath>
</defs>
</svg>

60
assets/images/music_on.svg

@ -0,0 +1,60 @@
<svg width="156" height="145" viewBox="0 0 156 145" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_366_126)">
<g filter="url(#filter0_d_366_126)">
<path d="M2.85628 116.487C8.26689 137.561 139.29 133.055 150.501 111.165C160.673 91.2498 155.782 25.6238 147.038 11.4169C135.178 -7.94039 18.8284 -2.24914e-05 9.21916 15.2369C0.259201 29.4437 -2.77074 94.6835 2.85628 116.487Z" fill="url(#paint0_radial_366_126)"/>
</g>
<path d="M3.28953 112.796C8.70014 133.098 138.901 124.128 150.068 103.01C160.24 83.7819 155.479 25.7529 146.779 12.2757C134.962 -6.39489 19.0452 1.03042 9.47923 15.7523C0.562557 29.4441 -2.33749 91.7223 3.28953 112.796Z" fill="url(#paint1_linear_366_126)"/>
<path d="M4.93393 110.994C10.2147 130.695 137.602 121.681 148.51 101.165C158.465 82.5375 153.79 26.6116 145.263 13.3061C133.706 -4.80655 20.3433 2.23248 11.0803 16.5251C2.20692 29.7877 -0.563237 90.5637 4.93393 110.994Z" fill="url(#paint2_linear_366_126)"/>
<path d="M142.407 105.328C143.332 100.592 145.741 96.2659 149.29 92.9663C150.804 92.9663 149.289 99.7478 148.51 101.293C147.731 102.838 142.753 106.486 142.407 105.328Z" fill="white"/>
<path style="mix-blend-mode:screen" d="M10.6482 16.61C10.6482 16.61 99.2089 -11.4603 145.61 13.6055C145.61 13.6055 150.458 17.4684 152.319 32.4478C152.319 32.4478 148.597 19.2711 120.851 21.1596C96.9581 22.7477 59.9496 62.4924 21.2962 49.702C1.81806 43.2639 10.6482 16.61 10.6482 16.61Z" fill="url(#paint3_linear_366_126)"/>
<path d="M10.6477 28.1556C10.6477 28.1556 6.31923 17.3826 14.5433 13.5197C22.7675 9.65679 49.5175 6.05142 50.816 6.99568C52.1146 7.93994 39.5186 12.5325 32.9826 14.8931C26.4466 17.2538 13.9374 29.9583 10.6477 28.1556Z" fill="white"/>
<g filter="url(#filter1_i_366_126)">
<path d="M103.994 38.6196V74.8459C103.989 77.5545 103.028 80.181 101.27 82.2955C99.5122 84.4099 97.0606 85.8869 94.3168 86.4846C91.5731 87.0824 88.6998 86.7654 86.1676 85.5855C83.6354 84.4057 81.5943 82.433 80.3786 79.9905C79.1629 77.5479 78.8446 74.7803 79.4758 72.1408C80.107 69.5014 81.6503 67.1465 83.853 65.4618C86.0558 63.7771 88.7873 62.8625 91.6004 62.8677C94.4135 62.8729 97.1414 63.7976 99.3374 65.4905V53.5346L66.8348 59.2136V78.0441C66.8348 80.4088 66.1066 82.7203 64.7421 84.6865C63.3777 86.6526 61.4383 88.185 59.1694 89.0899C56.9004 89.9948 54.4036 90.2316 51.9949 89.7703C49.5862 89.3089 47.3736 88.1703 45.637 86.4982C43.9004 84.8261 42.7177 82.6958 42.2386 80.3766C41.7595 78.0574 42.0054 75.6535 42.9452 73.4688C43.8851 71.2842 45.4766 69.4169 47.5187 68.1032C49.5607 66.7895 51.9615 66.0883 54.4174 66.0883C57.2685 66.0936 60.0308 67.0435 62.2404 68.7783V46.6301C62.206 44.5636 62.9317 42.552 64.2893 40.951C65.68 39.3872 67.5873 38.3318 69.6908 37.9621L97.3196 33.0901C98.57 32.8689 99.8613 33.0579 100.987 33.6269C102.112 34.1958 103.007 35.1119 103.528 36.2285C103.873 36.9787 104.034 37.7977 103.994 38.6196Z" fill="#847AC4"/>
</g>
</g>
<defs>
<filter id="filter0_d_366_126" x="-3.98853" y="-0.00927734" width="164.183" height="149.156" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="15"/>
<feGaussianBlur stdDeviation="2"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_366_126"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_366_126" result="shape"/>
</filter>
<filter id="filter1_i_366_126" x="42" y="33" width="62" height="61.953" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="4.95302"/>
<feGaussianBlur stdDeviation="2.47651"/>
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"/>
<feBlend mode="normal" in2="shape" result="effect1_innerShadow_366_126"/>
</filter>
<radialGradient id="paint0_radial_366_126" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(97.3722 120.951) scale(59.9906 112.238)">
<stop stop-color="#D0CDEA"/>
<stop offset="1" stop-color="#7D75DA"/>
</radialGradient>
<linearGradient id="paint1_linear_366_126" x1="78.129" y1="124.213" x2="78.129" y2="1.15919" gradientUnits="userSpaceOnUse">
<stop stop-color="#CADCFF"/>
<stop offset="1" stop-color="white"/>
</linearGradient>
<linearGradient id="paint2_linear_366_126" x1="78.1285" y1="121.982" x2="78.1285" y2="2.44708" gradientUnits="userSpaceOnUse">
<stop stop-color="#FAFAFD"/>
<stop offset="1" stop-color="#C3BFEE"/>
</linearGradient>
<linearGradient id="paint3_linear_366_126" x1="8.65708" y1="27.7265" x2="152.319" y2="27.7265" gradientUnits="userSpaceOnUse">
<stop stop-color="#FF9840"/>
<stop offset="0.1" stop-color="#EF8E3C"/>
<stop offset="0.29" stop-color="#C57531"/>
<stop offset="0.55" stop-color="#814D20"/>
<stop offset="0.88" stop-color="#241609"/>
<stop offset="1"/>
</linearGradient>
<clipPath id="clip0_366_126">
<rect width="156" height="145" fill="white"/>
</clipPath>
</defs>
</svg>

77
assets/images/start.svg
File diff suppressed because it is too large
View File

60
assets/images/theme.svg

@ -0,0 +1,60 @@
<svg width="156" height="145" viewBox="0 0 156 145" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_366_115)">
<g filter="url(#filter0_d_366_115)">
<path d="M2.85548 116.445C8.26409 137.511 139.239 133.006 150.446 111.125C160.614 91.2167 155.724 25.6148 146.984 11.4132C135.128 -7.93698 18.8217 0.000462378 9.21601 15.2318C0.259354 29.4333 -2.76947 94.6491 2.85548 116.445Z" fill="url(#paint0_radial_366_115)"/>
</g>
<path d="M3.28859 112.756C8.6972 133.05 138.85 124.083 150.013 102.973C160.182 83.7517 155.422 25.7441 146.725 12.2719C134.912 -6.39185 19.0384 1.03072 9.47601 15.7472C0.562622 29.4339 -2.33636 91.6892 3.28859 112.756Z" fill="url(#paint1_linear_366_115)"/>
<path d="M4.93204 110.953C10.2108 130.647 137.551 121.637 148.455 101.128C158.407 82.5072 153.734 26.6019 145.21 13.3013C133.657 -4.8046 20.3357 2.23183 11.0761 16.5192C2.20603 29.7769 -0.563107 90.5305 4.93204 110.953Z" fill="url(#paint2_linear_366_115)"/>
<path d="M142.355 105.29C143.279 100.555 145.687 96.2312 149.235 92.9329C150.749 92.9329 149.235 99.7119 148.456 101.256C147.677 102.801 142.701 106.448 142.355 105.29Z" fill="white"/>
<path style="mix-blend-mode:screen" d="M10.6434 16.6044C10.6434 16.6044 99.1715 -11.4556 145.556 13.6009C145.556 13.6009 150.402 17.4624 152.262 32.4363C152.262 32.4363 148.541 19.2645 120.806 21.1523C96.9215 22.7398 59.9266 62.4698 21.2875 49.6841C1.81655 43.2484 10.6434 16.6044 10.6434 16.6044Z" fill="url(#paint3_linear_366_115)"/>
<path d="M10.6438 28.1461C10.6438 28.1461 6.31687 17.377 14.538 13.5155C22.759 9.65405 49.4992 6.05 50.7973 6.99391C52.0953 7.93782 39.504 12.5287 32.9704 14.8884C26.4368 17.2482 13.9322 29.9481 10.6438 28.1461Z" fill="white"/>
<g filter="url(#filter1_i_366_115)">
<path d="M78.2756 83.8349C74.5969 83.8349 71.1485 83.1342 67.9305 81.7328C64.7125 80.3314 61.9097 78.4377 59.522 76.0518C57.1344 73.6659 55.2399 70.8631 53.8384 67.6433C52.437 64.4236 51.7363 60.9744 51.7363 57.2957C51.7363 51.8652 53.2367 46.9383 56.2375 42.5151C59.2383 38.0919 63.2559 34.8512 68.2905 32.7928C68.9036 32.5739 69.5386 32.4968 70.1955 32.5616C70.8525 32.6264 71.3999 32.8349 71.8378 33.187C72.1882 33.4936 72.4623 33.921 72.6603 34.4693C72.8582 35.0176 72.9563 35.7288 72.9546 36.6029C73.0422 40.0627 73.7429 43.3586 75.0567 46.4908C76.3705 49.6229 78.2537 52.4144 80.7061 54.8651C83.1586 57.3158 85.9614 59.199 89.1146 60.5145C92.2678 61.8301 95.5742 62.5308 99.034 62.6166C99.9537 62.6166 100.654 62.6937 101.136 62.8479C101.618 63.002 102.012 63.2534 102.319 63.602C102.669 64.04 102.899 64.6093 103.01 65.31C103.12 66.0107 103.065 66.6457 102.844 67.215C100.83 72.2514 97.5888 76.2804 93.1218 79.3022C88.6548 82.324 83.706 83.8349 78.2756 83.8349ZM84.1221 45.2085L79.9178 41.0042C79.3923 40.4787 79.1295 39.8656 79.1295 39.1649C79.1295 38.4642 79.3923 37.8511 79.9178 37.3255L84.1221 33.1213C84.6476 32.5958 85.2607 32.333 85.9614 32.333C86.6621 32.333 87.2753 32.5958 87.8008 33.1213L92.005 37.3255C92.5305 37.8511 92.7933 38.4642 92.7933 39.1649C92.7933 39.8656 92.5305 40.4787 92.005 41.0042L87.8008 45.2085C87.2753 45.734 86.6621 45.9968 85.9614 45.9968C85.2607 45.9968 84.6476 45.734 84.1221 45.2085ZM97.2603 53.0914L95.6837 51.5148C95.1582 50.9893 94.8954 50.3762 94.8954 49.6755C94.8954 48.9748 95.1582 48.3617 95.6837 47.8361L97.2603 46.2595C97.7858 45.734 98.399 45.4712 99.0997 45.4712C99.8004 45.4712 100.413 45.734 100.939 46.2595L102.516 47.8361C103.041 48.3617 103.304 48.9748 103.304 49.6755C103.304 50.3762 103.041 50.9893 102.516 51.5148L100.939 53.0914C100.413 53.617 99.8004 53.8797 99.0997 53.8797C98.399 53.8797 97.7858 53.617 97.2603 53.0914Z" fill="#847AC4"/>
</g>
</g>
<defs>
<filter id="filter0_d_366_115" x="-3.98828" y="-0.00878906" width="164.126" height="149.108" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="15"/>
<feGaussianBlur stdDeviation="2"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_366_115"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_366_115" result="shape"/>
</filter>
<filter id="filter1_i_366_115" x="51.7363" y="32.333" width="51.5676" height="56.4531" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="4.95119"/>
<feGaussianBlur stdDeviation="2.4756"/>
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"/>
<feBlend mode="normal" in2="shape" result="effect1_innerShadow_366_115"/>
</filter>
<radialGradient id="paint0_radial_366_115" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(97.3365 120.907) scale(59.9685 112.197)">
<stop stop-color="#D0CDEA"/>
<stop offset="1" stop-color="#7D75DA"/>
</radialGradient>
<linearGradient id="paint1_linear_366_115" x1="78.1005" y1="124.168" x2="78.1005" y2="1.15943" gradientUnits="userSpaceOnUse">
<stop stop-color="#CADCFF"/>
<stop offset="1" stop-color="white"/>
</linearGradient>
<linearGradient id="paint2_linear_366_115" x1="78.0996" y1="121.937" x2="78.0996" y2="2.44636" gradientUnits="userSpaceOnUse">
<stop stop-color="#FAFAFD"/>
<stop offset="1" stop-color="#C3BFEE"/>
</linearGradient>
<linearGradient id="paint3_linear_366_115" x1="8.65305" y1="27.7167" x2="152.262" y2="27.7167" gradientUnits="userSpaceOnUse">
<stop stop-color="#FF9840"/>
<stop offset="0.1" stop-color="#EF8E3C"/>
<stop offset="0.29" stop-color="#C57531"/>
<stop offset="0.55" stop-color="#814D20"/>
<stop offset="0.88" stop-color="#241609"/>
<stop offset="1"/>
</linearGradient>
<clipPath id="clip0_366_115">
<rect width="156" height="145" fill="white"/>
</clipPath>
</defs>
</svg>

7
lib/common_ui/resources/my_assets.dart

@ -3,5 +3,10 @@ class MyAssets {
const MyAssets._internal();
factory MyAssets() => _i;
static const String sample = 'assets/image/sample.png';
static const String backgroundIntro = 'assets/images/background_intro.png';
static const String hadiHoda = 'assets/images/hadi_hoda.png';
static const String musicOff = 'assets/images/music_off.svg';
static const String musicOn = 'assets/images/music_on.svg';
static const String start = 'assets/images/start.svg';
static const String theme = 'assets/images/theme.svg';
}

5
lib/common_ui/theme/my_theme.dart

@ -2,7 +2,7 @@ import 'package:hadi_hoda_flutter/core/utils/context_provider.dart';
import 'package:flutter/material.dart';
import 'package:hadi_hoda_flutter/common_ui/resources/my_colors.dart';
enum ColorsName { primaryColor }
enum ColorsName { primaryColor, noColor }
class MyTheme {
static const MyTheme _i = MyTheme._internal();
@ -14,10 +14,12 @@ class MyTheme {
static final ThemeData dark = ThemeData(brightness: Brightness.dark);
static Map<ColorsName, Color> get lightColors => {
ColorsName.noColor: MyColors.transparent,
ColorsName.primaryColor: MyColors.white,
};
static Map<ColorsName, Color> get darkColors => {
ColorsName.noColor: MyColors.transparent,
ColorsName.primaryColor: MyColors.black,
};
}
@ -29,4 +31,5 @@ extension ThemeExtension on BuildContext {
: MyTheme.lightColors;
Color get primaryColor => customColors[ColorsName.primaryColor]!;
Color get noColor => customColors[ColorsName.noColor]!;
}

2
lib/core/middleware/auth_middleware.dart

@ -12,7 +12,7 @@ class AuthMiddleware {
static FutureOr<String?> redirect(BuildContext context, GoRouterState state) async {
if (AuthStorage.isLogin()) {
return Routes.samplePage;
return Routes.introPage;
} else {
return null;
}

13
lib/core/params/intro_params.dart

@ -0,0 +1,13 @@
class IntroParams {
int? id;
IntroParams({this.id});
IntroParams copyWith({
int? id,
}) {
return IntroParams(
id: id ?? this.id,
);
}
}

22
lib/core/routers/my_routes.dart

@ -1,28 +1,30 @@
import 'package:hadi_hoda_flutter/core/utils/context_provider.dart';
import 'package:hadi_hoda_flutter/features/sample/presentation/bloc/sample_bloc.dart';
import 'package:hadi_hoda_flutter/features/sample/presentation/ui/sample_page.dart';
import 'package:hadi_hoda_flutter/init_bindings.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:go_router/go_router.dart';
import 'package:hadi_hoda_flutter/core/utils/context_provider.dart';
import 'package:hadi_hoda_flutter/features/intro/presentation/bloc/intro_bloc.dart';
import 'package:hadi_hoda_flutter/features/intro/presentation/ui/intro_page.dart';
import 'package:hadi_hoda_flutter/init_bindings.dart';
class Routes {
static const Routes _i = Routes._internal();
const Routes._internal();
factory Routes() => _i;
static const String samplePage = '/sample_page';
static const String introPage = '/intro_page';
}
GoRouter get appPages => GoRouter(
initialLocation: Routes.samplePage,
initialLocation: Routes.introPage,
navigatorKey: ContextProvider.navigatorKey,
routes: [
GoRoute(
name: Routes.samplePage,
path: Routes.samplePage,
name: Routes.introPage,
path: Routes.introPage,
builder: (context, state) => BlocProvider(
create: (context) => SampleBloc(locator()),
child: const SamplePage(),
create: (context) => IntroBloc(locator()),
child: const IntroPage(),
),
),
],

42
lib/core/utils/my_image.dart

@ -0,0 +1,42 @@
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:hadi_hoda_flutter/common_ui/theme/my_theme.dart';
class MyImage extends StatelessWidget {
const MyImage({
super.key,
required this.image,
this.fit,
this.width,
this.height,
this.color,
});
final String image;
final BoxFit? fit;
final double? width;
final double? height;
final Color? color;
@override
Widget build(BuildContext context) {
if (image.endsWith('.png') || image.endsWith('.jpg')) {
return Image(
image: AssetImage(image),
fit: fit,
width: width,
height: height,
);
} else {
return SvgPicture.asset(
image,
fit: fit ?? BoxFit.contain,
width: width,
height: height,
colorFilter: color != null
? ColorFilter.mode(color ?? context.primaryColor, BlendMode.srcIn)
: null,
);
}
}
}

28
lib/features/intro/data/datasource/intro_datasource.dart

@ -0,0 +1,28 @@
import 'package:hadi_hoda_flutter/core/constants/my_api.dart';
import 'package:hadi_hoda_flutter/core/network/http_request.dart';
import 'package:hadi_hoda_flutter/core/params/intro_params.dart';
import 'package:hadi_hoda_flutter/core/response/base_response.dart';
import 'package:hadi_hoda_flutter/features/intro/data/model/intro_model.dart';
import 'package:hadi_hoda_flutter/features/intro/domain/entity/intro_entity.dart';
abstract class IIntroDatasource {
Future<IntroEntity> getData({required IntroParams params});
}
class IntroDatasourceImpl implements IIntroDatasource {
final IHttpRequest httpRequest;
const IntroDatasourceImpl(this.httpRequest);
@override
Future<IntroEntity> getData({required IntroParams params}) async {
final response = await httpRequest.get(
path: MyApi.baseUrl,
);
return BaseResponse.getData<IntroEntity>(
response?['data'],
(json) => IntroModel.fromJson(json),
);
}
}

13
lib/features/intro/data/model/intro_model.dart

@ -0,0 +1,13 @@
import 'package:hadi_hoda_flutter/features/intro/domain/entity/intro_entity.dart';
class IntroModel extends IntroEntity {
const IntroModel({
super.id,
});
factory IntroModel.fromJson(Map<String, dynamic> json) {
return IntroModel(
id: json['id'],
);
}
}

29
lib/features/intro/data/repository_impl/intro_repository_impl.dart

@ -0,0 +1,29 @@
import 'package:hadi_hoda_flutter/core/params/intro_params.dart';
import 'package:flutter/foundation.dart';
import 'package:hadi_hoda_flutter/core/error_handler/my_exception.dart';
import 'package:hadi_hoda_flutter/core/utils/data_state.dart';
import 'package:hadi_hoda_flutter/features/intro/data/datasource/intro_datasource.dart';
import 'package:hadi_hoda_flutter/features/intro/domain/entity/intro_entity.dart';
import 'package:hadi_hoda_flutter/features/intro/domain/repository/intro_repository.dart';
class IntroRepositoryImpl implements IIntroRepository {
final IIntroDatasource datasource;
const IntroRepositoryImpl(this.datasource);
@override
Future<DataState<IntroEntity, MyException>> getData({required IntroParams params}) async {
try {
final IntroEntity response = await datasource.getData(params: params);
return DataState.success(response);
} on MyException catch (e) {
return DataState.error(e);
} catch (e) {
if (kDebugMode) {
rethrow;
} else {
return DataState.error(MyException(errorMessage: '$e'));
}
}
}
}

14
lib/features/intro/domain/entity/intro_entity.dart

@ -0,0 +1,14 @@
import 'package:equatable/equatable.dart';
class IntroEntity extends Equatable {
final int? id;
const IntroEntity({
this.id,
});
@override
List<Object?> get props => [
id,
];
}

8
lib/features/intro/domain/repository/intro_repository.dart

@ -0,0 +1,8 @@
import 'package:hadi_hoda_flutter/core/error_handler/my_exception.dart';
import 'package:hadi_hoda_flutter/core/params/intro_params.dart';
import 'package:hadi_hoda_flutter/core/utils/data_state.dart';
import 'package:hadi_hoda_flutter/features/intro/domain/entity/intro_entity.dart';
abstract class IIntroRepository {
Future<DataState<IntroEntity, MyException>> getData({required IntroParams params});
}

17
lib/features/intro/domain/usecases/get_intro_usecase.dart

@ -0,0 +1,17 @@
import 'package:hadi_hoda_flutter/core/error_handler/my_exception.dart';
import 'package:hadi_hoda_flutter/core/params/intro_params.dart';
import 'package:hadi_hoda_flutter/core/usecase/usecase.dart';
import 'package:hadi_hoda_flutter/core/utils/data_state.dart';
import 'package:hadi_hoda_flutter/features/intro/domain/entity/intro_entity.dart';
import 'package:hadi_hoda_flutter/features/intro/domain/repository/intro_repository.dart';
class GetIntroUseCase implements UseCase<IntroEntity, IntroParams> {
final IIntroRepository repository;
const GetIntroUseCase(this.repository);
@override
Future<DataState<IntroEntity, MyException>> call(IntroParams params) {
return repository.getData(params: params);
}
}

41
lib/features/intro/presentation/bloc/intro_bloc.dart

@ -0,0 +1,41 @@
import 'dart:async';
import 'package:bloc/bloc.dart';
import 'package:hadi_hoda_flutter/core/status/base_status.dart';
import 'package:hadi_hoda_flutter/features/intro/domain/entity/intro_entity.dart';
import 'package:hadi_hoda_flutter/features/intro/domain/usecases/get_intro_usecase.dart';
import 'package:hadi_hoda_flutter/features/intro/presentation/bloc/intro_event.dart';
import 'package:hadi_hoda_flutter/features/intro/presentation/bloc/intro_state.dart';
class IntroBloc extends Bloc<IntroEvent, IntroState> {
/// ------------constructor------------
IntroBloc(
this._getIntroUseCase,
) : super(const IntroState()) {
on<GetIntroEvent>(_getIntroEvent);
}
/// ------------UseCases------------
final GetIntroUseCase _getIntroUseCase;
/// ------------Variables------------
/// ------------Controllers------------
/// ------------Functions------------
/// ------------Api Calls------------
FutureOr<void> _getIntroEvent(event, emit) async {
await _getIntroUseCase(event.introParams).then(
(value) {
value.fold(
(data) {
emit(state.copyWith(getIntroStatus: BaseComplete<IntroEntity>(data)));
},
(error) {
emit(state.copyWith(getIntroStatus: BaseError(error.errorMessage)));
},
);
},
);
}
}

5
lib/features/intro/presentation/bloc/intro_event.dart

@ -0,0 +1,5 @@
sealed class IntroEvent {
const IntroEvent();
}
class GetIntroEvent extends IntroEvent {}

15
lib/features/intro/presentation/bloc/intro_state.dart

@ -0,0 +1,15 @@
import 'package:hadi_hoda_flutter/core/status/base_status.dart';
class IntroState {
final BaseStatus getIntroStatus;
const IntroState({this.getIntroStatus = const BaseInit()});
IntroState copyWith({
BaseStatus? getIntroStatus,
}) {
return IntroState(
getIntroStatus: getIntroStatus ?? this.getIntroStatus,
);
}
}

65
lib/features/intro/presentation/ui/intro_page.dart

@ -0,0 +1,65 @@
import 'package:flutter/material.dart';
import 'package:hadi_hoda_flutter/common_ui/resources/my_assets.dart';
import 'package:hadi_hoda_flutter/common_ui/theme/my_theme.dart';
import 'package:hadi_hoda_flutter/core/utils/my_image.dart';
import 'package:hadi_hoda_flutter/core/utils/screen_size.dart';
class IntroPage extends StatelessWidget {
const IntroPage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(backgroundColor: context.noColor),
extendBodyBehindAppBar: true,
body: DecoratedBox(
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage(MyAssets.backgroundIntro),
fit: BoxFit.cover,
),
),
child: SizedBox(
width: context.widthScreen,
height: context.heightScreen,
child: Stack(
alignment: Alignment.center,
children: [
_name(),
_bottomBtns(),
],
),
),
),
);
}
Positioned _name() {
return Positioned(
top: 130,
child: MyImage(
image: MyAssets.hadiHoda,
width: 220,
height: 220,
fit: BoxFit.cover,
),
);
}
Positioned _bottomBtns() {
return Positioned(
bottom: 20,
left: 20,
right: 20,
child: Row(
crossAxisAlignment: CrossAxisAlignment.end,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
MyImage(image: MyAssets.musicOn, height: 60, width: 60),
MyImage(image: MyAssets.start, height: 80, width: 80),
MyImage(image: MyAssets.theme, height: 60, width: 60),
],
),
);
}
}

9
lib/init_bindings.dart

@ -1,5 +1,9 @@
import 'package:hadi_hoda_flutter/core/network/http_request.dart';
import 'package:hadi_hoda_flutter/core/network/http_request_impl.dart';
import 'package:hadi_hoda_flutter/features/intro/data/datasource/intro_datasource.dart';
import 'package:hadi_hoda_flutter/features/intro/data/repository_impl/intro_repository_impl.dart';
import 'package:hadi_hoda_flutter/features/intro/domain/repository/intro_repository.dart';
import 'package:hadi_hoda_flutter/features/intro/domain/usecases/get_intro_usecase.dart';
import 'package:hadi_hoda_flutter/features/sample/data/datasource/sample_datasource.dart';
import 'package:hadi_hoda_flutter/features/sample/data/repository_impl/sample_repository_impl.dart';
import 'package:hadi_hoda_flutter/features/sample/domain/repository/sample_repository.dart';
@ -16,4 +20,9 @@ void initBindings() {
locator.registerLazySingleton<ISampleDatasource>(() => SampleDatasourceImpl(locator()));
locator.registerLazySingleton<ISampleRepository>(() => SampleRepositoryImpl(locator()));
locator.registerLazySingleton<GetSampleUseCase>(() => GetSampleUseCase(locator()));
/// Intro Feature
locator.registerLazySingleton<IIntroDatasource>(() => IntroDatasourceImpl(locator()));
locator.registerLazySingleton<IIntroRepository>(() => IntroRepositoryImpl(locator()));
locator.registerLazySingleton<GetIntroUseCase>(() => GetIntroUseCase(locator()));
}

72
pubspec.lock

@ -1,6 +1,14 @@
# Generated by pub
# See https://dart.dev/tools/pub/glossary#lockfile
packages:
args:
dependency: transitive
description:
name: args
sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04
url: "https://pub.dev"
source: hosted
version: "2.7.0"
async:
dependency: transitive
description:
@ -123,6 +131,14 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
flutter_svg:
dependency: "direct main"
description:
name: flutter_svg
sha256: b9c2ad5872518a27507ab432d1fb97e8813b05f0fc693f9d40fad06d073e0678
url: "https://pub.dev"
source: hosted
version: "2.2.1"
flutter_test:
dependency: "direct dev"
description: flutter
@ -149,6 +165,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "16.2.4"
http:
dependency: transitive
description:
name: http
sha256: bb2ce4590bc2667c96f318d68cac1b5a7987ec819351d32b1c987239a815e007
url: "https://pub.dev"
source: hosted
version: "1.5.0"
http_parser:
dependency: transitive
description:
@ -253,6 +277,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.9.1"
path_parsing:
dependency: transitive
description:
name: path_parsing
sha256: "883402936929eac138ee0a45da5b0f2c80f89913e6dc3bf77eb65b84b409c6ca"
url: "https://pub.dev"
source: hosted
version: "1.1.0"
path_provider_linux:
dependency: transitive
description:
@ -277,6 +309,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.3.0"
petitparser:
dependency: transitive
description:
name: petitparser
sha256: "1a97266a94f7350d30ae522c0af07890c70b8e62c71e8e3920d1db4d23c057d1"
url: "https://pub.dev"
source: hosted
version: "7.0.1"
platform:
dependency: transitive
description:
@ -426,6 +466,30 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.4.0"
vector_graphics:
dependency: transitive
description:
name: vector_graphics
sha256: a4f059dc26fc8295b5921376600a194c4ec7d55e72f2fe4c7d2831e103d461e6
url: "https://pub.dev"
source: hosted
version: "1.1.19"
vector_graphics_codec:
dependency: transitive
description:
name: vector_graphics_codec
sha256: "99fd9fbd34d9f9a32efd7b6a6aae14125d8237b10403b422a6a6dfeac2806146"
url: "https://pub.dev"
source: hosted
version: "1.1.13"
vector_graphics_compiler:
dependency: transitive
description:
name: vector_graphics_compiler
sha256: d354a7ec6931e6047785f4db12a1f61ec3d43b207fc0790f863818543f8ff0dc
url: "https://pub.dev"
source: hosted
version: "1.1.19"
vector_math:
dependency: transitive
description:
@ -458,6 +522,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.1.0"
xml:
dependency: transitive
description:
name: xml
sha256: "971043b3a0d3da28727e40ed3e0b5d18b742fa5a68665cca88e74b7876d5e025"
url: "https://pub.dev"
source: hosted
version: "6.6.1"
sdks:
dart: ">=3.9.2 <4.0.0"
flutter: ">=3.29.0"

4
pubspec.yaml

@ -15,6 +15,7 @@ dependencies:
flutter_bloc: ^9.1.1
flutter_localizations:
sdk: flutter
flutter_svg: ^2.2.1
get_it: ^8.2.0
go_router: ^16.1.0
intl: ^0.20.2
@ -29,3 +30,6 @@ dev_dependencies:
flutter:
uses-material-design: true
generate: true
assets:
- assets/images/
Loading…
Cancel
Save