diff --git a/api/queries/functions/api.ts b/api/queries/functions/api.ts index b8bf2b07..225d911d 100644 --- a/api/queries/functions/api.ts +++ b/api/queries/functions/api.ts @@ -1,6 +1,6 @@ import { Api } from "@jellyfin/sdk"; -import { client } from "../../queries"; import { fetchCredentials } from "./storage"; +import { client } from "../../client"; /** * A promise to build an authenticated Jellyfin API client diff --git a/api/queries/functions/libraries.ts b/api/queries/functions/libraries.ts new file mode 100644 index 00000000..40feb523 --- /dev/null +++ b/api/queries/functions/libraries.ts @@ -0,0 +1,14 @@ +import { Api } from "@jellyfin/sdk"; +import { getItemsApi } from "@jellyfin/sdk/lib/utils/api/items-api"; +import _ from "lodash"; + + +export const fetchMusicLibraries = async (api: Api) => { + + let libraries = await getItemsApi(api).getItems(); + + if (_.isUndefined(libraries.data.Items)) + return Promise.reject("No libraries found on Jellyfin"); + + return libraries.data.Items!.filter(library => library.CollectionType == 'music') +} \ No newline at end of file diff --git a/api/queries/libraries.ts b/api/queries/libraries.ts index e69de29b..9143b2d5 100644 --- a/api/queries/libraries.ts +++ b/api/queries/libraries.ts @@ -0,0 +1,9 @@ +import { useQuery } from "@tanstack/react-query"; +import { QueryKeys } from "../../enums/query-keys"; +import { fetchMusicLibraries } from "./functions/libraries"; +import { Api } from "@jellyfin/sdk"; + +export const useLibraries = (api: Api) => useQuery({ + queryKey: [QueryKeys.Libraries], + queryFn: () => fetchMusicLibraries(api) +}); diff --git a/api/queries/public.ts b/api/queries/public.ts index 5aa2037b..19a84ed4 100644 --- a/api/queries/public.ts +++ b/api/queries/public.ts @@ -1,6 +1,5 @@ import { useQuery } from "@tanstack/react-query"; import { QueryKeys } from "../../enums/query-keys"; -import { usePublicApi } from "../queries"; import { getSystemApi } from "@jellyfin/sdk/lib/utils/api/system-api"; import { createPublicApi } from "./functions/api"; diff --git a/components/Home/component.tsx b/components/Home/component.tsx index e69de29b..4dbb773d 100644 --- a/components/Home/component.tsx +++ b/components/Home/component.tsx @@ -0,0 +1,17 @@ +import { H1, ScrollView, YStack } from "tamagui"; +import { useApiClientContext } from "../jellyfin-api-provider"; +import _ from "lodash"; + + +export default function Home(): React.JSX.Element { + + const { apiClient, username } = useApiClientContext(); + + return ( + + +

Hi { _.isUndefined(username) ? "there" : `, ${username}`}

+
+
+ ); +} \ No newline at end of file diff --git a/components/Login/component.tsx b/components/Login/component.tsx index cb822f74..19557917 100644 --- a/components/Login/component.tsx +++ b/components/Login/component.tsx @@ -7,7 +7,7 @@ import ServerLibrary from "./helpers/server-library"; export default function Login(): React.JSX.Element { - const { server, changeServer, username } = useApiClientContext(); + const { server, changeServer, changeUser, username } = useApiClientContext(); const Stack = createStackNavigator(); @@ -25,7 +25,7 @@ export default function Login(): React.JSX.Element { /> ) : ( - (_.isUndefined(username)) ? ( + (_.isUndefined(username) || changeUser) ? ( + ) } \ No newline at end of file diff --git a/components/jellify.tsx b/components/jellify.tsx index c4404ab7..dc87b2f1 100644 --- a/components/jellify.tsx +++ b/components/jellify.tsx @@ -5,10 +5,8 @@ import _ from "lodash"; import { JellyfinApiClientProvider, useApiClientContext } from "./jellyfin-api-provider"; import React, { } from "react"; import { DarkTheme, DefaultTheme, NavigationContainer } from "@react-navigation/native"; -import { createNativeStackNavigator } from '@react-navigation/native-stack'; import Navigation from "./navigation"; import Login from "./Login/component"; -import { createBottomTabNavigator } from '@react-navigation/bottom-tabs'; export default function Jellify(): React.JSX.Element { @@ -33,17 +31,11 @@ function conditionalHomeRender(): React.JSX.Element { const isDarkMode = useColorScheme() === 'dark'; const { libraryId } = useApiClientContext(); - - const Stack = createNativeStackNavigator() - - const Tab = createBottomTabNavigator(); return ( { !_.isUndefined(libraryId) ? ( - - - + ) : ( )} diff --git a/components/navigation.tsx b/components/navigation.tsx index 76b5ccc8..7b01f301 100644 --- a/components/navigation.tsx +++ b/components/navigation.tsx @@ -1,20 +1,16 @@ -import { createStackNavigator } from "@react-navigation/stack"; -import Player from "./Player/component"; -import Login from "./Login/component"; - +import createBottomTabNavigator from "@react-navigation/bottom-tabs/lib/typescript/src/navigators/createBottomTabNavigator"; +import { createNativeStackNavigator } from "@react-navigation/native-stack"; +import Home from "./Home/component"; export default function Navigation(): React.JSX.Element { - const RootStack = createStackNavigator(); + const Stack = createNativeStackNavigator() + + const Tab = createBottomTabNavigator(); return ( - - - - - - - - + + + ) } \ No newline at end of file diff --git a/enums/query-keys.ts b/enums/query-keys.ts index 64f65754..867340b4 100644 --- a/enums/query-keys.ts +++ b/enums/query-keys.ts @@ -6,17 +6,18 @@ export enum QueryKeys { ArtistById = "ARTIST_BY_ID", Credentials = "CREDENTIALS", ImageByItemId = "IMAGE_BY_ITEM_ID", + Libraries = "LIBRARIES", Pause = "PAUSE", Play = "PLAY", Playlists = "PLAYLISTS", Progress = "PROGRESS", PlayQueue = "PLAY_QUEUE", + PublicApi = "PUBLIC_API", + PublicSystemInfo = "PUBLIC_SYSTEM_INFO", RemoveFromQueue = "REMOVE_FROM_QUEUE", RemoveMultipleFromQueue = "REMOVE_MULTIPLE_FROM_QUEUE", ReportPlaybackPosition = "REPORT_PLAYBACK_POSITION", ReportPlaybackStarted = "REPORT_PLAYBACK_STARTED", ReportPlaybackStopped = "REPORT_PLAYBACK_STOPPED", ServerUrl = "SERVER_URL", - PublicSystemInfo = "PublicSystemInfo", - PublicApi = "PublicApi", } \ No newline at end of file