Uploaded by crazzy_rangers

Lucrare Disertatie Boariu Dan-Andrei

advertisement
UNIVERSITATEA DIN CRAIOVA
FACULTATEA DE ŞTIINTE
SPECIALIZAREA METODE ŞI MODELE ÎN INTELIGENŢA
ARTIFICIALĂ
LUCRARE DE DISERTAŢIE
Îndrumător ştiinţific:
< BOLDEA Costin Radu >
CRAIOVA
2023
Absolvent:
< BOARIU Dan-Andrei>
UNIVERSITATEA DIN CRAIOVA
FACULTATEA DE ŞTIINTE
SPECIALIZAREA METODE ŞI MODELE ÎN INTELIGENŢA
ARTIFICIALĂ
Aplicație multiplatformă de
gestiune a pieței horticole
Îndrumător ştiinţific:
< BOLDEA Costin Radu >
Absolvent:
< BOARIU Dan-Andrei>
CRAIOVA
2023
Cuprins
1.Introducere.....................................................................................4
1.1 Obiectivele şi structura lucrări...............................................4
1.2 Importanţa şi actualitatea unei aplicatii de delivery..............4
1.3 Rezumatul Proiectului............................................................5
1.4 Scurt istoric.............................................................................6
2. Partea I.............................................................................................7
2.1 Analiza stadiului cunoaşterii în domeniul...............................7
2.2 Tehnologii folosite...................................................................8
2.2.1 JavaScript..........................................................................8
2.2.2 JSX & Babel......................................................................9
2.2.3 Node.js & Npm package manager....................................10
2.2.4 Expo..................................................................................11
2.2.5 React Navigation...............................................................12
2.2.6 React native maps..............................................................14
2.2.7 React Redux ToolKit.........................................................15
2.2.8 Sanity.io.............................................................................16
2.2.9 TailwindCSS.....................................................................17
2.2.10 React native Feather – Icons...........................................18
3. Partea II..............................................................................................19
3.1 Prezentarea Aplicatiei..............................................................19
4. Concluzii.............................................................................................45
5. Bibliografie........................................................................................45
1.Introducere
1.1 Obiectivele şi structura lucrări
Aceasta aplicatie a fost realizata prin intermediul framework-ului de dezvoltare a
aplicațiilor mobile care permite programatorilor să creeze aplicații pentru iOS și
Android utilizând JavaScript și React.
Am folosit clase JavaScript pentru realizarea structurii proiectului astfel:

Pentru a putea crea pagina de inceput, Home Screen am importat diferiti
parametrii cu ajutorul framework-ului React Native.

Am creat diferite fisiere in folderul Screens, pentru fiecare ecran visibil in
aplicatie, iar pentru a putea face ca aceste ecrane sa fie functionale, am creat
diferite foldere unde am stocat datele .

Am importat si instalat in aplicatie diferite comenzi din React Native, Redux,
Sanity pentru o buna funtionare a aplicatiei.

Aplicatia poate fi testata pe android, cat si pe iOS cu ajutorul unui Virtual
Device, sau conectand direct telefonul la alicatie.

Am implementat si adaugat la proiect un server unde vom stoca diferitele
imagini cu plante pe care le vom putea vizualiza.

Imaginile din aplicatie sunt prima data puse de aspect intr-un folder index.js
ca mai apoi cand vom stoca datele in Sanity, sa putem afisa diferite date si
imagini.

Instalarea diferitelor tool-uri in React pentru a putea face Navigatia intre
pagini, precum si obtinerea unei harti din google maps.
1.2 Importanţa şi actualitatea unei aplicatii de
delivery
O astfel de aplicație le permite clienților să achiziționeze plante și produse asociate
direct de pe dispozitivele lor mobile, fără a fi nevoie să meargă fizic la un magazin si
asta o face convenienta pentru utilizatori. De asemenea, in ultimii ani, plantele de
interior au devenit extrem de populare. Mulți oameni se bucură să aibă plante în
casele și birourile lor, datorită beneficiilor estetice și pentru sănătate. O aplicație de
magazin de plante care oferă servicii de livrare se aliniază cu această tendință și
poate beneficia de creșterea continuă a comerțului online.
O aplicație de livrare a plantelor poate ajunge la clienți din întreaga zonă geografică
acoperită de serviciul de livrare. Acest lucru oferă o oportunitate de a extinde baza de
clienți și de a genera venituri suplimentare.
Într-o societate tot mai preocupată de mediul înconjurător și sustenabilitate, o
aplicație de magazin de plante care include și livrare poate promova și oferi plante
cultivate în mod sustenabil, produse ecologice și ambalaje prietenoase cu mediul.
1.3 Rezumatul Proiectului
Acest proiect are ca scop realizarea unei aplicatii mobile pe o platforma de Android
generata cu un virtual device disponibil si cu ajutorul caruia putem observa rezultate
in timp real cu aplicatia creata.
Aplicatia cuprinde diferite actiuni si butoane prin care ne putem deplasa inainte si
inapoi cu produsele achizitionate si pentru a puteam vizualiza cosul de cumparaturi:

Folder Screens unde avem interfetele fiecarei pagini a aplicatiei

Folder components unde avem fiecare componenta ce va fi apelata in paginile
principale, felurile de plante, produsele ce pot fi afisate.

Un folder constants in care am incarcat cateva imagini si iconite cu plante,
produse horticole si despre livrare.

In folderul de assets am creat folderul de images pentru pozele principale pe
care le voi afisa la inceputul aplicatiei, acestea nu includ diferitele iconite de
pe prima pagina si nici pozele cu diferite produse din magazin.

Folderul Slices unde avem 2 fisiere pentru cosul de cumparaturi si magazinul
principal, iar aceste fisiere ne arata cum definim valorile pentru magazin si
pentru cos

Schimbari au fost facute si in fisierele create automat de catre React, astfel
incat sa putem afisa rezultatul dorit pe aplicatia noastra

Folderul Server reprezinta partea importanta a aplicatiei unde salvam si
stocam datele pentru cod, cat si imaginile produselor ce vor fi adaugate in
magazin.

In folderul Server lucram cu Sanity, o platforma de gestionare a continutului.
Aceasta oferă un sistem de gestionare a conținutului structurat, care permite
crearea, editarea și publicarea conținutului într-un mod ușor și intuitiv. Cu
ajutorul Sanity.io, putem gestiona conținutul pentru aplicații mobile sau orice
alt proiect digital. Platforma oferă un editor de conținut personalizabil și un
API puternic.
1.4 Scurt istoric
React Native este un framework de dezvoltare a aplicațiilor mobile care a fost creat
și lansat inițial de către Facebook în martie 2015. Ideea principală din spatele React
Native a fost de a permite dezvoltatorilor să creeze aplicații mobile native pentru iOS
și Android utilizând JavaScript și biblioteca React, care a fost deja populară pentru
dezvoltarea de aplicații web.
React Native a fost conceput ca o abordare mai eficientă și reutilizabilă în
comparație cu dezvoltarea tradițională a aplicațiilor native pentru fiecare platformă în
parte. Prin utilizarea React Native, dezvoltatorii pot crea o singură bază de cod care
poate fi folosită pentru ambele platforme mobile, eliminând astfel necesitatea de a
dezvolta și întreține două seturi separate de cod.
Framework-ul a câștigat rapid popularitate în rândul comunității de dezvoltatori,
oferindu-le posibilitatea de a dezvolta aplicații mobile cu performanță nativă, fără a
fi nevoie să învețe limbajele și instrumentele specifice fiecărei platforme. Acest lucru
a deschis ușa pentru dezvoltatori să își extindă abilitățile de dezvoltare și să creeze
aplicații mobile cross-platform într-un mod mai eficient și mai rapid.
O caracteristică cheie a React Native este arhitectura sa bazată pe componente.
Dezvoltatorii pot construi interfețe de utilizator complexe prin combinarea și
reutilizarea componentelor React Native predefinite și personalizate. Această
abordare modulară facilitează dezvoltarea și întreținerea aplicațiilor, permițând
echipelor să lucreze în paralel și să facă actualizări rapide.
React Native oferă, de asemenea, acces la module și API-uri native, permițând
dezvoltatorilor să integreze funcționalități specifice platformei în aplicații. Aceasta
înseamnă că dezvoltatorii pot utiliza caracteristici precum camera, GPS, notificări
push și multe altele, pentru a oferi o experiență nativă și bogată utilizatorilor.
2. Partea I
2.1 Analiza stadiului cunoaşterii în domeniul
cercetat
Analiza stadiului cunoașterii în JavaScript și React Native este crucială pentru a evalua
competențele și a determina nivelul de pregătire și abilități necesare pentru a dezvolta aplicații
mobile de succes.
În ceea ce privește JavaScript, este important să se evalueze nivelul de cunoaștere a limbajului în
sine, inclusiv sintaxa, structurile de control, funcțiile, obiectele și manipularea datelor. O
persoana care lucreaza cu JavaScript ar trebui să aibă o înțelegere solidă a conceptelor
fundamentale, precum closure-uri, evenimente, prototipuri și programare asincronă.
De asemenea, este important să se evalueze cunoașterea despre biblioteca React. React este un
instrument puternic pentru construirea interfețelor utilizator, iar familiarizarea cu conceptele
React, cum ar fi componente, JSX, starea (state), props-uri și ciclul de viață al componentelor,
este esențială pentru a putea lucra cu succes în cadrul React Native.
Pe lângă cunoștințele de bază în JavaScript și React, trebuie să avem o înțelegere aprofundată a
conceptelor specifice React Native. Acest lucru include navigarea între ecrane, gestionarea stării
(state management), lucrul cu API-uri și integrarea cu module native. Familiarizarea cu
arhitecturile și framework-urile populare din ecosistemul React Native, cum ar fi Redux sau
React Navigation,
Astfel, analiza stadiului cunoașterii în JavaScript și React Native poate oferi o imagine clară
asupra nivelului de competență și a abilităților tehnice în dezvoltarea de aplicații mobile.
Aceasta poate ajuta la identificarea lacunelor de cunoștințe și la dezvoltarea unui plan de
dezvoltare și instruire adecvat pentru a îmbunătăți nivelul de competență și a asigura succesul
proiectelor viitoare în domeniul dezvoltării mobile cu React Native.
2.2 Tehnologii folosite
2.2.1 JavaScript
Istoria lui JavaScript în contextul React Native este deosebit de interesantă, deoarece reflectă
evoluția limbajului și impactul său în dezvoltarea aplicațiilor mobile.
JavaScript a fost creat de Brendan Eich în anii '90 ca limbaj de scripting pentru browserele web.
Inițial, a fost denumit LiveScript, dar a fost ulterior redenumit în JavaScript pentru a beneficia de
popularitatea limbajului Java. Încă de la început, JavaScript a avut un rol important în
interactivitatea și dinamismul paginilor web, adăugând funcționalități și interacțiuni interactive.
De-a lungul timpului, JavaScript a devenit unul dintre cele mai populare limbaje de programare
din lume, datorită adoptării sale extinse în dezvoltarea web. A apărut standardul ECMAScript,
care definește specificațiile JavaScript și adaugă noi caracteristici și funcționalități în fiecare
versiune. Dezvoltatorii au putut beneficia de avantajele unui limbaj versatil și dinamic, capabil
să se extindă în diferite domenii ale dezvoltării software.
Cu apariția framework-ului React, dezvoltat de Facebook, JavaScript a câștigat o importanță
deosebită în dezvoltarea aplicațiilor web.
În ceea ce privește dezvoltarea cu React Native, JavaScript joacă un rol crucial. Dezvoltatorii
utilizează JavaScript pentru a scrie logica aplicației, gestionarea datelor și interacțiunea cu
componentele. De asemenea, React Native folosește JSX, o extensie a limbajului JavaScript,
pentru a defini structura interfeței utilizator într-un format asemănător HTML, făcându-l mai
ușor de citit și de scris.
O altă tehnologie importantă în dezvoltarea cu React Native este Babel. Babel este un compilator
JavaScript utilizat pentru a transforma codul scris în sintaxa JSX în JavaScript standard, astfel
încât să poată fi interpretat și rulat de către dispozitivele mobile.
De-a lungul anilor, JavaScript și React Native au continuat să se dezvolte și să își consolideze
poziția în industria dezvoltării de aplicații mobile. Comunitatea de dezvoltatori s-a extins și a
contribuit la creșterea ecosistemului React Native, prin crearea de biblioteci, instrumente și
resurse pentru a facilita procesul de dezvoltare.
, JavaScript a avut un impact semnificativ în dezvoltarea aplicațiilor mobile cu React Native.
Evoluția limbajului și apariția framework-ului React au deschis noi orizonturi în dezvoltarea
interfețelor mobile, permițând dezvoltatorilor să creeze aplicații mobile native folosind un singur
limbaj de programare.
2.2.2 JSX & Babel
Babel și JSX sunt două tehnologii pe care le folosesc în mod frecvent în dezvoltarea mea de
aplicații mobile cu React Native. Ca persoană care lucrează în acest domeniu, apreciez
versatilitatea și puterea acestor tehnologii în procesul de dezvoltare.
Babel este un compilator JavaScript, care îmi permite să utilizez caracteristici de limbaj
JavaScript mai noi și să le transform într-un format compatibil cu toate browserele și mediile de
execuție. Ca persoană care utilizează Babel, pot scrie codul meu într-un stil modern, utilizând
funcționalități precum arrow functions, destructuring, spread operators și multe altele, fără a-mi
face griji cu privire la compatibilitatea cu mediile mai vechi sau browserele mai puțin suportate.
Utilizarea Babel în proiectul meu cu React Native este esențială pentru a profita de avantajele
oferite de JavaScript mai nou și pentru a scrie codul într-un mod mai concis și mai expresiv.
Acest lucru îmi permite să dezvolt aplicații mai eficiente și să îmbunătățesc productivitatea în
procesul de dezvoltare.
Unul dintre aspectele importante ale utilizării Babel în aplicațiile mele mobile este integrarea sa
cu JSX (JavaScript XML). JSX este o extensie a limbajului JavaScript care îmi permite să
construiesc interfețe utilizator într-un mod declarativ, asemănător cu HTML. În loc să
construiesc interfețele utilizator folosind metode de creare a elementelor în JavaScript pur, pot
utiliza sintaxa JSX pentru a crea componente React Native direct în codul meu JavaScript.
Ca persoană care utilizează JSX în aplicațiile mele React Native, apreciez felul în care acesta
îmbunătățește lizibilitatea și modularitatea codului meu. Pot defini componente vizuale
complexe utilizând sintaxa familiară a XML-ului și pot integra în mod transparent expresii
JavaScript pentru a manipula date și a crea interacțiuni dinamice. Acest lucru facilitează procesul
de dezvoltare și mă ajută să creez interfețe utilizator mai puternice și mai flexibile.
O altă caracteristică importantă a utilizării Babel și JSX este posibilitatea de a utiliza diferite
plugin-uri și configurații pentru a personaliza comportamentul compilatorului. Pot adăuga și
configura plugin-uri pentru a transforma și optimiza codul meu în funcție de nevoile specifice ale
aplicației. Acest nivel ridicat de configurabilitate îmi permite să optimizez performanța și
dimensiunea aplicației, adaptând compilatorul la cerințele mele specifice.
În concluzie, ca persoană care dezvoltă aplicații mobile cu React Native, Babel și JSX sunt
instrumente esențiale în fluxul meu de lucru. Aceste tehnologii îmi permit să utilizez
caracteristici JavaScript mai noi și să construiesc interfețe utilizator declarative și puternice.
Utilizarea Babel și JSX îmbunătățește calitatea și productivitatea dezvoltării mele, oferindu-mi
flexibilitatea și puterea de a crea aplicații mobile de înaltă calitate.
2.2.3 Node.js & Npm package manager
Node.js și npm sunt instrumente esențiale pe care le folosesc în mod regulat în dezvoltarea mea
de aplicații mobile. Ca persoană care lucrează în domeniul tehnologiei, apreciez mult
flexibilitatea și eficiența pe care le oferă aceste tehnologii în procesul de dezvoltare.
Node.js este un runtime JavaScript construit pe motorul V8 al Google, care permite executarea
codului JavaScript în afara browserului. Ca persoană care lucrează cu Node.js, pot utiliza
JavaScript nu doar pentru dezvoltarea aplicațiilor web, ci și pentru construirea aplicațiilor serverside și a aplicațiilor mobile cu React Native. Acest lucru mă ajută să împărtășesc aceeași bază de
cod între diferitele tipuri de aplicații, ceea ce reduce complexitatea și facilitează dezvoltarea.
Un aspect esențial al utilizării Node.js este modul în care gestionează pachetele și dependințele.
Acest lucru este posibil datorită npm (Node Package Manager), care este unul dintre cele mai
populare și utilizate gestionare a pachetelor pentru JavaScript. Ca persoană care lucrează cu
npm, pot căuta, instala și gestiona cu ușurință pachete și module externe necesare în dezvoltarea
aplicațiilor mele. Acesta facilitează colaborarea cu alți dezvoltatori și îmi oferă acces la o gamă
largă de resurse și funcționalități dezvoltate de comunitatea globală.
Prin intermediul npm, pot adăuga pachete externe în proiectul meu cu doar câteva comenzi
simple. Aceasta include și pachetele necesare pentru dezvoltarea aplicațiilor mobile cu React
Native, precum și orice alte module sau biblioteci de care am nevoie. Acesta simplifică procesul
de integrare a funcționalităților complexe în aplicația mea și îmi permite să mă concentrez pe
partea de dezvoltare specifică a aplicației.
Unul dintre avantajele folosirii npm este modul în care gestionează versiunile și actualizările
pachetelor. Pot specifica versiunile necesare pentru fiecare pachet în fișierul package.json al
proiectului meu, ceea ce înseamnă că pot menține un control strâns asupra dependințelor și pot
asigura compatibilitatea între diferitele module utilizate în aplicație. De asemenea, npm
facilitează actualizarea la cele mai recente versiuni ale pachetelor cu doar câteva comenzi,
oferindu-mi acces la cele mai noi caracteristici și îmbunătățiri.
O altă caracteristică valoroasă a npm este modul în care susține comunitatea open-source și
colaborarea între dezvoltatori. Prin intermediul npm, pot împărtăși propriile pachete și module cu
alte persoane, facilitând dezvoltarea în echipă și îmbunătățirea colaborării. De asemenea, pot
contribui la dezvoltarea pachetelor existente prin raportarea problemelor, sugerarea de
îmbunătățiri și chiar prin contribuții de cod.
Utilizarea Node.js și npm în dezvoltarea aplicațiilor mobile cu React Native aduce numeroase
avantaje pentru persoanele ca mine. Aceste tehnologii îmi oferă flexibilitate, eficiență și acces la
resursele necesare pentru a crea aplicații mobile de înaltă calitate. Prin intermediul Node.js și
npm, pot dezvolta aplicații mobile puternice și performante, în timp ce beneficiez de o
comunitate globală activă și de un ecosistem bogat de pachete și module.
În concluzie, ca persoană care dezvoltă aplicații mobile cu React Native, Node.js și npm sunt
instrumente esențiale în arsenalul meu de dezvoltare. Aceste tehnologii îmi oferă libertatea și
puterea de a crea aplicații mobile complexe, gestionând cu ușurință pachetele și dependințele și
beneficiind de contribuțiile și resursele comunității globale.
2.2.4 Expo
Expo este o platformă și un set de instrumente care facilitează dezvoltarea de aplicații mobile
cross-platform cu ajutorul React Native.
React Native este un framework pentru dezvoltarea de aplicații mobile, care permite scrierea de
cod JavaScript pentru a crea aplicații native pentru platformele iOS și Android. Cu toate acestea,
procesul de configurare și dezvoltare a unei aplicații React Native poate fi complex și implică
cunoștințe extinse despre platformele specifice și setările de mediu. Acesta este locul în care
Expo intră în scenă.
Expo oferă un set de instrumente și servicii care elimină complexitatea configurării și dezvoltării
unei aplicații mobile React Native. Una dintre cele mai mari avantaje ale Expo este faptul că nu
necesită o configurare specifică platformei sau instalarea unor SDK-uri și dependențe complexe.
Expo oferă un mediu de dezvoltare unificat, care poate fi utilizat pe platforme Windows, macOS
și Linux.
Pentru a începe să folosim Expo, trebuie să instalam Expo CLI (Command Line Interface) pe
computer. Acesta este un instrument de linie de comandă care permite crearea, rularea și
gestionarea proiectelor Expo. Expo CLI poate fi instalat prin intermediul npm, folosind comanda
npm install -g expo-cli.
După instalare, putem crea un proiect Expo utilizând comanda expo init. Acesta va crea o
structură de proiect preconfigurată, care include toate setările și dependențele necesare pentru
dezvoltarea unei aplicații mobile React Native. Expo oferă, de asemenea, un șablon de proiect
predefinit, care include funcționalități comune, cum ar fi navigația, gestionarea stării și
autentificarea.
Expo Go este o aplicație mobilă disponibilă pe platformele iOS și Android, dezvoltată de echipa
Expo, care oferă posibilitatea de a rula și testa aplicațiile Expo direct pe dispozitivele mobile.
Expo Go oferă o experiență similară cu cea a aplicației native, deoarece aplicația Expo este
rulată direct pe dispozitivul mobil, folosind toate funcționalitățile și interfețele utilizatorului
specifice platformei. Acest lucru facilitează testarea și verificarea aspectului și comportamentului
aplicației pe dispozitivul final, înainte de a o publica în App Store sau Google Play Store.
Expo Go oferă și alte funcționalități utile, cum ar fi suport pentru notificări push, înregistrarea și
analiza erorilor, monitorizarea performanței și multe altele. Aceste funcționalități extind puterea
și flexibilitatea Expo Go și facilitează dezvoltarea și testarea aplicațiilor mobile Expo într-un
mod eficient și rapid.
Expo oferă, de asemenea, o gamă largă de API-uri și servicii care pot fi utilizate în aplicație.
Acestea includ API-uri pentru camere, localizare, notificări push, autentificare socială și multe
altele. Expo simplifică integrarea acestor funcționalități în aplicație, eliminând necesitatea de a
lucra direct cu API-urile platformei specifice.
Astfel, Expo este o soluție puternică și eficientă pentru dezvoltarea de aplicații mobile crossplatform cu React Native. Cu ajutorul Expo, dezvoltatorii pot crea rapid aplicații mobile de înaltă
calitate, cu o experiență nativă, pe diferite platforme. Expo facilitează procesul de dezvoltare și
testare, oferind un mediu unificat și un set de instrumente și servicii pentru gestionarea
aplicațiilor Expo.
2.2.5 React Navigation
React Navigation este o bibliotecă populară pentru gestionarea navigației în aplicațiile React
Native. Ea oferă un set de componente și metode care permit dezvoltatorilor să creeze fluxuri de
navigare eficiente și intuitive în aplicațiile lor.
Una dintre caracteristicile remarcabile ale React Navigation este abordarea sa bazată pe
componente. Biblioteca utilizează componente React pentru a defini ecranele și navigarea între
acestea. Aceasta facilitează crearea unei ierarhii clare și modulare a ecranelor și navigației, ceea
ce este esențial pentru aplicațiile cu multiple ecrane și fluxuri complexe.
React Navigation oferă mai multe tipuri de navigatori, inclusiv Stack Navigator, Tab Navigator
și Drawer Navigator. Acești navigatori permit dezvoltatorilor să implementeze diferite tipuri de
navigație, cum ar fi navigarea în bază de stivă (stiva de ecrane), navigarea prin file (tab-uri) și
navigarea prin meniul tip sertar (drawer). Alegerea unui navigator potrivit depinde de tipul de
navigație pe care dezvoltatorul dorește să-l implementeze în aplicație.
Biblioteca oferă, de asemenea, suport pentru parametri de navigare, ceea ce permite trimiterea de
date între ecrane și personalizarea comportamentului navigației în funcție de aceste date.
Dezvoltatorii pot transmite și primi parametri între ecranele aplicației, permițând astfel o
interacțiune flexibilă între diferitele ecrane și componente.
React Navigation oferă, de asemenea, o gamă largă de opțiuni pentru configurarea și
personalizarea navigației. Dezvoltatorii pot defini aspectul și comportamentul navigației,
inclusiv animațiile de tranziție între ecrane, stilizarea anteturilor și picioarelor ecranelor și
gestionarea modului de revenire la ecranele anterioare.
O altă caracteristică importantă a React Navigation este suportul pentru navigarea în moduri
diferite, cum ar fi navigarea bazată pe gesturi și navigarea în modul ecran complet (full-screen).
Aceste funcționalități îmbunătățesc experiența utilizatorului și permit dezvoltatorilor să creeze
aplicații cu un aspect și o interacțiune modernă și intuitivă.
Pe lângă caracteristicile menționate mai sus, React Navigation oferă și suport pentru navigația
profundă (deep linking), gestionarea stării (state management) a navigației, integrarea cu alte
biblioteci și framework-uri populare, cum ar fi Redux, și multe altele. De asemenea, biblioteca
este activ întreținută și actualizată de o comunitate mare și implicată de dezvoltatori, asigurând
astfel un suport constant și îmbunătățiri continue.
Astfel ca, React Navigation este o bibliotecă esențială pentru gestionarea navigației în aplicațiile
React Native. Aceasta oferă un set de componente și metode care facilitează crearea de fluxuri
de navigare eficiente și personalizabile. React Navigation permite dezvoltatorilor să
implementeze diferite tipuri de navigație, să trimită și să primească parametri între ecrane și să
configureze aspectul și comportamentul navigației. Cu suportul său extins și actualizări continue,
React Navigation reprezintă o alegere populară pentru dezvoltarea aplicațiilor mobile React
Native.
2.2.6 React native maps
React Native Maps este o bibliotecă extrem de utilă și populară în cadrul utilizării hărților
interactive în aplicațiile mobile pentru persoane. Aceasta aduce funcționalități avansate de hartă
în aplicațiile mobile, permițând persoanelor să afișeze, să interacționeze și să personalizeze
hărțile într-un mod flexibil și eficient.
Principala caracteristică a React Native Maps este posibilitatea de a afișa hărți interactive bazate
pe platforme precum Google Maps sau Apple Maps. Biblioteca oferă componente precum
`MapView` care permit integrarea și afișarea hărților în aplicație. Aceste componente pot fi
personalizate cu diverse opțiuni, cum ar fi centrarea hărții pe o anumită locație, setarea nivelului
de zoom și controlul aspectului vizual al hărții.
O altă funcționalitate esențială oferită de React Native Maps este adăugarea de markeri pe hartă.
Acești markeri pot fi utilizați pentru a indica locații specifice, cum ar fi puncte de interes, adrese
sau locații personalizate. Persoanele pot seta diverse proprietăți pentru markeri, precum poziția
geografică, imaginea sau pictograma asociată și informațiile adiționale afișate când
interacționează cu markerul.
React Native Maps permite și desenarea de polilinii și poligoane pe hartă. Aceasta este utilă
pentru reprezentarea și evidențierea traseelor sau a anumitor zone geografice în aplicații.
Persoanele pot defini punctele componente ale unei polilinii sau poligon și le pot stiliza cu
diverse culori, grosimi sau tipuri de linie pentru a îmbunătăți claritatea și aspectul vizual al hărții.
Biblioteca oferă, de asemenea, funcționalități de interacțiune cu harta, cum ar fi detectarea
evenimentelor de apăsare sau glisare. Aceasta permite persoanelor să răspundă la acțiunile
utilizatorilor și să implementeze funcționalități specifice, cum ar fi afișarea detaliilor despre
locație sau navigarea la o altă pagină a aplicației în funcție de evenimentele de interacțiune.
Un alt aspect important al React Native Maps este suportul pentru geolocație. Biblioteca
facilitează obținerea și utilizarea informațiilor despre locația curentă a persoanelor în timp real.
Aceasta permite afișarea locației persoanelor pe hartă și implementarea funcționalităților
specifice, cum ar fi găsirea de locații apropiate sau urmărirea persoanelor pe parcursul unei rute.
React Native Maps oferă și posibilitatea de a utiliza straturi suplimentare pe hartă. Acestea pot
include informații adiționale, cum ar fi imagini satelitare, date meteorologice sau informații
despre trafic. Persoanele pot integra aceste straturi suplimentare și le pot utiliza pentru a
îmbogăți și a personaliza experiența utilizatorului cu ajutorul hărților.
În concluzie, React Native Maps reprezintă o soluție puternică pentru integrarea și utilizarea
hărților interactive în aplicațiile mobile pentru persoane. Biblioteca oferă funcționalități
avansate, cum ar fi afișarea hărților, adăugarea de markeri, desenarea de trasee și suport pentru
geolocație. Utilizarea React Native Maps permite persoanelor să creeze aplicații mobile cu o
experiență de hartă interactivă, personalizată și captivantă.
2.2.7 React Redux ToolKit
React Redux Toolkit este o bibliotecă puternică și ușor de utilizat în cadrul dezvoltării
aplicațiilor mobile React Native, care facilitează gestionarea stării aplicației și administrarea
fluxului de date. Aceasta aduce un set de unelte și convenții pentru a simplifica și eficientiza
dezvoltarea aplicațiilor mobile.
Una dintre caracteristicile principale ale React Redux Toolkit este "Slice". Un "Slice" reprezintă
o bucată din starea aplicației și conține reducerul corespunzător și acțiunile asociate. Persoanele
pot defini "Slices" pentru diferitele aspecte ale stării aplicației, cum ar fi autentificarea
utilizatorilor, produsele dintr-un coș de cumpărături sau preferințele utilizatorilor. Aceasta
permite persoanelor să gestioneze și să actualizeze starea în mod organizat și modular.
React Redux Toolkit oferă, de asemenea, funcționalitatea de a crea reduceri și acțiuni într-un
mod simplificat și declarativ. Persoanele pot defini reducerii și acțiunile într-un singur loc
folosind funcțiile createSlice() și createAction(). Aceste funcții abstractizează și automatizează
procesele de creare a reducerilor și acțiunilor, eliminând astfel codul redundant și repetitiv.
Persoanele pot utiliza apoi reducerii și acțiunile create pentru a actualiza starea aplicației într-un
mod simplu și intuitiv.
React Redux Toolkit oferă și un mod convenabil de a combina reducerii și acțiunile într-un
"store" global. Acest "store" reprezintă starea centralizată a aplicației și poate fi accesată de orice
componentă din aplicație. Persoanele pot utiliza funcția configureStore() pentru a configura
"store"-ul și a-l conecta la aplicație. Aceasta facilitează gestionarea stării aplicației și permite
persoanelor să acceseze și să actualizeze starea într-un mod eficient și organizat.
React Redux Toolkit promovează, de asemenea, utilizarea conceptului de "immer" pentru a
actualiza starea. "Immer" este o bibliotecă care permite actualizarea stării într-un mod imutabil și
declarativ. Persoanele pot utiliza funcția createReducer() din React Redux Toolkit împreună cu
"immer" pentru a actualiza starea într-un mod sigur și eficient, evitând astfel mutațiile directe ale
stării.
În concluzie, React Redux Toolkit este o bibliotecă puternică și ușor de utilizat pentru
gestionarea stării aplicațiilor mobile React Native pentru persoane. Aceasta aduce un set de
unelte și convenții care facilitează dezvoltarea și administrarea fluxului de date într-un mod
simplu și eficient. Utilizarea React Redux Toolkit permite persoanelor să creeze aplicații mobile
cu o gestionare eficientă a stării și un flux de date coerent, sporind astfel productivitatea și
calitatea dezvoltării aplicațiilor mobile.
2.2.8 Sanity.io
Prin intermediul unei interfețe ușor de utilizat și a unui API puternic, Sanity.io facilitează
crearea, organizarea și gestionarea conținutului aplicației mobile.
Folosirea Sanity.io în aplicațiile mobile React Native presupune integrarea bibliotecii Sanity
Client în proiectul de React Native. Persoanele pot utiliza această bibliotecă pentru a comunica
cu API-ul Sanity.io și pentru a accesa și manipula datele stocate în CMS. Prin intermediul
interfeței de programare a aplicațiilor (API), persoanele pot crea, citi, actualiza și șterge date,
facilitând astfel interacțiunea cu conținutul aplicației mobile.
Pentru a începe utilizarea Sanity.io într-un proiect de React Native, persoanele trebuie să urmeze
câțiva pași. În primul rând, trebuie să creeze un cont Sanity.io și să configureze un proiect. Apoi,
trebuie să definească schemele de date pentru conținutul aplicației mobile, cum ar fi articole,
imagini, pagini etc. Aceste scheme de date vor defini structura și tipurile de date pe care le va
conține conținutul aplicației mobile.
După ce schemele de date sunt definite, persoanele pot instala și configura Sanity Client în
proiectul de React Native. Aceasta implică adăugarea dependențelor necesare și configurarea
setărilor de conectare la proiectul Sanity.io. Odată ce Sanity Client este configurat, persoanele
pot utiliza comenzile și metodele disponibile pentru a accesa și manipula datele din CMS.
Sanity.io este folosit în aplicațiile mobile React Native pentru a facilita stocarea și gestionarea
datelor. Oferă un mediu centralizat pentru stocarea conținutului, inclusiv text, imagini,
videoclipuri și altele. Persoanele pot utiliza interfața de administrare a Sanity.io pentru a adăuga,
actualiza și șterge conținutul într-un mod vizual și intuitiv. Aceasta permite persoanelor nontehnice, cum ar fi conținutul redactorilor sau designerii, să contribuie la conținutul aplicației
mobile fără a avea nevoie de cunoștințe tehnice avansate.
Unul dintre avantajele majore ale utilizării Sanity.io în aplicațiile mobile React Native este
scalabilitatea. Platforma poate gestiona volume mari de conținut și poate face față traficului
sporit al aplicației mobile. De asemenea, oferă un API puternic și flexibil care permite
personalizarea și extinderea funcționalității CMS-ului conform nevoilor aplicației.
Un alt avantaj al Sanity.io este viteza și performanța sa. Datele sunt stocate într-o bază de date
scalabilă și optimizată, ceea ce permite accesul rapid la conținutul aplicației mobile. De
asemenea, Sanity.io folosește tehnici avansate de cache și livrare a conținutului, permițând
aplicației mobile să se încarce rapid și să ofere o experiență fluidă utilizatorilor.
În concluzie, Sanity.io este o soluție puternică și ușor de utilizat pentru gestionarea conținutului
în aplicațiile mobile React Native pentru persoane. Oferă un mediu centralizat și scalabil pentru
stocarea și gestionarea datelor, facilitând colaborarea între echipele de dezvoltare și conținut. Cu
avantajele sale în ceea ce privește scalabilitatea, viteza și performanța, Sanity.io este o alegere
excelentă pentru persoanele care doresc să construiască aplicații mobile cu o gestionare eficientă
a conținutului.
2.2.9 TailwindCSS
Tailwind CSS este o bibliotecă CSS pe care o folosesc în mod frecvent în proiectele mele de
dezvoltare a aplicațiilor mobile cu React Native. Ca persoană care lucrează în domeniul
dezvoltării mobile, apreciez foarte mult abordarea simplă și eficientă a Tailwind CSS în ceea ce
privește construirea interfețelor.
Unul dintre aspectele care mă atrage în mod special la Tailwind CSS este modul în care clasele
CSS sunt structurate și organizate. În loc să folosească clase predefinite cu nume complicate,
Tailwind CSS oferă un set extensibil de clase mici și reutilizabile, pe care le pot utiliza pentru a
construi rapid interfețe moderne și flexibile. Astfel, nu trebuie să petrec timp în plus definind
stiluri separate în fișiere CSS, ci pot utiliza direct clasele CSS în markup-ul HTML.
Utilizarea Tailwind CSS în React Native este extrem de simplă și ușor de implementat. Cu
ajutorul modulelor speciale precum react-native-tailwindcss sau react-native-classy-ui, pot
integra rapid Tailwind CSS în proiectele mele existente. De asemenea, pot personaliza
configurația implicită a claselor și stilurilor Tailwind CSS în funcție de nevoile mele specifice.
Prin utilizarea claselor Tailwind CSS, pot descrie stilurile elementelor mele direct în markup-ul
React Native. De exemplu, pot adăuga clase precum bg-blue-500 pentru a seta culoarea de
fundal la albastru, text-white pentru a seta culoarea textului la alb și p-4 pentru a adăuga un
padding de 4 unități în jurul elementului. Aceasta îmi permite să construiesc rapid și ușor
aspectul dorit al aplicației mele, fără a fi nevoie să scriu stiluri CSS personalizate.
Tailwind CSS este deosebit de util în dezvoltarea aplicațiilor mobile, deoarece îmi permite să mă
concentrez pe funcționalitatea și logica aplicației, în loc să pierd timp prețios în definirea și
stilizarea detaliată a elementelor. Clasele predefinite și ușor de înțeles îmi oferă posibilitatea de a
compune rapid stiluri complexe prin combinarea lor într-un mod semnificativ și intuitiv.
De asemenea, Tailwind CSS oferă o flexibilitate remarcabilă. Pot personaliza ușor aspectele
stilurilor, cum ar fi culorile, dimensiunile și marginile, prin intermediul fișierului de configurare.
Aceasta îmi permite să adaptez stilurile aplicației în funcție de designul și preferințele mele.
În concluzie, ca persoană implicată în dezvoltarea aplicațiilor mobile cu React Native, consider
Tailwind CSS o soluție excelentă pentru stilizarea interfețelor. Utilizarea clasei CSS predefinite
și reutilizabile mă ajută să construiesc rapid și eficient aspectul dorit al aplicației mele.
Flexibilitatea și personalizabilitatea oferite de Tailwind CSS completează perfect procesul de
dezvoltare, permițându-mi să creez interfețe moderne și flexibile într-un mod convenabil și
intuitiv.
2.2.10 React native Feather – Icons
React Native Feather este o bibliotecă pe care o folosesc frecvent în dezvoltarea aplicațiilor mele
mobile cu React Native. Ca persoană care lucrează în domeniul dezvoltării mobile, apreciez
foarte mult ușurința și versatilitatea acestei biblioteci în ceea ce privește importarea și utilizarea
iconițelor în aplicațiile mele.
Cu React Native Feather, pot adăuga rapid și ușor o varietate de iconițe în proiectul meu.
Această bibliotecă include o gamă largă de simboluri și pictograme, precum săgeți, butoane,
indicatoare și multe altele, pe care le pot utiliza pentru a îmbunătăți aspectul și funcționalitatea
aplicației mele. Utilizarea lor este simplă: trebuie doar să import componentele iconițelor și să le
utilizez în JSX-ul aplicației mele, așa cum aș face cu orice altă componentă React Native.
Pentru a utiliza React Native Feather în proiectul meu, trebuie să instalez mai întâi biblioteca în
proiectul meu, utilizând un manager de pachete precum npm sau Yarn. După instalare, pot
importa componentele iconițelor în fișierele mele JavaScript sau TypeScript și le pot utiliza în
markup-ul aplicației mele. De exemplu, pentru a adăuga o pictogramă de săgeată dreapta, import
componenta ArrowRight și o utilizez în codul meu, ca orice altă componentă React Native.
Unul dintre avantajele folosirii React Native Feather este flexibilitatea și personalizabilitatea sa.
Pot ajusta ușor stilul și aspectul iconițelor, setând proprietăți precum dimensiunea, culoarea sau
opacitatea. Astfel, pot adapta aspectul iconițelor la designul și tematica aplicației mele, fără a fi
nevoie să creez iconițe personalizate.
Un alt aspect important este că React Native Feather oferă o gamă largă de iconițe, acoperind o
varietate de nevoi și stiluri de design. Indiferent dacă am nevoie de iconițe generale și comune
sau de iconițe specifice unui domeniu sau industrii specifice, biblioteca oferă o colecție diversă
pentru a satisface diferite cerințe.
Un alt avantaj al utilizării React Native Feather este actualizarea și întreținerea ușoară a
iconițelor. Biblioteca este actualizată periodic, adăugând noi iconițe și îmbunătățind cele
existente. Astfel, beneficiez de iconițe actualizate și optimizate, fără a fi nevoie să investesc timp
și resurse în crearea și menținerea propriilor iconițe.
În concluzie, utilizarea React Native Feather în aplicațiile mele mobile cu React Native îmi oferă
acces rapid la o colecție extinsă de iconițe vectoriale, ușor de importat și personalizat. Acest
lucru îmbunătățește aspectul și funcționalitatea aplicațiilor mele, oferindu-le un aspect mai
profesionist și atrăgător. Sunt încântat de versatilitatea și ușurința de utilizare a acestei biblioteci
și o recomand cu căldură tuturor persoanelor care dezvoltă aplicații mobile cu React Native.
3. Partea II
3.1 Prezentarea Aplicatiei
Am inceput aplicatia prin crearea unui folder nou in care am creat un alt folder cu aplicatia Expo
astfel, npx create-expo-app my-app, dupa care am deschid codul sursa din Command Prompt si
am inceput prin adaugarea lui TailWindCSS, folosind npm install tailwind si npm install –dev
tailwindcss. Prin folosirea metodei, npx tailwindcss init, am initializat fisierul taiwind.js cu
ajutorul caruia putem scrie cod CSS direct in aplicatia react.
Fig. 1 Creare TailwindCSS
Incepem prin crearea folderului Screens in care vom avea diferite fisiere .js pentru fiecare pannel
al aplicatiei. In HomeScreen.js incep prin importarea de diverse componente necesare scrierii
codului, cat si a bibliotecilor apelate din Command Prompt.
HomeScreen
Această funcție reprezintă componenta HomeScreen. În interiorul acestei funcții, sunt definite
mai multe variabile de stare utilizate pentru gestionarea categoriilor de produse recomandate. De
asemenea, sunt utilizate hook-uri precum useNavigation, useLayoutEffect și useEffect.
Block-ul reprezintă bara de căutare de pe pagina principală. Aceasta conține un câmp de
introducere a textului pentru căutare, un buton pentru selectarea locației și un buton pentru
opțiuni suplimentare. Componentele Icon.Search, TextInput, Icon.MapPin și Icon.Sliders sunt
utilizate pentru a afișa pictogramele corespunzătoare.
<Categories />
Acest cod reprezintă componenta Categories, care afișează o listă de categorii recomandate.
Această componentă este definită într-un alt fișier și este importată în această pagină principală.
Iar Block-ul de Featured afișează categoriile de produse recomandate. Folosind metoda map,
fiecare categorie este afișată utilizând componenta FeatureRow. Aceasta primește mai multe
proprietăți, cum ar fi id, title, shops, description și featuredCategory, pentru a afișa informațiile
corespunzătoare despre fiecare categorie.
Fig. 2 HomeScreen
Fig. 2a Home-Screen
Cart Screen
Acest ecran afișează produsele adăugate în coș, calculează subtotalul, taxa de livrare și totalul
comenzii, și oferă opțiunea de a plasa comanda. Pentru a putea intelege codul mai bine definesc
urmatorii termeni astfel:

useSelector: un hook din biblioteca Redux care permite componentelor să selecteze date
din starea globală a aplicației.

useDispatch: un hook din biblioteca Redux care permite componentelor să dispecheze
acțiuni către reduceri.

useNavigation: un hook din biblioteca React Navigation care oferă funcționalitatea de
navigare între ecrane.
Codul este scris în limbajul JavaScript și utilizează bibliotecile React Native, Redux și React
Navigation. Aplicația utilizează două slice-uri Redux: basketSlice și shopSlice. Acestea sunt
importate și utilizate pentru a selecta produsele din coș și informațiile despre magazin.
Funcția BasketScreen este componenta principală a ecranului coșului de cumpărături. Aceasta
utilizează hook-urile useSelector și useDispatch pentru a accesa starea globală și a dispecheza
acțiuni.
În interiorul funcției BasketScreen, avem o serie de componente React Native care afișează
diferite elemente ale ecranului coșului de cumpărături, cum ar fi butonul de revenire, timpul
estimat de livrare, produsele din coș și totalurile comenzii.
Fragmentul de cod, unde definim items.length, name, price, afișează fiecare produs din coșul de
cumpărături. Utilizăm o buclă map pentru a itera prin grupurile de produse și a le afișa într-un
format specific.
Pentru fiecare produs, afișăm cantitatea, imaginea, numele și prețul. De asemenea, adăugăm un
buton de eliminare care dispechează acțiunea removeFromBasket atunci când este apăsat.
Fig. 3 Cart Screen
Fig. 3a Cart Screen
ShopScreen
Această pagină reprezintă ecranul de afișare a unui magazin într-o aplicație mobilă dezvoltată în
React Native. Scopul acestei pagini este de a afișa informații despre magazinul selectat, precum
și meniul acestuia.
useRoute: un hook din biblioteca @react-navigation/native care ne permite să accesăm
parametrii rutei curente.
Hook-urile useNavigation și useRoute sunt utilizate pentru a accesa parametrii rutei curente și
pentru a obține obiectul de navigare. Acești parametrii includ informații despre magazinul
selectat, precum id-ul, titlul, imaginea, rating-ul, tipul, adresa, descrierea, lista de modificări
(mods), longitudinea și latitudinea.
Hook-ul useSelector este utilizat pentru a selecta magazinul curent din starea globală a aplicației.
Acesta utilizează selectorul selectShop din felia (slice) shopSlice pentru a returna magazinul
curent.
Sunt utilizate componente specifice React Native, precum View, Text, Image și
TouchableOpacity, pentru a afișa imaginea magazinului și butonul de navigare înapoi. De
asemenea, este utilizată biblioteca react-native-feather pentru a afișa o pictogramă de săgeată
înapoi.
Fig. 4 ShopScreen
Fig. 4a ShopScreen
DeliveryScreen
Acest ecran este responsabil pentru afișarea hărții cu locația magazinului și a informațiilor
despre livrare.

react-native: o bibliotecă care permite dezvoltarea de aplicații mobile native folosind
JavaScript și React.



MapView: un component React Native care afișează o hartă interactivă.
Marker: un component React Native care reprezintă un marker pe hartă.
emptyBasket: o acțiune Redux care golește coșul de cumpărături.
Codul începe prin importarea modulelor necesare, cum ar fi View, Text, StatusBar,
TouchableOpacity, Image și SafeAreaView din biblioteca react-native. De asemenea, sunt
importate și alte module precum useNavigation, useSelector și MapView din bibliotecile
@react-navigation/native și react-native-maps. Aplicația folosește și o temă personalizată,
definită într-un fișier separat, care conține culorile utilizate în aplicație.
Funcția DeliveryScreen este componenta principală a ecranului de livrare. Aceasta utilizează
hook-urile useNavigation și useSelector pentru a obține obiectul de navigare și starea
magazinului din starea globală a aplicației. De asemenea, se utilizează și hook-ul useDispatch
pentru a dispeceriza acțiunea emptyBasket atunci când utilizatorul anulează comanda.
Codul returnează o structură de vizualizare (View) care conține un component MapView pentru
afișarea hărții și un component View pentru afișarea informațiilor despre livrare.
MapView primește o regiune inițială și un tip de hartă. Componenta Marker primește
coordonatele magazinului, titlul și descrierea acestuia, precum și o culoare pentru marker.
Fig. 5 DeliveryScreen
Fig. 5a Delivery-Screen
PreparingOrderScreen
Codul începe cu instrucțiunile de import pentru modulele și componentele necesare. Apoi, este
definită componenta PreparingOrderScreen ca o funcție React. În interiorul acestei funcții, se
utilizează hook-ul useNavigation pentru a obține obiectul de navigare din React Navigation.
Următorul pas este utilizarea hook-ului useEffect pentru a programa o acțiune care va fi
executată după ce componenta este montată. În acest caz, se utilizează funcția setTimeout pentru
a amâna navigarea către ecranul "Delivery" timp de 3000 de milisecunde (adică 3 secunde).
În final, componenta returnează o structură de vizualizare (View) care conține o imagine (Image)
și este stilizată folosind clase CSS.
Am importat componenta PreparingOrderScreen și am plasat-o în interiorul componentei
principale App. Componenta App conține o vizualizare (View) care ocupă întregul ecran (flex:
1) și include și bara de stare (StatusBar). Apoi, am adăugat componenta PreparingOrderScreen în
interiorul vizualizării principale.
Pentru o buna rulare a codului este nevoie de diferite pachete:

React Navigation ---- npm install @react-navigation/native => Această comandă va
descărca și instaleaza pachetul "@react-navigation/native" și toate dependențele sale
necesare pentru a utiliza navigația în aplicația React Native.

npx expo install react-native-screens react-native-safe-area-context => este utilizată
pentru a instala pachetele "react-native-screens" și "react-native-safe-area-context" întrun proiect Expo cu React Native. Aceste pachete sunt necesare pentru a utiliza
funcționalități avansate precum gestionarea ecranului și a zonelor sigure în aplicația
React Native

npm i react-native-maps => Această comandă va descărca și instala pachetul "reactnative-maps" și toate dependențele sale necesare pentru a utiliza hărțile în aplicația React
Native. Pachetul "react-native-maps" oferă funcționalități avansate pentru integrarea
hărților în aplicațiile React Native. Se poate utiliza acest pachet pentru a afișa hărți
interactive, a adăuga marcatori, a desena poligoane și multe altele.
Fig. 6 PreparingOrderScreen
BasketIcon
Componenta BasketIcon este o componentă React Native care afișează un icon pentru coșul de
cumpărături. Această componentă este utilizată în cadrul unei aplicații de comerț electronic
pentru a permite utilizatorului să vizualizeze conținutul coșului de cumpărături și să acceseze
pagina de finalizare a comenzii. Componenta BasketIcon este o funcție care returnează un
element View care conține un element TouchableOpacity. În interiorul TouchableOpacity, avem
mai multe elemente View și Text care afișează numărul de elemente din coșul de cumpărături,
textul "View Cart" și totalul coșului de cumpărături.
În interiorul butonului, sunt afișate informații despre numărul de elemente din coșul de
cumpărături, textul "View Cart" și totalul coșului de cumpărături. Aceste informații sunt obținute
din starea globală a aplicației utilizând hook-ul useSelector.
Atunci când butonul este apăsat, se activează funcția onPress, care utilizează obiectul de
navigare pentru a naviga la ecranul coșului de cumpărături.
În final, componenta BasketIcon este exportată ca un component React și poate fi utilizată în alte
componente ale aplicației pentru a afișa butonul coșului de cumpărături.
Fig. 7 BasketIcon
Categories.js / Components
Componenta "Categorii" este o componenta React Native care afiseaza o lista orizontala de
categorii. Utilizatorul poate selecta o categorie, iar aceasta devine activa, schimbandu-se stilul
butonului si textului asociat.
Concepte cheie
Utilizarea hook-ului useState pentru a gestiona starea componentei.
Utilizarea hook-ului useEffect pentru a efectua o actiune dupa randarea componentei.
Utilizarea componentelor React Native precum View, Text, ScrollView, TouchableOpacity si
Image pentru a construi interfata utilizatorului.
Componenta "Categorii" este definita ca o functie JavaScript care returneaza un element View ce
contine un ScrollView. In interiorul ScrollView, sunt afisate butoanele pentru fiecare categorie,
impreuna cu imaginea si numele categoriei.
Starea componentei este gestionata folosind hook-ul useState. Variabila activeCategory retine idul categoriei active, iar variabila categories retine lista de categorii.
Folosind hook-ul useEffect, se apeleaza functia getCategories pentru a obtine lista de categorii.
Dupa ce datele sunt primite, acestea sunt setate in variabila categories folosind functia
setCategories.
Fig. 8 Categories
FeaturedRow
Concepte cheie
Utilizarea componentelor React Native: Codul utilizeaza componente React Native precum
View, Text, ScrollView si TouchableOpacity pentru a construi interfata utilizatorului.
Utilizarea efectului useEffect: Efectul useEffect este utilizat pentru a rula codul atunci cand
componenta este montata sau atunci cand valoarea variabilei id se schimba. In acest caz, efectul
este comentat, dar poate fi utilizat pentru a obtine date despre magazinele caracteristice utilizand
functia getFeaturedShopById.
Utilizarea componentei ShopCard: Componenta ShopCard este importata dintr-un alt fisier si
este utilizata pentru a afisa informatii despre fiecare magazin din lista.
Codul incepe prin importarea componentelor necesare din biblioteca react-native si din alte
fisiere. Apoi, este definita componenta FeatureRow care primeste ca parametri un id, un title, o
description si o lista de shops.
In interiorul componentei, este definit un efect useEffect care este comentat in prezent. Acest
efect poate fi utilizat pentru a obtine date despre magazinele caracteristice utilizand functia
getFeaturedShopById si pentru a actualiza lista de magazine utilizand functia setShops.
Apoi, componenta returneaza o structura de vizualizare care contine un titlu, o descriere si un
buton "Vezi tot". Sub aceasta structura, este afisata o lista orizontala de magazine utilizand
componenta ScrollView. Fiecare magazin este reprezentat de componenta ShopCard, care
primeste informatii precum id-ul, imaginea, titlul, rating-ul, tipul, adresa si descrierea
magazinului.
Fig. 9 FeaturedRow.js
ModRow
Acest cod reprezintă un component React Native numit "ModRow". Acesta este utilizat pentru a
afișa un rând de produs într-o listă de produse. Componenta primește informații despre produs
(nume, descriere, id, preț, imagine) și permite utilizatorului să adauge sau să elimine produsul
din coșul de cumpărături.
Codul este structurat într-o funcție numită "ModRow" care primește informații despre produs ca
parametri. Aceasta utilizează hook-urile "useDispatch" și "useSelector" pentru a accesa starea
coșului de cumpărături din Redux. Funcțiile "handleIncrease" și "handleDecrease" sunt definite
pentru a adăuga sau a elimina produsul din coșul de cumpărături atunci când utilizatorul apasă
butoanele corespunzătoare.
Componenta returnează o structură de vizualizare (View) care conține o imagine, numele și
descrierea produsului, prețul și butoanele de adăugare și eliminare. Imaginea produsului este
afișată utilizând componenta "Image" și este încărcată de la o adresă URL. Numele și descrierea
produsului sunt afișate utilizând componente "Text". Prețul produsului este afișat utilizând
componenta "Text" și este înconjurat de un stil special pentru a-l evidenția. Butoanele de
adăugare și eliminare sunt afișate utilizând componente "TouchableOpacity" și sunt înconjurate
de un stil special pentru a le oferi un aspect vizual plăcut.
Componenta "ModRow" este utilizată pentru a afișa informații despre un produs. Sunt furnizate
valorile pentru nume, descriere, id, preț și imagine. Componenta va afișa aceste informații și va
permite utilizatorului să adauge sau să elimine produsul din coșul de cumpărături.
Componenta "ModRow" este utilizată într-o listă de produse. Lista de produse este furnizată ca
un array de obiecte, fiecare obiect reprezentând un produs. Componenta "FlatList" este utilizată
pentru a afișa lista de produse, iar fiecare element din listă este reprezentat de componenta
"ModRow". Astfel, fiecare produs va fi afișat într-un rând separat, cu informațiile și
funcționalitatea corespunzătoare.
Fig. 10 ModRow
ShopCard
Aceasta componenta reprezintă un card de magazin și este utilizat pentru a afișa informații
despre un anumit magazin, cum ar fi titlul, imaginea, evaluarea, adresa și tipul.
Codul sursă definește un component funcțional React Native numit "ShopCard". Acesta primește
o serie de proprietăți, cum ar fi "id", "title", "imgUrl", "rating", "type", "address", "description",
"dishes", "reviews", "lng" și "lat". Aceste proprietăți sunt utilizate pentru a afișa informațiile
specifice despre magazin în card.
Componenta "ShopCard" utilizează hook-ul "useNavigation" din biblioteca React Navigation
pentru a obține obiectul de navigare. Acesta este utilizat pentru a naviga către ecranul "Shop"
atunci când cardul de magazin este apăsat. Proprietățile cardului de magazin sunt transmise ca
parametri în obiectul de navigare pentru a fi utilizate în ecranul "Shop".
Codul sursă definește, de asemenea, structura vizuală a cardului de magazin utilizând
componente React Native, cum ar fi "View", "Text", "TouchableOpacity" și "Image". Aceste
componente sunt utilizate pentru a crea aspectul și comportamentul cardului de magazin.
Fig. 11 ShopCard
Index.js / Constants
Codul prezentat definește categoriile de plante și plantele recomandate pentru fiecare categorie.
Utilizând acest cod, putem accesa și utiliza aceste informații în dezvoltarea unei aplicații care se
ocupă de vânzarea de plante și semințe.
Concepte cheie
Categorii: Codul definește o listă de categorii de plante, cum ar fi "Seminte", "Trandafiri",
"Alge", "Plante cu Flori", "Plante Fara Seminte" și "Cicade". Fiecare categorie are un ID unic, un
nume și o imagine asociată.
Plante recomandate: Codul definește, de asemenea, o listă de plante recomandate pentru fiecare
categorie. Fiecare plantă recomandată are un ID unic, un titlu, o descriere, o imagine, un preț și
alte detalii relevante.
Structura codului
Codul este structurat în două secțiuni principale: categories și featured.
Categorii: Secțiunea categories definește lista de categorii de plante. Fiecare categorie este
reprezentată ca un obiect cu următoarele proprietăți:
id: ID-ul unic al categoriei.
name: Numele categoriei.
image: Imaginea asociată categoriei.
Plante recomandate: Secțiunea featured definește lista de plante recomandate pentru fiecare
categorie. Fiecare plantă recomandată este reprezentată ca un obiect cu următoarele proprietăți:
id: ID-ul unic al plantei recomandate.
title: Titlul plantei recomandate.
description: Descrierea plantei recomandate.
shops: Lista de magazine care vând această plantă recomandată. Fiecare magazin este reprezentat
ca un obiect cu următoarele proprietăți:
id: ID-ul unic al magazinului.
name: Numele magazinului.
image: Imaginea asociată magazinului.
description: Descrierea magazinului.
lng și lat: Coordonatele geografice ale magazinului.
address: Adresa magazinului.
stars: Rating-ul magazinului.
reviews: Numărul de recenzii ale magazinului.
category: Categorie asociată magazinului.
dishes: Lista de plante disponibile în magazin. Fiecare plantă este reprezentată ca un obiect cu
următoarele proprietăți:
id: ID-ul unic al plantei.
name: Numele plantei.
description: Descrierea plantei.
price: Prețul plantei.
image: Imaginea asociată plantei.
Fig. 12 Index.js / Constants
Index.js / Theme
Concepte Cheie
pallete: Aceasta este o variabilă constantă care stochează o matrice de obiecte. Fiecare obiect
reprezintă o culoare din paletă și are două proprietăți: text și bgColor. Proprietatea text stochează
codul de culoare pentru text, în timp ce proprietatea bgColor stochează o funcție care returnează
codul de culoare pentru fundal, cu o opacitate specificată.
themeColors: Aceasta este o variabilă constantă care stochează prima culoare din paletă
(pallete[0]). Aceasta este utilizată pentru a defini culoarea temei.
Structura de cod constă într-o matrice numită pallete și o variabilă numită themeColors. Matricea
pallete stochează obiecte care reprezintă culorile din paletă, în timp ce variabila themeColors
stochează prima culoare din paletă.
Fig. 13 Index.js/Theme
BasketSlice
Concepte cheie:
Redux Toolkit: Este o bibliotecă pentru gestionarea stării aplicației în JavaScript. Aceasta oferă
un set de unelte și convenții pentru a simplifica dezvoltarea aplicațiilor bazate pe Redux.
Slice: Un slice în Redux Toolkit este o porțiune de starea aplicației și conține reduceri și acțiuni
asociate.
Reducer: Un reducer este o funcție pură care primește starea curentă și o acțiune și returnează o
nouă stare bazată pe acțiunea primită.
Acțiune: O acțiune este un obiect care descrie o intenție de a modifica starea aplicației. Aceasta
conține un tip și, opțional, o încărcătură de date.
Codul începe prin importarea funcției createSlice din biblioteca @reduxjs/toolkit. Această
funcție este folosită pentru a crea un slice în Redux Toolkit.
Următoarea secțiune definește starea inițială a coșului de cumpărături. Aceasta conține un array
gol pentru articolele din coș.
Apoi, se utilizează funcția createSlice pentru a crea un slice numit "basket" cu starea inițială
definită anterior și reduceri asociate.
Reducerii sunt funcții care modifică starea coșului de cumpărături în funcție de acțiunile primite.
În acest caz, avem trei reduceri definite:
addToBasket: Adaugă un element în coșul de cumpărături. Aceasta primește o acțiune care
conține încărcătura de date (elementul de adăugat) și adaugă elementul respectiv în array-ul
items al stării.
removeFromBasket: Elimină un element din coșul de cumpărături. Aceasta primește o acțiune
care conține încărcătura de date (elementul de eliminat) și caută indexul elementului în array-ul
items. Dacă elementul este găsit, acesta este eliminat din array, altfel se afișează un mesaj de
eroare în consolă.
emptyBasket: Golește coșul de cumpărături. Aceasta primește o acțiune și setează array-ul items
al stării ca fiind gol.
La finalul codului, se exportă reducerii și acțiunile definite pentru a putea fi utilizate în alte părți
ale aplicației.
De asemenea, sunt exportate și câteva funcții de selecție care permit accesul la anumite părți ale
stării coșului de cumpărături:
selectBasketItems: Returnează array-ul de articole din coș.
selectBasketItemsById: Returnează articolele din coș care au un anumit ID.
selectBasketTotal: Calculează suma totală a prețurilor articolelor din coș.
Codul implementează funcționalitatea unui coș de cumpărături utilizând Redux Toolkit în
JavaScript. Acesta definește reduceri și acțiuni pentru a adăuga, elimina și goli coșul de
cumpărături. De asemenea, oferă funcții de selecție pentru a accesa anumite părți ale stării
coșului. Utilizând acest cod, putem crea și gestiona un coș de cumpărături în aplicațiile noastre
JavaScript.
Fig. 14 BasketSlice
ShopSlice.js
Codul furnizat definește un Slice pentru un magazin în Redux. Acesta include starea inițială a
magazinului și reducerii asociate pentru a actualiza starea în funcție de acțiunile dispecerizate.
Utilizăm useDispatch din biblioteca react-redux pentru a obține o referință la funcția dispatch a
magazinului. Apoi, putem dispeceriza acțiunea setShop pentru a actualiza magazinul cu o
valoare nouă.
Utilizăm useSelector din biblioteca react-redux pentru a selecta magazinul din starea globală a
aplicației. Apoi, putem utiliza proprietățile magazinului în componenta noastră pentru a afișa
informații despre magazin.
Fig. 15 ShopSlice
Server: Sanity – Schemas
Codul de sanity este scris in schemas astfel:
Concepte cheie:
Sanity.io: Este o platformă de gestionare a conținutului care permite dezvoltatorilor să creeze și
să administreze conținutul într-un mod structurat și flexibil.
Definirea tipurilor: În Sanity.io, putem defini tipuri de documente care reprezintă diferite entități
în sistemul nostru. Aceste tipuri de documente pot avea câmpuri și validări specifice.
Câmpuri: Câmpurile reprezintă proprietățile unui document și pot fi de diferite tipuri, cum ar fi
șiruri de caractere, imagini sau alte tipuri de date.
Codul furnizat definește un tip de document numit "category" în Sanity.io. Acest tip de
document reprezintă categoriile în sistemul nostru
Definim câmpul "name" ca un șir de caractere și îi atribuim un titlu "Category name". De
asemenea, adăugăm o validare care impune ca acest câmp să fie obligatoriu.
Definim câmpul "description" ca un șir de caractere și îi atribuim un titlu "Description". De
asemenea, adăugăm o validare care impune ca acest câmp să aibă o lungime maximă de 200 de
caractere.
Definim câmpul "image" ca un tip de date "image" și îi atribuim un titlu "Image of the shop".
Acest câmp va fi utilizat pentru a stoca imaginea asociată categoriei.
Fig. 16 Sanity-schemas-category
Sanity-schemas-featured.js
Acest cod definește un câmp numit "name" de tipul "string" în cadrul tipului "featured". Acest
câmp reprezintă numele magazinului și este obligatoriu (validarea este realizată prin funcția
rule.required()).
Codul definește un câmp numit "description" de tipul "string" în cadrul tipului "featured". Acest
câmp reprezintă descrierea magazinului și are o limită maximă de 200 de caractere (validarea
este realizată prin funcția rule.max(200)).
Codul definește un câmp numit "shops" de tipul "array" în cadrul tipului "featured". Acest câmp
reprezintă o listă de referințe către alte documente de tipul "shop". Prin utilizarea opțiunii of:
[{type: 'reference', to: [{type: 'shop'}]}], se specifică că acest câmp poate conține doar referințe
către documente de tipul "shop".
Codul furnizat definește un tip numit "featured" în Sanity.io, care reprezintă magazinele
recomandate. Acest tip are trei câmpuri: "name" (numele magazinului), "description" (descrierea
magazinului) și "shops" (o listă de referințe către alte documente de tipul "shop").
Fig. 17 Sanity-schemas-featured.js
Fig. 17a Sanity-schemas / Online View
Index.js / Sanity-Schemas
Concepte cheie:
Importarea modulelor: În JavaScript, putem importa module folosind sintaxa import. Aceasta ne
permite să aducem funcționalități din alte fișiere în fișierul nostru curent.
Exportarea modulelor: Putem exporta funcționalități dintr-un fișier folosind sintaxa export.
Aceasta ne permite să facem funcționalitățile noastre disponibile pentru alte fișiere care le
importă.
Structura de cod implică importarea și exportarea a patru module: category, shop, mod și
featured. Aceste module sunt apoi exportate ca un array denumit schemaTypes.
Fig. 18 Index.js / Sanity-Schemas
Mod.js / Sanity-Schemas
Codul furnizat definește un tip de document numit "mod" în Sanity.io.
Fig. 19 Mod.js / Sanity-Schemas
Shop.js / Sanity-Schemas
Concepte cheie
Document: Un document în Sanity.io reprezintă o entitate de date care poate fi stocată și
gestionată în cadrul sistemului. În acest caz, documentul "Shop" va conține informații despre un
magazin.
Câmpuri: Câmpurile reprezintă proprietățile unui document și definesc tipurile de date și
validările asociate acestora. În codul furnizat, sunt definite mai multe câmpuri pentru
documentul "Shop", cum ar fi "name" (nume), "description" (descriere), "image" (imagine), "lat"
(latitudine), "lng" (longitudine), "address" (adresă), "rating" (evaluare), "reviews" (recenzii),
"type" (categorie) și "mods" (modificări).
Tipuri de date: Fiecare câmp are un tip de date asociat, cum ar fi "string" (șir de caractere),
"number" (număr), "image" (imagine) și "reference" (referință). Aceste tipuri de date determină
cum vor fi stocate și gestionate valorile câmpurilor.
Validare: Validările sunt utilizate pentru a asigura că valorile introduse în câmpuri respectă
anumite reguli. În codul furnizat, sunt definite mai multe validări pentru câmpurile "name",
"description", "address" și "rating". De exemplu, câmpul "name" este obligatoriu, câmpul
"description" poate avea maxim 200 de caractere, câmpul "address" este obligatoriu, iar câmpul
"rating" trebuie să fie un număr între 1 și 5.
Referințe: Câmpurile de tip "reference" permit asocierea unui document cu un alt document
existent în sistem. În codul furnizat, câmpul "type" este de tip "reference" și este asociat cu
documentul "category". Acest lucru permite selectarea unei categorii existente pentru un
magazin.
Codul începe cu o linie comentată care importă funcțiile defineField și defineType din modulul
'sanity'. Aceste funcții sunt utilizate pentru a defini câmpurile și tipurile de date personalizate în
Sanity.io. Cu toate acestea, în codul furnizat, aceste funcții nu sunt utilizate explicit.
Apoi, este exportat un obiect care reprezintă definiția documentului "Shop". Obiectul are
următoarea structură:
name: Numele documentului, în acest caz "shop".
title: Titlul documentului, în acest caz "Shops".
type: Tipul documentului, în acest caz "document".
fields: Un array care conține definițiile câmpurilor documentului "Shop".
Fig. 20 Shop.js / Sanity-Schemas
4. Concluzii
Aplicatia mobila Delivery-app a fost creata cu succes dupa cum se poate observa din cod si din
imaginile atasate. Am lucrat la aceasta aplicatie de-alungul semestrului 2 de facultate, cu scopul
de a putea face o platforma de vanzari si delivery cu plante. Aplicatia poate fi incercata folosind
Expo Go pe Android si pe IOS.
In vederea implementarii acestei aplicatii, am inceput sa studiez tehnicile de realizare a unei
aplicatii mobile folosind React Native.
In concluzie am reusit sa termin aplicatia cu succes.
5. Bibliografie
https://javascript.info/
https://www.oreilly.com/library/view/learning-react-native/9781491929049/ch01.html
https://www.section.io/engineering-education/getting-started-with-sanity-cms/
https://reactnative.dev/
DECLARAŢIE DE AUTENTICITATE
Subsemnatul/a BOARIU DAN ANDREI, Absolvent al studiilor de master,
promoţia 2023, înspecializarea METODE ŞI MODELE ÎN INTELIGENŢA
ARTIFICIALĂ Facultatea de Ştiinţe,
în legătură cu elaborarea lucrării de disertaţie cu titlul Aplicație multiplatformă
de gestiune a pieței horticole, coordonator Boldea Costin Radu, prin prezenta declar
pe propria răspundere că:
a. Lucrarea a fost elaborată personal şi îmi aparţine în întregime;
b. Nu au fost folosite alte surse decât cele menţionate în Bibliografie;
c. Nu au fost preluate texte, date sau elemente de grafică din alte lucrări sau
din alte surse fără a fi citate şi fără a fi precizată sursa prelucrării, inclusiv
în cazul în care sursa o reprezintă alte lucrări ale mele;
d. Lucrarea nu a mai fost folosită în alte contexte de examen sau concurs.
Data,
26.06.2023
Semnătura,
Download