* only return observations from useLocalObs
* remove unnecessary var
* export unsync'd filter
* remove obsoleted numUnuploadedObservations zustand state
* tests, typo
* fix tests
* add sync fields to keypaths & depp array
* consistent naming
* handle only ids downstream
* switch over to useIds
* restore ids return
* memoize realm mapping result
* extract realm hooks mocks into factory-available helper
* reapply to myobsresults
* reapply to myobsresults
* go back to wrapped ids for list parity
* fix test
* restrict mocked prop for more accurate MyObsSimple test
* comment cleanup
* fix fake timer flake w/ corrected setup
Claude:
1. withAnimatedTimeTravelEnabled({ skipFakeTimers: true }) does NOT call jest.useFakeTimers(), but still calls jest.setSystemTime(new Date(0)) in beforeEach — which requires fake timers.
2. Both SoundRecorder.test.js and PhotoDeletionExisting.test.js (and ObsEdit.test.js) call global.timeTravel(300) inside waitFor, which also requires fake timers.
3. Tests pass flakily when fake timers accidentally leak from another test file running in the same Jest worker. When they don't leak, timeTravel throws.
4. FadeInView is fully mocked to a plain View (instant) and Reanimated uses setUpTests(), so the 300ms timeTravel isn't actually advancing any real animation — it's just broken.
The fix: guard setSystemTime with the same check, and remove the timeTravel(300) calls from waitFor in tests that use skipFakeTimers: true.
* fix remaining time travel uses
* reset / restore timers to fix leaking fake timers
* Move ProjectDetails to TS
* Remove flow type
* Type object properties
* Narrower type possible for helper function
* Type nav prop
* Type route params away from here
* Type route params away from here
* Type more project keys
* Type route params to Explore
* Type place generic for now
* Type function props
* Update displayProjectType.ts
* WIP: Add Alert to dummy codepath
* Move Alert to on button press, so before sheet is displayed
* Update string
* Update ProjectDetails.tsx
* Update ProjectDetailsContainer.tsx
* Remove flow type
* Type nav props
* Type ApiProject with fields we query for in ProjectDetails
Also check which ones are nullable according to API V2 docs
* Reorder fields
* Also request place_id field
This must be some kind of bug because the next query expects that we are asking for this value for the project.
* Apparently ProjectDetails sends an entire api result over navigation params
* Fix a TS error
* Same fix
* Replace second API call with data we can get from project call
* Fix a TS error
* Nullable properties according to API docs, do actually get back as null to us and not undefined
* Null passes through as prop
* I don't think those can be null
* Add other API query types
* Refactor to not pass id as function param
* Also query for membership_model
* Code style
* This seems nonsensical to me
Omit project_type and then put it back in
* Lift rule_preferences type to ApiProject
* Query for rule_preferences in Project details
* Minimal interface to use this function
* Reinstate previous interface
* Project now has a rule_preference field from container
* Be specific with what keys we prop down from container
* Route params are not optional because of a prior null check
* Update mock
* Add a TODO
* Add export
* Create new hook shell
* Revert "Create new hook shell"
This reverts commit b6918db347.
* Copy ObsDetailsDefaultModeScreensWrapper as is to new file
* Copy ObsDetailsContainer as is into new file
* We don't need this param at this level
* Have new ObsDetailsContainer be the next child of screen
* Update props of new child and remove thereby hoisted code
* Move route param extraction into component that needs it
* Extract presentational logic into new component
* Also copy over flow types
* Also copy over flow types
* Return null if no observation
* Remove mode switch logic from navigator
* Remove no longer needed advanced mode container
* Consolidate default mode container into new one as well, and switch over default mode to show default mode UI
* Same as in advanced mode, read param where it is needed
* Remove prop
* Run the integration test on the only container
* Git mv test file and update with new import
* Move test and only keep the UI logic part being tested
* Move tests relevant for ObsDetailsScreen
* Update ObsDetailsScreen.test.js
* Update IdentificationSheets.test.js
* Remove unused screen wrapper
* Do not filter out hidden comments and IDs when getting an obs from server
* Do not add a filtered set of comments and IDs to local obs
Searching for visibleComments and visibleIdentifications anyways gives 0 results outside this file.
* Move file
* Remove flow
* Type fcts
* Add a type to item
* More types
* Add field to RealmTaxon
* Type navigation as used in ObsDetails
* Update ActivityItem.tsx
* Migrate FloatingButtons to TS
* Change prop type
* Rename ActivityHeader
* Migrate ActivityHeaderKebabMenu to TS
* Type functions
* Add undefined as possibility from TextInputSheet callback
* Revert "Add undefined as possibility from TextInputSheet callback"
This reverts commit 95b5fef2b9.
* Revert "Type functions"
This reverts commit 6997f195ce.
* Revert "Rename ActivityHeader"
This reverts commit e384c1f5a5.
* Revert "Update ActivityItem.tsx"
This reverts commit c1dc151b9a.
* Revert "Add field to RealmTaxon"
This reverts commit 965af041c0.
* Revert "More types"
This reverts commit 73af10bfcd.
* Revert "Add a type to item"
This reverts commit 5e5bf0ebae.
* Revert "Type fcts"
This reverts commit 84cac53e33.
* Revert "Type navigation as used in ObsDetails"
This reverts commit 9febf9ea30.
* Revert "Remove flow"
This reverts commit dca054c212.
* Revert "Move file"
This reverts commit bf62c0db95.
* Add UI for a hidden comment/ID
* Rename export like file name
* Update ID category text in tests
* Ask for hidden status from API and persist in realm
* Show fallback UI for hidden photos in PhotoContainer
* Update strings.ftl
* Show fallback UI for hidden sounds in SoundContainer
* Change mock to remoteObservation
Previously, this test file was relying on a faulty remoteObservation. The passed in remoteObservation was {} and because of the now removed filter code in useRemoteObservation what was passes into the test was {comments:[], identifications:[]} which made this test pass without ever using the useLocalObervation mock.
* Add eye icon to photo
* Add eye icon to sound
* Add eye icon to comments/IDs