Skip to content

Commit

Permalink
Wip: 작업중...
Browse files Browse the repository at this point in the history
  • Loading branch information
Yellowtoast committed Jan 18, 2024
1 parent 9c0cfe8 commit 0105bb8
Show file tree
Hide file tree
Showing 9 changed files with 224 additions and 44 deletions.
15 changes: 15 additions & 0 deletions lib/core/enums/pet_type_filter.enum.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import 'package:freezed_annotation/freezed_annotation.dart';

enum PetTypeFilter {
@JsonValue('cat')
cat(displayName: '고양이', code: 'cat'),
@JsonValue('dog')
dog(displayName: '강아지', code: 'dog'),

@JsonValue('noMatter')
noMatter(displayName: '상관없음', code: 'noMatter');

const PetTypeFilter({required this.displayName, required this.code});
final String displayName;
final String code;
}
15 changes: 15 additions & 0 deletions lib/core/enums/sort_filter.enum.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import 'package:freezed_annotation/freezed_annotation.dart';

enum SortType {
@JsonValue('newest')
newest(displayName: '최신순', code: 'newest'),
@JsonValue('deadline')
deadline(displayName: '마감일순', code: 'deadline'),

@JsonValue('nearest')
nearest(displayName: '가까운순', code: 'nearest');

const SortType({required this.displayName, required this.code});
final String displayName;
final String code;
}
18 changes: 14 additions & 4 deletions lib/presentation/pages/home/home_event.dart
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
import 'package:flutter/rendering.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:pets_next_door_flutter/core/enums/sort_filter.enum.dart';
import 'package:pets_next_door_flutter/presentation/pages/home/providers/home_tab_controller_provider.dart';
import 'package:pets_next_door_flutter/presentation/pages/home/providers/show_search_bar_provider.dart';
import 'package:pets_next_door_flutter/presentation/pages/pet_sos/providers/pet_sos_filter_provider.dart';

abstract interface class _HomeEvent {
void onScrollDirectionChanged(WidgetRef ref, ScrollDirection direction);

Future<void> onSearchTextSubmitted(String text, HomeTabType currentTab);
// Future<void> onSearchTextSubmitted(WidgetRef ref, String text);
}

mixin class HomeEvent implements _HomeEvent {
Expand All @@ -23,8 +25,16 @@ mixin class HomeEvent implements _HomeEvent {

@override
Future<void> onSearchTextSubmitted(
String text, HomeTabType currentTab) async {
print(currentTab);
// TODO: 검색 api 연결
WidgetRef ref, String text, HomeTabType tabType) async {
print(tabType);
print(ref.read(petSosSearchFilterProvider));
}

onPetSosSortingChanged(WidgetRef ref, SortType sortType) {
ref.read(petSosSearchFilterProvider.notifier).setSortingFilter(sortType);
}

onPetMateSortingChanged(WidgetRef ref, SortType sortType) {
ref.read(petSosSearchFilterProvider.notifier).setSortingFilter(sortType);
}
}
70 changes: 49 additions & 21 deletions lib/presentation/pages/home/home_view.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import 'package:pets_next_door_flutter/core/constants/colors.dart';
import 'package:pets_next_door_flutter/core/constants/sizes.dart';
import 'package:pets_next_door_flutter/core/constants/text_style.dart';
import 'package:pets_next_door_flutter/presentation/pages/home/home_event.dart';
import 'package:pets_next_door_flutter/presentation/pages/home/providers/current_tab_type_provider.dart';
import 'package:pets_next_door_flutter/presentation/pages/home/providers/home_tab_controller_provider.dart';
import 'package:pets_next_door_flutter/presentation/pages/home/providers/show_search_bar_provider.dart';
import 'package:pets_next_door_flutter/presentation/pages/pet_mate/pet_sitting_mate_view.dart';
Expand All @@ -29,21 +28,46 @@ class HomeView extends StatelessWidget {
}
}

class _TabViewBody extends HookConsumerWidget {
class _TabViewBody extends HookConsumerWidget with HomeEvent {
const _TabViewBody({super.key});

@override
Widget build(BuildContext context, WidgetRef ref) {
final tabController =
ref.watch(homeTabControllerProvider(useSingleTickerProvider()));
useAutomaticKeepAlive();

final ticker = useSingleTickerProvider();

final tabController = ref.watch(HomeTabControllerProvider(ticker));

return Expanded(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
_TabBar(tabController: tabController),
_SearchBar(),
_TabContentView(tabController: tabController),
_SearchBar(
onSubmitted: (searchText) => onSearchTextSubmitted(
ref,
searchText,
HomeTabType.values[tabController.index],
),
),
Expanded(
child: TabBarView(
controller: tabController,
children: [
PetSittingSosView(
onScrollDirectionChanged: (direction) =>
onScrollDirectionChanged(ref, direction),
onSortingChanged: (sorting) =>
onPetSosSortingChanged(ref, sorting),
),
PetSittingMateView(
onScrollDirectionChanged: (di) =>
onScrollDirectionChanged(ref, di),
)
],
),
)
],
),
);
Expand Down Expand Up @@ -95,14 +119,20 @@ class _TabContentView extends ConsumerWidget with HomeEvent {
return Expanded(
child: TabBarView(
controller: tabController,
children: [
PetSittingSosView(
onScrollDirectionChanged: (di) => onScrollDirectionChanged(ref, di),
),
PetSittingMateView(
onScrollDirectionChanged: (di) => onScrollDirectionChanged(ref, di),
),
],
children: HomeTabType.values.map((e) {
return switch (e) {
HomeTabType.petSos => PetSittingSosView(
key: ValueKey(e),
onScrollDirectionChanged: (di) =>
onScrollDirectionChanged(ref, di),
),
HomeTabType.petMate => PetSittingMateView(
key: ValueKey(e),
onScrollDirectionChanged: (di) =>
onScrollDirectionChanged(ref, di),
),
};
}).toList(),
),
);
}
Expand Down Expand Up @@ -143,13 +173,14 @@ class _TabBar extends StatelessWidget {
}
}

class _SearchBar extends ConsumerWidget with HomeEvent {
const _SearchBar();
class _SearchBar extends ConsumerWidget {
const _SearchBar({required this.onSubmitted});

final void Function(String) onSubmitted;

@override
Widget build(BuildContext context, WidgetRef ref) {
final showSearchBar = ref.watch(showSearchBarProvider);
final currentTab = ref.watch(currentTabTypeProvider);

return AnimatedContainer(
clipBehavior: Clip.hardEdge,
Expand All @@ -167,10 +198,7 @@ class _SearchBar extends ConsumerWidget with HomeEvent {
height: 40,
width: double.infinity,
child: TextField(
onSubmitted: (searchText) => onSearchTextSubmitted(
searchText,
currentTab,
),
onSubmitted: (value) => onSubmitted.call(value),
decoration: InputDecoration(
contentPadding: EdgeInsets.symmetric(horizontal: 12),
filled: true,
Expand Down
61 changes: 42 additions & 19 deletions lib/presentation/pages/pet_sos/pet_sitting_sos_view.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,17 @@ import 'package:go_router/go_router.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:pets_next_door_flutter/app/router/app_router.dart';
import 'package:pets_next_door_flutter/core/constants/sizes.dart';
import 'package:pets_next_door_flutter/core/enums/sort_filter.enum.dart';

class PetSittingSosView extends HookConsumerWidget {
PetSittingSosView({
super.key,
this.onScrollDirectionChanged,
this.onSortingChanged,
});

final void Function(ScrollDirection)? onScrollDirectionChanged;
final void Function(SortType)? onSortingChanged;

@override
Widget build(BuildContext context, WidgetRef ref) {
Expand All @@ -32,25 +35,8 @@ class PetSittingSosView extends HookConsumerWidget {
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.symmetric(horizontal: 24),
child: Row(
children: [
DropdownMenu(
initialSelection: 0,
inputDecorationTheme: InputDecorationTheme(
constraints: BoxConstraints(maxWidth: 100),
border: InputBorder.none,
contentPadding: EdgeInsets.all(0)),
dropdownMenuEntries: [
DropdownMenuEntry(
value: 0,
label: 'asdf',
)
],
),
],
),
PetSosFilterRow(
onSortingChanged: (sorting) => onSortingChanged?.call(sorting),
),
Expanded(
child: ListView.separated(
Expand Down Expand Up @@ -107,3 +93,40 @@ class PetSittingSosView extends HookConsumerWidget {
);
}
}

class PetSosFilterRow extends ConsumerWidget {
const PetSosFilterRow({
super.key,
required this.onSortingChanged,
});

final void Function(SortType) onSortingChanged;

@override
Widget build(BuildContext context, WidgetRef ref) {
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 24),
child: Row(
children: [
DropdownMenu(
initialSelection: SortType.values.first,
onSelected: (sort) {
if (sort == null) return;
onSortingChanged.call(sort);
},
inputDecorationTheme: InputDecorationTheme(
constraints: BoxConstraints(maxWidth: 100),
border: InputBorder.none,
contentPadding: EdgeInsets.all(0)),
dropdownMenuEntries: SortType.values
.map((e) => DropdownMenuEntry(
value: e,
label: e.displayName,
))
.toList(),
),
],
),
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import 'package:pets_next_door_flutter/core/enums/pet_type_filter.enum.dart';
import 'package:pets_next_door_flutter/core/enums/sort_filter.enum.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';

part 'pet_sos_filter_provider.g.dart';

typedef PetSosFilters = ({SortType sortFilter, PetTypeFilter petTypeFilter});

/// 홈에서 현재 어떤 탭(돌봄급구/돌봄메이트)에 있는지
///
@riverpod
class PetSosSearchFilter extends _$PetSosSearchFilter {
@override
PetSosFilters build() {
return (sortFilter: SortType.newest, petTypeFilter: PetTypeFilter.dog);
}

void setSortingFilter(SortType filter) {
state = (sortFilter: filter, petTypeFilter: state.petTypeFilter);
}

void setPetFilter(PetTypeFilter filter) {
state = (sortFilter: state.sortFilter, petTypeFilter: filter);
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// import 'package:pets_next_door_flutter/core/enums/sort_filter.enum.dart';
// import 'package:riverpod_annotation/riverpod_annotation.dart';

// part 'sort_filter_provider.g.dart';

// /// 홈에서 현재 어떤 탭(돌봄급구/돌봄메이트)에 있는지
// ///
// @riverpod
// class PetTypeFilter extends _$PetTypeFilter {
// @override
// SortType build() {
// return SortType.values.first;
// }

// set sortType(SortType sortType) => state = sortType;
// }
16 changes: 16 additions & 0 deletions lib/presentation/pages/pet_sos/providers/sort_filter_provider.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// import 'package:pets_next_door_flutter/core/enums/sort_filter.enum.dart';
// import 'package:riverpod_annotation/riverpod_annotation.dart';

// part 'sort_filter_provider.g.dart';

// /// 홈에서 현재 어떤 탭(돌봄급구/돌봄메이트)에 있는지
// ///
// @riverpod
// class SortFilter extends _$SortFilter {
// @override
// SortType build() {
// return SortType.values.first;
// }

// set sortType(SortType sortType) => state = sortType;
// }

0 comments on commit 0105bb8

Please sign in to comment.