Yakuniy loyiha — do'kon ilovasi
Maqsad
Kurs davomida o'rgangan hamma narsani bitta to'liq ilovada birlashtirasiz — Android va iOS uchun ishlaydigan, do'konga chiqarishga tayyor internet do'kon ilovasi. Bu portfoliongizdagi asosiy loyiha bo'lishi mumkin.
Bu dars — topshiriq: talablar, tuzilma, bosqichlar va har bir qism uchun tegishli darsga havola. Kodni o'zingiz yozasiz.
Backend
Ikki variant:
- A (tez boshlash): DummyJSON —
https://dummyjson.com/products,/auth/login,/carts— tayyor test API - B (to'liq): o'z backend ingiz — saytdagi NestJS yoki Express kursi va MySQL kursining
dokonsxemasi asosida (MySQL 5-dars)
A dan boshlang; ilova tayyor bo'lgach — B ga o'tish faqat lib/api.ts va so'rov hook larini o'zgartirishni talab qiladi (agar to'g'ri tuzilgan bo'lsa).
Funksional talablar
Mehmon
- Bosh sahifa: banner karuseli, toifalar (gorizontal), "Ommabop" va "Yangi" qatorlari
- Katalog: grid (2 ustun, planshetda 3-4), filtr (toifa, narx oralig'i), saralash, cheksiz scroll
- Qidiruv: debounce bilan, oxirgi qidiruvlar tarixi
- Mahsulot sahifasi: rasmlar galereyasi (surib ko'rish, pinch-zoom), narx, tavsif, sharhlar, "Savatga qo'shish", "Ulashish"
- Savat: soni o'zgartirish, o'chirish (swipe), jami summa — kirmasdan ham ishlaydi
Kirgan foydalanuvchi
- Kirish / ro'yxatdan o'tish (forma + Zod validatsiya)
- Buyurtma rasmiylashtirish: manzil (xaritadan tanlash yoki joriy joylashuv), telefon, izoh
- Buyurtmalar tarixi va holati
- Sevimlilar
- Profil: rasm (galereya/kamera), sozlamalar (mavzu, til, bildirishnomalar), chiqish, hisobni o'chirish
Umumiy
- Qorong'i rejim
- Offline: katalog va buyurtmalar keshdan; savat mahalliy
- Push: buyurtma holati o'zgarganda, bosilganda — buyurtma ekrani
- Deep link:
dokon://mahsulot/42vahttps://dokon.uz/mahsulot/42
Ekranlar va navigatsiya
app/
├── _layout.tsx ← Provider lar, Stack, Stack.Protected (30)
├── (tabs)/
│ ├── _layout.tsx ← Tabs + savat badge (27)
│ ├── index.tsx ← Bosh sahifa
│ ├── katalog.tsx
│ ├── savat.tsx
│ └── profil.tsx
├── mahsulot/[id].tsx ← (29)
├── qidiruv.tsx ← modal (28)
├── filtr.tsx ← modal, formSheet (28)
├── kirish.tsx ← himoyalanmagan
├── royxat.tsx
└── (auth)/ ← Stack.Protected guard={kirgan}
├── rasmiylashtirish.tsx
├── manzil-tanlash.tsx ← xarita (41)
├── buyurtmalar/index.tsx
├── buyurtmalar/[id].tsx
└── sevimlilar.tsx
Arxitektura
lib/
├── api.ts ← fetch, token, 401 → refresh (31, 35)
├── xotira.ts ← AsyncStorage yordamchilari (34)
└── push.ts ← token olish (42)
api/ ← TanStack Query hook lari (32)
├── mahsulotlar.ts ← useKatalog, useMahsulot, useQidiruv
├── buyurtmalar.ts ← useBuyurtmalar, useBuyurtmaBerish
└── profil.ts
stores/ ← Zustand + persist (33)
├── savat.ts
├── sozlamalar.ts
└── qidiruvTarixi.ts
context/
└── auth.tsx ← (30)
schemas/ ← Zod (22)
├── auth.ts
└── buyurtma.ts
components/
├── ui/ ← Tugma, Input, FormInput, Karta, Skeleton, Toast
├── MahsulotKarta.tsx
├── SavatBand.tsx ← swipe-to-delete (46)
└── ...
constants/
└── theme.ts ← ranglar, bo'shliqlar (13, 17)
hooks/
├── useMavzu.ts
└── useDebounce.ts
Qoidalar:
- Ekranlar (
app/) — faqat tuzilma va komponentlarni birlashtirish;fetchyo'q - Server holati — faqat TanStack Query; klient holati — Zustand; forma — RHF
- Ranglar — faqat
useMavzu()orqali; qattiq kodlangan'#fff'yo'q - Har bir ro'yxat —
FlatList/FlashList,memoelementlar
Bosqichlar
1-bosqich: Poydevor (~1 kun)
-
create-expo-app,reset-project,@/aliaslari (2-4) -
constants/theme.ts,useMavzu,userInterfaceStyle: automatic(17) - UI komponentlar:
Tugma,Input,Skeleton(9, 10, 47) - Tabs va Stack tuzilmasi (25-27)
-
QueryClientProvider+ persister +OfflineBanner(32, 36)
2-bosqich: Katalog (~1-2 kun)
-
api/mahsulotlar.ts—useInfiniteQuery(32) - Katalog grid,
numColumnsekran kengligiga qarab (15, 19) - Skeleton, xato va bo'sh holatlar (31, 47)
- Mahsulot ekrani:
expo-imagegalereya, parallax (7, 45) - Filtr — modal, URL parametrlari bilan (28, 29)
- Qidiruv — debounce, tarix (37)
3-bosqich: Savat (~1 kun)
-
stores/savat.ts— Zustand + persist (33) - Badge, haptics, "Qo'shildi" toast — Reanimated
entering(27, 43, 45) - Swipe-to-delete,
layoutanimatsiyasi (46)
4-bosqich: Autentifikatsiya (~1 kun)
-
context/auth.tsx, SecureStore, refresh token (30, 35) -
Stack.Protected, splash (30) - Kirish va ro'yxat formalari — RHF + Zod + klaviatura (21-23)
5-bosqich: Buyurtma (~1-2 kun)
- Manzil tanlash — xarita, markazdagi belgi, joriy joylashuv (41)
- Rasmiylashtirish —
useMutation, ikki marta yuborishdan himoya,router.replace(26, 32) - Buyurtmalar tarixi —
SectionListsana bo'yicha (20)
6-bosqich: Qurilma imkoniyatlari (~1 kun)
- Profil rasmi — galereya/kamera, kichraytirish, yuklash (40)
- Push — token, kanal, bosilganda ekranga (42)
- Ulashish, qo'ng'iroq, deep link (29, 43)
- Ruxsat ekranlari — tushuntirish va sozlamalar (38)
7-bosqich: Sayqal va nashr (~1-2 kun)
- UX tekshiruv ro'yxati (47-dars) — hamma bandlar
- Past darajali Android va iPhone da sinov (16)
- Sentry (5)
-
eas build— preview APK do'stlarga (48) - Ikonka, splash, skrinshotlar, maxfiylik siyosati
- Play: internal testing (49); iOS: TestFlight (50)
-
expo-updates, kanallar (51)
Sinov ro'yxati
- Parvoz rejimida ilovani ochish — katalog ko'rinadi, banner chiqadi
- Savatga qo'shish → ilovani yopish → ochish — savat joyida
- Kirish → ilovani yopish → ochish — kirish ekrani ko'rinmaydi
- Kirgandan keyin "orqaga" — kirish ekraniga qaytmaydi
- "Buyurtma berish" ni tez ikki marta bosish — bitta buyurtma
- Kamera ruxsatini rad etish — tushunarli ekran, sozlamalar havolasi
- Qorong'i rejimga o'tish — hamma ekranlar o'qiladi
- Eng katta tizim shrifti — tugmalar buzilmaydi
- Ekranni burish (planshetda) — layout moslashadi
- Deep link — mahsulot ekrani ochiladi; mavjud bo'lmagan ID — "topilmadi"
- Push bosish (ilova yopiq) — buyurtma ekrani
- 200+ mahsulot scroll — 60 kadr (Perf Monitor)
Qo'shimcha vazifalar
- ⭐⭐ Ko'p tillilik:
expo-localization+i18next— o'zbek (lotin), rus, ingliz - ⭐⭐ To'lov: Payme yoki Click — WebView yoki
expo-web-browserorqali checkout sahifasi, serverda tasdiqlash - ⭐⭐ Biometrik kirish:
expo-local-authentication(35) - ⭐⭐⭐ Chat operator bilan — WebSocket,
FlatList inverted, klaviatura (23) - ⭐⭐⭐ Testlar: Jest + React Native Testing Library — komponentlar; Maestro — E2E oqimlar ("katalog → savat → rasmiylashtirish")
- ⭐⭐⭐ O'z backend: NestJS + MySQL,
dokonsxemasi, JWT + refresh, Expo push yuborish
Tabriklaymiz! 🎉
Siz React Native kursini tugatdingiz. Endi siz:
- Expo va TypeScript bilan Android va iOS ilovalar yaratasiz
- Native komponentlar, Flexbox, qorong'i rejim va safe area bilan moslashuvchan interfeys qurasiz
- Katta ro'yxatlar, formalar va klaviaturani to'g'ri boshqarasiz
- Expo Router bilan murakkab navigatsiya va himoyalangan ekranlar yasaysiz
- TanStack Query, Zustand va SecureStore bilan ma'lumot va holatni boshqarasiz
- Offline ishlaydigan ilovalar qilasiz
- Kamera, galereya, joylashuv, push bildirishnomalar bilan ishlaysiz
- Reanimated va Gesture Handler bilan silliq animatsiyalar va imo-ishoralar yaratasiz
- EAS bilan ilovani yasab, Google Play va App Store ga chiqarasiz va OTA bilan yangilaysiz
Keyingi qadamlar:
- Saytdagi NestJS yoki Express va MySQL / PostgreSQL kurslari — o'z backend ingiz
- Next.js kursi — xuddi shu React bilimlari bilan veb versiya
- O'z g'oyangiz — kichik, lekin to'liq ilovani do'konga chiqaring. Birinchi haqiqiy foydalanuvchining sharhi — eng yaxshi o'qituvchi
Endi telefon ekrani — sizning kanvasingiz.