├── .gitignore ├── .metadata ├── LICENSE ├── README.md ├── analysis_options.yaml ├── android ├── .gitignore ├── app │ ├── build.gradle │ └── src │ │ ├── debug │ │ └── AndroidManifest.xml │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── kotlin │ │ │ └── com │ │ │ │ └── example │ │ │ │ └── basic_requirements_package │ │ │ │ └── MainActivity.kt │ │ └── res │ │ │ ├── drawable-hdpi │ │ │ ├── android12splash.png │ │ │ └── splash.png │ │ │ ├── drawable-mdpi │ │ │ ├── android12splash.png │ │ │ └── splash.png │ │ │ ├── drawable-night-hdpi │ │ │ ├── android12splash.png │ │ │ └── splash.png │ │ │ ├── drawable-night-mdpi │ │ │ ├── android12splash.png │ │ │ └── splash.png │ │ │ ├── drawable-night-v21 │ │ │ ├── background.png │ │ │ └── launch_background.xml │ │ │ ├── drawable-night-xhdpi │ │ │ ├── android12splash.png │ │ │ └── splash.png │ │ │ ├── drawable-night-xxhdpi │ │ │ ├── android12splash.png │ │ │ └── splash.png │ │ │ ├── drawable-night-xxxhdpi │ │ │ ├── android12splash.png │ │ │ └── splash.png │ │ │ ├── drawable-night │ │ │ ├── background.png │ │ │ └── launch_background.xml │ │ │ ├── drawable-v21 │ │ │ ├── background.png │ │ │ └── launch_background.xml │ │ │ ├── drawable-xhdpi │ │ │ ├── android12splash.png │ │ │ └── splash.png │ │ │ ├── drawable-xxhdpi │ │ │ ├── android12splash.png │ │ │ └── splash.png │ │ │ ├── drawable-xxxhdpi │ │ │ ├── android12splash.png │ │ │ └── splash.png │ │ │ ├── drawable │ │ │ ├── background.png │ │ │ └── launch_background.xml │ │ │ ├── mipmap-hdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-mdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xhdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xxhdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xxxhdpi │ │ │ └── ic_launcher.png │ │ │ ├── values-night-v31 │ │ │ └── styles.xml │ │ │ ├── values-night │ │ │ └── styles.xml │ │ │ ├── values-v31 │ │ │ └── styles.xml │ │ │ └── values │ │ │ └── styles.xml │ │ └── profile │ │ └── AndroidManifest.xml ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ └── gradle-wrapper.properties └── settings.gradle ├── assets ├── animation │ └── button_loading.json ├── icon │ └── icon.png ├── images │ ├── credit_card_background.PNG │ └── progress.png ├── intro │ ├── app.json │ ├── commerce.json │ └── work.json ├── readme-files │ ├── black-theme │ │ ├── bascket-black.png │ │ ├── home-student-black.png │ │ ├── intro-first-black.jpg │ │ ├── intro-second-black.jpg │ │ ├── intro-third-black.jpg │ │ ├── localization-black.png │ │ ├── login-black.jpg │ │ ├── my-courses-black.png │ │ ├── my-courses-detail-black.png │ │ ├── payment-back-black.png │ │ ├── payment-black.png │ │ ├── product-added-black.png │ │ ├── product-black.png │ │ ├── profile-black.png │ │ ├── register-black.jpg │ │ ├── role-black.jpg │ │ ├── search-black.png │ │ ├── search-result-black.png │ │ ├── splash-black.jpg │ │ ├── teacher-add-course-black.png │ │ ├── teacher-course-black.png │ │ ├── teacher-curriculum-black.png │ │ ├── teacher-profile-black.png │ │ ├── teacherhome-black.png │ │ ├── theme-black.png │ │ └── video-page-black.png │ └── light-theme │ │ ├── basket.png │ │ ├── home-student.png │ │ ├── intro-first.jpg │ │ ├── intro-second.jpg │ │ ├── intro-third.jpg │ │ ├── localization.png │ │ ├── login.jpg │ │ ├── my-course-detail.png │ │ ├── my-courses.png │ │ ├── payment-bck.png │ │ ├── payment.png │ │ ├── product-added.png │ │ ├── product.png │ │ ├── profile.png │ │ ├── register.jpg │ │ ├── role.jpg │ │ ├── search-result.png │ │ ├── search.png │ │ ├── splash-whtie.jpg │ │ ├── teacher-ad-course.png │ │ ├── teacher-course.png │ │ ├── teacher-curriculum.png │ │ ├── teacher-home.png │ │ ├── teacher-profile.png │ │ ├── theme.png │ │ └── video-page.png └── translations │ ├── en-US.json │ └── tr-TR.json ├── ios ├── .gitignore ├── Flutter │ ├── AppFrameworkInfo.plist │ ├── Debug.xcconfig │ └── Release.xcconfig ├── Runner.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ └── WorkspaceSettings.xcsettings │ └── xcshareddata │ │ └── xcschemes │ │ └── Runner.xcscheme ├── Runner.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ ├── IDEWorkspaceChecks.plist │ │ └── WorkspaceSettings.xcsettings └── Runner │ ├── AppDelegate.swift │ ├── Assets.xcassets │ ├── AppIcon.appiconset │ │ ├── Contents.json │ │ ├── Icon-App-1024x1024@1x.png │ │ ├── Icon-App-20x20@1x.png │ │ ├── Icon-App-20x20@2x.png │ │ ├── Icon-App-20x20@3x.png │ │ ├── Icon-App-29x29@1x.png │ │ ├── Icon-App-29x29@2x.png │ │ ├── Icon-App-29x29@3x.png │ │ ├── Icon-App-40x40@1x.png │ │ ├── Icon-App-40x40@2x.png │ │ ├── Icon-App-40x40@3x.png │ │ ├── Icon-App-50x50@1x.png │ │ ├── Icon-App-50x50@2x.png │ │ ├── Icon-App-57x57@1x.png │ │ ├── Icon-App-57x57@2x.png │ │ ├── Icon-App-60x60@2x.png │ │ ├── Icon-App-60x60@3x.png │ │ ├── Icon-App-72x72@1x.png │ │ ├── Icon-App-72x72@2x.png │ │ ├── Icon-App-76x76@1x.png │ │ ├── Icon-App-76x76@2x.png │ │ └── Icon-App-83.5x83.5@2x.png │ ├── LaunchBackground.imageset │ │ ├── Contents.json │ │ ├── background.png │ │ └── darkbackground.png │ └── LaunchImage.imageset │ │ ├── Contents.json │ │ ├── LaunchImage.png │ │ ├── LaunchImage@2x.png │ │ ├── LaunchImage@3x.png │ │ ├── LaunchImageDark.png │ │ ├── LaunchImageDark@2x.png │ │ ├── LaunchImageDark@3x.png │ │ └── README.md │ ├── Base.lproj │ ├── LaunchScreen.storyboard │ └── Main.storyboard │ ├── Info.plist │ └── Runner-Bridging-Header.h ├── lib ├── app.dart ├── core │ ├── components │ │ ├── alert-dialog │ │ │ ├── error_alert_dialog.dart │ │ │ └── succes_alert_dialog.dart │ │ ├── animation │ │ │ └── lottie_animation.dart │ │ ├── button-style │ │ │ └── elevated_button_style.dart │ │ ├── dots │ │ │ └── dots_decoration.dart │ │ ├── dropdown │ │ │ └── theme_change_dropdown.dart │ │ ├── icon │ │ │ └── icon_logo.dart │ │ ├── image │ │ │ └── listtile_image.dart │ │ ├── lisstile │ │ │ └── changer_listtile_with_dropdown.dart │ │ ├── padding │ │ │ └── padding_for_scroll.dart │ │ ├── text-button │ │ │ └── text_button_medium.dart │ │ ├── text-form-field │ │ │ ├── custom_text_field_register.dart │ │ │ └── custom_text_form_field.dart │ │ └── text │ │ │ ├── headline_small_text.dart │ │ │ ├── text_body_medium.dart │ │ │ ├── text_large_with_spacing.dart │ │ │ ├── text_title_large.dart │ │ │ ├── text_title_large_normal.dart │ │ │ ├── text_title_medium.dart │ │ │ ├── text_title_medium_slim.dart │ │ │ ├── text_with_theme_color.dart │ │ │ ├── title_medium_text.dart │ │ │ └── title_spacing_with_padding.dart │ ├── constants │ │ ├── icon │ │ │ └── icon_constants.dart │ │ ├── onboarding │ │ │ └── intro_constants.dart │ │ ├── routing │ │ │ └── routing_transition.dart │ │ ├── string │ │ │ └── string_constants.dart │ │ └── theme │ │ │ ├── dark_constants.dart │ │ │ └── light_constants.dart │ ├── extension │ │ ├── border │ │ │ └── border_extension.dart │ │ ├── context │ │ │ └── context_extension.dart │ │ ├── padding │ │ │ └── padding_extension.dart │ │ ├── text │ │ │ └── text_extension.dart │ │ └── validator │ │ │ ├── email_validator.dart │ │ │ └── password_validator.dart │ └── init │ │ ├── cache │ │ ├── login │ │ │ └── login_caching.dart │ │ ├── onboarding │ │ │ └── intro_caching.dart │ │ └── theme │ │ │ └── theme_caching.dart │ │ ├── cubit │ │ ├── radio_cubit.dart │ │ └── theme_cubit.dart │ │ ├── localization │ │ ├── localization.dart │ │ └── project_locales.dart │ │ ├── navigation │ │ ├── navigation_route.dart │ │ └── navigation_routers.dart │ │ └── theme │ │ ├── build-material-color │ │ └── build_color.dart │ │ ├── commons │ │ └── color_commons.dart │ │ ├── dark │ │ └── dark_theme_custom.dart │ │ └── light │ │ └── light_theme_custom.dart ├── cubit_observer.dart ├── main.dart ├── product │ ├── constants │ │ ├── api │ │ │ └── api_constants.dart │ │ └── routing │ │ │ └── routing_keys.dart │ ├── enum │ │ ├── animation │ │ │ └── animation_enum.dart │ │ ├── api │ │ │ └── api_service.dart │ │ ├── icon │ │ │ └── icon_enums.dart │ │ └── intro │ │ │ └── intro_enums.dart │ ├── init │ │ ├── lang │ │ │ └── locale_keys.g.dart │ │ └── service │ │ │ └── service_overrides.dart │ └── widget │ │ ├── appbar │ │ └── setting_appbar.dart │ │ ├── card │ │ └── course_card.dart │ │ ├── text-button │ │ ├── text_button_medium_navigate_back.dart │ │ ├── text_button_medium_navigate_normal.dart │ │ ├── text_button_medium_navigate_normal_param.dart │ │ └── text_button_medium_navigator.dart │ │ └── text │ │ ├── card_description_text.dart │ │ ├── card_title_text.dart │ │ └── text_price.dart └── view │ ├── _product │ ├── enum │ │ ├── get-course │ │ │ └── get_course_enum.dart │ │ ├── login │ │ │ └── login_enum.dart │ │ ├── register │ │ │ └── register_enum.dart │ │ ├── route │ │ │ └── route_enum.dart │ │ └── search │ │ │ └── search_enum.dart │ ├── screen-list │ │ ├── student │ │ │ └── studen_screen_list.dart │ │ └── teacher │ │ │ └── teacher_screen_list.dart │ └── widget │ │ ├── animation │ │ └── lottie_loading_button.dart │ │ ├── appbar │ │ └── home_app_bar.dart │ │ └── textfield │ │ ├── login │ │ ├── custom_text_field_email.dart │ │ └── custom_text_field_password.dart │ │ └── register │ │ ├── custom_text_field_email_register.dart │ │ └── custom_text_field_password_register.dart │ ├── auth │ ├── introduction │ │ ├── model │ │ │ └── page_model.dart │ │ ├── view-model │ │ │ └── intro_pages.dart │ │ └── view │ │ │ ├── introduction_screen.dart │ │ │ └── pages │ │ │ ├── first_page.dart │ │ │ ├── second_page.dart │ │ │ └── third_page.dart │ ├── login │ │ ├── model │ │ │ ├── login_model.dart │ │ │ └── login_response_model.dart │ │ ├── service │ │ │ └── login_service.dart │ │ ├── view-model │ │ │ ├── login │ │ │ │ ├── login_cubit.dart │ │ │ │ └── login_state.dart │ │ │ ├── validation │ │ │ │ └── validation_cubit.dart │ │ │ └── wait │ │ │ │ └── waited_button.dart │ │ └── view │ │ │ ├── login_page.dart │ │ │ └── login_view.dart │ ├── register │ │ ├── model │ │ │ ├── register_model.dart │ │ │ └── register_response_model.dart │ │ ├── service │ │ │ └── register_service.dart │ │ ├── view-model │ │ │ ├── register │ │ │ │ ├── register_cubit.dart │ │ │ │ └── register_state.dart │ │ │ ├── validation │ │ │ │ └── validation_register_cubit.dart │ │ │ └── wait │ │ │ │ └── waited_button.dart │ │ └── view │ │ │ ├── register_page.dart │ │ │ └── register_view.dart │ └── user-role │ │ └── view │ │ └── user_role_view.dart │ ├── settings │ └── view │ │ └── setting_view.dart │ ├── student │ ├── basket │ │ ├── model-view │ │ │ ├── get_basket_cubit.dart │ │ │ └── get_basket_state.dart │ │ ├── model │ │ │ └── basket_model.dart │ │ ├── service │ │ │ └── get_basket_repository.dart │ │ └── view │ │ │ └── basket_view.dart │ ├── home │ │ ├── model │ │ │ └── course_model.dart │ │ ├── service │ │ │ └── course_repository.dart │ │ ├── view-model │ │ │ ├── bottom-navbar │ │ │ │ └── bottom_nav_index_cubit.dart │ │ │ └── course-cubit │ │ │ │ ├── get_course_cubit.dart │ │ │ │ └── get_course_state.dart │ │ └── view │ │ │ ├── home_view.dart │ │ │ └── student_home_page.dart │ ├── my-course │ │ ├── comment │ │ │ └── view │ │ │ │ └── comment_page.dart │ │ ├── my-course-detail │ │ │ ├── service │ │ │ │ └── my_course_detail_repository.dart │ │ │ ├── view-model │ │ │ │ ├── my_course_detail_cubit.dart │ │ │ │ └── my_course_detail_state.dart │ │ │ └── view │ │ │ │ └── my-course-detail_screen.dart │ │ ├── my-courses │ │ │ ├── service │ │ │ │ └── my_course_repository.dart │ │ │ ├── view-model │ │ │ │ ├── my_course_cubit.dart │ │ │ │ └── my_course_state.dart │ │ │ └── view │ │ │ │ └── my_course_view.dart │ │ └── video │ │ │ └── view │ │ │ ├── app.dart │ │ │ ├── theme.dart │ │ │ └── video_page.dart │ ├── payment │ │ ├── model │ │ │ └── payment_card_model.dart │ │ └── view │ │ │ └── payment_view.dart │ ├── product │ │ ├── add-basket │ │ │ ├── model-view │ │ │ │ ├── basket_cubit.dart │ │ │ │ └── basket_state.dart │ │ │ ├── service │ │ │ │ └── basket_repository.dart │ │ │ └── view │ │ │ │ └── add_to_basket_button.dart │ │ └── product-detail │ │ │ ├── model │ │ │ └── product_model.dart │ │ │ ├── service │ │ │ └── product_repository.dart │ │ │ ├── view-model │ │ │ ├── product_cubit.dart │ │ │ └── product_state.dart │ │ │ └── view │ │ │ └── product_detail_page.dart │ ├── profile │ │ └── view │ │ │ └── profile_view.dart │ └── search │ │ ├── service │ │ └── search_repository.dart │ │ ├── view-model │ │ ├── search_cubit.dart │ │ └── search_state.dart │ │ └── view │ │ └── search_view.dart │ └── teacher │ ├── home │ ├── service │ │ └── teacher_repository.dart │ ├── view-model │ │ ├── bottom-navigation-bar │ │ │ └── bottom_nav_index_cubit_teacher.dart │ │ └── course │ │ │ ├── teacher_courses_cubit.dart │ │ │ └── teacher_courses_state.dart │ └── view │ │ ├── teacher_home_page.dart │ │ └── teacher_home_view.dart │ ├── product │ ├── add-course │ │ ├── model │ │ │ └── add_course_model.dart │ │ ├── service │ │ │ └── add_course_service.dart │ │ ├── view-model │ │ │ ├── add_course_cubit.dart │ │ │ └── add_course_state.dart │ │ └── view │ │ │ └── add_course_view.dart │ ├── change-image │ │ ├── picker │ │ │ └── pick_image.dart │ │ └── service │ │ │ └── change_image_service.dart │ ├── curriculum │ │ ├── model │ │ │ └── curriculum_model.dart │ │ ├── service │ │ │ └── curriculum_service.dart │ │ ├── view-model │ │ │ ├── add_curriculum_cubit.dart │ │ │ └── add_curriculum_state.dart │ │ └── view │ │ │ ├── add_cirruculum_view.dart │ │ │ └── add_curriculum_page.dart │ ├── product-detail │ │ ├── model │ │ │ └── teacher_product_model.dart │ │ ├── service │ │ │ └── teacher_course_detail_repository.dart │ │ ├── view-model │ │ │ ├── teacher_course_detail_cubit.dart │ │ │ └── teacher_course_detail_state.dart │ │ └── view │ │ │ └── teacher_course_detail_page.dart │ └── remove-product │ │ ├── service │ │ └── delete_course_service.dart │ │ └── view-model │ │ ├── delete_course_cubit.dart │ │ └── delete_course_state.dart │ └── profile │ └── teacher_profile.dart ├── linux ├── .gitignore ├── CMakeLists.txt ├── flutter │ ├── CMakeLists.txt │ ├── generated_plugin_registrant.cc │ ├── generated_plugin_registrant.h │ └── generated_plugins.cmake ├── main.cc ├── my_application.cc └── my_application.h ├── macos ├── .gitignore ├── Flutter │ ├── Flutter-Debug.xcconfig │ ├── Flutter-Release.xcconfig │ └── GeneratedPluginRegistrant.swift ├── Runner.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ └── xcshareddata │ │ │ └── IDEWorkspaceChecks.plist │ └── xcshareddata │ │ └── xcschemes │ │ └── Runner.xcscheme ├── Runner.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist └── Runner │ ├── AppDelegate.swift │ ├── Assets.xcassets │ └── AppIcon.appiconset │ │ ├── Contents.json │ │ ├── app_icon_1024.png │ │ ├── app_icon_128.png │ │ ├── app_icon_16.png │ │ ├── app_icon_256.png │ │ ├── app_icon_32.png │ │ ├── app_icon_512.png │ │ └── app_icon_64.png │ ├── Base.lproj │ └── MainMenu.xib │ ├── Configs │ ├── AppInfo.xcconfig │ ├── Debug.xcconfig │ ├── Release.xcconfig │ └── Warnings.xcconfig │ ├── DebugProfile.entitlements │ ├── Info.plist │ ├── MainFlutterWindow.swift │ └── Release.entitlements ├── pubspec.lock ├── pubspec.yaml ├── test └── widget_test.dart ├── web ├── favicon.png ├── icons │ ├── Icon-192.png │ ├── Icon-512.png │ ├── Icon-maskable-192.png │ └── Icon-maskable-512.png ├── index.html └── manifest.json └── windows ├── .gitignore ├── CMakeLists.txt ├── flutter ├── CMakeLists.txt ├── generated_plugin_registrant.cc ├── generated_plugin_registrant.h └── generated_plugins.cmake └── runner ├── CMakeLists.txt ├── Runner.rc ├── flutter_window.cpp ├── flutter_window.h ├── main.cpp ├── resource.h ├── resources └── app_icon.ico ├── runner.exe.manifest ├── utils.cpp ├── utils.h ├── win32_window.cpp └── win32_window.h /.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.log 4 | *.pyc 5 | *.swp 6 | .DS_Store 7 | .atom/ 8 | .buildlog/ 9 | .history 10 | .svn/ 11 | migrate_working_dir/ 12 | 13 | # IntelliJ related 14 | *.iml 15 | *.ipr 16 | *.iws 17 | .idea/ 18 | 19 | # The .vscode folder contains launch configuration and tasks you configure in 20 | # VS Code which you may wish to be included in version control, so this line 21 | # is commented out by default. 22 | #.vscode/ 23 | 24 | # Flutter/Dart/Pub related 25 | **/doc/api/ 26 | **/ios/Flutter/.last_build_id 27 | .dart_tool/ 28 | .flutter-plugins 29 | .flutter-plugins-dependencies 30 | .packages 31 | .pub-cache/ 32 | .pub/ 33 | /build/ 34 | 35 | # Symbolication related 36 | app.*.symbols 37 | 38 | # Obfuscation related 39 | app.*.map.json 40 | 41 | # Android Studio will place build artifacts here 42 | /android/app/debug 43 | /android/app/profile 44 | /android/app/release 45 | -------------------------------------------------------------------------------- /analysis_options.yaml: -------------------------------------------------------------------------------- 1 | # This file configures the analyzer, which statically analyzes Dart code to 2 | # check for errors, warnings, and lints. 3 | # 4 | # The issues identified by the analyzer are surfaced in the UI of Dart-enabled 5 | # IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be 6 | # invoked from the command line by running `flutter analyze`. 7 | 8 | # The following line activates a set of recommended lints for Flutter apps, 9 | # packages, and plugins designed to encourage good coding practices. 10 | include: package:flutter_lints/flutter.yaml 11 | 12 | linter: 13 | # The lint rules applied to this project can be customized in the 14 | # section below to disable rules from the `package:flutter_lints/flutter.yaml` 15 | # included above or to enable additional rules. A list of all available lints 16 | # and their documentation is published at 17 | # https://dart-lang.github.io/linter/lints/index.html. 18 | # 19 | # Instead of disabling a lint rule for the entire project in the 20 | # section below, it can also be suppressed for a single line of code 21 | # or a specific dart file by using the `// ignore: name_of_lint` and 22 | # `// ignore_for_file: name_of_lint` syntax on the line or in the file 23 | # producing the lint. 24 | rules: 25 | # avoid_print: false # Uncomment to disable the `avoid_print` rule 26 | # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule 27 | 28 | # Additional information about this file can be found at 29 | # https://dart.dev/guides/language/analysis-options 30 | -------------------------------------------------------------------------------- /android/.gitignore: -------------------------------------------------------------------------------- 1 | gradle-wrapper.jar 2 | /.gradle 3 | /captures/ 4 | /gradlew 5 | /gradlew.bat 6 | /local.properties 7 | GeneratedPluginRegistrant.java 8 | 9 | # Remember to never publicly share your keystore. 10 | # See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app 11 | key.properties 12 | **/*.keystore 13 | **/*.jks 14 | -------------------------------------------------------------------------------- /android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /android/app/src/main/kotlin/com/example/basic_requirements_package/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.example.education_app_like_udemy 2 | 3 | import io.flutter.embedding.android.FlutterActivity 4 | 5 | class MainActivity: FlutterActivity() { 6 | } 7 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-hdpi/android12splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/android/app/src/main/res/drawable-hdpi/android12splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-hdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/android/app/src/main/res/drawable-hdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-mdpi/android12splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/android/app/src/main/res/drawable-mdpi/android12splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-mdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/android/app/src/main/res/drawable-mdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-night-hdpi/android12splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/android/app/src/main/res/drawable-night-hdpi/android12splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-night-hdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/android/app/src/main/res/drawable-night-hdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-night-mdpi/android12splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/android/app/src/main/res/drawable-night-mdpi/android12splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-night-mdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/android/app/src/main/res/drawable-night-mdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-night-v21/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/android/app/src/main/res/drawable-night-v21/background.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-night-v21/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-night-xhdpi/android12splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/android/app/src/main/res/drawable-night-xhdpi/android12splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-night-xhdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/android/app/src/main/res/drawable-night-xhdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-night-xxhdpi/android12splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/android/app/src/main/res/drawable-night-xxhdpi/android12splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-night-xxhdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/android/app/src/main/res/drawable-night-xxhdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-night-xxxhdpi/android12splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/android/app/src/main/res/drawable-night-xxxhdpi/android12splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-night-xxxhdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/android/app/src/main/res/drawable-night-xxxhdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-night/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/android/app/src/main/res/drawable-night/background.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-night/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-v21/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/android/app/src/main/res/drawable-v21/background.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-v21/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xhdpi/android12splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/android/app/src/main/res/drawable-xhdpi/android12splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xhdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/android/app/src/main/res/drawable-xhdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxhdpi/android12splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/android/app/src/main/res/drawable-xxhdpi/android12splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxhdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/android/app/src/main/res/drawable-xxhdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxxhdpi/android12splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/android/app/src/main/res/drawable-xxxhdpi/android12splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxxhdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/android/app/src/main/res/drawable-xxxhdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/android/app/src/main/res/drawable/background.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/values-night-v31/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 13 | 19 | 22 | 23 | -------------------------------------------------------------------------------- /android/app/src/main/res/values-night/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 13 | 19 | 22 | 23 | -------------------------------------------------------------------------------- /android/app/src/main/res/values-v31/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 13 | 19 | 22 | 23 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 13 | 19 | 22 | 23 | -------------------------------------------------------------------------------- /android/app/src/profile/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | ext.kotlin_version = '1.7.10' 3 | repositories { 4 | google() 5 | mavenCentral() 6 | } 7 | 8 | dependencies { 9 | classpath 'com.android.tools.build:gradle:7.2.0' 10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 11 | } 12 | } 13 | 14 | allprojects { 15 | repositories { 16 | google() 17 | mavenCentral() 18 | } 19 | } 20 | 21 | rootProject.buildDir = '../build' 22 | subprojects { 23 | project.buildDir = "${rootProject.buildDir}/${project.name}" 24 | } 25 | subprojects { 26 | project.evaluationDependsOn(':app') 27 | } 28 | 29 | task clean(type: Delete) { 30 | delete rootProject.buildDir 31 | } 32 | -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx1536M 2 | android.useAndroidX=true 3 | android.enableJetifier=true 4 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | zipStoreBase=GRADLE_USER_HOME 4 | zipStorePath=wrapper/dists 5 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip 6 | -------------------------------------------------------------------------------- /android/settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | 3 | def localPropertiesFile = new File(rootProject.projectDir, "local.properties") 4 | def properties = new Properties() 5 | 6 | assert localPropertiesFile.exists() 7 | localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } 8 | 9 | def flutterSdkPath = properties.getProperty("flutter.sdk") 10 | assert flutterSdkPath != null, "flutter.sdk not set in local.properties" 11 | apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" 12 | -------------------------------------------------------------------------------- /assets/icon/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/icon/icon.png -------------------------------------------------------------------------------- /assets/images/credit_card_background.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/images/credit_card_background.PNG -------------------------------------------------------------------------------- /assets/images/progress.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/images/progress.png -------------------------------------------------------------------------------- /assets/readme-files/black-theme/bascket-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/readme-files/black-theme/bascket-black.png -------------------------------------------------------------------------------- /assets/readme-files/black-theme/home-student-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/readme-files/black-theme/home-student-black.png -------------------------------------------------------------------------------- /assets/readme-files/black-theme/intro-first-black.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/readme-files/black-theme/intro-first-black.jpg -------------------------------------------------------------------------------- /assets/readme-files/black-theme/intro-second-black.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/readme-files/black-theme/intro-second-black.jpg -------------------------------------------------------------------------------- /assets/readme-files/black-theme/intro-third-black.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/readme-files/black-theme/intro-third-black.jpg -------------------------------------------------------------------------------- /assets/readme-files/black-theme/localization-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/readme-files/black-theme/localization-black.png -------------------------------------------------------------------------------- /assets/readme-files/black-theme/login-black.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/readme-files/black-theme/login-black.jpg -------------------------------------------------------------------------------- /assets/readme-files/black-theme/my-courses-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/readme-files/black-theme/my-courses-black.png -------------------------------------------------------------------------------- /assets/readme-files/black-theme/my-courses-detail-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/readme-files/black-theme/my-courses-detail-black.png -------------------------------------------------------------------------------- /assets/readme-files/black-theme/payment-back-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/readme-files/black-theme/payment-back-black.png -------------------------------------------------------------------------------- /assets/readme-files/black-theme/payment-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/readme-files/black-theme/payment-black.png -------------------------------------------------------------------------------- /assets/readme-files/black-theme/product-added-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/readme-files/black-theme/product-added-black.png -------------------------------------------------------------------------------- /assets/readme-files/black-theme/product-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/readme-files/black-theme/product-black.png -------------------------------------------------------------------------------- /assets/readme-files/black-theme/profile-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/readme-files/black-theme/profile-black.png -------------------------------------------------------------------------------- /assets/readme-files/black-theme/register-black.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/readme-files/black-theme/register-black.jpg -------------------------------------------------------------------------------- /assets/readme-files/black-theme/role-black.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/readme-files/black-theme/role-black.jpg -------------------------------------------------------------------------------- /assets/readme-files/black-theme/search-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/readme-files/black-theme/search-black.png -------------------------------------------------------------------------------- /assets/readme-files/black-theme/search-result-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/readme-files/black-theme/search-result-black.png -------------------------------------------------------------------------------- /assets/readme-files/black-theme/splash-black.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/readme-files/black-theme/splash-black.jpg -------------------------------------------------------------------------------- /assets/readme-files/black-theme/teacher-add-course-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/readme-files/black-theme/teacher-add-course-black.png -------------------------------------------------------------------------------- /assets/readme-files/black-theme/teacher-course-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/readme-files/black-theme/teacher-course-black.png -------------------------------------------------------------------------------- /assets/readme-files/black-theme/teacher-curriculum-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/readme-files/black-theme/teacher-curriculum-black.png -------------------------------------------------------------------------------- /assets/readme-files/black-theme/teacher-profile-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/readme-files/black-theme/teacher-profile-black.png -------------------------------------------------------------------------------- /assets/readme-files/black-theme/teacherhome-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/readme-files/black-theme/teacherhome-black.png -------------------------------------------------------------------------------- /assets/readme-files/black-theme/theme-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/readme-files/black-theme/theme-black.png -------------------------------------------------------------------------------- /assets/readme-files/black-theme/video-page-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/readme-files/black-theme/video-page-black.png -------------------------------------------------------------------------------- /assets/readme-files/light-theme/basket.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/readme-files/light-theme/basket.png -------------------------------------------------------------------------------- /assets/readme-files/light-theme/home-student.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/readme-files/light-theme/home-student.png -------------------------------------------------------------------------------- /assets/readme-files/light-theme/intro-first.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/readme-files/light-theme/intro-first.jpg -------------------------------------------------------------------------------- /assets/readme-files/light-theme/intro-second.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/readme-files/light-theme/intro-second.jpg -------------------------------------------------------------------------------- /assets/readme-files/light-theme/intro-third.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/readme-files/light-theme/intro-third.jpg -------------------------------------------------------------------------------- /assets/readme-files/light-theme/localization.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/readme-files/light-theme/localization.png -------------------------------------------------------------------------------- /assets/readme-files/light-theme/login.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/readme-files/light-theme/login.jpg -------------------------------------------------------------------------------- /assets/readme-files/light-theme/my-course-detail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/readme-files/light-theme/my-course-detail.png -------------------------------------------------------------------------------- /assets/readme-files/light-theme/my-courses.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/readme-files/light-theme/my-courses.png -------------------------------------------------------------------------------- /assets/readme-files/light-theme/payment-bck.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/readme-files/light-theme/payment-bck.png -------------------------------------------------------------------------------- /assets/readme-files/light-theme/payment.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/readme-files/light-theme/payment.png -------------------------------------------------------------------------------- /assets/readme-files/light-theme/product-added.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/readme-files/light-theme/product-added.png -------------------------------------------------------------------------------- /assets/readme-files/light-theme/product.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/readme-files/light-theme/product.png -------------------------------------------------------------------------------- /assets/readme-files/light-theme/profile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/readme-files/light-theme/profile.png -------------------------------------------------------------------------------- /assets/readme-files/light-theme/register.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/readme-files/light-theme/register.jpg -------------------------------------------------------------------------------- /assets/readme-files/light-theme/role.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/readme-files/light-theme/role.jpg -------------------------------------------------------------------------------- /assets/readme-files/light-theme/search-result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/readme-files/light-theme/search-result.png -------------------------------------------------------------------------------- /assets/readme-files/light-theme/search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/readme-files/light-theme/search.png -------------------------------------------------------------------------------- /assets/readme-files/light-theme/splash-whtie.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/readme-files/light-theme/splash-whtie.jpg -------------------------------------------------------------------------------- /assets/readme-files/light-theme/teacher-ad-course.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/readme-files/light-theme/teacher-ad-course.png -------------------------------------------------------------------------------- /assets/readme-files/light-theme/teacher-course.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/readme-files/light-theme/teacher-course.png -------------------------------------------------------------------------------- /assets/readme-files/light-theme/teacher-curriculum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/readme-files/light-theme/teacher-curriculum.png -------------------------------------------------------------------------------- /assets/readme-files/light-theme/teacher-home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/readme-files/light-theme/teacher-home.png -------------------------------------------------------------------------------- /assets/readme-files/light-theme/teacher-profile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/readme-files/light-theme/teacher-profile.png -------------------------------------------------------------------------------- /assets/readme-files/light-theme/theme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/readme-files/light-theme/theme.png -------------------------------------------------------------------------------- /assets/readme-files/light-theme/video-page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/assets/readme-files/light-theme/video-page.png -------------------------------------------------------------------------------- /assets/translations/en-US.json: -------------------------------------------------------------------------------- 1 | { 2 | "intro" : { 3 | "introTitleFirst": "Online Learning Platform", 4 | "introDescriptionFirst": "Choose from 100.000 online video courses with new additions published.", 5 | "introTitleSecond": "Learn Online", 6 | "introDescriptionSecon": "Via video call with the all subjects teacher in all around the world!", 7 | "introTitleThird": "Ready to find a course?", 8 | "introDescriptionThird": "Discover the online learning." 9 | }, 10 | "button": { 11 | "skip": "Skip", 12 | "done": "Done", 13 | "cancel": "Cancel", 14 | "ok": "Ok" 15 | }, 16 | "theme": { 17 | "theme": "Theme", 18 | "default": "System Default", 19 | "light": "Light", 20 | "dark": "Dark", 21 | "themeChoose": "Choose Theme" 22 | }, 23 | "localization": { 24 | "appLang": "App Language", 25 | "langChoose": "Choose Language" 26 | }, 27 | "settingTitle": "Settings" 28 | } 29 | -------------------------------------------------------------------------------- /assets/translations/tr-TR.json: -------------------------------------------------------------------------------- 1 | { 2 | "intro" : { 3 | "introTitleFirst": "Online Eğitim Platformu", 4 | "introDescriptionFirst": "Yayınlanan yeni eklemelerle 100.000 çevrimiçi video kursu arasından seçim yap.", 5 | "introTitleSecond": "Dünyanın Her Yerinden", 6 | "introDescriptionSecon": "Dünyanın her yerindeki, tüm derslerdeki öğretmenlerle görüntülü görüşme yoluyla ders al!", 7 | "introTitleThird": "Kursları Görmeye Hazır Mısın?", 8 | "introDescriptionThird": "Çevrimiçi öğrenmeyi keşfet." 9 | }, 10 | "button": { 11 | "skip": "Geç", 12 | "done": "Başla", 13 | "cancel": "Vazgeç", 14 | "ok": "Tamam" 15 | }, 16 | "theme": { 17 | "theme": "Tema", 18 | "default": "Sistem Teması", 19 | "light": "Aydınlık", 20 | "dark": "Karanlık", 21 | "themeChoose": "Tema Seç" 22 | }, 23 | "localization": { 24 | "appLang": "Uygulama Dili", 25 | "langChoose": "Dili Seç" 26 | }, 27 | "settingTitle": "Ayarlar" 28 | 29 | } 30 | -------------------------------------------------------------------------------- /ios/.gitignore: -------------------------------------------------------------------------------- 1 | **/dgph 2 | *.mode1v3 3 | *.mode2v3 4 | *.moved-aside 5 | *.pbxuser 6 | *.perspectivev3 7 | **/*sync/ 8 | .sconsign.dblite 9 | .tags* 10 | **/.vagrant/ 11 | **/DerivedData/ 12 | Icon? 13 | **/Pods/ 14 | **/.symlinks/ 15 | profile 16 | xcuserdata 17 | **/.generated/ 18 | Flutter/App.framework 19 | Flutter/Flutter.framework 20 | Flutter/Flutter.podspec 21 | Flutter/Generated.xcconfig 22 | Flutter/ephemeral/ 23 | Flutter/app.flx 24 | Flutter/app.zip 25 | Flutter/flutter_assets/ 26 | Flutter/flutter_export_environment.sh 27 | ServiceDefinitions.json 28 | Runner/GeneratedPluginRegistrant.* 29 | 30 | # Exceptions to above rules. 31 | !default.mode1v3 32 | !default.mode2v3 33 | !default.pbxuser 34 | !default.perspectivev3 35 | -------------------------------------------------------------------------------- /ios/Flutter/AppFrameworkInfo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | App 9 | CFBundleIdentifier 10 | io.flutter.flutter.app 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | App 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1.0 23 | MinimumOSVersion 24 | 11.0 25 | 26 | 27 | -------------------------------------------------------------------------------- /ios/Flutter/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Generated.xcconfig" 2 | -------------------------------------------------------------------------------- /ios/Flutter/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Generated.xcconfig" 2 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import Flutter 3 | 4 | @UIApplicationMain 5 | @objc class AppDelegate: FlutterAppDelegate { 6 | override func application( 7 | _ application: UIApplication, 8 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? 9 | ) -> Bool { 10 | GeneratedPluginRegistrant.register(with: self) 11 | return super.application(application, didFinishLaunchingWithOptions: launchOptions) 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "background.png", 5 | "idiom" : "universal" 6 | }, 7 | { 8 | "appearances" : [ 9 | { 10 | "appearance" : "luminosity", 11 | "value" : "dark" 12 | } 13 | ], 14 | "filename" : "darkbackground.png", 15 | "idiom" : "universal" 16 | } 17 | ], 18 | "info" : { 19 | "author" : "xcode", 20 | "version" : 1 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchBackground.imageset/darkbackground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/ios/Runner/Assets.xcassets/LaunchBackground.imageset/darkbackground.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "LaunchImage.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "appearances" : [ 10 | { 11 | "appearance" : "luminosity", 12 | "value" : "dark" 13 | } 14 | ], 15 | "filename" : "LaunchImageDark.png", 16 | "idiom" : "universal", 17 | "scale" : "1x" 18 | }, 19 | { 20 | "filename" : "LaunchImage@2x.png", 21 | "idiom" : "universal", 22 | "scale" : "2x" 23 | }, 24 | { 25 | "appearances" : [ 26 | { 27 | "appearance" : "luminosity", 28 | "value" : "dark" 29 | } 30 | ], 31 | "filename" : "LaunchImageDark@2x.png", 32 | "idiom" : "universal", 33 | "scale" : "2x" 34 | }, 35 | { 36 | "filename" : "LaunchImage@3x.png", 37 | "idiom" : "universal", 38 | "scale" : "3x" 39 | }, 40 | { 41 | "appearances" : [ 42 | { 43 | "appearance" : "luminosity", 44 | "value" : "dark" 45 | } 46 | ], 47 | "filename" : "LaunchImageDark@3x.png", 48 | "idiom" : "universal", 49 | "scale" : "3x" 50 | } 51 | ], 52 | "info" : { 53 | "author" : "xcode", 54 | "version" : 1 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImageDark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImageDark.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImageDark@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImageDark@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImageDark@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImageDark@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md: -------------------------------------------------------------------------------- 1 | # Launch Screen Assets 2 | 3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory. 4 | 5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. -------------------------------------------------------------------------------- /ios/Runner/Runner-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | #import "GeneratedPluginRegistrant.h" 2 | -------------------------------------------------------------------------------- /lib/app.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/core/init/cubit/theme_cubit.dart'; 2 | import 'package:education_app_like_udemy/core/init/navigation/navigation_route.dart'; 3 | import 'package:education_app_like_udemy/core/init/theme/dark/dark_theme_custom.dart'; 4 | import 'package:education_app_like_udemy/core/init/theme/light/light_theme_custom.dart'; 5 | import 'package:easy_localization/easy_localization.dart'; 6 | import 'package:flutter/material.dart'; 7 | import 'package:flutter_bloc/flutter_bloc.dart'; 8 | 9 | class MyApp extends StatelessWidget { 10 | const MyApp({super.key}); 11 | 12 | @override 13 | Widget build(BuildContext context) { 14 | return BlocBuilder( 15 | builder: (context, themeState) { 16 | return MaterialApp.router( 17 | localizationsDelegates: context.localizationDelegates, 18 | supportedLocales: context.supportedLocales, 19 | locale: context.locale, 20 | theme: LightThemeCustom().theme, 21 | darkTheme: DarkThemeCustom().theme, 22 | themeMode: themeState, 23 | routerConfig: NavigationRoute.router, 24 | debugShowCheckedModeBanner: false, 25 | ); 26 | }, 27 | ); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /lib/core/components/alert-dialog/error_alert_dialog.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/core/components/text-button/text_button_medium.dart'; 2 | import 'package:education_app_like_udemy/core/constants/string/string_constants.dart'; 3 | import 'package:flutter/material.dart'; 4 | 5 | class ErrorAlertDialog extends StatelessWidget { 6 | const ErrorAlertDialog({super.key, required this.errorMessage, required this.errorTitle, required this.callback}); 7 | 8 | final String errorTitle; 9 | final String errorMessage; 10 | final void Function() callback; 11 | 12 | @override 13 | Widget build(BuildContext context) { 14 | return AlertDialog( 15 | titlePadding: const EdgeInsets.only(top: 20, bottom: 10), 16 | contentPadding: const EdgeInsets.only(bottom: 10), 17 | title: Text(errorTitle, textAlign: TextAlign.center), 18 | content: Column( 19 | mainAxisSize: MainAxisSize.min, 20 | children: [ 21 | Text(errorMessage), 22 | TextButtonMedium( 23 | function: () { 24 | callback(); 25 | }, 26 | text: StringConstants.tryAgain, 27 | color: Theme.of(context).primaryColor, 28 | ) 29 | ], 30 | ), 31 | ); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /lib/core/components/alert-dialog/succes_alert_dialog.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/core/components/text-button/text_button_medium.dart'; 2 | import 'package:education_app_like_udemy/core/constants/icon/icon_constants.dart'; 3 | import 'package:education_app_like_udemy/core/constants/string/string_constants.dart'; 4 | import 'package:education_app_like_udemy/core/extension/context/context_extension.dart'; 5 | import 'package:flutter/material.dart'; 6 | 7 | class SuccessAlertDialog extends StatelessWidget { 8 | const SuccessAlertDialog( 9 | {super.key, required this.callback, required this.successTitle, required this.successMessage}); 10 | 11 | final String successTitle; 12 | final String successMessage; 13 | final void Function() callback; 14 | 15 | @override 16 | Widget build(BuildContext context) { 17 | return AlertDialog( 18 | titlePadding: const EdgeInsets.only(top: 20, bottom: 10), 19 | contentPadding: const EdgeInsets.only(bottom: 10), 20 | title: Column( 21 | children: [ 22 | IconConstants.done, 23 | context.normalSpace, 24 | Text(successTitle, textAlign: TextAlign.center), 25 | ], 26 | ), 27 | content: Column( 28 | mainAxisSize: MainAxisSize.min, 29 | children: [ 30 | Text(successMessage), 31 | TextButtonMedium( 32 | function: () { 33 | callback(); 34 | }, 35 | text: StringConstants.login, 36 | color: Theme.of(context).primaryColor, 37 | ) 38 | ], 39 | ), 40 | ); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /lib/core/components/animation/lottie_animation.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:lottie/lottie.dart'; 3 | 4 | class LottieAnimation extends StatelessWidget { 5 | const LottieAnimation({super.key, required this.height, required this.path}); 6 | 7 | final double height; 8 | final String path; 9 | 10 | @override 11 | Widget build(BuildContext context) { 12 | return SizedBox( 13 | height: height, 14 | child: Lottie.asset(path), 15 | ); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /lib/core/components/button-style/elevated_button_style.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class ElevatedButtonStyle { 4 | final double circularSize; 5 | const ElevatedButtonStyle({ 6 | required this.circularSize, 7 | }); 8 | ButtonStyle get style => ButtonStyle( 9 | shape: MaterialStateProperty.all( 10 | RoundedRectangleBorder( 11 | borderRadius: BorderRadius.circular(circularSize), 12 | ), 13 | ), 14 | ); 15 | } 16 | -------------------------------------------------------------------------------- /lib/core/components/dots/dots_decoration.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/core/constants/onboarding/intro_constants.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:introduction_screen/introduction_screen.dart'; 4 | 5 | class DotsDecoration { 6 | const DotsDecoration._(); 7 | static final decoration = DotsDecorator( 8 | size: IntroConstants.dotSquare, 9 | activeSize: IntroConstants.dotSize, 10 | spacing: IntroConstants.dotSpacing, 11 | activeShape: RoundedRectangleBorder(borderRadius: IntroConstants.dotsBorderCircular), 12 | ); 13 | } 14 | -------------------------------------------------------------------------------- /lib/core/components/icon/icon_logo.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/product/enum/icon/icon_enums.dart'; 2 | import 'package:flutter/material.dart'; 3 | 4 | class IconLogo extends StatelessWidget { 5 | const IconLogo({super.key, required this.height}); 6 | 7 | final double height; 8 | 9 | @override 10 | Widget build(BuildContext context) { 11 | return Image.asset(IconEnums.icon.toPng, height: height); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /lib/core/components/image/listtile_image.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/core/extension/context/context_extension.dart'; 2 | import 'package:flutter/material.dart'; 3 | 4 | class LisstileImage extends StatelessWidget { 5 | const LisstileImage({super.key, required this.image}); 6 | final String image; 7 | 8 | @override 9 | Widget build(BuildContext context) { 10 | return Padding( 11 | padding: const EdgeInsets.all(8.0), 12 | child: ClipRRect( 13 | borderRadius: BorderRadius.circular(10), 14 | child: Image.network( 15 | image, 16 | width: context.width * 0.25, 17 | height: context.width * 0.35, 18 | fit: BoxFit.cover, 19 | errorBuilder: (context, error, stackTrace) { 20 | return Image.asset( 21 | "assets/icon/icon.png", 22 | width: context.width * 0.25, 23 | height: context.width * 0.35, 24 | fit: BoxFit.fitWidth, 25 | ); 26 | }, 27 | ), 28 | ), 29 | ); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /lib/core/components/lisstile/changer_listtile_with_dropdown.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class ChangerListtileWithDropdown extends StatelessWidget { 4 | const ChangerListtileWithDropdown( 5 | {super.key, required this.icon, required this.title, required this.alertTitle, required this.child}); 6 | 7 | final Icon icon; 8 | final String title; 9 | final String alertTitle; 10 | final Widget child; 11 | 12 | @override 13 | Widget build(BuildContext context) { 14 | return InkWell( 15 | onTap: () { 16 | _showDialog(context); 17 | }, 18 | child: ListTile( 19 | leading: icon, 20 | title: Text( 21 | title, 22 | style: Theme.of(context).textTheme.titleMedium, 23 | ), 24 | ), 25 | ); 26 | } 27 | 28 | Future _showDialog(BuildContext context) { 29 | return showDialog( 30 | context: context, 31 | builder: (context) => AlertDialog( 32 | title: Text( 33 | alertTitle, 34 | textAlign: TextAlign.center, 35 | style: Theme.of(context).textTheme.titleLarge, 36 | ), 37 | content: child, 38 | ), 39 | ); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /lib/core/components/padding/padding_for_scroll.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class PaddingForScroll extends StatelessWidget { 4 | const PaddingForScroll({super.key}); 5 | 6 | @override 7 | Widget build(BuildContext context) { 8 | return Padding( 9 | padding: EdgeInsets.only( 10 | bottom: MediaQuery.of(context).viewInsets.bottom, 11 | ), 12 | ); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /lib/core/components/text-button/text_button_medium.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class TextButtonMedium extends StatelessWidget { 4 | const TextButtonMedium({super.key, required this.function, required this.text, required this.color}); 5 | 6 | final void Function()? function; 7 | final String text; 8 | final Color color; 9 | 10 | @override 11 | Widget build(BuildContext context) { 12 | return TextButton( 13 | onPressed: function, 14 | child: Text( 15 | text, 16 | style: Theme.of(context).textTheme.bodyMedium?.copyWith(), 17 | ), 18 | ); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /lib/core/components/text-form-field/custom_text_field_register.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/core/extension/context/context_extension.dart'; 2 | import 'package:education_app_like_udemy/view/auth/register/view-model/wait/waited_button.dart'; 3 | import 'package:flutter/material.dart'; 4 | import 'package:flutter_bloc/flutter_bloc.dart'; 5 | 6 | class CustomTextFieldForRegister extends StatelessWidget { 7 | const CustomTextFieldForRegister( 8 | {super.key, 9 | required this.controller, 10 | required this.obscureText, 11 | required this.label, 12 | required this.icon, 13 | required this.function}); 14 | 15 | final TextEditingController controller; 16 | final bool obscureText; 17 | final String label; 18 | final Icon icon; 19 | final String? Function(String?) function; 20 | 21 | @override 22 | Widget build(BuildContext context) { 23 | return SizedBox( 24 | width: context.textFieldWidht, 25 | child: BlocBuilder( 26 | builder: (context, state) { 27 | return TextFormField( 28 | readOnly: state, 29 | scrollPadding: const EdgeInsets.only(bottom: 40), 30 | decoration: InputDecoration( 31 | prefixIcon: icon, 32 | border: const OutlineInputBorder(), 33 | label: Text(label), 34 | ), 35 | obscureText: obscureText, 36 | controller: controller, 37 | validator: function, 38 | ); 39 | }, 40 | ), 41 | ); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /lib/core/components/text-form-field/custom_text_form_field.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/core/extension/context/context_extension.dart'; 2 | import 'package:education_app_like_udemy/view/auth/login/view-model/wait/waited_button.dart'; 3 | import 'package:flutter/material.dart'; 4 | import 'package:flutter_bloc/flutter_bloc.dart'; 5 | 6 | class CustomTextFieldForLoading extends StatelessWidget { 7 | const CustomTextFieldForLoading( 8 | {super.key, 9 | required this.controller, 10 | required this.obscureText, 11 | required this.label, 12 | required this.icon, 13 | required this.function}); 14 | 15 | final TextEditingController controller; 16 | final bool obscureText; 17 | final String label; 18 | final Icon icon; 19 | final String? Function(String?) function; 20 | 21 | @override 22 | Widget build(BuildContext context) { 23 | return SizedBox( 24 | width: context.textFieldWidht, 25 | child: BlocBuilder( 26 | builder: (context, state) { 27 | return TextFormField( 28 | readOnly: state, 29 | scrollPadding: const EdgeInsets.only(bottom: 40), 30 | decoration: InputDecoration( 31 | prefixIcon: icon, 32 | border: const OutlineInputBorder(), 33 | label: Text(label), 34 | ), 35 | obscureText: obscureText, 36 | controller: controller, 37 | validator: function, 38 | ); 39 | }, 40 | ), 41 | ); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /lib/core/components/text/headline_small_text.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class HeadlineSmallText extends StatelessWidget { 4 | const HeadlineSmallText({super.key, this.textAlign, required this.text}); 5 | 6 | final TextAlign? textAlign; 7 | final String text; 8 | 9 | @override 10 | Widget build(BuildContext context) { 11 | return Text( 12 | text, 13 | style: Theme.of(context).textTheme.headlineSmall, 14 | textAlign: textAlign ?? TextAlign.start, 15 | ); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /lib/core/components/text/text_body_medium.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class TextBodyMedium extends StatelessWidget { 4 | const TextBodyMedium({super.key, required this.text}); 5 | final String text; 6 | 7 | @override 8 | Widget build(BuildContext context) { 9 | return Text( 10 | text, 11 | style: Theme.of(context).textTheme.bodyMedium, 12 | ); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /lib/core/components/text/text_large_with_spacing.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/core/components/text/text_title_large.dart'; 2 | import 'package:flutter/material.dart'; 3 | 4 | class TestTitleLargeWithSpacing extends StatelessWidget { 5 | const TestTitleLargeWithSpacing({super.key, required this.color, required this.text, required this.spacing}); 6 | 7 | final Color color; 8 | final String text; 9 | final double spacing; 10 | 11 | @override 12 | Widget build(BuildContext context) { 13 | return TextTitleLarge( 14 | color: color, 15 | text: text, 16 | spacing: spacing, 17 | ); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /lib/core/components/text/text_title_large.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class TextTitleLarge extends StatelessWidget { 4 | const TextTitleLarge({super.key, required this.color, required this.text, this.spacing}); 5 | final Color color; 6 | final String text; 7 | final double? spacing; 8 | 9 | @override 10 | Widget build(BuildContext context) { 11 | return Text( 12 | text, 13 | style: Theme.of(context).textTheme.titleLarge?.copyWith( 14 | color: color, 15 | letterSpacing: spacing, 16 | ), 17 | ); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /lib/core/components/text/text_title_large_normal.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class TextTitleLarge extends StatelessWidget { 4 | const TextTitleLarge({super.key, required this.text}); 5 | final String text; 6 | 7 | @override 8 | Widget build(BuildContext context) { 9 | return Text( 10 | text, 11 | maxLines: 1, 12 | overflow: TextOverflow.ellipsis, 13 | style: Theme.of(context).textTheme.titleLarge, 14 | ); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /lib/core/components/text/text_title_medium.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class TextTitleMedium extends StatelessWidget { 4 | const TextTitleMedium({super.key, required this.text}); 5 | final String text; 6 | 7 | @override 8 | Widget build(BuildContext context) { 9 | return Text( 10 | text, 11 | textAlign: TextAlign.center, 12 | maxLines: 2, 13 | overflow: TextOverflow.ellipsis, 14 | style: Theme.of(context).textTheme.titleMedium, 15 | ); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /lib/core/components/text/text_title_medium_slim.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class TextTitleMediumSlim extends StatelessWidget { 4 | const TextTitleMediumSlim({ 5 | super.key, 6 | required this.text, 7 | }); 8 | final String text; 9 | 10 | @override 11 | Widget build(BuildContext context) { 12 | return Text( 13 | text, 14 | style: Theme.of(context).textTheme.titleMedium?.copyWith( 15 | fontWeight: FontWeight.w300, 16 | color: Theme.of(context).hintColor, 17 | ), 18 | ); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /lib/core/components/text/text_with_theme_color.dart: -------------------------------------------------------------------------------- 1 | import 'package:easy_localization/easy_localization.dart'; 2 | import 'package:flutter/material.dart'; 3 | 4 | class TextMediumTitle extends StatelessWidget { 5 | const TextMediumTitle({super.key, required this.text}); 6 | final String text; 7 | 8 | @override 9 | Widget build(BuildContext context) { 10 | return Text( 11 | text.tr(), 12 | style: Theme.of(context).textTheme.labelLarge, 13 | ); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /lib/core/components/text/title_medium_text.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class TitleMediumText extends StatelessWidget { 4 | const TitleMediumText({super.key, this.textAlign, required this.text}); 5 | 6 | final TextAlign? textAlign; 7 | final String text; 8 | 9 | @override 10 | Widget build(BuildContext context) { 11 | return Text( 12 | text, 13 | style: Theme.of(context).textTheme.titleMedium, 14 | textAlign: textAlign ?? TextAlign.start, 15 | ); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /lib/core/components/text/title_spacing_with_padding.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/core/components/text/text_large_with_spacing.dart'; 2 | import 'package:education_app_like_udemy/core/extension/padding/padding_extension.dart'; 3 | import 'package:education_app_like_udemy/core/extension/text/text_extension.dart'; 4 | import 'package:flutter/material.dart'; 5 | 6 | class TitleSpacingWithPadding extends StatelessWidget { 7 | const TitleSpacingWithPadding({super.key, required this.text}); 8 | 9 | final String text; 10 | 11 | @override 12 | Widget build(BuildContext context) { 13 | return Padding( 14 | padding: EdgeInsets.all(context.buttonTitlePadding), 15 | child: TestTitleLargeWithSpacing( 16 | color: Colors.white, 17 | text: text, 18 | spacing: context.buttonTitleSpacing, 19 | ), 20 | ); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /lib/core/constants/icon/icon_constants.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class IconConstants { 4 | const IconConstants._(); 5 | 6 | static const Icon themeIcon = Icon(Icons.wb_twilight_outlined); 7 | static const Icon localizationIcon = Icon(Icons.language_outlined); 8 | static const Icon email = Icon(Icons.email_outlined); 9 | static const Icon password = Icon(Icons.key_outlined); 10 | static const Icon done = Icon(Icons.file_download_done_outlined, color: Colors.green, size: 50); 11 | static const Icon home = Icon(Icons.home_outlined); 12 | static const Icon basket = Icon(Icons.shopping_basket_outlined); 13 | static const Icon person = Icon(Icons.person_outline_outlined); 14 | static const Icon search = Icon(Icons.search); 15 | } 16 | -------------------------------------------------------------------------------- /lib/core/constants/onboarding/intro_constants.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class IntroConstants { 4 | const IntroConstants._(); 5 | 6 | static BorderRadius dotsBorderCircular = BorderRadius.circular(25.0); 7 | static BorderRadius buttonBorderCircular = BorderRadius.circular(8); 8 | static const Size dotSize = Size(20.0, 10.0); 9 | static const EdgeInsets dotSpacing = EdgeInsets.symmetric(horizontal: 3.0); 10 | static const Size dotSquare = Size.square(10.0); 11 | } 12 | -------------------------------------------------------------------------------- /lib/core/constants/routing/routing_transition.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:go_router/go_router.dart'; 3 | 4 | class BuildPageWithTransition { 5 | const BuildPageWithTransition._(); 6 | 7 | static CustomTransitionPage buildPageWithDefaultTransition({ 8 | required BuildContext context, 9 | required GoRouterState state, 10 | required Widget child, 11 | }) { 12 | return CustomTransitionPage( 13 | transitionDuration: const Duration(milliseconds: 10), 14 | key: state.pageKey, 15 | child: child, 16 | transitionsBuilder: (context, animation, secondaryAnimation, child) { 17 | return FadeTransition(opacity: animation, child: child); 18 | }, 19 | ); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /lib/core/constants/theme/dark_constants.dart: -------------------------------------------------------------------------------- 1 | part of '../../init/theme/dark/dark_theme_custom.dart'; 2 | 3 | class DarkThemeColors { 4 | const DarkThemeColors._(); 5 | static final Color _appBarBackground = Colors.grey.shade800; 6 | } 7 | 8 | class DarkThemeString { 9 | const DarkThemeString._(); 10 | } 11 | 12 | class DarkThemeIcon { 13 | const DarkThemeIcon._(); 14 | 15 | static const Color _iconColor = Colors.white; 16 | } 17 | -------------------------------------------------------------------------------- /lib/core/constants/theme/light_constants.dart: -------------------------------------------------------------------------------- 1 | part of '../../init/theme/light/light_theme_custom.dart'; 2 | 3 | // Added constans for light theme 4 | class LightThemeColors { 5 | const LightThemeColors._(); 6 | static const Color broom = Color.fromRGBO(255, 237, 15, 1); 7 | static const Color orangePeel = Color.fromRGBO(255, 156, 0, 1); 8 | static const Color scarlet = Color.fromRGBO(255, 48, 0, 1); 9 | static const Color brightRed = Color.fromRGBO(182, 0, 0, 1); 10 | } 11 | 12 | class LightThemeString { 13 | const LightThemeString._(); 14 | } 15 | 16 | class LightThemeIcon { 17 | const LightThemeIcon._(); 18 | static const Color _iconColor = Colors.black; 19 | } 20 | -------------------------------------------------------------------------------- /lib/core/extension/border/border_extension.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | extension BorderRadiusSizes on BuildContext { 4 | BorderRadius get searchBorder => BorderRadius.circular(20); 5 | BorderRadius get imageBorder => BorderRadius.circular(10); 6 | } 7 | -------------------------------------------------------------------------------- /lib/core/extension/context/context_extension.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | extension ContextExtension on BuildContext { 4 | MediaQueryData get mediaQuery => MediaQuery.of(this); 5 | } 6 | 7 | extension MediaQueryExtension on BuildContext { 8 | double get height => mediaQuery.size.height; 9 | double get width => mediaQuery.size.width; 10 | 11 | double get lowValue => height * 0.01; 12 | double get normalValue => height * 0.02; 13 | double get mediumValue => height * 0.04; 14 | double get largeValue => height * 0.07; 15 | double get highValue => height * 0.1; 16 | double get logoValue => height * 0.15; 17 | double get listtileImageSize => width * 0.15; 18 | 19 | double get introImageTitle => height * 0.65; 20 | double get textFieldWidht => width * 0.8; 21 | 22 | double get appBarWidth => width * 0.7; 23 | 24 | double get cardTitleArea => width * 0.58; 25 | double get cardContentSize => width * 0.35; 26 | } 27 | 28 | extension SizedSpaceBoxExtension on BuildContext { 29 | SizedBox get normalSpace => SizedBox(height: height * 0.02); 30 | SizedBox get space => SizedBox(height: height * 0.03); 31 | SizedBox get smallSpace => SizedBox(height: height * 0.01); 32 | SizedBox get xmallSpace => SizedBox(height: height * 0.00); 33 | SizedBox get mediumSpace => SizedBox(height: height * 0.04); 34 | SizedBox get largeSpace => SizedBox(height: height * 0.08); 35 | SizedBox get bigSpace => SizedBox(height: height * 0.12); 36 | SizedBox get cardSmallSpace => SizedBox(width: width * 0.02); 37 | SizedBox get cardxSmallSpace => SizedBox(width: width * 0.01); 38 | } 39 | 40 | extension LottieExtension on BuildContext { 41 | double get bigTitleLottiSize => 44; 42 | } 43 | -------------------------------------------------------------------------------- /lib/core/extension/padding/padding_extension.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | extension PaddingExtension on BuildContext { 4 | double get buttonTitlePadding => 10; 5 | EdgeInsets get smallPadding => const EdgeInsets.all(6.0); 6 | } 7 | -------------------------------------------------------------------------------- /lib/core/extension/text/text_extension.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | extension SpacingExtension on BuildContext { 4 | double get buttonTitleSpacing => 1.5; 5 | } 6 | -------------------------------------------------------------------------------- /lib/core/extension/validator/email_validator.dart: -------------------------------------------------------------------------------- 1 | extension EmailValidator on String { 2 | bool isValidEmail() { 3 | return RegExp( 4 | r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$') 5 | .hasMatch(this); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /lib/core/extension/validator/password_validator.dart: -------------------------------------------------------------------------------- 1 | extension PasswordValidator on String { 2 | bool isValidPassword() { 3 | return RegExp(r'^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[!@#\$&*~.]).{8,}$').hasMatch(this); 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /lib/core/init/cache/login/login_caching.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/view/_product/enum/route/route_enum.dart'; 2 | import 'package:hive_flutter/hive_flutter.dart'; 3 | 4 | class LoginCaching { 5 | const LoginCaching._(); 6 | 7 | static final Box _login = Hive.box('login'); 8 | static final Box _token = Hive.box('token'); 9 | static final Box _role = Hive.box('role'); 10 | 11 | static Future init() async { 12 | await Hive.openBox('login'); 13 | await Hive.openBox('token'); 14 | await Hive.openBox('role'); 15 | } 16 | 17 | static String initialLogin() { 18 | switch (_login.get('isLogined')) { 19 | case true: 20 | if (_role.get('myRole') != null && _role.get('myRole') == "student") { 21 | return RouteEnum.studentHomePage.rawValue; 22 | } else { 23 | return RouteEnum.teacherHomePage.rawValue; 24 | } 25 | default: 26 | return RouteEnum.login.rawValue; 27 | } 28 | } 29 | 30 | static void signin() { 31 | _login.put('isLogined', true); 32 | } 33 | 34 | static void signout() { 35 | _login.put('isLogined', false); 36 | } 37 | 38 | static void setToken(String token) { 39 | _token.put('myToken', token); 40 | } 41 | 42 | static void deleteToken() { 43 | _token.put('myToken', "null"); 44 | } 45 | 46 | static void changeRole(String role) { 47 | _role.put('myRole', role); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /lib/core/init/cache/onboarding/intro_caching.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/view/_product/enum/route/route_enum.dart'; 2 | import 'package:hive_flutter/hive_flutter.dart'; 3 | 4 | class IntroCaching { 5 | const IntroCaching._(); 6 | 7 | static final Box _intro = Hive.box('intro'); 8 | static final Box _login = Hive.box('login'); 9 | static final Box _role = Hive.box('role'); 10 | 11 | static Future init() async { 12 | await Hive.openBox('intro'); 13 | } 14 | 15 | static String initialIntro() { 16 | switch (_intro.get('introWatched')) { 17 | case true: 18 | if (_login.get('isLogined') != null && _login.get('isLogined') == true) { 19 | if (_role.get('myRole') != null && _role.get('myRole') == "student") { 20 | return RouteEnum.studentHomePage.rawValue; 21 | } else { 22 | return RouteEnum.teacherHomePage.rawValue; 23 | } 24 | } else { 25 | return RouteEnum.userRole.rawValue; 26 | } 27 | default: 28 | return RouteEnum.intro.rawValue; 29 | } 30 | } 31 | 32 | static void watchIntro() { 33 | _intro.put('introWatched', true); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /lib/core/init/cache/theme/theme_caching.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:hive_flutter/hive_flutter.dart'; 3 | 4 | class ThemeCaching { 5 | const ThemeCaching._(); 6 | static final Box _theme = Hive.box('theme'); 7 | 8 | static Future init() async { 9 | await Hive.initFlutter(); 10 | await Hive.openBox('theme'); 11 | } 12 | 13 | static String initialRadio() { 14 | switch (_theme.get('isLight')) { 15 | case true: 16 | return 'ThemeMode.light'; 17 | case false: 18 | return 'ThemeMode.dark'; 19 | default: 20 | return 'ThemeMode.system'; 21 | } 22 | } 23 | 24 | static ThemeMode initialTheme() { 25 | switch (_theme.get('isLight')) { 26 | case true: 27 | return ThemeMode.light; 28 | case false: 29 | return ThemeMode.dark; 30 | default: 31 | return ThemeMode.system; 32 | } 33 | } 34 | 35 | static void makelight() { 36 | _theme.put('isLight', true); 37 | } 38 | 39 | static void makeDark() { 40 | _theme.put('isLight', false); 41 | } 42 | 43 | static void makeSystem() { 44 | _theme.put('isLight', null); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /lib/core/init/cubit/radio_cubit.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/core/init/cache/theme/theme_caching.dart'; 2 | import 'package:flutter_bloc/flutter_bloc.dart'; 3 | 4 | class RadioCubit extends Cubit { 5 | RadioCubit() : super(ThemeCaching.initialRadio()); 6 | 7 | void changeValue(String radio) { 8 | emit(radio); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /lib/core/init/cubit/theme_cubit.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/core/init/cache/theme/theme_caching.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:flutter_bloc/flutter_bloc.dart'; 4 | 5 | class ThemeCubit extends Cubit { 6 | ThemeCubit() : super(ThemeCaching.initialTheme()); 7 | 8 | void makelight() { 9 | ThemeCaching.makelight(); 10 | emit(ThemeMode.light); 11 | } 12 | 13 | void makeDark() { 14 | ThemeCaching.makeDark(); 15 | emit(ThemeMode.dark); 16 | } 17 | 18 | void makeSystem() { 19 | ThemeCaching.makeSystem(); 20 | emit(ThemeMode.system); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /lib/core/init/localization/localization.dart: -------------------------------------------------------------------------------- 1 | part of '/main.dart'; 2 | 3 | class LocaleVariables { 4 | const LocaleVariables._(); 5 | 6 | static final List _localesList = ProjectLocales.localesMap.keys.toList(); 7 | static const String _localesPath = 'assets/translations'; 8 | static const Locale _fallBackLocale = Locale('en', 'US'); 9 | 10 | static List localItems() { 11 | List menuItems = []; 12 | for (var element in _localesList) { 13 | menuItems.add(DropdownMenuItem( 14 | value: element, 15 | child: Text(ProjectLocales.localesMap[element].toString()), 16 | )); 17 | } 18 | return menuItems; 19 | } 20 | 21 | static Future _init() async { 22 | WidgetsFlutterBinding.ensureInitialized(); 23 | await EasyLocalization.ensureInitialized(); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /lib/core/init/localization/project_locales.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class ProjectLocales { 4 | const ProjectLocales._(); 5 | static final Map localesMap = { 6 | const Locale('en', 'US'): 'English', 7 | const Locale('tr', 'TR'): 'Turkish', 8 | }; 9 | } 10 | -------------------------------------------------------------------------------- /lib/core/init/navigation/navigation_route.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/core/init/navigation/navigation_routers.dart'; 2 | import 'package:go_router/go_router.dart'; 3 | 4 | class NavigationRoute { 5 | static final GoRouter router = NavigationRouters.router; 6 | const NavigationRoute._(); 7 | 8 | static void goRouteNormal(String route) { 9 | router.push(route); 10 | } 11 | 12 | static void goRouteClear(String route) { 13 | router.pushReplacement(route); 14 | } 15 | 16 | static void goRouteNormalWithParam(String route, String param) { 17 | router.pushNamed(route, params: {"key": param}); 18 | } 19 | 20 | static void goRouteClearWithParam(String route, String param) { 21 | router.pushReplacementNamed(route, params: {"key": param}); 22 | } 23 | 24 | static void goWithObject(String route, Object object) { 25 | router.pushNamed(route, extra: object); 26 | } 27 | 28 | static void goWithInt(String route, int integer) { 29 | router.pushNamed(route, extra: integer); 30 | } 31 | 32 | static void goWithIntClear(String route, int integer) { 33 | // router.pushReplacementNamed(route, extra: integer); 34 | router.replaceNamed(route, extra: integer); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /lib/core/init/theme/build-material-color/build_color.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class BuildColor { 4 | MaterialColor buildMaterialColor(Color color) { 5 | List strengths = [.05]; 6 | Map swatch = {}; 7 | final int r = color.red, g = color.green, b = color.blue; 8 | 9 | for (int i = 1; i < 10; i++) { 10 | strengths.add(0.1 * i); 11 | } 12 | for (var strength in strengths) { 13 | final double ds = 0.5 - strength; 14 | swatch[(strength * 1000).round()] = Color.fromRGBO( 15 | r + ((ds < 0 ? r : (255 - r)) * ds).round(), 16 | g + ((ds < 0 ? g : (255 - g)) * ds).round(), 17 | b + ((ds < 0 ? b : (255 - b)) * ds).round(), 18 | 1, 19 | ); 20 | } 21 | return MaterialColor(color.value, swatch); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /lib/core/init/theme/commons/color_commons.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class ColorCommons { 4 | const ColorCommons._(); 5 | 6 | static const Color white = Colors.white; 7 | } 8 | -------------------------------------------------------------------------------- /lib/core/init/theme/dark/dark_theme_custom.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/core/init/theme/build-material-color/build_color.dart'; 2 | import 'package:education_app_like_udemy/core/init/theme/light/light_theme_custom.dart'; 3 | import 'package:flutter/material.dart'; 4 | import 'package:flutter/services.dart'; 5 | 6 | part '../../../constants/theme/dark_constants.dart'; 7 | 8 | class DarkThemeCustom { 9 | late ThemeData theme; 10 | 11 | DarkThemeCustom() { 12 | theme = ThemeData( 13 | // CUSTOMIZE AREA 14 | brightness: Brightness.dark, 15 | primarySwatch: BuildColor().buildMaterialColor(LightThemeColors.scarlet), 16 | appBarTheme: AppBarTheme( 17 | systemOverlayStyle: SystemUiOverlayStyle( 18 | statusBarColor: DarkThemeColors._appBarBackground, 19 | statusBarIconBrightness: Brightness.light, 20 | ), 21 | centerTitle: true, 22 | ), 23 | ); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /lib/core/init/theme/light/light_theme_custom.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/core/init/theme/build-material-color/build_color.dart'; 2 | import 'package:education_app_like_udemy/core/init/theme/commons/color_commons.dart'; 3 | import 'package:flutter/material.dart'; 4 | import 'package:flutter/services.dart'; 5 | 6 | part '../../../constants/theme/light_constants.dart'; 7 | 8 | class LightThemeCustom { 9 | late ThemeData theme; 10 | 11 | LightThemeCustom() { 12 | theme = ThemeData( 13 | // CUSTOMIZE AREAss 14 | brightness: Brightness.light, 15 | primarySwatch: BuildColor().buildMaterialColor(LightThemeColors.scarlet), 16 | appBarTheme: const AppBarTheme( 17 | iconTheme: IconThemeData( 18 | color: Colors.black54, 19 | ), 20 | backgroundColor: ColorCommons.white, 21 | elevation: 0, 22 | systemOverlayStyle: SystemUiOverlayStyle( 23 | statusBarColor: LightThemeColors.scarlet, 24 | statusBarIconBrightness: Brightness.dark, 25 | ), 26 | centerTitle: true, 27 | ), 28 | ); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /lib/cubit_observer.dart: -------------------------------------------------------------------------------- 1 | import 'dart:developer'; 2 | import 'package:flutter_bloc/flutter_bloc.dart'; 3 | 4 | class CubitObserver extends BlocObserver { 5 | @override 6 | void onChange(BlocBase bloc, Change change) { 7 | super.onChange(bloc, change); 8 | log('$bloc, $change'); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /lib/product/constants/api/api_constants.dart: -------------------------------------------------------------------------------- 1 | class ApiConstants { 2 | const ApiConstants._(); 3 | static final Map headerJson = { 4 | "content-type": "application/json", 5 | "accept": "application/json", 6 | }; 7 | 8 | static const String baseUrl = "https://10.0.2.2:7278/"; 9 | } 10 | -------------------------------------------------------------------------------- /lib/product/constants/routing/routing_keys.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class RoutingKeys { 4 | const RoutingKeys._(); 5 | static final GlobalKey rootNavigatorKey = GlobalKey(debugLabel: 'root'); 6 | static final GlobalKey shellNavigatorKey = GlobalKey(debugLabel: 'shell'); 7 | } 8 | -------------------------------------------------------------------------------- /lib/product/enum/animation/animation_enum.dart: -------------------------------------------------------------------------------- 1 | enum AnimationEnum { 2 | loading('button_loading'), 3 | ; 4 | 5 | final String value; 6 | 7 | const AnimationEnum(this.value); 8 | 9 | String get toJson => "assets/animation/$value.json"; 10 | } 11 | -------------------------------------------------------------------------------- /lib/product/enum/api/api_service.dart: -------------------------------------------------------------------------------- 1 | enum ApiService { 2 | accountLogin, 3 | accountregister, 4 | studentLogin, 5 | studentRegister, 6 | } 7 | 8 | extension PathExtension on ApiService { 9 | static String baseUrl = "https://10.0.2.2:7278"; 10 | String get pathValue { 11 | switch (this) { 12 | case ApiService.accountLogin: 13 | return "$baseUrl/api/Account/login"; 14 | case ApiService.accountregister: 15 | return "$baseUrl/api/Account/register"; 16 | case ApiService.studentRegister: 17 | return "$baseUrl/api/AuthStudent/register"; 18 | case ApiService.studentLogin: 19 | return "$baseUrl/api/AuthStudent/login"; 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /lib/product/enum/icon/icon_enums.dart: -------------------------------------------------------------------------------- 1 | enum IconEnums { 2 | icon('icon'), 3 | ; 4 | 5 | final String value; 6 | 7 | const IconEnums(this.value); 8 | 9 | String get toPng => 'assets/icon/$value.png'; 10 | } 11 | -------------------------------------------------------------------------------- /lib/product/enum/intro/intro_enums.dart: -------------------------------------------------------------------------------- 1 | enum IntroEnums { 2 | app('app'), 3 | work('work'), 4 | commerce('commerce'), 5 | ; 6 | 7 | final String value; 8 | 9 | const IntroEnums(this.value); 10 | 11 | String get toJson => 'assets/intro/$value.json'; 12 | } 13 | -------------------------------------------------------------------------------- /lib/product/init/lang/locale_keys.g.dart: -------------------------------------------------------------------------------- 1 | // DO NOT EDIT. This is code generated via package:easy_localization/generate.dart 2 | 3 | abstract class LocaleKeys { 4 | static const introIntroTitleFirst = 'intro.introTitleFirst'; 5 | static const introIntroDescriptionFirst = 'intro.introDescriptionFirst'; 6 | static const introIntroTitleSecond = 'intro.introTitleSecond'; 7 | static const introIntroDescriptionSecon = 'intro.introDescriptionSecon'; 8 | static const introIntroTitleThird = 'intro.introTitleThird'; 9 | static const introIntroDescriptionThird = 'intro.introDescriptionThird'; 10 | static const intro = 'intro'; 11 | static const buttonSkip = 'button.skip'; 12 | static const buttonDone = 'button.done'; 13 | static const buttonCancel = 'button.cancel'; 14 | static const buttonOk = 'button.ok'; 15 | static const button = 'button'; 16 | static const themeTheme = 'theme.theme'; 17 | static const themeDefault = 'theme.default'; 18 | static const themeLight = 'theme.light'; 19 | static const themeDark = 'theme.dark'; 20 | static const themeThemeChoose = 'theme.themeChoose'; 21 | static const theme = 'theme'; 22 | static const localizationAppLang = 'localization.appLang'; 23 | static const localizationLangChoose = 'localization.langChoose'; 24 | static const localization = 'localization'; 25 | static const settingTitle = 'settingTitle'; 26 | } 27 | -------------------------------------------------------------------------------- /lib/product/init/service/service_overrides.dart: -------------------------------------------------------------------------------- 1 | import 'dart:io'; 2 | 3 | class MyHttpOverrides extends HttpOverrides { 4 | @override 5 | HttpClient createHttpClient(SecurityContext? context) { 6 | return super.createHttpClient(context) 7 | ..badCertificateCallback = (X509Certificate cert, String host, int port) => true; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /lib/product/widget/appbar/setting_appbar.dart: -------------------------------------------------------------------------------- 1 | import 'package:easy_localization/easy_localization.dart'; 2 | import 'package:education_app_like_udemy/product/init/lang/locale_keys.g.dart'; 3 | import 'package:flutter/material.dart'; 4 | 5 | class SettingAppbar extends StatelessWidget with PreferredSizeWidget { 6 | const SettingAppbar({ 7 | super.key, 8 | }); 9 | 10 | @override 11 | Widget build(BuildContext context) { 12 | return AppBar( 13 | title: Text( 14 | LocaleKeys.settingTitle.tr(), 15 | style: Theme.of(context).textTheme.headlineSmall, 16 | ), 17 | ); 18 | } 19 | 20 | @override 21 | Size get preferredSize => const Size.fromHeight(kToolbarHeight); 22 | } 23 | -------------------------------------------------------------------------------- /lib/product/widget/text-button/text_button_medium_navigate_back.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/core/components/text-button/text_button_medium.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:go_router/go_router.dart'; 4 | 5 | class TextButtonMediumNavigateBack extends StatelessWidget { 6 | const TextButtonMediumNavigateBack({super.key, required this.path, required this.text, required this.wait}); 7 | final String path; 8 | final String text; 9 | final bool wait; 10 | 11 | @override 12 | Widget build(BuildContext context) { 13 | return TextButtonMedium( 14 | function: wait == false 15 | ? () { 16 | GoRouter.of(context).pop(); 17 | } 18 | : null, 19 | text: text, 20 | color: Colors.black, 21 | ); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /lib/product/widget/text-button/text_button_medium_navigate_normal.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/core/components/text-button/text_button_medium.dart'; 2 | import 'package:education_app_like_udemy/core/init/navigation/navigation_route.dart'; 3 | import 'package:flutter/material.dart'; 4 | 5 | class TextButtonMediumNavigateGoNormal extends StatelessWidget { 6 | const TextButtonMediumNavigateGoNormal({super.key, required this.path, required this.text, required this.wait}); 7 | final String path; 8 | final String text; 9 | final bool wait; 10 | 11 | @override 12 | Widget build(BuildContext context) { 13 | return TextButtonMedium( 14 | function: wait == false 15 | ? () { 16 | NavigationRoute.goRouteNormal(path); 17 | } 18 | : null, 19 | text: text, 20 | color: Colors.black, 21 | ); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /lib/product/widget/text-button/text_button_medium_navigate_normal_param.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/core/components/text-button/text_button_medium.dart'; 2 | import 'package:education_app_like_udemy/core/init/navigation/navigation_route.dart'; 3 | import 'package:education_app_like_udemy/view/_product/enum/route/route_enum.dart'; 4 | import 'package:flutter/material.dart'; 5 | 6 | class TextButtonMediumNavigateGoNormalParam extends StatelessWidget { 7 | const TextButtonMediumNavigateGoNormalParam( 8 | {super.key, required this.path, required this.text, required this.wait, required this.param}); 9 | final String path; 10 | final String text; 11 | final bool wait; 12 | final String param; 13 | 14 | @override 15 | Widget build(BuildContext context) { 16 | return TextButtonMedium( 17 | function: wait == false 18 | ? () { 19 | NavigationRoute.goRouteNormalWithParam(RouteEnum.register.rawValue, param); 20 | } 21 | : null, 22 | text: text, 23 | color: Colors.black, 24 | ); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /lib/product/widget/text-button/text_button_medium_navigator.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/core/components/text-button/text_button_medium.dart'; 2 | import 'package:education_app_like_udemy/core/init/navigation/navigation_route.dart'; 3 | import 'package:flutter/material.dart'; 4 | 5 | class TextButtonMediumNavigateGoClear extends StatelessWidget { 6 | const TextButtonMediumNavigateGoClear({super.key, required this.path, required this.text}); 7 | final String path; 8 | final String text; 9 | 10 | @override 11 | Widget build(BuildContext context) { 12 | return TextButtonMedium( 13 | function: () { 14 | NavigationRoute.goRouteClear(path); 15 | }, 16 | text: text, 17 | color: Colors.black, 18 | ); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /lib/product/widget/text/card_description_text.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/core/extension/context/context_extension.dart'; 2 | import 'package:flutter/material.dart'; 3 | 4 | class CardDescriptionText extends StatelessWidget { 5 | const CardDescriptionText({super.key, required this.courseDescription}); 6 | final String courseDescription; 7 | 8 | @override 9 | Widget build(BuildContext context) { 10 | return SizedBox( 11 | width: context.cardTitleArea, 12 | child: Text( 13 | courseDescription, 14 | style: Theme.of(context).textTheme.titleMedium, 15 | maxLines: 2, 16 | overflow: TextOverflow.ellipsis, 17 | ), 18 | ); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /lib/product/widget/text/card_title_text.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/core/extension/context/context_extension.dart'; 2 | import 'package:flutter/material.dart'; 3 | 4 | class CardTitleText extends StatelessWidget { 5 | const CardTitleText({super.key, required this.courseName}); 6 | final String courseName; 7 | 8 | @override 9 | Widget build(BuildContext context) { 10 | return SizedBox( 11 | width: context.cardTitleArea, 12 | child: Text( 13 | courseName, 14 | maxLines: 1, 15 | overflow: TextOverflow.ellipsis, 16 | style: Theme.of(context).textTheme.titleLarge, 17 | ), 18 | ); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /lib/product/widget/text/text_price.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class TextPrice extends StatelessWidget { 4 | const TextPrice({super.key, required this.price}); 5 | final String price; 6 | 7 | @override 8 | Widget build(BuildContext context) { 9 | return Text( 10 | "\$$price", 11 | style: Theme.of(context).textTheme.titleMedium?.copyWith( 12 | color: const Color.fromARGB(255, 229, 99, 0), 13 | ), 14 | ); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /lib/view/_product/enum/get-course/get_course_enum.dart: -------------------------------------------------------------------------------- 1 | enum GetCourseEnum { 2 | initial, 3 | loading, 4 | completed, 5 | error, 6 | } 7 | -------------------------------------------------------------------------------- /lib/view/_product/enum/login/login_enum.dart: -------------------------------------------------------------------------------- 1 | enum LoginEnum { 2 | initial, 3 | loading, 4 | completed, 5 | error, 6 | } 7 | -------------------------------------------------------------------------------- /lib/view/_product/enum/register/register_enum.dart: -------------------------------------------------------------------------------- 1 | enum RegisterEnum { 2 | initial, 3 | loading, 4 | completed, 5 | error, 6 | } 7 | -------------------------------------------------------------------------------- /lib/view/_product/enum/search/search_enum.dart: -------------------------------------------------------------------------------- 1 | enum EnumSearch { 2 | initial, 3 | loading, 4 | completed, 5 | error, 6 | } 7 | -------------------------------------------------------------------------------- /lib/view/_product/screen-list/student/studen_screen_list.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/view/student/basket/view/basket_view.dart'; 2 | import 'package:education_app_like_udemy/view/student/home/view/home_view.dart'; 3 | import 'package:education_app_like_udemy/view/student/my-course/my-courses/view/my_course_view.dart'; 4 | import 'package:education_app_like_udemy/view/student/profile/view/profile_view.dart'; 5 | import 'package:flutter/material.dart'; 6 | 7 | class StudentScreens { 8 | final List screens = [ 9 | const HomeView(), 10 | const BasketView(), 11 | const MyCourseView(), 12 | const ProfileView(), 13 | ]; 14 | } 15 | -------------------------------------------------------------------------------- /lib/view/_product/screen-list/teacher/teacher_screen_list.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/view/teacher/home/view/teacher_home_view.dart'; 2 | import 'package:education_app_like_udemy/view/teacher/profile/teacher_profile.dart'; 3 | import 'package:flutter/material.dart'; 4 | 5 | class TeacherScreens { 6 | final List screens = [ 7 | const TeacherHomeView(), 8 | const TeacherProfile(), 9 | ]; 10 | } 11 | -------------------------------------------------------------------------------- /lib/view/_product/widget/animation/lottie_loading_button.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/core/components/animation/lottie_animation.dart'; 2 | import 'package:education_app_like_udemy/core/extension/context/context_extension.dart'; 3 | import 'package:education_app_like_udemy/product/enum/animation/animation_enum.dart'; 4 | import 'package:flutter/material.dart'; 5 | 6 | class LottieBigLoadingButton extends StatelessWidget { 7 | const LottieBigLoadingButton({ 8 | super.key, 9 | }); 10 | 11 | @override 12 | Widget build(BuildContext context) { 13 | return LottieAnimation( 14 | height: context.bigTitleLottiSize, 15 | path: AnimationEnum.loading.toJson, 16 | ); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /lib/view/_product/widget/textfield/login/custom_text_field_email.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/core/components/text-form-field/custom_text_form_field.dart'; 2 | import 'package:education_app_like_udemy/core/constants/icon/icon_constants.dart'; 3 | import 'package:education_app_like_udemy/core/constants/string/string_constants.dart'; 4 | import 'package:education_app_like_udemy/core/extension/validator/email_validator.dart'; 5 | import 'package:flutter/material.dart'; 6 | 7 | class CustomTextFieldEmail extends StatelessWidget { 8 | const CustomTextFieldEmail({super.key, required this.emailController}); 9 | final TextEditingController emailController; 10 | 11 | @override 12 | Widget build(BuildContext context) { 13 | return CustomTextFieldForLoading( 14 | controller: emailController, 15 | obscureText: false, 16 | label: StringConstants.email, 17 | icon: IconConstants.email, 18 | function: (value) => (value != null && value.isValidEmail()) ? null : StringConstants.validEmail, 19 | ); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /lib/view/_product/widget/textfield/login/custom_text_field_password.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/core/components/text-form-field/custom_text_form_field.dart'; 2 | import 'package:education_app_like_udemy/core/constants/icon/icon_constants.dart'; 3 | import 'package:education_app_like_udemy/core/constants/string/string_constants.dart'; 4 | import 'package:flutter/material.dart'; 5 | 6 | class CustomTextFieldPassword extends StatelessWidget { 7 | const CustomTextFieldPassword({super.key, required this.passwordController}); 8 | final TextEditingController passwordController; 9 | 10 | @override 11 | Widget build(BuildContext context) { 12 | return CustomTextFieldForLoading( 13 | controller: passwordController, 14 | obscureText: true, 15 | label: StringConstants.password, 16 | icon: IconConstants.password, 17 | function: (value) { 18 | if (value == null || value.isEmpty) { 19 | return StringConstants.validPassword; 20 | } 21 | return null; 22 | }, 23 | ); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /lib/view/_product/widget/textfield/register/custom_text_field_email_register.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/core/components/text-form-field/custom_text_field_register.dart'; 2 | import 'package:education_app_like_udemy/core/constants/icon/icon_constants.dart'; 3 | import 'package:education_app_like_udemy/core/constants/string/string_constants.dart'; 4 | import 'package:education_app_like_udemy/core/extension/validator/email_validator.dart'; 5 | import 'package:flutter/material.dart'; 6 | 7 | class CustomTextFieldEmailRegister extends StatelessWidget { 8 | const CustomTextFieldEmailRegister({super.key, required this.emailController}); 9 | final TextEditingController emailController; 10 | 11 | @override 12 | Widget build(BuildContext context) { 13 | return CustomTextFieldForRegister( 14 | controller: emailController, 15 | obscureText: false, 16 | label: StringConstants.email, 17 | icon: IconConstants.email, 18 | function: (value) => (value != null && value.isValidEmail()) ? null : StringConstants.validEmail, 19 | ); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /lib/view/_product/widget/textfield/register/custom_text_field_password_register.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/core/components/text-form-field/custom_text_field_register.dart'; 2 | import 'package:education_app_like_udemy/core/constants/icon/icon_constants.dart'; 3 | import 'package:education_app_like_udemy/core/constants/string/string_constants.dart'; 4 | import 'package:education_app_like_udemy/core/extension/validator/password_validator.dart'; 5 | import 'package:flutter/material.dart'; 6 | 7 | class CustomTextFieldPasswordRegister extends StatelessWidget { 8 | const CustomTextFieldPasswordRegister({super.key, required this.passwordController, this.passwordAgainController}); 9 | final TextEditingController passwordController; 10 | final TextEditingController? passwordAgainController; 11 | @override 12 | Widget build(BuildContext context) { 13 | return CustomTextFieldForRegister( 14 | controller: passwordController, 15 | obscureText: true, 16 | label: StringConstants.password, 17 | icon: IconConstants.password, 18 | function: (value) { 19 | if (value != null && value.isValidPassword()) { 20 | return null; 21 | } else if (passwordAgainController != null && passwordAgainController?.text != passwordController.text) { 22 | return StringConstants.passwordAgain; 23 | } 24 | return StringConstants.validPasswordRegex; 25 | }); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /lib/view/auth/introduction/model/page_model.dart: -------------------------------------------------------------------------------- 1 | class Page { 2 | String path; 3 | String title; 4 | String body; 5 | Page({ 6 | required this.path, 7 | required this.title, 8 | required this.body, 9 | }); 10 | } 11 | -------------------------------------------------------------------------------- /lib/view/auth/introduction/view-model/intro_pages.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/product/enum/intro/intro_enums.dart'; 2 | import 'package:education_app_like_udemy/product/init/lang/locale_keys.g.dart'; 3 | import 'package:education_app_like_udemy/view/auth/introduction/model/page_model.dart'; 4 | import 'package:education_app_like_udemy/view/auth/introduction/view/pages/first_page.dart'; 5 | import 'package:education_app_like_udemy/view/auth/introduction/view/pages/second_page.dart'; 6 | import 'package:education_app_like_udemy/view/auth/introduction/view/pages/third_page.dart'; 7 | import 'package:easy_localization/easy_localization.dart'; 8 | import 'package:introduction_screen/introduction_screen.dart'; 9 | 10 | class IntroPages { 11 | const IntroPages._(); 12 | 13 | static final Page firstPage = Page( 14 | path: IntroEnums.work.toJson, 15 | title: LocaleKeys.introIntroTitleFirst.tr(), 16 | body: LocaleKeys.introIntroDescriptionFirst.tr(), 17 | ); 18 | static final Page secondPage = Page( 19 | path: IntroEnums.app.toJson, 20 | title: LocaleKeys.introIntroTitleSecond.tr(), 21 | body: LocaleKeys.introIntroDescriptionSecon.tr(), 22 | ); 23 | static final Page thirdPage = Page( 24 | path: IntroEnums.commerce.toJson, 25 | title: LocaleKeys.introIntroTitleThird.tr(), 26 | body: LocaleKeys.introIntroDescriptionThird.tr(), 27 | ); 28 | 29 | static List pageList = [ 30 | FirstPage.page, 31 | SecondPage.page, 32 | ThirdPage.page, 33 | ]; 34 | } 35 | -------------------------------------------------------------------------------- /lib/view/auth/introduction/view/introduction_screen.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/core/components/dots/dots_decoration.dart'; 2 | import 'package:education_app_like_udemy/core/components/text/text_with_theme_color.dart'; 3 | import 'package:education_app_like_udemy/core/init/cache/onboarding/intro_caching.dart'; 4 | import 'package:education_app_like_udemy/core/init/navigation/navigation_route.dart'; 5 | import 'package:education_app_like_udemy/product/init/lang/locale_keys.g.dart'; 6 | import 'package:education_app_like_udemy/view/_product/enum/route/route_enum.dart'; 7 | import 'package:education_app_like_udemy/view/auth/introduction/view-model/intro_pages.dart'; 8 | import 'package:introduction_screen/introduction_screen.dart'; 9 | 10 | class Introduction { 11 | const Introduction._(); 12 | static final intro = IntroductionScreen( 13 | pages: IntroPages.pageList, 14 | showSkipButton: true, 15 | showNextButton: false, 16 | skip: const TextMediumTitle(text: LocaleKeys.buttonSkip), 17 | done: const TextMediumTitle(text: LocaleKeys.buttonDone), 18 | onDone: () { 19 | IntroCaching.watchIntro(); 20 | NavigationRoute.goRouteClear(RouteEnum.userRole.rawValue); 21 | }, 22 | dotsDecorator: DotsDecoration.decoration, 23 | ); 24 | } 25 | -------------------------------------------------------------------------------- /lib/view/auth/introduction/view/pages/first_page.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/core/extension/context/context_extension.dart'; 2 | import 'package:education_app_like_udemy/view/auth/introduction/view-model/intro_pages.dart'; 3 | import 'package:flutter/material.dart'; 4 | import 'package:introduction_screen/introduction_screen.dart'; 5 | import 'package:lottie/lottie.dart'; 6 | 7 | class FirstPage { 8 | const FirstPage._(); 9 | static final PageViewModel page = PageViewModel( 10 | titleWidget: const PageContent(), 11 | body: IntroPages.firstPage.body, 12 | ); 13 | } 14 | 15 | class PageContent extends StatelessWidget { 16 | const PageContent({ 17 | Key? key, 18 | }) : super(key: key); 19 | 20 | @override 21 | Widget build(BuildContext context) { 22 | return SizedBox( 23 | height: context.introImageTitle, 24 | child: Column( 25 | children: [ 26 | context.normalSpace, 27 | Expanded(child: Lottie.asset(IntroPages.firstPage.path)), 28 | context.normalSpace, 29 | Text( 30 | IntroPages.firstPage.title, 31 | style: Theme.of(context).textTheme.titleLarge?.copyWith(fontWeight: FontWeight.w600), 32 | ), 33 | ], 34 | ), 35 | ); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /lib/view/auth/introduction/view/pages/second_page.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/core/extension/context/context_extension.dart'; 2 | import 'package:education_app_like_udemy/view/auth/introduction/view-model/intro_pages.dart'; 3 | import 'package:flutter/material.dart'; 4 | import 'package:introduction_screen/introduction_screen.dart'; 5 | import 'package:lottie/lottie.dart'; 6 | 7 | class SecondPage { 8 | const SecondPage._(); 9 | static final PageViewModel page = PageViewModel( 10 | titleWidget: const PageContent(), 11 | body: IntroPages.secondPage.body, 12 | ); 13 | } 14 | 15 | class PageContent extends StatelessWidget { 16 | const PageContent({ 17 | Key? key, 18 | }) : super(key: key); 19 | 20 | @override 21 | Widget build(BuildContext context) { 22 | return SizedBox( 23 | height: context.introImageTitle, 24 | child: Column( 25 | children: [ 26 | context.normalSpace, 27 | Expanded(child: Lottie.asset(IntroPages.secondPage.path)), 28 | context.normalSpace, 29 | Text( 30 | IntroPages.secondPage.title, 31 | style: Theme.of(context).textTheme.titleLarge?.copyWith(fontWeight: FontWeight.w600), 32 | ), 33 | ], 34 | ), 35 | ); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /lib/view/auth/introduction/view/pages/third_page.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/core/extension/context/context_extension.dart'; 2 | import 'package:education_app_like_udemy/view/auth/introduction/view-model/intro_pages.dart'; 3 | import 'package:flutter/material.dart'; 4 | import 'package:introduction_screen/introduction_screen.dart'; 5 | import 'package:lottie/lottie.dart'; 6 | 7 | class ThirdPage { 8 | const ThirdPage._(); 9 | static final PageViewModel page = PageViewModel( 10 | titleWidget: const PageContent(), 11 | body: IntroPages.thirdPage.body, 12 | ); 13 | } 14 | 15 | class PageContent extends StatelessWidget { 16 | const PageContent({ 17 | Key? key, 18 | }) : super(key: key); 19 | 20 | @override 21 | Widget build(BuildContext context) { 22 | return SizedBox( 23 | height: context.introImageTitle, 24 | child: Column( 25 | children: [ 26 | context.normalSpace, 27 | Expanded(child: Lottie.asset(IntroPages.thirdPage.path)), 28 | context.normalSpace, 29 | Text( 30 | IntroPages.thirdPage.title, 31 | style: Theme.of(context).textTheme.titleLarge?.copyWith(fontWeight: FontWeight.w600), 32 | ), 33 | ], 34 | ), 35 | ); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /lib/view/auth/login/model/login_model.dart: -------------------------------------------------------------------------------- 1 | class LoginModel { 2 | String? email; 3 | String? password; 4 | 5 | LoginModel({required this.email, required this.password}); 6 | 7 | LoginModel.fromJson(Map json) { 8 | email = json['email']; 9 | password = json['password']; 10 | } 11 | 12 | Map toJson() { 13 | final Map data = {}; 14 | data['email'] = email; 15 | data['password'] = password; 16 | return data; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /lib/view/auth/login/model/login_response_model.dart: -------------------------------------------------------------------------------- 1 | class LoginResponseModel { 2 | bool? success; 3 | String? message; 4 | String? data; 5 | 6 | LoginResponseModel({this.success, this.message, this.data}); 7 | 8 | LoginResponseModel.fromJson(Map json) { 9 | success = json['success']; 10 | message = json['message']; 11 | data = json['data']; 12 | } 13 | 14 | Map toJson() { 15 | final Map data = {}; 16 | data['success'] = success; 17 | data['message'] = message; 18 | data['data'] = this.data; 19 | return data; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /lib/view/auth/login/service/login_service.dart: -------------------------------------------------------------------------------- 1 | import 'dart:convert'; 2 | import 'package:education_app_like_udemy/product/constants/api/api_constants.dart'; 3 | import 'package:education_app_like_udemy/product/enum/api/api_service.dart'; 4 | import 'package:education_app_like_udemy/view/auth/login/model/login_model.dart'; 5 | import 'package:education_app_like_udemy/view/auth/login/model/login_response_model.dart'; 6 | import 'package:http/http.dart' as http; 7 | 8 | class LoginService { 9 | late final LoginModel _loginModel; 10 | final String email; 11 | final String password; 12 | 13 | LoginService({required this.email, required this.password}) { 14 | _loginModel = LoginModel(email: email, password: password); 15 | } 16 | 17 | Future loginTeacher() async { 18 | var response = await http.post( 19 | Uri.parse(ApiService.accountLogin.pathValue), 20 | headers: ApiConstants.headerJson, 21 | body: jsonEncode( 22 | _loginModel.toJson(), 23 | ), 24 | ); 25 | final json = jsonDecode(response.body); 26 | return LoginResponseModel.fromJson(json); 27 | } 28 | 29 | Future loginStudent() async { 30 | var response = await http.post( 31 | Uri.parse(ApiService.studentLogin.pathValue), 32 | headers: ApiConstants.headerJson, 33 | body: jsonEncode( 34 | _loginModel.toJson(), 35 | ), 36 | ); 37 | final json = jsonDecode(response.body); 38 | return LoginResponseModel.fromJson(json); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /lib/view/auth/login/view-model/login/login_cubit.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/core/constants/string/string_constants.dart'; 2 | import 'package:education_app_like_udemy/core/init/cache/login/login_caching.dart'; 3 | import 'package:education_app_like_udemy/view/auth/login/service/login_service.dart'; 4 | import 'package:education_app_like_udemy/view/auth/login/view-model/login/login_state.dart'; 5 | import 'package:flutter_bloc/flutter_bloc.dart'; 6 | 7 | class LoginCubit extends Cubit { 8 | LoginCubit() : super(InitialLoginState()); 9 | 10 | Future login({required String email, required String password, required role}) async { 11 | try { 12 | emit(LoadingLoginState()); 13 | if (role == StringConstants.teacher) { 14 | var response = await LoginService(email: email, password: password).loginTeacher(); 15 | if (response.data == null) { 16 | emit(ErrorLoginState(errorMessage: response)); 17 | } else { 18 | LoginCaching.changeRole(role); 19 | emit(CompletedLoginState(tokenData: response)); 20 | } 21 | } else if (role == StringConstants.student) { 22 | var response = await LoginService(email: email, password: password).loginStudent(); 23 | if (response.data == null) { 24 | emit(ErrorLoginState(errorMessage: response)); 25 | } else { 26 | LoginCaching.changeRole(role); 27 | emit(CompletedLoginState(tokenData: response)); 28 | } 29 | } 30 | } catch (e) { 31 | emit(ErrorLoginState(errorMessage: null)); 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /lib/view/auth/login/view-model/login/login_state.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/view/_product/enum/login/login_enum.dart'; 2 | import 'package:education_app_like_udemy/view/auth/login/model/login_response_model.dart'; 3 | 4 | abstract class ILoginState { 5 | final LoginEnum status; 6 | ILoginState({ 7 | required this.status, 8 | }); 9 | } 10 | 11 | class InitialLoginState extends ILoginState { 12 | InitialLoginState() : super(status: LoginEnum.initial); 13 | } 14 | 15 | class LoadingLoginState extends ILoginState { 16 | LoadingLoginState() : super(status: LoginEnum.loading); 17 | } 18 | 19 | class CompletedLoginState extends ILoginState { 20 | final LoginResponseModel tokenData; 21 | CompletedLoginState({required this.tokenData}) : super(status: LoginEnum.completed); 22 | } 23 | 24 | class ErrorLoginState extends ILoginState { 25 | final LoginResponseModel? errorMessage; 26 | ErrorLoginState({required this.errorMessage}) : super(status: LoginEnum.error); 27 | } 28 | -------------------------------------------------------------------------------- /lib/view/auth/login/view-model/validation/validation_cubit.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_bloc/flutter_bloc.dart'; 3 | 4 | class ValidateCubit extends Cubit { 5 | ValidateCubit() : super(AutovalidateMode.disabled); 6 | 7 | void validateMode() { 8 | emit(AutovalidateMode.onUserInteraction); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /lib/view/auth/login/view-model/wait/waited_button.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter_bloc/flutter_bloc.dart'; 2 | 3 | class WaitedLoginCubit extends Cubit { 4 | WaitedLoginCubit() : super(false); 5 | 6 | void readOnlyTrue() { 7 | emit(true); 8 | } 9 | 10 | void readOnlyFalse() { 11 | emit(false); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /lib/view/auth/login/view/login_page.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/view/auth/login/view-model/login/login_cubit.dart'; 2 | import 'package:education_app_like_udemy/view/auth/login/view-model/validation/validation_cubit.dart'; 3 | import 'package:education_app_like_udemy/view/auth/login/view/login_view.dart'; 4 | import 'package:flutter/material.dart'; 5 | import 'package:flutter_bloc/flutter_bloc.dart'; 6 | 7 | class LoginPage extends StatelessWidget { 8 | const LoginPage({super.key, required this.role}); 9 | final String role; 10 | 11 | @override 12 | Widget build(BuildContext context) { 13 | return MultiBlocProvider( 14 | providers: [ 15 | BlocProvider(create: (context) => ValidateCubit()), 16 | BlocProvider(create: (context) => LoginCubit()), 17 | ], 18 | child: LoginView( 19 | role: role, 20 | ), 21 | ); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /lib/view/auth/register/model/register_model.dart: -------------------------------------------------------------------------------- 1 | class RegisterModel { 2 | String? email; 3 | String? password; 4 | String? confirmPassword; 5 | 6 | RegisterModel({this.email, this.password, this.confirmPassword}); 7 | 8 | RegisterModel.fromJson(Map json) { 9 | email = json['email']; 10 | password = json['password']; 11 | confirmPassword = json['confirmPassword']; 12 | } 13 | 14 | Map toJson() { 15 | final Map data = {}; 16 | data['email'] = email; 17 | data['password'] = password; 18 | data['confirmPassword'] = confirmPassword; 19 | return data; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /lib/view/auth/register/model/register_response_model.dart: -------------------------------------------------------------------------------- 1 | class RegisterResponseModel { 2 | bool? success; 3 | String? message; 4 | int? data; 5 | 6 | RegisterResponseModel({this.success, this.message, this.data}); 7 | 8 | RegisterResponseModel.fromJson(Map json) { 9 | success = json['success']; 10 | message = json['message']; 11 | data = json['data']; 12 | } 13 | 14 | Map toJson() { 15 | final Map data = {}; 16 | data['success'] = success; 17 | data['message'] = message; 18 | data['data'] = this.data; 19 | return data; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /lib/view/auth/register/service/register_service.dart: -------------------------------------------------------------------------------- 1 | import 'dart:convert'; 2 | import 'package:education_app_like_udemy/product/constants/api/api_constants.dart'; 3 | import 'package:education_app_like_udemy/product/enum/api/api_service.dart'; 4 | import 'package:education_app_like_udemy/view/auth/register/model/register_model.dart'; 5 | import 'package:education_app_like_udemy/view/auth/register/model/register_response_model.dart'; 6 | import 'package:http/http.dart' as http; 7 | 8 | class RegisterService { 9 | late final RegisterModel _registerModel; 10 | final String email; 11 | final String password; 12 | 13 | RegisterService({required this.email, required this.password}) { 14 | _registerModel = RegisterModel(email: email, password: password, confirmPassword: password); 15 | } 16 | 17 | Future registerTeacher() async { 18 | var response = await http.post( 19 | Uri.parse(ApiService.accountregister.pathValue), 20 | headers: ApiConstants.headerJson, 21 | body: jsonEncode( 22 | _registerModel.toJson(), 23 | ), 24 | ); 25 | final json = jsonDecode(response.body); 26 | return RegisterResponseModel.fromJson(json); 27 | } 28 | 29 | Future registerStudent() async { 30 | var response = await http.post( 31 | Uri.parse(ApiService.studentRegister.pathValue), 32 | headers: ApiConstants.headerJson, 33 | body: jsonEncode( 34 | _registerModel.toJson(), 35 | ), 36 | ); 37 | final json = jsonDecode(response.body); 38 | return RegisterResponseModel.fromJson(json); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /lib/view/auth/register/view-model/register/register_cubit.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/core/constants/string/string_constants.dart'; 2 | import 'package:education_app_like_udemy/view/auth/register/service/register_service.dart'; 3 | import 'package:education_app_like_udemy/view/auth/register/view-model/register/register_state.dart'; 4 | import 'package:flutter_bloc/flutter_bloc.dart'; 5 | 6 | class RegisterCubit extends Cubit { 7 | RegisterCubit() : super(InitialRegisterState()); 8 | 9 | Future register({required String email, required String password, required String role}) async { 10 | try { 11 | emit(LoadingRegisterState()); 12 | if (role == StringConstants.teacher) { 13 | var response = await RegisterService(email: email, password: password).registerTeacher(); 14 | if (response.success == true) { 15 | emit(CompletedRegisterState()); 16 | } else { 17 | emit(ErrorRegisterState(errorMessage: response)); 18 | } 19 | } else if (role == StringConstants.student) { 20 | var response = await RegisterService(email: email, password: password).registerStudent(); 21 | if (response.success == true) { 22 | emit(CompletedRegisterState()); 23 | } else { 24 | emit(ErrorRegisterState(errorMessage: response)); 25 | } 26 | } 27 | } catch (e) { 28 | emit(ErrorRegisterState(errorMessage: null)); 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /lib/view/auth/register/view-model/register/register_state.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/view/_product/enum/register/register_enum.dart'; 2 | import 'package:education_app_like_udemy/view/auth/register/model/register_response_model.dart'; 3 | 4 | abstract class IRegisterState { 5 | final RegisterEnum status; 6 | IRegisterState({ 7 | required this.status, 8 | }); 9 | } 10 | 11 | class InitialRegisterState extends IRegisterState { 12 | InitialRegisterState() : super(status: RegisterEnum.initial); 13 | } 14 | 15 | class LoadingRegisterState extends IRegisterState { 16 | LoadingRegisterState() : super(status: RegisterEnum.loading); 17 | } 18 | 19 | class CompletedRegisterState extends IRegisterState { 20 | CompletedRegisterState() : super(status: RegisterEnum.completed); 21 | } 22 | 23 | class ErrorRegisterState extends IRegisterState { 24 | final RegisterResponseModel? errorMessage; 25 | ErrorRegisterState({required this.errorMessage}) : super(status: RegisterEnum.error); 26 | } 27 | -------------------------------------------------------------------------------- /lib/view/auth/register/view-model/validation/validation_register_cubit.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_bloc/flutter_bloc.dart'; 3 | 4 | class ValidateRegisterCubit extends Cubit { 5 | ValidateRegisterCubit() : super(AutovalidateMode.disabled); 6 | 7 | void validateMode() { 8 | emit(AutovalidateMode.onUserInteraction); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /lib/view/auth/register/view-model/wait/waited_button.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter_bloc/flutter_bloc.dart'; 2 | 3 | class WaitedRegisterCubit extends Cubit { 4 | WaitedRegisterCubit() : super(false); 5 | 6 | void readOnlyTrue() { 7 | emit(true); 8 | } 9 | 10 | void readOnlyFalse() { 11 | emit(false); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /lib/view/auth/register/view/register_page.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/view/auth/register/view-model/register/register_cubit.dart'; 2 | import 'package:education_app_like_udemy/view/auth/register/view-model/validation/validation_register_cubit.dart'; 3 | import 'package:education_app_like_udemy/view/auth/register/view-model/wait/waited_button.dart'; 4 | import 'package:education_app_like_udemy/view/auth/register/view/register_view.dart'; 5 | import 'package:flutter/material.dart'; 6 | import 'package:flutter_bloc/flutter_bloc.dart'; 7 | 8 | class RegisterPage extends StatelessWidget { 9 | const RegisterPage({super.key, required this.role}); 10 | final String role; 11 | 12 | @override 13 | Widget build(BuildContext context) { 14 | return MultiBlocProvider( 15 | providers: [ 16 | BlocProvider(create: (context) => RegisterCubit()), 17 | BlocProvider(create: (context) => WaitedRegisterCubit()), 18 | BlocProvider(create: (context) => ValidateRegisterCubit()) 19 | ], 20 | child: RegisterView( 21 | role: role, 22 | )); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /lib/view/settings/view/setting_view.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/core/components/lisstile/changer_listtile_with_dropdown.dart'; 2 | import 'package:education_app_like_udemy/core/components/dropdown/theme_change_dropdown.dart'; 3 | import 'package:education_app_like_udemy/core/constants/icon/icon_constants.dart'; 4 | import 'package:education_app_like_udemy/main.dart'; 5 | import 'package:education_app_like_udemy/product/init/lang/locale_keys.g.dart'; 6 | import 'package:easy_localization/easy_localization.dart'; 7 | import 'package:flutter/material.dart'; 8 | 9 | class SettingView extends StatelessWidget { 10 | const SettingView({super.key}); 11 | 12 | @override 13 | Widget build(BuildContext context) { 14 | return Column(children: [ 15 | // theme listtile 16 | ChangerListtileWithDropdown( 17 | icon: IconConstants.themeIcon, 18 | title: LocaleKeys.themeTheme.tr(), 19 | alertTitle: LocaleKeys.themeThemeChoose.tr(), 20 | child: const ThemeChangeDropdown(), 21 | ), 22 | // localiziton listtile 23 | ChangerListtileWithDropdown( 24 | icon: IconConstants.localizationIcon, 25 | title: LocaleKeys.localizationAppLang.tr(), 26 | alertTitle: LocaleKeys.localizationLangChoose.tr(), 27 | child: changeLocalWithDropdown(context), 28 | ), 29 | ]); 30 | } 31 | 32 | DropdownButton changeLocalWithDropdown(BuildContext context) { 33 | return DropdownButton( 34 | value: context.locale, 35 | items: LocaleVariables.localItems(), 36 | onChanged: (value) { 37 | context.setLocale(value); 38 | Navigator.pop(context); 39 | }, 40 | ); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /lib/view/student/basket/model-view/get_basket_cubit.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/view/student/basket/model-view/get_basket_state.dart'; 2 | import 'package:education_app_like_udemy/view/student/basket/service/get_basket_repository.dart'; 3 | import 'package:flutter_bloc/flutter_bloc.dart'; 4 | 5 | class GetBasketCubit extends Cubit { 6 | GetBasketCubit() : super(GetBasketInitial()); 7 | 8 | Future getBasket() async { 9 | try { 10 | emit(GetBasketLoading()); 11 | print("sepete hic gelmiyor"); 12 | final response = await GetBasketRepository().getBasket(); 13 | 14 | print("sepete gelirken hata olusuyor"); 15 | 16 | if (response != null) { 17 | emit(GetBasketCompleted(response)); 18 | } else { 19 | emit(GetBasketError("sepetinizde ürün bulunmamaktadır")); 20 | } 21 | } catch (e) { 22 | emit(GetBasketError(e.toString())); 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /lib/view/student/basket/model-view/get_basket_state.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/view/_product/enum/get-course/get_course_enum.dart'; 2 | import 'package:education_app_like_udemy/view/student/basket/model/basket_model.dart'; 3 | import 'package:flutter/foundation.dart'; 4 | 5 | abstract class IGetBasketState { 6 | GetCourseEnum status; 7 | IGetBasketState({ 8 | required this.status, 9 | }); 10 | } 11 | 12 | class GetBasketInitial extends IGetBasketState { 13 | GetBasketInitial() : super(status: GetCourseEnum.initial); 14 | } 15 | 16 | class GetBasketLoading extends IGetBasketState { 17 | GetBasketLoading() : super(status: GetCourseEnum.loading); 18 | } 19 | 20 | class GetBasketCompleted extends IGetBasketState { 21 | final List basketList; 22 | GetBasketCompleted(this.basketList) : super(status: GetCourseEnum.completed); 23 | 24 | num getTotalPrice() { 25 | num totalPrice = 0; 26 | for (var i in basketList) { 27 | totalPrice = totalPrice + (i.coursePrice as num); 28 | } 29 | return totalPrice; 30 | } 31 | 32 | @override 33 | bool operator ==(Object other) { 34 | if (identical(this, other)) return true; 35 | 36 | return other is GetBasketCompleted && listEquals(other.basketList, basketList); 37 | } 38 | 39 | @override 40 | int get hashCode => basketList.hashCode; 41 | } 42 | 43 | class GetBasketError extends IGetBasketState { 44 | final String message; 45 | GetBasketError(this.message) : super(status: GetCourseEnum.error); 46 | } 47 | -------------------------------------------------------------------------------- /lib/view/student/home/service/course_repository.dart: -------------------------------------------------------------------------------- 1 | import 'dart:convert'; 2 | import 'dart:io'; 3 | 4 | import 'package:education_app_like_udemy/product/constants/api/api_constants.dart'; 5 | import 'package:education_app_like_udemy/view/student/home/model/course_model.dart'; 6 | import 'package:hive_flutter/hive_flutter.dart'; 7 | import 'package:http/http.dart' as http; 8 | 9 | class CourseRepository { 10 | final _token = Hive.box('token'); 11 | 12 | Future> getAllCourses() async { 13 | final token = _token.get('myToken'); 14 | print(token); 15 | const String link = "${ApiConstants.baseUrl}api/Course/GetAll?page=1"; 16 | print("bu kisma kadar sorun yok"); 17 | var c = await http.get( 18 | Uri.parse(link), 19 | headers: { 20 | 'Content-Type': 'application/json', 21 | 'Accept': 'application/json', 22 | HttpHeaders.authorizationHeader: 'Bearer $token', 23 | }, 24 | ); 25 | print("sanirim su kisimda sorun oldu"); 26 | print(c.body); 27 | var json = jsonDecode(c.body)["data"]["courses"] as List; 28 | // print(json); 29 | print(json[0]); 30 | return json.map((e) => Courses.fromJson(e)).toList(); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /lib/view/student/home/view-model/bottom-navbar/bottom_nav_index_cubit.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter_bloc/flutter_bloc.dart'; 2 | 3 | class BottomNavIndexCubit extends Cubit { 4 | BottomNavIndexCubit() : super(0); 5 | 6 | void changeBottomIndex(int index) { 7 | emit(index); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /lib/view/student/home/view-model/course-cubit/get_course_cubit.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/view/student/home/model/course_model.dart'; 2 | import 'package:education_app_like_udemy/view/student/home/service/course_repository.dart'; 3 | import 'package:education_app_like_udemy/view/student/home/view-model/course-cubit/get_course_state.dart'; 4 | import 'package:flutter_bloc/flutter_bloc.dart'; 5 | 6 | class GetCoursesCubit extends Cubit { 7 | GetCoursesCubit() : super(GetCourseInitialState()); 8 | 9 | void getAllCourses() async { 10 | try { 11 | emit(GetCourseLoadingState()); 12 | final List response = await CourseRepository().getAllCourses(); 13 | emit(GetCourseCompleted(response: response)); 14 | } catch (e) { 15 | emit(GetCourseErrorState(e.toString())); 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /lib/view/student/home/view-model/course-cubit/get_course_state.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/view/_product/enum/get-course/get_course_enum.dart'; 2 | import 'package:education_app_like_udemy/view/student/home/model/course_model.dart'; 3 | import 'package:flutter/foundation.dart'; 4 | 5 | abstract class IGetCourseState { 6 | GetCourseEnum status; 7 | IGetCourseState({ 8 | required this.status, 9 | }); 10 | } 11 | 12 | class GetCourseInitialState extends IGetCourseState { 13 | GetCourseInitialState() : super(status: GetCourseEnum.initial); 14 | } 15 | 16 | class GetCourseLoadingState extends IGetCourseState { 17 | GetCourseLoadingState() : super(status: GetCourseEnum.loading); 18 | } 19 | 20 | class GetCourseCompleted extends IGetCourseState { 21 | final List response; 22 | GetCourseCompleted({required this.response}) : super(status: GetCourseEnum.completed); 23 | 24 | @override 25 | bool operator ==(Object other) { 26 | if (identical(this, other)) return true; 27 | 28 | return other is GetCourseCompleted && listEquals(other.response, response); 29 | } 30 | 31 | @override 32 | int get hashCode => response.hashCode; 33 | } 34 | 35 | class GetCourseErrorState extends IGetCourseState { 36 | final String message; 37 | GetCourseErrorState(this.message) : super(status: GetCourseEnum.error); 38 | } 39 | -------------------------------------------------------------------------------- /lib/view/student/my-course/comment/view/comment_page.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class CommentPage extends StatelessWidget { 4 | const CommentPage({super.key, required this.id}); 5 | final int id; 6 | 7 | @override 8 | Widget build(BuildContext context) { 9 | return Scaffold(appBar: AppBar(), body: Text("$id")); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /lib/view/student/my-course/my-course-detail/service/my_course_detail_repository.dart: -------------------------------------------------------------------------------- 1 | import 'dart:convert'; 2 | import 'dart:io'; 3 | import 'package:education_app_like_udemy/view/student/product/product-detail/model/product_model.dart'; 4 | import 'package:hive/hive.dart'; 5 | import 'package:http/http.dart' as http; 6 | 7 | class MyCourseDeatilRepository { 8 | final _token = Hive.box('token'); 9 | 10 | Future getMyCourse({required id}) async { 11 | final token = _token.get('myToken'); 12 | final String link = "https://10.0.2.2:7278/api/Course/listCourse/$id"; 13 | var c = await http.get( 14 | Uri.parse(link), 15 | headers: { 16 | 'Content-Type': 'application/json', 17 | 'Accept': 'application/json', 18 | HttpHeaders.authorizationHeader: 'Bearer $token', 19 | }, 20 | ); 21 | 22 | var json = jsonDecode(c.body)["data"]; 23 | return ProductModel.fromJson(json); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /lib/view/student/my-course/my-course-detail/view-model/my_course_detail_cubit.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/view/student/my-course/my-course-detail/service/my_course_detail_repository.dart'; 2 | import 'package:education_app_like_udemy/view/student/my-course/my-course-detail/view-model/my_course_detail_state.dart'; 3 | import 'package:flutter_bloc/flutter_bloc.dart'; 4 | 5 | class MyCourseDetailCubit extends Cubit { 6 | MyCourseDetailCubit() : super(MyCourseDetailInitialState()); 7 | 8 | Future getMyCourseDeatil(int id) async { 9 | try { 10 | emit(MyCourseDetailLoadingState()); 11 | final response = await MyCourseDeatilRepository().getMyCourse(id: id); 12 | emit(MyCourseDetailCompletedState(response)); 13 | } catch (e) { 14 | emit(MyCourseDetailErrorState(e.toString())); 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /lib/view/student/my-course/my-course-detail/view-model/my_course_detail_state.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/view/_product/enum/get-course/get_course_enum.dart'; 2 | import 'package:education_app_like_udemy/view/student/product/product-detail/model/product_model.dart'; 3 | 4 | abstract class IMyCourseDetailState { 5 | GetCourseEnum status; 6 | IMyCourseDetailState({ 7 | required this.status, 8 | }); 9 | } 10 | 11 | class MyCourseDetailInitialState extends IMyCourseDetailState { 12 | MyCourseDetailInitialState() : super(status: GetCourseEnum.initial); 13 | } 14 | 15 | class MyCourseDetailLoadingState extends IMyCourseDetailState { 16 | MyCourseDetailLoadingState() : super(status: GetCourseEnum.loading); 17 | } 18 | 19 | class MyCourseDetailCompletedState extends IMyCourseDetailState { 20 | final ProductModel response; 21 | MyCourseDetailCompletedState(this.response) : super(status: GetCourseEnum.completed); 22 | } 23 | 24 | class MyCourseDetailErrorState extends IMyCourseDetailState { 25 | final String message; 26 | MyCourseDetailErrorState(this.message) : super(status: GetCourseEnum.error); 27 | } 28 | -------------------------------------------------------------------------------- /lib/view/student/my-course/my-courses/service/my_course_repository.dart: -------------------------------------------------------------------------------- 1 | import 'dart:convert'; 2 | import 'dart:io'; 3 | 4 | import 'package:education_app_like_udemy/view/student/basket/model/basket_model.dart'; 5 | import 'package:hive/hive.dart'; 6 | import 'package:http/http.dart' as http; 7 | 8 | class MyCourseRepository { 9 | final _token = Hive.box('token'); 10 | 11 | Future?>? getMyCourses() async { 12 | final token = _token.get('myToken'); 13 | const String link = "https://10.0.2.2:7278/api/Basket/listMyCourse"; 14 | var c = await http.get( 15 | Uri.parse(link), 16 | headers: { 17 | 'Content-Type': 'application/json', 18 | 'Accept': 'application/json', 19 | HttpHeaders.authorizationHeader: 'Bearer $token', 20 | }, 21 | ); 22 | 23 | print(c.body); 24 | 25 | if (jsonDecode(c.body)["data"] != null) { 26 | var json = jsonDecode(c.body)["data"] as List; 27 | print(json); 28 | return json.map((e) => Courses.fromJson(e)).toList(); 29 | } else { 30 | return null; 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /lib/view/student/my-course/my-courses/view-model/my_course_cubit.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/view/student/my-course/my-courses/service/my_course_repository.dart'; 2 | import 'package:education_app_like_udemy/view/student/my-course/my-courses/view-model/my_course_state.dart'; 3 | import 'package:flutter_bloc/flutter_bloc.dart'; 4 | 5 | class MyCourseCubit extends Cubit { 6 | MyCourseCubit() : super(MyCourseInitial()); 7 | 8 | Future getMyCourses() async { 9 | try { 10 | emit(MyCourseLoading()); 11 | final response = await MyCourseRepository().getMyCourses(); 12 | if (response != null) { 13 | emit(MyCourseCompleted(response)); 14 | } else { 15 | emit(MyCourseError("Kursunuz bulunmamakta")); 16 | } 17 | } catch (e) { 18 | emit(MyCourseError(e.toString())); 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /lib/view/student/my-course/my-courses/view-model/my_course_state.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/view/_product/enum/get-course/get_course_enum.dart'; 2 | import 'package:education_app_like_udemy/view/student/basket/model/basket_model.dart'; 3 | import 'package:flutter/foundation.dart'; 4 | 5 | abstract class IMyCourseState { 6 | GetCourseEnum status; 7 | IMyCourseState({required this.status}); 8 | } 9 | 10 | class MyCourseInitial extends IMyCourseState { 11 | MyCourseInitial() : super(status: GetCourseEnum.initial); 12 | } 13 | 14 | class MyCourseLoading extends IMyCourseState { 15 | MyCourseLoading() : super(status: GetCourseEnum.loading); 16 | } 17 | 18 | class MyCourseCompleted extends IMyCourseState { 19 | final List response; 20 | MyCourseCompleted(this.response) : super(status: GetCourseEnum.completed); 21 | 22 | @override 23 | bool operator ==(Object other) { 24 | if (identical(this, other)) return true; 25 | 26 | return other is MyCourseCompleted && listEquals(other.response, response); 27 | } 28 | 29 | @override 30 | int get hashCode => response.hashCode; 31 | } 32 | 33 | class MyCourseError extends IMyCourseState { 34 | final String message; 35 | MyCourseError(this.message) : super(status: GetCourseEnum.error); 36 | } 37 | -------------------------------------------------------------------------------- /lib/view/student/my-course/video/view/theme.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/core/init/theme/light/light_theme_custom.dart'; 2 | import 'package:flutter/material.dart'; 3 | 4 | class AppTheme { 5 | static final light = ThemeData( 6 | brightness: Brightness.light, 7 | useMaterial3: true, 8 | colorScheme: const ColorScheme.light(secondary: LightThemeColors.scarlet), 9 | disabledColor: Colors.grey.shade400, 10 | visualDensity: VisualDensity.adaptivePlatformDensity, 11 | ); 12 | 13 | static final dark = ThemeData( 14 | brightness: Brightness.dark, 15 | colorScheme: const ColorScheme.dark(secondary: LightThemeColors.scarlet), 16 | disabledColor: Colors.grey.shade400, 17 | useMaterial3: true, 18 | visualDensity: VisualDensity.adaptivePlatformDensity, 19 | ); 20 | } 21 | -------------------------------------------------------------------------------- /lib/view/student/my-course/video/view/video_page.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/core/components/text/text_title_large_normal.dart'; 2 | import 'package:education_app_like_udemy/core/extension/context/context_extension.dart'; 3 | import 'package:education_app_like_udemy/view/student/my-course/video/view/app.dart'; 4 | import 'package:flutter/material.dart'; 5 | 6 | class VideoPage extends StatelessWidget { 7 | const VideoPage({super.key, required this.url}); 8 | final String url; 9 | 10 | @override 11 | Widget build(BuildContext context) { 12 | return Scaffold( 13 | appBar: AppBar( 14 | title: const TextTitleLarge(text: "Video Page"), 15 | ), 16 | body: Padding( 17 | padding: const EdgeInsets.only(top: 50), 18 | child: SizedBox( 19 | height: 200, 20 | width: context.width, 21 | child: ChewieDemo(url: url), 22 | ), 23 | ), 24 | ); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /lib/view/student/payment/model/payment_card_model.dart: -------------------------------------------------------------------------------- 1 | class PaymentCardModel { 2 | String? cardHolderName; 3 | String? cardNumber; 4 | String? expireMonth; 5 | String? expireYear; 6 | String? cvc; 7 | 8 | PaymentCardModel({this.cardHolderName, this.cardNumber, this.expireMonth, this.expireYear, this.cvc}); 9 | 10 | PaymentCardModel.fromJson(Map json) { 11 | cardHolderName = json['cardHolderName']; 12 | cardNumber = json['cardNumber']; 13 | expireMonth = json['expireMonth']; 14 | expireYear = json['expireYear']; 15 | cvc = json['cvc']; 16 | } 17 | 18 | Map toJson() { 19 | final Map data = {}; 20 | data['cardHolderName'] = cardHolderName; 21 | data['cardNumber'] = cardNumber; 22 | data['expireMonth'] = expireMonth; 23 | data['expireYear'] = expireYear; 24 | data['cvc'] = cvc; 25 | return data; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /lib/view/student/product/add-basket/model-view/basket_cubit.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/view/student/product/add-basket/model-view/basket_state.dart'; 2 | import 'package:education_app_like_udemy/view/student/product/add-basket/service/basket_repository.dart'; 3 | import 'package:flutter_bloc/flutter_bloc.dart'; 4 | 5 | class AddBasketCubit extends Cubit { 6 | AddBasketCubit() : super(BasketInitialState()); 7 | 8 | Future addToBasket(int? courseId) async { 9 | try { 10 | emit(BasketLoadingState()); 11 | if (courseId != null) { 12 | await BasketRepository().adToBasket(courseId); 13 | 14 | emit(BasketCompletedState()); 15 | } else { 16 | emit(BasketErrorState("course id is null")); 17 | } 18 | } catch (e) { 19 | emit(BasketErrorState(e.toString())); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /lib/view/student/product/add-basket/model-view/basket_state.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/view/_product/enum/get-course/get_course_enum.dart'; 2 | 3 | abstract class IBasketState { 4 | GetCourseEnum status; 5 | IBasketState({ 6 | required this.status, 7 | }); 8 | } 9 | 10 | class BasketInitialState extends IBasketState { 11 | BasketInitialState() : super(status: GetCourseEnum.initial); 12 | } 13 | 14 | class BasketLoadingState extends IBasketState { 15 | BasketLoadingState() : super(status: GetCourseEnum.loading); 16 | } 17 | 18 | class BasketCompletedState extends IBasketState { 19 | BasketCompletedState() : super(status: GetCourseEnum.completed); 20 | } 21 | 22 | class BasketErrorState extends IBasketState { 23 | final String message; 24 | BasketErrorState(this.message) : super(status: GetCourseEnum.error); 25 | } 26 | -------------------------------------------------------------------------------- /lib/view/student/product/add-basket/service/basket_repository.dart: -------------------------------------------------------------------------------- 1 | import 'dart:io'; 2 | 3 | import 'package:hive/hive.dart'; 4 | import 'package:http/http.dart' as http; 5 | 6 | class BasketRepository { 7 | final _token = Hive.box('token'); 8 | 9 | adToBasket(int id) async { 10 | final token = _token.get('myToken'); 11 | final String link = "https://10.0.2.2:7278/api/Basket?courseId=$id"; 12 | var c = await http.post( 13 | Uri.parse(link), 14 | headers: { 15 | 'Content-Type': 'application/json', 16 | 'Accept': 'application/json', 17 | HttpHeaders.authorizationHeader: 'Bearer $token', 18 | }, 19 | ); 20 | print("sanirim su kisimda sorun oldu"); 21 | print(c.body); 22 | // var json = jsonDecode(c.body)["data"]["courses"] as List; 23 | // print(json); 24 | // print(json[0]); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /lib/view/student/product/product-detail/service/product_repository.dart: -------------------------------------------------------------------------------- 1 | import 'dart:convert'; 2 | import 'dart:io'; 3 | 4 | import 'package:education_app_like_udemy/view/student/product/product-detail/model/product_model.dart'; 5 | import 'package:hive_flutter/hive_flutter.dart'; 6 | import 'package:http/http.dart' as http; 7 | 8 | class ProductRepository { 9 | final _token = Hive.box('token'); 10 | 11 | Future getCourse({required id}) async { 12 | final token = _token.get('myToken'); 13 | final String link = "https://10.0.2.2:7278/api/Course/listCourse/$id"; 14 | var c = await http.get( 15 | Uri.parse(link), 16 | headers: { 17 | 'Content-Type': 'application/json', 18 | 'Accept': 'application/json', 19 | HttpHeaders.authorizationHeader: 'Bearer $token', 20 | }, 21 | ); 22 | 23 | print(c.body); 24 | 25 | var json = jsonDecode(c.body)["data"]; 26 | 27 | print(json); 28 | 29 | return ProductModel.fromJson(json); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /lib/view/student/product/product-detail/view-model/product_cubit.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/view/student/product/product-detail/model/product_model.dart'; 2 | import 'package:education_app_like_udemy/view/student/product/product-detail/service/product_repository.dart'; 3 | import 'package:education_app_like_udemy/view/student/product/product-detail/view-model/product_state.dart'; 4 | import 'package:flutter_bloc/flutter_bloc.dart'; 5 | 6 | class ProductDetailCubit extends Cubit { 7 | ProductDetailCubit() : super(ProductInitialState()); 8 | 9 | Future getProduct({required id}) async { 10 | try { 11 | emit(ProductLoadingState()); 12 | print("hata burada"); 13 | final ProductModel model = await ProductRepository().getCourse(id: id); 14 | print("peki ya burada "); 15 | emit(ProductCompletedState(model)); 16 | } catch (e) { 17 | emit(ProductErrorState()); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /lib/view/student/product/product-detail/view-model/product_state.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/view/_product/enum/get-course/get_course_enum.dart'; 2 | import 'package:education_app_like_udemy/view/student/product/product-detail/model/product_model.dart'; 3 | 4 | abstract class IProductState { 5 | GetCourseEnum status; 6 | IProductState({ 7 | required this.status, 8 | }); 9 | } 10 | 11 | class ProductInitialState extends IProductState { 12 | ProductInitialState() : super(status: GetCourseEnum.initial); 13 | } 14 | 15 | class ProductLoadingState extends IProductState { 16 | ProductLoadingState() : super(status: GetCourseEnum.loading); 17 | } 18 | 19 | class ProductCompletedState extends IProductState { 20 | final ProductModel model; 21 | ProductCompletedState(this.model) : super(status: GetCourseEnum.completed); 22 | } 23 | 24 | class ProductErrorState extends IProductState { 25 | ProductErrorState() : super(status: GetCourseEnum.error); 26 | } 27 | -------------------------------------------------------------------------------- /lib/view/student/search/service/search_repository.dart: -------------------------------------------------------------------------------- 1 | import 'dart:convert'; 2 | import 'dart:io'; 3 | 4 | import 'package:education_app_like_udemy/view/student/home/model/course_model.dart'; 5 | import 'package:hive_flutter/hive_flutter.dart'; 6 | import 'package:http/http.dart' as http; 7 | 8 | class SearchRepository { 9 | final _token = Hive.box('token'); 10 | 11 | Future?>? searchCourses({required String search}) async { 12 | final token = _token.get('myToken'); 13 | print(token); 14 | print("biz ne arariz $search"); 15 | final String link = "https://10.0.2.2:7278/api/Course/$search"; 16 | print("bu kisma kadar sorun yok"); 17 | var c = await http.get( 18 | Uri.parse(link), 19 | headers: { 20 | 'Content-Type': 'application/json', 21 | 'Accept': 'application/json', 22 | HttpHeaders.authorizationHeader: 'Bearer $token', 23 | }, 24 | ); 25 | var result = jsonDecode(c.body)["data"] as List; 26 | if (result.isEmpty) { 27 | print("evet bos"); 28 | return null; 29 | } else { 30 | print("aha sorun tam da burada"); 31 | var json = jsonDecode(c.body)["data"] as List; 32 | print(json); 33 | 34 | return json.map((e) => Courses.fromJson(e)).toList(); 35 | } 36 | // print(result); 37 | // print("sanirim su kisimda sorun oldu"); 38 | // print(c.body); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /lib/view/student/search/view-model/search_cubit.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/view/student/search/service/search_repository.dart'; 2 | import 'package:education_app_like_udemy/view/student/search/view-model/search_state.dart'; 3 | import 'package:flutter_bloc/flutter_bloc.dart'; 4 | 5 | class SearchCubit extends Cubit { 6 | SearchCubit() : super(SearchInitialState()); 7 | 8 | Future search(String search) async { 9 | try { 10 | print("cubite giriyor"); 11 | emit(SearchLoadingState()); 12 | final response = await SearchRepository().searchCourses(search: search); 13 | print("hele bakalım buraya gelir mi"); 14 | print(response); 15 | if (response == null) { 16 | emit(SearchErrorState("Aradığın şeye karşılık bir sonuç bulamadım")); 17 | } else { 18 | emit(SearchCompletedState(response)); 19 | } 20 | } catch (e) { 21 | print("hata nedir $e"); 22 | emit(SearchErrorState(e.toString())); 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /lib/view/student/search/view-model/search_state.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/view/_product/enum/search/search_enum.dart'; 2 | import 'package:education_app_like_udemy/view/student/home/model/course_model.dart'; 3 | import 'package:education_app_like_udemy/view/student/home/view-model/course-cubit/get_course_state.dart'; 4 | import 'package:flutter/foundation.dart'; 5 | 6 | abstract class ISearchState { 7 | EnumSearch status; 8 | ISearchState({ 9 | required this.status, 10 | }); 11 | } 12 | 13 | class SearchInitialState extends ISearchState { 14 | SearchInitialState() : super(status: EnumSearch.initial); 15 | } 16 | 17 | class SearchLoadingState extends ISearchState { 18 | SearchLoadingState() : super(status: EnumSearch.loading); 19 | } 20 | 21 | class SearchCompletedState extends ISearchState { 22 | final List responseList; 23 | SearchCompletedState(this.responseList) : super(status: EnumSearch.completed); 24 | 25 | @override 26 | bool operator ==(Object other) { 27 | if (identical(this, other)) return true; 28 | 29 | return other is GetCourseCompleted && listEquals(other.response, responseList); 30 | } 31 | 32 | @override 33 | int get hashCode => responseList.hashCode; 34 | } 35 | 36 | class SearchErrorState extends ISearchState { 37 | final String message; 38 | SearchErrorState(this.message) : super(status: EnumSearch.error); 39 | } 40 | -------------------------------------------------------------------------------- /lib/view/teacher/home/service/teacher_repository.dart: -------------------------------------------------------------------------------- 1 | import 'dart:convert'; 2 | import 'dart:io'; 3 | import 'package:education_app_like_udemy/view/student/basket/model/basket_model.dart'; 4 | import 'package:hive/hive.dart'; 5 | import 'package:http/http.dart' as http; 6 | 7 | class TeacherRepository { 8 | final Box _token = Hive.box('token'); 9 | 10 | Future> getAllCourses() async { 11 | final String token = _token.get('myToken'); 12 | const String link = "https://10.0.2.2:7278/api/teacher"; 13 | var c = await http.get( 14 | Uri.parse(link), 15 | headers: { 16 | 'Content-Type': 'application/json', 17 | 'Accept': 'application/json', 18 | HttpHeaders.authorizationHeader: 'Bearer $token', 19 | }, 20 | ); 21 | List json = jsonDecode(c.body)["data"] as List; 22 | return json.map((e) => Courses.fromJson(e)).toList(); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /lib/view/teacher/home/view-model/bottom-navigation-bar/bottom_nav_index_cubit_teacher.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter_bloc/flutter_bloc.dart'; 2 | 3 | class BottomNavIndexCubitTeacher extends Cubit { 4 | BottomNavIndexCubitTeacher() : super(0); 5 | 6 | void changeBottomIndex(int index) { 7 | emit(index); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /lib/view/teacher/home/view-model/course/teacher_courses_cubit.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/view/student/basket/model/basket_model.dart'; 2 | import 'package:education_app_like_udemy/view/teacher/home/service/teacher_repository.dart'; 3 | import 'package:education_app_like_udemy/view/teacher/home/view-model/course/teacher_courses_state.dart'; 4 | import 'package:flutter_bloc/flutter_bloc.dart'; 5 | 6 | class TeacherCoursesCubit extends Cubit { 7 | TeacherCoursesCubit() : super(TeacherCoursesInitialState()); 8 | 9 | Future getMyCourses() async { 10 | try { 11 | emit(TeacherCoursesLoadingState()); 12 | List response = await TeacherRepository().getAllCourses(); 13 | // List response = []; 14 | if (response.isNotEmpty) { 15 | emit(TeacherCoursesCompletedState(response)); 16 | } else { 17 | emit(TeacherCoursesErrorState('kurs bulunamadi')); 18 | } 19 | } catch (e) { 20 | emit(TeacherCoursesErrorState(e.toString())); 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /lib/view/teacher/home/view-model/course/teacher_courses_state.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/view/_product/enum/get-course/get_course_enum.dart'; 2 | import 'package:education_app_like_udemy/view/student/basket/model/basket_model.dart'; 3 | import 'package:flutter/foundation.dart'; 4 | 5 | abstract class ITeacherCoursesState { 6 | GetCourseEnum status; 7 | ITeacherCoursesState({ 8 | required this.status, 9 | }); 10 | } 11 | 12 | class TeacherCoursesInitialState extends ITeacherCoursesState { 13 | TeacherCoursesInitialState() : super(status: GetCourseEnum.initial); 14 | } 15 | 16 | class TeacherCoursesLoadingState extends ITeacherCoursesState { 17 | TeacherCoursesLoadingState() : super(status: GetCourseEnum.loading); 18 | } 19 | 20 | class TeacherCoursesCompletedState extends ITeacherCoursesState { 21 | final List response; 22 | TeacherCoursesCompletedState(this.response) : super(status: GetCourseEnum.completed); 23 | 24 | @override 25 | bool operator ==(Object other) { 26 | if (identical(this, other)) return true; 27 | 28 | return other is TeacherCoursesCompletedState && listEquals(other.response, response); 29 | } 30 | 31 | @override 32 | int get hashCode => response.hashCode; 33 | } 34 | 35 | class TeacherCoursesErrorState extends ITeacherCoursesState { 36 | final String message; 37 | TeacherCoursesErrorState(this.message) : super(status: GetCourseEnum.error); 38 | } 39 | -------------------------------------------------------------------------------- /lib/view/teacher/product/add-course/model/add_course_model.dart: -------------------------------------------------------------------------------- 1 | class AddCourseModel { 2 | String? courseName; 3 | String? courseDescription; 4 | String? imageUrl; 5 | num? coursePrice; 6 | int? categoryId; 7 | 8 | AddCourseModel({this.courseName, this.courseDescription, this.imageUrl, this.coursePrice, this.categoryId}); 9 | 10 | AddCourseModel.fromJson(Map json) { 11 | courseName = json['courseName']; 12 | courseDescription = json['courseDescription']; 13 | imageUrl = json['imageUrl']; 14 | coursePrice = json['coursePrice']; 15 | categoryId = json['categoryId']; 16 | } 17 | 18 | Map toJson() { 19 | final Map data = {}; 20 | data['courseName'] = courseName; 21 | data['courseDescription'] = courseDescription; 22 | data['imageUrl'] = imageUrl; 23 | data['coursePrice'] = coursePrice; 24 | data['categoryId'] = categoryId; 25 | return data; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /lib/view/teacher/product/add-course/service/add_course_service.dart: -------------------------------------------------------------------------------- 1 | import 'dart:convert'; 2 | import 'dart:io'; 3 | import 'package:education_app_like_udemy/view/teacher/product/add-course/model/add_course_model.dart'; 4 | import 'package:hive/hive.dart'; 5 | import 'package:http/http.dart' as http; 6 | 7 | class AddCourseService { 8 | final Box _token = Hive.box('token'); 9 | 10 | addCourse({required AddCourseModel addCourseModel}) async { 11 | var body = jsonEncode(addCourseModel.toJson()); 12 | final String token = _token.get('myToken'); 13 | 14 | const String link = "https://10.0.2.2:7278/api/Course/addCourse"; 15 | var c = await http.post(Uri.parse(link), 16 | headers: { 17 | 'Content-Type': 'application/json', 18 | 'Accept': 'application/json', 19 | HttpHeaders.authorizationHeader: 'Bearer $token', 20 | }, 21 | body: body); 22 | print(c.body); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /lib/view/teacher/product/add-course/view-model/add_course_cubit.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/view/teacher/product/add-course/model/add_course_model.dart'; 2 | import 'package:education_app_like_udemy/view/teacher/product/add-course/service/add_course_service.dart'; 3 | import 'package:education_app_like_udemy/view/teacher/product/add-course/view-model/add_course_state.dart'; 4 | import 'package:flutter_bloc/flutter_bloc.dart'; 5 | 6 | class AddCourseCubit extends Cubit { 7 | AddCourseCubit() : super(AddCourseInitialState()); 8 | 9 | Future addCourse({required AddCourseModel addCourseModel}) async { 10 | try { 11 | emit(AddCourseLoadingState()); 12 | await AddCourseService().addCourse(addCourseModel: addCourseModel); 13 | emit(AddCourseCompletedState()); 14 | } catch (e) { 15 | emit(AddCourseErrorState()); 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /lib/view/teacher/product/add-course/view-model/add_course_state.dart: -------------------------------------------------------------------------------- 1 | abstract class IAddCourseState {} 2 | 3 | class AddCourseInitialState extends IAddCourseState { 4 | AddCourseInitialState() : super(); 5 | } 6 | 7 | class AddCourseLoadingState extends IAddCourseState { 8 | AddCourseLoadingState() : super(); 9 | } 10 | 11 | class AddCourseCompletedState extends IAddCourseState { 12 | AddCourseCompletedState() : super(); 13 | } 14 | 15 | class AddCourseErrorState extends IAddCourseState { 16 | AddCourseErrorState() : super(); 17 | } 18 | -------------------------------------------------------------------------------- /lib/view/teacher/product/change-image/picker/pick_image.dart: -------------------------------------------------------------------------------- 1 | import 'dart:io'; 2 | import 'package:image_picker/image_picker.dart'; 3 | 4 | class PickImage { 5 | pickImage() async { 6 | final ImagePicker picker = ImagePicker(); 7 | try { 8 | var image = await picker.pickImage(source: ImageSource.gallery); 9 | 10 | final File file = File(image!.path); 11 | return image.path; 12 | } catch (e) { 13 | print(e); 14 | } 15 | return null; 16 | } 17 | } 18 | 19 | class PickVideo { 20 | pickVideo() async { 21 | final ImagePicker picker = ImagePicker(); 22 | try { 23 | var image = await picker.pickVideo(source: ImageSource.gallery); 24 | final File file = File(image!.path); 25 | return image.path; 26 | } catch (e) { 27 | print(e); 28 | } 29 | return null; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /lib/view/teacher/product/curriculum/model/curriculum_model.dart: -------------------------------------------------------------------------------- 1 | class CurriculumModel { 2 | String? publishId; 3 | String? videoName; 4 | String? videoUrl; 5 | String? title; 6 | String? description; 7 | int? courseID; 8 | 9 | CurriculumModel({this.publishId, this.videoName, this.videoUrl, this.title, this.description, this.courseID}); 10 | 11 | CurriculumModel.fromJson(Map json) { 12 | publishId = json['publishId']; 13 | videoName = json['videoName']; 14 | videoUrl = json['videoUrl']; 15 | title = json['title']; 16 | description = json['description']; 17 | courseID = json['courseID']; 18 | } 19 | 20 | Map toJson() { 21 | final Map data = {}; 22 | data['publishId'] = publishId; 23 | data['videoName'] = videoName; 24 | data['videoUrl'] = videoUrl; 25 | data['title'] = title; 26 | data['description'] = description; 27 | data['courseID'] = courseID; 28 | return data; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /lib/view/teacher/product/curriculum/service/curriculum_service.dart: -------------------------------------------------------------------------------- 1 | import 'dart:convert'; 2 | import 'dart:io'; 3 | 4 | import 'package:education_app_like_udemy/view/teacher/product/curriculum/model/curriculum_model.dart'; 5 | import 'package:hive/hive.dart'; 6 | import 'package:http/http.dart' as http; 7 | 8 | class CirruculumService { 9 | final Box _token = Hive.box('token'); 10 | 11 | addCirruculum(CurriculumModel model) async { 12 | Map mapim = { 13 | "publishId": "string", 14 | "videoName": "string", 15 | "videoUrl": "string", 16 | "title": "string", 17 | "description": "string", 18 | "courseID": 1033 19 | }; 20 | var jsonhali = jsonEncode(mapim); 21 | var sonhal = jsonDecode(jsonhali); 22 | final String token = _token.get('myToken'); 23 | String link = "https://10.0.2.2:7278/api/Curriculum/createCurri"; 24 | var c = await http.post( 25 | Uri.parse(link), 26 | headers: { 27 | 'Content-Type': 'application/json', 28 | 'Accept': 'application/json', 29 | HttpHeaders.authorizationHeader: 'Bearer $token', 30 | }, 31 | body: jsonEncode(model.toJson()), 32 | ); 33 | print(c.body); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /lib/view/teacher/product/curriculum/view-model/add_curriculum_cubit.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/view/teacher/product/curriculum/model/curriculum_model.dart'; 2 | import 'package:education_app_like_udemy/view/teacher/product/curriculum/service/curriculum_service.dart'; 3 | import 'package:education_app_like_udemy/view/teacher/product/curriculum/view-model/add_curriculum_state.dart'; 4 | import 'package:flutter_bloc/flutter_bloc.dart'; 5 | 6 | class AddCurriculumCubit extends Cubit { 7 | AddCurriculumCubit() : super(AddCurriculumInitialState()); 8 | 9 | Future addCurriculum(CurriculumModel model) async { 10 | try { 11 | emit(AddCurriculumLoadingState()); 12 | await CirruculumService().addCirruculum(model); 13 | emit(AddCurriculumCompletedState()); 14 | } catch (e) { 15 | emit(AddCurriculumErrorState()); 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /lib/view/teacher/product/curriculum/view-model/add_curriculum_state.dart: -------------------------------------------------------------------------------- 1 | abstract class IAddCurriculumState {} 2 | 3 | class AddCurriculumInitialState extends IAddCurriculumState {} 4 | 5 | class AddCurriculumLoadingState extends IAddCurriculumState {} 6 | 7 | class AddCurriculumCompletedState extends IAddCurriculumState {} 8 | 9 | class AddCurriculumErrorState extends IAddCurriculumState {} 10 | -------------------------------------------------------------------------------- /lib/view/teacher/product/curriculum/view/add_curriculum_page.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/view/teacher/product/curriculum/view-model/add_curriculum_cubit.dart'; 2 | import 'package:education_app_like_udemy/view/teacher/product/curriculum/view/add_cirruculum_view.dart'; 3 | import 'package:flutter/material.dart'; 4 | import 'package:flutter_bloc/flutter_bloc.dart'; 5 | 6 | class AddCurriculumPage extends StatelessWidget { 7 | const AddCurriculumPage({super.key, required this.id}); 8 | final int id; 9 | @override 10 | Widget build(BuildContext context) { 11 | return MultiBlocProvider( 12 | providers: [ 13 | BlocProvider(create: (context) => AddCurriculumCubit()), 14 | ], 15 | child: AddCurriculumView(id: id), 16 | ); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /lib/view/teacher/product/product-detail/service/teacher_course_detail_repository.dart: -------------------------------------------------------------------------------- 1 | import 'dart:convert'; 2 | import 'dart:io'; 3 | import 'package:education_app_like_udemy/view/teacher/product/product-detail/model/teacher_product_model.dart'; 4 | import 'package:hive_flutter/hive_flutter.dart'; 5 | import 'package:http/http.dart' as http; 6 | 7 | class TeacherCourseDeatilRepository { 8 | final _token = Hive.box('token'); 9 | 10 | Future getTeacherCourse({required id}) async { 11 | final token = _token.get('myToken'); 12 | final String link = "https://10.0.2.2:7278/api/Course/listCourse/$id"; 13 | var c = await http.get( 14 | Uri.parse(link), 15 | headers: { 16 | 'Content-Type': 'application/json', 17 | 'Accept': 'application/json', 18 | HttpHeaders.authorizationHeader: 'Bearer $token', 19 | }, 20 | ); 21 | 22 | var json = jsonDecode(c.body)["data"]; 23 | return TeacherProductModel.fromJson(json); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /lib/view/teacher/product/product-detail/view-model/teacher_course_detail_cubit.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/view/teacher/product/product-detail/service/teacher_course_detail_repository.dart'; 2 | import 'package:education_app_like_udemy/view/teacher/product/product-detail/view-model/teacher_course_detail_state.dart'; 3 | import 'package:flutter_bloc/flutter_bloc.dart'; 4 | 5 | class TeahcerCourseDetailCubit extends Cubit { 6 | TeahcerCourseDetailCubit() : super(TeacherCourseDetailInitialState()); 7 | 8 | Future getTeacherCourse({required int courseId}) async { 9 | try { 10 | emit(TeacherCourseDetailLoadingState()); 11 | var response = await TeacherCourseDeatilRepository().getTeacherCourse(id: courseId); 12 | emit(TeacherCourseDetailCompletedState(response)); 13 | } catch (e) { 14 | emit(TeacherCourseDetailErrorState(e.toString())); 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /lib/view/teacher/product/product-detail/view-model/teacher_course_detail_state.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/view/_product/enum/get-course/get_course_enum.dart'; 2 | import 'package:education_app_like_udemy/view/teacher/product/product-detail/model/teacher_product_model.dart'; 3 | 4 | abstract class ITeacherCourseDetailState { 5 | GetCourseEnum status; 6 | ITeacherCourseDetailState({ 7 | required this.status, 8 | }); 9 | } 10 | 11 | class TeacherCourseDetailInitialState extends ITeacherCourseDetailState { 12 | TeacherCourseDetailInitialState() : super(status: GetCourseEnum.initial); 13 | } 14 | 15 | class TeacherCourseDetailLoadingState extends ITeacherCourseDetailState { 16 | TeacherCourseDetailLoadingState() : super(status: GetCourseEnum.loading); 17 | } 18 | 19 | class TeacherCourseDetailCompletedState extends ITeacherCourseDetailState { 20 | final TeacherProductModel response; 21 | TeacherCourseDetailCompletedState(this.response) : super(status: GetCourseEnum.completed); 22 | } 23 | 24 | class TeacherCourseDetailErrorState extends ITeacherCourseDetailState { 25 | final String message; 26 | TeacherCourseDetailErrorState(this.message) : super(status: GetCourseEnum.error); 27 | } 28 | -------------------------------------------------------------------------------- /lib/view/teacher/product/remove-product/service/delete_course_service.dart: -------------------------------------------------------------------------------- 1 | import 'dart:io'; 2 | 3 | import 'package:hive_flutter/hive_flutter.dart'; 4 | import 'package:http/http.dart' as http; 5 | 6 | class DeleteCourseService { 7 | final Box _token = Hive.box('token'); 8 | 9 | deleteCourseById(int id) async { 10 | final String token = _token.get('myToken'); 11 | String link = "https://10.0.2.2:7278/api/Course?id=$id"; 12 | var c = await http.delete( 13 | Uri.parse(link), 14 | headers: { 15 | 'Content-Type': 'application/json', 16 | 'Accept': 'application/json', 17 | HttpHeaders.authorizationHeader: 'Bearer $token', 18 | }, 19 | ); 20 | print(c.body); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /lib/view/teacher/product/remove-product/view-model/delete_course_cubit.dart: -------------------------------------------------------------------------------- 1 | import 'package:education_app_like_udemy/view/teacher/product/remove-product/service/delete_course_service.dart'; 2 | import 'package:education_app_like_udemy/view/teacher/product/remove-product/view-model/delete_course_state.dart'; 3 | import 'package:flutter_bloc/flutter_bloc.dart'; 4 | 5 | class DeleteCourseCubit extends Cubit { 6 | DeleteCourseCubit() : super(DeleteCourseInitialState()); 7 | 8 | Future deleteCourse(int id) async { 9 | try { 10 | emit(DeleteCourseLodingState()); 11 | await DeleteCourseService().deleteCourseById(id); 12 | emit(DeleteCourseCompletedState()); 13 | } catch (e) { 14 | emit(DeleteCourseErrorState()); 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /lib/view/teacher/product/remove-product/view-model/delete_course_state.dart: -------------------------------------------------------------------------------- 1 | abstract class IDeleteCourseState {} 2 | 3 | class DeleteCourseInitialState extends IDeleteCourseState {} 4 | 5 | class DeleteCourseLodingState extends IDeleteCourseState {} 6 | 7 | class DeleteCourseCompletedState extends IDeleteCourseState {} 8 | 9 | class DeleteCourseErrorState extends IDeleteCourseState {} 10 | -------------------------------------------------------------------------------- /linux/.gitignore: -------------------------------------------------------------------------------- 1 | flutter/ephemeral 2 | -------------------------------------------------------------------------------- /linux/flutter/generated_plugin_registrant.cc: -------------------------------------------------------------------------------- 1 | // 2 | // Generated file. Do not edit. 3 | // 4 | 5 | // clang-format off 6 | 7 | #include "generated_plugin_registrant.h" 8 | 9 | 10 | void fl_register_plugins(FlPluginRegistry* registry) { 11 | } 12 | -------------------------------------------------------------------------------- /linux/flutter/generated_plugin_registrant.h: -------------------------------------------------------------------------------- 1 | // 2 | // Generated file. Do not edit. 3 | // 4 | 5 | // clang-format off 6 | 7 | #ifndef GENERATED_PLUGIN_REGISTRANT_ 8 | #define GENERATED_PLUGIN_REGISTRANT_ 9 | 10 | #include 11 | 12 | // Registers Flutter plugins. 13 | void fl_register_plugins(FlPluginRegistry* registry); 14 | 15 | #endif // GENERATED_PLUGIN_REGISTRANT_ 16 | -------------------------------------------------------------------------------- /linux/flutter/generated_plugins.cmake: -------------------------------------------------------------------------------- 1 | # 2 | # Generated file, do not edit. 3 | # 4 | 5 | list(APPEND FLUTTER_PLUGIN_LIST 6 | ) 7 | 8 | list(APPEND FLUTTER_FFI_PLUGIN_LIST 9 | ) 10 | 11 | set(PLUGIN_BUNDLED_LIBRARIES) 12 | 13 | foreach(plugin ${FLUTTER_PLUGIN_LIST}) 14 | add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin}) 15 | target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) 16 | list(APPEND PLUGIN_BUNDLED_LIBRARIES $) 17 | list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) 18 | endforeach(plugin) 19 | 20 | foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) 21 | add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin}) 22 | list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) 23 | endforeach(ffi_plugin) 24 | -------------------------------------------------------------------------------- /linux/main.cc: -------------------------------------------------------------------------------- 1 | #include "my_application.h" 2 | 3 | int main(int argc, char** argv) { 4 | g_autoptr(MyApplication) app = my_application_new(); 5 | return g_application_run(G_APPLICATION(app), argc, argv); 6 | } 7 | -------------------------------------------------------------------------------- /linux/my_application.h: -------------------------------------------------------------------------------- 1 | #ifndef FLUTTER_MY_APPLICATION_H_ 2 | #define FLUTTER_MY_APPLICATION_H_ 3 | 4 | #include 5 | 6 | G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, 7 | GtkApplication) 8 | 9 | /** 10 | * my_application_new: 11 | * 12 | * Creates a new Flutter-based application. 13 | * 14 | * Returns: a new #MyApplication. 15 | */ 16 | MyApplication* my_application_new(); 17 | 18 | #endif // FLUTTER_MY_APPLICATION_H_ 19 | -------------------------------------------------------------------------------- /macos/.gitignore: -------------------------------------------------------------------------------- 1 | # Flutter-related 2 | **/Flutter/ephemeral/ 3 | **/Pods/ 4 | 5 | # Xcode-related 6 | **/dgph 7 | **/xcuserdata/ 8 | -------------------------------------------------------------------------------- /macos/Flutter/Flutter-Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "ephemeral/Flutter-Generated.xcconfig" 2 | -------------------------------------------------------------------------------- /macos/Flutter/Flutter-Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include "ephemeral/Flutter-Generated.xcconfig" 2 | -------------------------------------------------------------------------------- /macos/Flutter/GeneratedPluginRegistrant.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Generated file. Do not edit. 3 | // 4 | 5 | import FlutterMacOS 6 | import Foundation 7 | 8 | import path_provider_foundation 9 | import shared_preferences_foundation 10 | import wakelock_macos 11 | 12 | func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { 13 | PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) 14 | SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) 15 | WakelockMacosPlugin.register(with: registry.registrar(forPlugin: "WakelockMacosPlugin")) 16 | } 17 | -------------------------------------------------------------------------------- /macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /macos/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /macos/Runner/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import Cocoa 2 | import FlutterMacOS 3 | 4 | @NSApplicationMain 5 | class AppDelegate: FlutterAppDelegate { 6 | override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { 7 | return true 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "16x16", 5 | "idiom" : "mac", 6 | "filename" : "app_icon_16.png", 7 | "scale" : "1x" 8 | }, 9 | { 10 | "size" : "16x16", 11 | "idiom" : "mac", 12 | "filename" : "app_icon_32.png", 13 | "scale" : "2x" 14 | }, 15 | { 16 | "size" : "32x32", 17 | "idiom" : "mac", 18 | "filename" : "app_icon_32.png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "32x32", 23 | "idiom" : "mac", 24 | "filename" : "app_icon_64.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "128x128", 29 | "idiom" : "mac", 30 | "filename" : "app_icon_128.png", 31 | "scale" : "1x" 32 | }, 33 | { 34 | "size" : "128x128", 35 | "idiom" : "mac", 36 | "filename" : "app_icon_256.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "256x256", 41 | "idiom" : "mac", 42 | "filename" : "app_icon_256.png", 43 | "scale" : "1x" 44 | }, 45 | { 46 | "size" : "256x256", 47 | "idiom" : "mac", 48 | "filename" : "app_icon_512.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "512x512", 53 | "idiom" : "mac", 54 | "filename" : "app_icon_512.png", 55 | "scale" : "1x" 56 | }, 57 | { 58 | "size" : "512x512", 59 | "idiom" : "mac", 60 | "filename" : "app_icon_1024.png", 61 | "scale" : "2x" 62 | } 63 | ], 64 | "info" : { 65 | "version" : 1, 66 | "author" : "xcode" 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png -------------------------------------------------------------------------------- /macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png -------------------------------------------------------------------------------- /macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png -------------------------------------------------------------------------------- /macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png -------------------------------------------------------------------------------- /macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png -------------------------------------------------------------------------------- /macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png -------------------------------------------------------------------------------- /macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png -------------------------------------------------------------------------------- /macos/Runner/Configs/AppInfo.xcconfig: -------------------------------------------------------------------------------- 1 | // Application-level settings for the Runner target. 2 | // 3 | // This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the 4 | // future. If not, the values below would default to using the project name when this becomes a 5 | // 'flutter create' template. 6 | 7 | // The application's name. By default this is also the title of the Flutter window. 8 | PRODUCT_NAME = education_app_like_udemy 9 | 10 | // The application's bundle identifier 11 | PRODUCT_BUNDLE_IDENTIFIER = com.example.basicRequirementsPackage 12 | 13 | // The copyright displayed in application information 14 | PRODUCT_COPYRIGHT = Copyright © 2023 com.example. All rights reserved. 15 | -------------------------------------------------------------------------------- /macos/Runner/Configs/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "../../Flutter/Flutter-Debug.xcconfig" 2 | #include "Warnings.xcconfig" 3 | -------------------------------------------------------------------------------- /macos/Runner/Configs/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include "../../Flutter/Flutter-Release.xcconfig" 2 | #include "Warnings.xcconfig" 3 | -------------------------------------------------------------------------------- /macos/Runner/Configs/Warnings.xcconfig: -------------------------------------------------------------------------------- 1 | WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings 2 | GCC_WARN_UNDECLARED_SELECTOR = YES 3 | CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES 4 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE 5 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES 6 | CLANG_WARN_PRAGMA_PACK = YES 7 | CLANG_WARN_STRICT_PROTOTYPES = YES 8 | CLANG_WARN_COMMA = YES 9 | GCC_WARN_STRICT_SELECTOR_MATCH = YES 10 | CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES 11 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES 12 | GCC_WARN_SHADOW = YES 13 | CLANG_WARN_UNREACHABLE_CODE = YES 14 | -------------------------------------------------------------------------------- /macos/Runner/DebugProfile.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.cs.allow-jit 8 | 9 | com.apple.security.network.server 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /macos/Runner/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | $(FLUTTER_BUILD_NAME) 21 | CFBundleVersion 22 | $(FLUTTER_BUILD_NUMBER) 23 | LSMinimumSystemVersion 24 | $(MACOSX_DEPLOYMENT_TARGET) 25 | NSHumanReadableCopyright 26 | $(PRODUCT_COPYRIGHT) 27 | NSMainNibFile 28 | MainMenu 29 | NSPrincipalClass 30 | NSApplication 31 | 32 | 33 | -------------------------------------------------------------------------------- /macos/Runner/MainFlutterWindow.swift: -------------------------------------------------------------------------------- 1 | import Cocoa 2 | import FlutterMacOS 3 | 4 | class MainFlutterWindow: NSWindow { 5 | override func awakeFromNib() { 6 | let flutterViewController = FlutterViewController.init() 7 | let windowFrame = self.frame 8 | self.contentViewController = flutterViewController 9 | self.setFrame(windowFrame, display: true) 10 | 11 | RegisterGeneratedPlugins(registry: flutterViewController) 12 | 13 | super.awakeFromNib() 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /macos/Runner/Release.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /test/widget_test.dart: -------------------------------------------------------------------------------- 1 | // This is a basic Flutter widget test. 2 | // 3 | // To perform an interaction with a widget in your test, use the WidgetTester 4 | // utility in the flutter_test package. For example, you can send tap and scroll 5 | // gestures. You can also use WidgetTester to find child widgets in the widget 6 | // tree, read text, and verify that the values of widget properties are correct. 7 | 8 | import 'package:education_app_like_udemy/app.dart'; 9 | import 'package:flutter/material.dart'; 10 | import 'package:flutter_test/flutter_test.dart'; 11 | 12 | void main() { 13 | testWidgets('Counter increments smoke test', (WidgetTester tester) async { 14 | // Build our app and trigger a frame. 15 | await tester.pumpWidget(const MyApp()); 16 | 17 | // Verify that our counter starts at 0. 18 | expect(find.text('0'), findsOneWidget); 19 | expect(find.text('1'), findsNothing); 20 | 21 | // Tap the '+' icon and trigger a frame. 22 | await tester.tap(find.byIcon(Icons.add)); 23 | await tester.pump(); 24 | 25 | // Verify that our counter has incremented. 26 | expect(find.text('0'), findsNothing); 27 | expect(find.text('1'), findsOneWidget); 28 | }); 29 | } 30 | -------------------------------------------------------------------------------- /web/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/web/favicon.png -------------------------------------------------------------------------------- /web/icons/Icon-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/web/icons/Icon-192.png -------------------------------------------------------------------------------- /web/icons/Icon-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/web/icons/Icon-512.png -------------------------------------------------------------------------------- /web/icons/Icon-maskable-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/web/icons/Icon-maskable-192.png -------------------------------------------------------------------------------- /web/icons/Icon-maskable-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/web/icons/Icon-maskable-512.png -------------------------------------------------------------------------------- /web/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "education_app_like_udemy", 3 | "short_name": "education_app_like_udemy", 4 | "start_url": ".", 5 | "display": "standalone", 6 | "background_color": "#0175C2", 7 | "theme_color": "#0175C2", 8 | "description": "A new Flutter project.", 9 | "orientation": "portrait-primary", 10 | "prefer_related_applications": false, 11 | "icons": [ 12 | { 13 | "src": "icons/Icon-192.png", 14 | "sizes": "192x192", 15 | "type": "image/png" 16 | }, 17 | { 18 | "src": "icons/Icon-512.png", 19 | "sizes": "512x512", 20 | "type": "image/png" 21 | }, 22 | { 23 | "src": "icons/Icon-maskable-192.png", 24 | "sizes": "192x192", 25 | "type": "image/png", 26 | "purpose": "maskable" 27 | }, 28 | { 29 | "src": "icons/Icon-maskable-512.png", 30 | "sizes": "512x512", 31 | "type": "image/png", 32 | "purpose": "maskable" 33 | } 34 | ] 35 | } 36 | -------------------------------------------------------------------------------- /windows/.gitignore: -------------------------------------------------------------------------------- 1 | flutter/ephemeral/ 2 | 3 | # Visual Studio user-specific files. 4 | *.suo 5 | *.user 6 | *.userosscache 7 | *.sln.docstates 8 | 9 | # Visual Studio build-related files. 10 | x64/ 11 | x86/ 12 | 13 | # Visual Studio cache files 14 | # files ending in .cache can be ignored 15 | *.[Cc]ache 16 | # but keep track of directories ending in .cache 17 | !*.[Cc]ache/ 18 | -------------------------------------------------------------------------------- /windows/flutter/generated_plugin_registrant.cc: -------------------------------------------------------------------------------- 1 | // 2 | // Generated file. Do not edit. 3 | // 4 | 5 | // clang-format off 6 | 7 | #include "generated_plugin_registrant.h" 8 | 9 | 10 | void RegisterPlugins(flutter::PluginRegistry* registry) { 11 | } 12 | -------------------------------------------------------------------------------- /windows/flutter/generated_plugin_registrant.h: -------------------------------------------------------------------------------- 1 | // 2 | // Generated file. Do not edit. 3 | // 4 | 5 | // clang-format off 6 | 7 | #ifndef GENERATED_PLUGIN_REGISTRANT_ 8 | #define GENERATED_PLUGIN_REGISTRANT_ 9 | 10 | #include 11 | 12 | // Registers Flutter plugins. 13 | void RegisterPlugins(flutter::PluginRegistry* registry); 14 | 15 | #endif // GENERATED_PLUGIN_REGISTRANT_ 16 | -------------------------------------------------------------------------------- /windows/flutter/generated_plugins.cmake: -------------------------------------------------------------------------------- 1 | # 2 | # Generated file, do not edit. 3 | # 4 | 5 | list(APPEND FLUTTER_PLUGIN_LIST 6 | ) 7 | 8 | list(APPEND FLUTTER_FFI_PLUGIN_LIST 9 | ) 10 | 11 | set(PLUGIN_BUNDLED_LIBRARIES) 12 | 13 | foreach(plugin ${FLUTTER_PLUGIN_LIST}) 14 | add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin}) 15 | target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) 16 | list(APPEND PLUGIN_BUNDLED_LIBRARIES $) 17 | list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) 18 | endforeach(plugin) 19 | 20 | foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) 21 | add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin}) 22 | list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) 23 | endforeach(ffi_plugin) 24 | -------------------------------------------------------------------------------- /windows/runner/flutter_window.h: -------------------------------------------------------------------------------- 1 | #ifndef RUNNER_FLUTTER_WINDOW_H_ 2 | #define RUNNER_FLUTTER_WINDOW_H_ 3 | 4 | #include 5 | #include 6 | 7 | #include 8 | 9 | #include "win32_window.h" 10 | 11 | // A window that does nothing but host a Flutter view. 12 | class FlutterWindow : public Win32Window { 13 | public: 14 | // Creates a new FlutterWindow hosting a Flutter view running |project|. 15 | explicit FlutterWindow(const flutter::DartProject& project); 16 | virtual ~FlutterWindow(); 17 | 18 | protected: 19 | // Win32Window: 20 | bool OnCreate() override; 21 | void OnDestroy() override; 22 | LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam, 23 | LPARAM const lparam) noexcept override; 24 | 25 | private: 26 | // The project to run. 27 | flutter::DartProject project_; 28 | 29 | // The Flutter instance hosted by this window. 30 | std::unique_ptr flutter_controller_; 31 | }; 32 | 33 | #endif // RUNNER_FLUTTER_WINDOW_H_ 34 | -------------------------------------------------------------------------------- /windows/runner/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | #include "flutter_window.h" 6 | #include "utils.h" 7 | 8 | int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, 9 | _In_ wchar_t *command_line, _In_ int show_command) { 10 | // Attach to console when present (e.g., 'flutter run') or create a 11 | // new console when running with a debugger. 12 | if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) { 13 | CreateAndAttachConsole(); 14 | } 15 | 16 | // Initialize COM, so that it is available for use in the library and/or 17 | // plugins. 18 | ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); 19 | 20 | flutter::DartProject project(L"data"); 21 | 22 | std::vector command_line_arguments = 23 | GetCommandLineArguments(); 24 | 25 | project.set_dart_entrypoint_arguments(std::move(command_line_arguments)); 26 | 27 | FlutterWindow window(project); 28 | Win32Window::Point origin(10, 10); 29 | Win32Window::Size size(1280, 720); 30 | if (!window.Create(L"education_app_like_udemy", origin, size)) { 31 | return EXIT_FAILURE; 32 | } 33 | window.SetQuitOnClose(true); 34 | 35 | ::MSG msg; 36 | while (::GetMessage(&msg, nullptr, 0, 0)) { 37 | ::TranslateMessage(&msg); 38 | ::DispatchMessage(&msg); 39 | } 40 | 41 | ::CoUninitialize(); 42 | return EXIT_SUCCESS; 43 | } 44 | -------------------------------------------------------------------------------- /windows/runner/resource.h: -------------------------------------------------------------------------------- 1 | //{{NO_DEPENDENCIES}} 2 | // Microsoft Visual C++ generated include file. 3 | // Used by Runner.rc 4 | // 5 | #define IDI_APP_ICON 101 6 | 7 | // Next default values for new objects 8 | // 9 | #ifdef APSTUDIO_INVOKED 10 | #ifndef APSTUDIO_READONLY_SYMBOLS 11 | #define _APS_NEXT_RESOURCE_VALUE 102 12 | #define _APS_NEXT_COMMAND_VALUE 40001 13 | #define _APS_NEXT_CONTROL_VALUE 1001 14 | #define _APS_NEXT_SYMED_VALUE 101 15 | #endif 16 | #endif 17 | -------------------------------------------------------------------------------- /windows/runner/resources/app_icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suleymangunes/Madens_education_app/57c2638314141067e2878198ca3c64a144443202/windows/runner/resources/app_icon.ico -------------------------------------------------------------------------------- /windows/runner/runner.exe.manifest: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PerMonitorV2 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /windows/runner/utils.h: -------------------------------------------------------------------------------- 1 | #ifndef RUNNER_UTILS_H_ 2 | #define RUNNER_UTILS_H_ 3 | 4 | #include 5 | #include 6 | 7 | // Creates a console for the process, and redirects stdout and stderr to 8 | // it for both the runner and the Flutter library. 9 | void CreateAndAttachConsole(); 10 | 11 | // Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string 12 | // encoded in UTF-8. Returns an empty std::string on failure. 13 | std::string Utf8FromUtf16(const wchar_t* utf16_string); 14 | 15 | // Gets the command line arguments passed in as a std::vector, 16 | // encoded in UTF-8. Returns an empty std::vector on failure. 17 | std::vector GetCommandLineArguments(); 18 | 19 | #endif // RUNNER_UTILS_H_ 20 | --------------------------------------------------------------------------------