Skip to content

Commit

Permalink
search view and search bar widget
Browse files Browse the repository at this point in the history
  • Loading branch information
PriyanshuPz committed Jun 5, 2024
1 parent 20eccd5 commit 88efb1c
Show file tree
Hide file tree
Showing 12 changed files with 179 additions and 34 deletions.
Binary file added assets/app_icon.ico
Binary file not shown.
1 change: 1 addition & 0 deletions lib/apis/song_api.dart
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ final songAPIProvider = Provider((ref) {
abstract class ISongAPI {
FutureEither<List<SongModel>> fetchInitData();
FutureEither<List<SongModel>> fetchSearchData({required String query});

FutureEither<List<SongModel>> fetchSongRecommedationData(
{required String id});
}
Expand Down
2 changes: 2 additions & 0 deletions lib/core/constants.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
class Constants {
static String serverUrl = "saavn.dev";
static String appName = "Saavn Desktop";
static String appIconPath = "assets/app_icon.ico";
}

class SharedPrefs {
Expand Down
8 changes: 8 additions & 0 deletions lib/frame/commons.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:saavn/functions/explore/views/explore_view.dart';
import 'package:saavn/functions/player/views/playlist_view.dart';
import 'package:saavn/functions/search/views/search_view.dart';
import 'package:saavn/functions/settings/views/settings_view.dart';

final appScreenConfigProvider =
Expand All @@ -27,6 +28,13 @@ enum Screens {
name: "Settings",
view: SettingsView(),
),
),

search(
AppScreen(
name: "Search Songs",
view: SearchView(),
),
);

final AppScreen screen;
Expand Down
29 changes: 29 additions & 0 deletions lib/frame/home.dart
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,17 @@ class _HomeFrameState extends ConsumerState<HomeFrame> {
.goto(screen: Screens.settings);
}

void onPressSearch() {
if (ref.watch(appScreenConfigProvider) == Screens.search) {
return ref
.watch(appScreenConfigProvider.notifier)
.goto(screen: Screens.explore);
}
return ref
.watch(appScreenConfigProvider.notifier)
.goto(screen: Screens.search);
}

@override
Widget build(BuildContext context) {
final screen = ref.watch(appScreenConfigProvider).screen;
Expand All @@ -32,6 +43,24 @@ class _HomeFrameState extends ConsumerState<HomeFrame> {
elevation: 0,
backgroundColor: Colors.transparent,
actions: [
Padding(
padding: const EdgeInsets.all(8.0),
child: IconButton(
onPressed: onPressSearch,
icon: const Stack(
children: [
Icon(Icons.search),
Positioned(
// draw a red marble
top: 0.0,
right: 0.0,
child: Icon(Icons.brightness_1,
size: 8.0, color: Colors.redAccent),
)
],
),
),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: IconButton(
Expand Down
31 changes: 31 additions & 0 deletions lib/functions/search/controllers/search_controller.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:saavn/apis/song_api.dart';
import 'package:saavn/models/song_model.dart';

final searchControllerProvider =
StateNotifierProvider<SearchController, bool>((ref) {
return SearchController(
songAPI: ref.watch(songAPIProvider),
);
});

class SearchController extends StateNotifier<bool> {
final SongAPI _songAPI;

SearchController({required SongAPI songAPI})
: _songAPI = songAPI,
super(false);

// ADD SEARCH METHODS

Future<List<SongModel>> searchSong({required String query}) async {
List<SongModel> songs = [];
final fetchedsongs = await _songAPI.fetchSearchData(query: query);

fetchedsongs.fold((l) {
throw Error.throwWithStackTrace(l.message, l.stackTrace);
}, (r) => songs = r);

return songs;
}
}
32 changes: 32 additions & 0 deletions lib/functions/search/views/search_view.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:saavn/functions/search/widgets/searchbar.dart';

class SearchView extends ConsumerStatefulWidget {
const SearchView({super.key});

@override
ConsumerState<ConsumerStatefulWidget> createState() => _SearchViewState();
}

class _SearchViewState extends ConsumerState<SearchView> {
final TextEditingController _searchController = TextEditingController();

@override
Widget build(BuildContext context) {
return Column(
children: [
BaseSearchBar(
controller: _searchController,
onChanged: (value) {},
onSubmit: (value) {},
),
const Expanded(
child: Center(
child: Text('Search results will be displayed here!'),
),
),
],
);
}
}
43 changes: 43 additions & 0 deletions lib/functions/search/widgets/searchbar.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import 'package:flutter/material.dart';

class BaseSearchBar extends StatelessWidget {
final TextEditingController controller;
final void Function(String)? onSubmit;
final void Function(String)? onChanged;

const BaseSearchBar({
super.key,
required this.controller,
required this.onSubmit,
required this.onChanged,
});

@override
Widget build(BuildContext context) {
return Container(
decoration: BoxDecoration(
border: Border.all(
width: 2,
color: Theme.of(context).primaryColorDark.withOpacity(.2),
),
borderRadius: BorderRadius.circular(25),
),
margin: const EdgeInsets.all(16),
padding: const EdgeInsets.symmetric(horizontal: 7),
child: TextField(
decoration: InputDecoration(
hintText: 'Search',
border: InputBorder.none,
contentPadding: const EdgeInsets.all(10),
suffixIcon: IconButton(
onPressed: () {},
icon: const Icon(Icons.search),
),
),
controller: controller,
onSubmitted: onSubmit,
onChanged: onChanged,
),
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ class SettingsController extends StateNotifier<bool> {
Future<SongQualityType> getSongQuality() async {
final prefs = await SharedPreferences.getInstance();
final val = prefs.getString(SharedPrefs.songQuality);
print("SETTED: $val");
if (val == null) return SongQualityType.high;
var quality = SongQualityType.values
.where((element) => element.type == val)
Expand Down
25 changes: 25 additions & 0 deletions lib/initialization.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import 'package:audio_session/audio_session.dart';
import 'package:flutter/material.dart';
import 'package:system_theme/system_theme.dart';
import 'package:window_manager/window_manager.dart';

Future<void> initialiseAppFunctions() async {
WidgetsFlutterBinding.ensureInitialized();
await SystemTheme.accentColor.load();
await initWindowManager();
final session = await AudioSession.instance;
await session.configure(const AudioSessionConfiguration.speech());
}

Future<void> initWindowManager() async {
await windowManager.ensureInitialized();

WindowOptions windowOptions = const WindowOptions(
center: true,
title: "Saavn Music Desktop",
);
windowManager.waitUntilReadyToShow(windowOptions, () async {
await windowManager.show();
await windowManager.focus();
});
}
37 changes: 6 additions & 31 deletions lib/main.dart
Original file line number Diff line number Diff line change
@@ -1,34 +1,13 @@
import 'package:audio_session/audio_session.dart';
import 'package:flutter/material.dart';
import 'package:flutter_acrylic/flutter_acrylic.dart';

import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:saavn/frame/home.dart';
import 'package:system_theme/system_theme.dart';
import 'package:window_manager/window_manager.dart';

void main() async {
WidgetsFlutterBinding.ensureInitialized();
final session = await AudioSession.instance;

await session.configure(const AudioSessionConfiguration.music());
await SystemTheme.accentColor.load();
await windowManager.ensureInitialized();

await Window.initialize();
await Window.setEffect(
effect: WindowEffect.aero,
color: Colors.black45,
dark: true,
);
import 'package:saavn/frame/home.dart';
import 'package:saavn/initialization.dart';

WindowOptions windowOptions = const WindowOptions(
center: true,
title: "Saavn Music Desktop",
);
windowManager.waitUntilReadyToShow(windowOptions, () async {
await windowManager.show();
await windowManager.focus();
});
void main() async {
await initialiseAppFunctions();
runApp(
const ProviderScope(
child: MyApp(),
Expand All @@ -49,11 +28,7 @@ class MyApp extends StatelessWidget {
useMaterial3: true,
colorSchemeSeed: SystemTheme.accentColor.accent,
),
darkTheme: ThemeData.dark(useMaterial3: true).copyWith(
scaffoldBackgroundColor: Colors.transparent,
iconTheme: IconThemeData(
color: Theme.of(context).primaryColorLight,
)),
darkTheme: ThemeData.dark(),
themeMode: ThemeMode.dark,
home: const HomeFrame(),
);
Expand Down
4 changes: 2 additions & 2 deletions pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -84,8 +84,8 @@ flutter:
uses-material-design: true

# To add assets to your application, add an assets section, like this:
# assets:
# - images/a_dot_burr.jpeg
assets:
- assets/app_icon.ico
# - images/a_dot_ham.jpeg

# An image asset can refer to one or more resolution-specific "variants", see
Expand Down

0 comments on commit 88efb1c

Please sign in to comment.