1e1ead6f54
The landing page's QR card now carries a link to `GET /api/photos/:id/preset.recipe`, so the app can pick a look up off a screen instead of a file. PRESETS gains a SCAN QR chip next to IMPORT: the code is decoded, checked against the preset route, fetched, and stored through the same `storeImportedRecipe` path IMPORT already uses, so an imported look and a scanned look land in one place. Scanning runs on `expo-camera`, not the viewfinder's vision-camera: v5's object output is iOS-only, Android's `createObjectOutput` throws. That is a second camera library in the app, so the sheet pauses the viewfinder (`paused` prop) — CameraX will not let two clients hold one lens. A native rebuild is required for the new module. The code holds a URL, never the recipe, so anything that is not the preset route is refused by name rather than silently dropped. On a release APK the plain-HTTP link is blocked by Android's cleartext policy; debug builds have it on. Noted in 7_SCAN_QR.md along with the web side, the regex, and the paused-viewfinder rule.
58 lines
2.0 KiB
JSON
58 lines
2.0 KiB
JSON
{
|
|
"name": "recipescamera",
|
|
"version": "1.2.1",
|
|
"main": "index.ts",
|
|
"dependencies": {
|
|
"@react-native-async-storage/async-storage": "2.2.0",
|
|
"@react-native-community/slider": "5.2.0",
|
|
"@shopify/react-native-skia": "2.6.2",
|
|
"babel-preset-expo": "~57.0.0",
|
|
"expo": "~57.0.7",
|
|
"expo-asset": "~57.0.5",
|
|
"expo-camera": "~57.0.5",
|
|
"expo-dev-client": "~57.0.6",
|
|
"expo-document-picker": "~57.0.2",
|
|
"expo-file-system": "~57.0.1",
|
|
"expo-font": "~57.0.1",
|
|
"expo-haptics": "~57.0.1",
|
|
"expo-iap": "^5.6.0",
|
|
"expo-keep-awake": "~57.0.1",
|
|
"expo-location": "~57.0.4",
|
|
"expo-media-library": "~57.0.2",
|
|
"expo-sharing": "~57.0.18",
|
|
"expo-status-bar": "~57.0.1",
|
|
"lucide-react-native": "^1.24.0",
|
|
"nativewind": "^4.2.6",
|
|
"react": "19.2.3",
|
|
"react-dom": "19.2.3",
|
|
"react-native": "0.86.0",
|
|
"react-native-nitro-image": "^0.15.2",
|
|
"react-native-nitro-modules": "^0.37.1",
|
|
"react-native-reanimated": "^4.5.0",
|
|
"react-native-safe-area-context": "^5.8.0",
|
|
"react-native-vision-camera": "^5.2.3",
|
|
"react-native-vision-camera-skia": "^5.2.3",
|
|
"react-native-vision-camera-worklets": "^5.2.3",
|
|
"react-native-web": "^0.21.2",
|
|
"tailwindcss": "^3.4.19"
|
|
},
|
|
"devDependencies": {
|
|
"@types/react": "~19.2.2",
|
|
"typescript": "^5.9.3"
|
|
},
|
|
"scripts": {
|
|
"start": "expo start",
|
|
"android": "expo run:android",
|
|
"ios": "expo run:ios",
|
|
"web": "expo start --web",
|
|
"apk:lite": "node tools/set-variant.mjs lite && cd android && gradlew.bat assembleLiteRelease --console=plain",
|
|
"apk:pro": "node tools/set-variant.mjs pro && cd android && gradlew.bat assembleProRelease --console=plain",
|
|
"bundle:lite": "node tools/set-variant.mjs lite && cd android && gradlew.bat bundleLiteRelease --console=plain",
|
|
"bundle:pro": "node tools/set-variant.mjs pro && cd android && gradlew.bat bundleProRelease --console=plain"
|
|
},
|
|
"private": true,
|
|
"allowScripts": {
|
|
"@shopify/react-native-skia@2.6.2": true
|
|
}
|
|
}
|