Just clone the repository and install all dependencies.
Then you run npm start to start the application:
Your task will be to implement the Inspiration App that can help you to find inspiration or motivation. The app will provide the possibility to generate random inspiration cards or create them from scratch by the users:

- /assets - here you can find all the necessary images and fonts to use within the application (you'll need to apply and use given fonts in the app);
- /constants - there are color constants for the light and the dark modes;
- /contexts - there is the ThemeContext, please replace all TODOs with the required logic for theme switching;
- /enums - here you can find the API and route names enums which you should use while implementing the task;
- /helpers - there is a helper that generates a random number within the provided range (if you decide to create a new helper - declare it here);
- /hooks - there is a useTheme hook that uses the ThemeContext you need to complete (if you decide to create a new hook - declare it here);
- /navigation - there are two navigator files, that you need to add logic into;
- /screens - here you'll find three screen files you need to fill in (if you want to move some screen components outside - then create a /components folder inside the corresponding screen folder; if the component you're going to create will be used on several screens - create the /components folder in the root of the project and place it there);
- /services - there are two already created services you should use inside add-inspiration screen to get random image and quote;
- /types - there are also some created types (look carefully through them, and also if you need to add a new one - do it here)
- use AsyncStorage to save the theme initializer
- initially, the application should use the light theme
- you feel free to choose the type of the stored item in the AsyncStorage - it can be string or boolean
ThemeContextcan return additional values if you need- The
StatusBartext color should change depending on the selected theme
- navigator should consist of two tabs 'Home' with the dashboard component and 'Settings' with the settings component
- each tab should have an icon (you can use
Ioniconsfrom "@expo/vector-icons"; to follow the example usehomeandsettingsicon names) - active tab icon and text should have a
PRIMARYcolor, and inactive ones -SECONDARY - tabs background should be the same for active tab and not active -
APP_BACKGROUND - the font for the screen headers and bottom tabs should be
LobsterTwo-Regularand have aPRIMARYcolor - the background of the screen header should be
APP_BACKGROUND - all colors should change depending on the selected theme
- should consist of the bottom tabs navigator and the
add-inspirationscreen - the font for the screen headers should be
LobsterTwo-Regularand have aPRIMARYcolor - the background of the screen header should be
APP_BACKGROUND - all colors should change depending on the selected theme
Every screen should have the background with two leaf.png images placed as shown in the example (consider creating a separate <ScreenBackground /> component and reusing it)
- the
dashboardscreen header should have theadd-circlebutton and after pressing it the user should be navigated to theadd-inspirationscreen - The
dashboardscreen should get the created Inspiration as a route params, store it in the state and render as a scrollable list. - if there are no created inspiration cards, the placeholder with the
empty-placeholder.pngimage and "No inspirations yet" text should be shown. - placeholder's text should have
LobsterTwo-Italicfont family
- has a background image with an additional blur layer with 30% of the
APP_BACKGROUNDcolor - the card should have a rounded border
- the quoted text is placed at the center of the card, should be shown on a half-transparent background, and have a minimum height of 50% of the card height
- the font color is always
FONT_INVERSE
- should have a
Switchto toggle the current theme - on the left of the switch the
sunnyicon is placed, on the right - themoonicon - Pay attention: for the light theme the trackColor should be
GREYand for the dark one -SECONDARY
-
screen header should contain the
arrowback button after pressing on which the user should be navigated back to the dashboard -
the back button should have the
PRIMARYcolor -
the
Savebutton should be disabled if no image and quote exist. -
- inspiration card preview (you can reuse the same component as for the dashboard list):
- while there is no image selected
no-image.jpgshould be used as a placeholder - while the quote is not added the text block on the card is not shown (meaning the half-transparent wrapper for the quote)
- while there is no image selected
- two buttons to manage the image adding:
- the
Choose imagebutton is used to select the image from the device gallery or camera- after pressing the
Alertis shown with 3 possible options: 'Gallery', 'Camera', and 'Cancel' - after choosing the Gallery permission should be requested and after it is granted, the user should be led to the gallery, choose the image and after applying it should be set as a card background
-
- after choosing the Camera permission should be requested and after it is granted user should be led to the camera, take a photo and after applying it should be set as a card background
-
- after choosing the Cancel the Alert is hidden and the image isn't set
- after pressing the
- the
Get random imagebutton uses thegetRandomImageservice as an onPress handler - after pressing the user should get the random image and it is set as a card background (hint: usedownload_urlfrom the response) -
- to work with gallery and permissions you have the
expo-image-pickerlibrary installed
- the
- text input to add your own quote - should have placeholder with Enter your quote here... text, color for the placeholder -
SECONDARY, text color for the light theme -FONT_MAIN, for the dark -FONT_INVERSE -
- the
Get random quotebutton uses thegetRandomQuoteservice as an onPress handler - after pressing the user should get the random quote and it is set as a card quote (Pay attention: if previously the user has entered a quote in the input it should be cleared after pressing this button) Savebutton - after pressing it the user should be navigated to the dashboard and the inspiration card should appear in the list. When disabled the opacity is set to0.5. It should be filled, not outlined as other buttons on the screen.- all the buttons, except the
Saveshould have the thinnest available border width and border color set toPRIMARY
- inspiration card preview (you can reuse the same component as for the dashboard list):
To get additional points you can:
- add keyboard-avoiding logic for the
app-inspirationscreen

