import { Api } from '@jellyfin/sdk/lib/api' import { JellyfinInfo } from './info' import { JellifyServer } from '../types/JellifyServer' import { JellifyUser } from '../types/JellifyUser' import { storage } from '../constants/storage' import { MMKVStorageKeys } from '../enums/mmkv-storage-keys' import uuid from 'react-native-uuid' import { JellifyLibrary } from '../types/JellifyLibrary' export default class Client { static #instance: Client private api: Api | undefined = undefined private user: JellifyUser | undefined = undefined private server: JellifyServer | undefined = undefined private library: JellifyLibrary | undefined = undefined private sessionId: string = uuid.v4() private constructor( api?: Api | undefined, user?: JellifyUser | undefined, server?: JellifyServer | undefined, library?: JellifyLibrary | undefined, ) { const userJson = storage.getString(MMKVStorageKeys.User) const serverJson = storage.getString(MMKVStorageKeys.Server) const libraryJson = storage.getString(MMKVStorageKeys.Library) if (user) this.setAndPersistUser(user) else if (userJson) this.user = JSON.parse(userJson) else this.user = undefined if (server) this.setAndPersistServer(server) else if (serverJson) this.server = JSON.parse(serverJson) else this.server = undefined if (library) this.setAndPersistLibrary(library) else if (libraryJson) this.library = JSON.parse(libraryJson) else this.library = undefined if (api) this.api = api else if (this.user && this.server) this.api = new Api( this.server.url, JellyfinInfo.clientInfo, JellyfinInfo.deviceInfo, this.user.accessToken, ) else this.api = undefined } public static get instance(): Client { if (!Client.#instance) { Client.#instance = new Client() } return Client.#instance } public static get api(): Api | undefined { return Client.#instance.api } public static get server(): JellifyServer | undefined { return Client.#instance.server } public static get user(): JellifyUser | undefined { return Client.#instance.user } public static get library(): JellifyLibrary | undefined { return Client.#instance.library } public static get sessionId(): string { return Client.#instance.sessionId } public static signOut(): void { Client.#instance.removeCredentials() } public static switchServer(): void { Client.#instance.removeServer() } public static switchUser(): void { Client.#instance.removeUser() } public static setUser(user: JellifyUser): void { Client.#instance.setAndPersistUser(user) } private setAndPersistUser(user: JellifyUser) { this.user = user // persist user details storage.set(MMKVStorageKeys.User, JSON.stringify(user)) } private setAndPersistServer(server: JellifyServer) { this.server = server storage.set(MMKVStorageKeys.Server, JSON.stringify(server)) } private setAndPersistLibrary(library: JellifyLibrary) { this.library = library storage.set(MMKVStorageKeys.Library, JSON.stringify(library)) } private removeCredentials() { this.library = undefined this.server = undefined this.user = undefined storage.delete(MMKVStorageKeys.Server) storage.delete(MMKVStorageKeys.Library) storage.delete(MMKVStorageKeys.User) } private removeServer() { this.server = undefined storage.delete(MMKVStorageKeys.Server) } private removeUser() { this.user = undefined storage.delete(MMKVStorageKeys.User) } /** * Uses the jellifyClient to create a public Jellyfin API instance. * @param serverUrl The URL of the Jellyfin server * @returns */ public static setPublicApiClient(server: JellifyServer): void { const api = JellyfinInfo.createApi(server.url) Client.#instance = new Client(api, undefined, server, undefined) } /** * * @param serverUrl The URL of the Jellyfin server * @param accessToken The assigned accessToken for the Jellyfin user */ public static setPrivateApiClient(server: JellifyServer, user: JellifyUser): void { const api = JellyfinInfo.createApi(server.url, user.accessToken) Client.#instance = new Client(api, user, server, undefined) } public static setLibrary(library: JellifyLibrary): void { Client.#instance = new Client(undefined, undefined, undefined, library) } }