Haptics, Share, Clipboard, Linking
Muammodan boshlaylik
Kichik imkoniyatlar — lekin ular ilovani "native" his qildiradi:
- Tugma bosilganda yengil tebranish — "bosildi" ni barmoq bilan his qilish
- "Ulashish" — mahsulot havolasini Telegram ga yuborish
- Promokodni bir teginishda nusxalash
- Telefon raqamini bosish — qo'ng'iroq; manzilni bosish — xarita
Har biri bir necha qator kod.
Haptics — tebranish
npx expo install expo-haptics
import * as Haptics from 'expo-haptics';
Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); // yengil — tugma, tanlov
Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium); // o'rtacha
Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Heavy); // kuchli
Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success); // muvaffaqiyat
Haptics.notificationAsync(Haptics.NotificationFeedbackType.Warning);
Haptics.notificationAsync(Haptics.NotificationFeedbackType.Error); // xato
Haptics.selectionAsync(); // juda yengil — slider, picker da qiymat o'zgarishi
Qayerda ishlatish:
| Hodisa | Tebranish |
|---|---|
| Savatga qo'shildi, to'lov muvaffaqiyatli | Success |
| Forma xatosi, to'lov rad etildi | Error |
| "Yoqtirish", toggle, tab o'zgarishi | Light yoki selectionAsync |
| QR skanerlandi (39-dars) | Success |
| Uzoq bosish menyusi | Medium |
[!TIP] Kamroq — yaxshiroq. Har bir bosishda tebranish bezovta qiladi va o'z ma'nosini yo'qotadi. Muhim lahzalar uchun saqlang. iOS da haptik dvigatel aniqroq; ko'p Android telefonlarida ham yaxshi ishlaydi, lekin ba'zilarida sezilmaydi.
<Pressable onPress={() => { Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); qosh(m); }}>
Share — ulashish
O'rnatilgan Share — tizimning ulashish oynasi:
import { Share } from 'react-native';
async function ulashish(m: Mahsulot) {
try {
await Share.share({
message: `${m.nom} — ${m.narx.toLocaleString()} so'm\nhttps://dokon.uz/mahsulot/${m.id}`,
url: `https://dokon.uz/mahsulot/${m.id}`, // iOS: alohida havola
title: m.nom, // Android: oyna sarlavhasi
});
} catch (e) {
Alert.alert("Ulashib bo'lmadi");
}
}
Foydalanuvchi Telegram, WhatsApp, SMS, Instagram — telefondagi istalgan ilovani tanlaydi. Havola — universal link (29-dars) bo'lsa, do'stida ilova o'rnatilgan bo'lsa, ilovada ochiladi.
Fayl ulashish
Rasm yoki PDF ni ulashish uchun — expo-sharing:
npx expo install expo-sharing
import * as Sharing from 'expo-sharing';
if (await Sharing.isAvailableAsync()) {
await Sharing.shareAsync(pdfUri, { mimeType: 'application/pdf', dialogTitle: 'Chekni ulashish' });
}
Chek, hisobot, QR kod rasmini yuborish.
Clipboard — nusxalash
npx expo install expo-clipboard
import * as Clipboard from 'expo-clipboard';
async function nusxala(kod: string) {
await Clipboard.setStringAsync(kod);
Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success);
setNusxalandi(true);
setTimeout(() => setNusxalandi(false), 2000);
}
<Pressable onPress={() => nusxala('YOZ2026')} style={styles.promo}>
<Text style={styles.kod}>YOZ2026</Text>
<Ionicons name={nusxalandi ? 'checkmark' : 'copy-outline'} size={18} />
</Pressable>
O'qish:
const matn = await Clipboard.getStringAsync();
[!INFO] iOS clipboard ni o'qiganda foydalanuvchiga "Ilova joylashtirdi" xabarini ko'rsatadi. Clipboard ni faqat foydalanuvchi aniq so'raganda o'qing ("Joylashtirish" tugmasi) — ilova ochilganda avtomatik emas.
Linking — boshqa ilovalarni ochish
import { Linking } from 'react-native';
Linking.openURL('tel:+998901112233'); // qo'ng'iroq
Linking.openURL('sms:+998901112233?body=Salom'); // SMS
Linking.openURL('mailto:yordam@dokon.uz?subject=Savol'); // email
Linking.openURL('https://dokon.uz'); // brauzer
Linking.openURL('https://t.me/dokon_uz'); // Telegram (o'rnatilgan bo'lsa — ilovada)
Linking.openSettings(); // ilova sozlamalari (38-dars)
Xaritada ochish
function xaritadaOch(lat: number, lng: number, nom: string) {
const url = Platform.select({
ios: `maps:0,0?q=${encodeURIComponent(nom)}@${lat},${lng}`,
android: `geo:0,0?q=${lat},${lng}(${encodeURIComponent(nom)})`,
})!;
Linking.openURL(url);
}
iOS — Apple Maps, Android — Google Maps yoki foydalanuvchi tanlagan xarita ilovasi.
Ilova ichidagi brauzer
Foydalanish shartlari, yordam sahifalari — ilovadan chiqmasdan:
npx expo install expo-web-browser
import * as WebBrowser from 'expo-web-browser';
await WebBrowser.openBrowserAsync('https://dokon.uz/shartlar');
Tizim brauzeri (iOS — Safari View, Android — Chrome Custom Tabs) ilova ustida ochiladi; yopilganda foydalanuvchi aynan qolgan joyiga qaytadi. OAuth (Google bilan kirish) ham shu orqali.
Ochib bo'ladimi?
const mumkin = await Linking.canOpenURL('tg://resolve?domain=dokon_uz');
iOS da tekshiriladigan sxemalar app.json da e'lon qilinishi kerak (ios.infoPlist.LSApplicationQueriesSchemes). Odatda shunchaki openURL ni try/catch bilan chaqirish soddaroq.
Hammasi birga — mahsulot ekranidagi amallar
<View style={{ flexDirection: 'row', justifyContent: 'space-around', padding: 16 }}>
<Amal ikonka="share-outline" matn="Ulashish" onPress={() => ulashish(m)} />
<Amal ikonka="call-outline" matn="Qo'ng'iroq" onPress={() => Linking.openURL(`tel:${dokon.telefon}`)} />
<Amal ikonka="navigate-outline" matn="Yo'l" onPress={() => xaritadaOch(dokon.lat, dokon.lng, dokon.nom)} />
<Amal ikonka="logo-whatsapp" matn="WhatsApp" onPress={() => Linking.openURL(`https://wa.me/${dokon.telefon.replace('+', '')}`)} />
</View>
Nima uchun shunday?
Nima uchun ilova o'zi ulashish yoki qo'ng'iroq oynasini yasamaydi — tizimga topshiradi?
Chunki tizim foydalanuvchini siz bilmaydigan narsalar haqida biladi: qaysi messenjerlar o'rnatilgan, kimga tez-tez yozadi, qaysi SIM kartadan qo'ng'iroq qilishni afzal ko'radi, qaysi xarita ilovasini ishlatadi. Tizim oynasi — har doim foydalanuvchiga tanish va eng to'liq. Ilovaning vazifasi — "nima" ni aytish (shu havolani ulash, shu raqamga qo'ng'iroq), "qanday" esa operatsion tizimning ishi.
Xulosa
Eslab qoling:
expo-haptics:impactAsync,notificationAsync,selectionAsync— muhim lahzalarda, kamShare.share({ message, url })— matn va havola; fayllar —expo-sharingexpo-clipboard:setStringAsync+ tasdiq; o'qish — faqat so'ralgandaLinking.openURL:tel:,sms:,mailto:,https:, xarita sxemalariexpo-web-browser— ilova ichidagi brauzer, OAuth- Tizim oynalariga topshiring — ular foydalanuvchiga tanish
Keyingi dars
44-dars: Animated API — asoslar