From 22b6524e8c3cc9209489bad5d775a554e34d824b Mon Sep 17 00:00:00 2001 From: austinried <4966622+austinried@users.noreply.github.com> Date: Sun, 22 Aug 2021 13:24:12 +0900 Subject: [PATCH] added artist filters --- app/hooks/list.ts | 12 ++++--- app/models/settings.ts | 11 ++++-- app/screens/LibraryAlbums.tsx | 4 +-- app/screens/LibraryArtists.tsx | 66 ++++++++++++++++++++++++++++------ app/state/settings.ts | 18 ++++++++-- 5 files changed, 89 insertions(+), 22 deletions(-) diff --git a/app/hooks/list.ts b/app/hooks/list.ts index 994fc87..87e8443 100644 --- a/app/hooks/list.ts +++ b/app/hooks/list.ts @@ -14,14 +14,18 @@ export const useFetchList = (fetchList: () => Promise) => { }) }, [fetchList]) + const reset = useCallback(() => { + setList([]) + refresh() + }, [refresh]) + useActiveServerRefresh( useCallback(() => { - setList([]) - refresh() - }, [refresh]), + reset() + }, [reset]), ) - return { list, refreshing, refresh } + return { list, refreshing, refresh, reset } } export const useFetchPaginatedList = ( diff --git a/app/models/settings.ts b/app/models/settings.ts index 4dc4b57..a2487e4 100644 --- a/app/models/settings.ts +++ b/app/models/settings.ts @@ -8,13 +8,19 @@ export interface Server { salt: string } -export interface FilterSettings { +export interface AlbumFilterSettings { type: GetAlbumList2Type fromYear: number toYear: number genre: string } +export type ArtistFilterType = 'random' | 'starred' | 'alphabeticalByName' + +export interface ArtistFilterSettings { + type: ArtistFilterType +} + export interface AppSettings { servers: Server[] screens: { @@ -22,7 +28,8 @@ export interface AppSettings { lists: string[] } library: { - albums: FilterSettings + albums: AlbumFilterSettings + artists: ArtistFilterSettings } } activeServer?: string diff --git a/app/screens/LibraryAlbums.tsx b/app/screens/LibraryAlbums.tsx index 6086e07..84979b1 100644 --- a/app/screens/LibraryAlbums.tsx +++ b/app/screens/LibraryAlbums.tsx @@ -73,9 +73,7 @@ const AlbumsList = () => { const size = layout.width / 3 - styles.itemWrapper.marginHorizontal * 2 const height = size + 36 - useEffect(() => { - reset() - }, [reset, filter]) + useEffect(() => reset(), [reset, filter]) return ( diff --git a/app/screens/LibraryArtists.tsx b/app/screens/LibraryArtists.tsx index ca06f01..56a8432 100644 --- a/app/screens/LibraryArtists.tsx +++ b/app/screens/LibraryArtists.tsx @@ -1,34 +1,78 @@ +import FilterButton, { OptionData } from '@app/components/FilterButton' import GradientFlatList from '@app/components/GradientFlatList' import ListItem from '@app/components/ListItem' import { useFetchList } from '@app/hooks/list' import { Artist } from '@app/models/music' +import { ArtistFilterType } from '@app/models/settings' import { selectMusic } from '@app/state/music' +import { selectSettings } from '@app/state/settings' import { useStore } from '@app/state/store' -import React from 'react' -import { StyleSheet } from 'react-native' +import React, { useEffect, useState } from 'react' +import { StyleSheet, View } from 'react-native' const ArtistRenderItem: React.FC<{ item: Artist }> = ({ item }) => ( ) +const filterOptions: OptionData[] = [ + { text: 'By name', value: 'alphabeticalByName' }, + { text: 'Starred', value: 'starred' }, + { text: 'Random', value: 'random' }, +] + const ArtistsList = () => { const fetchArtists = useStore(selectMusic.fetchArtists) const { list, refreshing, refresh } = useFetchList(fetchArtists) + const filter = useStore(selectSettings.libraryArtistFilter) + const setFilter = useStore(selectSettings.setLibraryArtistFiler) + const [sortedList, setSortedList] = useState([]) + + useEffect(() => { + switch (filter.type) { + case 'alphabeticalByName': + setSortedList([...list].sort((a, b) => a.name.localeCompare(b.name))) + break + case 'random': + setSortedList([...list].sort(() => Math.random() - 0.5)) + break + case 'starred': + setSortedList([...list].sort((a, b) => a.name.localeCompare(b.name)).filter(a => a.starred)) + break + default: + setSortedList([...list]) + break + } + }, [list, filter]) return ( - item.id} - onRefresh={refresh} - refreshing={refreshing} - overScrollMode="never" - /> + + item.id} + onRefresh={refresh} + refreshing={refreshing} + overScrollMode="never" + /> + { + setFilter({ + ...filter, + type: selection as ArtistFilterType, + }) + }} + /> + ) } const styles = StyleSheet.create({ + container: { + flex: 1, + }, listContent: { minHeight: '100%', paddingHorizontal: 10, diff --git a/app/state/settings.ts b/app/state/settings.ts index 2a5cefb..5173e34 100644 --- a/app/state/settings.ts +++ b/app/state/settings.ts @@ -1,4 +1,4 @@ -import { AppSettings, FilterSettings, Server } from '@app/models/settings' +import { AppSettings, ArtistFilterSettings, AlbumFilterSettings, Server } from '@app/models/settings' import { Store } from '@app/state/store' import { SubsonicApiClient } from '@app/subsonic/api' import produce from 'immer' @@ -23,7 +23,8 @@ export type SettingsSlice = { pingServer: (server?: Server) => Promise - setLibraryAlbumFilter: (filter: FilterSettings) => void + setLibraryAlbumFilter: (filter: AlbumFilterSettings) => void + setLibraryArtistFiler: (filter: ArtistFilterSettings) => void } export const selectSettings = { @@ -59,6 +60,8 @@ export const selectSettings = { setLibraryAlbumFilter: (state: SettingsSlice) => state.setLibraryAlbumFilter, libraryAlbumFilter: (state: SettingsSlice) => state.settings.screens.library.albums, + setLibraryArtistFiler: (state: SettingsSlice) => state.setLibraryArtistFiler, + libraryArtistFilter: (state: SettingsSlice) => state.settings.screens.library.artists, } export const createSettingsSlice = (set: SetState, get: GetState): SettingsSlice => ({ @@ -75,6 +78,9 @@ export const createSettingsSlice = (set: SetState, get: GetState): toYear: 9999, genre: '', }, + artists: { + type: 'alphabeticalByName', + }, }, }, scrobble: false, @@ -249,6 +255,14 @@ export const createSettingsSlice = (set: SetState, get: GetState): }), ) }, + + setLibraryArtistFiler: filter => { + set( + produce(state => { + state.settings.screens.library.artists = filter + }), + ) + }, }) function replaceIndex(array: T[], index: number, replacement: T): T[] {