From 53fabd067a5aab0047a4793e55c18f730ed11b66 Mon Sep 17 00:00:00 2001 From: Tommy Chow Date: Wed, 31 Aug 2022 14:11:45 -0400 Subject: [PATCH] Restructure folders (#184) * Split up `video_chat.dart` * Restructure home folder * Restructure settings folder * Restructure channel folder * More restructuring --- lib/{api => apis}/bttv_api.dart | 0 lib/{api => apis}/ffz_api.dart | 0 lib/{api => apis}/seventv_api.dart | 0 lib/{api => apis}/twitch_api.dart | 2 +- lib/{constants => }/constants.dart | 0 lib/main.dart | 12 +- lib/models/emotes.dart | 2 +- lib/models/irc.dart | 4 +- lib/screens/channel/channel.dart | 315 ++++++++++++++++ lib/screens/channel/chat/chat.dart | 2 +- .../channel/chat/details/chat_details.dart | 4 +- .../details}/chat_details_store.dart | 2 +- .../details}/chat_details_store.g.dart | 0 .../channel/chat/details/chat_users_list.dart | 8 +- .../channel/chat/emote_menu/emote_menu.dart | 2 +- .../chat/emote_menu/emote_menu_panel.dart | 2 +- .../chat/emote_menu/emote_menu_section.dart | 4 +- .../chat/emote_menu/recent_emotes_panel.dart | 4 +- .../{ => chat}/stores/chat_assets_store.dart | 8 +- .../stores/chat_assets_store.g.dart | 0 .../channel/{ => chat}/stores/chat_store.dart | 8 +- .../{ => chat}/stores/chat_store.g.dart | 0 .../channel/chat/widgets/chat_bottom_bar.dart | 4 +- .../channel/chat/widgets/chat_message.dart | 2 +- .../channel/chat/widgets/chat_user_modal.dart | 4 +- lib/screens/channel/video/video.dart | 28 ++ .../video_overlay.dart} | 342 +----------------- .../{stores => video}/video_store.dart | 4 +- .../{stores => video}/video_store.g.dart | 0 lib/screens/home/home.dart | 10 +- lib/screens/home/{stores => }/home_store.dart | 2 +- .../home/{stores => }/home_store.g.dart | 0 lib/screens/home/search/search.dart | 6 +- .../search/search_results_categories.dart | 4 +- .../home/search/search_results_channels.dart | 6 +- .../home/{stores => search}/search_store.dart | 4 +- .../{stores => search}/search_store.g.dart | 0 .../{widgets => stream_list}/stream_card.dart | 8 +- .../stream_list_store.dart} | 6 +- .../stream_list_store.g.dart} | 2 +- .../streams_list.dart | 8 +- .../home/top/{ => categories}/categories.dart | 8 +- .../categories}/categories_store.dart | 4 +- .../categories}/categories_store.g.dart | 0 .../categories}/category_card.dart | 2 +- .../{ => categories}/category_streams.dart | 8 +- .../home/top/{top_section.dart => top.dart} | 8 +- .../{sections => }/account_settings.dart | 4 +- .../{sections => }/chat_settings.dart | 2 +- .../{sections => }/general_settings.dart | 0 .../{sections => }/other_settings.dart | 2 +- lib/screens/settings/settings.dart | 12 +- .../settings/stores}/auth_store.dart | 6 +- .../settings/stores}/auth_store.g.dart | 0 .../settings/stores}/user_store.dart | 2 +- .../settings/stores}/user_store.g.dart | 0 .../{sections => }/video_settings.dart | 0 lib/widgets/alert_message.dart | 2 +- lib/widgets/block_button.dart | 2 +- lib/widgets/block_report_modal.dart | 2 +- lib/widgets/button.dart | 4 +- lib/widgets/profile_picture.dart | 4 +- 62 files changed, 451 insertions(+), 440 deletions(-) rename lib/{api => apis}/bttv_api.dart (100%) rename lib/{api => apis}/ffz_api.dart (100%) rename lib/{api => apis}/seventv_api.dart (100%) rename lib/{api => apis}/twitch_api.dart (99%) rename lib/{constants => }/constants.dart (100%) create mode 100644 lib/screens/channel/channel.dart rename lib/screens/channel/{stores => chat/details}/chat_details_store.dart (98%) rename lib/screens/channel/{stores => chat/details}/chat_details_store.g.dart (100%) rename lib/screens/channel/{ => chat}/stores/chat_assets_store.dart (97%) rename lib/screens/channel/{ => chat}/stores/chat_assets_store.g.dart (100%) rename lib/screens/channel/{ => chat}/stores/chat_store.dart (98%) rename lib/screens/channel/{ => chat}/stores/chat_store.g.dart (100%) create mode 100644 lib/screens/channel/video/video.dart rename lib/screens/channel/{video_chat.dart => video/video_overlay.dart} (52%) rename lib/screens/channel/{stores => video}/video_store.dart (98%) rename lib/screens/channel/{stores => video}/video_store.g.dart (100%) rename lib/screens/home/{stores => }/home_store.dart (98%) rename lib/screens/home/{stores => }/home_store.g.dart (100%) rename lib/screens/home/{stores => search}/search_store.dart (96%) rename lib/screens/home/{stores => search}/search_store.g.dart (100%) rename lib/screens/home/{widgets => stream_list}/stream_card.dart (97%) rename lib/screens/home/{stores/list_store.dart => stream_list/stream_list_store.dart} (96%) rename lib/screens/home/{stores/list_store.g.dart => stream_list/stream_list_store.g.dart} (98%) rename lib/screens/home/{widgets => stream_list}/streams_list.dart (93%) rename lib/screens/home/top/{ => categories}/categories.dart (92%) rename lib/screens/home/{stores => top/categories}/categories_store.dart (94%) rename lib/screens/home/{stores => top/categories}/categories_store.g.dart (100%) rename lib/screens/home/{widgets => top/categories}/category_card.dart (96%) rename lib/screens/home/top/{ => categories}/category_streams.dart (96%) rename lib/screens/home/top/{top_section.dart => top.dart} (86%) rename lib/screens/settings/{sections => }/account_settings.dart (98%) rename lib/screens/settings/{sections => }/chat_settings.dart (99%) rename lib/screens/settings/{sections => }/general_settings.dart (100%) rename lib/screens/settings/{sections => }/other_settings.dart (99%) rename lib/{core/auth => screens/settings/stores}/auth_store.dart (97%) rename lib/{core/auth => screens/settings/stores}/auth_store.g.dart (100%) rename lib/{core/user => screens/settings/stores}/user_store.dart (97%) rename lib/{core/user => screens/settings/stores}/user_store.g.dart (100%) rename lib/screens/settings/{sections => }/video_settings.dart (100%) diff --git a/lib/api/bttv_api.dart b/lib/apis/bttv_api.dart similarity index 100% rename from lib/api/bttv_api.dart rename to lib/apis/bttv_api.dart diff --git a/lib/api/ffz_api.dart b/lib/apis/ffz_api.dart similarity index 100% rename from lib/api/ffz_api.dart rename to lib/apis/ffz_api.dart diff --git a/lib/api/seventv_api.dart b/lib/apis/seventv_api.dart similarity index 100% rename from lib/api/seventv_api.dart rename to lib/apis/seventv_api.dart diff --git a/lib/api/twitch_api.dart b/lib/apis/twitch_api.dart similarity index 99% rename from lib/api/twitch_api.dart rename to lib/apis/twitch_api.dart index e864107b..a245a68b 100644 --- a/lib/api/twitch_api.dart +++ b/lib/apis/twitch_api.dart @@ -1,7 +1,7 @@ import 'dart:convert'; import 'package:flutter/foundation.dart'; -import 'package:frosty/constants/constants.dart'; +import 'package:frosty/constants.dart'; import 'package:frosty/models/badges.dart'; import 'package:frosty/models/category.dart'; import 'package:frosty/models/channel.dart'; diff --git a/lib/constants/constants.dart b/lib/constants.dart similarity index 100% rename from lib/constants/constants.dart rename to lib/constants.dart diff --git a/lib/main.dart b/lib/main.dart index 56fa846e..cca80833 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -4,13 +4,13 @@ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; -import 'package:frosty/api/bttv_api.dart'; -import 'package:frosty/api/ffz_api.dart'; -import 'package:frosty/api/seventv_api.dart'; -import 'package:frosty/api/twitch_api.dart'; -import 'package:frosty/constants/constants.dart'; -import 'package:frosty/core/auth/auth_store.dart'; +import 'package:frosty/apis/bttv_api.dart'; +import 'package:frosty/apis/ffz_api.dart'; +import 'package:frosty/apis/seventv_api.dart'; +import 'package:frosty/apis/twitch_api.dart'; +import 'package:frosty/constants.dart'; import 'package:frosty/screens/home/home.dart'; +import 'package:frosty/screens/settings/stores/auth_store.dart'; import 'package:frosty/screens/settings/stores/settings_store.dart'; import 'package:http/http.dart'; import 'package:mobx/mobx.dart'; diff --git a/lib/models/emotes.dart b/lib/models/emotes.dart index b812d5b9..f05d29e3 100644 --- a/lib/models/emotes.dart +++ b/lib/models/emotes.dart @@ -1,4 +1,4 @@ -import 'package:frosty/constants/constants.dart'; +import 'package:frosty/constants.dart'; import 'package:json_annotation/json_annotation.dart'; part 'emotes.g.dart'; diff --git a/lib/models/irc.dart b/lib/models/irc.dart index a246c99e..ae5a1624 100644 --- a/lib/models/irc.dart +++ b/lib/models/irc.dart @@ -3,10 +3,10 @@ import 'package:collection/collection.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:frosty/constants/constants.dart'; +import 'package:frosty/constants.dart'; import 'package:frosty/models/badges.dart'; import 'package:frosty/models/emotes.dart'; -import 'package:frosty/screens/channel/stores/chat_assets_store.dart'; +import 'package:frosty/screens/channel/chat/stores/chat_assets_store.dart'; import 'package:frosty/screens/settings/stores/settings_store.dart'; import 'package:intl/intl.dart'; import 'package:url_launcher/url_launcher.dart'; diff --git a/lib/screens/channel/channel.dart b/lib/screens/channel/channel.dart new file mode 100644 index 00000000..463d66fb --- /dev/null +++ b/lib/screens/channel/channel.dart @@ -0,0 +1,315 @@ +import 'dart:io'; + +import 'package:floating/floating.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_mobx/flutter_mobx.dart'; +import 'package:frosty/apis/bttv_api.dart'; +import 'package:frosty/apis/ffz_api.dart'; +import 'package:frosty/apis/seventv_api.dart'; +import 'package:frosty/apis/twitch_api.dart'; +import 'package:frosty/constants.dart'; +import 'package:frosty/main.dart'; +import 'package:frosty/screens/channel/chat/chat.dart'; +import 'package:frosty/screens/channel/chat/details/chat_details_store.dart'; +import 'package:frosty/screens/channel/chat/stores/chat_assets_store.dart'; +import 'package:frosty/screens/channel/chat/stores/chat_store.dart'; +import 'package:frosty/screens/channel/video/video.dart'; +import 'package:frosty/screens/channel/video/video_overlay.dart'; +import 'package:frosty/screens/channel/video/video_store.dart'; +import 'package:frosty/screens/settings/settings.dart'; +import 'package:frosty/screens/settings/stores/auth_store.dart'; +import 'package:frosty/screens/settings/stores/settings_store.dart'; +import 'package:frosty/widgets/modal.dart'; +import 'package:provider/provider.dart'; + +/// Creates a widget that shows the video stream (if live) and chat of the given user. +class VideoChat extends StatefulWidget { + final String userId; + final String userName; + final String userLogin; + + const VideoChat({ + Key? key, + required this.userId, + required this.userName, + required this.userLogin, + }) : super(key: key); + + @override + State createState() => _VideoChatState(); +} + +class _VideoChatState extends State { + final _videoKey = GlobalKey(); + final _chatKey = GlobalKey(); + + late final ChatStore _chatStore = ChatStore( + channelName: widget.userLogin, + channelId: widget.userId, + displayName: widget.userName, + auth: context.read(), + settings: context.read(), + chatDetailsStore: ChatDetailsStore( + twitchApi: context.read(), + channelName: widget.userLogin, + ), + assetsStore: ChatAssetsStore( + twitchApi: context.read(), + ffzApi: context.read(), + bttvApi: context.read(), + sevenTVApi: context.read(), + ), + ); + + late final VideoStore _videoStore = VideoStore( + userLogin: widget.userLogin, + twitchApi: context.read(), + authStore: context.read(), + settingsStore: context.read(), + ); + + @override + Widget build(BuildContext context) { + final settingsStore = _chatStore.settings; + + void showSettings() { + showModalBottomSheet( + backgroundColor: Colors.transparent, + context: context, + builder: (context) => FrostyModal( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + ListTile( + leading: const Icon(Icons.app_settings_alt), + title: const Text('App settings'), + onTap: () => showModalBottomSheet( + backgroundColor: Colors.transparent, + isScrollControlled: true, + context: context, + builder: (context) => FrostyModal( + child: SizedBox( + height: MediaQuery.of(context).size.height * 0.8, + child: Settings(settingsStore: settingsStore), + ), + ), + ), + ), + ListTile( + leading: const Icon(Icons.refresh), + title: const Text('Reconnect to chat'), + onTap: () { + _chatStore.updateNotification('Reconnecting to chat...'); + + _chatStore.connectToChat(); + }, + ), + ListTile( + leading: const Icon(Icons.refresh), + title: const Text('Refresh badges and emotes'), + onTap: () async { + await _chatStore.getAssets(); + + _chatStore.updateNotification('Badges and emotes refreshed'); + }, + ), + ], + ), + ), + ); + } + + final appBar = AppBar( + title: Text( + regexEnglish.hasMatch(_chatStore.displayName) ? _chatStore.displayName : '${_chatStore.displayName} (${_chatStore.channelName})', + style: const TextStyle(fontSize: 20), + ), + actions: [ + IconButton( + tooltip: 'Settings', + icon: const Icon(Icons.settings), + onPressed: showSettings, + ), + ], + ); + + final player = GestureDetector( + onLongPress: _videoStore.handleToggleOverlay, + child: Video( + key: _videoKey, + videoStore: _videoStore, + ), + ); + + final videoOverlay = VideoOverlay( + videoStore: _videoStore, + onSettingsPressed: showSettings, + ); + + final overlay = GestureDetector( + onLongPress: _videoStore.handleToggleOverlay, + onDoubleTap: MediaQuery.of(context).orientation == Orientation.landscape ? () => settingsStore.fullScreen = !settingsStore.fullScreen : null, + onTap: () { + if (_chatStore.assetsStore.showEmoteMenu) { + _chatStore.assetsStore.showEmoteMenu = false; + } else { + if (_chatStore.textFieldFocusNode.hasFocus) { + _chatStore.textFieldFocusNode.unfocus(); + } else { + _videoStore.handleVideoTap(); + } + } + }, + child: Observer( + builder: (_) { + if (_videoStore.paused || _videoStore.streamInfo == null) return videoOverlay; + + return AnimatedOpacity( + opacity: _videoStore.overlayVisible ? 1.0 : 0.0, + duration: const Duration(milliseconds: 200), + child: ColoredBox( + color: Colors.black.withOpacity(settingsStore.overlayOpacity), + child: IgnorePointer( + ignoring: !_videoStore.overlayVisible, + child: videoOverlay, + ), + ), + ); + }, + ), + ); + + final video = Observer( + builder: (context) { + if (!_videoStore.settingsStore.showOverlay) return player; + + return Stack( + children: [ + player, + overlay, + ], + ); + }, + ); + + final chat = Chat( + key: _chatKey, + chatStore: _chatStore, + ); + + final videoChat = Scaffold( + body: OrientationBuilder( + builder: (context, orientation) { + if (orientation == Orientation.landscape) { + SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky); + + return Observer( + builder: (context) { + final landscapeChat = AnimatedContainer( + duration: const Duration(milliseconds: 200), + width: _chatStore.expandChat ? MediaQuery.of(context).size.width / 2 : MediaQuery.of(context).size.width * _chatStore.settings.chatWidth, + curve: Curves.ease, + color: _chatStore.settings.fullScreen + ? Colors.black.withOpacity(_chatStore.settings.fullScreenChatOverlayOpacity) + : Theme.of(context).scaffoldBackgroundColor, + child: chat, + ); + + final overlayChat = Visibility( + visible: settingsStore.fullScreenChatOverlay, + maintainState: true, + child: Theme( + data: darkTheme, + child: DefaultTextStyle( + style: DefaultTextStyle.of(context).style.copyWith(color: Colors.white), + child: landscapeChat, + ), + ), + ); + + return ColoredBox( + color: settingsStore.showVideo ? Colors.black : Theme.of(context).scaffoldBackgroundColor, + child: SafeArea( + bottom: false, + left: + (settingsStore.landscapeCutout == LandscapeCutoutType.both || settingsStore.landscapeCutout == LandscapeCutoutType.left) ? false : true, + right: (settingsStore.landscapeCutout == LandscapeCutoutType.both || settingsStore.landscapeCutout == LandscapeCutoutType.right) + ? false + : true, + child: settingsStore.showVideo + ? settingsStore.fullScreen + ? Stack( + children: [ + player, + if (settingsStore.showOverlay) + Row( + children: settingsStore.landscapeChatLeftSide + ? [overlayChat, Expanded(child: overlay)] + : [Expanded(child: overlay), overlayChat], + ) + ], + ) + : Row( + children: + settingsStore.landscapeChatLeftSide ? [landscapeChat, Expanded(child: video)] : [Expanded(child: video), landscapeChat], + ) + : Column( + children: [appBar, Expanded(child: chat)], + ), + ), + ); + }, + ); + } + + SystemChrome.setEnabledSystemUIMode( + SystemUiMode.manual, + overlays: SystemUiOverlay.values, + ); + return SafeArea( + child: Column( + children: [ + Observer( + builder: (_) { + if (!settingsStore.showVideo) return appBar; + + return AspectRatio(aspectRatio: 16 / 9, child: video); + }, + ), + Expanded(child: chat), + ], + ), + ); + }, + ), + ); + + // If on Android, use PiPSwitcher to enable PiP functionality. + if (Platform.isAndroid) { + return PiPSwitcher( + floating: _videoStore.floating, + childWhenEnabled: player, + childWhenDisabled: videoChat, + ); + } + + return videoChat; + } + + @override + void dispose() { + _chatStore.dispose(); + + _videoStore.dispose(); + + SystemChrome.setEnabledSystemUIMode( + SystemUiMode.manual, + overlays: SystemUiOverlay.values, + ); + + SystemChrome.setPreferredOrientations([]); + + super.dispose(); + } +} diff --git a/lib/screens/channel/chat/chat.dart b/lib/screens/channel/chat/chat.dart index d122c75a..a9535daf 100644 --- a/lib/screens/channel/chat/chat.dart +++ b/lib/screens/channel/chat/chat.dart @@ -2,9 +2,9 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; import 'package:frosty/screens/channel/chat/emote_menu/emote_menu.dart'; +import 'package:frosty/screens/channel/chat/stores/chat_store.dart'; import 'package:frosty/screens/channel/chat/widgets/chat_bottom_bar.dart'; import 'package:frosty/screens/channel/chat/widgets/chat_message.dart'; -import 'package:frosty/screens/channel/stores/chat_store.dart'; import 'package:frosty/widgets/button.dart'; import 'package:frosty/widgets/notification.dart'; diff --git a/lib/screens/channel/chat/details/chat_details.dart b/lib/screens/channel/chat/details/chat_details.dart index f177e84e..e4b08066 100644 --- a/lib/screens/channel/chat/details/chat_details.dart +++ b/lib/screens/channel/chat/details/chat_details.dart @@ -1,9 +1,9 @@ import 'package:flutter/material.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; +import 'package:frosty/screens/channel/chat/details/chat_details_store.dart'; import 'package:frosty/screens/channel/chat/details/chat_modes.dart'; import 'package:frosty/screens/channel/chat/details/chat_users_list.dart'; -import 'package:frosty/screens/channel/stores/chat_details_store.dart'; -import 'package:frosty/screens/channel/stores/chat_store.dart'; +import 'package:frosty/screens/channel/chat/stores/chat_store.dart'; import 'package:frosty/widgets/modal.dart'; class ChatDetails extends StatefulWidget { diff --git a/lib/screens/channel/stores/chat_details_store.dart b/lib/screens/channel/chat/details/chat_details_store.dart similarity index 98% rename from lib/screens/channel/stores/chat_details_store.dart rename to lib/screens/channel/chat/details/chat_details_store.dart index d00bd497..cc0a81e8 100644 --- a/lib/screens/channel/stores/chat_details_store.dart +++ b/lib/screens/channel/chat/details/chat_details_store.dart @@ -1,7 +1,7 @@ import 'dart:io'; import 'package:flutter/widgets.dart'; -import 'package:frosty/api/twitch_api.dart'; +import 'package:frosty/apis/twitch_api.dart'; import 'package:frosty/models/chatters.dart'; import 'package:frosty/models/irc.dart'; import 'package:mobx/mobx.dart'; diff --git a/lib/screens/channel/stores/chat_details_store.g.dart b/lib/screens/channel/chat/details/chat_details_store.g.dart similarity index 100% rename from lib/screens/channel/stores/chat_details_store.g.dart rename to lib/screens/channel/chat/details/chat_details_store.g.dart diff --git a/lib/screens/channel/chat/details/chat_users_list.dart b/lib/screens/channel/chat/details/chat_users_list.dart index f7ad891f..47a2d792 100644 --- a/lib/screens/channel/chat/details/chat_users_list.dart +++ b/lib/screens/channel/chat/details/chat_users_list.dart @@ -2,11 +2,11 @@ import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; -import 'package:frosty/api/twitch_api.dart'; -import 'package:frosty/core/auth/auth_store.dart'; +import 'package:frosty/apis/twitch_api.dart'; +import 'package:frosty/screens/channel/chat/details/chat_details_store.dart'; +import 'package:frosty/screens/channel/chat/stores/chat_store.dart'; import 'package:frosty/screens/channel/chat/widgets/chat_user_modal.dart'; -import 'package:frosty/screens/channel/stores/chat_details_store.dart'; -import 'package:frosty/screens/channel/stores/chat_store.dart'; +import 'package:frosty/screens/settings/stores/auth_store.dart'; import 'package:frosty/widgets/alert_message.dart'; import 'package:frosty/widgets/button.dart'; import 'package:frosty/widgets/loading_indicator.dart'; diff --git a/lib/screens/channel/chat/emote_menu/emote_menu.dart b/lib/screens/channel/chat/emote_menu/emote_menu.dart index d277dc84..3bd57a13 100644 --- a/lib/screens/channel/chat/emote_menu/emote_menu.dart +++ b/lib/screens/channel/chat/emote_menu/emote_menu.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; import 'package:frosty/screens/channel/chat/emote_menu/emote_menu_panel.dart'; import 'package:frosty/screens/channel/chat/emote_menu/recent_emotes_panel.dart'; -import 'package:frosty/screens/channel/stores/chat_store.dart'; +import 'package:frosty/screens/channel/chat/stores/chat_store.dart'; import 'package:frosty/widgets/button.dart'; class EmoteMenu extends StatefulWidget { diff --git a/lib/screens/channel/chat/emote_menu/emote_menu_panel.dart b/lib/screens/channel/chat/emote_menu/emote_menu_panel.dart index a4dd9096..2d858b2b 100644 --- a/lib/screens/channel/chat/emote_menu/emote_menu_panel.dart +++ b/lib/screens/channel/chat/emote_menu/emote_menu_panel.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:frosty/models/emotes.dart'; import 'package:frosty/screens/channel/chat/emote_menu/emote_menu_section.dart'; -import 'package:frosty/screens/channel/stores/chat_store.dart'; +import 'package:frosty/screens/channel/chat/stores/chat_store.dart'; import 'package:frosty/widgets/section_header.dart'; class EmoteMenuPanel extends StatelessWidget { diff --git a/lib/screens/channel/chat/emote_menu/emote_menu_section.dart b/lib/screens/channel/chat/emote_menu/emote_menu_section.dart index 769c2505..3938fea8 100644 --- a/lib/screens/channel/chat/emote_menu/emote_menu_section.dart +++ b/lib/screens/channel/chat/emote_menu/emote_menu_section.dart @@ -1,8 +1,8 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; -import 'package:frosty/constants/constants.dart'; +import 'package:frosty/constants.dart'; import 'package:frosty/models/emotes.dart'; -import 'package:frosty/screens/channel/stores/chat_store.dart'; +import 'package:frosty/screens/channel/chat/stores/chat_store.dart'; import 'package:frosty/screens/settings/stores/settings_store.dart'; import 'package:provider/provider.dart'; diff --git a/lib/screens/channel/chat/emote_menu/recent_emotes_panel.dart b/lib/screens/channel/chat/emote_menu/recent_emotes_panel.dart index a8dbaacc..7e2fba41 100644 --- a/lib/screens/channel/chat/emote_menu/recent_emotes_panel.dart +++ b/lib/screens/channel/chat/emote_menu/recent_emotes_panel.dart @@ -1,7 +1,7 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; -import 'package:frosty/constants/constants.dart'; -import 'package:frosty/screens/channel/stores/chat_store.dart'; +import 'package:frosty/constants.dart'; +import 'package:frosty/screens/channel/chat/stores/chat_store.dart'; import 'package:frosty/screens/settings/stores/settings_store.dart'; import 'package:frosty/widgets/alert_message.dart'; import 'package:frosty/widgets/button.dart'; diff --git a/lib/screens/channel/stores/chat_assets_store.dart b/lib/screens/channel/chat/stores/chat_assets_store.dart similarity index 97% rename from lib/screens/channel/stores/chat_assets_store.dart rename to lib/screens/channel/chat/stores/chat_assets_store.dart index 51beb37a..780542e2 100644 --- a/lib/screens/channel/stores/chat_assets_store.dart +++ b/lib/screens/channel/chat/stores/chat_assets_store.dart @@ -1,9 +1,9 @@ import 'dart:convert'; -import 'package:frosty/api/bttv_api.dart'; -import 'package:frosty/api/ffz_api.dart'; -import 'package:frosty/api/seventv_api.dart'; -import 'package:frosty/api/twitch_api.dart'; +import 'package:frosty/apis/bttv_api.dart'; +import 'package:frosty/apis/ffz_api.dart'; +import 'package:frosty/apis/seventv_api.dart'; +import 'package:frosty/apis/twitch_api.dart'; import 'package:frosty/models/badges.dart'; import 'package:frosty/models/emotes.dart'; import 'package:mobx/mobx.dart'; diff --git a/lib/screens/channel/stores/chat_assets_store.g.dart b/lib/screens/channel/chat/stores/chat_assets_store.g.dart similarity index 100% rename from lib/screens/channel/stores/chat_assets_store.g.dart rename to lib/screens/channel/chat/stores/chat_assets_store.g.dart diff --git a/lib/screens/channel/stores/chat_store.dart b/lib/screens/channel/chat/stores/chat_store.dart similarity index 98% rename from lib/screens/channel/stores/chat_store.dart rename to lib/screens/channel/chat/stores/chat_store.dart index 3bc61dc7..c68e240e 100644 --- a/lib/screens/channel/stores/chat_store.dart +++ b/lib/screens/channel/chat/stores/chat_store.dart @@ -1,13 +1,13 @@ import 'dart:async'; import 'package:flutter/material.dart'; -import 'package:frosty/constants/constants.dart'; -import 'package:frosty/core/auth/auth_store.dart'; +import 'package:frosty/constants.dart'; import 'package:frosty/models/badges.dart'; import 'package:frosty/models/emotes.dart'; import 'package:frosty/models/irc.dart'; -import 'package:frosty/screens/channel/stores/chat_assets_store.dart'; -import 'package:frosty/screens/channel/stores/chat_details_store.dart'; +import 'package:frosty/screens/channel/chat/details/chat_details_store.dart'; +import 'package:frosty/screens/channel/chat/stores/chat_assets_store.dart'; +import 'package:frosty/screens/settings/stores/auth_store.dart'; import 'package:frosty/screens/settings/stores/settings_store.dart'; import 'package:mobx/mobx.dart'; import 'package:wakelock/wakelock.dart'; diff --git a/lib/screens/channel/stores/chat_store.g.dart b/lib/screens/channel/chat/stores/chat_store.g.dart similarity index 100% rename from lib/screens/channel/stores/chat_store.g.dart rename to lib/screens/channel/chat/stores/chat_store.g.dart diff --git a/lib/screens/channel/chat/widgets/chat_bottom_bar.dart b/lib/screens/channel/chat/widgets/chat_bottom_bar.dart index f83d09ce..6e78914d 100644 --- a/lib/screens/channel/chat/widgets/chat_bottom_bar.dart +++ b/lib/screens/channel/chat/widgets/chat_bottom_bar.dart @@ -1,9 +1,9 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; -import 'package:frosty/constants/constants.dart'; +import 'package:frosty/constants.dart'; import 'package:frosty/screens/channel/chat/details/chat_details.dart'; -import 'package:frosty/screens/channel/stores/chat_store.dart'; +import 'package:frosty/screens/channel/chat/stores/chat_store.dart'; import 'package:frosty/widgets/button.dart'; class ChatBottomBar extends StatelessWidget { diff --git a/lib/screens/channel/chat/widgets/chat_message.dart b/lib/screens/channel/chat/widgets/chat_message.dart index 08f6f9f3..5ea42929 100644 --- a/lib/screens/channel/chat/widgets/chat_message.dart +++ b/lib/screens/channel/chat/widgets/chat_message.dart @@ -2,8 +2,8 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; import 'package:frosty/models/irc.dart'; +import 'package:frosty/screens/channel/chat/stores/chat_store.dart'; import 'package:frosty/screens/channel/chat/widgets/chat_user_modal.dart'; -import 'package:frosty/screens/channel/stores/chat_store.dart'; class ChatMessage extends StatelessWidget { final IRCMessage ircMessage; diff --git a/lib/screens/channel/chat/widgets/chat_user_modal.dart b/lib/screens/channel/chat/widgets/chat_user_modal.dart index aeb90605..9795cbfc 100644 --- a/lib/screens/channel/chat/widgets/chat_user_modal.dart +++ b/lib/screens/channel/chat/widgets/chat_user_modal.dart @@ -1,9 +1,9 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; -import 'package:frosty/constants/constants.dart'; +import 'package:frosty/constants.dart'; +import 'package:frosty/screens/channel/chat/stores/chat_store.dart'; import 'package:frosty/screens/channel/chat/widgets/chat_message.dart'; -import 'package:frosty/screens/channel/stores/chat_store.dart'; import 'package:frosty/widgets/alert_message.dart'; import 'package:frosty/widgets/block_report_modal.dart'; import 'package:frosty/widgets/button.dart'; diff --git a/lib/screens/channel/video/video.dart b/lib/screens/channel/video/video.dart new file mode 100644 index 00000000..137d2a04 --- /dev/null +++ b/lib/screens/channel/video/video.dart @@ -0,0 +1,28 @@ +import 'package:flutter/material.dart'; +import 'package:frosty/screens/channel/video/video_store.dart'; +import 'package:webview_flutter/webview_flutter.dart'; + +/// Creates a [WebView] widget that shows a channel's video stream. +class Video extends StatelessWidget { + final VideoStore videoStore; + + const Video({ + Key? key, + required this.videoStore, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return WebView( + backgroundColor: Colors.black, + initialUrl: videoStore.videoUrl, + javascriptMode: JavascriptMode.unrestricted, + allowsInlineMediaPlayback: true, + initialMediaPlaybackPolicy: AutoMediaPlaybackPolicy.always_allow, + onWebViewCreated: (controller) => videoStore.controller = controller, + onPageFinished: (string) => videoStore.initVideo(), + navigationDelegate: videoStore.handleNavigation, + javascriptChannels: videoStore.javascriptChannels, + ); + } +} diff --git a/lib/screens/channel/video_chat.dart b/lib/screens/channel/video/video_overlay.dart similarity index 52% rename from lib/screens/channel/video_chat.dart rename to lib/screens/channel/video/video_overlay.dart index e750aba5..acebd62b 100644 --- a/lib/screens/channel/video_chat.dart +++ b/lib/screens/channel/video/video_overlay.dart @@ -1,354 +1,22 @@ -import 'dart:async'; import 'dart:io'; -import 'package:floating/floating.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; -import 'package:frosty/api/bttv_api.dart'; -import 'package:frosty/api/ffz_api.dart'; -import 'package:frosty/api/seventv_api.dart'; -import 'package:frosty/api/twitch_api.dart'; -import 'package:frosty/constants/constants.dart'; -import 'package:frosty/core/auth/auth_store.dart'; +import 'package:frosty/constants.dart'; import 'package:frosty/main.dart'; -import 'package:frosty/screens/channel/chat/chat.dart'; -import 'package:frosty/screens/channel/stores/chat_assets_store.dart'; -import 'package:frosty/screens/channel/stores/chat_details_store.dart'; -import 'package:frosty/screens/channel/stores/chat_store.dart'; -import 'package:frosty/screens/channel/stores/video_store.dart'; -import 'package:frosty/screens/settings/settings.dart'; -import 'package:frosty/screens/settings/stores/settings_store.dart'; +import 'package:frosty/screens/channel/video/video_store.dart'; import 'package:frosty/widgets/button.dart'; import 'package:frosty/widgets/dialog.dart'; -import 'package:frosty/widgets/modal.dart'; import 'package:frosty/widgets/profile_picture.dart'; import 'package:intl/intl.dart'; -import 'package:provider/provider.dart'; -import 'package:webview_flutter/webview_flutter.dart'; -/// Creates a widget that shows the video stream (if live) and chat of the given user. -class VideoChat extends StatefulWidget { - final String userId; - final String userName; - final String userLogin; - - const VideoChat({ - Key? key, - required this.userId, - required this.userName, - required this.userLogin, - }) : super(key: key); - - @override - State createState() => _VideoChatState(); -} - -class _VideoChatState extends State { - final _videoKey = GlobalKey(); - final _chatKey = GlobalKey(); - - late final ChatStore _chatStore = ChatStore( - channelName: widget.userLogin, - channelId: widget.userId, - displayName: widget.userName, - auth: context.read(), - settings: context.read(), - chatDetailsStore: ChatDetailsStore( - twitchApi: context.read(), - channelName: widget.userLogin, - ), - assetsStore: ChatAssetsStore( - twitchApi: context.read(), - ffzApi: context.read(), - bttvApi: context.read(), - sevenTVApi: context.read(), - ), - ); - - late final VideoStore _videoStore = VideoStore( - userLogin: widget.userLogin, - twitchApi: context.read(), - authStore: context.read(), - settingsStore: context.read(), - ); - - @override - Widget build(BuildContext context) { - final settingsStore = _chatStore.settings; - - void showSettings() { - showModalBottomSheet( - backgroundColor: Colors.transparent, - context: context, - builder: (context) => FrostyModal( - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - ListTile( - leading: const Icon(Icons.app_settings_alt), - title: const Text('App settings'), - onTap: () => showModalBottomSheet( - backgroundColor: Colors.transparent, - isScrollControlled: true, - context: context, - builder: (context) => FrostyModal( - child: SizedBox( - height: MediaQuery.of(context).size.height * 0.8, - child: Settings(settingsStore: settingsStore), - ), - ), - ), - ), - ListTile( - leading: const Icon(Icons.refresh), - title: const Text('Reconnect to chat'), - onTap: () { - _chatStore.updateNotification('Reconnecting to chat...'); - - _chatStore.connectToChat(); - }, - ), - ListTile( - leading: const Icon(Icons.refresh), - title: const Text('Refresh badges and emotes'), - onTap: () async { - await _chatStore.getAssets(); - - _chatStore.updateNotification('Badges and emotes refreshed'); - }, - ), - ], - ), - ), - ); - } - - final appBar = AppBar( - title: Text( - regexEnglish.hasMatch(_chatStore.displayName) ? _chatStore.displayName : '${_chatStore.displayName} (${_chatStore.channelName})', - style: const TextStyle(fontSize: 20), - ), - actions: [ - IconButton( - tooltip: 'Settings', - icon: const Icon(Icons.settings), - onPressed: showSettings, - ), - ], - ); - - final player = GestureDetector( - onLongPress: _videoStore.handleToggleOverlay, - child: _Video( - key: _videoKey, - videoStore: _videoStore, - ), - ); - - final videoOverlay = _VideoOverlay( - videoStore: _videoStore, - onSettingsPressed: showSettings, - ); - - final overlay = GestureDetector( - onLongPress: _videoStore.handleToggleOverlay, - onDoubleTap: MediaQuery.of(context).orientation == Orientation.landscape ? () => settingsStore.fullScreen = !settingsStore.fullScreen : null, - onTap: () { - if (_chatStore.assetsStore.showEmoteMenu) { - _chatStore.assetsStore.showEmoteMenu = false; - } else { - if (_chatStore.textFieldFocusNode.hasFocus) { - _chatStore.textFieldFocusNode.unfocus(); - } else { - _videoStore.handleVideoTap(); - } - } - }, - child: Observer( - builder: (_) { - if (_videoStore.paused || _videoStore.streamInfo == null) return videoOverlay; - - return AnimatedOpacity( - opacity: _videoStore.overlayVisible ? 1.0 : 0.0, - duration: const Duration(milliseconds: 200), - child: ColoredBox( - color: Colors.black.withOpacity(settingsStore.overlayOpacity), - child: IgnorePointer( - ignoring: !_videoStore.overlayVisible, - child: videoOverlay, - ), - ), - ); - }, - ), - ); - - final video = Observer( - builder: (context) { - if (!_videoStore.settingsStore.showOverlay) return player; - - return Stack( - children: [ - player, - overlay, - ], - ); - }, - ); - - final chat = Chat( - key: _chatKey, - chatStore: _chatStore, - ); - - final videoChat = Scaffold( - body: OrientationBuilder( - builder: (context, orientation) { - if (orientation == Orientation.landscape) { - SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky); - - return Observer( - builder: (context) { - final landscapeChat = AnimatedContainer( - duration: const Duration(milliseconds: 200), - width: _chatStore.expandChat ? MediaQuery.of(context).size.width / 2 : MediaQuery.of(context).size.width * _chatStore.settings.chatWidth, - curve: Curves.ease, - color: _chatStore.settings.fullScreen - ? Colors.black.withOpacity(_chatStore.settings.fullScreenChatOverlayOpacity) - : Theme.of(context).scaffoldBackgroundColor, - child: chat, - ); - - final overlayChat = Visibility( - visible: settingsStore.fullScreenChatOverlay, - maintainState: true, - child: Theme( - data: darkTheme, - child: DefaultTextStyle( - style: DefaultTextStyle.of(context).style.copyWith(color: Colors.white), - child: landscapeChat, - ), - ), - ); - - return ColoredBox( - color: settingsStore.showVideo ? Colors.black : Theme.of(context).scaffoldBackgroundColor, - child: SafeArea( - bottom: false, - left: - (settingsStore.landscapeCutout == LandscapeCutoutType.both || settingsStore.landscapeCutout == LandscapeCutoutType.left) ? false : true, - right: (settingsStore.landscapeCutout == LandscapeCutoutType.both || settingsStore.landscapeCutout == LandscapeCutoutType.right) - ? false - : true, - child: settingsStore.showVideo - ? settingsStore.fullScreen - ? Stack( - children: [ - player, - if (settingsStore.showOverlay) - Row( - children: settingsStore.landscapeChatLeftSide - ? [overlayChat, Expanded(child: overlay)] - : [Expanded(child: overlay), overlayChat], - ) - ], - ) - : Row( - children: - settingsStore.landscapeChatLeftSide ? [landscapeChat, Expanded(child: video)] : [Expanded(child: video), landscapeChat], - ) - : Column( - children: [appBar, Expanded(child: chat)], - ), - ), - ); - }, - ); - } - - SystemChrome.setEnabledSystemUIMode( - SystemUiMode.manual, - overlays: SystemUiOverlay.values, - ); - return SafeArea( - child: Column( - children: [ - Observer( - builder: (_) { - if (!settingsStore.showVideo) return appBar; - - return AspectRatio(aspectRatio: 16 / 9, child: video); - }, - ), - Expanded(child: chat), - ], - ), - ); - }, - ), - ); - - // If on Android, use PiPSwitcher to enable PiP functionality. - if (Platform.isAndroid) { - return PiPSwitcher( - floating: _videoStore.floating, - childWhenEnabled: player, - childWhenDisabled: videoChat, - ); - } - - return videoChat; - } - - @override - void dispose() { - _chatStore.dispose(); - - _videoStore.dispose(); - - SystemChrome.setEnabledSystemUIMode( - SystemUiMode.manual, - overlays: SystemUiOverlay.values, - ); - - SystemChrome.setPreferredOrientations([]); - - super.dispose(); - } -} - -/// Creates a [WebView] widget that shows a channel's video stream. -class _Video extends StatelessWidget { - final VideoStore videoStore; - - const _Video({ - Key? key, - required this.videoStore, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - return WebView( - backgroundColor: Colors.black, - initialUrl: videoStore.videoUrl, - javascriptMode: JavascriptMode.unrestricted, - allowsInlineMediaPlayback: true, - initialMediaPlaybackPolicy: AutoMediaPlaybackPolicy.always_allow, - onWebViewCreated: (controller) => videoStore.controller = controller, - onPageFinished: (string) => videoStore.initVideo(), - navigationDelegate: videoStore.handleNavigation, - javascriptChannels: videoStore.javascriptChannels, - ); - } -} - -/// Creates a widget containing controls which enable interactions with an underlying [_Video] widget. -class _VideoOverlay extends StatelessWidget { +/// Creates a widget containing controls which enable interactions with an underlying [Video] widget. +class VideoOverlay extends StatelessWidget { final VideoStore videoStore; final void Function() onSettingsPressed; - const _VideoOverlay({ + const VideoOverlay({ Key? key, required this.videoStore, required this.onSettingsPressed, diff --git a/lib/screens/channel/stores/video_store.dart b/lib/screens/channel/video/video_store.dart similarity index 98% rename from lib/screens/channel/stores/video_store.dart rename to lib/screens/channel/video/video_store.dart index f011d53e..4f216cff 100644 --- a/lib/screens/channel/stores/video_store.dart +++ b/lib/screens/channel/video/video_store.dart @@ -5,9 +5,9 @@ import 'package:device_info_plus/device_info_plus.dart'; import 'package:floating/floating.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; -import 'package:frosty/api/twitch_api.dart'; -import 'package:frosty/core/auth/auth_store.dart'; +import 'package:frosty/apis/twitch_api.dart'; import 'package:frosty/models/stream.dart'; +import 'package:frosty/screens/settings/stores/auth_store.dart'; import 'package:frosty/screens/settings/stores/settings_store.dart'; import 'package:mobx/mobx.dart'; import 'package:webview_flutter/webview_flutter.dart'; diff --git a/lib/screens/channel/stores/video_store.g.dart b/lib/screens/channel/video/video_store.g.dart similarity index 100% rename from lib/screens/channel/stores/video_store.g.dart rename to lib/screens/channel/video/video_store.g.dart diff --git a/lib/screens/home/home.dart b/lib/screens/home/home.dart index 80524c19..5d8eb818 100644 --- a/lib/screens/home/home.dart +++ b/lib/screens/home/home.dart @@ -1,12 +1,12 @@ import 'package:flutter/material.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; -import 'package:frosty/core/auth/auth_store.dart'; +import 'package:frosty/screens/home/home_store.dart'; import 'package:frosty/screens/home/search/search.dart'; -import 'package:frosty/screens/home/stores/home_store.dart'; -import 'package:frosty/screens/home/stores/list_store.dart'; -import 'package:frosty/screens/home/top/top_section.dart'; -import 'package:frosty/screens/home/widgets/streams_list.dart'; +import 'package:frosty/screens/home/stream_list/stream_list_store.dart'; +import 'package:frosty/screens/home/stream_list/streams_list.dart'; +import 'package:frosty/screens/home/top/top.dart'; import 'package:frosty/screens/settings/settings.dart'; +import 'package:frosty/screens/settings/stores/auth_store.dart'; import 'package:frosty/screens/settings/stores/settings_store.dart'; import 'package:frosty/widgets/button.dart'; import 'package:frosty/widgets/dialog.dart'; diff --git a/lib/screens/home/stores/home_store.dart b/lib/screens/home/home_store.dart similarity index 98% rename from lib/screens/home/stores/home_store.dart rename to lib/screens/home/home_store.dart index 16e1a4cc..f07acce0 100644 --- a/lib/screens/home/stores/home_store.dart +++ b/lib/screens/home/home_store.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; -import 'package:frosty/core/auth/auth_store.dart'; +import 'package:frosty/screens/settings/stores/auth_store.dart'; import 'package:mobx/mobx.dart'; part 'home_store.g.dart'; diff --git a/lib/screens/home/stores/home_store.g.dart b/lib/screens/home/home_store.g.dart similarity index 100% rename from lib/screens/home/stores/home_store.g.dart rename to lib/screens/home/home_store.g.dart diff --git a/lib/screens/home/search/search.dart b/lib/screens/home/search/search.dart index e5b073c2..5b2ff8bd 100644 --- a/lib/screens/home/search/search.dart +++ b/lib/screens/home/search/search.dart @@ -1,11 +1,11 @@ import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; -import 'package:frosty/api/twitch_api.dart'; -import 'package:frosty/core/auth/auth_store.dart'; +import 'package:frosty/apis/twitch_api.dart'; import 'package:frosty/screens/home/search/search_results_categories.dart'; import 'package:frosty/screens/home/search/search_results_channels.dart'; -import 'package:frosty/screens/home/stores/search_store.dart'; +import 'package:frosty/screens/home/search/search_store.dart'; +import 'package:frosty/screens/settings/stores/auth_store.dart'; import 'package:frosty/widgets/alert_message.dart'; import 'package:frosty/widgets/section_header.dart'; import 'package:provider/provider.dart'; diff --git a/lib/screens/home/search/search_results_categories.dart b/lib/screens/home/search/search_results_categories.dart index 68bfe44d..b976ec12 100644 --- a/lib/screens/home/search/search_results_categories.dart +++ b/lib/screens/home/search/search_results_categories.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; import 'package:frosty/models/category.dart'; -import 'package:frosty/screens/home/stores/search_store.dart'; -import 'package:frosty/screens/home/widgets/category_card.dart'; +import 'package:frosty/screens/home/search/search_store.dart'; +import 'package:frosty/screens/home/top/categories/category_card.dart'; import 'package:frosty/widgets/alert_message.dart'; import 'package:frosty/widgets/loading_indicator.dart'; import 'package:mobx/mobx.dart'; diff --git a/lib/screens/home/search/search_results_channels.dart b/lib/screens/home/search/search_results_channels.dart index 87f0cff4..b0951fc3 100644 --- a/lib/screens/home/search/search_results_channels.dart +++ b/lib/screens/home/search/search_results_channels.dart @@ -1,10 +1,10 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; -import 'package:frosty/constants/constants.dart'; +import 'package:frosty/constants.dart'; import 'package:frosty/models/channel.dart'; -import 'package:frosty/screens/channel/video_chat.dart'; -import 'package:frosty/screens/home/stores/search_store.dart'; +import 'package:frosty/screens/channel/channel.dart'; +import 'package:frosty/screens/home/search/search_store.dart'; import 'package:frosty/widgets/alert_message.dart'; import 'package:frosty/widgets/animate_scale.dart'; import 'package:frosty/widgets/block_report_modal.dart'; diff --git a/lib/screens/home/stores/search_store.dart b/lib/screens/home/search/search_store.dart similarity index 96% rename from lib/screens/home/stores/search_store.dart rename to lib/screens/home/search/search_store.dart index 5856d27f..00370e76 100644 --- a/lib/screens/home/stores/search_store.dart +++ b/lib/screens/home/search/search_store.dart @@ -1,8 +1,8 @@ import 'package:flutter/widgets.dart'; -import 'package:frosty/api/twitch_api.dart'; -import 'package:frosty/core/auth/auth_store.dart'; +import 'package:frosty/apis/twitch_api.dart'; import 'package:frosty/models/category.dart'; import 'package:frosty/models/channel.dart'; +import 'package:frosty/screens/settings/stores/auth_store.dart'; import 'package:mobx/mobx.dart'; import 'package:shared_preferences/shared_preferences.dart'; diff --git a/lib/screens/home/stores/search_store.g.dart b/lib/screens/home/search/search_store.g.dart similarity index 100% rename from lib/screens/home/stores/search_store.g.dart rename to lib/screens/home/search/search_store.g.dart diff --git a/lib/screens/home/widgets/stream_card.dart b/lib/screens/home/stream_list/stream_card.dart similarity index 97% rename from lib/screens/home/widgets/stream_card.dart rename to lib/screens/home/stream_list/stream_card.dart index 28380a7d..1040f75a 100644 --- a/lib/screens/home/widgets/stream_card.dart +++ b/lib/screens/home/stream_list/stream_card.dart @@ -3,11 +3,11 @@ import 'dart:math'; import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:frosty/constants/constants.dart'; -import 'package:frosty/core/auth/auth_store.dart'; +import 'package:frosty/constants.dart'; import 'package:frosty/models/stream.dart'; -import 'package:frosty/screens/channel/video_chat.dart'; -import 'package:frosty/screens/home/top/category_streams.dart'; +import 'package:frosty/screens/channel/channel.dart'; +import 'package:frosty/screens/home/top/categories/category_streams.dart'; +import 'package:frosty/screens/settings/stores/auth_store.dart'; import 'package:frosty/widgets/animate_scale.dart'; import 'package:frosty/widgets/block_report_modal.dart'; import 'package:frosty/widgets/loading_indicator.dart'; diff --git a/lib/screens/home/stores/list_store.dart b/lib/screens/home/stream_list/stream_list_store.dart similarity index 96% rename from lib/screens/home/stores/list_store.dart rename to lib/screens/home/stream_list/stream_list_store.dart index 12aacff8..c742c0c5 100644 --- a/lib/screens/home/stores/list_store.dart +++ b/lib/screens/home/stream_list/stream_list_store.dart @@ -1,12 +1,12 @@ import 'dart:io'; import 'package:flutter/widgets.dart'; -import 'package:frosty/api/twitch_api.dart'; -import 'package:frosty/core/auth/auth_store.dart'; +import 'package:frosty/apis/twitch_api.dart'; import 'package:frosty/models/stream.dart'; +import 'package:frosty/screens/settings/stores/auth_store.dart'; import 'package:mobx/mobx.dart'; -part 'list_store.g.dart'; +part 'stream_list_store.g.dart'; class ListStore = ListStoreBase with _$ListStore; diff --git a/lib/screens/home/stores/list_store.g.dart b/lib/screens/home/stream_list/stream_list_store.g.dart similarity index 98% rename from lib/screens/home/stores/list_store.g.dart rename to lib/screens/home/stream_list/stream_list_store.g.dart index cf486ad0..91e08af9 100644 --- a/lib/screens/home/stores/list_store.g.dart +++ b/lib/screens/home/stream_list/stream_list_store.g.dart @@ -1,6 +1,6 @@ // GENERATED CODE - DO NOT MODIFY BY HAND -part of 'list_store.dart'; +part of 'stream_list_store.dart'; // ************************************************************************** // StoreGenerator diff --git a/lib/screens/home/widgets/streams_list.dart b/lib/screens/home/stream_list/streams_list.dart similarity index 93% rename from lib/screens/home/widgets/streams_list.dart rename to lib/screens/home/stream_list/streams_list.dart index e9200eb3..f4781809 100644 --- a/lib/screens/home/widgets/streams_list.dart +++ b/lib/screens/home/stream_list/streams_list.dart @@ -1,10 +1,10 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; -import 'package:frosty/api/twitch_api.dart'; -import 'package:frosty/core/auth/auth_store.dart'; -import 'package:frosty/screens/home/stores/list_store.dart'; -import 'package:frosty/screens/home/widgets/stream_card.dart'; +import 'package:frosty/apis/twitch_api.dart'; +import 'package:frosty/screens/home/stream_list/stream_card.dart'; +import 'package:frosty/screens/home/stream_list/stream_list_store.dart'; +import 'package:frosty/screens/settings/stores/auth_store.dart'; import 'package:frosty/screens/settings/stores/settings_store.dart'; import 'package:frosty/widgets/alert_message.dart'; import 'package:frosty/widgets/loading_indicator.dart'; diff --git a/lib/screens/home/top/categories.dart b/lib/screens/home/top/categories/categories.dart similarity index 92% rename from lib/screens/home/top/categories.dart rename to lib/screens/home/top/categories/categories.dart index ca6da422..9b002fc8 100644 --- a/lib/screens/home/top/categories.dart +++ b/lib/screens/home/top/categories/categories.dart @@ -1,10 +1,10 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; -import 'package:frosty/api/twitch_api.dart'; -import 'package:frosty/core/auth/auth_store.dart'; -import 'package:frosty/screens/home/stores/categories_store.dart'; -import 'package:frosty/screens/home/widgets/category_card.dart'; +import 'package:frosty/apis/twitch_api.dart'; +import 'package:frosty/screens/home/top/categories/categories_store.dart'; +import 'package:frosty/screens/home/top/categories/category_card.dart'; +import 'package:frosty/screens/settings/stores/auth_store.dart'; import 'package:frosty/widgets/alert_message.dart'; import 'package:frosty/widgets/loading_indicator.dart'; import 'package:provider/provider.dart'; diff --git a/lib/screens/home/stores/categories_store.dart b/lib/screens/home/top/categories/categories_store.dart similarity index 94% rename from lib/screens/home/stores/categories_store.dart rename to lib/screens/home/top/categories/categories_store.dart index 8125c11b..41cc5a80 100644 --- a/lib/screens/home/stores/categories_store.dart +++ b/lib/screens/home/top/categories/categories_store.dart @@ -1,8 +1,8 @@ import 'dart:io'; -import 'package:frosty/api/twitch_api.dart'; -import 'package:frosty/core/auth/auth_store.dart'; +import 'package:frosty/apis/twitch_api.dart'; import 'package:frosty/models/category.dart'; +import 'package:frosty/screens/settings/stores/auth_store.dart'; import 'package:mobx/mobx.dart'; part 'categories_store.g.dart'; diff --git a/lib/screens/home/stores/categories_store.g.dart b/lib/screens/home/top/categories/categories_store.g.dart similarity index 100% rename from lib/screens/home/stores/categories_store.g.dart rename to lib/screens/home/top/categories/categories_store.g.dart diff --git a/lib/screens/home/widgets/category_card.dart b/lib/screens/home/top/categories/category_card.dart similarity index 96% rename from lib/screens/home/widgets/category_card.dart rename to lib/screens/home/top/categories/category_card.dart index c5bce054..e0abb2b2 100644 --- a/lib/screens/home/widgets/category_card.dart +++ b/lib/screens/home/top/categories/category_card.dart @@ -1,7 +1,7 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import 'package:frosty/models/category.dart'; -import 'package:frosty/screens/home/top/category_streams.dart'; +import 'package:frosty/screens/home/top/categories/category_streams.dart'; import 'package:frosty/widgets/animate_scale.dart'; import 'package:frosty/widgets/loading_indicator.dart'; diff --git a/lib/screens/home/top/category_streams.dart b/lib/screens/home/top/categories/category_streams.dart similarity index 96% rename from lib/screens/home/top/category_streams.dart rename to lib/screens/home/top/categories/category_streams.dart index 0d652bc4..a6a91353 100644 --- a/lib/screens/home/top/category_streams.dart +++ b/lib/screens/home/top/categories/category_streams.dart @@ -2,11 +2,11 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; -import 'package:frosty/api/twitch_api.dart'; -import 'package:frosty/core/auth/auth_store.dart'; +import 'package:frosty/apis/twitch_api.dart'; import 'package:frosty/models/category.dart'; -import 'package:frosty/screens/home/stores/list_store.dart'; -import 'package:frosty/screens/home/widgets/stream_card.dart'; +import 'package:frosty/screens/home/stream_list/stream_card.dart'; +import 'package:frosty/screens/home/stream_list/stream_list_store.dart'; +import 'package:frosty/screens/settings/stores/auth_store.dart'; import 'package:frosty/screens/settings/stores/settings_store.dart'; import 'package:frosty/widgets/alert_message.dart'; import 'package:frosty/widgets/loading_indicator.dart'; diff --git a/lib/screens/home/top/top_section.dart b/lib/screens/home/top/top.dart similarity index 86% rename from lib/screens/home/top/top_section.dart rename to lib/screens/home/top/top.dart index 08b2f0e8..0ea965cb 100644 --- a/lib/screens/home/top/top_section.dart +++ b/lib/screens/home/top/top.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; -import 'package:frosty/screens/home/stores/home_store.dart'; -import 'package:frosty/screens/home/stores/list_store.dart'; -import 'package:frosty/screens/home/top/categories.dart'; -import 'package:frosty/screens/home/widgets/streams_list.dart'; +import 'package:frosty/screens/home/home_store.dart'; +import 'package:frosty/screens/home/stream_list/stream_list_store.dart'; +import 'package:frosty/screens/home/stream_list/streams_list.dart'; +import 'package:frosty/screens/home/top/categories/categories.dart'; class TopSection extends StatefulWidget { final HomeStore homeStore; diff --git a/lib/screens/settings/sections/account_settings.dart b/lib/screens/settings/account_settings.dart similarity index 98% rename from lib/screens/settings/sections/account_settings.dart rename to lib/screens/settings/account_settings.dart index 5dbed676..cea6a80b 100644 --- a/lib/screens/settings/sections/account_settings.dart +++ b/lib/screens/settings/account_settings.dart @@ -2,8 +2,8 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; -import 'package:frosty/constants/constants.dart'; -import 'package:frosty/core/auth/auth_store.dart'; +import 'package:frosty/constants.dart'; +import 'package:frosty/screens/settings/stores/auth_store.dart'; import 'package:frosty/screens/settings/stores/settings_store.dart'; import 'package:frosty/widgets/alert_message.dart'; import 'package:frosty/widgets/block_button.dart'; diff --git a/lib/screens/settings/sections/chat_settings.dart b/lib/screens/settings/chat_settings.dart similarity index 99% rename from lib/screens/settings/sections/chat_settings.dart rename to lib/screens/settings/chat_settings.dart index 905f32b2..8f9719a0 100644 --- a/lib/screens/settings/sections/chat_settings.dart +++ b/lib/screens/settings/chat_settings.dart @@ -3,7 +3,7 @@ import 'dart:io'; import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; -import 'package:frosty/constants/constants.dart'; +import 'package:frosty/constants.dart'; import 'package:frosty/screens/settings/stores/settings_store.dart'; import 'package:frosty/widgets/section_header.dart'; diff --git a/lib/screens/settings/sections/general_settings.dart b/lib/screens/settings/general_settings.dart similarity index 100% rename from lib/screens/settings/sections/general_settings.dart rename to lib/screens/settings/general_settings.dart diff --git a/lib/screens/settings/sections/other_settings.dart b/lib/screens/settings/other_settings.dart similarity index 99% rename from lib/screens/settings/sections/other_settings.dart rename to lib/screens/settings/other_settings.dart index ccb63d5c..b6e2bbb6 100644 --- a/lib/screens/settings/sections/other_settings.dart +++ b/lib/screens/settings/other_settings.dart @@ -3,7 +3,7 @@ import 'package:flutter/services.dart'; import 'package:flutter_cache_manager/flutter_cache_manager.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:frosty/constants/constants.dart'; +import 'package:frosty/constants.dart'; import 'package:frosty/screens/settings/stores/settings_store.dart'; import 'package:frosty/widgets/alert_message.dart'; import 'package:frosty/widgets/button.dart'; diff --git a/lib/screens/settings/settings.dart b/lib/screens/settings/settings.dart index 7b0675a2..5868e9bb 100644 --- a/lib/screens/settings/settings.dart +++ b/lib/screens/settings/settings.dart @@ -2,13 +2,13 @@ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:frosty/core/auth/auth_store.dart'; -import 'package:frosty/screens/settings/sections/account_settings.dart'; -import 'package:frosty/screens/settings/sections/chat_settings.dart'; -import 'package:frosty/screens/settings/sections/general_settings.dart'; -import 'package:frosty/screens/settings/sections/other_settings.dart'; -import 'package:frosty/screens/settings/sections/video_settings.dart'; +import 'package:frosty/screens/settings/account_settings.dart'; +import 'package:frosty/screens/settings/chat_settings.dart'; +import 'package:frosty/screens/settings/general_settings.dart'; +import 'package:frosty/screens/settings/other_settings.dart'; +import 'package:frosty/screens/settings/stores/auth_store.dart'; import 'package:frosty/screens/settings/stores/settings_store.dart'; +import 'package:frosty/screens/settings/video_settings.dart'; import 'package:provider/provider.dart'; import 'package:url_launcher/url_launcher.dart'; diff --git a/lib/core/auth/auth_store.dart b/lib/screens/settings/stores/auth_store.dart similarity index 97% rename from lib/core/auth/auth_store.dart rename to lib/screens/settings/stores/auth_store.dart index 69389218..bb43d2d9 100644 --- a/lib/core/auth/auth_store.dart +++ b/lib/screens/settings/stores/auth_store.dart @@ -2,10 +2,10 @@ import 'dart:async'; import 'package:flutter/foundation.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; -import 'package:frosty/api/twitch_api.dart'; -import 'package:frosty/constants/constants.dart'; -import 'package:frosty/core/user/user_store.dart'; +import 'package:frosty/apis/twitch_api.dart'; +import 'package:frosty/constants.dart'; import 'package:frosty/main.dart'; +import 'package:frosty/screens/settings/stores/user_store.dart'; import 'package:mobx/mobx.dart'; import 'package:sentry_flutter/sentry_flutter.dart'; import 'package:webview_flutter/webview_flutter.dart'; diff --git a/lib/core/auth/auth_store.g.dart b/lib/screens/settings/stores/auth_store.g.dart similarity index 100% rename from lib/core/auth/auth_store.g.dart rename to lib/screens/settings/stores/auth_store.g.dart diff --git a/lib/core/user/user_store.dart b/lib/screens/settings/stores/user_store.dart similarity index 97% rename from lib/core/user/user_store.dart rename to lib/screens/settings/stores/user_store.dart index b4dcc375..f2cb084b 100644 --- a/lib/core/user/user_store.dart +++ b/lib/screens/settings/stores/user_store.dart @@ -1,4 +1,4 @@ -import 'package:frosty/api/twitch_api.dart'; +import 'package:frosty/apis/twitch_api.dart'; import 'package:frosty/models/user.dart'; import 'package:mobx/mobx.dart'; diff --git a/lib/core/user/user_store.g.dart b/lib/screens/settings/stores/user_store.g.dart similarity index 100% rename from lib/core/user/user_store.g.dart rename to lib/screens/settings/stores/user_store.g.dart diff --git a/lib/screens/settings/sections/video_settings.dart b/lib/screens/settings/video_settings.dart similarity index 100% rename from lib/screens/settings/sections/video_settings.dart rename to lib/screens/settings/video_settings.dart diff --git a/lib/widgets/alert_message.dart b/lib/widgets/alert_message.dart index 613ed9c2..b7c88d51 100644 --- a/lib/widgets/alert_message.dart +++ b/lib/widgets/alert_message.dart @@ -9,7 +9,7 @@ class AlertMessage extends StatelessWidget { const AlertMessage({ Key? key, required this.message, - final this.icon = Icons.info, + this.icon = Icons.info, this.color, }) : super(key: key); diff --git a/lib/widgets/block_button.dart b/lib/widgets/block_button.dart index ceb1035b..471b2339 100644 --- a/lib/widgets/block_button.dart +++ b/lib/widgets/block_button.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; -import 'package:frosty/core/auth/auth_store.dart'; +import 'package:frosty/screens/settings/stores/auth_store.dart'; import 'package:frosty/widgets/button.dart'; import 'package:frosty/widgets/dialog.dart'; diff --git a/lib/widgets/block_report_modal.dart b/lib/widgets/block_report_modal.dart index 8a9267e3..e62cf9b8 100644 --- a/lib/widgets/block_report_modal.dart +++ b/lib/widgets/block_report_modal.dart @@ -1,7 +1,7 @@ import 'dart:io'; import 'package:flutter/material.dart'; -import 'package:frosty/core/auth/auth_store.dart'; +import 'package:frosty/screens/settings/stores/auth_store.dart'; import 'package:frosty/widgets/block_button.dart'; import 'package:frosty/widgets/modal.dart'; import 'package:frosty/widgets/report_button.dart'; diff --git a/lib/widgets/button.dart b/lib/widgets/button.dart index 31cd17cf..1a45af78 100644 --- a/lib/widgets/button.dart +++ b/lib/widgets/button.dart @@ -36,8 +36,8 @@ class _ButtonState extends State