Skip to content

Commit

Permalink
Merge pull request #61 from wednesday-solutions/main
Browse files Browse the repository at this point in the history
Release sync
  • Loading branch information
shounak-mulay committed Apr 12, 2024
2 parents 43817eb + 9d7cd6f commit 442c283
Show file tree
Hide file tree
Showing 53 changed files with 143 additions and 113 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,6 @@ class {{name.pascalCase()}}PageBody extends ConsumerWidget {
Widget build(BuildContext context, WidgetRef ref) {
final {{name.camelCase()}}ViewModel = ref.watch({{name.camelCase()}}ViewModelProvider.notifier);

return {{name.pascalCase()}}PageBodyContent();
return {{name.pascalCase()}}PageBodyContent(intentHandler: {{name.camelCase()}}ViewModel.onIntent);
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import 'package:flutter_template/presentation/entity/routes/routes.dart';
import 'package:flutter_template/presentation/entity/screen/screen.dart';

class {{name.pascalCase()}}Screen extends Screen {
class {{name.pascalCase()}}Screen implements Screen {
const {{name.pascalCase()}}Screen() : super();

static get path => Routes.{{name.camelCase()}};
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
import 'package:flutter_template/presentation/entity/intent/intent.dart';
import 'package:freezed_annotation/freezed_annotation.dart';

part '{{name.snakeCase()}}_screen_intent.freezed.dart';

@freezed
class {{name.pascalCase()}}ScreenIntent with _${{name.pascalCase()}}ScreenIntent implements BaseIntent {
factory {{name.pascalCase()}}ScreenIntent.newIntent() = _HomeScreenIntent_NewIntent;
sealed class {{name.pascalCase()}}ScreenIntent extends BaseIntent {
const {{name.pascalCase()}}ScreenIntent();
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,5 @@ final {{name.camelCase()}}ViewModelProvider =

abstract class {{name.pascalCase()}}ViewModel extends BaseViewModel<{{name.pascalCase()}}Screen, {{name.pascalCase()}}ScreenState>
implements IntentHandler<{{name.pascalCase()}}ScreenIntent> {
{{name.pascalCase()}}ViewModel({{name.pascalCase()}}ScreenState state) : super(state);
{{name.pascalCase()}}ViewModel(super.state);
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ class {{name.pascalCase()}}ViewModelImpl extends {{name.pascalCase()}}ViewModel

@override
void onIntent({{name.pascalCase()}}ScreenIntent intent) {
switch (intent) {

}
}
}
2 changes: 1 addition & 1 deletion bricks/destination/brick.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ description: A new brick created with the Mason CLI.
# The following defines the version and build number for your brick.
# A version number is three numbers separated by dots, like 1.2.34
# followed by an optional build number (separated by a +).
version: 0.1.0+1
version: 0.1.1+1

# The following defines the environment for the current brick.
# It includes the version of mason that the brick requires.
Expand Down
2 changes: 1 addition & 1 deletion lib/foundation/mapper/mapper2.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
abstract class Mapper2<FROM1, FROM2, TO> {
abstract interface class Mapper2<FROM1, FROM2, TO> {
TO map(FROM1 from1, FROM2 from2);
}
2 changes: 1 addition & 1 deletion lib/foundation/mapper/mapper3.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
abstract class Mapper3<FROM1, FROM2, FROM3, TO> {
abstract interface class Mapper3<FROM1, FROM2, FROM3, TO> {
TO map(FROM1 from1, FROM2 from2, FROM3 from3);
}
1 change: 0 additions & 1 deletion lib/interactor/base/base_interactor.dart

This file was deleted.

2 changes: 1 addition & 1 deletion lib/interactor/theme/theme_interactor.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import 'package:flutter/material.dart';

abstract class ThemeInteractor {
abstract interface class ThemeInteractor {
ThemeMode getThemeMode();
Future setThemeMode(ThemeMode themeMode);
bool getIsDynamicEnabled();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import 'package:flutter_template/core/entity/result.dart';
import 'package:flutter_template/presentation/entity/base/ui_list_item.dart';
import 'package:flutter_template/presentation/entity/weather/ui_city.dart';

abstract class FavoriteWeatherInteractor {
abstract interface class FavoriteWeatherInteractor {
Future<Result<void>> setCityFavorite(UICity uiCity);

Future<Result<void>> removeCityFavorite(UICity uiCity);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,13 @@ import 'package:flutter_template/domain/weather/remove_favorite_city_use_case.da
import 'package:flutter_template/domain/weather/set_city_favorite_use_case.dart';
import 'package:flutter_template/foundation/extensions/object_ext.dart';
import 'package:flutter_template/foundation/unit.dart';
import 'package:flutter_template/interactor/base/base_interactor.dart';
import 'package:flutter_template/interactor/weather/favorite/favorite_weather_interactor.dart';
import 'package:flutter_template/interactor/weather/favorite/ui_weather_list_mapper.dart';
import 'package:flutter_template/interactor/weather/search/ui_city_mapper.dart';
import 'package:flutter_template/presentation/entity/base/ui_list_item.dart';
import 'package:flutter_template/presentation/entity/weather/ui_city.dart';

class FavoriteWeatherInteractorImpl extends BaseInteractor
implements FavoriteWeatherInteractor {
class FavoriteWeatherInteractorImpl implements FavoriteWeatherInteractor {
final FetchFavoriteCitiesWeatherUseCase fetchFavoriteCitiesWeatherUseCase;
final GetFavoriteCitiesStreamUseCase getFavoriteCitiesStreamUseCase;
final SetCityFavoriteUseCase setCityFavoriteUseCase;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import 'package:flutter_template/foundation/mapper/mapper.dart';
import 'package:flutter_template/presentation/entity/base/ui_list_item.dart';
import 'package:flutter_template/presentation/entity/weather/ui_weather.dart';

abstract class UIWeatherListMapper
abstract interface class UIWeatherListMapper
extends Mapper<List<Weather>, List<UIListItem>> {}

class UIWeatherListMapperImpl extends UIWeatherListMapper {
Expand Down
6 changes: 3 additions & 3 deletions lib/interactor/weather/search/city_search_result_mapper.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ import 'package:flutter_template/foundation/mapper/mapper2.dart';
import 'package:flutter_template/interactor/weather/search/ui_city_mapper.dart';
import 'package:flutter_template/presentation/entity/base/ui_list_item.dart';

abstract class CitySearchResultMapper
extends Mapper2<List<City>, List<City>, List<UIListItem>> {}
abstract interface class CitySearchResultMapper
implements Mapper2<List<City>, List<City>, List<UIListItem>> {}

class CitySearchResultMapperImpl extends CitySearchResultMapper {
class CitySearchResultMapperImpl implements CitySearchResultMapper {
final UICityMapper uiCityMapper;

CitySearchResultMapperImpl({required this.uiCityMapper});
Expand Down
2 changes: 1 addition & 1 deletion lib/interactor/weather/search/search_city_interactor.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import 'package:flutter_template/presentation/entity/base/ui_list_item.dart';

abstract class SearchCityInteractor {
abstract interface class SearchCityInteractor {
Stream<List<UIListItem>> get searchResultsStream;

Future<void> search(String term);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import 'package:flutter_template/interactor/weather/search/search_city_interacto
import 'package:flutter_template/presentation/entity/base/ui_list_item.dart';
import 'package:rxdart/rxdart.dart';

class SearchCityInteractorImpl extends SearchCityInteractor {
class SearchCityInteractorImpl implements SearchCityInteractor {
final SearchCitiesUseCase searchCitiesUseCase;
final GetFavoriteCitiesStreamUseCase favoriteCitiesStreamUseCase;
final CitySearchResultMapper citySearchResultMapper;
Expand Down
2 changes: 1 addition & 1 deletion lib/interactor/weather/search/ui_city_mapper.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import 'package:flutter_template/foundation/extensions/object_ext.dart';
import 'package:flutter_template/foundation/mapper/mapper2.dart';
import 'package:flutter_template/presentation/entity/weather/ui_city.dart';

abstract class UICityMapper extends Mapper2<City, bool, UICity> {
abstract class UICityMapper implements Mapper2<City, bool, UICity> {
City mapCity(UICity from);

UICity mapFavouriteCity(City from);
Expand Down
2 changes: 1 addition & 1 deletion lib/navigation/base/base_navigator.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import 'package:auto_route/auto_route.dart';

abstract class BaseNavigator {
abstract interface class BaseNavigator {
void to(PageRouteInfo route);

void back();
Expand Down
2 changes: 1 addition & 1 deletion lib/navigation/weather/home/home_navigator.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
abstract class HomeNavigator {
abstract interface class HomeNavigator {
void toSearchScreen();
}
2 changes: 1 addition & 1 deletion lib/navigation/weather/search/search_navigator.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
abstract class SearchNavigator {
abstract interface class SearchNavigator {
void back();
}
2 changes: 1 addition & 1 deletion lib/presentation/base/intent/intent_handler.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import 'package:flutter_template/presentation/entity/intent/intent.dart';

abstract class IntentHandler<T extends BaseIntent> {
abstract interface class IntentHandler<T extends BaseIntent> {
void onIntent(T intent);
}
3 changes: 2 additions & 1 deletion lib/presentation/base/renderer/list_item_renderer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@ import 'package:flutter/material.dart';
import 'package:flutter_template/presentation/entity/base/ui_list_item.dart';
import 'package:flutter_template/presentation/entity/intent/intent.dart';

abstract class ListItemRenderer<T extends UIListItem, I extends BaseIntent> {
abstract interface class ListItemRenderer<T extends UIListItem,
I extends BaseIntent> {
const ListItemRenderer();
Widget getWidget(BuildContext context, T data, StreamSink<I> sink);
}
25 changes: 19 additions & 6 deletions lib/presentation/base/theme/theme_intent.dart
Original file line number Diff line number Diff line change
@@ -1,11 +1,24 @@
import 'package:flutter/material.dart';
import 'package:flutter_template/presentation/entity/intent/intent.dart';
import 'package:freezed_annotation/freezed_annotation.dart';

part 'theme_intent.freezed.dart';
sealed class ThemeIntent extends BaseIntent {
const ThemeIntent();
}

class SetThemeModeThemeIntent extends ThemeIntent {
final ThemeMode mode;

const SetThemeModeThemeIntent({required this.mode});

@override
List<Object?> get props => [mode];
}

class SetIsDynamicThemeIntent extends ThemeIntent {
final bool isDynamic;

const SetIsDynamicThemeIntent({required this.isDynamic});

@freezed
class ThemeIntent with _$ThemeIntent implements BaseIntent {
factory ThemeIntent.setThemeMode(ThemeMode mode) = _ThemeIntent_SetThemeMode;
factory ThemeIntent.setIsDynamic(bool isDynamic) = _ThemeIntent_SetIsDynamic;
@override
List<Object?> get props => [isDynamic];
}
16 changes: 7 additions & 9 deletions lib/presentation/base/theme/theme_view_model_impl.dart
Original file line number Diff line number Diff line change
Expand Up @@ -21,17 +21,15 @@ class ThemeViewModelImpl extends ThemeViewModel {
}

@override
void onIntent(ThemeIntent intent) {
intent.when(
setThemeMode: (mode) async {
await themeInteractor.setThemeMode(mode);
Future<void> onIntent(ThemeIntent intent) async {
switch (intent) {
case SetThemeModeThemeIntent():
await themeInteractor.setThemeMode(intent.mode);
state = state.copyWith(themeMode: themeInteractor.getThemeMode());
},
setIsDynamic: (isDynamic) async {
await themeInteractor.setIsDynamicEnabled(isDynamic);
case SetIsDynamicThemeIntent():
await themeInteractor.setIsDynamicEnabled(intent.isDynamic);
state =
state.copyWith(isDynamic: themeInteractor.getIsDynamicEnabled());
},
);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ class DynamicThemeSwitch extends ConsumerWidget {
return DynamicThemeSwitchContent(
isDynamic: isDynamic,
onIsDynamicToggled: (isDynamic) {
themeViewModel.onIntent(ThemeIntent.setIsDynamic(isDynamic));
themeViewModel.onIntent(SetIsDynamicThemeIntent(isDynamic: isDynamic));
},
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ class ThemePicker extends ConsumerWidget {
return ThemePickerContent(
themeMode: themeState.themeMode,
onThemeModeSelected: (ThemeMode mode) {
themeViewModel.onIntent(ThemeIntent.setThemeMode(mode));
themeViewModel.onIntent(SetThemeModeThemeIntent(mode: mode));
},
);
}
Expand Down
2 changes: 1 addition & 1 deletion lib/presentation/destinations/weather/home/home_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ class HomePage extends ConsumerWidget {
IconButton(
onPressed: () {
final viewModel = ref.watch(homeViewModelProvider.notifier);
viewModel.onIntent(HomeScreenIntent.search());
viewModel.onIntent(const SearchHomeScreenIntent());
},
icon: const Icon(Icons.search),
),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import 'package:flutter_template/presentation/entity/routes/routes.dart';
import 'package:flutter_template/presentation/entity/screen/screen.dart';

class HomeScreen extends Screen {
class HomeScreen implements Screen {
const HomeScreen() : super();

static get path => Routes.home;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
import 'package:flutter_template/presentation/entity/intent/intent.dart';
import 'package:freezed_annotation/freezed_annotation.dart';

part 'home_screen_intent.freezed.dart';
sealed class HomeScreenIntent extends BaseIntent {
const HomeScreenIntent();
}

class SearchHomeScreenIntent extends HomeScreenIntent {
const SearchHomeScreenIntent();

@freezed
class HomeScreenIntent with _$HomeScreenIntent implements BaseIntent {
factory HomeScreenIntent.search() = _HomeScreenIntent_Search;
@override
List<Object?> get props => [];
}
Original file line number Diff line number Diff line change
Expand Up @@ -45,10 +45,9 @@ class HomeViewModelImpl extends HomeViewModel {

@override
void onIntent(HomeScreenIntent intent) {
intent.when(
search: () {
switch (intent) {
case SearchHomeScreenIntent():
homeNavigator.toSearchScreen();
},
);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,9 @@ import 'package:flutter_template/presentation/destinations/weather/home/widgets/
import 'package:flutter_template/presentation/entity/weather/ui_day_weather_heading.dart';

class UIDayWeatherHeaderRenderer
extends ListItemRenderer<UIDayWeatherHeading, HomeScreenIntent> {
implements ListItemRenderer<UIDayWeatherHeading, HomeScreenIntent> {
const UIDayWeatherHeaderRenderer();

@override
Widget getWidget(BuildContext context, UIDayWeatherHeading data,
StreamSink<HomeScreenIntent> sink) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ import 'package:flutter_template/presentation/destinations/weather/home/home_scr
import 'package:flutter_template/presentation/destinations/weather/home/widgets/list/ui_weather_list_item.dart';
import 'package:flutter_template/presentation/entity/weather/ui_weather.dart';

class UIWeatherRenderer extends ListItemRenderer<UIWeather, HomeScreenIntent> {
class UIWeatherRenderer
implements ListItemRenderer<UIWeather, HomeScreenIntent> {
const UIWeatherRenderer();

@override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ class SearchPage extends StatelessWidget {
viewModelProvider: searchViewModelProvider,
screen: searchScreen,
onAppBarBackPressed: (viewModel) => viewModel.onIntent(
SearchScreenIntent.back(),
const BackSearchScreenIntent(),
),
body: const SearchPageBody(),
onEffect: _handleEffect,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import 'package:flutter_template/presentation/entity/routes/routes.dart';
import 'package:flutter_template/presentation/entity/screen/screen.dart';

class SearchScreen extends Screen {
class SearchScreen implements Screen {
const SearchScreen() : super();

static get path => Routes.search;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,31 @@
import 'package:flutter_template/presentation/entity/intent/intent.dart';
import 'package:flutter_template/presentation/entity/weather/ui_city.dart';
import 'package:freezed_annotation/freezed_annotation.dart';

part 'search_screen_intent.freezed.dart';
sealed class SearchScreenIntent extends BaseIntent {
const SearchScreenIntent();
}

class BackSearchScreenIntent extends SearchScreenIntent {
const BackSearchScreenIntent();

@override
List<Object?> get props => [];
}

class SearchSearchScreenIntent extends SearchScreenIntent {
final String searchTerm;

const SearchSearchScreenIntent({required this.searchTerm});

@override
List<Object?> get props => [searchTerm];
}

@freezed
class SearchScreenIntent with _$SearchScreenIntent implements BaseIntent {
factory SearchScreenIntent.back() = _SearchScreenIntent_Back;
class ToggleFavoriteSearchScreenIntent extends SearchScreenIntent {
final UICity city;

factory SearchScreenIntent.search({required String searchTerm}) =
_SearchScreenIntent_Search;
const ToggleFavoriteSearchScreenIntent({required this.city});

factory SearchScreenIntent.toggleFavorite({required UICity city}) =
_SearchScreenIntent_Favorite;
@override
List<Object?> get props => [city];
}
Loading

0 comments on commit 442c283

Please sign in to comment.