Compare commits
12 Commits
a8e95400cc
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 4ac0bb0b41 | |||
| 8c45659363 | |||
| 69f9d49cf1 | |||
| c1030874e3 | |||
| 688f86d595 | |||
| 67bc16e194 | |||
| 41aac35964 | |||
| ce33675a86 | |||
| 9998688103 | |||
| 741ab60fce | |||
| 48c266c252 | |||
| b6040d6042 |
435
App.tsx
435
App.tsx
@@ -1,242 +1,275 @@
|
|||||||
import React, { useEffect, useState } from 'react';
|
|
||||||
import {
|
import {
|
||||||
StatusBar,
|
StatusBar,
|
||||||
useColorScheme,
|
useColorScheme,
|
||||||
View,
|
View,
|
||||||
StyleSheet,
|
StyleSheet,
|
||||||
Text,
|
Text,
|
||||||
TouchableOpacity,
|
TouchableOpacity,
|
||||||
Alert,
|
Alert,
|
||||||
NativeModules,
|
NativeModules,
|
||||||
Image,
|
Image,
|
||||||
ScrollView,
|
ScrollView,
|
||||||
} from 'react-native';
|
} from 'react-native';
|
||||||
import { SafeAreaProvider } from 'react-native-safe-area-context';
|
import { SafeAreaProvider } from 'react-native-safe-area-context';
|
||||||
|
import { useState, useEffect } from 'react';
|
||||||
|
|
||||||
import Login from './src/components/Login';
|
import Login from './src/components/Login';
|
||||||
import Register from './src/components/Register';
|
import Register from './src/components/Register';
|
||||||
import { authAPI } from './src/services/authAPI';
|
import { authAPI } from './src/services/authAPI';
|
||||||
import { networkService } from './src/services/networkService';
|
import { networkService } from './src/services/networkService';
|
||||||
import { ScannerScreen } from './src/screens/ScannerScreen';
|
import { ScannerScreen } from './src/screens/ScannerScreen';
|
||||||
|
import Map from './src/screens/Map';
|
||||||
|
|
||||||
type Screen = 'login' | 'register' | 'home' | 'scanner';
|
type Screen = 'login' | 'register' | 'home' | 'scanner' | 'map';
|
||||||
|
|
||||||
// ✅ Correct native module
|
const { MyNativeModule } = NativeModules;
|
||||||
const { ICameraSDK } = NativeModules;
|
|
||||||
|
|
||||||
function App(): JSX.Element {
|
function App() {
|
||||||
const isDarkMode = useColorScheme() === 'dark';
|
const isDarkMode = useColorScheme() === 'dark';
|
||||||
|
|
||||||
const [currentScreen, setCurrentScreen] = useState<Screen>('login');
|
const [currentScreen, setCurrentScreen] = useState<Screen>('login');
|
||||||
const [isInitialized, setIsInitialized] = useState(false);
|
const [isInitialized, setIsInitialized] = useState(false);
|
||||||
const [isOnline, setIsOnline] = useState(true);
|
const [isOnline, setIsOnline] = useState(true);
|
||||||
const [currentUser, setCurrentUser] = useState<any>(null);
|
const [currentUser, setCurrentUser] = useState<any>(null);
|
||||||
const [qrCode, setQrCode] = useState<string | null>(null);
|
const [qrCode, setQrCode] = useState<string | null>(null);
|
||||||
const [isGeneratingQR, setIsGeneratingQR] = useState(false);
|
const [isGeneratingQR, setIsGeneratingQR] = useState(false);
|
||||||
const [scannedCodes, setScannedCodes] = useState<any[]>([]);
|
const [scannedCodes, setScannedCodes] = useState<any[]>([]);
|
||||||
|
|
||||||
/* -------------------- INIT -------------------- */
|
/* -------------------- INIT -------------------- */
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
initializeApp();
|
initializeApp();
|
||||||
|
|
||||||
console.log('ICameraSDK:', ICameraSDK);
|
console.log('MyNativeModule:', MyNativeModule);
|
||||||
ICameraSDK?.greet?.('John')
|
MyNativeModule?.greet?.('John').then((msg: any) => {
|
||||||
.then((msg: string) => console.log(msg))
|
console.log(msg);
|
||||||
.catch(console.error);
|
});
|
||||||
|
|
||||||
const unsubscribe = networkService.addListener(networkState => {
|
const unsubscribe = networkService.addListener(networkState => {
|
||||||
setIsOnline(networkState.isConnected);
|
setIsOnline(networkState.isConnected);
|
||||||
});
|
});
|
||||||
|
|
||||||
return unsubscribe;
|
return unsubscribe;
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
const initializeApp = async () => {
|
const initializeApp = async () => {
|
||||||
try {
|
try {
|
||||||
await authAPI.initialize();
|
await authAPI.initialize();
|
||||||
const loggedIn = await authAPI.isLoggedIn();
|
|
||||||
if (loggedIn) {
|
const isLoggedIn = await authAPI.isLoggedIn();
|
||||||
|
if (isLoggedIn) {
|
||||||
|
const user = await authAPI.getCurrentUser();
|
||||||
|
setCurrentUser(user);
|
||||||
|
setCurrentScreen('home');
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Initialization error:', error);
|
||||||
|
} finally {
|
||||||
|
setIsInitialized(true);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/* -------------------- NAVIGATION -------------------- */
|
||||||
|
const navigateToLogin = () => {
|
||||||
|
setCurrentUser(null);
|
||||||
|
setQrCode(null);
|
||||||
|
setCurrentScreen('login');
|
||||||
|
};
|
||||||
|
|
||||||
|
const navigateToRegister = () => {
|
||||||
|
setCurrentScreen('register');
|
||||||
|
};
|
||||||
|
|
||||||
|
const navigateToHome = async () => {
|
||||||
const user = await authAPI.getCurrentUser();
|
const user = await authAPI.getCurrentUser();
|
||||||
setCurrentUser(user);
|
setCurrentUser(user);
|
||||||
|
setQrCode(null);
|
||||||
setCurrentScreen('home');
|
setCurrentScreen('home');
|
||||||
}
|
};
|
||||||
} catch (e) {
|
|
||||||
console.error(e);
|
|
||||||
} finally {
|
|
||||||
setIsInitialized(true);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/* -------------------- NAVIGATION -------------------- */
|
const openScanner = () => {
|
||||||
const navigateToLogin = () => {
|
setCurrentScreen('scanner');
|
||||||
setCurrentUser(null);
|
};
|
||||||
setQrCode(null);
|
|
||||||
setCurrentScreen('login');
|
|
||||||
};
|
|
||||||
|
|
||||||
const navigateToRegister = () => {
|
const openMap = () => {
|
||||||
setCurrentScreen('register');
|
setCurrentScreen('map');
|
||||||
};
|
};
|
||||||
|
|
||||||
const navigateToHome = async () => {
|
/* -------------------- ACTIONS -------------------- */
|
||||||
const user = await authAPI.getCurrentUser();
|
const handleLogout = async () => {
|
||||||
setCurrentUser(user);
|
try {
|
||||||
setQrCode(null);
|
await authAPI.logout();
|
||||||
setCurrentScreen('home');
|
setQrCode(null);
|
||||||
};
|
navigateToLogin();
|
||||||
|
Alert.alert('Success', 'Logged out successfully');
|
||||||
|
} catch {
|
||||||
|
Alert.alert('Error', 'Failed to logout');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const openScanner = () => {
|
const showAppStatus = async () => {
|
||||||
setCurrentScreen('scanner');
|
try {
|
||||||
};
|
const status = await authAPI.getAppStatus();
|
||||||
|
Alert.alert(
|
||||||
|
'App Status',
|
||||||
|
`Network: ${status.network.isOnline ? 'Online' : 'Offline'}
|
||||||
|
Users: ${status.storage.totalUsers}
|
||||||
|
Current User: ${status.authentication.currentUser || 'None'}
|
||||||
|
Logged In: ${status.authentication.isLoggedIn ? 'Yes' : 'No'}`
|
||||||
|
);
|
||||||
|
} catch {
|
||||||
|
Alert.alert('Error', 'Failed to get app status');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
/* -------------------- ACTIONS -------------------- */
|
const generateQRCode = async () => {
|
||||||
const handleLogout = async () => {
|
if (!currentUser?.email) {
|
||||||
try {
|
Alert.alert('Error', 'No user email available');
|
||||||
await authAPI.logout();
|
return;
|
||||||
navigateToLogin();
|
}
|
||||||
Alert.alert('Success', 'Logged out successfully');
|
|
||||||
} catch {
|
|
||||||
Alert.alert('Error', 'Failed to logout');
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const generateQRCode = async () => {
|
setIsGeneratingQR(true);
|
||||||
if (!currentUser?.email || !ICameraSDK) {
|
try {
|
||||||
Alert.alert('Error', 'Native QR module not available');
|
const qrData = `User: ${currentUser.fullName}\nEmail: ${currentUser.email}`;
|
||||||
return;
|
const base64Image = await MyNativeModule.generateQRCode(qrData, 300, 300);
|
||||||
}
|
setQrCode(base64Image);
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error);
|
||||||
|
Alert.alert('Error', 'Failed to generate QR code');
|
||||||
|
} finally {
|
||||||
|
setIsGeneratingQR(false);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
setIsGeneratingQR(true);
|
const handleScanResult = (result: any) => {
|
||||||
try {
|
setScannedCodes(prev => [
|
||||||
const qrData = `User: ${currentUser.fullName}\nEmail: ${currentUser.email}`;
|
{
|
||||||
const base64 = await ICameraSDK.generateQRCode(qrData, 300, 300);
|
code: result.code,
|
||||||
setQrCode(base64);
|
format: result.format,
|
||||||
} catch (e) {
|
timestamp: new Date().toLocaleTimeString(),
|
||||||
console.error(e);
|
},
|
||||||
Alert.alert('Error', 'QR generation failed');
|
...prev,
|
||||||
} finally {
|
]);
|
||||||
setIsGeneratingQR(false);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const handleScanResult = (result: any) => {
|
Alert.alert(
|
||||||
setScannedCodes(prev => [
|
'Scanned Successfully',
|
||||||
{
|
`Code: ${result.code}\nFormat: ${result.format}`,
|
||||||
code: result.code,
|
[{ text: 'OK', onPress: () => setCurrentScreen('home') }]
|
||||||
format: result.format,
|
|
||||||
timestamp: new Date().toLocaleTimeString(),
|
|
||||||
},
|
|
||||||
...prev,
|
|
||||||
]);
|
|
||||||
|
|
||||||
Alert.alert(
|
|
||||||
'Scanned',
|
|
||||||
`Code: ${result.code}\nFormat: ${result.format}`,
|
|
||||||
[{ text: 'OK', onPress: () => setCurrentScreen('home') }]
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
/* -------------------- RENDER -------------------- */
|
|
||||||
const renderScreen = () => {
|
|
||||||
switch (currentScreen) {
|
|
||||||
case 'login':
|
|
||||||
return (
|
|
||||||
<Login
|
|
||||||
onNavigateToRegister={navigateToRegister}
|
|
||||||
onLoginSuccess={navigateToHome}
|
|
||||||
/>
|
|
||||||
);
|
);
|
||||||
|
};
|
||||||
|
|
||||||
case 'register':
|
/* -------------------- RENDER -------------------- */
|
||||||
|
const renderScreen = () => {
|
||||||
|
switch (currentScreen) {
|
||||||
|
case 'login':
|
||||||
|
return (
|
||||||
|
<Login
|
||||||
|
onNavigateToRegister={navigateToRegister}
|
||||||
|
onLoginSuccess={navigateToHome}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
|
||||||
|
case 'register':
|
||||||
|
return (
|
||||||
|
<Register
|
||||||
|
onNavigateToLogin={navigateToLogin}
|
||||||
|
onRegisterSuccess={navigateToHome}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
|
||||||
|
case 'scanner':
|
||||||
|
return (
|
||||||
|
<ScannerScreen
|
||||||
|
presignedUrl="https://your-backend-presigned-url.com"
|
||||||
|
onScan={handleScanResult}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
|
||||||
|
case 'home':
|
||||||
|
return (
|
||||||
|
<ScrollView style={styles.homeContainer} contentContainerStyle={styles.scrollContent} >
|
||||||
|
<Text style={styles.welcomeText}>
|
||||||
|
Welcome, {currentUser?.fullName || 'User'
|
||||||
|
}
|
||||||
|
</Text>
|
||||||
|
|
||||||
|
{
|
||||||
|
qrCode && (
|
||||||
|
<Image source={{ uri: qrCode }} style={styles.qrImage} />
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
<TouchableOpacity style={styles.scannerButton} onPress={openScanner} >
|
||||||
|
<Text style={styles.buttonText}> Scan QR / Barcode </Text>
|
||||||
|
</TouchableOpacity>
|
||||||
|
|
||||||
|
< TouchableOpacity
|
||||||
|
style={styles.qrButton}
|
||||||
|
onPress={generateQRCode}
|
||||||
|
disabled={isGeneratingQR}
|
||||||
|
>
|
||||||
|
<Text style={styles.buttonText}>
|
||||||
|
{isGeneratingQR ? 'Generating...' : 'Generate QR Code'}
|
||||||
|
</Text>
|
||||||
|
</TouchableOpacity>
|
||||||
|
|
||||||
|
< TouchableOpacity style={styles.statusButton} onPress={showAppStatus} >
|
||||||
|
<Text style={styles.buttonText}> App Status </Text>
|
||||||
|
</TouchableOpacity>
|
||||||
|
|
||||||
|
< TouchableOpacity style={styles.mapButton} onPress={openMap} >
|
||||||
|
<Text style={styles.buttonText}> Open Map </Text>
|
||||||
|
</TouchableOpacity>
|
||||||
|
|
||||||
|
< TouchableOpacity style={styles.logoutButton} onPress={handleLogout} >
|
||||||
|
<Text style={styles.buttonText}> Logout </Text>
|
||||||
|
</TouchableOpacity>
|
||||||
|
</ScrollView>
|
||||||
|
);
|
||||||
|
|
||||||
|
case 'map':
|
||||||
|
return (
|
||||||
|
<View style={{ flex: 1 }}>
|
||||||
|
<Map onClose={() => setCurrentScreen('home')} />
|
||||||
|
</View>
|
||||||
|
);
|
||||||
|
|
||||||
|
default:
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/* -------------------- LOADING -------------------- */
|
||||||
|
if (!isInitialized) {
|
||||||
return (
|
return (
|
||||||
<Register
|
<SafeAreaProvider>
|
||||||
onNavigateToLogin={navigateToLogin}
|
<View style={styles.loadingContainer} >
|
||||||
onRegisterSuccess={navigateToHome}
|
<Text style={styles.loadingText}> Initializing...</Text>
|
||||||
/>
|
</View>
|
||||||
);
|
</SafeAreaProvider>
|
||||||
|
|
||||||
case 'scanner':
|
|
||||||
return (
|
|
||||||
<ScannerScreen
|
|
||||||
presignedUrl="https://your-backend-presigned-url.com"
|
|
||||||
onScan={handleScanResult}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
|
|
||||||
case 'home':
|
|
||||||
return (
|
|
||||||
<ScrollView
|
|
||||||
style={styles.homeContainer}
|
|
||||||
contentContainerStyle={styles.scrollContent}
|
|
||||||
>
|
|
||||||
<Text style={styles.welcomeText}>
|
|
||||||
Welcome, {currentUser?.fullName || 'User'}
|
|
||||||
</Text>
|
|
||||||
|
|
||||||
{qrCode && <Image source={{ uri: qrCode }} style={styles.qrImage} />}
|
|
||||||
|
|
||||||
<TouchableOpacity style={styles.button} onPress={openScanner}>
|
|
||||||
<Text style={styles.buttonText}>Scan QR / Barcode</Text>
|
|
||||||
</TouchableOpacity>
|
|
||||||
|
|
||||||
<TouchableOpacity
|
|
||||||
style={[styles.button, styles.qrButton]}
|
|
||||||
onPress={generateQRCode}
|
|
||||||
disabled={isGeneratingQR}
|
|
||||||
>
|
|
||||||
<Text style={styles.buttonText}>
|
|
||||||
{isGeneratingQR ? 'Generating...' : 'Generate QR'}
|
|
||||||
</Text>
|
|
||||||
</TouchableOpacity>
|
|
||||||
|
|
||||||
<TouchableOpacity
|
|
||||||
style={[styles.button, styles.logoutButton]}
|
|
||||||
onPress={handleLogout}
|
|
||||||
>
|
|
||||||
<Text style={styles.buttonText}>Logout</Text>
|
|
||||||
</TouchableOpacity>
|
|
||||||
</ScrollView>
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
if (!isInitialized) {
|
|
||||||
return (
|
return (
|
||||||
<SafeAreaProvider>
|
<SafeAreaProvider>
|
||||||
<View style={styles.loading}>
|
<StatusBar barStyle={isDarkMode ? 'light-content' : 'dark-content'} />
|
||||||
<Text>Initializing...</Text>
|
{renderScreen()}
|
||||||
</View>
|
</SafeAreaProvider>
|
||||||
</SafeAreaProvider>
|
|
||||||
);
|
);
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<SafeAreaProvider>
|
|
||||||
<StatusBar barStyle={isDarkMode ? 'light-content' : 'dark-content'} />
|
|
||||||
{renderScreen()}
|
|
||||||
</SafeAreaProvider>
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export default App;
|
|
||||||
|
|
||||||
/* -------------------- STYLES -------------------- */
|
|
||||||
|
|
||||||
const styles = StyleSheet.create({
|
const styles = StyleSheet.create({
|
||||||
loading: { flex: 1, justifyContent: 'center', alignItems: 'center' },
|
loadingContainer: { flex: 1, justifyContent: 'center', alignItems: 'center' },
|
||||||
homeContainer: { flex: 1 },
|
loadingText: { fontSize: 18, fontWeight: '600' },
|
||||||
scrollContent: { alignItems: 'center', padding: 20 },
|
homeContainer: { flex: 1 },
|
||||||
welcomeText: { fontSize: 24, fontWeight: '700', marginBottom: 20 },
|
scrollContent: { alignItems: 'center', padding: 20 },
|
||||||
qrImage: { width: 300, height: 300, marginBottom: 20 },
|
welcomeText: { fontSize: 24, fontWeight: '700', marginBottom: 20 },
|
||||||
button: {
|
qrImage: { width: 300, height: 300, marginBottom: 20 },
|
||||||
backgroundColor: '#6366f1',
|
scannerButton: { backgroundColor: '#9333ea', padding: 14, borderRadius: 20, marginBottom: 10 },
|
||||||
padding: 14,
|
qrButton: { backgroundColor: '#10b981', padding: 14, borderRadius: 20, marginBottom: 10 },
|
||||||
borderRadius: 18,
|
statusButton: { backgroundColor: '#3bb6d8', padding: 14, borderRadius: 20, marginBottom: 10 },
|
||||||
marginBottom: 12,
|
mapButton: { backgroundColor: '#2563eb', padding: 14, borderRadius: 20, marginBottom: 10 },
|
||||||
minWidth: 220,
|
logoutButton: { backgroundColor: '#ff6b6b', padding: 14, borderRadius: 20 },
|
||||||
alignItems: 'center',
|
buttonText: { color: '#fff', fontWeight: '600' },
|
||||||
},
|
|
||||||
qrButton: { backgroundColor: '#10b981' },
|
|
||||||
logoutButton: { backgroundColor: '#ef4444' },
|
|
||||||
buttonText: { color: '#fff', fontWeight: '600' },
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
export default App;
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
|
||||||
|
|
||||||
<application
|
<application
|
||||||
android:name=".MainApplication"
|
android:name=".MainApplication"
|
||||||
@@ -23,5 +27,9 @@
|
|||||||
<category android:name="android.intent.category.LAUNCHER" />
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
|
<meta-data
|
||||||
|
android:name="com.google.android.geo.API_KEY"
|
||||||
|
android:value="AIzaSyAOVYRIgupAurZup5y1PRh8Ismb1A3lLao"/>
|
||||||
|
|
||||||
</application>
|
</application>
|
||||||
</manifest>
|
</manifest>
|
||||||
|
|||||||
@@ -1,39 +0,0 @@
|
|||||||
package com.lynkeduppro.camera
|
|
||||||
|
|
||||||
import com.facebook.react.uimanager.SimpleViewManager
|
|
||||||
import com.facebook.react.uimanager.ThemedReactContext
|
|
||||||
import com.facebook.react.uimanager.annotations.ReactProp
|
|
||||||
import com.facebook.react.bridge.LifecycleEventListener
|
|
||||||
|
|
||||||
class CameraPreviewManager :
|
|
||||||
SimpleViewManager<CameraPreviewView>(),
|
|
||||||
LifecycleEventListener {
|
|
||||||
|
|
||||||
private var previewView: CameraPreviewView? = null
|
|
||||||
|
|
||||||
override fun getName(): String = "CameraPreviewView"
|
|
||||||
|
|
||||||
override fun createViewInstance(reactContext: ThemedReactContext): CameraPreviewView {
|
|
||||||
previewView = CameraPreviewView(reactContext)
|
|
||||||
reactContext.addLifecycleEventListener(this)
|
|
||||||
return previewView!!
|
|
||||||
}
|
|
||||||
|
|
||||||
@ReactProp(name = "active")
|
|
||||||
fun setActive(view: CameraPreviewView, active: Boolean) {
|
|
||||||
if (active && reactContext is androidx.lifecycle.LifecycleOwner) {
|
|
||||||
view.startCamera(reactContext as androidx.lifecycle.LifecycleOwner)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onHostResume() {
|
|
||||||
previewView?.let {
|
|
||||||
if (reactContext is androidx.lifecycle.LifecycleOwner) {
|
|
||||||
it.startCamera(reactContext as androidx.lifecycle.LifecycleOwner)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onHostPause() {}
|
|
||||||
override fun onHostDestroy() {}
|
|
||||||
}
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
package com.lynkeduppro.camera
|
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import androidx.camera.core.CameraSelector
|
|
||||||
import androidx.camera.core.Preview
|
|
||||||
import androidx.camera.lifecycle.ProcessCameraProvider
|
|
||||||
import androidx.camera.view.PreviewView
|
|
||||||
import androidx.core.content.ContextCompat
|
|
||||||
import androidx.lifecycle.LifecycleOwner
|
|
||||||
|
|
||||||
class CameraPreviewView(context: Context) : PreviewView(context) {
|
|
||||||
|
|
||||||
fun startCamera(lifecycleOwner: LifecycleOwner) {
|
|
||||||
val cameraProviderFuture = ProcessCameraProvider.getInstance(context)
|
|
||||||
|
|
||||||
cameraProviderFuture.addListener({
|
|
||||||
val cameraProvider = cameraProviderFuture.get()
|
|
||||||
|
|
||||||
val preview = Preview.Builder().build().also {
|
|
||||||
it.setSurfaceProvider(surfaceProvider)
|
|
||||||
}
|
|
||||||
|
|
||||||
val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
|
|
||||||
|
|
||||||
cameraProvider.unbindAll()
|
|
||||||
cameraProvider.bindToLifecycle(
|
|
||||||
lifecycleOwner,
|
|
||||||
cameraSelector,
|
|
||||||
preview
|
|
||||||
)
|
|
||||||
}, ContextCompat.getMainExecutor(context))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -34,7 +34,7 @@
|
|||||||
<true/>
|
<true/>
|
||||||
</dict>
|
</dict>
|
||||||
<key>NSLocationWhenInUseUsageDescription</key>
|
<key>NSLocationWhenInUseUsageDescription</key>
|
||||||
<string></string>
|
<string>Used to show your current location on the map.</string>
|
||||||
<key>RCTNewArchEnabled</key>
|
<key>RCTNewArchEnabled</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>UIAppFonts</key>
|
<key>UIAppFonts</key>
|
||||||
|
|||||||
603
package-lock.json
generated
603
package-lock.json
generated
@@ -8,13 +8,19 @@
|
|||||||
"name": "LynkedUpPro",
|
"name": "LynkedUpPro",
|
||||||
"version": "0.0.1",
|
"version": "0.0.1",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@mapbox/polyline": "^1.2.1",
|
||||||
"@react-native-async-storage/async-storage": "^1.24.0",
|
"@react-native-async-storage/async-storage": "^1.24.0",
|
||||||
|
"@react-native-community/geolocation": "^3.4.0",
|
||||||
"@react-native-community/netinfo": "^11.3.1",
|
"@react-native-community/netinfo": "^11.3.1",
|
||||||
"@react-native/new-app-screen": "0.82.1",
|
"@react-native/new-app-screen": "0.82.1",
|
||||||
"lynkeduppro-login-sdk": "^0.1.9",
|
"lynkeduppro-login-sdk": "^0.1.9",
|
||||||
"react": "19.1.1",
|
"react": "19.1.1",
|
||||||
"react-native": "0.82.1",
|
"react-native": "0.82.1",
|
||||||
"react-native-safe-area-context": "^5.5.2"
|
"react-native-map-clustering": "^4.0.0",
|
||||||
|
"react-native-maps": "^1.26.20",
|
||||||
|
"react-native-permissions": "^5.4.4",
|
||||||
|
"react-native-safe-area-context": "^5.5.2",
|
||||||
|
"react-native-webview": "^13.16.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/core": "^7.25.2",
|
"@babel/core": "^7.25.2",
|
||||||
@@ -2646,6 +2652,37 @@
|
|||||||
"@jridgewell/sourcemap-codec": "^1.4.14"
|
"@jridgewell/sourcemap-codec": "^1.4.14"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@mapbox/geo-viewport": {
|
||||||
|
"version": "0.4.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@mapbox/geo-viewport/-/geo-viewport-0.4.1.tgz",
|
||||||
|
"integrity": "sha512-5g6eM3EOSl7+0p0VY+vHWEYjUlNzof936VKHTi/NuJVABjbYe8D2NAVJ0qt5C9Np4glUlhKFepgAgQ0OEybrjQ==",
|
||||||
|
"license": "BSD-2-Clause",
|
||||||
|
"dependencies": {
|
||||||
|
"@mapbox/sphericalmercator": "~1.1.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@mapbox/polyline": {
|
||||||
|
"version": "1.2.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@mapbox/polyline/-/polyline-1.2.1.tgz",
|
||||||
|
"integrity": "sha512-sn0V18O3OzW4RCcPoUIVDWvEGQaBNH9a0y5lgqrf5hUycyw1CzrhEoxV5irzrMNXKCkw1xRsZXcaVbsVZggHXA==",
|
||||||
|
"dependencies": {
|
||||||
|
"meow": "^9.0.0"
|
||||||
|
},
|
||||||
|
"bin": {
|
||||||
|
"polyline": "bin/polyline.bin.js"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@mapbox/sphericalmercator": {
|
||||||
|
"version": "1.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@mapbox/sphericalmercator/-/sphericalmercator-1.1.0.tgz",
|
||||||
|
"integrity": "sha512-pEsfZyG4OMThlfFQbCte4gegvHUjxXCjz0KZ4Xk8NdOYTQBLflj6U8PL05RPAiuRAMAQNUUKJuL6qYZ5Y4kAWA==",
|
||||||
|
"bin": {
|
||||||
|
"bbox": "bin/bbox.js",
|
||||||
|
"to4326": "bin/to4326.js",
|
||||||
|
"to900913": "bin/to900913.js",
|
||||||
|
"xyz": "bin/xyz.js"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@nicolo-ribaudo/eslint-scope-5-internals": {
|
"node_modules/@nicolo-ribaudo/eslint-scope-5-internals": {
|
||||||
"version": "5.1.1-v1",
|
"version": "5.1.1-v1",
|
||||||
"resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz",
|
"resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz",
|
||||||
@@ -2939,6 +2976,19 @@
|
|||||||
"node": ">=10"
|
"node": ">=10"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@react-native-community/geolocation": {
|
||||||
|
"version": "3.4.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@react-native-community/geolocation/-/geolocation-3.4.0.tgz",
|
||||||
|
"integrity": "sha512-bzZH89/cwmpkPMKKveoC72C4JH0yF4St5Ceg/ZM9pA1SqX9MlRIrIrrOGZ/+yi++xAvFDiYfihtn9TvXWU9/rA==",
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=18.0.0"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"react": "*",
|
||||||
|
"react-native": "*"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@react-native-community/netinfo": {
|
"node_modules/@react-native-community/netinfo": {
|
||||||
"version": "11.4.1",
|
"version": "11.4.1",
|
||||||
"resolved": "https://registry.npmjs.org/@react-native-community/netinfo/-/netinfo-11.4.1.tgz",
|
"resolved": "https://registry.npmjs.org/@react-native-community/netinfo/-/netinfo-11.4.1.tgz",
|
||||||
@@ -3402,6 +3452,12 @@
|
|||||||
"@babel/types": "^7.28.2"
|
"@babel/types": "^7.28.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@types/geojson": {
|
||||||
|
"version": "7946.0.16",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz",
|
||||||
|
"integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==",
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
"node_modules/@types/graceful-fs": {
|
"node_modules/@types/graceful-fs": {
|
||||||
"version": "4.1.9",
|
"version": "4.1.9",
|
||||||
"resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz",
|
"resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz",
|
||||||
@@ -3446,6 +3502,12 @@
|
|||||||
"pretty-format": "^29.0.0"
|
"pretty-format": "^29.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@types/minimist": {
|
||||||
|
"version": "1.2.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz",
|
||||||
|
"integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==",
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
"node_modules/@types/node": {
|
"node_modules/@types/node": {
|
||||||
"version": "24.10.1",
|
"version": "24.10.1",
|
||||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz",
|
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz",
|
||||||
@@ -3455,6 +3517,12 @@
|
|||||||
"undici-types": "~7.16.0"
|
"undici-types": "~7.16.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@types/normalize-package-data": {
|
||||||
|
"version": "2.4.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz",
|
||||||
|
"integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==",
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
"node_modules/@types/react": {
|
"node_modules/@types/react": {
|
||||||
"version": "19.2.6",
|
"version": "19.2.6",
|
||||||
"resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.6.tgz",
|
"resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.6.tgz",
|
||||||
@@ -4099,6 +4167,15 @@
|
|||||||
"url": "https://github.com/sponsors/ljharb"
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/arrify": {
|
||||||
|
"version": "1.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
|
||||||
|
"integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==",
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=0.10.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/asap": {
|
"node_modules/asap": {
|
||||||
"version": "2.0.6",
|
"version": "2.0.6",
|
||||||
"resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
|
"resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
|
||||||
@@ -4581,6 +4658,23 @@
|
|||||||
"node": ">=6"
|
"node": ">=6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/camelcase-keys": {
|
||||||
|
"version": "6.2.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz",
|
||||||
|
"integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"camelcase": "^5.3.1",
|
||||||
|
"map-obj": "^4.0.0",
|
||||||
|
"quick-lru": "^4.0.1"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=8"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/sindresorhus"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/caniuse-lite": {
|
"node_modules/caniuse-lite": {
|
||||||
"version": "1.0.30001756",
|
"version": "1.0.30001756",
|
||||||
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001756.tgz",
|
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001756.tgz",
|
||||||
@@ -5082,7 +5176,31 @@
|
|||||||
"version": "1.2.0",
|
"version": "1.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
|
||||||
"integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
|
"integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
|
||||||
"devOptional": true,
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=0.10.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/decamelize-keys": {
|
||||||
|
"version": "1.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz",
|
||||||
|
"integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"decamelize": "^1.1.0",
|
||||||
|
"map-obj": "^1.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=0.10.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/sindresorhus"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/decamelize-keys/node_modules/map-obj": {
|
||||||
|
"version": "1.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
|
||||||
|
"integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=0.10.0"
|
"node": ">=0.10.0"
|
||||||
@@ -5303,7 +5421,6 @@
|
|||||||
"version": "1.3.4",
|
"version": "1.3.4",
|
||||||
"resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz",
|
"resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz",
|
||||||
"integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==",
|
"integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==",
|
||||||
"devOptional": true,
|
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"is-arrayish": "^0.2.1"
|
"is-arrayish": "^0.2.1"
|
||||||
@@ -6352,7 +6469,6 @@
|
|||||||
"version": "1.1.2",
|
"version": "1.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
|
||||||
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
|
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
|
||||||
"devOptional": true,
|
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"funding": {
|
"funding": {
|
||||||
"url": "https://github.com/sponsors/ljharb"
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
@@ -6611,6 +6727,15 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
|
"node_modules/hard-rejection": {
|
||||||
|
"version": "2.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz",
|
||||||
|
"integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==",
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=6"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/has-bigints": {
|
"node_modules/has-bigints": {
|
||||||
"version": "1.1.0",
|
"version": "1.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz",
|
||||||
@@ -6695,7 +6820,6 @@
|
|||||||
"version": "2.0.2",
|
"version": "2.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
|
||||||
"integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
|
"integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
|
||||||
"devOptional": true,
|
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"function-bind": "^1.1.2"
|
"function-bind": "^1.1.2"
|
||||||
@@ -6725,6 +6849,36 @@
|
|||||||
"hermes-estree": "0.32.0"
|
"hermes-estree": "0.32.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/hosted-git-info": {
|
||||||
|
"version": "4.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
|
||||||
|
"integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
|
||||||
|
"license": "ISC",
|
||||||
|
"dependencies": {
|
||||||
|
"lru-cache": "^6.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=10"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/hosted-git-info/node_modules/lru-cache": {
|
||||||
|
"version": "6.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
|
||||||
|
"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
|
||||||
|
"license": "ISC",
|
||||||
|
"dependencies": {
|
||||||
|
"yallist": "^4.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=10"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/hosted-git-info/node_modules/yallist": {
|
||||||
|
"version": "4.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
|
||||||
|
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
|
||||||
|
"license": "ISC"
|
||||||
|
},
|
||||||
"node_modules/html-escaper": {
|
"node_modules/html-escaper": {
|
||||||
"version": "2.0.2",
|
"version": "2.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
|
||||||
@@ -6885,6 +7039,15 @@
|
|||||||
"node": ">=0.8.19"
|
"node": ">=0.8.19"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/indent-string": {
|
||||||
|
"version": "4.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
|
||||||
|
"integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=8"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/inflight": {
|
"node_modules/inflight": {
|
||||||
"version": "1.0.6",
|
"version": "1.0.6",
|
||||||
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
|
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
|
||||||
@@ -6948,7 +7111,6 @@
|
|||||||
"version": "0.2.1",
|
"version": "0.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
|
||||||
"integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
|
"integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
|
||||||
"devOptional": true,
|
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/is-async-function": {
|
"node_modules/is-async-function": {
|
||||||
@@ -7021,7 +7183,6 @@
|
|||||||
"version": "2.16.1",
|
"version": "2.16.1",
|
||||||
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
|
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
|
||||||
"integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
|
"integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
|
||||||
"devOptional": true,
|
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"hasown": "^2.0.2"
|
"hasown": "^2.0.2"
|
||||||
@@ -8185,7 +8346,6 @@
|
|||||||
"version": "2.3.1",
|
"version": "2.3.1",
|
||||||
"resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
|
"resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
|
||||||
"integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
|
"integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
|
||||||
"devOptional": true,
|
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/json-schema-traverse": {
|
"node_modules/json-schema-traverse": {
|
||||||
@@ -8240,6 +8400,12 @@
|
|||||||
"node": ">=4.0"
|
"node": ">=4.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/kdbush": {
|
||||||
|
"version": "4.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/kdbush/-/kdbush-4.0.2.tgz",
|
||||||
|
"integrity": "sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA==",
|
||||||
|
"license": "ISC"
|
||||||
|
},
|
||||||
"node_modules/keyv": {
|
"node_modules/keyv": {
|
||||||
"version": "4.5.4",
|
"version": "4.5.4",
|
||||||
"resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
|
"resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
|
||||||
@@ -8250,6 +8416,15 @@
|
|||||||
"json-buffer": "3.0.1"
|
"json-buffer": "3.0.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/kind-of": {
|
||||||
|
"version": "6.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
|
||||||
|
"integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=0.10.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/kleur": {
|
"node_modules/kleur": {
|
||||||
"version": "3.0.3",
|
"version": "3.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
|
||||||
@@ -8323,7 +8498,6 @@
|
|||||||
"version": "1.2.4",
|
"version": "1.2.4",
|
||||||
"resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
|
"resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
|
||||||
"integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
|
"integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
|
||||||
"devOptional": true,
|
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/locate-path": {
|
"node_modules/locate-path": {
|
||||||
@@ -8597,6 +8771,18 @@
|
|||||||
"tmpl": "1.0.5"
|
"tmpl": "1.0.5"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/map-obj": {
|
||||||
|
"version": "4.3.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz",
|
||||||
|
"integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==",
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=8"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/sindresorhus"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/marky": {
|
"node_modules/marky": {
|
||||||
"version": "1.3.0",
|
"version": "1.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/marky/-/marky-1.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/marky/-/marky-1.3.0.tgz",
|
||||||
@@ -8629,6 +8815,53 @@
|
|||||||
"integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==",
|
"integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==",
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
|
"node_modules/meow": {
|
||||||
|
"version": "9.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz",
|
||||||
|
"integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@types/minimist": "^1.2.0",
|
||||||
|
"camelcase-keys": "^6.2.2",
|
||||||
|
"decamelize": "^1.2.0",
|
||||||
|
"decamelize-keys": "^1.1.0",
|
||||||
|
"hard-rejection": "^2.1.0",
|
||||||
|
"minimist-options": "4.1.0",
|
||||||
|
"normalize-package-data": "^3.0.0",
|
||||||
|
"read-pkg-up": "^7.0.1",
|
||||||
|
"redent": "^3.0.0",
|
||||||
|
"trim-newlines": "^3.0.0",
|
||||||
|
"type-fest": "^0.18.0",
|
||||||
|
"yargs-parser": "^20.2.3"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=10"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/sindresorhus"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/meow/node_modules/type-fest": {
|
||||||
|
"version": "0.18.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz",
|
||||||
|
"integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==",
|
||||||
|
"license": "(MIT OR CC0-1.0)",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=10"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/sindresorhus"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/meow/node_modules/yargs-parser": {
|
||||||
|
"version": "20.2.9",
|
||||||
|
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
|
||||||
|
"integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
|
||||||
|
"license": "ISC",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=10"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/merge-options": {
|
"node_modules/merge-options": {
|
||||||
"version": "3.0.4",
|
"version": "3.0.4",
|
||||||
"resolved": "https://registry.npmjs.org/merge-options/-/merge-options-3.0.4.tgz",
|
"resolved": "https://registry.npmjs.org/merge-options/-/merge-options-3.0.4.tgz",
|
||||||
@@ -9047,6 +9280,15 @@
|
|||||||
"node": ">=6"
|
"node": ">=6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/min-indent": {
|
||||||
|
"version": "1.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
|
||||||
|
"integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=4"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/minimatch": {
|
"node_modules/minimatch": {
|
||||||
"version": "9.0.5",
|
"version": "9.0.5",
|
||||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
|
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
|
||||||
@@ -9063,6 +9305,29 @@
|
|||||||
"url": "https://github.com/sponsors/isaacs"
|
"url": "https://github.com/sponsors/isaacs"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/minimist-options": {
|
||||||
|
"version": "4.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
|
||||||
|
"integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"arrify": "^1.0.1",
|
||||||
|
"is-plain-obj": "^1.1.0",
|
||||||
|
"kind-of": "^6.0.3"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 6"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/minimist-options/node_modules/is-plain-obj": {
|
||||||
|
"version": "1.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
|
||||||
|
"integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==",
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=0.10.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/mkdirp": {
|
"node_modules/mkdirp": {
|
||||||
"version": "1.0.4",
|
"version": "1.0.4",
|
||||||
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
|
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
|
||||||
@@ -9134,6 +9399,33 @@
|
|||||||
"url": "https://github.com/sponsors/antelle"
|
"url": "https://github.com/sponsors/antelle"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/normalize-package-data": {
|
||||||
|
"version": "3.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz",
|
||||||
|
"integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==",
|
||||||
|
"license": "BSD-2-Clause",
|
||||||
|
"dependencies": {
|
||||||
|
"hosted-git-info": "^4.0.1",
|
||||||
|
"is-core-module": "^2.5.0",
|
||||||
|
"semver": "^7.3.4",
|
||||||
|
"validate-npm-package-license": "^3.0.1"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=10"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/normalize-package-data/node_modules/semver": {
|
||||||
|
"version": "7.7.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
|
||||||
|
"integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
|
||||||
|
"license": "ISC",
|
||||||
|
"bin": {
|
||||||
|
"semver": "bin/semver.js"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=10"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/normalize-path": {
|
"node_modules/normalize-path": {
|
||||||
"version": "3.0.0",
|
"version": "3.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
|
||||||
@@ -9460,7 +9752,6 @@
|
|||||||
"version": "5.2.0",
|
"version": "5.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
|
||||||
"integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
|
"integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
|
||||||
"devOptional": true,
|
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/code-frame": "^7.0.0",
|
"@babel/code-frame": "^7.0.0",
|
||||||
@@ -9515,7 +9806,6 @@
|
|||||||
"version": "1.0.7",
|
"version": "1.0.7",
|
||||||
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
|
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
|
||||||
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
|
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
|
||||||
"devOptional": true,
|
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/picocolors": {
|
"node_modules/picocolors": {
|
||||||
@@ -9791,6 +10081,15 @@
|
|||||||
],
|
],
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
|
"node_modules/quick-lru": {
|
||||||
|
"version": "4.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz",
|
||||||
|
"integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=8"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/range-parser": {
|
"node_modules/range-parser": {
|
||||||
"version": "1.2.1",
|
"version": "1.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
|
||||||
@@ -9920,6 +10219,58 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/react-native-map-clustering": {
|
||||||
|
"version": "4.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/react-native-map-clustering/-/react-native-map-clustering-4.0.0.tgz",
|
||||||
|
"integrity": "sha512-+YNh4frhZIHQReURxYGHNy9MJ50GYWpW6psoBEjvTG6vb33eYu00GmO8Pu/9VwMB1YL5lOxZ9+sJClJ8Mz1Bxw==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@mapbox/geo-viewport": "^0.4.1",
|
||||||
|
"supercluster": "^8.0.0"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"react-native": "*",
|
||||||
|
"react-native-maps": "*"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/react-native-maps": {
|
||||||
|
"version": "1.26.20",
|
||||||
|
"resolved": "https://registry.npmjs.org/react-native-maps/-/react-native-maps-1.26.20.tgz",
|
||||||
|
"integrity": "sha512-kWibDz6wLLQ0685gOEFz5jdzm4miD7PMeVdtZV7ilgftDcusC2iy7SueBJpHF0LKCoOSa1BEUiKqpx1dBMSNpA==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@types/geojson": "^7946.0.13"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 20.19.4"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"react": ">= 18.3.1",
|
||||||
|
"react-native": ">= 0.76.0",
|
||||||
|
"react-native-web": ">= 0.11"
|
||||||
|
},
|
||||||
|
"peerDependenciesMeta": {
|
||||||
|
"react-native-web": {
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/react-native-permissions": {
|
||||||
|
"version": "5.4.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/react-native-permissions/-/react-native-permissions-5.4.4.tgz",
|
||||||
|
"integrity": "sha512-WB5lRCBGXETfuaUhem2vgOceb9+URCeyfKpLGFSwoOffLuyJCA6+NTR3l1KLkrK4Ykxsig37z16/shUVufmt7A==",
|
||||||
|
"license": "MIT",
|
||||||
|
"peerDependencies": {
|
||||||
|
"react": ">=18.1.0",
|
||||||
|
"react-native": ">=0.70.0",
|
||||||
|
"react-native-windows": ">=0.70.0"
|
||||||
|
},
|
||||||
|
"peerDependenciesMeta": {
|
||||||
|
"react-native-windows": {
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/react-native-safe-area-context": {
|
"node_modules/react-native-safe-area-context": {
|
||||||
"version": "5.6.2",
|
"version": "5.6.2",
|
||||||
"resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-5.6.2.tgz",
|
"resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-5.6.2.tgz",
|
||||||
@@ -9930,6 +10281,20 @@
|
|||||||
"react-native": "*"
|
"react-native": "*"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/react-native-webview": {
|
||||||
|
"version": "13.16.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/react-native-webview/-/react-native-webview-13.16.0.tgz",
|
||||||
|
"integrity": "sha512-Nh13xKZWW35C0dbOskD7OX01nQQavOzHbCw9XoZmar4eXCo7AvrYJ0jlUfRVVIJzqINxHlpECYLdmAdFsl9xDA==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"escape-string-regexp": "^4.0.0",
|
||||||
|
"invariant": "2.2.4"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"react": "*",
|
||||||
|
"react-native": "*"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/react-native/node_modules/commander": {
|
"node_modules/react-native/node_modules/commander": {
|
||||||
"version": "12.1.0",
|
"version": "12.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz",
|
||||||
@@ -9981,6 +10346,135 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
|
"node_modules/read-pkg": {
|
||||||
|
"version": "5.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
|
||||||
|
"integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@types/normalize-package-data": "^2.4.0",
|
||||||
|
"normalize-package-data": "^2.5.0",
|
||||||
|
"parse-json": "^5.0.0",
|
||||||
|
"type-fest": "^0.6.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=8"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/read-pkg-up": {
|
||||||
|
"version": "7.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
|
||||||
|
"integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"find-up": "^4.1.0",
|
||||||
|
"read-pkg": "^5.2.0",
|
||||||
|
"type-fest": "^0.8.1"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=8"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/sindresorhus"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/read-pkg-up/node_modules/find-up": {
|
||||||
|
"version": "4.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
|
||||||
|
"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"locate-path": "^5.0.0",
|
||||||
|
"path-exists": "^4.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=8"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/read-pkg-up/node_modules/locate-path": {
|
||||||
|
"version": "5.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
|
||||||
|
"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"p-locate": "^4.1.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=8"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/read-pkg-up/node_modules/p-limit": {
|
||||||
|
"version": "2.3.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
|
||||||
|
"integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"p-try": "^2.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=6"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/sindresorhus"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/read-pkg-up/node_modules/p-locate": {
|
||||||
|
"version": "4.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
|
||||||
|
"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"p-limit": "^2.2.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=8"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/read-pkg-up/node_modules/type-fest": {
|
||||||
|
"version": "0.8.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
|
||||||
|
"integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
|
||||||
|
"license": "(MIT OR CC0-1.0)",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=8"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/read-pkg/node_modules/hosted-git-info": {
|
||||||
|
"version": "2.8.9",
|
||||||
|
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
|
||||||
|
"integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
|
||||||
|
"license": "ISC"
|
||||||
|
},
|
||||||
|
"node_modules/read-pkg/node_modules/normalize-package-data": {
|
||||||
|
"version": "2.5.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
|
||||||
|
"integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
|
||||||
|
"license": "BSD-2-Clause",
|
||||||
|
"dependencies": {
|
||||||
|
"hosted-git-info": "^2.1.4",
|
||||||
|
"resolve": "^1.10.0",
|
||||||
|
"semver": "2 || 3 || 4 || 5",
|
||||||
|
"validate-npm-package-license": "^3.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/read-pkg/node_modules/semver": {
|
||||||
|
"version": "5.7.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
|
||||||
|
"integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
|
||||||
|
"license": "ISC",
|
||||||
|
"bin": {
|
||||||
|
"semver": "bin/semver"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/read-pkg/node_modules/type-fest": {
|
||||||
|
"version": "0.6.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
|
||||||
|
"integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
|
||||||
|
"license": "(MIT OR CC0-1.0)",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=8"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/readable-stream": {
|
"node_modules/readable-stream": {
|
||||||
"version": "3.6.2",
|
"version": "3.6.2",
|
||||||
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
|
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
|
||||||
@@ -9996,6 +10490,19 @@
|
|||||||
"node": ">= 6"
|
"node": ">= 6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/redent": {
|
||||||
|
"version": "3.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
|
||||||
|
"integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"indent-string": "^4.0.0",
|
||||||
|
"strip-indent": "^3.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=8"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/reflect.getprototypeof": {
|
"node_modules/reflect.getprototypeof": {
|
||||||
"version": "1.0.10",
|
"version": "1.0.10",
|
||||||
"resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz",
|
"resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz",
|
||||||
@@ -10124,7 +10631,6 @@
|
|||||||
"version": "1.22.11",
|
"version": "1.22.11",
|
||||||
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz",
|
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz",
|
||||||
"integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==",
|
"integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==",
|
||||||
"devOptional": true,
|
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"is-core-module": "^2.16.1",
|
"is-core-module": "^2.16.1",
|
||||||
@@ -10698,6 +11204,38 @@
|
|||||||
"source-map": "^0.6.0"
|
"source-map": "^0.6.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/spdx-correct": {
|
||||||
|
"version": "3.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz",
|
||||||
|
"integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==",
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"dependencies": {
|
||||||
|
"spdx-expression-parse": "^3.0.0",
|
||||||
|
"spdx-license-ids": "^3.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/spdx-exceptions": {
|
||||||
|
"version": "2.5.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz",
|
||||||
|
"integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==",
|
||||||
|
"license": "CC-BY-3.0"
|
||||||
|
},
|
||||||
|
"node_modules/spdx-expression-parse": {
|
||||||
|
"version": "3.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
|
||||||
|
"integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"spdx-exceptions": "^2.1.0",
|
||||||
|
"spdx-license-ids": "^3.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/spdx-license-ids": {
|
||||||
|
"version": "3.0.22",
|
||||||
|
"resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz",
|
||||||
|
"integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==",
|
||||||
|
"license": "CC0-1.0"
|
||||||
|
},
|
||||||
"node_modules/sprintf-js": {
|
"node_modules/sprintf-js": {
|
||||||
"version": "1.0.3",
|
"version": "1.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
|
||||||
@@ -10959,6 +11497,18 @@
|
|||||||
"node": ">=6"
|
"node": ">=6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/strip-indent": {
|
||||||
|
"version": "3.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
|
||||||
|
"integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"min-indent": "^1.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=8"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/strip-json-comments": {
|
"node_modules/strip-json-comments": {
|
||||||
"version": "3.1.1",
|
"version": "3.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
|
||||||
@@ -10985,6 +11535,15 @@
|
|||||||
],
|
],
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
|
"node_modules/supercluster": {
|
||||||
|
"version": "8.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/supercluster/-/supercluster-8.0.1.tgz",
|
||||||
|
"integrity": "sha512-IiOea5kJ9iqzD2t7QJq/cREyLHTtSmUT6gQsweojg9WH2sYJqZK9SswTu6jrscO6D1G5v5vYZ9ru/eq85lXeZQ==",
|
||||||
|
"license": "ISC",
|
||||||
|
"dependencies": {
|
||||||
|
"kdbush": "^4.0.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/supports-color": {
|
"node_modules/supports-color": {
|
||||||
"version": "7.2.0",
|
"version": "7.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
|
||||||
@@ -11001,7 +11560,6 @@
|
|||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
|
||||||
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
|
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
|
||||||
"devOptional": true,
|
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 0.4"
|
"node": ">= 0.4"
|
||||||
@@ -11120,6 +11678,15 @@
|
|||||||
"node": ">=0.6"
|
"node": ">=0.6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/trim-newlines": {
|
||||||
|
"version": "3.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz",
|
||||||
|
"integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==",
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=8"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/ts-api-utils": {
|
"node_modules/ts-api-utils": {
|
||||||
"version": "2.1.0",
|
"version": "2.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
|
||||||
@@ -11433,6 +12000,16 @@
|
|||||||
"node": ">=10.12.0"
|
"node": ">=10.12.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/validate-npm-package-license": {
|
||||||
|
"version": "3.0.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
|
||||||
|
"integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"dependencies": {
|
||||||
|
"spdx-correct": "^3.0.0",
|
||||||
|
"spdx-expression-parse": "^3.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/vary": {
|
"node_modules/vary": {
|
||||||
"version": "1.1.2",
|
"version": "1.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
|
||||||
|
|||||||
10
package.json
10
package.json
@@ -10,13 +10,19 @@
|
|||||||
"test": "jest"
|
"test": "jest"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@mapbox/polyline": "^1.2.1",
|
||||||
"@react-native-async-storage/async-storage": "^1.24.0",
|
"@react-native-async-storage/async-storage": "^1.24.0",
|
||||||
|
"@react-native-community/geolocation": "^3.4.0",
|
||||||
"@react-native-community/netinfo": "^11.3.1",
|
"@react-native-community/netinfo": "^11.3.1",
|
||||||
"@react-native/new-app-screen": "0.82.1",
|
"@react-native/new-app-screen": "0.82.1",
|
||||||
"lynkeduppro-login-sdk": "^0.1.9",
|
"lynkeduppro-login-sdk": "^0.1.9",
|
||||||
"react": "19.1.1",
|
"react": "19.1.1",
|
||||||
"react-native": "0.82.1",
|
"react-native": "0.82.1",
|
||||||
"react-native-safe-area-context": "^5.5.2"
|
"react-native-map-clustering": "^4.0.0",
|
||||||
|
"react-native-maps": "^1.26.20",
|
||||||
|
"react-native-permissions": "^5.4.4",
|
||||||
|
"react-native-safe-area-context": "^5.5.2",
|
||||||
|
"react-native-webview": "^13.16.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/core": "^7.25.2",
|
"@babel/core": "^7.25.2",
|
||||||
@@ -41,4 +47,4 @@
|
|||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=20"
|
"node": ">=20"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
354
src/screens/Map.tsx
Normal file
354
src/screens/Map.tsx
Normal file
@@ -0,0 +1,354 @@
|
|||||||
|
import React, { useEffect, useRef, useState } from 'react';
|
||||||
|
import {
|
||||||
|
View,
|
||||||
|
StyleSheet,
|
||||||
|
PermissionsAndroid,
|
||||||
|
Platform,
|
||||||
|
Text,
|
||||||
|
FlatList,
|
||||||
|
Image,
|
||||||
|
Dimensions,
|
||||||
|
Animated,
|
||||||
|
ActivityIndicator,
|
||||||
|
TextInput,
|
||||||
|
TouchableOpacity,
|
||||||
|
} from 'react-native';
|
||||||
|
|
||||||
|
import MapView from 'react-native-map-clustering';
|
||||||
|
import { Marker, MapType, Region } from 'react-native-maps';
|
||||||
|
import Geolocation from '@react-native-community/geolocation';
|
||||||
|
|
||||||
|
const { width } = Dimensions.get('window');
|
||||||
|
|
||||||
|
/* ---------------- DEFAULT REGION ---------------- */
|
||||||
|
|
||||||
|
const DEFAULT_REGION: Region = {
|
||||||
|
latitude: 25.48131,
|
||||||
|
longitude: 81.854249,
|
||||||
|
latitudeDelta: 0.02,
|
||||||
|
longitudeDelta: 0.02,
|
||||||
|
};
|
||||||
|
|
||||||
|
/* ---------------- HELPERS ---------------- */
|
||||||
|
|
||||||
|
const formatPrice = (value: number) => {
|
||||||
|
if (!value) return '';
|
||||||
|
if (value >= 1_000_000) return `${(value / 1_000_000).toFixed(1)}M`;
|
||||||
|
if (value >= 1000) return `${Math.round(value / 1000)}K`;
|
||||||
|
return value.toString();
|
||||||
|
};
|
||||||
|
|
||||||
|
/* ---------------- PRICE MARKER ---------------- */
|
||||||
|
|
||||||
|
const PriceMarker = ({ item, onPress, selected }: any) => {
|
||||||
|
if (!item?.location) return null;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Marker
|
||||||
|
coordinate={{
|
||||||
|
latitude: item.location.lat,
|
||||||
|
longitude: item.location.lng,
|
||||||
|
}}
|
||||||
|
onPress={(e) => {
|
||||||
|
e.stopPropagation();
|
||||||
|
onPress(item);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<View style={[styles.pin, selected && styles.selectedPin]}>
|
||||||
|
<Text style={styles.pinText}>{formatPrice(item.price)}</Text>
|
||||||
|
</View>
|
||||||
|
</Marker>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
/* ---------------- MAIN SCREEN ---------------- */
|
||||||
|
|
||||||
|
const MapScreen = () => {
|
||||||
|
const mapRef = useRef<MapView>(null);
|
||||||
|
|
||||||
|
const [region, setRegion] = useState<Region>(DEFAULT_REGION);
|
||||||
|
const [mapType, setMapType] = useState<MapType>('standard');
|
||||||
|
const [properties, setProperties] = useState<any[]>([]);
|
||||||
|
const [selectedItem, setSelectedItem] = useState<any>(null);
|
||||||
|
const [loading, setLoading] = useState(false);
|
||||||
|
const [searchText, setSearchText] = useState('');
|
||||||
|
|
||||||
|
const popupAnim = useRef(new Animated.Value(0)).current;
|
||||||
|
|
||||||
|
/* ---------------- LIFE CYCLE ---------------- */
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
requestLocation();
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
Animated.timing(popupAnim, {
|
||||||
|
toValue: selectedItem ? 1 : 0,
|
||||||
|
duration: 250,
|
||||||
|
useNativeDriver: true,
|
||||||
|
}).start();
|
||||||
|
}, [selectedItem]);
|
||||||
|
|
||||||
|
/* ---------------- LOCATION ---------------- */
|
||||||
|
|
||||||
|
const requestLocation = async () => {
|
||||||
|
if (Platform.OS === 'android') {
|
||||||
|
const granted = await PermissionsAndroid.request(
|
||||||
|
PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION
|
||||||
|
);
|
||||||
|
if (granted !== PermissionsAndroid.RESULTS.GRANTED) return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Geolocation.getCurrentPosition((pos) => {
|
||||||
|
const { latitude, longitude } = pos.coords;
|
||||||
|
|
||||||
|
const newRegion = {
|
||||||
|
latitude,
|
||||||
|
longitude,
|
||||||
|
latitudeDelta: 0.02,
|
||||||
|
longitudeDelta: 0.02,
|
||||||
|
};
|
||||||
|
|
||||||
|
setRegion(newRegion);
|
||||||
|
mapRef.current?.animateToRegion(newRegion, 1000);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
/* ---------------- SEARCH API ---------------- */
|
||||||
|
|
||||||
|
const fetchProperties = async (locationName: string) => {
|
||||||
|
if (!locationName) return;
|
||||||
|
|
||||||
|
try {
|
||||||
|
setLoading(true);
|
||||||
|
setSelectedItem(null);
|
||||||
|
|
||||||
|
const response = await fetch(
|
||||||
|
'http://64.227.108.180:5000/property-search',
|
||||||
|
{
|
||||||
|
method: 'POST',
|
||||||
|
headers: { 'Content-Type': 'application/json' },
|
||||||
|
body: JSON.stringify({
|
||||||
|
location: locationName,
|
||||||
|
radius: 500,
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
const json = await response.json();
|
||||||
|
|
||||||
|
if (
|
||||||
|
json?.success &&
|
||||||
|
json?.location?.coordinates?.lat &&
|
||||||
|
json?.location?.coordinates?.lng
|
||||||
|
) {
|
||||||
|
const newRegion = {
|
||||||
|
latitude: json.location.coordinates.lat,
|
||||||
|
longitude: json.location.coordinates.lng,
|
||||||
|
latitudeDelta: 0.02,
|
||||||
|
longitudeDelta: 0.02,
|
||||||
|
};
|
||||||
|
|
||||||
|
setProperties(json.properties || []);
|
||||||
|
setRegion(newRegion);
|
||||||
|
|
||||||
|
// ✅ MOVE MAP TO SEARCH LOCATION
|
||||||
|
mapRef.current?.animateToRegion(newRegion, 1000);
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.log('API Error:', error);
|
||||||
|
} finally {
|
||||||
|
setLoading(false);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const popupTranslateY = popupAnim.interpolate({
|
||||||
|
inputRange: [0, 1],
|
||||||
|
outputRange: [200, 0],
|
||||||
|
});
|
||||||
|
|
||||||
|
/* ---------------- RENDER ---------------- */
|
||||||
|
|
||||||
|
return (
|
||||||
|
<View style={styles.container}>
|
||||||
|
{/* -------- SEARCH BAR -------- */}
|
||||||
|
<View style={styles.searchContainer}>
|
||||||
|
<TextInput
|
||||||
|
value={searchText}
|
||||||
|
onChangeText={setSearchText}
|
||||||
|
placeholder="Search area, locality..."
|
||||||
|
style={styles.searchInput}
|
||||||
|
returnKeyType="search"
|
||||||
|
onSubmitEditing={() => fetchProperties(searchText)}
|
||||||
|
/>
|
||||||
|
<TouchableOpacity
|
||||||
|
style={styles.searchButton}
|
||||||
|
onPress={() => fetchProperties(searchText)}
|
||||||
|
>
|
||||||
|
<Text style={styles.searchText}>Search</Text>
|
||||||
|
</TouchableOpacity>
|
||||||
|
</View>
|
||||||
|
|
||||||
|
{/* -------- MAP -------- */}
|
||||||
|
<MapView
|
||||||
|
ref={mapRef}
|
||||||
|
style={StyleSheet.absoluteFillObject}
|
||||||
|
region={region}
|
||||||
|
onRegionChangeComplete={(r) => {
|
||||||
|
if (!r?.longitudeDelta) return;
|
||||||
|
setRegion(r);
|
||||||
|
setMapType(r.latitudeDelta < 0.02 ? 'satellite' : 'standard');
|
||||||
|
}}
|
||||||
|
showsUserLocation
|
||||||
|
animationEnabled
|
||||||
|
clusterPressMaxZoom={16}
|
||||||
|
spiralEnabled={false}
|
||||||
|
mapType={mapType}
|
||||||
|
>
|
||||||
|
{properties.map((item) => (
|
||||||
|
<PriceMarker
|
||||||
|
key={item.id}
|
||||||
|
item={item}
|
||||||
|
selected={selectedItem?.id === item.id}
|
||||||
|
onPress={setSelectedItem}
|
||||||
|
/>
|
||||||
|
))}
|
||||||
|
</MapView>
|
||||||
|
|
||||||
|
{/* -------- LOADER -------- */}
|
||||||
|
{loading && (
|
||||||
|
<View style={styles.loader}>
|
||||||
|
<ActivityIndicator size="large" />
|
||||||
|
</View>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{/* -------- BOTTOM POPUP -------- */}
|
||||||
|
{selectedItem && (
|
||||||
|
<Animated.View
|
||||||
|
style={[
|
||||||
|
styles.popupContainer,
|
||||||
|
{ transform: [{ translateY: popupTranslateY }] },
|
||||||
|
]}
|
||||||
|
>
|
||||||
|
<FlatList
|
||||||
|
horizontal
|
||||||
|
data={[selectedItem]}
|
||||||
|
keyExtractor={(item) => item.id}
|
||||||
|
showsHorizontalScrollIndicator={false}
|
||||||
|
renderItem={({ item }) => (
|
||||||
|
<View style={styles.card}>
|
||||||
|
<Image
|
||||||
|
source={{ uri: 'https://picsum.photos/400/200' }}
|
||||||
|
style={styles.cardImage}
|
||||||
|
/>
|
||||||
|
<View style={styles.cardContent}>
|
||||||
|
<Text style={styles.cardPrice}>
|
||||||
|
{item.price_display}
|
||||||
|
</Text>
|
||||||
|
<Text style={styles.cardDetails}>
|
||||||
|
{item.bedrooms} Beds • {item.bathrooms} Baths
|
||||||
|
</Text>
|
||||||
|
<Text style={styles.cardAddress} numberOfLines={2}>
|
||||||
|
{item.address}
|
||||||
|
</Text>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
</Animated.View>
|
||||||
|
)}
|
||||||
|
</View>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
/* ---------------- STYLES ---------------- */
|
||||||
|
|
||||||
|
const styles = StyleSheet.create({
|
||||||
|
container: { flex: 1 },
|
||||||
|
|
||||||
|
searchContainer: {
|
||||||
|
position: 'absolute',
|
||||||
|
top: 40,
|
||||||
|
left: 16,
|
||||||
|
right: 16,
|
||||||
|
zIndex: 10,
|
||||||
|
flexDirection: 'row',
|
||||||
|
backgroundColor: '#fff',
|
||||||
|
borderRadius: 8,
|
||||||
|
elevation: 6,
|
||||||
|
},
|
||||||
|
searchInput: {
|
||||||
|
flex: 1,
|
||||||
|
padding: 12,
|
||||||
|
},
|
||||||
|
searchButton: {
|
||||||
|
paddingHorizontal: 16,
|
||||||
|
justifyContent: 'center',
|
||||||
|
backgroundColor: '#8B0000',
|
||||||
|
borderTopRightRadius: 8,
|
||||||
|
borderBottomRightRadius: 8,
|
||||||
|
},
|
||||||
|
searchText: {
|
||||||
|
color: '#fff',
|
||||||
|
fontWeight: '600',
|
||||||
|
},
|
||||||
|
|
||||||
|
pin: {
|
||||||
|
backgroundColor: '#8B0000',
|
||||||
|
paddingHorizontal: 12,
|
||||||
|
paddingVertical: 6,
|
||||||
|
borderRadius: 20,
|
||||||
|
borderWidth: 1,
|
||||||
|
borderColor: '#fff',
|
||||||
|
},
|
||||||
|
selectedPin: {
|
||||||
|
backgroundColor: '#F4C430',
|
||||||
|
borderColor: '#333',
|
||||||
|
},
|
||||||
|
pinText: {
|
||||||
|
color: '#fff',
|
||||||
|
fontWeight: '600',
|
||||||
|
fontSize: 12,
|
||||||
|
},
|
||||||
|
|
||||||
|
popupContainer: {
|
||||||
|
position: 'absolute',
|
||||||
|
bottom: 20,
|
||||||
|
},
|
||||||
|
|
||||||
|
card: {
|
||||||
|
backgroundColor: '#fff',
|
||||||
|
width: width * 0.8,
|
||||||
|
marginHorizontal: 10,
|
||||||
|
borderRadius: 16,
|
||||||
|
overflow: 'hidden',
|
||||||
|
elevation: 6,
|
||||||
|
},
|
||||||
|
cardImage: {
|
||||||
|
width: '100%',
|
||||||
|
height: 140,
|
||||||
|
},
|
||||||
|
cardContent: {
|
||||||
|
padding: 12,
|
||||||
|
},
|
||||||
|
cardPrice: {
|
||||||
|
fontSize: 18,
|
||||||
|
fontWeight: 'bold',
|
||||||
|
},
|
||||||
|
cardDetails: {
|
||||||
|
marginVertical: 4,
|
||||||
|
color: '#555',
|
||||||
|
},
|
||||||
|
cardAddress: {
|
||||||
|
fontSize: 13,
|
||||||
|
color: '#777',
|
||||||
|
},
|
||||||
|
|
||||||
|
loader: {
|
||||||
|
position: 'absolute',
|
||||||
|
top: '50%',
|
||||||
|
alignSelf: 'center',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
export default MapScreen;
|
||||||
248
src/screens/MapOld.tsx
Normal file
248
src/screens/MapOld.tsx
Normal file
@@ -0,0 +1,248 @@
|
|||||||
|
import React, { useEffect, useRef, useState } from 'react';
|
||||||
|
import {
|
||||||
|
View,
|
||||||
|
StyleSheet,
|
||||||
|
PermissionsAndroid,
|
||||||
|
Platform,
|
||||||
|
Text,
|
||||||
|
TouchableOpacity,
|
||||||
|
FlatList,
|
||||||
|
Image,
|
||||||
|
Dimensions,
|
||||||
|
Animated,
|
||||||
|
} from 'react-native';
|
||||||
|
import MapView from 'react-native-map-clustering';
|
||||||
|
import { Marker, MapType, Region } from 'react-native-maps';
|
||||||
|
import Geolocation from '@react-native-community/geolocation';
|
||||||
|
|
||||||
|
const { width } = Dimensions.get('window');
|
||||||
|
|
||||||
|
/* ---------------- CONSTANTS ---------------- */
|
||||||
|
const DEFAULT_REGION: Region = {
|
||||||
|
latitude: 47.6062,
|
||||||
|
longitude: -122.3321,
|
||||||
|
latitudeDelta: 0.15,
|
||||||
|
longitudeDelta: 0.15,
|
||||||
|
};
|
||||||
|
|
||||||
|
/* ---------------- MOCK DATA ---------------- */
|
||||||
|
const generateProperties = (count = 150) =>
|
||||||
|
Array.from({ length: count }).map((_, i) => ({
|
||||||
|
id: `${i}`,
|
||||||
|
lat: 47.5 + Math.random() * 0.25,
|
||||||
|
lng: -122.45 + Math.random() * 0.3,
|
||||||
|
price: Math.floor(300000 + Math.random() * 4000000),
|
||||||
|
beds: Math.floor(1 + Math.random() * 5),
|
||||||
|
baths: Math.floor(1 + Math.random() * 4),
|
||||||
|
image: `https://picsum.photos/300/200?random=${i}`,
|
||||||
|
}));
|
||||||
|
|
||||||
|
const properties = generateProperties();
|
||||||
|
|
||||||
|
/* ---------------- HELPERS ---------------- */
|
||||||
|
const formatPrice = (value: number) => {
|
||||||
|
if (value >= 1_000_000) return `${(value / 1_000_000).toFixed(1)}M`;
|
||||||
|
if (value >= 1000) return `${Math.round(value / 1000)}K`;
|
||||||
|
return value.toString();
|
||||||
|
};
|
||||||
|
|
||||||
|
/* ---------------- PRICE MARKER ---------------- */
|
||||||
|
const PriceMarker = ({ item, onPress, selected }: any) => {
|
||||||
|
const [tracks, setTracks] = useState(true);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const t = setTimeout(() => setTracks(false), 300);
|
||||||
|
return () => clearTimeout(t);
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Marker
|
||||||
|
coordinate={{ latitude: item.lat, longitude: item.lng }}
|
||||||
|
tracksViewChanges={tracks}
|
||||||
|
onPress={(e) => {
|
||||||
|
e.stopPropagation();
|
||||||
|
onPress(item);
|
||||||
|
}}
|
||||||
|
pinColor={selected ? 'gold' : '#8B0000'}
|
||||||
|
>
|
||||||
|
<View style={[styles.pin, selected && styles.selectedPin]}>
|
||||||
|
<Text style={styles.pinText}>{formatPrice(item.price)}</Text>
|
||||||
|
</View>
|
||||||
|
</Marker>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
/* ---------------- MAIN SCREEN ---------------- */
|
||||||
|
const MapScreen: React.FC = () => {
|
||||||
|
const mapRef = useRef<MapView>(null);
|
||||||
|
const [mapType, setMapType] = useState<MapType>('standard');
|
||||||
|
const [selectedItem, setSelectedItem] = useState<any>(null);
|
||||||
|
const [popupAnim] = useState(new Animated.Value(0));
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
locateUser();
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
Animated.timing(popupAnim, {
|
||||||
|
toValue: selectedItem ? 1 : 0,
|
||||||
|
duration: 300,
|
||||||
|
useNativeDriver: true,
|
||||||
|
}).start();
|
||||||
|
}, [selectedItem]);
|
||||||
|
|
||||||
|
const locateUser = async () => {
|
||||||
|
if (Platform.OS === 'android') {
|
||||||
|
const granted = await PermissionsAndroid.request(
|
||||||
|
PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION
|
||||||
|
);
|
||||||
|
if (granted !== PermissionsAndroid.RESULTS.GRANTED) return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Geolocation.getCurrentPosition((pos) => {
|
||||||
|
const { latitude, longitude } = pos.coords;
|
||||||
|
mapRef.current?.animateToRegion(
|
||||||
|
{
|
||||||
|
latitude,
|
||||||
|
longitude,
|
||||||
|
latitudeDelta: 0.05,
|
||||||
|
longitudeDelta: 0.05,
|
||||||
|
},
|
||||||
|
1000
|
||||||
|
);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const popupTranslateY = popupAnim.interpolate({
|
||||||
|
inputRange: [0, 1],
|
||||||
|
outputRange: [200, 0],
|
||||||
|
});
|
||||||
|
|
||||||
|
return (
|
||||||
|
<View style={styles.container}>
|
||||||
|
<MapView
|
||||||
|
ref={mapRef}
|
||||||
|
style={StyleSheet.absoluteFillObject}
|
||||||
|
initialRegion={DEFAULT_REGION}
|
||||||
|
showsUserLocation
|
||||||
|
animationEnabled
|
||||||
|
clusterPressMaxZoom={16}
|
||||||
|
spiralEnabled={false}
|
||||||
|
mapType={mapType}
|
||||||
|
onRegionChangeComplete={(r) => setMapType(r.latitudeDelta < 0.02 ? 'satellite' : 'standard')}
|
||||||
|
renderCluster={(cluster, onPress) => {
|
||||||
|
const { geometry, properties } = cluster;
|
||||||
|
return (
|
||||||
|
<Marker
|
||||||
|
key={`cluster-${properties.cluster_id}`}
|
||||||
|
coordinate={{
|
||||||
|
latitude: geometry.coordinates[1],
|
||||||
|
longitude: geometry.coordinates[0],
|
||||||
|
}}
|
||||||
|
onPress={onPress}
|
||||||
|
>
|
||||||
|
<View style={styles.clusterBubble}>
|
||||||
|
<Text style={styles.clusterText}>{properties.point_count}</Text>
|
||||||
|
</View>
|
||||||
|
</Marker>
|
||||||
|
);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{properties.map((item) => (
|
||||||
|
<PriceMarker
|
||||||
|
key={item.id}
|
||||||
|
item={item}
|
||||||
|
selected={selectedItem?.id === item.id}
|
||||||
|
onPress={(item) => setSelectedItem(item)}
|
||||||
|
/>
|
||||||
|
))}
|
||||||
|
</MapView>
|
||||||
|
|
||||||
|
{/* -------- HORIZONTAL ZILLOW-STYLE POPUP -------- */}
|
||||||
|
{selectedItem && (
|
||||||
|
<Animated.View
|
||||||
|
style={[
|
||||||
|
styles.popupContainer,
|
||||||
|
{ transform: [{ translateY: popupTranslateY }] },
|
||||||
|
]}
|
||||||
|
>
|
||||||
|
<FlatList
|
||||||
|
horizontal
|
||||||
|
data={[selectedItem]}
|
||||||
|
keyExtractor={(item) => item.id}
|
||||||
|
showsHorizontalScrollIndicator={false}
|
||||||
|
renderItem={({ item }) => (
|
||||||
|
<View style={styles.card}>
|
||||||
|
<Image source={{ uri: item.image }} style={styles.cardImage} />
|
||||||
|
<View style={styles.cardContent}>
|
||||||
|
<Text style={styles.cardPrice}>${formatPrice(item.price)}</Text>
|
||||||
|
<Text style={styles.cardDetails}>
|
||||||
|
{item.beds} Beds • {item.baths} Baths
|
||||||
|
</Text>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
</Animated.View>
|
||||||
|
)}
|
||||||
|
</View>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
/* ---------------- STYLES ---------------- */
|
||||||
|
const styles = StyleSheet.create({
|
||||||
|
container: { flex: 1 },
|
||||||
|
|
||||||
|
pin: {
|
||||||
|
backgroundColor: '#8B0000',
|
||||||
|
paddingHorizontal: 12,
|
||||||
|
paddingVertical: 6,
|
||||||
|
borderRadius: 20,
|
||||||
|
borderWidth: 1,
|
||||||
|
borderColor: '#fff',
|
||||||
|
},
|
||||||
|
selectedPin: { backgroundColor: 'gold', borderColor: '#333' },
|
||||||
|
pinText: { color: '#fff', fontWeight: '600', fontSize: 12 },
|
||||||
|
|
||||||
|
clusterBubble: {
|
||||||
|
backgroundColor: '#8B0000',
|
||||||
|
paddingHorizontal: 16,
|
||||||
|
paddingVertical: 10,
|
||||||
|
borderRadius: 24,
|
||||||
|
borderWidth: 2,
|
||||||
|
borderColor: '#fff',
|
||||||
|
},
|
||||||
|
clusterText: { color: '#fff', fontWeight: 'bold', fontSize: 14 },
|
||||||
|
|
||||||
|
popupContainer: {
|
||||||
|
position: 'absolute',
|
||||||
|
bottom: 20,
|
||||||
|
left: 0,
|
||||||
|
right: 0,
|
||||||
|
},
|
||||||
|
card: {
|
||||||
|
backgroundColor: '#fff',
|
||||||
|
width: width * 0.8,
|
||||||
|
marginHorizontal: 10,
|
||||||
|
borderRadius: 16,
|
||||||
|
overflow: 'hidden',
|
||||||
|
elevation: 5,
|
||||||
|
},
|
||||||
|
cardImage: {
|
||||||
|
width: '100%',
|
||||||
|
height: 140,
|
||||||
|
},
|
||||||
|
cardContent: { padding: 12 },
|
||||||
|
cardPrice: { fontSize: 18, fontWeight: 'bold' },
|
||||||
|
cardDetails: { marginVertical: 4, color: '#666' },
|
||||||
|
cardBtn: {
|
||||||
|
marginTop: 8,
|
||||||
|
backgroundColor: '#8B0000',
|
||||||
|
padding: 10,
|
||||||
|
borderRadius: 8,
|
||||||
|
alignItems: 'center',
|
||||||
|
},
|
||||||
|
cardBtnText: { color: '#fff', fontWeight: '600' },
|
||||||
|
});
|
||||||
|
|
||||||
|
export default MapScreen;
|
||||||
Reference in New Issue
Block a user