Commit Graph

75 Commits

Author SHA1 Message Date
Amanda Bullington
310d2e743d Add eslint rules for React Query (#319)
* Use eslint rules to clean up useQuery code

* Code cleanup for useAuthenticatedMutation

* Add realm deletion and clear mock before each test in DeleteObservationDialog
2022-12-30 13:30:07 -08:00
Amanda Bullington
d51685b488 Fix: don't make API call for deleting local observations (#318)
* 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
2022-12-30 08:34:32 -08:00
Amanda Bullington
2412b8dde0 Ensure observed_on_string is actually a string for upload (#316)
* Format exif date as string for upload; remove unused code for handling evidence upload errors; closes #311

* Fix tests; add a new test to check for string formatting
2022-12-29 13:03:02 -08:00
Amanda Bullington
ec0a686df6 Eslint: disallow console logs (#312)
* Remove console.logs; remote useLoggedIn hook and instead use useCurrentUser; closes #310

* Comment out locale test
2022-12-29 10:56:50 -08:00
Amanda Bullington
0c4b9a5158 Fixes for API calls, useCurrentUser hook, api token not being fetched (#309)
* Random code cleanup

* Simplify useCurrentUser hook; only fetch messages if current user; closes #272

* Fix padding around login prompt button

* Code cleanup

* Fix projects; display search and tabs separately

* Remove log
2022-12-21 13:35:41 -08:00
Amanda Bullington
66e888e787 Fix copyright in data tab of ObsDetail; improve data fetching (#303)
* Fix copyright in ObsDetail; improve data fetching from remote vs. local; closes #300

* Fix tests for obs detail

* Code cleanup; fix observation count
2022-12-19 11:22:00 -08:00
Amanda Bullington
de3d658244 Allow individual uploads from ObsList (#289)
* Refactor ObsEditProvider to make a reusable uploadObservation function; add blocking loading state in ObsEdit

* Allow individual uploads from ObsList; add loading wheel to toolbar

* Add upload button on grid view; closes #281

* Fix failing tests

* Use needsSync instance method & fix failing tests

* Switch test rendering back to renderComponent method
2022-12-16 10:22:44 -08:00
Amanda Bullington
5061812b89 Fix: observed on date in ObsEdit (#286)
* Fix exif test

* Make sure camera/no evidence still create a new observed_on_string

* Fix failing test with observed_on_string in fake LocalObs; closes #259

* Parse date into local timezone
2022-12-16 10:13:15 -08:00
Amanda Bullington
85db2c3052 Allow photo albums to be selected on first render (#292)
Allow albums to be selected on first render; closes #263
2022-12-14 15:33:23 -08:00
Johannes Klein
7324117869 266 flash icon change (#271)
* Add script to clean start
* Add function to camera mock
* Basic StandardCamera test setup
* Display flash off icon in camera
* Add accessibility labels to strings
* Change to use testID for tests
* Rename package script
* Update vision-camera mock
2022-12-13 15:41:46 -08:00
Ken-ichi Ueda
f442603e7a Disable unnecessary API requests on My Obs when signed out
Also added a signOut test helper... and maybe have introduced some problems
with parallel test execution as a result, as parallel jest runs don't seem to
totally separate with regards to the in-memory realm db. Something to think
about.
2022-12-09 19:39:13 -08:00
Amanda Bullington
8d738d9d8c Delete observations from ObsEdit (#277)
* 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>
2022-12-09 17:36:47 -08:00
Amanda Bullington
0d69fe1568 Fetch user locale from server and change language (#255)
* Fetch user from server, set locale in realm and change language with i18next
* Added some Spanish translations so I can see localization working
* config QueryClient with `cacheTime: Infinity` to deal with "Jest did not
  exit" errors

Co-authored-by: Ken-ichi Ueda <kenichi.ueda@gmail.com>
2022-12-09 15:51:17 -08:00
Amanda Bullington
8a92fca2e8 Update obs list to use React Query, fetch observations via id_below (#273)
* Rewrite remote observation & update fetching using useQuery in ObsList
* Fix ObsList test by adding query provider
* Add padding to infinite scroll view indicator
* Only set next uuid for obslist if not still loading results from last api call
* Improve how ObsList works when observations don't fill screen
* Remove explore, explore provider, dropdown menu, and related screens; fix tests
* Move setIdBelow function into onEndReached
2022-12-09 12:17:26 -08:00
Angie
21a49aa903 Dont fetch location for existing observations (#256)
* Tests for fetch location for existing observations ObsEdit. Closes #199.
* Fixed a bug fetching location for existing obs that weren't synced

Co-authored-by: Ken-ichi Ueda <kenichi.ueda@gmail.com>
2022-12-06 23:36:08 -08:00
Amanda Bullington
b88030eab2 Allow existing id to be edited in ObsEdit (#242)
* Allow editing of existing id; remove unused id buttons; closes #230 and closes #231
* Remove unused text component & update IdentificationSection to tailwind css
* Remove unused obsEdit styles; convert styles to tailwind
* Remove unused bottom modal component and obsedit stylesheet
* Add comments to useEffect for opening local observation; convert realm object to JSON
* ObsEdit loads obs from db only when required
* Use observation update API call for observations already on the server
* Change wasSynced to instance method; only upload unsynced evidence
* Move keyboard aware scroll mock to jest.setup
* Await uploading evidence instead of returning a different response

Co-authored-by: Ken-ichi Ueda <kenichi.ueda@gmail.com>
2022-12-03 15:32:44 -08:00
Johannes Klein
1e6cb70125 Remove fake timers for all tests, await components in ObsEdit test
I enabled jest.useFakeTimers() for all tests in the jest test setup files. I have since learned that it is better to enable it on a test-by-test basis. I have now enabled it globally and fixed the resulting error in the ObsEdit test.
2022-12-02 23:17:48 +01:00
Amanda Bullington
e57ed1fdee Move notes input field above keyboard on focus (#252)
* Move optional notes text field above keyboard on focus
* Fix test with keyboard-aware mock
2022-11-30 14:14:26 -08:00
Angie
c1e845c620 198 usertext component (#237)
* UserText component. Closes #198.
* Replaced ActivityItem comment body with UserText. Wrote tests for UserText.

Co-authored-by: Ken-ichi Ueda <kenichi.ueda@gmail.com>
2022-11-29 21:49:36 -08:00
budowski
4e5481a607 144 import photo exif (#168)
* #144 - when creating new observation, import first photo EXIF data for location + date
* #144 - usePhotoExif - read partial file data; added testing for usePhotoExif hook
* #144 - import photo exif - use our own react-native-exif-reader library + other fixes (not to automatically fetch location, save original uri)
* Do not save original photo URI in DB, only pass it along to obs edit screen for EXIF parsing
* Upgraded testing library version to support renderHook

Co-authored-by: Ken-ichi Ueda <kenichi.ueda@gmail.com>
2022-11-28 20:58:34 -08:00
Amanda Bullington
cc32d5d785 Test: checkmark is shown when photos are selected (#245)
* Started using the FlatList extraData prop to rerender the list.
* Added an integration test for photo selection state
* More fully-formed default mock for camera-roll; removed other test

Co-authored-by: Ken-ichi Ueda <kenichi.ueda@gmail.com>
2022-11-23 16:46:22 -08:00
Amanda Bullington
c6361b022c Skeleton UI and server results for adding a comment in ObsDetail (#247)
* Show skeleton UI for comment and update with real comment from server
* Update styling in ActivityItem to use tailwind; fix code combining id and comment arrays
* Use tailwind styling in ObsDetails
* Styling updates; remove unneeded code from ObsDetails test
* Show loading wheel when comment submitted; clear comment box when backdrop tapped
* Remove console log
2022-11-23 16:08:22 -08:00
Amanda Bullington
a96e379b09 Standardize headers with react navigation (#243)
* Use react navigation header for photo gallery / album picker
* Use react navigation for group photos header
* Use react nav header for Add ID
* Use react navigation header for ObsEdit
* Fix tests by mocking navigation setOptions
* Show all buttons in camera options modal; remove header from StandardCamera
* Only show obs edit header when observations have loaded

Closes #226
2022-11-23 14:09:17 -08:00
Amanda Bullington
733e246367 Make caret next to album selector pressable (#235)
* Fixed padding around caret & moved to Icon prop within PickerSelect
* Fix picker text color on Android. Closes #227
2022-11-08 17:37:27 -08:00
Amanda Bullington
3fbf6cff7c Fix obs detail comment input (#228)
* Separate AddCommentModal into its own component
* Use defaultValue instead of setting TextInput with value from state; styling fixes
* Fix for android build in build.gradle
* Styling fixes for text inputs
* Update bottom sheet mock to get tests passing
* Restore notes to same code as in main branch
2022-11-08 16:52:32 -08:00
Amanda Bullington
b700573327 Fixes for ObsEdit & adding evidence to an existing observation (#220)
* Fix for chosen photos persisting after cancelling new obs, closes #204
* Clear observations when a user backs out of ObsEdit screen
* Add android back handler condition to make sure a user can't back out of ObsEdit & see old observations
* Make sure local observations are properly updated in ObsEdit
* Create subcomponents for ObsEditHeader and AddEvidenceModal
* Fix add evidence functionality; separate ObsEdit into smaller components; rename UploadProvider
* Add disabled check for gallery photos previously selected; fix number of imports in add evidence
* Move fetch location into relevant component; ideally this makes ObsEdit stop rerendering every second
* Fix for android build in build.gradle
* Styling fix for photo gallery grid of images
* Renaming obs to observation, bulk uploader to photo importer, upload provider back to obs edit provider
* Update pods and rename test directory to PhotoImporter

Also closes #218
2022-11-08 12:16:23 -08:00
Johannes Klein
99d306cd24 Realm 11 (#208)
This also upgrades us to React Native 0.70.4 and adds a number of files that get us ready for the New Architecture.

Co-authored-by: Ken-ichi Ueda <kenichi.ueda@gmail.com>
2022-11-07 14:13:13 -08:00
Johannes Klein
26f845b0a5 Replace react-native-localize with mock given by library (#225) 2022-11-04 18:03:24 -07:00
Ken-ichi Ueda
531c0e02e7 Address some test problems with mocks 2022-11-02 16:06:55 -07:00
Amanda Bullington
4d213bd4c6 Create / update / delete requests with useMutation (#206)
* Use authenticated query for search results
* Use search API for fetching places from Settings
* Use authenticated query for authorized applications
* Use authenticated query to fetch user.me
* Move fetch/search api calls into react query format, out of hooks
* Update with react query instead of hooks
* Fetch list of blocked and muted users with authenticated query
* Added Podfile postinstall block to get app running in a Simulator
* Use auth query in identify
* Upgrade @realm/react library to 0.4.0; fixes initialization error on android due to importing realm
* Use authquery for explore provider
* Use mutations for blocking/muting users, invalidating queries, and refetching settings data
* Add react mutation to create/update/delete api calls
* Use mutation for creating identification on identity/obs detail screens
* Use mutations to update and delete relationships
* Use mutation to revoke authorized apps
* Use mutation for updating user settings
* Fix ids on activity tab; fix safe area view; fix mark viewed
* Limit fields for remote observation api call

Co-authored-by: Ken-ichi Ueda <kenichi.ueda@gmail.com>
2022-10-31 20:39:38 -07:00
Amanda Bullington
5456758f27 Move hooks into sharedHooks folder; reorganize Observations and models/ (#194)
* Rearrange hooks and observation component code
* Rename models/ to realmModels/ and use babel aliases

Closes #155

Co-authored-by: Ken-ichi Ueda <kenichi.ueda@gmail.com>
2022-10-20 16:59:19 -07:00
Amanda Bullington
c740a06224 Start using Tailwind CSS (#185)
Starts changing styles over to tailwind via nativewind.

* Update node to 16.17.0
* Use styled() to ignore flow errors about className or tw props when styling components with nativewind
* Upgrade realm to make test suite run; set failing test in Explore as todo
* Add workaround for getting pods to run with XCode 14
* Fix for loading remote obs with infinite scroll
* Add styling section to README
* Use IconButton from rn-paper to make buttons more responsive to press
* Add caret next to camera roll album picker
* Fixed broken addition of gallery photos to existing observation
* Removed flatlist from scrollview on ProjectDetails (apparently not allowed?)
* Moved border style from Image to container in PhotoCarousel (border color
  not allowed for images?)

Co-authored-by: Ken-ichi Ueda <kenichi.ueda@gmail.com>
2022-10-19 17:15:55 -07:00
Amanda Bullington
e81894d406 Use authenticated queries for fetch/search requests (#195)
* Use authenticated query for search results
* Use search API for fetching places from Settings
* Use authenticated query for authorized applications
* Use authenticated query to fetch user.me
* Move fetch/search api calls into react query format, out of hooks
* Update with react query instead of hooks
* Fetch list of blocked and muted users with authenticated query
* Added Podfile postinstall block to get app running in a Simulator
* Use auth query in identify
* Upgrade Realm to 11.0.0-rc.0, most recent version that will work with RN 0.68.2
* Upgrade @realm/react library to 0.4.0; fixes initialization error on android due to importing realm
* Use authquery for explore provider
* ObsDetail wasn't showing the edit button for obs created while signed out
* simplified ObsEditHeader so it takes a full observation instead of relying
  on the ObsEditContext
* ObsEdit now accepts an obs UUID as a param and loads that if the context
  doesn't have a current obs
* null checks for API methods, mostly to prevent requests that won't work b/c
  of missing params

Co-authored-by: Ken-ichi Ueda <kenichi.ueda@gmail.com>
2022-10-19 13:01:04 -07:00
Amanda Bullington
c4d9cd4dc6 Use babel-plugin-module-resolver (#188)
* Add alias and update eslint/flow to resolve modules

* Update aliases for components and api

* Add other src directories to module resolver aliases
2022-10-07 10:20:55 -07:00
Ken-ichi
c22d0fe79a Use RealmProvider (#183)
This attempts to remove the necessity of opening and closing Realm
connections, which can lead to stale connections and invalidated objects. I
did not try to remove direct access to realm from AuthenticatedService,
which exists outside of the component hierarchy and can't really access
context, but I think eventually we may want to bring all that functionality
within the component hierarchy so there really is only one Realm connection
in the app.

Probably still some bugs here. One major problem is that deleting the Realm
file does not seem to trigger a re-render of the RealmProvider. My workaround
was to delete all the data in RealmProvider connection to Realm before
deleting the file, but it seems kind of redundant.

Some other changes

* Updated react-native-image-resizer and worked around some regressions
* Needed to use Array.from on Realm collections in many places;
  map( o => o ) doesn't seem to work for creating POJOs from realm objects any more
* React Native Paper provider needs to be inside the Realm provider for any
  realm stuff to happen with rn paper modals
* Several workarounds for the fact that Realm objects don't behave like POJOs
* Added useApiToken hook (#158)
* Renamed the useUser hook to useRemoteUser, since that's what it was doing
2022-10-06 16:15:22 -07:00
Amanda Bullington
af8f17190d Keep toolbar sticky & collapse header on ObsList scroll (#182)
* Change bottom sheet modal to bottom sheet
* Give flatlist container a minHeight to make bottom sheet snap correctly when flatlist has few items
* Make entire header sticky above FlatList
* Hide header on scroll while keeping toolbar sticky on scroll
* Allow flatlist to scroll while bottom sheet modal up
* Use animated event on scroll with interpolation and stickyheaderindices to keep toolbar sticky while animating header
* Add accessibility label to logged out card

Closes #175
2022-09-27 16:20:13 -07:00
Amanda Bullington
337d812ab9 UI updates to bottom sheet (#181)
* Changes My Observations upload bottom sheet from modal to non-modal
* Give flatlist container a minHeight to make bottom sheet snap correctly when flatlist has few items
* Mock useLoggedIn hook in tests
* Move useCurrentUser to sharedHooks/ and mock in ObsList test
* Mock useUser hook
* Use useCurrentUser hook on user profile
* Downgrade gesture handler
2022-09-19 14:40:26 -07:00
Amanda Bullington
d892d755a7 Use React Query to simplify API requests (#166)
* Start using React Query to make remote data requests
* Renaming, standardized error handling from API calls, moving code
* Fixed messages test; changed useQuery mocking approach
* React Query should only retry for network issues
* Tried using useAuthenticatedRequest on TaxonDetail
* Clear the React Query cache on sign out

Co-authored-by: Ken-ichi Ueda <kenichi.ueda@gmail.com>
2022-09-01 18:43:52 -07:00
Amanda Bullington
39111a9ab3 Replace PhotoGalleryProvider with useBetween hook (#162)
* Remove photo gallery provider

* Get tests passing

* Remove use-between & ability to remove photos from GroupPhotos and reflect that in PhotoGallery selection

* Use goBack method since not passing params back to PhotoGallery

* Remove params when navigating to photo gallery
2022-08-24 12:05:14 -07:00
Amanda Bullington
a03bb2b34f Show photo upload failures; upload unsynced photos without overwriting from remote data (#161)
* Lint fix

* Simplify uploadObservation code by moving some logic into Obs model

* Eslint fix: remove unused import

* Use realm to filter by observationPhotos which haven't been synced

* Tests passing

* Eslint fixes

* Create helper functions to check for unsynced obs including photos; show in ObsList

* Show photo failure error if upload fails on obs_photo API call

* Fix test

* Guard against 500 errors
2022-08-18 11:29:12 -07:00
budowski
9318f82cf9 Add photos to an existing observation
Also implements limits on number of media items one can import.

Closes #102
2022-08-15 15:22:36 -07:00
Amanda Bullington
da4c30364d Unviewed comments/ids in ObsList (#141)
* Update text color to match icon color for unviewed comments and ids

* Eslint fix

* Add cleanup effect for useRemoteObs hook
2022-08-08 11:23:49 -07:00
Amanda Bullington
65d67c2a64 Mark comments unviewed on MyObs & viewed on ObsDetail (#132)
* Add icons to obs card comments/ids

* Show red icons when user has unviewed comments/ids

* Mark obs viewed locally and with server via obs detail

* Mock i18next; get tests passing
2022-07-27 13:08:01 -07:00
Amanda Bullington
42e0e73c4b Upload progress bar (#130)
* More progress on progress bar; make sure for loop uses all observations

* Remove attributes for API v2 obs create, cancel upload if user taps x

* Fetch current user id from auth service, not API call

* Add error message to uploader progress bar
2022-07-25 18:18:20 -07:00
Amanda Bullington
3d65b1e294 UI updates to bulk uploader (#128)
* UI updates to photo gallery

* Add filter icons to group photos

* Styling for carets, multiple ObsEdit

* Standardize kebab menu in shared component

* Fix bug in removePhotos; change selection to kebab menu

* Create delete obs dialog which deletes obs from bulk uploader obs edit

* UI tweaks; closes #100

* Add precommit hook to translate strings

* Fix styling for obs edit header; add fonts to xcode

* Fix lint errors

* Add safe area provider to test & app

* Fix tests
2022-07-18 14:44:20 -07:00
Ken-ichi
e929764c25 Adopted and enforced code style from other iNat Javascript projects
These rules are largely based on the AirBnB ones, which are not quite standard
for the React Native world, where Prettier seems to be more common, but I
think they add a lot of useful checks, and unlike Prettier we can customize
them. This also just makes it easier for people on the iNat team to work on
the mobile app.

Some specific changes:

* Added eslint-plugin-react-hooks to eslint rules
* Added eslint-plugin-simple-import-sort to eslint rules
* Bugfix: could not import photo from gallery
* Added support for react-native/no-inline-styles eslint rule
* useUser should not bother fetching a user for a blank userId
2022-07-13 13:55:59 -07:00
Ken-ichi Ueda
3df6e6f250 Mocked @gorhom/bottom-sheet with mock provided by same 2022-07-09 16:35:55 -07:00
Amanda Bullington
3c7ac52eec Logged out state for MyObservations (#119)
* Show logged out green card at top of my obs screen when user logged out
* Allow user to save obs locally without being signed in; show number of unuploaded obs in top banner:
* Show login prompt in bottom sheet; hide sync button when logged out
* Upload prompt uses same styling as login prompt
* Delete realm file if user is installing app after deletion
* Code cleanup; add comment to checkForSignedInUser; closes #98
* Update eslint-config package
* Update RN maps
* Update styling for empty list
* Use third-party bottom sheet modal for login prompt & upload prompt
* Get tests passing via transformIgnorePatterns
2022-07-09 15:21:10 -07:00
budowski
4b4b0f9244 Add ID - initial commit (#103) (#113)
* Adds a component for adding identifications, both from Obs Detail and Obs Edit
* Minor style and eslint change to disallow all-caps string literals

Closes #103 

Co-authored-by: Ken-ichi Ueda <kenichi.ueda@gmail.com>
2022-07-02 16:01:48 -07:00
Amanda Bullington
17122fc46e Delete user JWT on 401 error (#112)
* Sign out user when encountering a 401 error while fetching JWT
* Save currently signed in user in Realm
* Check for logged in user on app start, add loading wheel to obs list, sign user out when no user ID

Closes #99 

Co-authored-by: Ken-ichi Ueda <kenichi.ueda@gmail.com>
2022-06-15 10:26:46 -07:00