If we know how to create React web apps but want to develop mobile apps, we can use the Ionic framework.
In this article, we’ll look at how to get started with mobile development with the Ionic framework with React.
Getting Started
We can get started by installing a few things.
First, we install the Ionic CLI globally by running:
npm install -g @ionic/cli native-run cordova-res
Next, we can create our Ionic app project by running:
ionic start ionic-app tabs --type=react --capacitor
tabs
adds tabs to the app.
type
set to react
means we’ll create a React project
--capacitor
means we add Capacitor so we can run and build a native app from our project files.
Then we run:
npm install @ionic/react-hooks @ionic/pwa-elements
in the ionic-app
project folder to install the React hooks for our project.
Then to run the app in the browser, we run:
ionic serve
Running the App with Genymotion
To run our app with Genymotion and built a native app, we need to do more things.
First, we run:
ionic build
to create the assets folder.
Then we run:
npx cap add android
npx cap sync
to add the Android dependencies.
Then we need to install Android Studio and Genymotion.
After we install Android Studio, we install the Genymotion plugin for Android Studio.
Once we did that, we run:
ionic capacitor run android --livereload --external --address=0.0.0.0
to preview our app in Genymotion.
Now we should see the app reload live.
Creating a Camera App
We can create a camera app easily with Ionic.
To do this, we go to Tab1.tsx
and write:
pages/Tab1.tsx
import React, { useEffect, useState } from 'react';
import { IonButton, IonCol, IonContent, IonGrid, IonHeader, IonImg, IonPage, IonRow, IonTitle, IonToolbar } from '@ionic/react';
import ExploreContainer from '../components/ExploreContainer';
import './Tab1.css';
import { useCamera } from '@ionic/react-hooks/camera';
import { CameraResultType, CameraSource } from "@capacitor/core";
interface Photo {
filepath: string;
webviewPath?: string;
}
function usePhotoGallery() {
const { getPhoto } = useCamera();
const [photos, setPhotos] = useState<Photo[]>([]);
const takePhoto = async () => {
const cameraPhoto = await getPhoto({
resultType: CameraResultType.Uri,
source: CameraSource.Camera,
quality: 100
});
const fileName = new Date().getTime() + '.jpeg';
const newPhotos = [{
filepath: fileName,
webviewPath: cameraPhoto.webPath
}, ...photos];
setPhotos(newPhotos)
};
return {
photos,
takePhoto
};
}
const Tab1: React.FC = () => {
const { photos, takePhoto } = usePhotoGallery();
return (
<IonPage>
<IonHeader>
<IonToolbar>
<IonTitle>Tab 1</IonTitle>
</IonToolbar>
</IonHeader>
<IonContent fullscreen>
<IonGrid>
<IonRow>
<IonButton onClick={takePhoto}>take photo</IonButton>
</IonRow>
<IonRow>
{photos.map((photo, index) => (
<IonCol size="6" key={index}>
<IonImg src={photo.webviewPath} />
</IonCol>
))}
</IonRow>
</IonGrid>
</IonContent>
</IonPage>
);
};
export default Tab1;
This is the code for the whole camera app.
We created the usePhotoGallery
hook that uses the useCamera
hook to call the getPhoto
function to create the cameraPhoto
object.
With it, the camera will show.
Then we add the newPhotos
array to get the photo and put it in the photos
array.
The webviewPath
has the path of the photo.
In the Tab1
component, we added an IonButton
to show the take photo button.
We set the onClick
prop to the takePhoto
function to show the camera and take the photo.
Then once we’re done taking the photo, we get the photos from the photos
array and display them.
Conclusion
We can create a simple app with Ionic easily.