Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
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
1 change: 1 addition & 0 deletions assets/svgs/ClashBot-HomePage.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
12 changes: 7 additions & 5 deletions lib/globals/credentials.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import 'dart:io';

abstract class Credentials {
static const APP_DISCORD_OAUTH_CLIENT_ID = "837629412328734740";
static const APP_DISCORD_OAUTH_REDIRECT_URI = "http://localhost:4200/login";
static const SCOPE = ['identify', 'guilds'];
static final appUserCredentialsFile = new File("~/.myapp/credentials.json");
}
// static const APP_DISCORD_OAUTH_CLIENT_ID = "837629412328734740";
static const APP_DISCORD_OAUTH_CLIENT_ID = "839586949748228156";
static const APP_DISCORD_OAUTH_REDIRECT_URI = "http://localhost:4200/login";
static const SCOPE = ['identify', 'guilds'];
static final appUserCredentialsFile = new File("~/.myapp/credentials.json");
}
1 change: 0 additions & 1 deletion lib/globals/global_settings.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import 'package:clashbot_flutter/clients/discord_client.dart';
import 'package:clashbot_flutter/clients/mock_discord_client.dart';
import 'package:clashbot_flutter/globals/credentials.dart';
import 'package:oauth2_client/oauth2_helper.dart';

Expand Down
149 changes: 81 additions & 68 deletions lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,10 @@ import 'dart:developer' as developer;
import 'package:clash_bot_api/api.dart';
import 'package:clashbot_flutter/core/config/env.dart';
import 'package:clashbot_flutter/globals/color_schemes.dart';
import 'package:clashbot_flutter/models/clash_team.dart';
import 'package:clashbot_flutter/models/model_first_time.dart';
import 'package:clashbot_flutter/pages/home/page/home_v2.dart';
import 'package:clashbot_flutter/pages/home/page/widgets/team_card.dart';
import 'package:clashbot_flutter/pages/intro/welcome_page.dart';
import 'package:clashbot_flutter/routes.dart';
import 'package:clashbot_flutter/services/clashbot_service.dart';
Expand All @@ -15,7 +17,10 @@ import 'package:clashbot_flutter/services/discord_service_mock_impl.dart';
import 'package:clashbot_flutter/services/riot_resources_service.dart';
import 'package:clashbot_flutter/services/riot_resources_service_impl.dart';
import 'package:clashbot_flutter/stores/application_details.store.dart';
import 'package:clashbot_flutter/stores/discord_details.store.dart';
import 'package:clashbot_flutter/stores/riot_champion.store.dart';
import 'package:clashbot_flutter/stores/v2-stores/clash.store.dart';
import 'package:clashbot_flutter/stores/v2-stores/error_handler.store.dart';
import 'package:clashbot_flutter/styles.dart';
import 'package:clashbot_flutter/utils/reusable_widgets.dart';
import 'package:flutter/material.dart';
Expand All @@ -26,6 +31,7 @@ import 'package:intl/intl.dart';
import 'package:mobx/mobx.dart';
import 'package:provider/provider.dart';
import 'package:validators/validators.dart';
import 'package:storybook_flutter/storybook_flutter.dart';

import 'generated/git_info.dart';
import 'globals/global_settings.dart';
Expand Down Expand Up @@ -128,25 +134,33 @@ class _MyAppState extends State<MyApp> {
create: (_) => RiotResourceServiceImpl()),
Provider<ClashBotEventsService>(
create: (_) => ClashBotEventsService()),
ProxyProvider4<DiscordService, ClashBotService, RiotResourcesService,
ClashBotEventsService, ApplicationDetailsStore>(
update: (_, discordService, clashBotService, riotResourceService,
clashBotEventService, __) =>
ApplicationDetailsStore(discordService, clashBotService,
riotResourceService, clashBotEventService)),
ProxyProvider2<ApplicationDetailsStore, ClashBotService, ClashStore>(
update: (_, applicationDetailsStore, clashBotService, __) =>
ClashStore(clashBotService, applicationDetailsStore))
Provider<ErrorHandlerStore>(create: (_) => ErrorHandlerStore()),
ProxyProvider2<ClashBotService, ErrorHandlerStore, ClashStore>(
update: (_, clashBotService, errorHandlerStore, __) =>
ClashStore(clashBotService, errorHandlerStore)),
ProxyProvider2<DiscordService, ErrorHandlerStore,
DiscordDetailsStore>(
update: (_, discordService, errorHandlerStore, __) =>
DiscordDetailsStore(discordService, errorHandlerStore)),
ProxyProvider2<RiotResourcesService, ErrorHandlerStore,
RiotChampionStore>(
update: (_, riotResourceService, errorHandlerStore, __) =>
RiotChampionStore(riotResourceService, errorHandlerStore)),
// Depends on ClashStore, DiscordDetailsStore, RiotChampionStore, ErrorHandlerStore
ProxyProvider4<ClashStore, DiscordDetailsStore, RiotChampionStore,
ErrorHandlerStore, ApplicationDetailsStore>(
update: (_, clashStore, discordDetailsStore, riotChampionStore,
errorHandlerStore, __) =>
ApplicationDetailsStore(clashStore, discordDetailsStore,
riotChampionStore, errorHandlerStore)),
],
child: Consumer2<ApplicationDetailsStore, ModelFirstTime>(builder:
(context, ApplicationDetailsStore appStore,
ModelFirstTime modelFirstTime, child) {
if (modelFirstTime.visited) {
appStore.loadUserDetails();
if (modelFirstTime.visited && !appStore.isLoggedIn) {
appStore.refreshDiscordUser();
}
return Observer(builder: (_) {
return const MainApp();
});
return const MainApp();
}));
}
}
Expand Down Expand Up @@ -270,28 +284,27 @@ class MainContainer extends StatelessWidget {

@override
Widget build(BuildContext context) {
final appStore = context.read<ApplicationDetailsStore>();
final discordDetailsStore = context.read<DiscordDetailsStore>();
final errorStore = context.read<ErrorHandlerStore>();
autorun((_) {
if ('' != appStore.error) {
if ('' != errorStore.errorMessage) {
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
backgroundColor: Colors.redAccent, content: Text(appStore.error)));
appStore.error = '';
backgroundColor: Colors.redAccent,
content: Text(errorStore.errorMessage)));
errorStore.errorMessage = '';
}
appStore.discordDetailsStore.discordIdToName.forEach((key, value) {
developer.log("$key => $value");
});
});
return Consumer<ModelTheme>(
builder: (context, ModelTheme themeNotifier, consChild) {
return Scaffold(
appBar: AppBar(title: const Text('ClashBot 2.0'), actions: <Widget>[
Observer(
builder: (_) => Badge.count(
count: appStore.unreadNotifications.length,
alignment: AlignmentDirectional.bottomStart,
isLabelVisible: appStore.unreadNotifications.isNotEmpty,
child: const ClashBotNotificationsWidget(),
)),
// Observer(
// builder: (_) => Badge.count(
// count: appStore.unreadNotifications.length,
// alignment: AlignmentDirectional.bottomStart,
// isLabelVisible: appStore.unreadNotifications.isNotEmpty,
// child: const ClashBotNotificationsWidget(),
// )),
Column(
mainAxisSize: MainAxisSize.min,
// spacing: 1.0,
Expand Down Expand Up @@ -322,11 +335,11 @@ class MainContainer extends StatelessWidget {
: themeNotifier.isDark = true;
}),
Observer(builder: (_) {
if (appStore.isLoggedIn) {
if (discordDetailsStore.userHasLoggedIn) {
return PopupMenuButton(
icon: CircleAvatar(
backgroundImage: NetworkImage(appStore
.discordDetailsStore.discordUser.avatarURL))
backgroundImage: NetworkImage(
discordDetailsStore.discordUser.avatarURL))
.animate()
.shake(duration: const Duration(seconds: 1)),
offset: const Offset(0, 50),
Expand Down Expand Up @@ -354,39 +367,39 @@ class MainContainer extends StatelessWidget {
}
}

class ClashBotNotificationsWidget extends StatelessWidget {
const ClashBotNotificationsWidget({super.key});
// class ClashBotNotificationsWidget extends StatelessWidget {
// const ClashBotNotificationsWidget({super.key});

@override
Widget build(BuildContext context) {
final appStore = context.read<ApplicationDetailsStore>();
return Observer(builder: (_) {
return PopupMenuButton(
icon: const Icon(Icons.add_alert),
tooltip: 'Notifications',
position: PopupMenuPosition.under,
itemBuilder: (BuildContext context) {
return appStore.sortedNotifications.map((notification) {
var discordGuild = appStore
.discordDetailsStore.discordGuildMap[notification.serverId];
return PopupMenuItem<String>(
value: notification.uuid,
enabled: !notification.read,
padding: const EdgeInsets.all(2.0),
child: ClashBotNotificationBody(
serverName: discordGuild?.name ?? '',
message: notification.message,
causedBy: notification.causedBy,
timestamp: notification.timestamp,
iconUrl: discordGuild?.iconURL ?? '',
));
}).toList();
},
onSelected: (value) => appStore.readNotification(value),
);
});
}
}
// @override
// Widget build(BuildContext context) {
// final discordDetailsStore = context.read<DiscordDetailsStore>();
// return Observer(builder: (_) {
// return PopupMenuButton(
// icon: const Icon(Icons.add_alert),
// tooltip: 'Notifications',
// position: PopupMenuPosition.under,
// itemBuilder: (BuildContext context) {
// return appStore.sortedNotifications.map((notification) {
// var discordGuild = appStore
// .discordDetailsStore.discordGuildMap[notification.serverId];
// return PopupMenuItem<String>(
// value: notification.uuid,
// enabled: !notification.read,
// padding: const EdgeInsets.all(2.0),
// child: ClashBotNotificationBody(
// serverName: discordGuild?.name ?? '',
// message: notification.message,
// causedBy: notification.causedBy,
// timestamp: notification.timestamp,
// iconUrl: discordGuild?.iconURL ?? '',
// ));
// }).toList();
// },
// onSelected: (value) => appStore.readNotification(value),
// );
// });
// }
// }

class ClashBotNotificationBody extends StatelessWidget {
ClashBotNotificationBody({
Expand Down Expand Up @@ -474,6 +487,7 @@ class DrawerHeaderContentWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
final applicationDetailsStore = context.read<ApplicationDetailsStore>();
final discordDetailsStore = context.read<DiscordDetailsStore>();
return Column(
children: [
Observer(
Expand All @@ -482,13 +496,12 @@ class DrawerHeaderContentWidget extends StatelessWidget {
return Row(children: [
ListTile(
leading: CircleAvatar(
backgroundImage: NetworkImage(applicationDetailsStore
.discordDetailsStore.discordUser.avatarURL),
backgroundImage:
NetworkImage(discordDetailsStore.discordUser.avatarURL),
radius: 20,
),
title: Text(
applicationDetailsStore
.discordDetailsStore.discordUser.username,
discordDetailsStore.discordUser.username,
style: const TextStyle(
color: Colors.white,
fontSize: 24,
Expand All @@ -500,7 +513,7 @@ class DrawerHeaderContentWidget extends StatelessWidget {
children: [
ListTile(
leading: const Icon(Icons.discord),
title: Text(applicationDetailsStore.id,
title: Text(discordDetailsStore.discordUser.id,
style: const TextStyle(
color: Colors.white,
fontSize: 14,
Expand Down
11 changes: 11 additions & 0 deletions lib/models/clashbot_user.dart
Original file line number Diff line number Diff line change
Expand Up @@ -46,4 +46,15 @@ class ClashBotUser {

/// The list of preferred Discord Servers for the player to filter by.
List<String> preferredServers;

ClashBotUser copy() {
return ClashBotUser(
discordId: discordId,
role: role,
champions: champions,
subscriptions: subscriptions,
serverId: serverId,
selectedServers: selectedServers,
preferredServers: preferredServers);
}
}
7 changes: 6 additions & 1 deletion lib/models/discord_user.dart
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ class DiscordUser {
late String discriminator;

String get userDiscr => "$username#$discriminator";
String get avatarURL => "${AppGlobalSettings.CND_DISCORD_AVATAR_URL}$id/$avatar.png";
String get avatarURL =>
"${AppGlobalSettings.CND_DISCORD_AVATAR_URL}$id/$avatar.png";

DiscordUser(
this.id,
Expand Down Expand Up @@ -90,4 +91,8 @@ class DiscordUser {
avatar.hashCode ^
discriminator.hashCode;
}

DiscordUser copy() {
return DiscordUser(id, username, avatar, discriminator);
}
}
Loading