diff --git a/App.tsx b/App.tsx index 2589cd91..64d75b60 100644 --- a/App.tsx +++ b/App.tsx @@ -9,6 +9,18 @@ import { useColorScheme } from 'react-native'; import jellifyConfig from './tamagui.config'; import { clientPersister } from './constants/storage'; import { queryClient } from './constants/query-client'; +import { CacheManager } from '@georstat/react-native-image-cache'; +import { Dirs } from "react-native-file-access"; + +CacheManager.config = { + baseDir: `${Dirs.CacheDir}/images_cache/`, + blurRadius: 15, + cacheLimit: 0, + maxRetries: 3 /* optional, if not provided defaults to 0 */, + retryDelay: 3000 /* in milliseconds, optional, if not provided defaults to 0 */, + sourceAnimationDuration: 1000, + thumbnailAnimationDuration: 1000, +}; export default function App(): React.JSX.Element { diff --git a/api/queries/functions/images.ts b/api/queries/functions/images.ts index 8d1fd437..e036deff 100644 --- a/api/queries/functions/images.ts +++ b/api/queries/functions/images.ts @@ -15,8 +15,8 @@ export function fetchImage(api: Api, itemId: string, imageType?: ImageType) : Pr imageType, { format: queryConfig.images.format, - fillHeight: queryConfig.images.height, - fillWidth: queryConfig.images.width + fillHeight: queryConfig.images.fillHeight, + fillWidth: queryConfig.images.fillWidth } )) diff --git a/api/queries/query.config.ts b/api/queries/query.config.ts index 1b2b7165..462b0557 100644 --- a/api/queries/query.config.ts +++ b/api/queries/query.config.ts @@ -5,8 +5,8 @@ export const queryConfig = { recents: 50 }, images: { - width: 480, - height: 480, + fillWidth: 480, + fillHeight: 480, format: ImageFormat.Jpg } } \ No newline at end of file diff --git a/components/Global/card.tsx b/components/Global/card.tsx index be634098..9d3d95e1 100644 --- a/components/Global/card.tsx +++ b/components/Global/card.tsx @@ -1,6 +1,6 @@ -import { ReactNode } from "react"; +import React, { ReactNode } from "react"; import type { CardProps as TamaguiCardProps } from "tamagui" -import { H3, Image, Card as TamaguiCard, ZStack } from "tamagui"; +import { H3, Card as TamaguiCard, ZStack } from "tamagui"; import { LinearGradient } from "tamagui/linear-gradient"; import { useApiClientContext } from "../jellyfin-api-provider"; import { cardDimensions } from "./component.config"; @@ -8,6 +8,7 @@ import { useImage } from "../../api/queries/image"; import { Colors } from "../../enums/colors"; import { getImageApi } from "@jellyfin/sdk/lib/utils/api"; import { ImageType } from "@jellyfin/sdk/lib/generated-client/models"; +import { CachedImage } from "@georstat/react-native-image-cache"; import { queryConfig } from "../../api/queries/query.config"; interface CardProps extends TamaguiCardProps { @@ -53,22 +54,23 @@ export function Card(props: CardProps) { end={[0,0]} /> - { isSuccess && data && ( - - )} + diff --git a/package-lock.json b/package-lock.json index 45810df6..f55063c1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "dependencies": { "@animatereactnative/marquee": "^0.2.0", "@gcores/react-native-carplay": "^1.1.12", + "@georstat/react-native-image-cache": "^3.1.0", "@jellyfin/sdk": "^0.10.0", "@react-native-community/masked-view": "^0.1.11", "@react-native-masked-view/masked-view": "^0.3.1", @@ -29,9 +30,10 @@ "react": "18.3.1", "react-native": "0.75.2", "react-native-device-info": "^11.1.0", + "react-native-file-access": "^3.1.1", "react-native-gesture-handler": "^2.20.0", "react-native-mmkv": "2.12.2", - "react-native-reanimated": "^3.15.5", + "react-native-reanimated": "^3.16.3", "react-native-safe-area-context": "^4.11.1", "react-native-screens": "^3.34.0", "react-native-track-player": "^4.1.1", @@ -2452,9 +2454,9 @@ } }, "node_modules/@expo/cli": { - "version": "0.18.30", - "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-0.18.30.tgz", - "integrity": "sha512-V90TUJh9Ly8stYo8nwqIqNWCsYjE28GlVFWEhAFCUOp99foiQr8HSTpiiX5GIrprcPoWmlGoY+J5fQA29R4lFg==", + "version": "0.18.31", + "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-0.18.31.tgz", + "integrity": "sha512-v9llw9fT3Uv+TCM6Xllo54t672CuYtinEQZ2LPJ2EJsCwuTc4Cd2gXQaouuIVD21VoeGQnr5JtJuWbF97sBKzQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.0", @@ -3121,9 +3123,9 @@ } }, "node_modules/@expo/config-plugins": { - "version": "8.0.10", - "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-8.0.10.tgz", - "integrity": "sha512-KG1fnSKRmsudPU9BWkl59PyE0byrE2HTnqbOrgwr2FAhqh7tfr9nRs6A9oLS/ntpGzmFxccTEcsV0L4apsuxxg==", + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-8.0.11.tgz", + "integrity": "sha512-oALE1HwnLFthrobAcC9ocnR9KXLzfWEjgIe4CPe+rDsfC6GDs8dGYCXfRFoCEzoLN4TGYs9RdZ8r0KoCcNrm2A==", "license": "MIT", "dependencies": { "@expo/config-types": "^51.0.3", @@ -3884,9 +3886,9 @@ } }, "node_modules/@expo/osascript": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.1.3.tgz", - "integrity": "sha512-aOEkhPzDsaAfolSswObGiYW0Pf0ROfR9J2NBRLQACdQ6uJlyAMiPF45DVEVknAU9juKh0y8ZyvC9LXqLEJYohA==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.1.4.tgz", + "integrity": "sha512-LcPjxJ5FOFpqPORm+5MRLV0CuYWMthJYV6eerF+lQVXKlvgSn3EOqaHC3Vf3H+vmB0f6G4kdvvFtg40vG4bIhA==", "license": "MIT", "dependencies": { "@expo/spawn-async": "^1.7.2", @@ -3897,25 +3899,45 @@ } }, "node_modules/@expo/package-manager": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.5.2.tgz", - "integrity": "sha512-IuA9XtGBilce0q8cyxtWINqbzMB1Fia0Yrug/O53HNuRSwQguV/iqjV68bsa4z8mYerePhcFgtvISWLAlNEbUA==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.6.1.tgz", + "integrity": "sha512-4rT46wP/94Ll+CWXtFKok1Lbo9XncSUtErFOo/9/3FVughGbIfdG4SKZOAWIpr9wxwEfkyhHfAP9q71ONlWODw==", "license": "MIT", "dependencies": { - "@expo/json-file": "^8.3.0", + "@expo/json-file": "^9.0.0", "@expo/spawn-async": "^1.7.2", "ansi-regex": "^5.0.0", "chalk": "^4.0.0", "find-up": "^5.0.0", - "find-yarn-workspace-root": "~2.0.0", "js-yaml": "^3.13.1", - "micromatch": "^4.0.2", - "npm-package-arg": "^7.0.0", + "micromatch": "^4.0.8", + "npm-package-arg": "^11.0.0", "ora": "^3.4.0", + "resolve-workspace-root": "^2.0.0", "split": "^1.0.1", "sudo-prompt": "9.1.1" } }, + "node_modules/@expo/package-manager/node_modules/@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@expo/package-manager/node_modules/@expo/json-file": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-9.0.0.tgz", + "integrity": "sha512-M+55xFVrFzDcgMDf+52lPDLjKB5xwRfStWlv/b/Vu2OLgxGZLWpxoPYjlRoHqxjPbCQIi2ZCbobK+0KuNhsELg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "~7.10.4", + "json5": "^2.2.3", + "write-file-atomic": "^2.3.0" + } + }, "node_modules/@expo/package-manager/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -4011,6 +4033,18 @@ "node": ">=8" } }, + "node_modules/@expo/package-manager/node_modules/hosted-git-info": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, "node_modules/@expo/package-manager/node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -4100,6 +4134,12 @@ "node": ">=4" } }, + "node_modules/@expo/package-manager/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, "node_modules/@expo/package-manager/node_modules/mimic-fn": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", @@ -4109,6 +4149,21 @@ "node": ">=4" } }, + "node_modules/@expo/package-manager/node_modules/npm-package-arg": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", + "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", + "license": "ISC", + "dependencies": { + "hosted-git-info": "^7.0.0", + "proc-log": "^4.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, "node_modules/@expo/package-manager/node_modules/onetime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", @@ -4228,6 +4283,18 @@ "node": ">=4" } }, + "node_modules/@expo/package-manager/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@expo/package-manager/node_modules/strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", @@ -4267,6 +4334,26 @@ "node": ">=8" } }, + "node_modules/@expo/package-manager/node_modules/validate-npm-package-name": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", + "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@expo/package-manager/node_modules/write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "license": "ISC", + "dependencies": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, "node_modules/@expo/plist": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.1.3.tgz", @@ -4633,6 +4720,21 @@ "react-native": "*" } }, + "node_modules/@georstat/react-native-image-cache": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@georstat/react-native-image-cache/-/react-native-image-cache-3.1.0.tgz", + "integrity": "sha512-p84UVar4YUJWnyJ62VwWe82pFuIDs3eqeTLON/ZabDUJY2kE9IBHMbFwMYKgYUW2vN9oDtaRO4NtEW44sb7dTQ==", + "license": "MIT", + "dependencies": { + "crypto-js": "^4.1.1" + }, + "peerDependencies": { + "react": "*", + "react-native": "*", + "react-native-file-access": ">=3.0.0", + "react-native-reanimated": ">=2.2.0" + } + }, "node_modules/@graphql-typed-document-node/core": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz", @@ -7446,9 +7548,9 @@ } }, "node_modules/@rnx-kit/chromium-edge-launcher/node_modules/@types/node": { - "version": "18.19.57", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.57.tgz", - "integrity": "sha512-I2ioBd/IPrYDMv9UNR5NlPElOZ68QB7yY5V2EsLtSrTO0LM0PnCEFF9biLWHf5k+sIy4ohueCV9t4gk1AEdlVA==", + "version": "18.19.67", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.67.tgz", + "integrity": "sha512-wI8uHusga+0ZugNp0Ol/3BqQfEcCCNfojtO6Oou9iVNGPTL6QNSdnUdqq85fRgIorLhLMuPIKpsN98QE9Nh+KQ==", "license": "MIT", "dependencies": { "undici-types": "~5.26.4" @@ -11244,9 +11346,9 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -11266,6 +11368,12 @@ "node": "*" } }, + "node_modules/crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", + "license": "MIT" + }, "node_modules/crypto-random-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", @@ -11434,9 +11542,9 @@ } }, "node_modules/default-gateway/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", "license": "MIT", "dependencies": { "nice-try": "^1.0.4", @@ -12882,15 +12990,15 @@ } }, "node_modules/expo": { - "version": "51.0.38", - "resolved": "https://registry.npmjs.org/expo/-/expo-51.0.38.tgz", - "integrity": "sha512-/B9npFkOPmv6WMIhdjQXEY0Z9k/67UZIVkodW8JxGIXwKUZAGHL+z1R5hTtWimpIrvVhyHUFU3f8uhfEKYhHNQ==", + "version": "51.0.39", + "resolved": "https://registry.npmjs.org/expo/-/expo-51.0.39.tgz", + "integrity": "sha512-Cs/9xopyzJrpXWbyVUZnr37rprdFJorRgfSp6cdBfvbjxZeKnw2MEu7wJwV/s626i5lZTPGjZPHUF9uQvt51cg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.0", - "@expo/cli": "0.18.30", + "@expo/cli": "0.18.31", "@expo/config": "9.0.4", - "@expo/config-plugins": "8.0.10", + "@expo/config-plugins": "8.0.11", "@expo/metro-config": "0.18.11", "@expo/vector-icons": "^14.0.3", "babel-preset-expo": "~11.0.15", @@ -18992,9 +19100,9 @@ } }, "node_modules/picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "license": "ISC" }, "node_modules/picomatch": { @@ -19103,9 +19211,9 @@ } }, "node_modules/postcss": { - "version": "8.4.47", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", - "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "funding": [ { "type": "opencollective", @@ -19123,7 +19231,7 @@ "license": "MIT", "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.1.0", + "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, "engines": { @@ -19200,6 +19308,15 @@ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "license": "MIT" }, + "node_modules/proc-log": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", + "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -19523,6 +19640,16 @@ "react-native": "*" } }, + "node_modules/react-native-file-access": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/react-native-file-access/-/react-native-file-access-3.1.1.tgz", + "integrity": "sha512-4KUpBAsnWJa+AQf1tUbLdHO+1pyiZMTeq3NPf5XOGdz1O5CwIrVkrzl+gkN7ffmUa5JyoYHyXUtwScmA+z0Tlg==", + "license": "MIT", + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, "node_modules/react-native-gesture-handler": { "version": "2.20.0", "resolved": "https://registry.npmjs.org/react-native-gesture-handler/-/react-native-gesture-handler-2.20.0.tgz", @@ -19550,9 +19677,9 @@ } }, "node_modules/react-native-reanimated": { - "version": "3.15.5", - "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-3.15.5.tgz", - "integrity": "sha512-admqeZ0w235vQqYPy+IUgmHu5gwKi9+b7AQRV1yIK3MbAMLYx+RY+tTUtx1CNE5X+rNZ6eSQssW5z77yTwIusg==", + "version": "3.16.3", + "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-3.16.3.tgz", + "integrity": "sha512-OWlA6e1oHhytTpc7WiSZ7Tmb8OYwLKYZz29Sz6d6WAg60Hm5GuAiKIWUG7Ako7FLcYhFkA0pEQ2xPMEYUo9vlw==", "license": "MIT", "dependencies": { "@babel/plugin-transform-arrow-functions": "^7.0.0-0", @@ -20188,6 +20315,12 @@ "node": ">=8" } }, + "node_modules/resolve-workspace-root": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-workspace-root/-/resolve-workspace-root-2.0.0.tgz", + "integrity": "sha512-IsaBUZETJD5WsI11Wt8PKHwaIe45or6pwNc8yflvLJ4DWtImK9kuLoH5kUva/2Mmx/RdIyr4aONNSa2v9LTJsw==", + "license": "MIT" + }, "node_modules/resolve.exports": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", diff --git a/package.json b/package.json index 6fc66239..0dc20971 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "dependencies": { "@animatereactnative/marquee": "^0.2.0", "@gcores/react-native-carplay": "^1.1.12", + "@georstat/react-native-image-cache": "^3.1.0", "@jellyfin/sdk": "^0.10.0", "@react-native-community/masked-view": "^0.1.11", "@react-native-masked-view/masked-view": "^0.3.1", @@ -25,21 +26,22 @@ "@tanstack/react-query": "^5.52.1", "@tanstack/react-query-persist-client": "^5.62.0", "burnt": "^0.12.2", + "expo": "^51.0.0", "expo-linear-gradient": "^14.0.1", "lodash": "^4.17.21", "react": "18.3.1", "react-native": "0.75.2", "react-native-device-info": "^11.1.0", + "react-native-file-access": "^3.1.1", "react-native-gesture-handler": "^2.20.0", "react-native-mmkv": "2.12.2", - "react-native-reanimated": "^3.15.5", + "react-native-reanimated": "^3.16.3", "react-native-safe-area-context": "^4.11.1", "react-native-screens": "^3.34.0", "react-native-track-player": "^4.1.1", "react-native-url-polyfill": "^2.0.0", "react-native-vector-icons": "^10.2.0", - "tamagui": "^1.115.5", - "expo": "^51.0.0" + "tamagui": "^1.115.5" }, "devDependencies": { "@babel/core": "^7.20.0",