diff --git a/lib/main.dart b/lib/main.dart index 8b0aab5..3da5d38 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -25,7 +25,7 @@ void main() async { databaseFactory = databaseFactoryFfi; } WidgetsFlutterBinding.ensureInitialized(); - if (!Platform.isAndroid && !Platform.isIOS){ + if (!kIsWeb && !Platform.isAndroid && !Platform.isIOS){ await WindowManager.instance.ensureInitialized(); windowManager.waitUntilReadyToShow().then((_) async { await windowManager.setTitle('Tetra Stats'); diff --git a/lib/services/tetrio_crud.dart b/lib/services/tetrio_crud.dart index 8827dac..e875d49 100644 --- a/lib/services/tetrio_crud.dart +++ b/lib/services/tetrio_crud.dart @@ -57,7 +57,7 @@ class TetrioService extends DB { final Map> _newsCache = {}; final Map> _topTRcache = {}; final Map _tlStreamsCache = {}; // i'm trying to respect oskware api It should look something like {"cached_until": TetrioPlayer} - final client = UserAgentClient("package info thingy: ${packageInfo.version} (Tetra Stats v1.2.4 dev build)", http.Client()); + final client = UserAgentClient("Tetra Stats v${packageInfo.version} (dm @dan63047 if someone abuse that software)", http.Client()); static final TetrioService _shared = TetrioService._sharedInstance(); factory TetrioService() => _shared; late final StreamController>> _tetrioStreamController; diff --git a/lib/views/calc_view.dart b/lib/views/calc_view.dart index 854263e..8191e97 100644 --- a/lib/views/calc_view.dart +++ b/lib/views/calc_view.dart @@ -1,5 +1,6 @@ import 'dart:io'; import 'package:fl_chart/fl_chart.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:tetra_stats/data_objects/tetrio.dart'; @@ -31,7 +32,7 @@ class CalcState extends State { @override void initState() { _scrollController = ScrollController(); - if (!Platform.isAndroid && !Platform.isIOS){ + if (!kIsWeb && !Platform.isAndroid && !Platform.isIOS){ windowManager.getTitle().then((value) => oldWindowTitle = value); windowManager.setTitle("Tetra Stats: ${t.statsCalc}"); } @@ -40,7 +41,7 @@ class CalcState extends State { @override void dispose() { - if (!Platform.isAndroid && !Platform.isIOS) windowManager.setTitle(oldWindowTitle); + if (!kIsWeb && !Platform.isAndroid && !Platform.isIOS) windowManager.setTitle(oldWindowTitle); super.dispose(); } diff --git a/lib/views/compare_view.dart b/lib/views/compare_view.dart index e1d05e8..45ab9b1 100644 --- a/lib/views/compare_view.dart +++ b/lib/views/compare_view.dart @@ -44,7 +44,7 @@ class CompareState extends State { fetchGreenSide(widget.greenSide[0].userId); if (widget.redSide[0] != null) fetchRedSide(widget.redSide[0].userId); _scrollController = ScrollController(); - if (!Platform.isAndroid && !Platform.isIOS){ + if (!kIsWeb && !Platform.isAndroid && !Platform.isIOS){ windowManager.getTitle().then((value) => oldWindowTitle = value); } super.initState(); @@ -56,7 +56,7 @@ class CompareState extends State { greenSideMode = Mode.player; theRedSide = [null, null, null]; redSideMode = Mode.player; - if (!Platform.isAndroid && !Platform.isIOS) windowManager.setTitle(oldWindowTitle); + if (!kIsWeb && !Platform.isAndroid && !Platform.isIOS) windowManager.setTitle(oldWindowTitle); super.dispose(); } diff --git a/lib/views/main_view.dart b/lib/views/main_view.dart index 476e1bc..0c4ed76 100644 --- a/lib/views/main_view.dart +++ b/lib/views/main_view.dart @@ -135,7 +135,7 @@ class _MainState extends State with SingleTickerProviderStateMixin { } _searchFor = me.userId; setState((){_titleNickname = me.username;}); - if (!Platform.isAndroid && !Platform.isIOS) await windowManager.setTitle(widget.title); + if (!kIsWeb && !Platform.isAndroid && !Platform.isIOS) await windowManager.setTitle(widget.title); late List requests; late TetraLeagueAlphaStream tlStream; late Map records; diff --git a/lib/views/mathes_view.dart b/lib/views/mathes_view.dart index 47ccf59..78c422d 100644 --- a/lib/views/mathes_view.dart +++ b/lib/views/mathes_view.dart @@ -1,4 +1,5 @@ import 'dart:io'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:tetra_stats/services/tetrio_crud.dart'; @@ -23,7 +24,7 @@ class MatchesState extends State { @override void initState() { - if (!Platform.isAndroid && !Platform.isIOS){ + if (!kIsWeb && !Platform.isAndroid && !Platform.isIOS){ windowManager.getTitle().then((value) => oldWindowTitle = value); windowManager.setTitle("Tetra Stats: ${t.matchesViewTitle(nickname: widget.username)}"); } @@ -32,7 +33,7 @@ class MatchesState extends State { @override void dispose(){ - if (!Platform.isAndroid && !Platform.isIOS) windowManager.setTitle(oldWindowTitle); + if (!kIsWeb && !Platform.isAndroid && !Platform.isIOS) windowManager.setTitle(oldWindowTitle); super.dispose(); } diff --git a/lib/views/rank_averages_view.dart b/lib/views/rank_averages_view.dart index 9f9a175..2d83e1c 100644 --- a/lib/views/rank_averages_view.dart +++ b/lib/views/rank_averages_view.dart @@ -1,5 +1,6 @@ import 'dart:io'; import 'package:fl_chart/fl_chart.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:tetra_stats/data_objects/tetrio.dart'; @@ -33,7 +34,7 @@ class RankState extends State with SingleTickerProviderStateMixin { void initState() { _scrollController = ScrollController(); _tabController = TabController(length: 6, vsync: this); - if (!Platform.isAndroid && !Platform.isIOS){ + if (!kIsWeb && !Platform.isAndroid && !Platform.isIOS){ windowManager.getTitle().then((value) => oldWindowTitle = value); windowManager.setTitle("Tetra Stats: ${widget.rank[1]["everyone"] ? t.everyoneAverages : t.rankAverages(rank: widget.rank[0].rank.toUpperCase())}"); } @@ -44,7 +45,7 @@ class RankState extends State with SingleTickerProviderStateMixin { void dispose() { _tabController.dispose(); _scrollController.dispose(); - if (!Platform.isAndroid && !Platform.isIOS) windowManager.setTitle(oldWindowTitle); + if (!kIsWeb && !Platform.isAndroid && !Platform.isIOS) windowManager.setTitle(oldWindowTitle); super.dispose(); } diff --git a/lib/views/ranks_averages_view.dart b/lib/views/ranks_averages_view.dart index e851d1a..517880c 100644 --- a/lib/views/ranks_averages_view.dart +++ b/lib/views/ranks_averages_view.dart @@ -1,4 +1,5 @@ import 'dart:io'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:tetra_stats/gen/strings.g.dart'; @@ -24,7 +25,7 @@ class RanksAverages extends State { averages = value.averages; setState(() {}); }); - if (!Platform.isAndroid && !Platform.isIOS){ + if (!kIsWeb && !Platform.isAndroid && !Platform.isIOS){ windowManager.getTitle().then((value) => oldWindowTitle = value); windowManager.setTitle("Tetra Stats: ${t.rankAveragesViewTitle}"); } @@ -33,7 +34,7 @@ class RanksAverages extends State { @override void dispose() { - if (!Platform.isAndroid && !Platform.isIOS) windowManager.setTitle(oldWindowTitle); + if (!kIsWeb && !Platform.isAndroid && !Platform.isIOS) windowManager.setTitle(oldWindowTitle); super.dispose(); } diff --git a/lib/views/settings_view.dart b/lib/views/settings_view.dart index 219f196..e47cb27 100644 --- a/lib/views/settings_view.dart +++ b/lib/views/settings_view.dart @@ -29,7 +29,7 @@ class SettingsState extends State { @override void initState() { - if (!Platform.isAndroid && !Platform.isIOS){ + if (!kIsWeb && !Platform.isAndroid && !Platform.isIOS){ windowManager.getTitle().then((value) => oldWindowTitle = value); windowManager.setTitle("Tetra Stats: ${t.settings}"); } @@ -39,7 +39,7 @@ class SettingsState extends State { @override void dispose(){ - if (!Platform.isAndroid && !Platform.isIOS) windowManager.setTitle(oldWindowTitle); + if (!kIsWeb && !Platform.isAndroid && !Platform.isIOS) windowManager.setTitle(oldWindowTitle); super.dispose(); } diff --git a/lib/views/state_view.dart b/lib/views/state_view.dart index 35f7892..a86286c 100644 --- a/lib/views/state_view.dart +++ b/lib/views/state_view.dart @@ -1,4 +1,5 @@ import 'dart:io'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:tetra_stats/data_objects/tetrio.dart'; @@ -25,7 +26,7 @@ class StateState extends State { @override void initState() { _scrollController = ScrollController(); - if (!Platform.isAndroid && !Platform.isIOS){ + if (!kIsWeb && !Platform.isAndroid && !Platform.isIOS){ windowManager.getTitle().then((value) => oldWindowTitle = value); windowManager.setTitle("Tetra Stats: ${t.stateViewTitle(nickname: widget.state.username.toUpperCase(), date: dateFormat.format(widget.state.state))}"); } @@ -35,7 +36,7 @@ class StateState extends State { @override void dispose() { _scrollController.dispose(); - if (!Platform.isAndroid && !Platform.isIOS) windowManager.setTitle(oldWindowTitle); + if (!kIsWeb && !Platform.isAndroid && !Platform.isIOS) windowManager.setTitle(oldWindowTitle); super.dispose(); } diff --git a/lib/views/states_view.dart b/lib/views/states_view.dart index 6432f82..02c4ccd 100644 --- a/lib/views/states_view.dart +++ b/lib/views/states_view.dart @@ -1,4 +1,5 @@ import 'dart:io'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:tetra_stats/data_objects/tetrio.dart'; @@ -20,7 +21,7 @@ late String oldWindowTitle; class StatesState extends State { @override void initState() { - if (!Platform.isAndroid && !Platform.isIOS){ + if (!kIsWeb && !Platform.isAndroid && !Platform.isIOS){ windowManager.getTitle().then((value) => oldWindowTitle = value); windowManager.setTitle("Tetra Stats: ${t.statesViewTitle(number: widget.states.length, nickname: widget.states.last.username.toUpperCase())}"); } @@ -29,7 +30,7 @@ class StatesState extends State { @override void dispose() { - if (!Platform.isAndroid && !Platform.isIOS) windowManager.setTitle(oldWindowTitle); + if (!kIsWeb && !Platform.isAndroid && !Platform.isIOS) windowManager.setTitle(oldWindowTitle); super.dispose(); } diff --git a/lib/views/tl_leaderboard_view.dart b/lib/views/tl_leaderboard_view.dart index 249aed5..c64bc9a 100644 --- a/lib/views/tl_leaderboard_view.dart +++ b/lib/views/tl_leaderboard_view.dart @@ -1,4 +1,5 @@ import 'dart:io'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:tetra_stats/data_objects/tetrio.dart'; @@ -27,16 +28,13 @@ class TLLeaderboardView extends StatefulWidget { class TLLeaderboardState extends State { @override void initState() { - if (!Platform.isAndroid && !Platform.isIOS){ - windowManager.getTitle().then((value) => oldWindowTitle = value); - windowManager.setTitle("Tetra Stats: ${t.tlLeaderboard}"); - } + if (!kIsWeb && !Platform.isAndroid && !Platform.isIOS) windowManager.getTitle().then((value) => oldWindowTitle = value); super.initState(); } @override void dispose() { - if (!Platform.isAndroid && !Platform.isIOS) windowManager.setTitle(oldWindowTitle); + if (!kIsWeb && !Platform.isAndroid && !Platform.isIOS) windowManager.setTitle(oldWindowTitle); super.dispose(); } @@ -75,6 +73,7 @@ class TLLeaderboardState extends State { return const Center(child: Text('Fetching...')); case ConnectionState.done: final allPlayers = snapshot.data?.getStatRanking(snapshot.data!.leaderboard, sortBy, reversed: reversed, country: country); + if (!kIsWeb && !Platform.isAndroid && !Platform.isIOS) windowManager.setTitle("Tetra Stats: ${t.tlLeaderboard} - ${t.players(n: allPlayers!.length)}"); return NestedScrollView( headerSliverBuilder: (context, value) { String howManyPlayers(int numberOfPlayers) => Intl.plural( diff --git a/lib/views/tl_match_view.dart b/lib/views/tl_match_view.dart index 4b975e3..9273e02 100644 --- a/lib/views/tl_match_view.dart +++ b/lib/views/tl_match_view.dart @@ -1,5 +1,6 @@ import 'dart:io'; import 'package:fl_chart/fl_chart.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:tetra_stats/data_objects/tetrio.dart'; @@ -30,7 +31,7 @@ class TlMatchResultState extends State { _scrollController = ScrollController(); rounds = [DropdownMenuItem(value: -1, child: Text(t.match))]; rounds.addAll([for (int i = 0; i < widget.record.endContext.first.secondaryTracking.length; i++) DropdownMenuItem(value: i, child: Text(t.roundNumber(n: i+1)))]); - if (!Platform.isAndroid && !Platform.isIOS){ + if (!kIsWeb && !Platform.isAndroid && !Platform.isIOS){ windowManager.getTitle().then((value) => oldWindowTitle = value); windowManager.setTitle("Tetra Stats: ${widget.record.endContext.firstWhere((element) => element.userId == widget.initPlayerId).username.toUpperCase()} ${t.vs} ${widget.record.endContext.firstWhere((element) => element.userId != widget.initPlayerId).username.toUpperCase()} ${t.inTLmatch} ${dateFormat.format(widget.record.timestamp)}"); } @@ -40,7 +41,7 @@ class TlMatchResultState extends State { @override void dispose(){ roundSelector = -1; - if (!Platform.isAndroid && !Platform.isIOS) windowManager.setTitle(oldWindowTitle); + if (!kIsWeb && !Platform.isAndroid && !Platform.isIOS) windowManager.setTitle(oldWindowTitle); super.dispose(); } diff --git a/lib/views/tracked_players_view.dart b/lib/views/tracked_players_view.dart index b0b19ae..7a83b36 100644 --- a/lib/views/tracked_players_view.dart +++ b/lib/views/tracked_players_view.dart @@ -1,4 +1,5 @@ import 'dart:io'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:tetra_stats/data_objects/tetrio.dart'; @@ -20,7 +21,7 @@ class TrackedPlayersView extends StatefulWidget { class TrackedPlayersState extends State { @override void initState() { - if (!Platform.isAndroid && !Platform.isIOS){ + if (!kIsWeb && !Platform.isAndroid && !Platform.isIOS){ windowManager.getTitle().then((value) => oldWindowTitle = value); windowManager.setTitle("Tetra Stats: ${t.trackedPlayersViewTitle}"); } @@ -29,7 +30,7 @@ class TrackedPlayersState extends State { @override void dispose() { - if (!Platform.isAndroid && !Platform.isIOS) windowManager.setTitle(oldWindowTitle); + if (!kIsWeb && !Platform.isAndroid && !Platform.isIOS) windowManager.setTitle(oldWindowTitle); super.dispose(); } diff --git a/lib/widgets/tl_thingy.dart b/lib/widgets/tl_thingy.dart index 55f6d59..9a203e8 100644 --- a/lib/widgets/tl_thingy.dart +++ b/lib/widgets/tl_thingy.dart @@ -55,9 +55,15 @@ class TLThingy extends StatelessWidget { Colors.green ), ), - Text( - "${t.top} ${f2.format(tl.percentile * 100)}% (${tl.percentileRank.toUpperCase()})${tl.bestRank != "z" ? " • ${t.topRank}: ${tl.bestRank.toUpperCase()}" : ""}${topTR != null ? " (${f2.format(topTR)} TR)" : ""} • Glicko: ${f2.format(tl.glicko!)}±${f2.format(tl.rd!)}${tl.decaying ? ' • ${t.decaying}' : ''}", - textAlign: TextAlign.center, + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + "${t.top} ${f2.format(tl.percentile * 100)}% (${tl.percentileRank.toUpperCase()})${tl.bestRank != "z" ? " • ${t.topRank}: ${tl.bestRank.toUpperCase()}" : ""}${topTR != null ? " (${f2.format(topTR)} TR)" : ""} • Glicko: ${f2.format(tl.glicko!)}±${f2.format(tl.rd!)}", + textAlign: TextAlign.center, + ), + if (tl.decaying) Icon(Icons.trending_up, color: tl.rd! > 98 ? Colors.red : Colors.yellow,) + ], ), ], ), diff --git a/pubspec.yaml b/pubspec.yaml index c3ed7fe..5afa7df 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -2,7 +2,7 @@ name: tetra_stats description: Track your and other player stats in TETR.IO publish_to: 'none' -version: 1.2.3+11 +version: 1.2.4+12 environment: sdk: '>=2.19.6 <3.0.0'