feat: ability to change library (#77)

* feat: add AbsIcons font and update pubspec.yaml for font integration

* feat: implement library selection in YouPage

* fix: optimize authenticatedApi provider to not rebuild unnecessarily

* feat: add LibrarySwitchChip widget and integrate it into YouPage and ScaffoldWithNavBar

* feat: enhance library selection UI with refresh functionality and error handling

* fix: change library switcher activation from long press to double tap

* feat: show current library on nav bar

* feat: refactor LibraryBrowserPage to use CustomScrollView and enhance app bar with dynamic library icon and title
This commit is contained in:
Dr.Blank 2025-04-19 19:17:31 +05:30 committed by GitHub
parent 37c44f1c6b
commit 5986482baf
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
14 changed files with 758 additions and 83 deletions

View file

@ -0,0 +1,103 @@
/// Flutter icons AbsIcons
/// Copyright (C) 2025 by original authors @ fluttericon.com, fontello.com
/// This font was generated by FlutterIcon.com, which is derived from Fontello.
///
/// To use this font, place it in your fonts/ directory and include the
/// following in your pubspec.yaml
///
/// flutter:
/// fonts:
/// - family: AbsIcons
/// fonts:
/// - asset: fonts/AbsIcons.ttf
///
///
///
library;
// ignore_for_file: constant_identifier_names
import 'package:flutter/widgets.dart' show IconData;
class AbsIcons {
AbsIcons._();
static const _kFontFam = 'AbsIcons';
static const String? _kFontPkg = null;
static const IconData audiobookshelf =
IconData(0xe900, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData microphone_2 =
IconData(0xe901, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData microphone_1 =
IconData(0xe902, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData radio =
IconData(0xe903, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData podcast =
IconData(0xe904, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData books_1 =
IconData(0xe905, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData database_2 =
IconData(0xe906, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData headphones =
IconData(0xe910, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData music =
IconData(0xe911, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData video =
IconData(0xe914, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData microphone_3 =
IconData(0xe91e, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData book =
IconData(0xe91f, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData books_2 =
IconData(0xe920, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData file_picture =
IconData(0xe927, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData database_1 =
IconData(0xe964, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData rocket =
IconData(0xe9a5, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData power =
IconData(0xe9b5, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData star =
IconData(0xe9d9, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData heart =
IconData(0xe9da, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static const IconData rss =
IconData(0xea9b, fontFamily: _kFontFam, fontPackage: _kFontPkg);
static final Map<String, IconData> _iconMap = {
'audiobookshelf': audiobookshelf,
'microphone_2': microphone_2,
'microphone_1': microphone_1,
'radio': radio,
'podcast': podcast,
'books_1': books_1,
'database_2': database_2,
'headphones': headphones,
'music': music,
'video': video,
'microphone_3': microphone_3,
'book': book,
'books_2': books_2,
'file_picture': file_picture,
'database_1': database_1,
'rocket': rocket,
'power': power,
'star': star,
'heart': heart,
'rss': rss,
};
/// Returns the IconData corresponding to the [iconName] string.
///
/// If the [iconName] is not found in the map, returns null.
/// Considers null or empty strings as invalid.
static IconData? getIconByName(String? iconName) {
if (iconName == null || iconName.isEmpty) {
return null;
}
return _iconMap[iconName.toLowerCase()];
}
static Map<String, IconData> get iconMap => _iconMap;
}

View file

@ -0,0 +1,27 @@
import 'package:flutter/material.dart';
class VaaniLogo extends StatelessWidget {
const VaaniLogo({
super.key,
this.size,
this.duration = const Duration(milliseconds: 750),
this.curve = Curves.fastOutSlowIn,
});
final double? size;
final Duration duration;
final Curve curve;
@override
Widget build(BuildContext context) {
final IconThemeData iconTheme = IconTheme.of(context);
final double? iconSize = size ?? iconTheme.size;
return AnimatedContainer(
width: iconSize,
height: iconSize,
duration: duration,
curve: curve,
child: Image.asset('assets/images/vaani_logo_foreground.png'),
);
}
}