Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
e65b092
:recycle: :: MatchListEvent 의 μƒνƒœλ₯Ό LoadItems둜 λ³€κ²½
answad May 28, 2025
c68d1da
:sparkles: :: item Loading κΈ°λŠ₯이 μžˆλŠ” MatchListBloc 생성
answad May 28, 2025
87fe2f0
:recycle: :: MatchListScreen 이 stageId, 년도, 달, 일, 을 받도둝 μˆ˜μ •
answad May 28, 2025
53a8b0f
:recycle: :: MatchListScreen을 blocκ³Ό μ—°κ²°
answad May 28, 2025
74e588f
:recycle: :: matchList λΌμš°νŒ… μ„€μ •
answad May 29, 2025
8f4f865
Merge branch 'develop' of https://github.com/team-gogo/GOGO-App into …
iloveuhyeon May 29, 2025
86ffa72
:recycle: :: Match Participant widget μˆ˜μ •
iloveuhyeon May 29, 2025
24cf4f8
:recycle: :: Community main screen, match list screen에 λ‘œλ”© μΈλ””κ²Œμ΄ν„° μΆ”κ°€
iloveuhyeon May 30, 2025
a3d8425
:sparkles: :: batting state μΆ”κ°€
answad May 30, 2025
0820ec9
:sparkles: :: batting event μΆ”κ°€
answad May 30, 2025
d111c1e
:recycle: :: _onBettingMatch ν•¨μˆ˜ μΆ”κ°€
answad May 30, 2025
90b2717
:recycle: :: MatchBattingStatusDialogκ°€ μ™ΈλΆ€μ—μ„œ bettingControllerλ₯Ό λ°›μ•„μ„œ μ‚¬μš©β€¦
answad Jun 2, 2025
eed6a9b
:recycle: :: showDialogMatchBatting ν•¨μˆ˜μ—μ„œ μ‹€μ œλ‘œ λ°°νŒ…μ„ ν•  수 μžˆλ„λ‘ μˆ˜μ •
answad Jun 2, 2025
42077cd
:recycle: :: BettingMatch event 와 _onBettingMatch ν•¨μˆ˜λ₯Ό μ—°κ²°
answad Jun 2, 2025
46ea73f
:recycle: :: batting 후에 μžλ™μœΌλ‘œ λ‘œμ»¬μ—μ„œ λ°°νŒ… κΈˆμ•‘μ„ μ˜¬λ¦¬λ„λ‘ μˆ˜μ •
answad Jun 2, 2025
637e238
Merge remote-tracking branch 'origin/develop' into feature/#174-match…
answad Jun 3, 2025
8c258d7
Merge remote-tracking branch 'origin/feature/#174-matchlistpage-batti…
answad Jun 3, 2025
1f3bf09
:recycle: :: BettingRepository을 get instance에 μΆ”κ°€
answad Jun 3, 2025
6fba73d
:recycle: :: BettingDataSourceλ₯Ό get instance에 μΆ”κ°€
answad Jun 3, 2025
5583368
:recycle: :: selectedTeam을 μƒμœ„ μœ„μ ―μ—μ„œ κ΄€λ¦¬ν•˜λ„λ‘ λ³€κ²½ν•˜κ³  μ„ νƒλœ μœ„μ ―μ— λ”°λΌμ„œ 색이 λ³€ν•˜κ²Œ λ³€κ²½
answad Jun 3, 2025
6f139a3
:recycle: :: λ°°νŒ…μ΄ λ‘œμ»¬μ—μ„œ λ°”λ‘œλ°”λ‘œ μ μš©λ˜λ„λ‘ μˆ˜μ •
answad Jun 3, 2025
15c1831
:recycle: :: λ°°νŒ… λͺ¨λ‹¬μ—μ„œ λ°°νŒ… 후에 λ°°νŒ… λͺ¨λ‹¬μ΄ λ‹«νžˆμ§€ μ•Šλ„λ‘ μˆ˜μ •
answad Jun 4, 2025
71b92b3
:recycle: :: home screenμ—μ„œ λ°°νŒ…μ΄ κ°€λŠ₯ν•˜λ„λ‘ λ°°νŒ…λͺ¨λ‹¬ μΆ”κ°€
answad Jun 4, 2025
b9bc804
:recycle: :: μ—λŸ¬ μˆ˜μ • 및 퍼블리싱 μˆ˜μ •
iloveuhyeon Jun 4, 2025
3742d02
:recycle: :: 둜컬 포인트 볡ꡬ
answad Jun 4, 2025
5b3c33b
:recycle: :: μ˜ˆμ™Έμ²˜λ¦¬ ν† μŠ€νŠΈ μΆ”κ°€
answad Jun 4, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
customLLDBInitFile = "$(SRCROOT)/Flutter/ephemeral/flutter_lldbinit"
shouldUseLaunchSchemeArgsEnv = "YES">
<MacroExpansion>
<BuildableReference
Expand Down Expand Up @@ -54,6 +55,7 @@
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
customLLDBInitFile = "$(SRCROOT)/Flutter/ephemeral/flutter_lldbinit"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
Expand Down
8 changes: 8 additions & 0 deletions lib/data/get_it_module/get_it_module.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import 'package:gogo_app/data/api/search_school/search_school_api.dart';
import 'package:gogo_app/data/api/shop/shop_api.dart';
import 'package:gogo_app/data/data_sources/auth/auth_data_source.dart';
import 'package:gogo_app/data/data_sources/auth/auth_data_source_impl.dart';
import 'package:gogo_app/data/data_sources/betting/betting_data_source_impl.dart';
import 'package:gogo_app/data/data_sources/mini_game/mini_game_data_source.dart';
import 'package:gogo_app/data/data_sources/mini_game/mini_game_data_source_impl.dart';
import 'package:gogo_app/data/data_sources/search_school/search_school_data_source.dart';
Expand All @@ -25,8 +26,11 @@ import 'package:gogo_app/data/api/stage/stage_api.dart';
import 'package:gogo_app/data/repositories/stage/stage_repository.dart';
import 'package:gogo_app/data/repositories/stage/stage_repository_impl.dart';
import '../api/mini_game/mini_game_api.dart';
import '../data_sources/betting/betting_data_source.dart';
import '../data_sources/token_data_source/token_data_source.dart';
import '../data_sources/token_data_source/token_data_source_impl.dart';
import '../repositories/betting/betting_repository.dart';
import '../repositories/betting/betting_repository_impl.dart';
import '../repositories/mini_game/mini_game_repository.dart';
import '../repositories/mini_game/mini_game_repository_impl.dart';

Expand All @@ -53,6 +57,8 @@ void setupDataSourceLocator() {
locator.registerLazySingleton<ShopDataSource>(
() => ShopDataSourceImpl(locator<Dio>()));
locator.registerLazySingleton<TokenDataSource>(() => TokenDataSourceImpl());
locator.registerLazySingleton<BettingDataSource>(
() => BettingDataSourceImpl(locator<Dio>()));
}

void setupRepositoryLocator() {
Expand All @@ -66,6 +72,8 @@ void setupRepositoryLocator() {
() => MiniGameRepositoryImpl(locator<MiniGameDataSource>()));
locator.registerLazySingleton<ShopRepository>(
() => ShopRepositoryImpl(locator<ShopDataSource>()));
locator.registerLazySingleton<BettingRepository>(
() => BettingRepositoryImpl(locator<BettingDataSource>()));
}

void setupApiLocator() {
Expand Down
43 changes: 21 additions & 22 deletions lib/presentation/community/screen/community_main_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import 'package:gogo_app/presentation/community/screen/community_detail_screen.d
import 'package:gogo_app/presentation/community/widgets/community_filter_popup.dart';
import 'package:gogo_app/presentation/community/widgets/community_item.dart';
import 'package:go_router/go_router.dart';
import 'package:gogo_app/presentation/loading/widgets/loading_indicator.dart';
import 'dart:math';
import '../../../design_system/component/tag/gogo_tag_component.dart';
import '../../../design_system/component/top_bar/gogo_top_bar.dart';
Expand Down Expand Up @@ -130,23 +131,25 @@ class _CommunityMainScreenContentState
),
const SizedBox(width: 12),
GestureDetector(
onTap: state is CommunityLoadedState ? () async {
final result = await filterDialog(
context,
gameType,
sortType,
state is CommunityLoadedState
? state.gameTypes
: [],
);
if (gameType == result['gameType'] &&
sortType == result['sortType']) {
return;
}
gameType = result['gameType'];
sortType = result['sortType'];
_fetchCommunity();
} : null,
onTap: state is CommunityLoadedState
? () async {
final result = await filterDialog(
context,
gameType,
sortType,
state is CommunityLoadedState
? state.gameTypes
: [],
);
if (gameType == result['gameType'] &&
sortType == result['sortType']) {
return;
}
gameType = result['gameType'];
sortType = result['sortType'];
_fetchCommunity();
}
: null,
child: GogoTagComponent(
color: GogoColors.main500,
text: 'ν•„ν„°',
Expand Down Expand Up @@ -217,11 +220,7 @@ class _CommunityMainScreenContentState
builder: (context, state) {
if (state is CommunityLoadingState) {
return Expanded(
child: Center(
child: CircularProgressIndicator(
color: GogoColors.main500,
),
),
child: Center(child: LoadingIndicator()),
);
} else if (state is CommunityLoadedState) {
final totalPage = state.response.info.totalPage;
Expand Down
159 changes: 149 additions & 10 deletions lib/presentation/home/screen/home_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,15 @@ import 'package:gogo_app/presentation/navigation_view/widgets/drawer/gogo_drawer
import 'package:gogo_app/presentation/ranking/widgets/ranking_list_item.dart';
import 'package:gogo_app/router.dart';
import 'package:intl/intl.dart';
import '../../../data/models/betting/request/betting_match_request.dart';
import '../../../data/models/common/match_dto.dart';
import '../../../design_system/theme/color.dart';
import '../../../design_system/theme/icon.dart';
import '../../match_list/bloc/match_list_bloc.dart';
import '../../match_list/bloc/match_list_event.dart';
import '../bloc/home_event.dart';
import '../bloc/home_state.dart';
import '../widgets/match_batting_status_dialog.dart';
import '../widgets/match_card/match_card_component.dart';
import '../widgets/minigame/minigame_play_component.dart';

Expand Down Expand Up @@ -87,6 +92,8 @@ class HomeScreen extends StatelessWidget {
PageRouter.matchList,
queryParameters: {
'stageId': stageId.toString(),
'point': state.points.point
.toString(),
'year': DateFormat('yyyy')
.format(context
.read<HomeBloc>()
Expand All @@ -105,9 +112,10 @@ class HomeScreen extends StatelessWidget {
horizontal: 16),
scrollDirection: Axis.horizontal,
child: Builder(
builder: (context) {
final matches =
context.read<HomeBloc>().matches;
builder: (localContext) {
final matches = localContext
.read<HomeBloc>()
.matches;
if (matches.isEmpty) {
return Center(
child: Padding(
Expand Down Expand Up @@ -161,7 +169,16 @@ class HomeScreen extends StatelessWidget {
right: 8),
child: MatchCard(
matchDto: match,
onBattingClick: () {},
onBattingClick: () {
showDialogMatchBatting(
context,
match,
stageId!,
context
.read<HomeBloc>()
.selectedDate,
state.points.point);
},
),
);
},
Expand All @@ -180,12 +197,16 @@ class HomeScreen extends StatelessWidget {
GogoIcons.arcade(color: GogoColors.white),
text: 'λ―Έλ‹ˆκ²Œμž„',
onTap: () => PageRouter.router.pushNamed(
PageRouter.miniGame,
queryParameters: {
'stageId': stageId.toString(),
'point': state.points.point.toString(),
'betLimitResponse': state.betLimitResponse?.toJson().toString(),
})),
PageRouter.miniGame,
queryParameters: {
'stageId': stageId.toString(),
'point': state.points.point
.toString(),
'betLimitResponse': state
.betLimitResponse
?.toJson()
.toString(),
})),
MinigamePlayComponent(
activeGameResponse:
state.activeGameResponse,
Expand Down Expand Up @@ -370,4 +391,122 @@ class HomeScreen extends StatelessWidget {
],
),
);

void showDialogMatchBatting(
BuildContext context,
MatchDto data,
int stageId,
DateTime date,
int point,
) {
final matchListBloc = MatchListBloc(
stageId: stageId,
year: date.year,
month: date.month,
day: date.day,
);

showDialog(
context: context,
builder: (BuildContext dialogContext) {
final textController = TextEditingController();
int aTeamPoint = data.ateam.bettingPoint;
int bTeamPoint = data.bteam.bettingPoint;
String? selectedTeam;

return StatefulBuilder(
builder: (context, setState) {
return MatchBattingStatusDialog(
bettingController: textController,
startDate: data.startDate,
system: data.system,
gameType: data.category,
round: data.round,
selectedTeam: selectedTeam,
setSelectedTeam: (team) {
setState(() {
selectedTeam = team;
});
},
teamAPoint: aTeamPoint,
teamBPoint: bTeamPoint,
teamA: data.ateam.teamName,
teamB: data.bteam.teamName,
enableBetting:
!data.isEnd && data.startDate.isBefore(DateTime.now()),
closeDialog: () {
Navigator.pop(dialogContext);
},
onBattingClick: () {
final inputText = textController.text.trim();
final bettingPoint = int.tryParse(inputText);

// === μœ νš¨μ„± 검사 ===
if (selectedTeam == null) {
_showError(dialogContext, 'λ°°νŒ…ν•  νŒ€μ„ μ„ νƒν•΄μ£Όμ„Έμš”.');
return;
}

if (bettingPoint == null) {
_showError(dialogContext, '숫자둜 된 λ°°νŒ… 포인트λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”.');
return;
}

if (bettingPoint < 1000) {
_showError(dialogContext, 'λ°°νŒ… ν¬μΈνŠΈλŠ” μ΅œμ†Œ 1000 이상이어야 ν•©λ‹ˆλ‹€.');
return;
}

if (bettingPoint > 5000) {
_showError(dialogContext, 'λ°°νŒ… ν¬μΈνŠΈλŠ” μ΅œλŒ€ 5000 μ΄ν•˜λ‘œ μž…λ ₯ν•΄μ£Όμ„Έμš”.');
return;
}

if (bettingPoint > point) {
_showError(dialogContext, 'λ³΄μœ ν•œ ν¬μΈνŠΈλ³΄λ‹€ 많이 μž…λ ₯ν•  수 μ—†μŠ΅λ‹ˆλ‹€.');
return;
}

final predictedTeamId = (selectedTeam == data.ateam.teamName)
? data.ateam.teamId
: data.bteam.teamId;

if (predictedTeamId == null) {
_showError(dialogContext, 'μ„ νƒλœ νŒ€μ˜ IDλ₯Ό 찾을 수 μ—†μŠ΅λ‹ˆλ‹€.');
return;
}

final request = BettingMatchRequest(
predictedWinTeamId: predictedTeamId,
bettingPoint: bettingPoint,
);

matchListBloc.add(BettingMatch(
matchId: data.matchId,
request: request,
));

matchListBloc.add(LoadItems(
gameType: data.category,
sortOrder: SortOrder.ascending,
));

Navigator.pop(dialogContext); // 성곡 ν›„ λͺ¨λ‹¬ λ‹«κΈ°
},
);
},
);
},
);
}

void _showError(BuildContext context, String message) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(message),
behavior: SnackBarBehavior.floating,
duration: const Duration(seconds: 2),
),
);
}
}
2 changes: 1 addition & 1 deletion lib/presentation/home/widgets/appbar/home_appbar.dart
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ class HomeAppbar extends StatefulWidget {
}

class _HomeAppbarState extends State<HomeAppbar> {
final now = DateTime(2025,04,20);
final now = DateTime(2025,04,22);
final ScrollController scrollController = ScrollController();

@override
Expand Down
Loading