diff --git a/apps/expo/package.json b/apps/expo/package.json index 8742f70..acd6aaf 100644 --- a/apps/expo/package.json +++ b/apps/expo/package.json @@ -1,5 +1,5 @@ { - "name": "movie-web", + "name": "@movie-web/mobile", "version": "0.1.0", "private": true, "main": "expo-router/entry", diff --git a/apps/expo/src/app/(tabs)/search/_layout.tsx b/apps/expo/src/app/(tabs)/search/_layout.tsx index b09df2a..63937ac 100644 --- a/apps/expo/src/app/(tabs)/search/_layout.tsx +++ b/apps/expo/src/app/(tabs)/search/_layout.tsx @@ -47,28 +47,13 @@ export default function SearchScreen() { async function fetchSearchResults(query: string): Promise { const results = await searchTitle(query); - return results - .map((result) => { - switch (result.media_type) { - case "movie": - return { - id: result.id.toString(), - title: result.title, - posterUrl: getMediaPoster(result.poster_path), - year: new Date(result.release_date).getFullYear(), - type: result.media_type, - }; - case "tv": - return { - id: result.id.toString(), - title: result.name, - posterUrl: getMediaPoster(result.poster_path), - year: new Date(result.first_air_date).getFullYear(), - type: result.media_type, - }; - default: - return undefined; - } - }) - .filter((item): item is ItemData => item !== undefined); + return results.map((result) => ({ + id: result.id.toString(), + title: result.media_type === "tv" ? result.name : result.title, + posterUrl: getMediaPoster(result.poster_path), + year: new Date( + result.media_type === "tv" ? result.first_air_date : result.release_date, + ).getFullYear(), + type: result.media_type, + })); } diff --git a/packages/tmdb/src/details.ts b/packages/tmdb/src/details.ts new file mode 100644 index 0000000..d5a26c3 --- /dev/null +++ b/packages/tmdb/src/details.ts @@ -0,0 +1,29 @@ +import type { MovieDetails, TvShowDetails } from "tmdb-ts"; + +import { tmdb } from "./util"; + +export async function fetchMediaDetails( + id: string, + type: "movie" | "tv", +): Promise< + { type: "movie" | "tv"; result: TvShowDetails | MovieDetails } | undefined +> { + try { + let result: TvShowDetails | MovieDetails; + + switch (type) { + case "tv": + result = await tmdb.tvShows.details(parseInt(id, 10)); + break; + case "movie": + result = await tmdb.movies.details(parseInt(id, 10)); + break; + default: + return undefined; + } + + return { type, result }; + } catch (ex) { + return undefined; + } +} diff --git a/packages/tmdb/src/index.ts b/packages/tmdb/src/index.ts index 732fb25..fec6c9f 100644 --- a/packages/tmdb/src/index.ts +++ b/packages/tmdb/src/index.ts @@ -1,2 +1,4 @@ export const name = "tmdb"; export * from "./search"; +export * from "./details"; +export * from "./util"; diff --git a/packages/tmdb/src/search.ts b/packages/tmdb/src/search.ts index 37f482d..3f99ee7 100644 --- a/packages/tmdb/src/search.ts +++ b/packages/tmdb/src/search.ts @@ -1,9 +1,6 @@ -import type { MovieDetails, TvShowDetails } from "tmdb-ts"; -import { TMDB } from "tmdb-ts"; +import type { MovieWithMediaType, TVWithMediaType } from "tmdb-ts"; -const TMDB_API_KEY = - "eyJhbGciOiJIUzI1NiJ9.eyJhdWQiOiJkYTM1ZTgyMzE4OTc0NTgxNDJmZjljZTE4ODExNWRlNiIsInN1YiI6IjY0OTM0ZDQ1ODliNTYxMDExYzliZDVhMiIsInNjb3BlcyI6WyJhcGlfcmVhZCJdLCJ2ZXJzaW9uIjoxfQ.AzWnIcxPNgDwGdzeIZ_C3mRC_5_qy-Z-SRPglLjzlNc"; -const tmdb = new TMDB(TMDB_API_KEY); +import { tmdb } from "./util"; export async function searchTitle(query: string) { try { @@ -18,38 +15,8 @@ export async function searchTitle(query: string) { if (!results.length) throw new Error("No results found"); - return results; + return results as unknown as MovieWithMediaType[] | TVWithMediaType[]; } catch (ex) { throw new Error(`Error searching for title: ${(ex as Error).message}`); } } - -export async function fetchMediaDetails( - id: string, - type: "movie" | "tv", -): Promise< - { type: "movie" | "tv"; result: TvShowDetails | MovieDetails } | undefined -> { - try { - let result: TvShowDetails | MovieDetails; - - switch (type) { - case "tv": - result = await tmdb.tvShows.details(parseInt(id, 10)); - break; - case "movie": - result = await tmdb.movies.details(parseInt(id, 10)); - break; - default: - return undefined; - } - - return { type, result }; - } catch (ex) { - return undefined; - } -} - -export function getMediaPoster(posterPath: string): string { - return `https://image.tmdb.org/t/p/w185/${posterPath}`; -} diff --git a/packages/tmdb/src/util.ts b/packages/tmdb/src/util.ts new file mode 100644 index 0000000..9558c2f --- /dev/null +++ b/packages/tmdb/src/util.ts @@ -0,0 +1,9 @@ +import { TMDB } from "tmdb-ts"; + +const TMDB_API_KEY = + "eyJhbGciOiJIUzI1NiJ9.eyJhdWQiOiJkYTM1ZTgyMzE4OTc0NTgxNDJmZjljZTE4ODExNWRlNiIsInN1YiI6IjY0OTM0ZDQ1ODliNTYxMDExYzliZDVhMiIsInNjb3BlcyI6WyJhcGlfcmVhZCJdLCJ2ZXJzaW9uIjoxfQ.AzWnIcxPNgDwGdzeIZ_C3mRC_5_qy-Z-SRPglLjzlNc"; +export const tmdb = new TMDB(TMDB_API_KEY); + +export function getMediaPoster(posterPath: string): string { + return `https://image.tmdb.org/t/p/w185/${posterPath}`; +}