$ show inaturalist/SeekReactNative
Seek is a React Native mobile application for identifying plants, animals, and fungi using the device camera and on-device machine learning (InatVision). It allows users to capture photos, receive species identifications, save observations locally via Realm, and optionally post them to the iNaturalist citizen science platform. The app includes gamification features such as badges, levels, monthly challenges, and a year-in-review recap. It integrates with iNaturalist APIs for authentication, species data, range maps, and seasonality charts. The architecture is a monolithic React Native app with multiple Context providers for state management, React Navigation for routing, and a variety of native modules. The codebase is well-structured with TypeScript, has CI/CD pipelines, and uses snapshot tests. However, it has technical drift from patched dependencies, hardcoded monthly challenge content, and some tightly coupled components. Overall, it is a solid, actively maintained mobile app with moderate reusability of its UI primitives and custom hooks.
The LLM identified 5 files worth highlighting for reuse:
Abstracts the react-native-vision-camera module with a mock for end-to-end testing. Demonstrates a clean wrapper pattern that allows the rest of the camera code to remain testable without mocking the native module directly. The e2e-mock variant provides a no-op implementation for Detox tests.
A reusable button component that debounces press events to prevent accidental double-taps. Uses a simple custom hook to track the last press time and skip subsequent presses within a configurable interval. This is a common pattern that can be extracted and reused in any React Native app.
A React hook that queries the local Realm database for all observed taxa (species) and returns them as a deduplicated array of taxon IDs. It demonstrates a clean pattern for encapsulating Realm queries and reactivity, making it reusable across screens that need to display the user's observed species list.
A wrapper around the react-native-modal library that applies consistent styling, backdrop behavior, and a workaround for a known issue (react-native-modal#525). Provides a simple, reusable modal component with customizable children, title, and close button. The pattern can be adapted for other UI overlays.
Implements an efficient grid list using RecyclerListView and GridLayoutProvider to display species nearby results. Handles different item types (header, species cell, loading, error) with good separation of concerns. The layout provider pattern is reusable for any large scrollable grid in React Native.