Skip to content

Commit 7567940

Browse files
committed
v0.5.0: bugfixes, searchbar in library manager
1 parent 829de97 commit 7567940

10 files changed

+125
-30
lines changed

src-tauri/Cargo.lock

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src-tauri/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "ronix"
3-
version = "0.4.0"
3+
version = "0.5.0"
44
description = "Music Player and Library Manager"
55
authors = ["Matvey Ryabchikov"]
66
edition = "2021"

src-tauri/src/library.rs

+58-11
Original file line numberDiff line numberDiff line change
@@ -183,8 +183,8 @@ pub fn get_automatic_next_songs(
183183

184184
#[derive(Serialize, Type)]
185185
struct SearchResults {
186-
artists: Vec<String>,
187-
albums: Vec<String>,
186+
artists: Option<Vec<String>>,
187+
albums: Option<Vec<String>>,
188188
songs: Vec<String>,
189189
}
190190

@@ -196,13 +196,25 @@ struct EditSongInput {
196196
artist: String,
197197
}
198198

199+
#[derive(Deserialize, Type)]
200+
enum SearchMode {
201+
Library,
202+
Songs,
203+
}
204+
205+
#[derive(Deserialize, Type)]
206+
struct SearchInput {
207+
query: String,
208+
mode: SearchMode,
209+
}
210+
199211
pub fn get_router() -> RouterBuilder<Context> {
200212
Router::<Context>::new()
201213
.query("get", |t| {
202214
t(|ctx, _input: ()| ctx.library.lock().unwrap().clone())
203215
})
204216
.query("search", |t| {
205-
t(|ctx, query: String| {
217+
t(|ctx, input: SearchInput| {
206218
let library = ctx.library.lock().unwrap();
207219
let fuse = Fuse {
208220
location: 0,
@@ -214,26 +226,61 @@ pub fn get_router() -> RouterBuilder<Context> {
214226
};
215227
let artists: Vec<String> = fuse
216228
.search_text_in_iterable(
217-
&query,
229+
&input.query,
218230
library.artists.iter().map(|(_, artist)| &artist.name),
219231
)
220232
.iter()
221233
.map(|a| library.artists.iter().nth(a.index).unwrap().0.to_string())
222234
.collect();
223235
let albums: Vec<String> = fuse
224-
.search_text_in_iterable(&query, library.albums.iter().map(|(_, album)| &album.name))
236+
.search_text_in_iterable(
237+
&input.query,
238+
library.albums.iter().map(|(_, album)| &album.name),
239+
)
225240
.iter()
226241
.map(|a| library.albums.iter().nth(a.index).unwrap().0.to_string())
227242
.collect();
228-
let songs: Vec<String> = fuse
229-
.search_text_in_iterable(&query, library.songs.iter().map(|(_, song)| &song.title))
243+
let mut songs: Vec<String> = fuse
244+
.search_text_in_iterable(
245+
&input.query,
246+
library.songs.iter().map(|(_, song)| &song.title),
247+
)
230248
.iter()
231249
.map(|a| library.songs.iter().nth(a.index).unwrap().0.to_string())
232250
.collect();
233-
SearchResults {
234-
artists,
235-
albums,
236-
songs,
251+
match input.mode {
252+
SearchMode::Library => SearchResults {
253+
artists: Some(artists),
254+
albums: Some(albums),
255+
songs: songs,
256+
},
257+
SearchMode::Songs => {
258+
songs.extend(
259+
library
260+
.songs
261+
.iter()
262+
.filter_map(|(song_id, song)| {
263+
if songs.contains(song_id) {
264+
return Some(song_id);
265+
}
266+
if albums.contains(&song.album) {
267+
return Some(song_id);
268+
}
269+
let album = library.albums.get(&song.album).unwrap();
270+
if artists.contains(&album.artist) {
271+
return Some(song_id);
272+
}
273+
return None;
274+
})
275+
.cloned()
276+
.collect::<Vec<String>>(),
277+
);
278+
SearchResults {
279+
artists: None,
280+
albums: None,
281+
songs,
282+
}
283+
}
237284
}
238285
})
239286
})

src-tauri/tauri.conf.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
},
99
"package": {
1010
"productName": "ronix",
11-
"version": "0.4.0"
11+
"version": "0.5.0"
1212
},
1313
"tauri": {
1414
"allowlist": {

src/App.tsx

+15-5
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import DownloadSongModal from './components/downloadSongModal';
1717
import Menu from './components/menu';
1818
import Button from './components/ui/button';
1919
import { config, generateCssVariables } from './config';
20-
import { currentPage, goBack, navigate } from './router';
20+
import { SearchPageData, currentPage, goBack, navigate } from './router';
2121
import AlbumList from './views/albumList';
2222
import AlbumPage from './views/albumPage';
2323
import ArtistPage from './views/artistPage';
@@ -33,10 +33,17 @@ const App: Component = () => {
3333
let searchInput: HTMLInputElement;
3434

3535
const setSearch = debounce(
36-
(data: string) =>
36+
(query: string) =>
3737
navigate({
3838
name: 'search',
39-
data,
39+
data: {
40+
query,
41+
isManager:
42+
currentPage().name === 'library Manager' ||
43+
(typeof currentPage().data === 'object' &&
44+
'isManager' in (currentPage().data as object) &&
45+
(currentPage().data as SearchPageData).isManager),
46+
},
4047
}),
4148
250,
4249
);
@@ -98,7 +105,7 @@ const App: Component = () => {
98105
</Button>
99106
</Show>
100107
<Show
101-
when={!['settings', 'library Manager'].includes(currentPage().name)}
108+
when={!['settings'].includes(currentPage().name)}
102109
fallback={
103110
<h1 class="flex-1 text-4xl font-bold capitalize">
104111
{currentPage().name}
@@ -158,7 +165,10 @@ const App: Component = () => {
158165
<AlbumPage albumId={currentPage().data as string} />
159166
</Match>
160167
<Match when={currentPage().name === 'search'}>
161-
<SearchPage query={currentPage().data as string} />
168+
<SearchPage
169+
query={(currentPage().data as SearchPageData).query}
170+
isManager={(currentPage().data as SearchPageData).isManager}
171+
/>
162172
</Match>
163173
<Match when={currentPage().name === 'settings'}>
164174
<Settings />

src/components/downloadSongModal.tsx

+11-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { api } from '@/api';
22
import { refetchLibrary } from '@/library';
3-
import { Show, createSignal, type Component } from 'solid-js';
3+
import { Show, createEffect, createSignal, on, type Component } from 'solid-js';
44
import Button from './ui/button';
55
import Modal from './ui/modal';
66

@@ -23,6 +23,16 @@ const DownloadSongModal: Component<{ isOpen: boolean; onClose: () => void }> = (
2323
});
2424
};
2525

26+
createEffect(
27+
on(
28+
() => props.isOpen,
29+
() => {
30+
setReturnText(null);
31+
setIsLoading(false);
32+
},
33+
),
34+
);
35+
2636
return (
2737
<Modal
2838
isOpen={props.isOpen}

src/gen/tauri-types.ts

+6-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ export type Procedures = {
77
{ key: "config.pickFolder", input: never, result: string | null } |
88
{ key: "download.download", input: string, result: string } |
99
{ key: "library.get", input: never, result: Library } |
10-
{ key: "library.search", input: string, result: SearchResults },
10+
{ key: "library.search", input: SearchInput, result: SearchResults },
1111
mutations:
1212
{ key: "config.set", input: Config, result: null } |
1313
{ key: "library.deleteSong", input: string, result: string } |
@@ -33,7 +33,11 @@ export type PlaySongInput = { song_id: string; scope: PlayerScope }
3333

3434
export type MainColor = "Slate" | "Gray" | "Zinc" | "Neutral" | "Stone"
3535

36-
export type SearchResults = { artists: string[]; albums: string[]; songs: string[] }
36+
export type SearchMode = "Library" | "Songs"
37+
38+
export type SearchInput = { query: string; mode: SearchMode }
39+
40+
export type SearchResults = { artists: string[] | null; albums: string[] | null; songs: string[] }
3741

3842
export type Library = { artists: { [key: string]: Artist }; albums: { [key: string]: Album }; songs: { [key: string]: Song } }
3943

src/router.ts

+7-2
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,19 @@ export const MainPages = [
1010
'library Manager',
1111
] as const;
1212

13-
type PageData =
13+
export type SearchPageData = {
14+
query: string;
15+
isManager: boolean;
16+
};
17+
18+
export type PageData =
1419
| {
1520
name: (typeof MainPages)[number];
1621
data?: undefined;
1722
}
1823
| {
1924
name: 'search';
20-
data: string;
25+
data: SearchPageData;
2126
}
2227
| {
2328
name: 'artist';

src/views/searchPage.tsx

+20-5
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,26 @@ import ArtistList from './artistsList';
66
import Loading from './loading';
77
import SongList from './songList';
88

9-
const SearchPage: Component<{ query: string }> = (props) => {
9+
const SearchPage: Component<{ query: string; isManager: boolean }> = (
10+
props,
11+
) => {
1012
const [searchResults, setSearchResults] = createSignal<SearchResults | null>(
1113
null,
1214
);
1315

1416
createEffect(
1517
on(
1618
() => props.query,
17-
(query) => api.query(['library.search', query]).then(setSearchResults),
19+
(query) =>
20+
api
21+
.query([
22+
'library.search',
23+
{
24+
mode: props.isManager ? 'Songs' : 'Library',
25+
query,
26+
},
27+
])
28+
.then(setSearchResults),
1829
),
1930
);
2031

@@ -24,19 +35,23 @@ const SearchPage: Component<{ query: string }> = (props) => {
2435
<Show when={searchResults()?.artists}>
2536
<section aria-label="Artists" class="mt-8">
2637
<h2 class="mb-4 text-2xl font-bold">Artists</h2>
27-
<ArtistList ids={searchResults()?.artists} noSort />
38+
<ArtistList ids={searchResults()!.artists!} noSort />
2839
</section>
2940
</Show>
3041
<Show when={searchResults()?.albums}>
3142
<section aria-label="Albums" class="mt-8">
3243
<h2 class="mb-4 text-2xl font-bold">Albums</h2>
33-
<AlbumList ids={searchResults()?.albums} noSort />
44+
<AlbumList ids={searchResults()!.albums!} noSort />
3445
</section>
3546
</Show>
3647
<Show when={searchResults()?.songs}>
3748
<section aria-label="Songs" class="mt-8">
3849
<h2 class="mb-4 text-2xl font-bold">Songs</h2>
39-
<SongList ids={searchResults()?.songs} noSort />
50+
<SongList
51+
ids={searchResults()?.songs}
52+
noSort
53+
isManager={props.isManager}
54+
/>
4055
</section>
4156
</Show>
4257
</Show>

src/views/songList.tsx

+5-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,11 @@ const SongList: Component<{
6161
<>
6262
<Modal
6363
isOpen={!!props.isManager && !!songToEdit()}
64-
onClose={() => setSongToEdit(null) !== null}
64+
onClose={() => {
65+
setSongToEdit(null);
66+
setIsLoading(false);
67+
setReturnText(null);
68+
}}
6569
title={
6670
returnText() ??
6771
(isLoading()

0 commit comments

Comments
 (0)