Commit Graph

662 Commits

Author SHA1 Message Date
Johannes Klein
b9b58bdfc4 Update react-native-reanimated to version 3.16.6 (#2957)
* Use updated version

Version 3.16.0 introduces support for RN 0.76. 3.16.7 introduces support vor RN 0.77 so I decided for 3.16.6 for now.

* Update package-lock.json

* Update Podfile.lock

* Update UploadStatus.test.js.snap

* Comment out snapshot tests

* Comment out snapshot tests
2025-06-16 10:56:52 -07:00
Amanda Bullington
5eb77e91fd Add unit and integration tests around sharing photos (#2948) 2025-06-12 16:00:50 -07:00
Johannes Klein
3faf5e3e29 Update to react-native 0.75 (#2950)
* Update to RN 0.75.5 with upgrade helper diff

* Update .flowconfig

* Update package-lock.json

* Update Gemfile.lock

* Update Podfile.lock

* Update project.pbxproj

* Use double quotes

* Update to RN 0.75.5 with upgrade helper diff

* Update .flowconfig

* Update package-lock.json

* Update Gemfile.lock

* Update Podfile.lock

* Update project.pbxproj

* Use double quotes

* Update Podfile.lock

* Update CustomTabBar.js

* Revert "Update CustomTabBar.js"

This reverts commit 2eb085e3bb.

* Update NavBar. Remove percentage based width as it broke the UI

Now we rely solely on flexbox spacing of justify-around.

* Update FloatingActionButton percentage values

* Update CustomTabBar.test.js.snap
2025-06-12 21:18:28 +02:00
Johannes Klein
4e7322ed3b Update react native gesture handler (#2955)
* Update react-native-gesture-handler

Version 2.18.x introduces support for RN 0.75

* Update package-lock.json

* Update Podfile.lock

* Fix PhotoLibrary tests

* Update jest.setup.js

* Remove time travel calls
2025-06-11 23:24:38 +02:00
Amanda Bullington
3c4ec368f5 Fix: isLoggedIn memory leak (#2952)
* Fix memory leak from isLoggedIn

* Fix tests with mocking for clearAuthCache

---------

Co-authored-by: Johannes Klein <johannes.t.klein@gmail.com>
2025-06-11 10:04:54 -07:00
Johannes Klein
26f0863ec9 Fix: integration tests store setup when changing layout slice (#2932)
* Update MyObservations.test.js

* Remove comment

* Remove unnecessary setState

* Update MyObservationsLocalization.test.js

* Previous change can be more specific

* Update MyObservationsSimple.test.js

* Update AICamera.test.js

* Update Explore.test.js

* Update MyObservations.test.js

* Update ObsEdit.test.js

* Update SoundRecorder.test.js

* Update PhotoImport.test.js

* Update CustomTabBar.test.js

* Update SuggestionsWithUnsyncedObs.test.js

* Update SuggestionsWithSyncedObs.test.js

* Update PhotoDeletion.test.js

* Update Suggestions.test.js

* Update AddObsButton.test.js

* Update MediaViewer.test.js

* Update PhotoLibrary.test.js

* Update StandardCamera.test.js

* Update SimpleUploadBannerContainer.test.js

* This test needs to be in advanced mode

* Remove setState of shownOnce back to default

* Refactor store override calls into a helper function

* Update MyObservationsLocalization.test.js

* Update MyObservationsSimple.test.js

* Update PhotoDeletion.test.js

* Update PhotoImport.test.js

* Update SuggestionsWithSyncedObs.test.js

* Refactor to use helper

* Update SimpleUploadBannerContainer.test.js
2025-06-10 16:10:19 +02:00
Amanda Bullington
bb31c1907b Update react navigation libraries for performance (#2903)
* Update navigators and create util for tabstack navigation

* Changes for react navigation 7

* Refactor to use navigateToTabStack throughout app

* Add comment about unmountOnBlur

* Get all unit tests passing; remove navutils & mock HeaderBackButton

* Fix animation issues in tests

* Temporarily remove parts of tests with back functionality

* Fix tests

* Delete ios/iNaturalistReactNative.xcodeproj/project.pbxproj

* Fix pbxproj

* Code cleanup; minimize unnecessary changes

* Fix tests

* Downgrade react-native-screens to v4.4.0 (#2918)

react-native-screens version 4.5.0 increases the react native version that it supports to 0.74.0+ (https://github.com/software-mansion/react-native-screens/pull/2613/files). So, by using 4.4.0 we are still able to build the app on Android as we are still on 0.73 for now (have tested and it works).
Have not seen any effect on the changes related to the latest react-navigation versions.

* Make requested changes

* Speed up Explore nearby tile loading (#2912)

* Create a performance tracker to show urltile load time in debug mode

* Set default radius to 1km, not 50km

* Code cleanup & TypeScript definitions

* Fix TypeError

* Address eslint error

* Make github actions happy

---------

Co-authored-by: Johannes Klein <johannes.t.klein@gmail.com>

* New Crowdin translations by GitHub Action (#2920)

Co-authored-by: Crowdin Bot <support+bot@crowdin.com>

* MOB-690 - Add error context to 401 errors (#2921)

* MOB-690 - Add error context to 401 errors

* Add Object.defineProperty like in the other error classes

* Add logger line

* Also throw 401 error if the error object has no response property

---------

Co-authored-by: Yaron Budowski <budowski@gmail.com>

* v1.0.4+164

* Rebase with latest version of RN screens. Remove unused code and packages, add eslint package for TS, suppress TS errors (#2924)

* New Crowdin translations by GitHub Action (#2926)

Co-authored-by: Crowdin Bot <support+bot@crowdin.com>

* New Crowdin translations by GitHub Action (#2929)

Co-authored-by: Crowdin Bot <support+bot@crowdin.com>

* Use 3 separate initial routes for tabs; hide animations on drawer screens

* Fix test

---------

Co-authored-by: Johannes Klein <johannes.t.klein@gmail.com>
Co-authored-by: Ken-ichi <kenichi.ueda@gmail.com>
Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
Co-authored-by: Yaron Budowski <budowski@gmail.com>
2025-05-30 09:26:47 -07:00
Amanda Bullington
7f42509797 Add logging to uploads & validate jwts at each upload step (#2923)
* Revalidate jwt token before uploading observation and before attaching media

* Add logging to uploads and jwts

* Make logs more useful, add context and appstate

* Fix inat uploading mocks in tests

* Fix uploader test to reflect errors being thrown
2025-05-29 16:42:34 -07:00
Amanda Bullington
95151e065b Remove unused code and packages, add eslint package for TS, suppress TS errors (#2924) 2025-05-28 17:01:10 -07:00
Johannes Klein
83eed85a74 Update react-native-safe-area-context-to >4.10.1 (#2911)
* Update react-native-safe-area-context-to >4.10.1

Version 4.10.1 adds support for react native 0.74.

* Re-establish mock after it was reset

I think the better way forward would be to restructure these tests, so that we don't need to resetAllMocks in between the two describe blocks, but I don't want to increase the scope of this PR.
2025-05-20 09:50:32 +02:00
Amanda Bullington
47bbcbd18f Maintenance: break upload code into smaller modules -- API calls (#2900)
* Split apart observation & media uploaders & add unit tests

* Use typescript

* Return only media items needed

* Fix tests related to uploading vs. uploaded status

* Remove undefined from union for observationUUID

Above and below in the callstack of those functions the type is only string, so that change seems to be fine for me to make directly on your PR.

* Extract an Operation interface (#2904)

* Type updates

* Update mapped param types

---------

Co-authored-by: Johannes Klein <johannes.t.klein@gmail.com>
2025-05-16 15:19:34 -07:00
Johannes Klein
a20a22bad8 Hide "id with ai button" for no media or sound only (#2896)
* Add Boolean to control button being shown

Same Button component, only with changed indentation

* Apply margin between buttons to hide button instead

* Move left margin to container

Because ID button is now optional but container is not.

* Increase margin between buttons

Not part of the ticket, but it was not according to designs.

* Use existing state for the button

* Update integration test

* Update duplicate testID

* Add unit test for showing button behaviour based on photos
2025-05-16 15:30:06 +02:00
Angie
cd6d6543f1 Add login button where logout button is on menu (#2891)
* Add login button in menu where the logout button is

* Update snapshots

* Changes to fit design
2025-05-14 10:00:04 -07:00
Johannes Klein
85a7385b62 Migrate MatchHeader and imported components/functions to TypeScript (#2890)
* Rename file

* Migrate flow to TS

* Update type

* Update type

* Rename file

* Update useTranslation.ts

* Check if instanceof Error

* Update imports

* Update type

* Rename file

* Migrate translatedRank to TS

* Migrate DisplayTaxonName to TS

* Also accept number for taxonId

* Those types are currently not optional

* Revert "Migrate translatedRank to TS"

This reverts commit c69cc18061.

* Rename taxon.js

* Add interfaces and types

* Remove adding a key to the function param

* Move fetchTaxonAndSave back to original file

* Move interface

* Update import

* Update types

* Rename some variables for clarity

* This is how it currently props down from only HOC

* Update imports

* Rename file

* Add param interface

* Update imports

* Revert "Move fetchTaxonAndSave back to original file"

This reverts commit 981ce228e8.

* Move fetchTaxonAndSave to own file

* Type inference is easiest way for React components

* Rename file

* Remove unused props

* Add types

* Update type

* Infer return type

* Update import

* Add interface

* Rename const and interface

* Update import (Merge conflict)
2025-05-13 11:34:59 +02:00
budowski
4c20939c1a MOB-704 - declutter explore obs grid items (#2889)
* MOB-704 - declutter explore obs grid items

* Code review fixes
2025-05-12 12:17:32 -07:00
Amanda Bullington
f592993889 Maintenance: break upload code into smaller modules -- data transformation (#2884)
* Create module for realm syncing and write unit tests before refactoring

* Refactor realmSync functions for readability & make sure realm errors aren't silently swallowed

* unit tests

* Update tests to use factory functions for media

* Update tests to use factory

* Remove sanitize function since it's redundant with mapping; move mapping & add unit tests

---------

Co-authored-by: Johannes Klein <johannes.t.klein@gmail.com>
2025-05-12 12:16:52 -07:00
Amanda Bullington
6413ddb57f Maintenance: break upload code into smaller modules -- error handling (#2876)
* Create module for realm syncing and write unit tests before refactoring

* Refactor realmSync functions for readability & make sure realm errors aren't silently swallowed

* Move error handling to its own module and add unit tests

---------

Co-authored-by: Johannes Klein <johannes.t.klein@gmail.com>
2025-04-30 13:42:17 +02:00
Amanda Bullington
a4f65a57de Maintenance: break upload code into smaller modules -- progress tracking (#2875)
* Create module for realm syncing and write unit tests before refactoring

* Refactor realmSync functions for readability & make sure realm errors aren't silently swallowed

* Break progress tracking out into module with unit tests
2025-04-30 12:29:30 +02:00
Johannes Klein
3cff7326ae Change calculation of successful upload status stats (#2869)
* Show upload status also if we have no status but an error

E.g. if all uploads fail.

* Change number of successful upploads

Now to use number of attempts made minus number of failed uploads.

* Add unit tests

* Refactor state of successful uploads into store
2025-04-29 12:05:44 -07:00
Johannes Klein
844629bbf4 Revert "Maintenance: break upload code into smaller modules -- realm syncing functions (#2872)"
This reverts commit 43f9520b86.
2025-04-29 16:53:25 +02:00
Amanda Bullington
43f9520b86 Maintenance: break upload code into smaller modules -- realm syncing functions (#2872) 2025-04-29 16:50:02 +02:00
Johannes Klein
d71ab7a358 Copy of: Maintenance: break upload code into smaller modules -- realm syncing functions (#2883)
* Create module for realm syncing and write unit tests before refactoring

* Refactor realmSync functions for readability & make sure realm errors aren't silently swallowed

---------

Co-authored-by: Amanda Bullington <albullington@gmail.com>
2025-04-29 16:48:50 +02:00
Amanda Bullington
b362071b1b Change default explore view to observations map view (#2871)
* Set default explore view to observations

* Rearrange ObservationsViewBar buttons to always show grid first and map first in Explore

* Set initialRegion of Explore map to same zoom level as location picker, using delta

* Consolidate map code into MapView with ref forwarding to allow animation & initialRegion set

* Stop controlling the map region from zustand, since we're using initialRegion

* Make sure we're not double animating when navigating to a new place

* Use ref to only get map boundaries exactly when they're needed, instead of tracking in state

* Make sure current location button does the same as NEARBY button

* Update Explore integration tests to reflect observations view as first view

* Fix navigation Explore tests to reflect landing on observations view

* Update MapView unit tests

* Check location permissions in MapView on current location button

* Code cleanup

* Fix tests and add test for location permissions

* To Mob 720: add some types and null guards (#2878)

* Update Map with Region type

* Type initialRegion

* Guard against null

* Guard against undefined coordinates

* Center loading indicator but not fill space (#2880)

Move the loading indicator to the center of the parent (and back left and top for half its size).

---------

Co-authored-by: Johannes Klein <johannes.t.klein@gmail.com>
2025-04-28 11:53:47 -07:00
budowski
af6ac3694a MOB703 - changes to obs edit screen identification section (#2865)
* MOB703 - changes to obs edit screen identification section

* Adjust size of magnifying glass icon

---------

Co-authored-by: Amanda Bullington <albullington@gmail.com>
2025-04-22 10:03:51 -07:00
Amanda Bullington
043ea1cf46 Fix: prevent multiple taps on Buttons like Suggest Id (#2833)
* Add debounce to Button to make sure users can't double tap any buttons / navigate twice

* Fix tests by mocking the Button component with a quick debounce
2025-04-08 12:46:01 -07:00
Kirk van Gorkom
7d125044a2 Merge pull request #2806 from inaturalist/mob-568-camera-location-fetching-should-happen-when-photo-taken-not-1
Fetch accurate camera location when shutter button / checkmark pressed
2025-04-04 18:06:27 -07:00
Ken-ichi
f8d86eea1c New Crowdin Translations (#2819)
* New Crowdin translations by GitHub Action

* test: handle multiple matches for localized text in Settings test

---------

Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
2025-04-01 13:00:34 -07:00
Amanda Bullington
e5aa89815a Merge branch 'main' into mob-568-camera-location-fetching-should-happen-when-photo-taken-not-1 2025-03-31 13:14:01 -07:00
Johannes Klein
73b7c3282b Navigate based on setting in both cameras (#2814)
* Navigate based on setting in both cameras

* Update SuggestionsWithUnsyncedObs.test.js

* Update Suggestions.test.js

* Update AICamera.test.js
2025-03-31 11:59:55 -07:00
Amanda Bullington
915a2dd40f Fixes for e2e tests? 2025-03-31 10:48:21 -07:00
Angie
548288c283 Change explore icon to magnifying glass (#2807)
* Replace change explore icon to magnifying glass

* Update snapshot
2025-03-27 18:15:34 -07:00
Amanda Bullington
0c033a6f6b Change mocks from useWatchPosition to fetchAccurateUserLocation 2025-03-27 14:32:29 -07:00
Amanda Bullington
213dc19dd0 Fetch location when observation processed; fetch separate location for geomodel without watch 2025-03-27 13:25:09 -07:00
Amanda Bullington
d782538109 Advanced settings UI updates (#2797)
* Open more options on long press

* Add tests for long press

* Rearranging Settings screen with new layout

* Add toggle for advanced settings in layout slice; fix default mode toggle

* Update settings with navigation flows

* Fix tests

* Change power mode switch for e2e test

* Fix settings test for green button toggle

* Fix advanced user toggle in e2e test (which hides pivot cards)

* Changes based on design convo; test fixes

* Fix e2e tests

* Follow user flow chart and update nav accordingly

* Rename function

* Fix test

* Can be null so check for false only

* Little less spacing between radio button rows

* Minor UI updates

* Remove check for previous setting in UI

* This is no longer used anywhere

* Update AICamera.test.js

* Update AICamera.test.js

* Update AICamera.test.js

* Update Suggestions.test.js

* Update Settings.test.js

* Update LanguageSettings.test.js

---------

Co-authored-by: Johannes Klein <johannes.t.klein@gmail.com>
2025-03-27 17:36:36 +01:00
Amanda Bullington
7733ededfb Carousel, Permission, Match, Login, AI Camera copy edits (#2802)
* Text updates and AICamera icon update for onboarding carousel

* Update background image camera permission

* Update text for permission gates

* Update text match screen, login signup, and camera

* Fix AICamera test
2025-03-25 16:18:39 -07:00
Amanda Bullington
be53f87537 Add long press to AICamera gradient button in default/advanced (#2793)
* Open more options on long press

* Add tests for long press
2025-03-24 12:33:57 -07:00
Amanda Bullington
70ffa9112a Make MyObservationsSimple the standard UI across default/advanced mode (#2788)
* Update TypeScript

* Fix some tests with new default MyObservationsSimple

* Show upload toolbar on MyObs advanced

* Update tests for simple mode

* Fix deletions popping back up on MyObs

* Fix e2e test, which also means fixing our deletion process

* Fix useSyncObservations test

* Requested changes to better fit latest designs

* Add tests to check for hidden upload banner
2025-03-20 17:04:31 -07:00
Johannes Klein
57dc1d226e Revert "Add a plus icon button to add all observation types to default mode header (#2734)" (#2754)
This reverts commit 37a9f6d58b.
2025-03-15 10:18:40 +01:00
Amanda Bullington
bcec8fc73c Store local taxon name preferences & update when online (#2762)
* Use work queue to store local taxon name preferences & update when user goes online

* Do less updating on Settings screen

* Add logging to make sure taxon names are set correctly

* Test for TaxonNamesSettings
2025-03-14 18:09:52 -07:00
Johannes Klein
e4e6baee1d Override show suggestions screen to always get there from AI camera (#2767)
* Override show suggestions screen to always get there from AI camera

* Update AICamera.test.js
2025-03-14 13:03:07 +01:00
Amanda Bullington
2be121d1a8 Fade out MyObs checkmark without fading into ObsStatus (#2763)
* Don't fade into ObsStatus in MyObservations

* Update snapshot
2025-03-13 18:33:17 -07:00
Johannes Klein
69ada0812a Make app default to the suggestions-first mode (#2753)
* Move button to top

* Defaults to use suggestions as first screen

* Update tests
2025-03-13 09:40:45 +01:00
Johannes Klein
e5bbd6b873 Do not upload observations that have missing location or date when in default mode (#2750)
* Prop number in from direct and single HOC

* Prop num in from even higher

* Calculate number of unuploaded obs with missing basics

* Only show upload indicators when number of obs without missing basics is positive

* Send obs uuids with missing basics to button press handler

* Instead of reacting in useEffect call syncManually explicitly

* Accept array of uuids to skip and pass on to startUploadObservations

* If param given do not include some uuids when building upload queue

* Remove test

* Change param interface to options object

* Destructure only if param given
2025-03-12 16:18:37 -07:00
Amanda Bullington
d4d29b3aa8 Fix icons for dropdown carets in ObsEdit (#2748)
* Add icon

* Add icon

* Add icon

* Fix triangle dropdowns on ObsEdit other data section

* Update snapshots
2025-03-12 14:53:45 -07:00
Amanda Bullington
9b1275a6eb Use fixed header in ObsDetails advanced mode (#2741)
* Use fixed header on ObsDetails advanced mode

* Remove test for removed component - using react navigation header instead

* Remove tests related to ObsDetails header icon; using react navigation

* Add testID to react navigation level back button and fix e2e

* Terminate app after every e2e test and maybe help flakiness

* Rework termination of app

---------

Co-authored-by: Johannes Klein <johannes.t.klein@gmail.com>
2025-03-12 10:38:35 +01:00
Johannes Klein
eaed9ada59 Only add zoom options if camera device has the actual physical devices (#2737)
* Only add zoom options if camera device has the actual physical devices

* Fix mock

* Add mocks to unit test

* Revert "Add mocks to unit test"

This reverts commit 0738d2b115.

* Optional chaining
2025-03-10 14:04:58 +01:00
Johannes Klein
37a9f6d58b Add a plus icon button to add all observation types to default mode header (#2734)
* AddObsButton TS

* Add simple plus icon version of the AddObsButton to my obs list header

* Update imports
2025-03-10 11:52:00 +01:00
Johannes Klein
15c1946b71 Use default mode from first app install (#2733)
* Default mode used on app install

* Update integration tests
2025-03-10 09:47:47 +01:00
Johannes Klein
d1398a4d29 Add UI for match screen not identifying (#2728)
* Alternative return for match screen in absence of suggestion

* Add lower part text elements

* Add margin at bottom

* Copy code to make a new suggestions scrll for iconic taxa

* Removing not needed properties of the copied code

* Remove log

* Remove width constraints

* Add a state to track selected iconic taxon

* Comment and code style

* Pass prop down to taxa scroll

* Use new props in iconic taxa scroll

* Color border according to selected state

* Use iconic taxon as top ID if none given

* Remove testing code

* Update Match.test.js
2025-03-07 19:42:38 +01:00
Johannes Klein
626fbfd94f Full screen loading state on match screen (#2717)
* Build UI for loading state between AI->Match

* Make designs for AI loading screen match Figma

* Selective changes from bf872e2d4f

* Selective changes from 9ed81f99c7

* Selective changes from 4bc7c3474f

* Selective changes from 4916cf70fb

* Replace loading state from store with props

* Add some types

* Make component agnostic of what skipping does

* Remove debug info

* Add more debug data

* Elongate loading state if online errors out and offline is still loading in sequence

* Remove underline

This classname had no effect as far as I can tell.

* Hide skip button when it has no function

* Remove a comment that slipped through partial cherry-picking

* Split apart online and offline fetch status

Weird but even though they start in sequence it happened to me that online error was received after offline was fetched successfully. So, Let's split apart online and offline loading state.

---------

Co-authored-by: Amanda Bullington <albullington@gmail.com>
2025-03-07 11:50:49 +01:00