├── .gitignore
├── CHANGELOG.md
├── LICENSE.txt
├── PRIVACY_POLICY.md
├── README.md
├── screenshots
├── dark.png
├── dark
│ ├── 01-splash_screen.jpg
│ ├── 02-latest.jpg
│ ├── 03-latest_scrolled.jpg
│ ├── 04-tournament.jpg
│ ├── 05-tournament_menu.jpg
│ ├── 06-tournament_about.jpg
│ ├── 07-tournaments_tree.jpg
│ ├── 08-search.jpg
│ ├── 09-settings.jpg
│ ├── 10-question1.jpg
│ ├── 11-question2.jpg
│ ├── 12-search2.jpg
│ ├── 13-tournament2.jpg
│ ├── 14-question3.jpg
│ ├── 15-about.jpg
│ ├── 16-tournaments_tree2.jpg
│ └── 17-tournaments_tree3.jpg
├── dark_minimized.png
├── light.png
├── light
│ ├── 01-splash_screen.jpg
│ ├── 02-latest.jpg
│ ├── 03-latest_scrolled.jpg
│ ├── 04-tournament.jpg
│ ├── 05-tournament_menu.jpg
│ ├── 06-tournament_about.jpg
│ ├── 07-tournaments_tree.jpg
│ ├── 08-search.jpg
│ ├── 09-settings.jpg
│ ├── 10-question1.jpg
│ ├── 11-question2.jpg
│ ├── 12-search2.jpg
│ ├── 13-tournament2.jpg
│ ├── 14-question3.jpg
│ ├── 15-about.jpg
│ ├── 16-tournaments_tree2.jpg
│ └── 17-tournaments_tree3.jpg
└── light_minimized.png
└── www-app
├── .gitignore
├── app
├── www_app
│ ├── .gitignore
│ ├── .metadata
│ ├── analysis_options.yaml
│ ├── android
│ │ ├── .gitignore
│ │ ├── app
│ │ │ ├── build.gradle
│ │ │ ├── google-services.json
│ │ │ └── src
│ │ │ │ ├── debug
│ │ │ │ └── AndroidManifest.xml
│ │ │ │ ├── main
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ ├── kotlin
│ │ │ │ │ └── droid
│ │ │ │ │ │ └── chgk
│ │ │ │ │ │ └── MainActivity.kt
│ │ │ │ └── res
│ │ │ │ │ ├── drawable
│ │ │ │ │ ├── launcher_icon_background.xml
│ │ │ │ │ ├── launcher_icon_foreground.xml
│ │ │ │ │ └── screen_background.xml
│ │ │ │ │ ├── mipmap-anydpi-v26
│ │ │ │ │ └── launcher_icon.xml
│ │ │ │ │ ├── values-night
│ │ │ │ │ ├── colors.xml
│ │ │ │ │ └── styles.xml
│ │ │ │ │ ├── values-ru
│ │ │ │ │ └── strings.xml
│ │ │ │ │ ├── values-uk
│ │ │ │ │ └── strings.xml
│ │ │ │ │ └── values
│ │ │ │ │ ├── colors.xml
│ │ │ │ │ ├── strings.xml
│ │ │ │ │ └── styles.xml
│ │ │ │ └── profile
│ │ │ │ └── AndroidManifest.xml
│ │ ├── build.gradle
│ │ ├── gradle.properties
│ │ ├── gradle
│ │ │ └── wrapper
│ │ │ │ └── gradle-wrapper.properties
│ │ └── settings.gradle
│ ├── assets
│ │ ├── owl.svg
│ │ └── timer.mp3
│ ├── 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-60x60@2x.png
│ │ │ │ ├── Icon-App-60x60@3x.png
│ │ │ │ ├── Icon-App-76x76@1x.png
│ │ │ │ ├── Icon-App-76x76@2x.png
│ │ │ │ └── Icon-App-83.5x83.5@2x.png
│ │ │ └── LaunchImage.imageset
│ │ │ │ ├── Contents.json
│ │ │ │ ├── LaunchImage.png
│ │ │ │ ├── LaunchImage@2x.png
│ │ │ │ ├── LaunchImage@3x.png
│ │ │ │ └── README.md
│ │ │ ├── Base.lproj
│ │ │ ├── LaunchScreen.storyboard
│ │ │ └── Main.storyboard
│ │ │ ├── GoogleService-Info.plist
│ │ │ ├── Info.plist
│ │ │ ├── Runner-Bridging-Header.h
│ │ │ ├── en.lproj
│ │ │ └── InfoPlist.strings
│ │ │ ├── ru.lproj
│ │ │ └── InfoPlist.strings
│ │ │ └── uk.lproj
│ │ │ └── InfoPlist.strings
│ ├── lib
│ │ ├── main.dart
│ │ └── src
│ │ │ ├── app.dart
│ │ │ └── presentation
│ │ │ └── splash_screen.dart
│ ├── pubspec.lock
│ └── pubspec.yaml
├── www_app_di
│ ├── analysis_options.yaml
│ ├── lib
│ │ ├── src
│ │ │ └── di
│ │ │ │ ├── di_container.dart
│ │ │ │ ├── di_container_implementation.dart
│ │ │ │ └── di_module.dart
│ │ └── www_app_di.dart
│ └── pubspec.yaml
├── www_navigation
│ ├── analysis_options.yaml
│ ├── lib
│ │ ├── src
│ │ │ ├── di
│ │ │ │ ├── di_module.config.dart
│ │ │ │ └── di_module.dart
│ │ │ ├── redux
│ │ │ │ └── middleware.dart
│ │ │ └── service
│ │ │ │ └── navigation.dart
│ │ └── www_navigation.dart
│ └── pubspec.yaml
└── www_redux_store
│ ├── analysis_options.yaml
│ ├── lib
│ ├── src
│ │ ├── di
│ │ │ ├── di_module.config.dart
│ │ │ └── di_module.dart
│ │ ├── loggers
│ │ │ ├── analytics
│ │ │ │ └── middleware.dart
│ │ │ └── logs
│ │ │ │ └── middleware.dart
│ │ └── redux
│ │ │ ├── middleware.dart
│ │ │ ├── reducer.dart
│ │ │ ├── state.dart
│ │ │ ├── state.freezed.dart
│ │ │ └── store.dart
│ └── www_redux_store.dart
│ ├── pubspec.yaml
│ └── test
│ ├── loggers
│ └── analytics
│ │ └── middleware_test.dart
│ └── mocks
│ ├── fakes.dart
│ └── mocks.dart
├── core
├── www_constants
│ ├── analysis_options.yaml
│ ├── lib
│ │ ├── src
│ │ │ └── constants.dart
│ │ └── www_constants.dart
│ └── pubspec.yaml
├── www_http
│ ├── analysis_options.yaml
│ ├── lib
│ │ ├── src
│ │ │ ├── di
│ │ │ │ ├── di_module.config.dart
│ │ │ │ └── di_module.dart
│ │ │ ├── dio
│ │ │ │ ├── dio_config
│ │ │ │ │ ├── dio_config_module.dart
│ │ │ │ │ └── dio_config_parameters.dart
│ │ │ │ ├── dio_factory.dart
│ │ │ │ └── dio_logger.dart
│ │ │ └── service
│ │ │ │ └── http_client.dart
│ │ └── www_http.dart
│ └── pubspec.yaml
└── www_localization
│ ├── analysis_options.yaml
│ ├── lib
│ ├── src
│ │ ├── extensions.dart
│ │ ├── localizations.dart
│ │ └── translations
│ │ │ ├── translations.i69n.dart
│ │ │ ├── translations.i69n.yaml
│ │ │ ├── translations_ru.i69n.dart
│ │ │ ├── translations_ru.i69n.yaml
│ │ │ ├── translations_uk.i69n.dart
│ │ │ └── translations_uk.i69n.yaml
│ └── www_localization.dart
│ └── pubspec.yaml
├── design
├── www_custom_icons
│ ├── analysis_options.yaml
│ ├── assets
│ │ └── CustomIcons.ttf
│ ├── lib
│ │ ├── src
│ │ │ └── custom_icons.dart
│ │ └── www_custom_icons.dart
│ └── pubspec.yaml
├── www_theme
│ ├── analysis_options.yaml
│ ├── lib
│ │ ├── src
│ │ │ ├── dimensions.dart
│ │ │ ├── extensions.dart
│ │ │ ├── style_configuration.dart
│ │ │ ├── style_configurator.dart
│ │ │ ├── text_sections_theme_data.dart
│ │ │ └── themes.dart
│ │ └── www_theme.dart
│ └── pubspec.yaml
└── www_widgets
│ ├── analysis_options.yaml
│ ├── lib
│ ├── src
│ │ ├── animated_fab.dart
│ │ ├── bookmarked_marker.dart
│ │ ├── empty_sliver.dart
│ │ ├── error_message.dart
│ │ ├── expanding_panel.dart
│ │ ├── fade_in.dart
│ │ ├── gradient_decoration.dart
│ │ ├── info_dialog.dart
│ │ ├── modal_bottom_sheet_container.dart
│ │ ├── progress_indicator.dart
│ │ ├── scroll_controller_bound_fab.dart
│ │ ├── shape_hero.dart
│ │ ├── solid_icon_button.dart
│ │ ├── status_bar_brightness.dart
│ │ ├── text_hero.dart
│ │ ├── text_stub.dart
│ │ ├── tournaments_grid.dart
│ │ ├── tournaments_grid_stub_tile.dart
│ │ ├── tournaments_grid_tile.dart
│ │ └── unexpected_state_widget.dart
│ └── www_widgets.dart
│ └── pubspec.yaml
├── domain
├── www_api
│ ├── analysis_options.yaml
│ ├── build.yaml
│ ├── lib
│ │ ├── src
│ │ │ ├── di
│ │ │ │ ├── di_module.config.dart
│ │ │ │ └── di_module.dart
│ │ │ ├── loaders
│ │ │ │ ├── latest_tournaments_loader.dart
│ │ │ │ ├── random_questions_loader.dart
│ │ │ │ ├── search_loader.dart
│ │ │ │ ├── tour_details_loader.dart
│ │ │ │ ├── tournament_details_loader.dart
│ │ │ │ └── tournaments_tree_loader.dart
│ │ │ ├── models
│ │ │ │ ├── json_converters
│ │ │ │ │ ├── questions_list_converter.dart
│ │ │ │ │ ├── tournaments_tree_converter.dart
│ │ │ │ │ └── tours_list_converter.dart
│ │ │ │ ├── latest_tournaments_dto.dart
│ │ │ │ ├── latest_tournaments_dto.freezed.dart
│ │ │ │ ├── latest_tournaments_dto.g.dart
│ │ │ │ ├── model_converters
│ │ │ │ │ ├── question_converter.dart
│ │ │ │ │ ├── question_parser
│ │ │ │ │ │ ├── question_parser.dart
│ │ │ │ │ │ ├── question_parser_helper.dart
│ │ │ │ │ │ └── question_section_type.dart
│ │ │ │ │ ├── question_section_converter.dart
│ │ │ │ │ ├── random_questions_converter.dart
│ │ │ │ │ ├── tour_converter.dart
│ │ │ │ │ ├── tournament_converter.dart
│ │ │ │ │ └── tournament_tree_converter.dart
│ │ │ │ ├── question_dto.dart
│ │ │ │ ├── question_dto.freezed.dart
│ │ │ │ ├── question_dto.g.dart
│ │ │ │ ├── random_questions_dto.dart
│ │ │ │ ├── random_questions_dto.freezed.dart
│ │ │ │ ├── random_questions_dto.g.dart
│ │ │ │ ├── search_tournaments_dto.dart
│ │ │ │ ├── search_tournaments_dto.freezed.dart
│ │ │ │ ├── search_tournaments_dto.g.dart
│ │ │ │ ├── tour_dto.dart
│ │ │ │ ├── tour_dto.freezed.dart
│ │ │ │ ├── tour_dto.g.dart
│ │ │ │ ├── tournament_dto.dart
│ │ │ │ ├── tournament_dto.freezed.dart
│ │ │ │ ├── tournament_dto.g.dart
│ │ │ │ ├── tournaments_tree_dto.dart
│ │ │ │ ├── tournaments_tree_dto.freezed.dart
│ │ │ │ └── tournaments_tree_dto.g.dart
│ │ │ └── parsers
│ │ │ │ ├── latest2json_parser.dart
│ │ │ │ ├── search2json_parser.dart
│ │ │ │ └── xml2json_parser.dart
│ │ └── www_api.dart
│ ├── pubspec.yaml
│ └── test
│ │ ├── loaders
│ │ ├── latest_tournaments
│ │ │ ├── latest_tournaments_loader_test.dart
│ │ │ ├── test_data_1.dart
│ │ │ └── test_data_2.dart
│ │ ├── random_questions
│ │ │ ├── random_questions_loader_test.dart
│ │ │ ├── test_data_1.dart
│ │ │ ├── test_data_2.dart
│ │ │ └── test_data_3.dart
│ │ ├── search
│ │ │ ├── search_loader_test.dart
│ │ │ ├── test_data_1.dart
│ │ │ ├── test_data_2.dart
│ │ │ ├── test_data_3.dart
│ │ │ └── test_data_4.dart
│ │ ├── tour_details
│ │ │ ├── test_data_1.dart
│ │ │ ├── test_data_2.dart
│ │ │ ├── test_data_3.dart
│ │ │ └── tour_details_loader_test.dart
│ │ ├── tournament_details
│ │ │ ├── test_data_1.dart
│ │ │ ├── test_data_2.dart
│ │ │ ├── test_data_3.dart
│ │ │ └── tournament_details_loader_test.dart
│ │ └── tournaments_tree
│ │ │ ├── test_data_1.dart
│ │ │ └── tournaments_tree_loader_test.dart
│ │ ├── mocks
│ │ ├── fakes.dart
│ │ └── mocks.dart
│ │ └── models
│ │ └── question_dto_test.dart
├── www_cache
│ ├── analysis_options.yaml
│ ├── lib
│ │ ├── src
│ │ │ ├── cache
│ │ │ │ ├── cache_synchronizer.dart
│ │ │ │ ├── tournaments_cache.dart
│ │ │ │ ├── tournaments_tree_cache.dart
│ │ │ │ └── tours_cache.dart
│ │ │ └── di
│ │ │ │ ├── di_module.config.dart
│ │ │ │ └── di_module.dart
│ │ └── www_cache.dart
│ └── pubspec.yaml
├── www_local_storage
│ ├── analysis_options.yaml
│ ├── build.yaml
│ ├── lib
│ │ ├── src
│ │ │ ├── di
│ │ │ │ ├── di_module.config.dart
│ │ │ │ └── di_module.dart
│ │ │ ├── hive
│ │ │ │ ├── hive_adapters_registry.dart
│ │ │ │ ├── hive_constants.dart
│ │ │ │ ├── model_converters
│ │ │ │ │ ├── question_converter.dart
│ │ │ │ │ ├── question_info_converter.dart
│ │ │ │ │ ├── question_section_converter.dart
│ │ │ │ │ ├── tour_converter.dart
│ │ │ │ │ ├── tour_info_converter.dart
│ │ │ │ │ ├── tournament_converter.dart
│ │ │ │ │ ├── tournament_info_converter.dart
│ │ │ │ │ └── tournament_status_converter.dart
│ │ │ │ └── models
│ │ │ │ │ ├── question.dart
│ │ │ │ │ ├── question.freezed.dart
│ │ │ │ │ ├── question.g.dart
│ │ │ │ │ ├── question_info.dart
│ │ │ │ │ ├── question_info.freezed.dart
│ │ │ │ │ ├── question_info.g.dart
│ │ │ │ │ ├── question_sections
│ │ │ │ │ ├── question_section.dart
│ │ │ │ │ ├── section_audio.dart
│ │ │ │ │ ├── section_audio.freezed.dart
│ │ │ │ │ ├── section_audio.g.dart
│ │ │ │ │ ├── section_giveaway.dart
│ │ │ │ │ ├── section_giveaway.freezed.dart
│ │ │ │ │ ├── section_giveaway.g.dart
│ │ │ │ │ ├── section_image.dart
│ │ │ │ │ ├── section_image.freezed.dart
│ │ │ │ │ ├── section_image.g.dart
│ │ │ │ │ ├── section_speaker_note.dart
│ │ │ │ │ ├── section_speaker_note.freezed.dart
│ │ │ │ │ ├── section_speaker_note.g.dart
│ │ │ │ │ ├── section_text.dart
│ │ │ │ │ ├── section_text.freezed.dart
│ │ │ │ │ └── section_text.g.dart
│ │ │ │ │ ├── tour.dart
│ │ │ │ │ ├── tour.freezed.dart
│ │ │ │ │ ├── tour.g.dart
│ │ │ │ │ ├── tour_info.dart
│ │ │ │ │ ├── tour_info.freezed.dart
│ │ │ │ │ ├── tour_info.g.dart
│ │ │ │ │ ├── tournament.dart
│ │ │ │ │ ├── tournament.freezed.dart
│ │ │ │ │ ├── tournament.g.dart
│ │ │ │ │ ├── tournament_info.dart
│ │ │ │ │ ├── tournament_info.freezed.dart
│ │ │ │ │ ├── tournament_info.g.dart
│ │ │ │ │ ├── tournament_status.dart
│ │ │ │ │ ├── tournament_status.freezed.dart
│ │ │ │ │ └── tournament_status.g.dart
│ │ │ └── service
│ │ │ │ ├── local_storage.dart
│ │ │ │ └── tournaments_local_storage.dart
│ │ └── www_local_storage.dart
│ └── pubspec.yaml
└── www_models
│ ├── analysis_options.yaml
│ ├── lib
│ ├── src
│ │ ├── misc
│ │ │ ├── app_theme.dart
│ │ │ ├── search_parameters.dart
│ │ │ ├── search_parameters.freezed.dart
│ │ │ ├── sorting.dart
│ │ │ ├── text_scale.dart
│ │ │ └── timer_type.dart
│ │ └── models
│ │ │ ├── question.dart
│ │ │ ├── question.freezed.dart
│ │ │ ├── question_info.dart
│ │ │ ├── question_info.freezed.dart
│ │ │ ├── question_sections
│ │ │ ├── question_section.dart
│ │ │ ├── section_audio.dart
│ │ │ ├── section_audio.freezed.dart
│ │ │ ├── section_giveaway.dart
│ │ │ ├── section_giveaway.freezed.dart
│ │ │ ├── section_image.dart
│ │ │ ├── section_image.freezed.dart
│ │ │ ├── section_speaker_note.dart
│ │ │ ├── section_speaker_note.freezed.dart
│ │ │ ├── section_text.dart
│ │ │ └── section_text.freezed.dart
│ │ │ ├── random_questions.dart
│ │ │ ├── random_questions.freezed.dart
│ │ │ ├── tour.dart
│ │ │ ├── tour.freezed.dart
│ │ │ ├── tour_info.dart
│ │ │ ├── tour_info.freezed.dart
│ │ │ ├── tournament.dart
│ │ │ ├── tournament.freezed.dart
│ │ │ ├── tournament_info.dart
│ │ │ ├── tournament_info.freezed.dart
│ │ │ ├── tournament_status.dart
│ │ │ ├── tournament_status.freezed.dart
│ │ │ ├── tournaments_tree.dart
│ │ │ ├── tournaments_tree.freezed.dart
│ │ │ ├── tournaments_tree_info.dart
│ │ │ └── tournaments_tree_info.freezed.dart
│ └── www_models.dart
│ └── pubspec.yaml
├── feature
├── shared
│ ├── www_redux_actions
│ │ ├── analysis_options.yaml
│ │ ├── lib
│ │ │ ├── src
│ │ │ │ ├── bookmarks_actions.dart
│ │ │ │ ├── bookmarks_actions.freezed.dart
│ │ │ │ ├── browse_actions.dart
│ │ │ │ ├── browse_actions.freezed.dart
│ │ │ │ ├── developer_actions.dart
│ │ │ │ ├── developer_actions.freezed.dart
│ │ │ │ ├── dialogs_actions.dart
│ │ │ │ ├── dialogs_actions.freezed.dart
│ │ │ │ ├── initialization_actions.dart
│ │ │ │ ├── initialization_actions.freezed.dart
│ │ │ │ ├── latest_tournaments_actions.dart
│ │ │ │ ├── latest_tournaments_actions.freezed.dart
│ │ │ │ ├── navigation_actions.dart
│ │ │ │ ├── navigation_actions.freezed.dart
│ │ │ │ ├── questions_actions.dart
│ │ │ │ ├── questions_actions.freezed.dart
│ │ │ │ ├── rating_actions.dart
│ │ │ │ ├── rating_actions.freezed.dart
│ │ │ │ ├── services_actions.dart
│ │ │ │ ├── services_actions.freezed.dart
│ │ │ │ ├── settings_actions.dart
│ │ │ │ ├── settings_actions.freezed.dart
│ │ │ │ ├── sharing_actions.dart
│ │ │ │ ├── sharing_actions.freezed.dart
│ │ │ │ ├── timer_actions.dart
│ │ │ │ ├── timer_actions.freezed.dart
│ │ │ │ ├── tournament_actions.dart
│ │ │ │ ├── tournament_actions.freezed.dart
│ │ │ │ ├── tournaments_search_actions.dart
│ │ │ │ ├── tournaments_search_actions.freezed.dart
│ │ │ │ ├── tournaments_tree_actions.dart
│ │ │ │ ├── tournaments_tree_actions.freezed.dart
│ │ │ │ ├── tours_actions.dart
│ │ │ │ └── tours_actions.freezed.dart
│ │ │ └── www_redux_actions.dart
│ │ └── pubspec.yaml
│ └── www_tournament_status
│ │ ├── analysis_options.yaml
│ │ ├── lib
│ │ ├── src
│ │ │ ├── di
│ │ │ │ ├── di_module.config.dart
│ │ │ │ └── di_module.dart
│ │ │ └── service
│ │ │ │ ├── tournament_status.dart
│ │ │ │ ├── tournaments_bookmarks.dart
│ │ │ │ └── tournaments_history.dart
│ │ └── www_tournament_status.dart
│ │ └── pubspec.yaml
├── www_about
│ ├── analysis_options.yaml
│ ├── lib
│ │ ├── src
│ │ │ └── presentation
│ │ │ │ └── route_page.dart
│ │ └── www_about.dart
│ └── pubspec.yaml
├── www_bookmarks
│ ├── analysis_options.yaml
│ ├── lib
│ │ ├── src
│ │ │ ├── di
│ │ │ │ ├── di_module.config.dart
│ │ │ │ └── di_module.dart
│ │ │ ├── presentation
│ │ │ │ ├── app_bar.dart
│ │ │ │ ├── data_page.dart
│ │ │ │ ├── empty_bookmarks.dart
│ │ │ │ ├── error_page.dart
│ │ │ │ ├── loading_page.dart
│ │ │ │ ├── page_content.dart
│ │ │ │ └── route_page.dart
│ │ │ └── redux
│ │ │ │ ├── middleware.dart
│ │ │ │ ├── reducer.dart
│ │ │ │ ├── state.dart
│ │ │ │ ├── state.freezed.dart
│ │ │ │ └── state_holder.dart
│ │ └── www_bookmarks.dart
│ └── pubspec.yaml
├── www_browsing
│ ├── analysis_options.yaml
│ ├── lib
│ │ ├── src
│ │ │ ├── di
│ │ │ │ ├── di_module.config.dart
│ │ │ │ └── di_module.dart
│ │ │ ├── redux
│ │ │ │ └── middleware.dart
│ │ │ └── service
│ │ │ │ └── url_launcher.dart
│ │ └── www_browsing.dart
│ └── pubspec.yaml
├── www_image_details
│ ├── analysis_options.yaml
│ ├── lib
│ │ ├── src
│ │ │ └── presentation
│ │ │ │ └── route_page.dart
│ │ └── www_image_details.dart
│ └── pubspec.yaml
├── www_initialization
│ ├── analysis_options.yaml
│ ├── lib
│ │ ├── src
│ │ │ ├── di
│ │ │ │ ├── di_module.config.dart
│ │ │ │ └── di_module.dart
│ │ │ └── redux
│ │ │ │ ├── middleware.dart
│ │ │ │ ├── reducer.dart
│ │ │ │ ├── state.dart
│ │ │ │ ├── state.freezed.dart
│ │ │ │ └── state_holder.dart
│ │ └── www_initialization.dart
│ └── pubspec.yaml
├── www_latest_tournaments
│ ├── analysis_options.yaml
│ ├── lib
│ │ ├── src
│ │ │ ├── di
│ │ │ │ ├── di_module.config.dart
│ │ │ │ └── di_module.dart
│ │ │ ├── presentation
│ │ │ │ ├── app_bar.dart
│ │ │ │ ├── app_bar_buttons
│ │ │ │ │ ├── bookmarks.dart
│ │ │ │ │ ├── more.dart
│ │ │ │ │ └── random.dart
│ │ │ │ ├── bottom_sheet
│ │ │ │ │ ├── bottom_sheet.dart
│ │ │ │ │ └── items
│ │ │ │ │ │ ├── about.dart
│ │ │ │ │ │ ├── search.dart
│ │ │ │ │ │ ├── settings.dart
│ │ │ │ │ │ └── tree.dart
│ │ │ │ ├── data_page.dart
│ │ │ │ ├── error_message.dart
│ │ │ │ ├── error_page.dart
│ │ │ │ ├── loading_page.dart
│ │ │ │ ├── page_content.dart
│ │ │ │ ├── refresh_indicator.dart
│ │ │ │ └── route_page.dart
│ │ │ ├── redux
│ │ │ │ ├── middleware.dart
│ │ │ │ ├── reducer.dart
│ │ │ │ ├── state.dart
│ │ │ │ ├── state.freezed.dart
│ │ │ │ └── state_holder.dart
│ │ │ └── service
│ │ │ │ └── latest_tournaments_provider.dart
│ │ └── www_latest_tournaments.dart
│ ├── pubspec.yaml
│ └── test
│ │ ├── mocks
│ │ └── mocks.dart
│ │ └── service
│ │ └── latest_tournaments_provider
│ │ ├── latest_tournaments_provider_test.dart
│ │ └── test_data_1.dart
├── www_questions
│ ├── analysis_options.yaml
│ ├── lib
│ │ ├── src
│ │ │ ├── di
│ │ │ │ ├── di_module.config.dart
│ │ │ │ └── di_module.dart
│ │ │ ├── presentation
│ │ │ │ ├── app_bar
│ │ │ │ │ ├── bottom_app_bar.dart
│ │ │ │ │ ├── buttons
│ │ │ │ │ │ ├── more.dart
│ │ │ │ │ │ └── timer.dart
│ │ │ │ │ └── timer_text.dart
│ │ │ │ ├── bottom_sheet
│ │ │ │ │ ├── bottom_sheet.dart
│ │ │ │ │ └── items
│ │ │ │ │ │ ├── about.dart
│ │ │ │ │ │ ├── browse.dart
│ │ │ │ │ │ └── share.dart
│ │ │ │ ├── data_page.dart
│ │ │ │ ├── error_page.dart
│ │ │ │ ├── loading_page.dart
│ │ │ │ ├── page_content.dart
│ │ │ │ ├── question
│ │ │ │ │ ├── question_answer.dart
│ │ │ │ │ ├── question_card.dart
│ │ │ │ │ ├── question_card_stub.dart
│ │ │ │ │ ├── question_number.dart
│ │ │ │ │ ├── question_sections.dart
│ │ │ │ │ ├── question_text.dart
│ │ │ │ │ ├── separator.dart
│ │ │ │ │ ├── show_answer_button.dart
│ │ │ │ │ └── text_with_links.dart
│ │ │ │ ├── questions_cards.dart
│ │ │ │ ├── route_page.dart
│ │ │ │ └── tour_details_about_dialog.dart
│ │ │ ├── redux
│ │ │ │ ├── middleware.dart
│ │ │ │ ├── reducer.dart
│ │ │ │ ├── state.dart
│ │ │ │ ├── state.freezed.dart
│ │ │ │ └── state_holder.dart
│ │ │ └── service
│ │ │ │ └── random_questions_provider.dart
│ │ └── www_questions.dart
│ ├── pubspec.yaml
│ └── test
│ │ ├── mocks
│ │ └── mocks.dart
│ │ └── service
│ │ ├── random_questions_provider_test.dart
│ │ └── test_data_1.dart
├── www_rating
│ ├── analysis_options.yaml
│ ├── lib
│ │ ├── src
│ │ │ ├── di
│ │ │ │ ├── di_module.config.dart
│ │ │ │ └── di_module.dart
│ │ │ ├── presentation
│ │ │ │ └── rating_dialog.dart
│ │ │ ├── redux
│ │ │ │ └── middleware.dart
│ │ │ └── service
│ │ │ │ └── rating.dart
│ │ └── www_rating.dart
│ └── pubspec.yaml
├── www_settings
│ ├── analysis_options.yaml
│ ├── lib
│ │ ├── src
│ │ │ ├── di
│ │ │ │ ├── di_module.config.dart
│ │ │ │ └── di_module.dart
│ │ │ ├── presentation
│ │ │ │ ├── expiring_timer_settings.dart
│ │ │ │ ├── route_page.dart
│ │ │ │ ├── text_scale_settings.dart
│ │ │ │ └── theme_settings.dart
│ │ │ └── redux
│ │ │ │ ├── middleware.dart
│ │ │ │ ├── reducer.dart
│ │ │ │ ├── state.dart
│ │ │ │ ├── state.freezed.dart
│ │ │ │ └── state_holder.dart
│ │ └── www_settings.dart
│ └── pubspec.yaml
├── www_sharing
│ ├── analysis_options.yaml
│ ├── lib
│ │ ├── src
│ │ │ ├── di
│ │ │ │ ├── di_module.config.dart
│ │ │ │ └── di_module.dart
│ │ │ ├── redux
│ │ │ │ └── middleware.dart
│ │ │ └── service
│ │ │ │ └── sharing.dart
│ │ └── www_sharing.dart
│ └── pubspec.yaml
├── www_timer
│ ├── analysis_options.yaml
│ ├── lib
│ │ ├── src
│ │ │ ├── di
│ │ │ │ ├── di_module.config.dart
│ │ │ │ └── di_module.dart
│ │ │ ├── redux
│ │ │ │ ├── middleware.dart
│ │ │ │ ├── reducer.dart
│ │ │ │ ├── state.dart
│ │ │ │ ├── state.freezed.dart
│ │ │ │ └── state_holder.dart
│ │ │ ├── service
│ │ │ │ ├── sound.dart
│ │ │ │ └── vibrating.dart
│ │ │ └── utils
│ │ │ │ └── timer.dart
│ │ └── www_timer.dart
│ └── pubspec.yaml
├── www_tournament_details
│ ├── analysis_options.yaml
│ ├── lib
│ │ ├── src
│ │ │ ├── di
│ │ │ │ ├── di_module.config.dart
│ │ │ │ └── di_module.dart
│ │ │ ├── presentation
│ │ │ │ ├── about_dialog.dart
│ │ │ │ ├── app_bar.dart
│ │ │ │ ├── app_bar_buttons
│ │ │ │ │ └── more.dart
│ │ │ │ ├── bottom_sheet
│ │ │ │ │ ├── bottom_sheet.dart
│ │ │ │ │ └── items
│ │ │ │ │ │ ├── about.dart
│ │ │ │ │ │ ├── bookmark.dart
│ │ │ │ │ │ ├── browse.dart
│ │ │ │ │ │ └── share.dart
│ │ │ │ ├── data_page.dart
│ │ │ │ ├── error_page.dart
│ │ │ │ ├── loading_page.dart
│ │ │ │ ├── page_content.dart
│ │ │ │ └── route_page.dart
│ │ │ ├── redux
│ │ │ │ ├── middleware.dart
│ │ │ │ ├── reducer.dart
│ │ │ │ ├── state.dart
│ │ │ │ ├── state.freezed.dart
│ │ │ │ └── state_holder.dart
│ │ │ ├── service
│ │ │ │ └── tournament_details_provider.dart
│ │ │ └── utils
│ │ │ │ └── measure_text.dart
│ │ └── www_tournament_details.dart
│ ├── pubspec.yaml
│ └── test
│ │ ├── mocks
│ │ └── mocks.dart
│ │ └── service
│ │ ├── test_data_1.dart
│ │ ├── test_data_2.dart
│ │ └── tournament_details_provider_test.dart
├── www_tournament_tours
│ ├── analysis_options.yaml
│ ├── lib
│ │ ├── src
│ │ │ ├── di
│ │ │ │ ├── di_module.config.dart
│ │ │ │ └── di_module.dart
│ │ │ ├── presentation
│ │ │ │ ├── data_tile.dart
│ │ │ │ ├── error_tile.dart
│ │ │ │ ├── loading_tile.dart
│ │ │ │ ├── question_data_tile.dart
│ │ │ │ ├── question_loading_tile.dart
│ │ │ │ ├── question_template_tile.dart
│ │ │ │ ├── route_tile.dart
│ │ │ │ ├── stub_tile.dart
│ │ │ │ └── template_tile.dart
│ │ │ ├── redux
│ │ │ │ ├── middleware.dart
│ │ │ │ ├── reducer.dart
│ │ │ │ ├── state.dart
│ │ │ │ ├── state.freezed.dart
│ │ │ │ └── state_holder.dart
│ │ │ └── service
│ │ │ │ └── tour_details_provider.dart
│ │ └── www_tournament_tours.dart
│ ├── pubspec.yaml
│ └── test
│ │ ├── mocks
│ │ └── mocks.dart
│ │ └── service
│ │ └── tour_details_provider
│ │ ├── test_data_1.dart
│ │ └── tour_details_provider_test.dart
├── www_tournaments_search
│ ├── analysis_options.yaml
│ ├── lib
│ │ ├── src
│ │ │ ├── di
│ │ │ │ ├── di_module.config.dart
│ │ │ │ └── di_module.dart
│ │ │ ├── presentation
│ │ │ │ ├── app_bar
│ │ │ │ │ ├── app_bar.dart
│ │ │ │ │ └── buttons
│ │ │ │ │ │ └── sorting.dart
│ │ │ │ ├── data_page.dart
│ │ │ │ ├── empty_page.dart
│ │ │ │ ├── error_message.dart
│ │ │ │ ├── error_page.dart
│ │ │ │ ├── loading_page.dart
│ │ │ │ ├── page_content.dart
│ │ │ │ └── route_page.dart
│ │ │ ├── redux
│ │ │ │ ├── middleware.dart
│ │ │ │ ├── reducer.dart
│ │ │ │ ├── state.dart
│ │ │ │ ├── state.freezed.dart
│ │ │ │ └── state_holder.dart
│ │ │ └── service
│ │ │ │ └── search_provider.dart
│ │ └── www_tournaments_search.dart
│ ├── pubspec.yaml
│ └── test
│ │ ├── mocks
│ │ └── mocks.dart
│ │ └── service
│ │ └── search_provider
│ │ ├── search_loader_test.dart
│ │ └── test_data_1.dart
└── www_tournaments_tree
│ ├── analysis_options.yaml
│ ├── lib
│ ├── src
│ │ ├── di
│ │ │ ├── di_module.config.dart
│ │ │ └── di_module.dart
│ │ ├── presentation
│ │ │ ├── app_bar.dart
│ │ │ ├── data_page.dart
│ │ │ ├── error_page.dart
│ │ │ ├── loading_page.dart
│ │ │ ├── page_content.dart
│ │ │ ├── route_page.dart
│ │ │ └── subtree_tile.dart
│ │ ├── redux
│ │ │ ├── middleware.dart
│ │ │ ├── reducer.dart
│ │ │ ├── state.dart
│ │ │ ├── state.freezed.dart
│ │ │ └── state_holder.dart
│ │ └── service
│ │ │ └── tournaments_tree_provider.dart
│ └── www_tournaments_tree.dart
│ ├── pubspec.yaml
│ └── test
│ ├── mocks
│ └── mocks.dart
│ └── service
│ └── tournaments_tree_provider
│ ├── test_data_1.dart
│ └── tournaments_tree_provider_test.dart
├── melos.yaml
├── pubspec.lock
├── pubspec.yaml
└── utils
├── www_analysis
├── lib
│ └── analysis_options.yaml
└── pubspec.yaml
├── www_analytics
├── analysis_options.yaml
├── lib
│ ├── src
│ │ ├── config
│ │ │ ├── firebase_config_module.dart
│ │ │ └── firebase_config_parameters.dart
│ │ ├── di
│ │ │ ├── di_module.config.dart
│ │ │ └── di_module.dart
│ │ └── service
│ │ │ ├── analytics.dart
│ │ │ ├── crash_wrapper.dart
│ │ │ ├── crashes.dart
│ │ │ └── firebase.dart
│ └── www_analytics.dart
└── pubspec.yaml
├── www_background_runner
├── analysis_options.yaml
├── lib
│ ├── src
│ │ ├── di
│ │ │ ├── di_module.config.dart
│ │ │ └── di_module.dart
│ │ └── service
│ │ │ └── background_runner.dart
│ └── www_background_runner.dart
└── pubspec.yaml
├── www_di
├── analysis_options.yaml
├── lib
│ ├── src
│ │ └── di_module.dart
│ └── www_di.dart
└── pubspec.yaml
├── www_dialogs
├── analysis_options.yaml
├── lib
│ ├── src
│ │ ├── di
│ │ │ ├── di_module.config.dart
│ │ │ └── di_module.dart
│ │ ├── presentation
│ │ │ └── dialog_presenter.dart
│ │ └── service
│ │ │ └── dialogs.dart
│ └── www_dialogs.dart
└── pubspec.yaml
├── www_logger
├── analysis_options.yaml
├── lib
│ ├── src
│ │ └── logger.dart
│ └── www_logger.dart
└── pubspec.yaml
├── www_preferences
├── analysis_options.yaml
├── lib
│ ├── src
│ │ ├── di
│ │ │ ├── di_module.config.dart
│ │ │ └── di_module.dart
│ │ └── service
│ │ │ └── preferences.dart
│ └── www_preferences.dart
└── pubspec.yaml
├── www_redux
├── analysis_options.yaml
├── lib
│ ├── src
│ │ ├── extensions
│ │ │ └── context_extensions.dart
│ │ ├── presentation
│ │ │ ├── store_connector.dart
│ │ │ └── store_provider.dart
│ │ └── redux
│ │ │ ├── action.dart
│ │ │ ├── middleware.dart
│ │ │ ├── reducer.dart
│ │ │ └── state.dart
│ └── www_redux.dart
└── pubspec.yaml
├── www_test_utils
├── analysis_options.yaml
├── lib
│ ├── src
│ │ ├── test_arrange.dart
│ │ └── test_assert.dart
│ └── www_test_utils.dart
└── pubspec.yaml
└── www_utils
├── analysis_options.yaml
├── lib
├── src
│ ├── duration_formatter.dart
│ ├── extensions
│ │ ├── iterable_extensions.dart
│ │ └── string_extensions.dart
│ ├── network_exception.dart
│ ├── silent_operation.dart
│ └── uri_detector.dart
└── www_utils.dart
└── pubspec.yaml
/PRIVACY_POLICY.md:
--------------------------------------------------------------------------------
1 | # "Sova – What? Where? When?" mobile app Privacy Policy
2 |
3 | "Sova – What? Where? When?" is a free mobile application created by [Anna Leushchenko](https://github.com/foxanna). The source code is openly available [on GitHub](https://github.com/foxanna/WWW-flutter) and the application is available on [Google Play](https://play.google.com/store/apps/details?id=chgk.droid).
4 |
5 | The application's sole purpose is to provide a nice user experience while browsing the [open database of content](https://db.chgk.info/). The app does not access any personal and sensitive user data.
6 |
7 | The application uses [Google Analytics for Firebase](https://firebase.google.com/products/analytics) to help the developer improve the functionality based on anonymized usage data.
8 |
9 | In case of any questions, contact the developer via email [que.ou.quand@gmail.com](mailto:que.ou.quand@gmail.com).
10 |
--------------------------------------------------------------------------------
/screenshots/dark.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/screenshots/dark.png
--------------------------------------------------------------------------------
/screenshots/dark/01-splash_screen.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/screenshots/dark/01-splash_screen.jpg
--------------------------------------------------------------------------------
/screenshots/dark/02-latest.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/screenshots/dark/02-latest.jpg
--------------------------------------------------------------------------------
/screenshots/dark/03-latest_scrolled.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/screenshots/dark/03-latest_scrolled.jpg
--------------------------------------------------------------------------------
/screenshots/dark/04-tournament.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/screenshots/dark/04-tournament.jpg
--------------------------------------------------------------------------------
/screenshots/dark/05-tournament_menu.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/screenshots/dark/05-tournament_menu.jpg
--------------------------------------------------------------------------------
/screenshots/dark/06-tournament_about.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/screenshots/dark/06-tournament_about.jpg
--------------------------------------------------------------------------------
/screenshots/dark/07-tournaments_tree.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/screenshots/dark/07-tournaments_tree.jpg
--------------------------------------------------------------------------------
/screenshots/dark/08-search.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/screenshots/dark/08-search.jpg
--------------------------------------------------------------------------------
/screenshots/dark/09-settings.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/screenshots/dark/09-settings.jpg
--------------------------------------------------------------------------------
/screenshots/dark/10-question1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/screenshots/dark/10-question1.jpg
--------------------------------------------------------------------------------
/screenshots/dark/11-question2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/screenshots/dark/11-question2.jpg
--------------------------------------------------------------------------------
/screenshots/dark/12-search2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/screenshots/dark/12-search2.jpg
--------------------------------------------------------------------------------
/screenshots/dark/13-tournament2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/screenshots/dark/13-tournament2.jpg
--------------------------------------------------------------------------------
/screenshots/dark/14-question3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/screenshots/dark/14-question3.jpg
--------------------------------------------------------------------------------
/screenshots/dark/15-about.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/screenshots/dark/15-about.jpg
--------------------------------------------------------------------------------
/screenshots/dark/16-tournaments_tree2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/screenshots/dark/16-tournaments_tree2.jpg
--------------------------------------------------------------------------------
/screenshots/dark/17-tournaments_tree3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/screenshots/dark/17-tournaments_tree3.jpg
--------------------------------------------------------------------------------
/screenshots/dark_minimized.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/screenshots/dark_minimized.png
--------------------------------------------------------------------------------
/screenshots/light.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/screenshots/light.png
--------------------------------------------------------------------------------
/screenshots/light/01-splash_screen.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/screenshots/light/01-splash_screen.jpg
--------------------------------------------------------------------------------
/screenshots/light/02-latest.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/screenshots/light/02-latest.jpg
--------------------------------------------------------------------------------
/screenshots/light/03-latest_scrolled.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/screenshots/light/03-latest_scrolled.jpg
--------------------------------------------------------------------------------
/screenshots/light/04-tournament.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/screenshots/light/04-tournament.jpg
--------------------------------------------------------------------------------
/screenshots/light/05-tournament_menu.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/screenshots/light/05-tournament_menu.jpg
--------------------------------------------------------------------------------
/screenshots/light/06-tournament_about.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/screenshots/light/06-tournament_about.jpg
--------------------------------------------------------------------------------
/screenshots/light/07-tournaments_tree.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/screenshots/light/07-tournaments_tree.jpg
--------------------------------------------------------------------------------
/screenshots/light/08-search.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/screenshots/light/08-search.jpg
--------------------------------------------------------------------------------
/screenshots/light/09-settings.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/screenshots/light/09-settings.jpg
--------------------------------------------------------------------------------
/screenshots/light/10-question1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/screenshots/light/10-question1.jpg
--------------------------------------------------------------------------------
/screenshots/light/11-question2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/screenshots/light/11-question2.jpg
--------------------------------------------------------------------------------
/screenshots/light/12-search2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/screenshots/light/12-search2.jpg
--------------------------------------------------------------------------------
/screenshots/light/13-tournament2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/screenshots/light/13-tournament2.jpg
--------------------------------------------------------------------------------
/screenshots/light/14-question3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/screenshots/light/14-question3.jpg
--------------------------------------------------------------------------------
/screenshots/light/15-about.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/screenshots/light/15-about.jpg
--------------------------------------------------------------------------------
/screenshots/light/16-tournaments_tree2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/screenshots/light/16-tournaments_tree2.jpg
--------------------------------------------------------------------------------
/screenshots/light/17-tournaments_tree3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/screenshots/light/17-tournaments_tree3.jpg
--------------------------------------------------------------------------------
/screenshots/light_minimized.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/screenshots/light_minimized.png
--------------------------------------------------------------------------------
/www-app/app/www_app/.gitignore:
--------------------------------------------------------------------------------
1 | # Miscellaneous
2 | *.class
3 | *.log
4 | *.pyc
5 | *.swp
6 | .DS_Store
7 | .atom/
8 | .buildlog/
9 | .history
10 | .svn/
11 |
12 | # IntelliJ related
13 | *.iml
14 | *.ipr
15 | *.iws
16 | .idea/
17 |
18 | # The .vscode folder contains launch configuration and tasks you configure in
19 | # VS Code which you may wish to be included in version control, so this line
20 | # is commented out by default.
21 | #.vscode/
22 |
23 | # Flutter/Dart/Pub related
24 | **/doc/api/
25 | **/ios/Flutter/.last_build_id
26 | .dart_tool/
27 | .flutter-plugins
28 | .flutter-plugins-dependencies
29 | .packages
30 | .pub-cache/
31 | .pub/
32 | /build/
33 |
34 | # Web related
35 | lib/generated_plugin_registrant.dart
36 |
37 | # Symbolication related
38 | app.*.symbols
39 |
40 | # Obfuscation related
41 | app.*.map.json
42 |
43 | # Android Studio will place build artifacts here
44 | /android/app/debug
45 | /android/app/profile
46 | /android/app/release
47 |
--------------------------------------------------------------------------------
/www-app/app/www_app/analysis_options.yaml:
--------------------------------------------------------------------------------
1 | include: package:www_analysis/analysis_options.yaml
--------------------------------------------------------------------------------
/www-app/app/www_app/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 |
--------------------------------------------------------------------------------
/www-app/app/www_app/android/app/google-services.json:
--------------------------------------------------------------------------------
1 | {
2 | "project_info": {
3 | "project_number": "",
4 | "firebase_url": "",
5 | "project_id": "",
6 | "storage_bucket": ""
7 | },
8 | "client": [
9 | {
10 | "client_info": {
11 | "mobilesdk_app_id": "",
12 | "android_client_info": {
13 | "package_name": "chgk.droid"
14 | }
15 | },
16 | "oauth_client": [
17 | {
18 | "client_id": "",
19 | "client_type": 3
20 | }
21 | ],
22 | "api_key": [
23 | {
24 | "current_key": ""
25 | }
26 | ],
27 | "services": {
28 | "analytics_service": {
29 | "status": 1
30 | },
31 | "appinvite_service": {
32 | "status": 1,
33 | "other_platform_oauth_client": []
34 | },
35 | "ads_service": {
36 | "status": 2
37 | }
38 | }
39 | }
40 | ],
41 | "configuration_version": "1"
42 | }
--------------------------------------------------------------------------------
/www-app/app/www_app/android/app/src/debug/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/www-app/app/www_app/android/app/src/main/kotlin/droid/chgk/MainActivity.kt:
--------------------------------------------------------------------------------
1 | package chgk.droid
2 |
3 | import io.flutter.embedding.android.FlutterActivity
4 |
5 | class MainActivity: FlutterActivity() {
6 | }
7 |
--------------------------------------------------------------------------------
/www-app/app/www_app/android/app/src/main/res/drawable/launcher_icon_background.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
12 |
--------------------------------------------------------------------------------
/www-app/app/www_app/android/app/src/main/res/drawable/screen_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/www-app/app/www_app/android/app/src/main/res/mipmap-anydpi-v26/launcher_icon.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/www-app/app/www_app/android/app/src/main/res/values-night/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #212121
4 |
--------------------------------------------------------------------------------
/www-app/app/www_app/android/app/src/main/res/values-night/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
7 |
8 |
11 |
12 |
--------------------------------------------------------------------------------
/www-app/app/www_app/android/app/src/main/res/values-ru/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Сова
4 |
5 |
--------------------------------------------------------------------------------
/www-app/app/www_app/android/app/src/main/res/values-uk/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Сова
4 |
5 |
--------------------------------------------------------------------------------
/www-app/app/www_app/android/app/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #004D40
4 |
--------------------------------------------------------------------------------
/www-app/app/www_app/android/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Sova
4 |
5 |
--------------------------------------------------------------------------------
/www-app/app/www_app/android/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
7 |
8 |
11 |
12 |
--------------------------------------------------------------------------------
/www-app/app/www_app/android/app/src/profile/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/www-app/app/www_app/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.1.2'
10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
11 | classpath 'com.google.gms:google-services:4.3.14'
12 | classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.2'
13 | }
14 | }
15 |
16 | allprojects {
17 | repositories {
18 | google()
19 | mavenCentral()
20 | }
21 | }
22 |
23 | rootProject.buildDir = '../build'
24 | subprojects {
25 | project.buildDir = "${rootProject.buildDir}/${project.name}"
26 | }
27 | subprojects {
28 | project.evaluationDependsOn(':app')
29 | }
30 |
31 | tasks.register("clean", Delete) {
32 | delete rootProject.buildDir
33 | }
34 |
--------------------------------------------------------------------------------
/www-app/app/www_app/android/gradle.properties:
--------------------------------------------------------------------------------
1 | org.gradle.jvmargs=-Xmx1536M
2 | android.useAndroidX=true
3 | android.enableJetifier=true
4 |
--------------------------------------------------------------------------------
/www-app/app/www_app/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.4-all.zip
6 |
--------------------------------------------------------------------------------
/www-app/app/www_app/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 |
--------------------------------------------------------------------------------
/www-app/app/www_app/assets/timer.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/www-app/app/www_app/assets/timer.mp3
--------------------------------------------------------------------------------
/www-app/app/www_app/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 |
--------------------------------------------------------------------------------
/www-app/app/www_app/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 |
--------------------------------------------------------------------------------
/www-app/app/www_app/ios/Flutter/Debug.xcconfig:
--------------------------------------------------------------------------------
1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
2 | #include "Generated.xcconfig"
3 |
--------------------------------------------------------------------------------
/www-app/app/www_app/ios/Flutter/Release.xcconfig:
--------------------------------------------------------------------------------
1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
2 | #include "Generated.xcconfig"
3 |
--------------------------------------------------------------------------------
/www-app/app/www_app/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/www-app/app/www_app/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/www-app/app/www_app/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | PreviewsEnabled
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/www-app/app/www_app/ios/Runner.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/www-app/app/www_app/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/www-app/app/www_app/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | PreviewsEnabled
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/www-app/app/www_app/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 |
--------------------------------------------------------------------------------
/www-app/app/www_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/www-app/app/www_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
--------------------------------------------------------------------------------
/www-app/app/www_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/www-app/app/www_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
--------------------------------------------------------------------------------
/www-app/app/www_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/www-app/app/www_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
--------------------------------------------------------------------------------
/www-app/app/www_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/www-app/app/www_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
--------------------------------------------------------------------------------
/www-app/app/www_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/www-app/app/www_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
--------------------------------------------------------------------------------
/www-app/app/www_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/www-app/app/www_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
--------------------------------------------------------------------------------
/www-app/app/www_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/www-app/app/www_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
--------------------------------------------------------------------------------
/www-app/app/www_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/www-app/app/www_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
--------------------------------------------------------------------------------
/www-app/app/www_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/www-app/app/www_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
--------------------------------------------------------------------------------
/www-app/app/www_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/www-app/app/www_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
--------------------------------------------------------------------------------
/www-app/app/www_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/www-app/app/www_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
--------------------------------------------------------------------------------
/www-app/app/www_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/www-app/app/www_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
--------------------------------------------------------------------------------
/www-app/app/www_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/www-app/app/www_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
--------------------------------------------------------------------------------
/www-app/app/www_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/www-app/app/www_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
--------------------------------------------------------------------------------
/www-app/app/www_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/www-app/app/www_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
--------------------------------------------------------------------------------
/www-app/app/www_app/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "LaunchImage.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "filename" : "LaunchImage@2x.png",
11 | "scale" : "2x"
12 | },
13 | {
14 | "idiom" : "universal",
15 | "filename" : "LaunchImage@3x.png",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "version" : 1,
21 | "author" : "xcode"
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/www-app/app/www_app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/www-app/app/www_app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
--------------------------------------------------------------------------------
/www-app/app/www_app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/www-app/app/www_app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
--------------------------------------------------------------------------------
/www-app/app/www_app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/www-app/app/www_app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
--------------------------------------------------------------------------------
/www-app/app/www_app/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.
--------------------------------------------------------------------------------
/www-app/app/www_app/ios/Runner/Runner-Bridging-Header.h:
--------------------------------------------------------------------------------
1 | #import "GeneratedPluginRegistrant.h"
2 |
--------------------------------------------------------------------------------
/www-app/app/www_app/ios/Runner/en.lproj/InfoPlist.strings:
--------------------------------------------------------------------------------
1 | "CFBundleDisplayName" = "Sova";
2 |
--------------------------------------------------------------------------------
/www-app/app/www_app/ios/Runner/ru.lproj/InfoPlist.strings:
--------------------------------------------------------------------------------
1 | "CFBundleDisplayName" = "Сова";
2 |
--------------------------------------------------------------------------------
/www-app/app/www_app/ios/Runner/uk.lproj/InfoPlist.strings:
--------------------------------------------------------------------------------
1 | "CFBundleDisplayName" = "Сова";
2 |
--------------------------------------------------------------------------------
/www-app/app/www_app/lib/main.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:www_app/src/app.dart';
3 | import 'package:www_app_di/www_app_di.dart';
4 | import 'package:www_redux_store/www_redux_store.dart';
5 |
6 | void main() {
7 | final diContainer = createDIContainer();
8 |
9 | runApp(WWWApp(
10 | store: diContainer(),
11 | container: diContainer,
12 | ));
13 | }
14 |
--------------------------------------------------------------------------------
/www-app/app/www_app/pubspec.yaml:
--------------------------------------------------------------------------------
1 | name: www_app
2 | description: What? When? Where?
3 | version: 2.3.1+20301
4 | publish_to: none
5 |
6 | environment:
7 | sdk: ^3.4.1
8 | flutter: ^3.22.1
9 |
10 | dependencies:
11 | flutter:
12 | sdk: flutter
13 | www_app_di:
14 | path: ../www_app_di
15 | www_widgets:
16 | path: ../../design/www_widgets
17 |
18 | dev_dependencies:
19 | www_analysis:
20 | path: ../../utils/www_analysis
21 |
22 | flutter:
23 | uses-material-design: true
24 | assets:
25 | - assets/
26 |
27 | dependency_overrides:
28 | package_info_plus: 4.1.0 # caused by app_review: 2.1.2+1
29 |
--------------------------------------------------------------------------------
/www-app/app/www_app_di/analysis_options.yaml:
--------------------------------------------------------------------------------
1 | include: package:www_analysis/analysis_options.yaml
--------------------------------------------------------------------------------
/www-app/app/www_app_di/lib/src/di/di_container.dart:
--------------------------------------------------------------------------------
1 | abstract class IContainer {
2 | T call();
3 | }
4 |
--------------------------------------------------------------------------------
/www-app/app/www_app_di/lib/src/di/di_container_implementation.dart:
--------------------------------------------------------------------------------
1 | import 'package:get_it/get_it.dart';
2 | import 'package:www_app_di/src/di/di_container.dart';
3 | import 'package:www_app_di/src/di/di_module.dart';
4 |
5 | final _getIt = GetIt.instance;
6 |
7 | class _WWWDIContainer implements IContainer {
8 | const _WWWDIContainer(this._getIt);
9 |
10 | final GetIt _getIt;
11 |
12 | @override
13 | T call() => _getIt();
14 | }
15 |
16 | IContainer createDIContainer() {
17 | const WWWDIModuleApp().init(_getIt);
18 | return _WWWDIContainer(_getIt);
19 | }
20 |
--------------------------------------------------------------------------------
/www-app/app/www_app_di/lib/www_app_di.dart:
--------------------------------------------------------------------------------
1 | export 'package:www_app_di/src/di/di_container.dart';
2 | export 'package:www_app_di/src/di/di_container_implementation.dart';
3 |
--------------------------------------------------------------------------------
/www-app/app/www_navigation/analysis_options.yaml:
--------------------------------------------------------------------------------
1 | include: package:www_analysis/analysis_options.yaml
--------------------------------------------------------------------------------
/www-app/app/www_navigation/lib/src/di/di_module.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:get_it/get_it.dart';
3 | import 'package:injectable/injectable.dart';
4 | import 'package:www_di/www_di.dart';
5 | import 'package:www_navigation/src/di/di_module.config.dart';
6 |
7 | class WWWDIModuleNavigation extends WWWDIModule {
8 | const WWWDIModuleNavigation() : super(_init);
9 | }
10 |
11 | @injectableInit
12 | void _init(GetIt getIt) => getIt.init();
13 |
14 | @module
15 | abstract class RegisterModule {
16 | @lazySingleton
17 | GlobalKey get key => GlobalKey();
18 | }
19 |
--------------------------------------------------------------------------------
/www-app/app/www_navigation/lib/www_navigation.dart:
--------------------------------------------------------------------------------
1 | export 'package:www_navigation/src/di/di_module.dart';
2 | export 'package:www_navigation/src/redux/middleware.dart';
3 |
--------------------------------------------------------------------------------
/www-app/app/www_redux_store/analysis_options.yaml:
--------------------------------------------------------------------------------
1 | include: package:www_analysis/analysis_options.yaml
--------------------------------------------------------------------------------
/www-app/app/www_redux_store/lib/src/di/di_module.dart:
--------------------------------------------------------------------------------
1 | import 'package:get_it/get_it.dart';
2 | import 'package:injectable/injectable.dart';
3 | import 'package:www_di/www_di.dart';
4 | import 'package:www_redux_store/src/di/di_module.config.dart';
5 |
6 | class WWWDIModuleReduxStore extends WWWDIModule {
7 | const WWWDIModuleReduxStore() : super(_init);
8 | }
9 |
10 | @injectableInit
11 | void _init(GetIt getIt) => getIt.init();
12 |
--------------------------------------------------------------------------------
/www-app/app/www_redux_store/lib/src/loggers/logs/middleware.dart:
--------------------------------------------------------------------------------
1 | import 'package:injectable/injectable.dart';
2 | import 'package:redux/redux.dart';
3 | import 'package:www_logger/www_logger.dart';
4 | import 'package:www_redux/www_redux.dart';
5 |
6 | @injectable
7 | class LogsMiddleware implements IMiddleware {
8 | @override
9 | Iterable> get middleware => _middleware;
10 | late final _middleware = _createMiddleware();
11 |
12 | List> _createMiddleware() => [
13 | TypedMiddleware(_onLog),
14 | ];
15 |
16 | void _onLog(Store store, dynamic action, NextDispatcher next) {
17 | log(action.runtimeType);
18 |
19 | next(action);
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/www-app/app/www_redux_store/lib/src/redux/store.dart:
--------------------------------------------------------------------------------
1 | import 'package:injectable/injectable.dart';
2 | import 'package:redux/redux.dart';
3 | import 'package:www_redux_store/src/redux/middleware.dart';
4 | import 'package:www_redux_store/src/redux/reducer.dart';
5 | import 'package:www_redux_store/src/redux/state.dart';
6 |
7 | @injectable
8 | class WWWStore extends Store {
9 | WWWStore({
10 | required AppMiddleware appMiddleware,
11 | required AppReducer appReducer,
12 | }) : super(
13 | appReducer.reducer,
14 | initialState: AppState.initial(),
15 | middleware: appMiddleware.middleware.toList(),
16 | );
17 | }
18 |
--------------------------------------------------------------------------------
/www-app/app/www_redux_store/lib/www_redux_store.dart:
--------------------------------------------------------------------------------
1 | export 'package:www_redux_store/src/di/di_module.dart';
2 | export 'package:www_redux_store/src/redux/state.dart';
3 | export 'package:www_redux_store/src/redux/store.dart';
4 |
--------------------------------------------------------------------------------
/www-app/app/www_redux_store/test/mocks/fakes.dart:
--------------------------------------------------------------------------------
1 | import 'package:www_redux/www_redux.dart';
2 |
3 | class TestState implements IState {
4 | const TestState();
5 | }
6 |
--------------------------------------------------------------------------------
/www-app/app/www_redux_store/test/mocks/mocks.dart:
--------------------------------------------------------------------------------
1 | import 'package:mocktail/mocktail.dart';
2 | import 'package:www_analytics/www_analytics.dart';
3 |
4 | class MockAnalyticsService extends Mock implements IAnalyticsService {}
5 |
--------------------------------------------------------------------------------
/www-app/core/www_constants/analysis_options.yaml:
--------------------------------------------------------------------------------
1 | include: package:www_analysis/analysis_options.yaml
--------------------------------------------------------------------------------
/www-app/core/www_constants/lib/src/constants.dart:
--------------------------------------------------------------------------------
1 | abstract class WWWConstants {
2 | static const databaseUrl = 'https://db.chgk.info';
3 | static const playMarketLink =
4 | 'https://play.google.com/store/apps/details?id=chgk.droid';
5 | static const appStoreLink = '';
6 | static const developerEmail = 'que.ou.quand@gmail.com';
7 | static const developerWebsite = 'https://foxanna.github.io/';
8 | static const privacyPolicyLink = 'https://github.com/foxanna/WWW-flutter/blob/main/PRIVACY_POLICY.md';
9 | }
10 |
--------------------------------------------------------------------------------
/www-app/core/www_constants/lib/www_constants.dart:
--------------------------------------------------------------------------------
1 | export 'package:www_constants/src/constants.dart';
2 |
--------------------------------------------------------------------------------
/www-app/core/www_constants/pubspec.yaml:
--------------------------------------------------------------------------------
1 | name: www_constants
2 | description: Application constants
3 | publish_to: none
4 |
5 | environment:
6 | sdk: ^3.4.1
7 | flutter: ^3.22.1
8 |
9 | dependencies:
10 | flutter:
11 | sdk: flutter
12 |
13 | dev_dependencies:
14 | www_analysis:
15 | path: ../../utils/www_analysis
16 |
--------------------------------------------------------------------------------
/www-app/core/www_http/analysis_options.yaml:
--------------------------------------------------------------------------------
1 | include: package:www_analysis/analysis_options.yaml
--------------------------------------------------------------------------------
/www-app/core/www_http/lib/src/di/di_module.dart:
--------------------------------------------------------------------------------
1 | import 'package:get_it/get_it.dart';
2 | import 'package:injectable/injectable.dart';
3 | import 'package:www_di/www_di.dart';
4 | import 'package:www_http/src/di/di_module.config.dart';
5 |
6 | class WWWDIModuleHttp extends WWWDIModule {
7 | const WWWDIModuleHttp() : super(_init);
8 | }
9 |
10 | @injectableInit
11 | void _init(GetIt getIt) => getIt.init();
12 |
--------------------------------------------------------------------------------
/www-app/core/www_http/lib/src/dio/dio_config/dio_config_module.dart:
--------------------------------------------------------------------------------
1 | import 'package:dio/dio.dart';
2 | import 'package:get_it/get_it.dart';
3 | import 'package:injectable/injectable.dart';
4 | import 'package:www_constants/www_constants.dart';
5 | import 'package:www_http/src/dio/dio_config/dio_config_parameters.dart';
6 | import 'package:www_http/src/dio/dio_factory.dart';
7 |
8 | @module
9 | abstract class DioConfigInjectableModule {
10 | @Named(DioConfigParameters.baseUrl)
11 | String get baseUrl => WWWConstants.databaseUrl;
12 |
13 | @Named(DioConfigParameters.connectTimeout)
14 | Duration get connectTimeout => const Duration(seconds: 30);
15 |
16 | @Named(DioConfigParameters.receiveTimeout)
17 | Duration get receiveTimeout => const Duration(seconds: 60);
18 |
19 | @Named(DioConfigParameters.logHttpCommunication)
20 | bool get logHttpCommunication => true;
21 |
22 | @Named(DioConfigParameters.logHttpResponseContent)
23 | bool get logHttpResponseContent => false;
24 |
25 | @lazySingleton
26 | Dio get dio => GetIt.instance().create();
27 | }
28 |
--------------------------------------------------------------------------------
/www-app/core/www_http/lib/src/dio/dio_config/dio_config_parameters.dart:
--------------------------------------------------------------------------------
1 | abstract class DioConfigParameters {
2 | static const baseUrl = 'baseUrl';
3 | static const connectTimeout = 'connectTimeout';
4 | static const receiveTimeout = 'receiveTimeout';
5 | static const logHttpCommunication = 'logHttpCommunication';
6 | static const logHttpResponseContent = 'logHttpResponseContent';
7 | }
8 |
--------------------------------------------------------------------------------
/www-app/core/www_http/lib/src/service/http_client.dart:
--------------------------------------------------------------------------------
1 | import 'package:dio/dio.dart';
2 | import 'package:injectable/injectable.dart';
3 | import 'package:www_utils/www_utils.dart';
4 |
5 | abstract class IHttpClient {
6 | Future get(Uri uri, {CancelToken cancelToken});
7 | }
8 |
9 | @LazySingleton(as: IHttpClient)
10 | class HttpClient implements IHttpClient {
11 | const HttpClient({
12 | required Dio dio,
13 | }) : _dio = dio;
14 |
15 | final Dio _dio;
16 |
17 | @override
18 | Future get(Uri uri, {CancelToken? cancelToken}) async {
19 | try {
20 | final response =
21 | await _dio.get(uri.toString(), cancelToken: cancelToken);
22 | return response.data ?? '';
23 | } on DioException catch (e) {
24 | throw NetworkException(message: e.toString());
25 | } on Exception {
26 | rethrow;
27 | } on Error catch (e) {
28 | throw Exception(e.toString());
29 | }
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/www-app/core/www_http/lib/www_http.dart:
--------------------------------------------------------------------------------
1 | export 'package:www_http/src/di/di_module.dart';
2 | export 'package:www_http/src/service/http_client.dart';
3 |
--------------------------------------------------------------------------------
/www-app/core/www_http/pubspec.yaml:
--------------------------------------------------------------------------------
1 | name: www_http
2 | description: Http client
3 | publish_to: none
4 |
5 | environment:
6 | sdk: ^3.4.1
7 | flutter: ^3.22.1
8 |
9 | dependencies:
10 | dio: ^5.3.2
11 | flutter:
12 | sdk: flutter
13 | injectable: 2.4.2
14 | www_constants:
15 | path: ../www_constants/
16 | www_di:
17 | path: ../../utils/www_di/
18 | www_logger:
19 | path: ../../utils/www_logger/
20 | www_utils:
21 | path: ../../utils/www_utils
22 |
23 | dev_dependencies:
24 | build_runner: 2.4.11
25 | injectable_generator: 2.6.1
26 | www_analysis:
27 | path: ../../utils/www_analysis
28 |
--------------------------------------------------------------------------------
/www-app/core/www_localization/analysis_options.yaml:
--------------------------------------------------------------------------------
1 | include: package:www_analysis/analysis_options.yaml
--------------------------------------------------------------------------------
/www-app/core/www_localization/lib/src/extensions.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/widgets.dart';
2 | import 'package:www_localization/src/localizations.dart';
3 | import 'package:www_localization/src/translations/translations.i69n.dart';
4 |
5 | extension BuildContextLocalizationX on BuildContext {
6 | Translations get translations => WWWLocalizations.of(this);
7 | }
8 |
--------------------------------------------------------------------------------
/www-app/core/www_localization/lib/www_localization.dart:
--------------------------------------------------------------------------------
1 | export 'package:www_localization/src/extensions.dart';
2 | export 'package:www_localization/src/localizations.dart';
3 | export 'package:www_localization/src/translations/translations.i69n.dart';
4 |
--------------------------------------------------------------------------------
/www-app/core/www_localization/pubspec.yaml:
--------------------------------------------------------------------------------
1 | name: www_localization
2 | description: Localization resources for www_* packages
3 | publish_to: none
4 |
5 | environment:
6 | sdk: ^3.4.1
7 | flutter: ^3.22.1
8 |
9 | dependencies:
10 | flutter:
11 | sdk: flutter
12 | flutter_localizations:
13 | sdk: flutter
14 | i69n: ^2.1.0
15 |
16 | dev_dependencies:
17 | build_runner: 2.4.11
18 | www_analysis:
19 | path: ../../utils/www_analysis
20 |
--------------------------------------------------------------------------------
/www-app/design/www_custom_icons/analysis_options.yaml:
--------------------------------------------------------------------------------
1 | include: package:www_analysis/analysis_options.yaml
--------------------------------------------------------------------------------
/www-app/design/www_custom_icons/assets/CustomIcons.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/foxanna/WWW-flutter/c441026d634d10c652a90f68983c694ae9106a09/www-app/design/www_custom_icons/assets/CustomIcons.ttf
--------------------------------------------------------------------------------
/www-app/design/www_custom_icons/lib/src/custom_icons.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/widgets.dart';
2 |
3 | class WWWCustomIcons {
4 | WWWCustomIcons._();
5 |
6 | static const _kFontFam = 'CustomIcons';
7 | static const String? _kFontPkg = 'www_custom_icons';
8 |
9 | static const IconData random_card =
10 | IconData(0xe800, fontFamily: _kFontFam, fontPackage: _kFontPkg);
11 | static const IconData bookmarks =
12 | IconData(0xe802, fontFamily: _kFontFam, fontPackage: _kFontPkg);
13 | static const IconData tree =
14 | IconData(0xe805, fontFamily: _kFontFam, fontPackage: _kFontPkg);
15 | static const IconData settings =
16 | IconData(0xe806, fontFamily: _kFontFam, fontPackage: _kFontPkg);
17 | }
18 |
--------------------------------------------------------------------------------
/www-app/design/www_custom_icons/lib/www_custom_icons.dart:
--------------------------------------------------------------------------------
1 | export 'package:www_custom_icons/src/custom_icons.dart';
2 |
--------------------------------------------------------------------------------
/www-app/design/www_custom_icons/pubspec.yaml:
--------------------------------------------------------------------------------
1 | name: www_custom_icons
2 | description: A wrapper over icons font for www_* features
3 | publish_to: none
4 |
5 | environment:
6 | sdk: ^3.4.1
7 | flutter: ^3.22.1
8 |
9 | dependencies:
10 | flutter:
11 | sdk: flutter
12 |
13 | dev_dependencies:
14 | www_analysis:
15 | path: ../../utils/www_analysis
16 |
17 | flutter:
18 | fonts:
19 | - family: CustomIcons
20 | fonts:
21 | - asset: assets/CustomIcons.ttf
22 |
--------------------------------------------------------------------------------
/www-app/design/www_theme/analysis_options.yaml:
--------------------------------------------------------------------------------
1 | include: package:www_analysis/analysis_options.yaml
--------------------------------------------------------------------------------
/www-app/design/www_theme/lib/src/dimensions.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | class Dimensions {
4 | Dimensions._();
5 |
6 | static const defaultPadding = EdgeInsets.all(defaultSidePadding);
7 | static const defaultSidePadding = 8.0;
8 | static const defaultSpacing = 8.0;
9 | static const dialogContentPadding =
10 | EdgeInsets.symmetric(vertical: 24, horizontal: 24);
11 |
12 | static const double mediumComponentsCornerRadiusValue = 16.0;
13 | static const double largeComponentsCornerRadiusValue = 32.0;
14 | }
15 |
--------------------------------------------------------------------------------
/www-app/design/www_theme/lib/src/extensions.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/widgets.dart';
2 | import 'package:www_theme/src/style_configuration.dart';
3 |
4 | extension BuildContextStyleConfigurationX on BuildContext {
5 | StyleConfiguration get styleConfig => StyleConfiguration.of(this);
6 | }
7 |
--------------------------------------------------------------------------------
/www-app/design/www_theme/lib/src/style_configurator.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:www_theme/src/style_configuration.dart';
3 |
4 | class StyleConfigurator extends StatelessWidget {
5 | const StyleConfigurator({Key? key, required this.child}) : super(key: key);
6 |
7 | final Widget child;
8 |
9 | @override
10 | Widget build(BuildContext context) => StyleConfigurationInheritedWidget(
11 | styleConfiguration: StyleConfiguration(context: context),
12 | child: child,
13 | );
14 | }
15 |
16 | class StyleConfigurationInheritedWidget extends InheritedWidget {
17 | const StyleConfigurationInheritedWidget({
18 | Key? key,
19 | required Widget child,
20 | required this.styleConfiguration,
21 | }) : super(
22 | key: key,
23 | child: child,
24 | );
25 |
26 | final StyleConfiguration styleConfiguration;
27 |
28 | @override
29 | bool updateShouldNotify(StyleConfigurationInheritedWidget oldWidget) =>
30 | this.styleConfiguration != oldWidget.styleConfiguration;
31 | }
32 |
--------------------------------------------------------------------------------
/www-app/design/www_theme/lib/www_theme.dart:
--------------------------------------------------------------------------------
1 | export 'package:www_theme/src/dimensions.dart';
2 | export 'package:www_theme/src/extensions.dart';
3 | export 'package:www_theme/src/style_configuration.dart';
4 | export 'package:www_theme/src/style_configurator.dart';
5 | export 'package:www_theme/src/text_sections_theme_data.dart';
6 | export 'package:www_theme/src/themes.dart';
7 |
--------------------------------------------------------------------------------
/www-app/design/www_theme/pubspec.yaml:
--------------------------------------------------------------------------------
1 | name: www_theme
2 | description: Theme and styles for www_* features
3 | publish_to: none
4 |
5 | environment:
6 | sdk: ^3.4.1
7 | flutter: ^3.22.1
8 |
9 | dependencies:
10 | flutter:
11 | sdk: flutter
12 |
13 | dev_dependencies:
14 | www_analysis:
15 | path: ../../utils/www_analysis
16 |
--------------------------------------------------------------------------------
/www-app/design/www_widgets/analysis_options.yaml:
--------------------------------------------------------------------------------
1 | include: package:www_analysis/analysis_options.yaml
--------------------------------------------------------------------------------
/www-app/design/www_widgets/lib/src/animated_fab.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | class AnimatedFab extends StatelessWidget {
4 | const AnimatedFab({
5 | Key? key,
6 | required this.visible,
7 | this.onPressed,
8 | required this.child,
9 | }) : super(key: key);
10 |
11 | final bool visible;
12 | final VoidCallback? onPressed;
13 | final Widget child;
14 |
15 | @override
16 | Widget build(BuildContext context) => AnimatedScale(
17 | scale: visible ? 1.0 : 0.8,
18 | duration: const Duration(milliseconds: 150),
19 | child: AnimatedOpacity(
20 | opacity: visible ? 1.0 : 0.0,
21 | duration: const Duration(milliseconds: 150),
22 | child: Visibility(
23 | visible: visible,
24 | child: FloatingActionButton(
25 | onPressed: onPressed,
26 | child: child,
27 | ),
28 | ),
29 | ),
30 | );
31 | }
32 |
--------------------------------------------------------------------------------
/www-app/design/www_widgets/lib/src/empty_sliver.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | class EmptySliver extends StatelessWidget {
4 | const EmptySliver({Key? key}) : super(key: key);
5 |
6 | @override
7 | Widget build(BuildContext context) => SliverFillRemaining(
8 | hasScrollBody: false,
9 | child: Container(),
10 | );
11 | }
12 |
--------------------------------------------------------------------------------
/www-app/design/www_widgets/lib/src/gradient_decoration.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | @immutable
4 | class GradientDecoration extends BoxDecoration {
5 | factory GradientDecoration({required Color color}) {
6 | final gradientEnd = color;
7 | final gradientStart = color.withAlpha(0);
8 | const gradientSize = 0.05;
9 | final gradient = LinearGradient(
10 | begin: Alignment.topCenter,
11 | end: Alignment.bottomCenter,
12 | colors: [gradientEnd, gradientStart, gradientStart, gradientEnd],
13 | stops: const [0, gradientSize, 1 - gradientSize, 1]);
14 | return GradientDecoration._(gradient: gradient);
15 | }
16 |
17 | const GradientDecoration._({required Gradient gradient})
18 | : super(gradient: gradient);
19 | }
20 |
--------------------------------------------------------------------------------
/www-app/design/www_widgets/lib/src/modal_bottom_sheet_container.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:www_theme/www_theme.dart';
3 |
4 | class ModalBottomSheetContainer extends StatelessWidget {
5 | const ModalBottomSheetContainer({
6 | Key? key,
7 | required this.children,
8 | }) : super(key: key);
9 |
10 | final List children;
11 |
12 | @override
13 | Widget build(BuildContext context) => Padding(
14 | padding:
15 | context.styleConfig.bottomSheetStyleConfiguration.contentPadding,
16 | child: Column(
17 | mainAxisSize: MainAxisSize.min,
18 | children: children,
19 | ),
20 | );
21 | }
22 |
--------------------------------------------------------------------------------
/www-app/design/www_widgets/lib/src/progress_indicator.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | class WWWProgressIndicator extends StatelessWidget {
4 | const WWWProgressIndicator({Key? key}) : super(key: key);
5 |
6 | @override
7 | Widget build(BuildContext context) =>
8 | const Center(child: CircularProgressIndicator());
9 | }
10 |
--------------------------------------------------------------------------------
/www-app/design/www_widgets/lib/src/status_bar_brightness.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:flutter/services.dart';
3 |
4 | class WWWStatusBarBrightness extends StatelessWidget {
5 | const WWWStatusBarBrightness({
6 | Key? key,
7 | required this.statusBarBrightness,
8 | required this.child,
9 | }) : super(key: key);
10 |
11 | final Widget child;
12 | final Brightness statusBarBrightness;
13 |
14 | @override
15 | Widget build(BuildContext context) {
16 | final theme = Theme.of(context);
17 |
18 | return AnnotatedRegion(
19 | value: statusBarBrightness == Brightness.light
20 | ? SystemUiOverlayStyle.light
21 | : SystemUiOverlayStyle.dark,
22 | child: Theme(
23 | data: theme.copyWith(
24 | appBarTheme: theme.appBarTheme,
25 | ),
26 | child: child,
27 | ),
28 | );
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/www-app/design/www_widgets/lib/src/unexpected_state_widget.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:www_localization/www_localization.dart';
3 |
4 | class UnexpectedStateWidget extends StatelessWidget {
5 | const UnexpectedStateWidget({Key? key}) : super(key: key);
6 |
7 | @override
8 | Widget build(BuildContext context) => Padding(
9 | padding: const EdgeInsets.all(8),
10 | child: Center(
11 | child: Text(context.translations.errorMessageGeneric,
12 | textAlign: TextAlign.center,
13 | style: Theme.of(context).textTheme.bodySmall),
14 | ),
15 | );
16 | }
17 |
18 | class UnexpectedStateSliver extends StatelessWidget {
19 | const UnexpectedStateSliver({Key? key}) : super(key: key);
20 |
21 | @override
22 | Widget build(BuildContext context) =>
23 | const SliverToBoxAdapter(child: UnexpectedStateWidget());
24 | }
25 |
--------------------------------------------------------------------------------
/www-app/design/www_widgets/pubspec.yaml:
--------------------------------------------------------------------------------
1 | name: www_widgets
2 | description: Common widgets for www_* features
3 | publish_to: none
4 |
5 | environment:
6 | sdk: ^3.4.1
7 | flutter: ^3.22.1
8 |
9 | dependencies:
10 | auto_size_text: ^3.0.0
11 | flutter:
12 | sdk: flutter
13 | flutter_staggered_grid_view: ^0.7.0
14 | shimmer: ^3.0.0
15 | www_localization:
16 | path: ../../core/www_localization
17 | www_models:
18 | path: ../../domain/www_models
19 | www_theme:
20 | path: ../www_theme
21 | www_utils:
22 | path: ../../utils/www_utils
23 |
24 | dev_dependencies:
25 | www_analysis:
26 | path: ../../utils/www_analysis
27 |
--------------------------------------------------------------------------------
/www-app/domain/www_api/analysis_options.yaml:
--------------------------------------------------------------------------------
1 | include: package:www_analysis/analysis_options.yaml
--------------------------------------------------------------------------------
/www-app/domain/www_api/build.yaml:
--------------------------------------------------------------------------------
1 | targets:
2 | $default:
3 | builders:
4 | json_serializable:
5 | options:
6 | include_if_null: false
7 | explicit_to_json: true
8 |
--------------------------------------------------------------------------------
/www-app/domain/www_api/lib/src/di/di_module.dart:
--------------------------------------------------------------------------------
1 | import 'package:get_it/get_it.dart';
2 | import 'package:injectable/injectable.dart';
3 | import 'package:www_api/src/di/di_module.config.dart';
4 | import 'package:www_di/www_di.dart';
5 |
6 | class WWWDIModuleApi extends WWWDIModule {
7 | const WWWDIModuleApi() : super(_init);
8 | }
9 |
10 | @injectableInit
11 | void _init(GetIt getIt) => getIt.init();
12 |
--------------------------------------------------------------------------------
/www-app/domain/www_api/lib/src/models/json_converters/questions_list_converter.dart:
--------------------------------------------------------------------------------
1 | import 'package:freezed_annotation/freezed_annotation.dart';
2 | import 'package:www_api/src/models/question_dto.dart';
3 |
4 | class QuestionsListConverter
5 | implements JsonConverter?, Object?> {
6 | const QuestionsListConverter();
7 |
8 | @override
9 | List? fromJson(Object? json) {
10 | if (json is List) {
11 | return List