Skip to content

Commit f8d6065

Browse files
committed
feat: better service switcher
1 parent 05a8535 commit f8d6065

19 files changed

+193
-196
lines changed

assets/svg/extensions.svg

Lines changed: 2 additions & 0 deletions
Loading

lib/Adaptor/Media/MediaLargeViewHolder.dart

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,6 @@ class MediaPageLargeViewHolder extends StatelessWidget {
5656
fit: BoxFit.cover,
5757
width: double.infinity,
5858
height: 151,
59-
placeholder: (context, url) => const SizedBox.shrink(),
60-
errorWidget: (context, url, error) => const SizedBox.shrink(),
6159
),
6260
),
6361
_buildGradientOverlay(gradientColors),
@@ -143,22 +141,23 @@ class MediaPageLargeViewHolder extends StatelessWidget {
143141

144142
Widget _buildMediaCover() {
145143
return Hero(
146-
tag: tag,
147-
child: ClipRRect(
148-
borderRadius: BorderRadius.circular(16.0),
149-
child: cachedNetworkImage(
150-
imageUrl: mediaInfo.cover ?? '',
151-
fit: BoxFit.cover,
144+
tag: tag,
145+
child: ClipRRect(
146+
borderRadius: BorderRadius.circular(16.0),
147+
child: cachedNetworkImage(
148+
imageUrl: mediaInfo.cover ?? '',
149+
fit: BoxFit.cover,
150+
width: 108,
151+
height: 160,
152+
errorWidget: (context, url, error) => const SizedBox.shrink(),
153+
placeholder: (context, url) => Container(
154+
color: Colors.white12,
152155
width: 108,
153156
height: 160,
154-
errorWidget: (context, url, error) => const SizedBox.shrink(),
155-
placeholder: (context, url) => Container(
156-
color: Colors.white12,
157-
width: 108,
158-
height: 160,
159-
),
160157
),
161-
));
158+
),
159+
),
160+
);
162161
}
163162

164163
Widget _buildAdditionalInfo(ColorScheme theme) {

lib/DataClass/Media/AnilistMedia.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ Media _mediaData(anilistApi.Media apiMedia) {
44
return Media(
55
id: apiMedia.id,
66
idAnilist: apiMedia.id,
7-
idMAL: apiMedia.idMal ??
8-
GetMediaIDs.fromID(type: AnimeIDType.anilistId, id: apiMedia.id)?.malId,
7+
idMAL: apiMedia.idMal ?? GetMediaIDs.fromID(type: AnimeIDType.anilistId, id: apiMedia.id)?.malId,
8+
idKitsu: GetMediaIDs.fromID(type: AnimeIDType.anilistId, id: apiMedia.id)?.kitsuId?.toString(),
99
name: apiMedia.title?.english,
1010
nameRomaji: apiMedia.title?.romaji ?? '',
1111
userPreferredName: apiMedia.title?.userPreferred ?? '',

lib/DataClass/Media/SimklMedia.dart

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@ Media _fromSimklAnime(simklApi.Anime apiMedia) {
55
'https://wsrv.nl/?url=https://simkl.in/posters/${apiMedia.show?.poster}_m.webp';
66
return Media(
77
id: apiMedia.show!.ids!.simkl!,
8-
idAnilist: apiMedia.show!.ids!.anilist?.toNullInt(),
9-
idSimkl: apiMedia.show!.ids!.simkl!,
10-
idKitsu: apiMedia.show!.ids!.kitsu?.toNullInt()?.toString(),
11-
idMAL: apiMedia.show!.ids!.mal?.toNullInt(),
12-
nameRomaji: apiMedia.show!.title ?? '',
13-
userPreferredName: apiMedia.show!.title ?? '',
8+
idAnilist: apiMedia.show?.ids?.anilist?.toNullInt(),
9+
idSimkl: apiMedia.show?.ids?.simkl,
10+
idKitsu: apiMedia.show?.ids?.kitsu?.toNullInt()?.toString(),
11+
idMAL: apiMedia.show?.ids?.mal?.toNullInt(),
12+
nameRomaji: apiMedia.show?.title ?? '',
13+
userPreferredName: apiMedia.show?.title ?? '',
1414
cover: cover,
1515
banner: cover,
1616
userStatus: apiMedia.status?.name,
@@ -32,10 +32,10 @@ Media _fromSimklSeries(simklApi.ShowElement apiMedia) {
3232
'https://wsrv.nl/?url=https://simkl.in/posters/${apiMedia.show?.poster}_m.webp';
3333
return Media(
3434
id: apiMedia.show!.ids!.simkl!,
35-
idAnilist: apiMedia.show!.ids!.anilist?.toNullInt(),
36-
idSimkl: apiMedia.show!.ids!.simkl!,
37-
idKitsu: apiMedia.show!.ids!.kitsu?.toNullInt()?.toString(),
38-
idMAL: apiMedia.show!.ids!.mal?.toNullInt(),
35+
idAnilist: apiMedia.show?.ids?.anilist?.toNullInt(),
36+
idSimkl: apiMedia.show?.ids?.simkl ,
37+
idKitsu: apiMedia.show?.ids?.kitsu?.toNullInt()?.toString(),
38+
idMAL: apiMedia.show?.ids?.mal?.toNullInt(),
3939
nameRomaji: apiMedia.show?.title ?? '',
4040
userPreferredName: apiMedia.show?.title ?? '',
4141
cover: cover,
@@ -59,12 +59,12 @@ Media _fromSimklMovies(simklApi.MovieElement apiMedia) {
5959
'https://wsrv.nl/?url=https://simkl.in/posters/${apiMedia.movie?.poster}_m.webp';
6060
return Media(
6161
id: apiMedia.movie!.ids!.simkl!,
62-
idAnilist: apiMedia.movie!.ids!.anilist?.toNullInt(),
63-
idSimkl: apiMedia.movie!.ids!.simkl!,
64-
idKitsu: apiMedia.movie!.ids!.kitsu?.toNullInt()?.toString(),
65-
idMAL: apiMedia.movie!.ids!.mal?.toNullInt(),
66-
nameRomaji: apiMedia.movie!.title ?? '',
67-
userPreferredName: apiMedia.movie!.title ?? '',
62+
idAnilist: apiMedia.movie?.ids?.anilist?.toNullInt(),
63+
idSimkl: apiMedia.movie?.ids?.simkl ,
64+
idKitsu: apiMedia.movie?.ids?.kitsu?.toNullInt()?.toString(),
65+
idMAL: apiMedia.movie?.ids?.mal?.toNullInt(),
66+
nameRomaji: apiMedia.movie?.title ?? '',
67+
userPreferredName: apiMedia.movie?.title ?? '',
6868
cover: cover,
6969
banner: cover,
7070
userStatus: apiMedia.status?.name,

lib/Functions/GetExtensions.dart

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ class Extensions {
7070
}
7171

7272
static Future<void> setRepo(ItemType itemType, String repo) async {
73-
73+
repo.trim();
7474
if (itemType == ItemType.manga) {
7575
mangaRepo.value = repo;
7676
saveCustomData('mangaRepo', repo);
@@ -88,6 +88,7 @@ class Extensions {
8888
.read(fetchNovelSourcesListProvider(id: null, reFresh: true).future);
8989
}
9090
}
91+
9192
static Future<void> removeRepo(ItemType itemType) async {
9293
if (itemType == ItemType.manga) {
9394
mangaRepo.value = '';
@@ -108,12 +109,12 @@ class Extensions {
108109
..setTitle('${type.name.capitalize} ${getString.source}')
109110
..setCustomView(
110111
Obx(
111-
() {
112+
() {
112113
var installedRepo = type == ItemType.anime
113114
? animeRepo.value
114115
: type == ItemType.manga
115-
? mangaRepo.value
116-
: novelRepo.value;
116+
? mangaRepo.value
117+
: novelRepo.value;
117118
return Column(
118119
mainAxisSize: MainAxisSize.min,
119120
mainAxisAlignment: MainAxisAlignment.start,
@@ -122,8 +123,7 @@ class Extensions {
122123
if (installedRepo.isNotEmpty) ...[
123124
GestureDetector(
124125
onTap: () => copyToClipboard(installedRepo),
125-
onLongPress: () =>
126-
Extensions.removeRepo(type),
126+
onLongPress: () => removeRepo(type),
127127
child: Text(
128128
installedRepo,
129129
style: TextStyle(
@@ -137,7 +137,7 @@ class Extensions {
137137
],
138138
TextField(
139139
decoration: const InputDecoration(
140-
hintText: 'Repo URL',
140+
hintText: 'Repo URL',
141141
),
142142
onChanged: (value) => text = value,
143143
),
@@ -148,10 +148,7 @@ class Extensions {
148148
)
149149
..setPositiveButton(
150150
getString.ok,
151-
() {
152-
if (text.isEmpty) return;
153-
setRepo(type, text);
154-
},
151+
() => text.isNotEmpty ? setRepo(type, text) : null,
155152
)
156153
..setNegativeButton(getString.cancel, null)
157154
..show();

lib/Screens/Anime/AnimeScreen.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import '../../Theme/Colors.dart';
1616
import '../../Theme/ThemeProvider.dart';
1717
import '../../Widgets/ScrollConfig.dart';
1818
import '../Home/Widgets/LoadingWidget.dart';
19-
import '../Home/Widgets/SearchBar.dart';
19+
import '../Home/Widgets/ServiceSwitcherBar.dart';
2020

2121
class AnimeScreen extends StatefulWidget {
2222
const AnimeScreen({super.key});
@@ -105,7 +105,7 @@ class AnimeScreenState extends State<AnimeScreen> {
105105
? MediaAdaptor(type: 1, mediaList: mediaDataList)
106106
: const Center(child: CircularProgressIndicator()),
107107
),
108-
MediaSearchBar(title: getString.anime.toUpperCase()),
108+
ServiceSwitcherBar(title: getString.anime.toUpperCase()),
109109
Positioned(
110110
bottom: 92,
111111
left: 8.0,

lib/Screens/Home/HomeScreen.dart

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import 'package:blur/blur.dart';
2-
import 'package:cached_network_image/cached_network_image.dart';
32
import 'package:dantotsu/Functions/Extensions.dart';
43
import 'package:dantotsu/Theme/LanguageSwitcher.dart';
54
import 'package:flutter/material.dart';
@@ -18,6 +17,7 @@ import '../../Theme/Colors.dart';
1817
import '../../Theme/ThemeProvider.dart';
1918
import '../../Widgets/CachedNetworkImage.dart';
2019
import '../../Widgets/CustomBottomDialog.dart';
20+
import '../../Widgets/LoadSvg.dart';
2121
import '../../Widgets/ScrollConfig.dart';
2222
import '../Home/Widgets/LoadingWidget.dart';
2323
import '../MediaList/MediaListScreen.dart';
@@ -180,7 +180,7 @@ class HomeScreenState extends State<HomeScreen> {
180180
GestureDetector(
181181
onTap: () =>
182182
showCustomBottomDialog(context, const SettingsBottomSheet()),
183-
child: const AvatarWidget(icon: Icons.settings),
183+
child: const SettingIconWidget(icon: Icons.settings),
184184
),
185185
if (data.unreadNotificationCount > 0)
186186
Positioned(
@@ -199,21 +199,24 @@ class HomeScreenState extends State<HomeScreen> {
199199
Widget _buildUserInfo(BaseServiceData data) {
200200
final theme = Theme.of(context).colorScheme;
201201
final isDarkMode = Provider.of<ThemeNotifier>(context).isDarkMode;
202-
var home = context.currentService().homeScreen!;
202+
203+
var service = context.currentService();
204+
var home = service.homeScreen!;
205+
203206
return Positioned(
204-
top: 36.statusBar(),
205-
left: 34.0,
206-
right: 16.0,
207-
child: SlideUpAnimation(
208-
child: Row(children: [
207+
top: 36.statusBar(),
208+
left: 34.0,
209+
right: 16.0,
210+
child: SlideUpAnimation(
211+
child: Row(
212+
children: [
209213
GestureDetector(
210-
onTap: () {},
211-
child: CircleAvatar(
212-
backgroundColor: Colors.transparent,
213-
radius: 26.0,
214-
backgroundImage: data.avatar.value.isNotEmpty
215-
? CachedNetworkImageProvider(data.avatar.value)
216-
: null,
214+
onTap: () => serviceSwitcher(context),
215+
child: loadSvg(
216+
service.iconPath,
217+
width: 38.0,
218+
height: 38.0,
219+
color: theme.onSurface,
217220
),
218221
),
219222
const SizedBox(width: 12),
@@ -238,8 +241,10 @@ class HomeScreenState extends State<HomeScreen> {
238241
data.chapterRead.toString(), theme.primary),
239242
],
240243
),
241-
]),
242-
));
244+
],
245+
),
246+
),
247+
);
243248
}
244249

245250
Widget _buildInfoRow(String label, String value, Color valueColor) {

lib/Screens/Home/Widgets/AvtarWidget.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import 'package:flutter/material.dart';
22

3-
class AvatarWidget extends StatelessWidget {
3+
class SettingIconWidget extends StatelessWidget {
44
final IconData icon;
55

6-
const AvatarWidget({
6+
const SettingIconWidget({
77
super.key,
88
required this.icon,
99
});

lib/Screens/Home/Widgets/LoadingWidget.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ class LoadingWidget extends StatelessWidget {
2525
right: 34,
2626
top: 36.statusBar(),
2727
child: GestureDetector(
28-
child: const AvatarWidget(icon: Icons.settings),
28+
child: const SettingIconWidget(icon: Icons.settings),
2929
onTap: () =>
3030
showCustomBottomDialog(context, const SettingsBottomSheet()),
3131
)),

lib/Screens/Home/Widgets/SearchBar.dart

Lines changed: 0 additions & 65 deletions
This file was deleted.

0 commit comments

Comments
 (0)