* Write some failing navigation tests for MyObs navigation
* Add one more failing test to check for empty screen after all obs are deleted
* Update what happens on blur
* Changes to focus effect
* Revert "Changes to focus effect"
This reverts commit c779504cdf.
* Test: toolbar status reset when user leaves screen
* Unmock useFocusEffect in Jest; fix tests
* Minor nav mocking updates
* Fix import
* Customize back button; move icon assets into our image dir
* Fix ContextHeader with updated back button
* Fix styling around back buttons
* Fix taxon details header
* Test fix
* Fix signed in e2e test
* Refactor to use watchPosition
* Update useWatchPosition with permissions/retry
* Replace useUserLocation with useWatchPosition and fix tests; return userLocation from watch position hook
* Only update observation keys when there's an observation
* Improve TypeScript definitions
* Revert TypeScript commit
* Revert "Only update observation keys when there's an observation"
This reverts commit a4cd17a513.
* Code cleanup: make useWatchPosition more modular
* Code cleanup; location permission in ObsEdit instead of subcomponent
* Use correct accuracy in Camera photos
* Camera fixes
* Fixes to watching position in ObsEdit
* Fix useWatchPosition tests
* Fix tests
* Make sure state updates when renavigating to OsEdit; test fixes
* Fetch location continuously in cameras until accuracy falls below threshold
* Unit test for useUserLocation
* Added untilAcc option to useUserLocation
* Bugfix: ObsEdit was not always fetching location for new camera photos
Closes#1340
* Refactor upload code into hook and zustand slice
* Create a single source of truth for toolbar and individual progress
* Fix unit tests
* Fix more tests
* Continue trying to simplify upload progress and status code
* Continued overhaul of upload code
* Fix exclamation point in Toolbar
* Fix total toolbar progress
* Fix tests
* Update snapshots
* Code cleanup
* Update MyObs test
* Fix most tests by not deleting realm
* Keep attempting to make toolbar text clear in subsequent tests
* Delete photos from observation; allow upload once photos deleted; closes#1575
* Only pass photo uri into evidence list; fix test
* Fix merge
* Refactor upload code into hook and zustand slice
* Create a single source of truth for toolbar and individual progress
* Fix unit tests
* Fix more tests
* Continue trying to simplify upload progress and status code
* Continued overhaul of upload code
* Fix exclamation point in Toolbar
* Fix total toolbar progress
* Fix tests
* Update snapshots
* Code cleanup
* Update MyObs test
* Fix most tests by not deleting realm
* Keep attempting to make toolbar text clear in subsequent tests
* Mock Zustand and reset state after all tests
In theory this should make testing with Zustand simpler. The real kicker is
that resetting state will fail if we're not careful about manually replacing
nested objects in Zustand state updates.
* Bugfix: removeAllFilesFromDirectory works with File objects, not raw paths
* Update status text when uploads canceled
* Only show red exclamation rotating icon after all uploads attempted
* Fix progress bar with zustand nested object
* Fix toolbar progress
---------
Co-authored-by: Ken-ichi Ueda <kenichi.ueda@gmail.com>
* Add a safeRealmWrite transaction for better logging around writes; code cleanup and realm update
* Add safeRealmWrite to tests and make sure action is called synchronously
* Fix final test
* Only write to realm when useObservationsUpdates data changes; code cleanup
* Code cleanup
* Delete local & remote observations on MyObs; show progress
* Update tests & add test for delete hook
* Fix test failures
* Add tests for deletion strings in Toolbar; add test for multiple deletion
* Clear deletion text on toolbar when user navigates away from MyObs
* Add a check in e2e test to make sure observation was deleted
* #856 - support for modifying and updating observation photos locally/remotely; reordering of photos fix
* ESLint fix
* Fixed tests
* Fixed tests
* Fixes related to tests
* Bugfix: TaxonDetails was crashing if it received a null taxon
* Send lat and lng instead of latitude and longitude to the score_image
endpoint
* Show offline suggestions when you are offline
* Show notice when viewing offline suggestions
* Moved code unique to useOnlineSuggestions into that file
* Ensure we use a medium size image to get suggestions when dealing with
remote URLs
* More logging around React Query retries
* Use default retry logic for useAuthenticatedQuery
* Made a module-resolver shortcut for tests
* Move offline notice above top suggestion; hide when offlines exist but onlines do too
* Access MediaViewer from TaxonDetails
* Added our own presets for ActivityIndicator
* TaxonDetail should show a local taxon if one is available
* Made it a little easier to import the custom logger
* Refactored MediaViewer to accept photo-like objects instead of URIs
* Added license / attribution button to MediaViewer
* Moved delete button into MainPhotoDisplay so each photo has its own button
and it can be laid out relative to its photo
* Add custom header to MediaViewer when accessed from TaxonDetial
* Allow DisplayTaxonName to accept custom text components as props
* Added darker bg to photo on TaxonDetail to make title more legible
* Show edit title; add tests; set current obs before nav to ObsEdit screen
* Use edit title when obs is not synced; rewrite ObsEdit tests to show nav works correctly with useStore
* Remove uuid in params to ObsEdit; no longer needed
* Fix e2e by ensuring ObsEdit doesn't rerender with deleted obs
* Use offline model for displaying sugggestions
* Simplify Suggestions/TaxonSearch screens using hooks
* Use updateObsKeys function from useStore
* Simplify code and fix unit tests
* Fix tests for offline predictions
* Fix faker urls
* Fetch remote taxa to display taxon photos in Suggestions
* Fix useTaxon code and test
* Use online vision results as backup for offline results
* Fix tests and add test for online predictions
* Use Flatlist for Suggestions and fix tests
* Move API call out of Attribution and fix test
* Fix tests
* Fix test warnings
* Add zustand to app
* Begin replacing ObsEditProvider with zustand for global state
* Use store and add tests
* Fix bugs
* Add test to check for deleted photos in StandardCamera
* Make sure evidence is only added to current observation; submit comment with ID on ObsDetail
* Fix ObsEditWithoutProvider tests
* Move store to where it's needed
* Fix tests
* Await evidence being added to obsPhotos from camera
* Add a note about slices to useStore
* Update to realm 12
* Remove unused mocks to fix some tests
* Fix test by unmocking ObsEditProvider
* Fix more tests by removing mocks/changing when tests write to realm
* Remove mocks on ObsEdit component test and fix accessibility labels
* Fix hooks tests with realm
* Set test path for realm; finish fixing tests
* Small tweak
* Upgrade realm/react library
* Migrate schema
* Simplify ObsEditProvider by moving functions into local state & calling reducer less frequently
* Fix delete all observations
* Fixes
* Move index selection to MediaViewer via params
* Access ObsEditContext on top level of ObsEdit and pass props
* Move context to top level screen components
* Fix tests
* Use waitFor to fix ObsDetails integration test
* Alphabetize props; remove realm check; refactor new Id method
---------
Co-authored-by: Ken-ichi Ueda <kenichi.ueda@gmail.com>
* Remove console statements in production build
* Move uploadReducer into separate file
* Create reducer for creating obs; combine reducers
* Fixes with createObsReducer
* Move album, passes test states out of global context
* Bug fixes for ObsEdit flow
* Create photo gallery container
* Set accessibility test todo for PhotoGallery
* Improve FlashList performance MyObs
* Prevent flicker on modal close
* Create less rerenders in MyObservations
* Memoize drawer items for less rerendering
* Memoize custom tab bar
* Remove unused libraries and update snapshot
* Fix and prune dependencies
* Add AddObsModal tests
* Fix e2e test android by making comment confirm button visible
Primarily adds designed layouts for permission gates (also referred to as permissions priming).
* moved permission gate business logic into a container
* use react-native-permissions exclusively
* Show PermissionGate as a modal
* Basic unit tests for PermissionGate
* Consistent content width on tablet, other minor style changes
* Allow PermissionGate to be used outside of nav hierarchy
* Use user location on Explore after getting permission
* Remove redundant 'always' location perm in ios
* Isolate current location button in the Map component, which uses location fetching functionality from react-native-maps instead of our own
* Updated cocoapods; matched INatIcon.ttf to sha1 hashes
* Use drag and drop to let a user change photo positions
* Fix tests
* Add test for EvidenceList
* Fix tests
* Fix state for no evidence / no observation photos
* Add unit tests for empty list and displaying obs photos
* Move login and camera screens into stack navigators
* Navigation fixes
* Create ObservationsStackNavigator
* Move drawer items into drawer nav
* Navigator fixes and improvements
* Nav improvements
* Fix navigation from ObsEdit
* Fix test
* Fix test
* Redo bottom tab nav with Explore as part of ObservationsStack
* Use ObsEdit and AddID in two stacks
* Move identify into ObservationsStack and fix headers
* Fix ObsEdit bottom button issue by using fixed positioning for tab bar
That required a few other changes to places where we were explicitly
compensating for the height of the tab bar. Also fixed some other minor
layout issues.
* Typo
* Add LocationPicker to ObservationsStackNavigator
---------
Co-authored-by: Ken-ichi Ueda <kenichi.ueda@gmail.com>
* Make minimum viable RemoteComment
* Minimum vialbe RemoteIdentification
* Minimum viable remote project, place, and messages
* Create minimum viable records for all remote factories
* Remove factories for local device data
* Minimum viable local taxon, comment, id
* Minimum viable for local observation photo (photo has no primary key)
* Minimum viable LocalUser
* Minimum viable record for LocalObservation
* Ensure layout of the PhotoCarousel photos doesn't change in delete mode
* Stop conflating screen-size layout differences with tablet layout differences
* Bugfix: deleting one photo in the StandardCamera removed all photos
* Animated rotation of rotatable elements on StandardCamera
* Ensure loading status shows while first photo is being taken
* Tried to remove some open handles and shore up some unhappy tests
* Make MediaViewer a navigation screen; support changing landscape/portrait orientations
* Move device orientation into hook
* Minor fixes to styling
* Styling updates based on breakpoints
* Add KebabMenu to shared components index
* Separate EvidenceList from PhotoCarousel component
* Remove unneeded props from PhotoCarousel
* Create notes bottom sheet
* Fix tests for delete obs sheet
* Add wild status sheet
* Show date from observations uploaded via website
* Move media viewer modal into evidence section
* Fix mock
* Move location fetching into its own hook
* Refactor ObsEdit header; move code into Header component
* Add discard changes sheet
* Styling updates and save changes button
* Add classes to buttons based on evidence/id missing
* Add imprecise location sheet
* Add jest.fn from provider to ObsEdit tests
* Remove fakeTimers from ObsEditWithoutProvider.test.js; minor cleanup
* Show discard obs sheet anytime a user tries to navigate back
* Fixes to bottom sheet backdrop, evidence, add discard changes sheet
* Switch to paper radio buttons instead of checkmarks
* Fix bottom sheet backdrop in android by wrapping with GestureHandlerRootView
* Update bottom sheet for add comment & notes
* Fix test
* Remove fake timer from ObsEdit test to get tests passing
* Force update github actions cache
---------
Co-authored-by: Ken-ichi Ueda <kenichi.ueda@gmail.com>
* Add DateDisplay to ObsCard and make first pass at translation strings
* Add failing tests (due to lack of localization) for timeless dates
* WIP: trying to ensure i18next gets initialized before tests run
The remaining test failures might be legit. This probably breaks the actual
app, though.
* Got the rest of the tests working
* Updated tests to assume UTC
* Updated README to advise against using `npx jest` so test runs always have
the env vars we specify in our `npm test` script
* Moved i18next initialization to an explicitly-named file
* Use i18next init function in app
* Fixed up remaining tests
* Added test for non-English localization of date format
* Cleanup
* Made DateDisplay explicitly handle strings not Dates
* Restore skipped localization tests for MyObservations
* Remove duplicative tests from DateDisplay unit test
* Added note to the README about initializing i18next
* Updated change to DateDisplay in main
---------
Co-authored-by: Ken-ichi Ueda <kenichi.ueda@gmail.com>
* Mock INatPaperProvider to remove warnings about wrong icon names in jest; closes#421
* Remove unnecessary paper provider mock
* Add mocked views back to tests
* Regroup accessibility label strings at end of strings file
* Add accessibility test to AddID
* Add a11y labels to AddID
* Add a11y test to StandardCamera
* Add a11y props to StandardCamera
* Remove unit test with only todos
* Add a11y test to Messages
* Refactor PhotoScroll test into own file
* Add a11y test to ObsDetails
* Add a11y test to ObsList
* Add a11y matcher to PhotoGallery test
* Add a11y matcher to ProjectDetails test
* Add a11y matcher to ProjectObservations test
* Add a11y matcher to Projects test
* Add a11y props to ProjectList
* Add a11y props to ProjectTabs
* Add a11y matcher to Search
* Add a11y matcher to UserProfile test
* Add a11y test matcher to UserText test
* Update react-native-accessibility-engine
* Add a11y matcher to Tabs test
* Add a11y label to a selectable photo
* Refactor DataTab tests into separate file
* Refactor ActivityTab test out into own file
* Added a test how to check if a component uses a mocked container
* Add wrong a11y props to TextInput left icon
* Enable a11y test with actual BottomSheet because mock does not pass a11y props down
* Add a11y default props to Button
The problem has something to do with the unicode capitalization code that got
ported from the web. It seems like the JS engine in Android has a problem
with calling toUpperCase() on some unicode characters, and this gets around
that particular bug, plus one problem with a null check on a Realm
collection.
* Use eslint rules to clean up useQuery code
* Code cleanup for useAuthenticatedMutation
* Add realm deletion and clear mock before each test in DeleteObservationDialog
* Check synced status before deleting observation remotely; closes#315
* Add tests for deleting observation from dialog
* Add jest settings for vscode; fix failing test from App.js
* Ignore vscode settings files
* Remove cached version of vscode settings file from git
* Update gitignore
* Add a test for canceling deletion
* Remove delete option for observations not in realm
* Add mutation for delete observation
* Hide delete option for observations not persisted to realm
* Close kebab menu when item pressed; this allows dialog to respond to first user
press
Co-authored-by: Ken-ichi Ueda <kenichi.ueda@gmail.com>