Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove group option conditionally #138

Merged
merged 4 commits into from
Nov 19, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
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
31 changes: 22 additions & 9 deletions khelo/lib/ui/flow/home/components/tournament_item.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import 'package:cached_network_image/cached_network_image.dart';

import 'package:data/api/tournament/tournament_model.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
Expand Down Expand Up @@ -32,23 +31,37 @@ class TournamentItem extends StatefulWidget {
}

class _TournamentItemState extends State<TournamentItem> {
late ImageProvider imageProvider;
ImageProvider? imageProvider;

PaletteGenerator? palette;

@override
void initState() {
super.initState();
if (widget.tournament.banner_img_url != null) {
imageProvider =
CachedNetworkImageProvider(widget.tournament.banner_img_url!);
_initializeImageProvider(widget.tournament.banner_img_url);
}

void _initializeImageProvider(String? imageUrl) {
if (imageUrl != null) {
imageProvider = CachedNetworkImageProvider(imageUrl);
if (widget.background == null) {
imageProvider.createPaletteGenerator().then((palette) {
imageProvider!.createPaletteGenerator().then((generatedPalette) {
if (mounted) {
setState(() => this.palette = palette);
setState(() => palette = generatedPalette);
}
});
}
} else {
setState(() => imageProvider = null);
}
}

@override
void didUpdateWidget(covariant TournamentItem oldWidget) {
super.didUpdateWidget(oldWidget);
if (widget.tournament.banner_img_url !=
oldWidget.tournament.banner_img_url) {
_initializeImageProvider(widget.tournament.banner_img_url);
}
}

Expand Down Expand Up @@ -101,10 +114,10 @@ class _TournamentItemState extends State<TournamentItem> {
decoration: BoxDecoration(
color: context.colorScheme.containerNormalOnSurface,
borderRadius: BorderRadius.circular(8),
image: bannerUrl == null
image: bannerUrl == null || imageProvider == null
? null
: DecorationImage(
image: imageProvider,
image: imageProvider!,
fit: BoxFit.fill,
),
),
Expand Down
2 changes: 2 additions & 0 deletions khelo/lib/ui/flow/tournament/add/add_tournament_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -363,6 +363,7 @@ class _AddTournamentScreenState extends ConsumerState<AddTournamentScreen> {
onTap: () {
selectDate(
context,
startDate: widget.editTournament?.start_date,
initialDate: state.startDate,
onDateSelected: notifier.onStartDate,
);
Expand All @@ -377,6 +378,7 @@ class _AddTournamentScreenState extends ConsumerState<AddTournamentScreen> {
onTap: () {
selectDate(
context,
startDate: widget.editTournament?.start_date,
initialDate: state.endDate,
onDateSelected: notifier.onEndDate,
);
Expand Down
18 changes: 16 additions & 2 deletions khelo/lib/ui/flow/tournament/add/add_tournament_view_model.dart
Original file line number Diff line number Diff line change
Expand Up @@ -112,12 +112,26 @@ class AddTournamentViewNotifier extends StateNotifier<AddTournamentState> {
}

void onStartDate(DateTime startDate) {
state = state.copyWith(startDate: startDate);
DateTime endDate = state.endDate;

if (startDate.isAfter(endDate)) {
endDate = startDate.add(Duration(days: 1));
}
state = state.copyWith(startDate: startDate, endDate: endDate);
onChange();
}

void onEndDate(DateTime endDate) {
state = state.copyWith(endDate: endDate);
DateTime startDate = state.startDate;

if (endDate.isBefore(startDate)) {
startDate = endDate.subtract(Duration(days: 1));
if (_editedTournament != null &&
startDate.isBefore(_editedTournament!.start_date)) {
startDate = _editedTournament!.start_date;
}
}
state = state.copyWith(endDate: endDate, startDate: startDate);
onChange();
}

Expand Down
26 changes: 20 additions & 6 deletions khelo/lib/ui/flow/tournament/detail/components/flexible_space.dart
Original file line number Diff line number Diff line change
Expand Up @@ -25,21 +25,35 @@ class FlexibleSpace extends StatefulWidget {
}

class _FlexibleSpaceState extends State<FlexibleSpace> {
late ImageProvider imageProvider;
ImageProvider? imageProvider;

PaletteGenerator? palette;

@override
void initState() {
super.initState();
if (widget.tournament.banner_img_url != null) {
imageProvider =
CachedNetworkImageProvider(widget.tournament.banner_img_url!);
imageProvider.createPaletteGenerator().then((palette) {
_initializeImageProvider(widget.tournament.banner_img_url);
}

@override
void didUpdateWidget(covariant FlexibleSpace oldWidget) {
super.didUpdateWidget(oldWidget);
if (widget.tournament.banner_img_url !=
oldWidget.tournament.banner_img_url) {
_initializeImageProvider(widget.tournament.banner_img_url);
}
}

void _initializeImageProvider(String? imageUrl) {
if (imageUrl != null) {
imageProvider = CachedNetworkImageProvider(imageUrl);
imageProvider!.createPaletteGenerator().then((generatedPalette) {
if (mounted) {
setState(() => this.palette = palette);
setState(() => palette = generatedPalette);
}
});
} else {
setState(() => imageProvider = null);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,11 @@ class MatchScheduler {
GroupedMatchMap scheduleMatchesByType() {
switch (matchType) {
case TournamentType.knockOut:
return scheduleKnockOutMatchesWithArguments(scheduledMatches, teams,
addInitialRound: true);
return scheduleKnockOutMatchesWithArguments(
scheduledMatches,
teams,
addInitialRound: true,
);
case TournamentType.miniRobin:
return scheduleMiniRoundRobinMatches();
case TournamentType.boxLeague:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,19 +56,7 @@ class _MatchSelectionScreenState extends ConsumerState<MatchSelectionScreen> {
_addButton(
context,
onPressed: () {
final option = MatchGroup.values.toList();
if (state.matches.containsKey(MatchGroup.quarterfinal)) {
option.remove(MatchGroup.quarterfinal);
}

if (state.matches.containsKey(MatchGroup.semifinal)) {
option.remove(MatchGroup.semifinal);
}

if (state.matches.containsKey(MatchGroup.finals)) {
option.remove(MatchGroup.finals);
}

final option = notifier.getMatchGroupOption();
showActionBottomSheet(
context: context,
items: option
Expand Down Expand Up @@ -161,6 +149,11 @@ class _MatchSelectionScreenState extends ConsumerState<MatchSelectionScreen> {
final roundDisplay = group == MatchGroup.round
? "${group.getString(context)} $number"
: group.getString(context);
final showAddButton =
(group == MatchGroup.quarterfinal && matches.length < 4) ||
(group == MatchGroup.semifinal && matches.length < 2) ||
(group == MatchGroup.finals && matches.isEmpty) ||
group == MatchGroup.round;
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expand All @@ -178,13 +171,14 @@ class _MatchSelectionScreenState extends ConsumerState<MatchSelectionScreen> {
),
),
),
_addButton(context, onPressed: () {
AppRoute.addMatch(
tournamentId: tournamentId,
group: group,
groupNumber: number,
).push(context);
}),
if (showAddButton)
_addButton(context, onPressed: () {
AppRoute.addMatch(
tournamentId: tournamentId,
group: group,
groupNumber: number,
).push(context);
}),
],
),
),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,46 @@ class MatchSelectionViewNotifier extends StateNotifier<MatchSelectionState> {
return filteredMatches;
}

List<MatchGroup> getMatchGroupOption() {
final options = MatchGroup.values.toList();
final tournamentType = state.tournament?.type;
if (state.matches.containsKey(MatchGroup.round)) {
if (tournamentType == TournamentType.miniRobin ||
(tournamentType == TournamentType.doubleOut &&
(state.matches[MatchGroup.round]?.entries.length ?? 0) > 1)) {
options.remove(MatchGroup.round);
}
}

if (tournamentType == TournamentType.doubleOut ||
state.matches.containsKey(MatchGroup.quarterfinal)) {
if (tournamentType == TournamentType.doubleOut ||
tournamentType == TournamentType.miniRobin ||
tournamentType == TournamentType.boxLeague ||
tournamentType == TournamentType.knockOut) {
options.remove(MatchGroup.quarterfinal);
}
}

if (tournamentType == TournamentType.doubleOut ||
state.matches.containsKey(MatchGroup.semifinal)) {
if (tournamentType == TournamentType.doubleOut ||
tournamentType == TournamentType.miniRobin ||
tournamentType == TournamentType.boxLeague ||
tournamentType == TournamentType.knockOut) {
{
options.remove(MatchGroup.semifinal);
}
}
}

if (state.matches.containsKey(MatchGroup.finals)) {
options.remove(MatchGroup.finals);
}

return options;
}

@override
void dispose() {
_tournamentSubscription?.cancel();
Expand Down
3 changes: 2 additions & 1 deletion style/lib/pickers/date_and_time_picker.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import '../theme/colors.dart';
Future<void> selectDate(
BuildContext context, {
String? helpText,
DateTime? startDate,
required DateTime initialDate,
required Function(DateTime) onDateSelected,
}) async {
Expand All @@ -15,7 +16,7 @@ Future<void> selectDate(
context: context,
helpText: helpText,
initialDate: initialDate,
firstDate: initialDate.isBefore(now) ? initialDate : now,
firstDate: startDate ?? (initialDate.isBefore(now) ? initialDate : now),
lastDate: DateTime(now.year + 1, now.month, now.day),
builder: (context, child) {
return Theme(
Expand Down
Loading