Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
9c7dcd5
migrate to Expo 55
SteRiccio Apr 2, 2026
fbadee2
fixing app config
SteRiccio Apr 2, 2026
245f039
fixing app config
SteRiccio Apr 3, 2026
af50ca4
Merge branch 'master' of https://github.com/openforis/arena-mobile in…
SteRiccio Apr 5, 2026
5364fa1
Merge branch 'feat/geo-experiments' of https://github.com/openforis/a…
SteRiccio Apr 5, 2026
fcb0837
fixing app.config
SteRiccio Apr 6, 2026
9aa28a1
Merge branch 'master' of https://github.com/openforis/arena-mobile in…
SteRiccio Apr 9, 2026
cb37861
updated build number
SteRiccio Apr 9, 2026
586eb42
code cleanup
SteRiccio Apr 9, 2026
8118da0
Merge branch 'master' of https://github.com/openforis/arena-mobile in…
SteRiccio Apr 21, 2026
129997f
update dependencies
SteRiccio May 4, 2026
5ea7e44
Merge branch 'master' of https://github.com/openforis/arena-mobile in…
SteRiccio May 5, 2026
0773f19
fixed app config
SteRiccio May 5, 2026
95fc1ad
github actions: use jdk 21
SteRiccio May 5, 2026
ab5f84c
trying to fix apk build
SteRiccio May 5, 2026
c4a6cd7
revert react-native-zip-archive
SteRiccio May 5, 2026
38fca53
reverted react-native-zip-archive
SteRiccio May 5, 2026
a60ee51
code cleanup
SteRiccio May 7, 2026
7b3b9c2
Merge branch 'master' of https://github.com/openforis/arena-mobile in…
SteRiccio Jun 12, 2026
e44c4cb
migrate to expo 56
SteRiccio Jun 12, 2026
1235c0e
migrate to latest yarn version
SteRiccio Jun 12, 2026
9d4bce1
fixing maestro tests
SteRiccio Jun 12, 2026
35b7f6c
Revert "fixing maestro tests"
SteRiccio Jun 13, 2026
5b70560
Revert "migrate to latest yarn version"
SteRiccio Jun 13, 2026
10edf53
Fix Maestro Android CI build by skipping Gradle clean
Copilot Jun 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions .claude/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"permissions": {
"allow": [
"Bash(python3 -c \"import sys,json; d=json.load\\(sys.stdin\\); print\\(json.dumps\\(d.get\\('expo', {}\\), indent=2\\)\\)\")",
"Bash(yarn add *)",
"Bash(npm view *)",
"Bash(node -e \"const expo = require\\('/home/stefano/dev/projects/openforis/arena-mobile/node_modules/expo/config'\\); console.log\\(Object.keys\\(expo\\)\\)\")",
"Bash(python3 -c \"import sys,json; v=json.load\\(sys.stdin\\); print\\([x for x in v if x.startswith\\('10.'\\)][-5:]\\)\")",
"Bash(python3 -c \"import sys,json; v=json.load\\(sys.stdin\\); print\\(v[-5:]\\)\")",
"Bash(python3 -c \"import sys,json; d=json.load\\(sys.stdin\\); print\\(d.get\\('version'\\)\\)\")",
"Bash(node -e \"const s = require\\('/home/stefano/dev/projects/openforis/arena-mobile/node_modules/eslint/node_modules/eslint-scope/lib/scope-manager.js'\\); const sm = s.create\\({scopeToGenerate: []}\\); console.log\\(typeof sm.addGlobals\\)\")"
]
}
}
6 changes: 3 additions & 3 deletions .github/workflows/e2e-maestro-android.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,10 @@ jobs:
echo "$HOME/.maestro/bin" >> $GITHUB_PATH

# Build the APK FIRST (No emulator yet)
- name: Set up JDK 17
- name: Set up JDK
uses: actions/setup-java@v4
with:
java-version: "17"
java-version: "21"
distribution: "temurin"
cache: "gradle"

Expand All @@ -47,7 +47,7 @@ jobs:
id: cache-android-prebuild
with:
path: android/
key: android-prebuild-${{ hashFiles('package.json', 'yarn.lock', 'app.json', 'app.config.ts') }}
key: android-prebuild-${{ hashFiles('package.json', 'yarn.lock', 'app.config.ts') }}

- name: Build Android APK
run: |
Expand Down
Binary file modified .yarn/install-state.gz
Binary file not shown.
16 changes: 10 additions & 6 deletions app.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,15 @@ const basePlugins: ExpoConfig["plugins"] = [
[
"expo-build-properties",
{
ios: { deploymentTarget: "15.5" },
ios: { deploymentTarget: "16.4" },
},
],
[
"expo-splash-screen",
{
image: "./assets/splash.png",
resizeMode: "contain",
backgroundColor: "#ffffff",
},
],
[
Expand All @@ -30,6 +38,7 @@ const basePlugins: ExpoConfig["plugins"] = [
"expo-audio",
"expo-localization",
"expo-secure-store",
"expo-sharing",
"expo-sqlite",
"expo-web-browser",
"@react-native-community/datetimepicker",
Expand All @@ -48,11 +57,6 @@ const config = (): ExpoConfig => {
version: appVersion,
icon: "./assets/logo/icon_with_margin.png",
userInterfaceStyle: "automatic",
splash: {
image: "./assets/splash.png",
resizeMode: "contain",
backgroundColor: "#ffffff",
},
updates: {
fallbackToCacheTimeout: 0,
},
Expand Down
8 changes: 5 additions & 3 deletions eslint.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,15 @@ import js from "@eslint/js";
import reactPlugin from "eslint-plugin-react";
import reactHooksPlugin from "eslint-plugin-react-hooks";
import { fixupPluginRules } from "@eslint/compat";
import babelParser from "@babel/eslint-parser";

export default [
{
...js.configs.recommended,
files: ["**/*.js", "**/*.mjs", "**/*.jsx", "**/*.ts", "**/*.tsx"],
files: ["**/*.js", "**/*.mjs", "**/*.jsx"],
languageOptions: {
parser: babelParser,
parserOptions: {
ecmaFeatures: { jsx: true },
},
},
plugins: {
react: reactPlugin,
Expand All @@ -22,6 +23,7 @@ export default [
"react/react-in-jsx-scope": "off",
},
settings: {
react: { version: "19" },
"import/resolver": {
node: {
paths: ["src"],
Expand Down
140 changes: 73 additions & 67 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,106 +17,112 @@
"e2e:maestro:android": "yarn e2e:prepare:android && yarn e2e:maestro -e APP_ID=org.openforis.arena_mobile"
},
"dependencies": {
"@lodev09/react-native-exify": "^0.2.7",
"@openforis/arena-core": "^1.2.7",
"@react-native-async-storage/async-storage": "2.2.0",
"@lodev09/react-native-exify": "^1.0.3",
"@openforis/arena-core": "^1.3.0",
"@react-native-async-storage/async-storage": "3.1.1",
"@react-native-clipboard/clipboard": "^1.16.3",
"@react-native-community/datetimepicker": "8.4.4",
"@react-native-community/netinfo": "11.4.1",
"@react-native-community/slider": "5.0.1",
"@react-navigation/native": "^7.1.28",
"@react-navigation/native-stack": "^7.13.0",
"@reduxjs/toolkit": "^2.11.2",
"@shopify/flash-list": "2.0.2",
"@react-native-community/datetimepicker": "9.1.0",
"@react-native-community/netinfo": "12.0.1",
"@react-native-community/slider": "5.2.0",
"@react-native-vector-icons/material-design-icons": "^13.1.1",
"@react-navigation/native": "^7.3.1",
"@react-navigation/native-stack": "^7.17.3",
"@reduxjs/toolkit": "^2.12.0",
"@shopify/flash-list": "2.3.2",
"@types/lodash": "^4.17.24",
"@types/lodash.debounce": "^4.0.9",
"@types/lodash.throttle": "^4.1.9",
"axios": "^1.13.5",
"axios": "^1.17.0",
"events": "^3.3.0",
"expo": "~54.0.35",
"expo-application": "~7.0.8",
"expo-asset": "~12.0.13",
"expo-audio": "~1.1.1",
"expo-battery": "~10.0.8",
"expo-build-properties": "~1.0.10",
"expo-camera": "~17.0.10",
"expo-constants": "~18.0.13",
"expo-crypto": "~15.0.9",
"expo-device": "~8.0.10",
"expo-document-picker": "~14.0.8",
"expo-file-system": "~19.0.23",
"expo-image-manipulator": "~14.0.8",
"expo-image-picker": "~17.0.11",
"expo-intent-launcher": "~13.0.8",
"expo-localization": "~17.0.9",
"expo-location": "~19.0.8",
"expo-screen-orientation": "~9.0.9",
"expo-secure-store": "~15.0.8",
"expo-sensors": "~15.0.8",
"expo-sharing": "~14.0.8",
"expo-sqlite": "~16.0.10",
"expo-status-bar": "~3.0.9",
"expo-web-browser": "~15.0.11",
"i18next": "^25.8.13",
"expo": "^56.0.0",
"expo-application": "~56.0.3",
"expo-asset": "~56.0.17",
"expo-audio": "~56.0.12",
"expo-battery": "~56.0.4",
"expo-build-properties": "~56.0.18",
"expo-camera": "~56.0.8",
"expo-constants": "~56.0.18",
"expo-crypto": "~56.0.4",
"expo-device": "~56.0.4",
"expo-document-picker": "~56.0.4",
"expo-file-system": "~56.0.8",
"expo-image-manipulator": "~56.0.18",
"expo-image-picker": "~56.0.17",
"expo-intent-launcher": "~56.0.4",
"expo-localization": "~56.0.6",
"expo-location": "~56.0.17",
"expo-screen-orientation": "~56.0.5",
"expo-secure-store": "~56.0.4",
"expo-sensors": "~56.0.6",
"expo-sharing": "~56.0.17",
"expo-splash-screen": "~56.0.10",
"expo-sqlite": "~56.0.5",
"expo-status-bar": "~56.0.4",
"expo-web-browser": "~56.0.5",
"i18next": "^26.3.1",
"lz-string": "^1.5.0",
"mime": "^4.1.0",
"react": "19.1.0",
"react-dom": "19.1.0",
"react-i18next": "^16.5.4",
"react-native": "0.81.5",
"react": "19.2.3",
"react-dom": "19.2.3",
"react-i18next": "^17.0.8",
"react-native": "0.85.3",
"react-native-check-version": "^1.4.0",
"react-native-collapsible": "^1.6.2",
"react-native-device-info": "^15.0.2",
"react-native-dots-pagination": "^0.3.1",
"react-native-error-boundary": "^3.1.0",
"react-native-keyboard-controller": "1.18.5",
"react-native-keyboard-controller": "1.21.6",
"react-native-keychain": "^10.0.0",
"react-native-logs": "^5.6.0",
"react-native-maps": "1.20.1",
"react-native-maps": "^1.27.2",
"react-native-markdown-display": "^7.0.2",
"react-native-modal-datetime-picker": "^18.0.0",
"react-native-open-maps": "^0.4.3",
"react-native-pager-view": "6.9.1",
"react-native-paper": "^5.15.0",
"react-native-pager-view": "8.0.1",
"react-native-paper": "^5.15.1",
"react-native-paper-dropdown": "^1.0.7",
"react-native-reanimated": "~4.1.1",
"react-native-safe-area-context": "~5.6.2",
"react-native-screens": "~4.16.0",
"react-native-reanimated": "4.3.1",
"react-native-safe-area-context": "~5.7.0",
"react-native-screens": "4.25.2",
"react-native-side-drawer": "^2.1.0",
"react-native-svg": "15.12.1",
"react-native-svg": "15.15.4",
"react-native-system-navigation-bar": "^2.8.0",
"react-native-tree-multi-select": "^2.0.20",
"react-native-vector-icons": "^10.3.0",
"react-native-version-number": "^0.3.6",
"react-native-view-more-text": "^2.2.0",
"react-native-web": "^0.21.2",
"react-native-worklets": "0.5.1",
"react-native-zip-archive": "^7.0.2",
"react-redux": "^9.2.0",
"react-native-worklets": "0.8.3",
"react-native-zip-archive": "~8.0.1",
"react-redux": "^9.3.0",
"redux": "^5.0.1",
"rn-swipe-button": "^3.0.1",
"socket.io-client": "^4.8.3"
},
"devDependencies": {
"@babel/core": "^7.29.0",
"@babel/eslint-parser": "^7.28.6",
"@eslint/compat": "^2.0.2",
"@eslint/eslintrc": "^3.3.3",
"@eslint/js": "^9.39.3",
"@react-native/eslint-config": "^0.83.2",
"@types/jest": "29.5.14",
"@types/node": "^25.5.2",
"@types/react": "~19.1.17",
"@types/react-native": "^0.73.0",
"@babel/core": "^7.29.7",
"@babel/eslint-parser": "^7.29.7",
"@eslint/compat": "^2.1.0",
"@eslint/eslintrc": "^3.3.5",
"@eslint/js": "^10.0.1",
"@react-native/eslint-config": "^0.86.0",
"@types/color": "^4.2.1",
"@types/jest": "30.0.0",
"@types/node": "^25.9.3",
"@types/react": "^19.2.17",
"@types/react-native-vector-icons": "^6.4.18",
"@types/react-test-renderer": "^19.1.0",
"babel-plugin-module-resolver": "^5.0.2",
"babel-plugin-module-resolver": "^5.0.3",
"babel-plugin-transform-remove-strict-mode": "^0.0.2",
"dotenv": "^17.3.1",
"eslint": "^9.39.3",
"dotenv": "^17.4.2",
"eslint": "10.3.0",
"eslint-plugin-ft-flow": "^3.0.11",
"eslint-plugin-react": "^7.37.5",
"eslint-plugin-react-native": "^5.0.0",
"jest": "~29.7.0",
"jest": "~30.4.2",
"metro-react-native-babel-preset": "^0.77.0",
"prettier": "^3.8.1",
"typescript": "^5.9.3"
"prettier": "^3.8.4",
"typescript": "~6.0.3"
},
"private": true,
"packageManager": "yarn@4.16.0"
Expand Down
6 changes: 3 additions & 3 deletions src/components/Dropdown.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ export const Dropdown = (props: DropdownProps) => {
value: itemKeyExtractor(item),
label: t(itemLabelExtractor(item)),
}),
[itemKeyExtractor, itemLabelExtractor, t]
[itemKeyExtractor, itemLabelExtractor, t],
);

const options = useMemo(() => items.map(itemToOption), [itemToOption, items]);
Expand All @@ -64,7 +64,7 @@ export const Dropdown = (props: DropdownProps) => {
if (disabled) return;
await onChange?.(val);
},
[disabled, onChange]
[disabled, onChange],
);

const dropDownItemTextStyle = useMemo(() => {
Expand All @@ -78,7 +78,7 @@ export const Dropdown = (props: DropdownProps) => {

const dropDownItemStyle = useMemo(
() => ({ backgroundColor: theme.colors.surfaceVariant }),
[theme]
[theme],
);

return (
Expand Down
2 changes: 1 addition & 1 deletion src/components/QrScannerModal/QrScannerOverlay.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ export const QrScannerOverlay = () => {

const styles = StyleSheet.create({
cornerLayer: {
...StyleSheet.absoluteFillObject,
...StyleSheet.absoluteFill,
justifyContent: "center",
alignItems: "center",
// Ensure the corners don't block touch events if you add buttons later
Expand Down
2 changes: 1 addition & 1 deletion src/components/QrScannerModal/styles.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ export default StyleSheet.create({
justifyContent: "center",
},
camera: {
...StyleSheet.absoluteFillObject,
...StyleSheet.absoluteFill,
},
instructionsContainer: {
position: "absolute",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ export const AccuracyCircle = ({ size, accuracy }: AccuracyCircleProps) => {

return (
<View
style={[StyleSheet.absoluteFillObject, { width: size, height: size }]}
style={[StyleSheet.absoluteFill, { width: size, height: size }]}
>
<Svg width={size} height={size}>
<Circle
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ type CenterCrossProps = {
export const CenterCross = ({ size }: CenterCrossProps) => (
<View
style={[
StyleSheet.absoluteFillObject,
StyleSheet.absoluteFill,
styles.container,
]}
>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -244,7 +244,7 @@ export const CompassRose = (props: CompassRoseProps) => {
const topTriPoints = `${cx - triHalfW},${triPad} ${cx + triHalfW},${triPad} ${cx},${triPad + triHeight}`;
const botTriPoints = `${cx - triHalfW},${size - triPad} ${cx + triHalfW},${size - triPad} ${cx},${size - triPad - triHeight}`;

const absoluteFill = StyleSheet.absoluteFillObject;
const absoluteFill = StyleSheet.absoluteFill;
const layerStyle = [absoluteFill, { width: size, height: size }];

return (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ export const NavigatorArrow = ({
return (
<Animated.View
style={[
StyleSheet.absoluteFillObject,
StyleSheet.absoluteFill,
{ width: size, height: size },
arrowRotStyle,
]}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ export const TargetPointDot = ({
const dotY = cy - dotRadius * Math.cos(rad);

return (
<View style={[StyleSheet.absoluteFillObject, { width: size, height: size }]}>
<View style={[StyleSheet.absoluteFill, { width: size, height: size }]}>
<View
style={{
position: "absolute",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { StyleSheet } from "react-native";

export const loadingOverlayAbsoluteStyle = StyleSheet.flatten([
StyleSheet.absoluteFillObject,
StyleSheet.absoluteFill,
{ justifyContent: "center" as const, alignItems: "center" as const },
]);

Expand Down
6 changes: 5 additions & 1 deletion src/screens/RecordsList/RecordsDataVisualizer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -75,11 +75,15 @@ const recordLoadStatusCellRendererByViewMode: Record<ScreenViewMode, any> = {
),
};

const LoadingIconCellRenderer = (_props: DataVisualizerCellProps) => (
<LoadingIcon />
);

const getSyncStatusCellRenderer = ({
syncStatusLoading,
}: {
syncStatusLoading?: boolean;
}) => (syncStatusLoading ? LoadingIcon : RecordSyncStatusIcon);
}) => (syncStatusLoading ? LoadingIconCellRenderer : RecordSyncStatusIcon);

const RecordErrorsListCellRenderer = ({ item }: DataVisualizerCellProps) => (
<Text>{Validations.getErrorsCount(item.validation)}</Text>
Expand Down
Loading
Loading