Welcome to our React Native code challenge! This challenge is designed to assess your skills in mobile app development using React Native with Expo. You'll be building a simple Personal Task Manager application.
- Use React Native with Expo
- Implement navigation using Expo Router (This is very important!) - Expo Router is already installed in this project
- Use TypeScript for all code
- Implement local data storage using expo-sqlite with Drizzle ORM
- Style your components (you can use any styling method you prefer)
- Ensure your code is properly linted using ESLint (configuration is provided in the project)
Create the following routes/screens using Expo Router:
-
Task List Screen (
/
)- Display a list of tasks
- Each task should show its title and due date
- Include a button to add a new task
- Implement pull-to-refresh or add a refresh button to update the task list
-
Add Task Screen (
/add
)- Allow users to input a task title, description, and due date
- Validate inputs before saving
- Save the task to the local SQLite database using Drizzle ORM with expo-sqlite
-
Task Detail Screen (
/[id]
)- Show full details of a selected task
- Include options to edit or delete the task
-
Edit Task Screen (
/[id]/edit
)- Allow users to modify task details
- Update the task in the local SQLite database using Drizzle ORM with expo-sqlite
Note: Implement these screens as separate route components using Expo Router. The paths in parentheses are suggestions for the route structure, but you can adjust them as needed while maintaining a logical hierarchy.
- Clone this repository to your local machine
- Install dependencies:
npm install
- Start the Expo development server:
npx expo start
(optionally specify platform:npx expo start --ios
ornpx expo start --android
) - Run the linter:
npx expo lint
This project includes Expo dev tools plugins for Drizzle Studio and TanStack Query to help with development. To use these plugins:
- Start your Expo development server:
npx expo start
- While the app is running, press
shift + m
to open the list of available dev tools plugins - Select the plugin you want to use:
- Drizzle Studio: Manage your database schema and data
- TanStack Query dev tools: Inspect queries and cache
- The selected plugin will open in a new Chrome window, providing a user interface to debug and inspect your app's data layer
These plugins are only available in development mode and won't affect your production build.
- This project uses expo-sqlite for data storage
- Drizzle ORM has been set up with a predefined schema and client
- The Drizzle client is defined in
db/client.ts
- The Drizzle schema is defined in
db/schema.ts
- Migrations are automatically applied when the app loads, no need to run migrations manually
- Make sure to use the provided Drizzle setup for database operations
If you have extra time, consider implementing one or more of the following:
- Implement a data management library like TanStack Query (or similar) for:
- Efficient data fetching and caching
- Data mutations
- Optimistic updates
- Cache invalidation
- Add unit tests for your components and functions
- Implement a simple task prioritization feature
- Implement basic accessibility features
Note: TanStack Query is already added and configured in this project
- Make sure to submit your work before the deadline indicated in the invitation email
- Ensure all changes are committed
- Do not create a pull request
- Create a bundle:
git bundle create blen_mobile_challenge.bundle --all
- Email your submission to [engineering@blencorp.com] with the subject "Code Challenge Submission - [Your Name]"
We will evaluate your submission based on:
- Correct implementation of required features
- Code quality, organization, and TypeScript usage
- Effective use of expo-sqlite with Drizzle ORM
- Git usage and commit history
- Proper code linting and adherence to the provided ESLint configuration
- Bonus features (if implemented, but not required for a strong submission)
- Late submissions are welcome and will be reviewed, though priority will be given to timely submissions
Good luck! We're excited to see your solution.