Commit Graph

81 Commits

Author SHA1 Message Date
Johannes Klein
4a20d8c9cc Remove patch-package dependency 2022-12-14 09:42:45 +01:00
Ken-ichi Ueda
8dd57b01fe Removed react-native-exif, which is vestigial and causing Android test build failure 2022-12-13 15:07:37 -08:00
Johannes Klein
f46da431e0 Update package-lock.json during npm install 2022-12-13 22:34:21 +01:00
Johannes Klein
eb81453e60 Merge branch 'main' into 250-e2e-init 2022-12-13 22:31:58 +01:00
Johannes Klein
da9cd48b4f Set to use same version as peerDependency as we have anyways (#293)
Fixes #290
2022-12-13 10:41:57 -08:00
Johannes Klein
108b7bcae1 Add patch-package dependency 2022-12-12 15:23:51 +01: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
Ken-ichi Ueda
53b4bd1dca Updated app icon 2022-12-07 12:11:12 -08:00
Angie Ta
a0ea8b17ee Installed legacy peer deps for picker-select for ObsEdit to work on main. 2022-12-06 14:53:42 -08:00
Amanda Bullington
8b7c98d04b Fully delete photos from ObsEditContext when adding evidence (#248)
* Remove photos from all relevant contexts when adding evidence and then deleting photos
* Update permissions library to fix iOS build errors:
* Use RN modal to gain access to context; move delete functionality into ObsEditProvider
2022-12-05 17:13:31 -08:00
Johannes Klein
005bbe8f01 Add detox and jest-circus 2022-12-03 13:16:08 +01:00
Johannes Klein
2533f94e08 Revert "Add detox and jest-circus"
This reverts commit 439f1dc994.
2022-12-03 13:13:59 +01:00
Johannes Klein
439f1dc994 Add detox and jest-circus 2022-12-03 02:16:57 +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
Ken-ichi Ueda
f5ab99e37e Redo of workaround for https://github.com/lawnstarter/react-native-picker-select/issues/487 2022-11-29 12:55:40 -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
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
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
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
a07ee979e6 Custom fonts (#192)
* Add Whitney fonts to project
* Use styled components to pass whitney as default font for all app text
* Add header component using Papyrus as default font
* Update realm and add custom font examples for Android

Co-authored-by: Ken-ichi Ueda <kenichi.ueda@gmail.com>
2022-10-20 15:23:10 -07:00
Amanda Bullington
f9392452f3 Add navigation buttons to media viewer (#187)
Add nav buttons with scroll to index to media viewer

Closes #164

Co-authored-by: Ken-ichi Ueda <kenichi.ueda@gmail.com>
2022-10-20 12:05:57 -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
Corey Farwell
4e054cf134 Fix NPM package version conflicts. (#172)
Prior to this commit, if I were to run `npm install` twice, I would get
this error:

```
npm ERR! code ERESOLVE
npm ERR! ERESOLVE unable to resolve dependency tree
npm ERR!
npm ERR! While resolving: inaturalistreactnative@0.1.1
npm ERR! Found: react@17.0.2
npm ERR! node_modules/react
npm ERR!   react@"17.0.2" from the root project
npm ERR!   peer react@">= 16.8.0" from react-spring@8.0.27
npm ERR!   node_modules/react-spring
npm ERR!     react-spring@"^8.0.27" from the root project
npm ERR!
npm ERR! Could not resolve dependency:
npm ERR! peer react@"^18.2.0" from react-dom@18.2.0
npm ERR! node_modules/react-dom
npm ERR!   peer react-dom@">= 16.8.0" from react-spring@8.0.27
npm ERR!   node_modules/react-spring
npm ERR!     react-spring@"^8.0.27" from the root project
```

Because `react-dom` was eagerly trying to upgrade `react-dom` to version
18, but we want to lock it to 17 to match our React version.
2022-08-30 17:58:55 -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
c8f23fcb5f Add swipe to media viewer (#136)
* Add swiping in media viewer for photos which are zoomed out; closes #43

* Make media viewer full screen by overriding safe areas

* Improve custom swiper component (aka flatlist)

* Fix eslint errors

* Use onScrollEndDrag to handle left/right scrolling and update selected photo index

* Switch event handler to onMomentumScrollEnd

* Fixes for getting photo index while swiping only halfway

* Use IconButton for standardized back button in media viewer

* Update translations
2022-08-18 11:12:55 -07:00
budowski
6e65faab64 Obs Detail comment input in bottom sheet modal
Closes #105

Co-authored-by: Ken-ichi Ueda <kenichi.ueda@gmail.com>
2022-08-16 18:50:20 -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
Ken-ichi
90ff7a59c0 Fastlane setup for tagging, releasing, and internal testing (#118)
Configures fastlane to automate our current release process of making a git tag, making a git release, building, and pushing to the Play Store internal track and Testflight. See README.md for details on setup and usage.

Co-authored-by: Amanda Bullington <albullington@gmail.com>
2022-07-05 18:19:41 -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
2e184b97f4 Enforce globalized text with eslint plugin (#120)
Add plugin to enforce globalized text with warnings; globalize some strings; closes #93
2022-07-01 12:42:24 -07:00
Ken-ichi Ueda
1b5599f95c Skip legacy peer deps when running CI tests 2022-06-28 12:27:27 -07:00
Amanda Bullington
9b85991b83 Show comments on ObsDetail (#111)
* Save uuid to Comment realm; rerender ObsDetail when comment deleted; delete comment locally first

* Fix styling for kebab menu; closes #104

* Update package lock

* Get tests passing

Co-authored-by: Ken-ichi Ueda <kenichi.ueda@gmail.com>
2022-06-27 11:13:31 -07:00
budowski
0144200e9c Settings Screen (#77)
Gets most of the way toward #27. Blocks, mutes, and some other functionality require API v2 updates. UI needs refinement.
2022-06-09 15:49:22 -07:00
Amanda Bullington
1f2becdef6 Media Viewer (#107)
* Create basic media viewer with full sized image, selection, carousel, and header

* Create photo delete dialog component

* Wrap camera stack in Mortal component instead of resetting state on camera blur

* Use photo carousel in PhotoPreview for standardized photo sizes

* Make media viewer accessible from ObsEdit

* Remove evidencelist component and use photo carousel instead in ObsEdit/suggestions

* code tweaks

* Create realm ObsPhotos in standard camera for passing to media viewer, ObsEdit

* Move resize image function into Photo model

* Update photo preview to use delete photo functions from photo and obsphoto model

* Allow photo deletion in media viewer from ObsEdit, StandardCamera; switch to Modal view

* Swap in zoom functionality instead of carousel, media viewer

* Remove media viewer from nav, now that it's a modal

* Remove comment

* Update babel config with react-native-paper plugin for production

* Mock RN paper Portal component

* Media viewer takes photo uris; handles obsPhoto updates in ObsEdit and photo uri updates in StandardCamera

* Make sure tests pass with optional chaining for obsPhotos

* Update styling for StandardCamera

* Create obsPhotos attached to photos from camera

* Pass photos to StandardCamera from ObsEdit to reflect any changes made in MediaViewer

* Get tests passing

* Fix flow issues

* Change flow type for photoUris

* Add pre-commit hook for flow

* Fix flow erros
2022-06-01 11:10:03 -07:00
Amanda Bullington
c5528c67a9 Edit existing observations (#86)
* Convert Realm objects into plain objects for ObsEdit; check for recently edited obs in ObsList

* Code cleanup; closes #85

* Extend classes with Realm.Object; use .toJSON( ) to edit plain objects with less code

* Check for local updates before syncing from server

* Code cleanup; rename existingObs and remove projects in OtherDataSection
2022-05-12 18:38:26 -07:00
Ken-ichi Ueda
25fe935de0 WRITE permissions for camera / gallery so they can write resized images 2022-05-10 16:32:00 -07:00
Amanda Bullington
f46d4086ad Save observations, photos, sounds in Realm for upload (#78)
* Break uploader into helper function; add bottom model for uploading from obs list

* Create mapping function for uploading observations to iNat

* Mark observations as uploaded when id is returned from server

* Format dates on obs list

* Save all obs locally before trying to upload

* Resize grouped photo gallery photos for upload

* Resize photos btw group photos screen and obs edit

* Get sound, photo, obs uploads saving to realm and uploading later

* ObsEdit progresses to next or prev screen after one obs is saved locally

* Format date in camera; use time observed to show new local obs in ObsList

* Remove time zone attribute, since this is handled by server

* Submit sound and photo uuids as the file name for sound/photo uploads

* Make obsSounds an array in case there are multiple sounds for upload

* Removing time synced from Photo model bc not sure it's necessary

* Save _synced_at and _created_at time for all remote obs

* Fix back button, obs edit

* Don't show obs edit for unuploaded obs

* Get rid of ObservationProvider, move useObservations hook

* Fix place name; add date/time and location to no evidence uploads

* Add species_guess to observation when taxon_id changes

* Format date from picker; use string for sending to server

* Styling cleanup with react-native-paper; make ObsEdit into section components

* Add vector icons to ios (for searchbar)

* Add empty text to CV suggestions

* Cleanup code for marking records synced & uploading to server

* Use placeholder icons on bottom tab bar

* Add icons to ObsList; fix grid view when photo === null

* Fix jest tests

* Simplify setting an identification in ObsEdit

* Move inline styles to separate files

* Display all relevant saved obs data on ObsDetails; function to check for camel or snake case attributes

* Move logic for creating new sound observation to model, not sound recorder

* Add android vector icons

* Move create obs and create with no evidence into Observation model

* Add mock for react-native-fs

* Show option to edit user obs in ObsDetail; fix captive/geoprivacy/date fields for uploaded obs

* Move obsPhoto creation and obs with obsPhoto creation into models

* Create obs with sound from Obs model

* Create multiple obs from gallery photos; move logic into model

* Pass observation to ObsDetails via navigation to avoid opening and closing realm twice

* Lint error fixes

* Fix jest tests

* Use icons on normal camera

* Use timestamps from gallery and camera for new observations

* Keep simplifying code

* Update version/build number; add key to info.plist for faster ios build

* Remove TranslatedHeadline component

* Move saveLocalObservation logic to model

* Move all FIELDS for api calls into models (except messages, which doesn't have a model yet)

* Only show upload UI if user is logged in

* Fix obs edit link so it works for both logged in and logged out users

* Bug fixes: get fields from models; addListener function in test

* Model code cleanup

* More code cleanup

* Remove unused imports
2022-05-10 14:41:31 -07:00
Ken-ichi
09ed361d02 Camera and gallery now display after granting permission (#79)
* Camera and gallery now display after granting permission

Previously these were not quite working because the usePhotos hook was asking
for a permission, so if that was used anywhere in conjunction with another
permission request, one or both success promises never got executed. This
commit tries to solve that with a PermissionGate component that takes a
permission as a prop, asks for it if not granted, then renders its children
when granted. If not granted, it renders a message saying that the permission
is required to use the feature.

Other stuff

* Added `env.example` so people know how to populate `.env`
* Added the `intl-pluralrules` polyfill to support pluralization with i18next
* Skip some token granting logic if the user is not logged in
* Trim whitespace from username/email before auth
* Some minor UI changes to auth form so I know where to tap
* Test fixes

* Use a full screen view for children of PermissionGate

* Globalized text on PermissionGate
2022-04-27 12:36:03 -07:00
Ken-ichi
0c8c9020ec Test fixes (#80)
* Comment model needs a UUID attribute
* mocked useLoggedIn in ObsEdit test
* updated caniuse
* Close Realm when hooks are done
2022-04-26 17:07:55 -07:00