* 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>
* 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>
* 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
* 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>
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.
* UserText component. Closes#198.
* Replaced ActivityItem comment body with UserText. Wrote tests for UserText.
Co-authored-by: Ken-ichi Ueda <kenichi.ueda@gmail.com>
* 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>
* 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
* 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
* 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
* 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
* 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>
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>
* 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>
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
* 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
* 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
* 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>
* 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
* 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
* 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
* 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
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
* 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>
* 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>
* 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
* 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
* Add exception handler library; fix computer vision results
* Create loggedIn hook to check whether user is logged in before cv suggestions or upload
* Create user profile card on MyObs
* Update packages
* Add text for camera permissions denied
* Remove log
* Upgrade react native on iOS
* Add vendor file for ruby gems to gitignore
* Remove vendor file from github
* Update react native for android
* Add plural example to fluent; create TranslatedText component to render translations
* Add translations and update camera roll screens
* Small changes to uploader flow; add date/time picker
* Separate explore into landing screen and view screen
* Show total number of observations, explore
* Clean up styling and add details for grid view; banner for total observations in explore
* Add checkboxes for status, quality grade, media filters
* Add a lot of explore filters
* Show months in Explore filters
* Create About screen; sync package.json version using react native version
* Get explore filters in mostly working condition
* Observations download after login; clear login screen after nav; closes#62 and #60
* Allow separating photos if at least 1 combined photo obs is selected; closes#68
* Fix auth tests; add user id
* Pop text input above keyboard to address #66
* Lint cleanup
* Create bottom modal for user tapping back button on ObsEdit
* Check permissions on android only, camera
* Keep trying to get android camera working
* Change version number to 0.1.0
* first pass
* some clean-up
* linting clean-up
* added a Q
* more cleanup
* Merge branch main of https://github.com/inaturalist/iNaturalistReactNative into 34-messages-0
# Conflicts:
#src/providers/hooks/useObservations.js
* simplify away from context and providers
* remove unused model
* remove model ref
* other clean-up
* add basic unit test for messages
* add activity indicator
* add test for activity indicator
* remove false positive tests
* fix navigation
* remove api params
* clean up
* move navigation and update test
* improve testing
* Add to user profile
* Create a hook to fetch member projects
* Create custom header for user profile
* Updates to user profile; resize image for CV suggestions; build config for Android
* Bug fixes with obs list & CV suggestion fields
* Add functions for creating id, faving obs and adding comment in obsdetail
* Show comments as activity items; create comments and refetch obs data
* Fix activity item keys
* Add data to data tab, obs detail
* Let user unfave observation
* Fix camera modal
* Get tests passing
* Get observation upload and obs_photo upload working with staging v1
* Add location with accuracy to normal camera uploads
* Add location and date to sound recordings
* Add camera options button to end of evidence list
* Add photos to obsEditProvider from camera, sound, and photo library
* Code cleanup
* Use ObsEditProvider as global state for uploader; support multi photo/sound; get test passing
* Set config to API v2
* Build basic sound recorder; flow fixes
* More progress on sound recorder; add metering for visualization
* Flow fixes
* Use logged in user to fetch observations; use modified param to clean up realm code
* Hide tests that aren't passing; add mock for rn-localize
* Code cleanup - remove autolink
* Add member id lookup for projects screen
* Navigate to obs detail with sound recording; don't display photos
* Add basic camera with take photo functionality
* Toggle flash
* Add front camera; camera toggle
* Add pinch to zoom functionality
* Add tap to focus functionality; create focus square component for animation
* Add thumbnails to top of regular camera
* Parse photos from regular camera for ObsEdit
* Nav to obs edit with no photos/sounds
* Revert auth service
* Flow fixes AuthService
* Add gallery library; hide camera stack in drawer navigation since we can't use a tab navigator
* Add gallery permissions ios and android
* Move to obs edit screen when a photo is selected from gallery
* Make sure camera options modal closes on navigate
* Create shared hook for reverse geocoded locations
* Obs edit; dismiss keyboard; uuid generator
* Use popup modal to search for projects / taxa from obs edit & add to obs
* Obs edit updates
* Add i18next mock for global testing
* Add tests for photo gallery
* Add test for obs edit
* Get album picker working and store albums + photos in ObsEditProvider
* Maintain photo selection across multiple photo albums
* Create GroupPhotos screen with photos sorted by timestamp across all albums
* Add styling for group photos
* Pseudocode for grouping photos
* Combine photos into observations in photo gallery
* Remove photos from camera roll selection on group photos screen
* Fix remove photos function
* Finish combine, separate, remove photo functionality
* Display multiple obs and multiple photos on obs edit screen
* Code cleanup
* Code cleanup again
* Show number observation at top of obs edit screen
* Update navigation
* Get one photo gallery test passing
* Fix obs edit test
* Fix warning eslint
* Make tests happy
* Remove unused variable