commit
bb9ee21915
@ -0,0 +1,14 @@
|
||||
node_modules/
|
||||
.expo/
|
||||
dist/
|
||||
npm-debug.*
|
||||
*.jks
|
||||
*.p8
|
||||
*.p12
|
||||
*.key
|
||||
*.mobileprovision
|
||||
*.orig.*
|
||||
web-build/
|
||||
|
||||
# macOS
|
||||
.DS_Store
|
@ -0,0 +1,38 @@
|
||||
import { StatusBar } from 'expo-status-bar';
|
||||
import { useState, useTransition } from 'react';
|
||||
import { Animated, StyleSheet, Text, View } from 'react-native';
|
||||
import Card from './components/Card';
|
||||
|
||||
// import { cards as cardArray } from './FakeData/data'
|
||||
|
||||
|
||||
export default function App() {
|
||||
|
||||
return (
|
||||
<View>
|
||||
|
||||
</View>
|
||||
|
||||
);
|
||||
}
|
||||
|
||||
const styles = StyleSheet.create({
|
||||
container: {
|
||||
flex: 1,
|
||||
backgroundColor: '#fff',
|
||||
alignItems: 'center',
|
||||
justifyContent: 'center',
|
||||
},
|
||||
card: {
|
||||
borderRadius : 8,
|
||||
shadowRadius : 20,
|
||||
shadowColor : '#'
|
||||
},
|
||||
image: {
|
||||
width: 320,
|
||||
height: 440,
|
||||
borderRadius: 18,
|
||||
resizeMode : "cover",
|
||||
placeholder: "assets/images/loadingPlaceholder.gif"
|
||||
},
|
||||
});
|
@ -0,0 +1,17 @@
|
||||
export const cards = [{
|
||||
name : "blue",
|
||||
sourceUrl : "https://images.unsplash.com/photo-1484589065579-248aad0d8b13?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1359&q=80",
|
||||
index : 3
|
||||
},
|
||||
{
|
||||
name : "red",
|
||||
sourceUrl : "https://images.unsplash.com/photo-1614613535308-eb5fbd3d2c17?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=870&q=80",
|
||||
index : 2
|
||||
},
|
||||
{
|
||||
name : "green",
|
||||
sourceUrl : "https://images.unsplash.com/photo-1584679109597-c656b19974c9?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=580&q=80",
|
||||
index : 1
|
||||
}
|
||||
|
||||
]
|
@ -0,0 +1,33 @@
|
||||
{
|
||||
"expo": {
|
||||
"name": "FLAD",
|
||||
"slug": "FLAD",
|
||||
"version": "1.0.0",
|
||||
"orientation": "portrait",
|
||||
"icon": "./assets/icon.png",
|
||||
"userInterfaceStyle": "light",
|
||||
"splash": {
|
||||
"image": "./assets/splash.png",
|
||||
"resizeMode": "contain",
|
||||
"backgroundColor": "#ffffff"
|
||||
},
|
||||
"updates": {
|
||||
"fallbackToCacheTimeout": 0
|
||||
},
|
||||
"assetBundlePatterns": [
|
||||
"**/*"
|
||||
],
|
||||
"ios": {
|
||||
"supportsTablet": true
|
||||
},
|
||||
"android": {
|
||||
"adaptiveIcon": {
|
||||
"foregroundImage": "./assets/adaptive-icon.png",
|
||||
"backgroundColor": "#FFFFFF"
|
||||
}
|
||||
},
|
||||
"web": {
|
||||
"favicon": "./assets/favicon.png"
|
||||
}
|
||||
}
|
||||
}
|
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 22 KiB |
After Width: | Height: | Size: 46 KiB |
@ -0,0 +1,6 @@
|
||||
module.exports = function(api) {
|
||||
api.cache(true);
|
||||
return {
|
||||
presets: ['babel-preset-expo'],
|
||||
};
|
||||
};
|
@ -0,0 +1,68 @@
|
||||
import { View, Text, Image, Animated ,PanResponder, Dimensions } from 'react-native'
|
||||
import React, { useRef } from 'react'
|
||||
|
||||
|
||||
const {width : wWidht} = Dimensions.get("window");
|
||||
const width = wWidht *0.75;
|
||||
const height = wWidht * (465/264);
|
||||
const borderRadius = 24;
|
||||
|
||||
|
||||
|
||||
interface CardProps {
|
||||
title: string;
|
||||
image: any;
|
||||
onSwipe: (direction: "left" | "right") => void;
|
||||
}
|
||||
|
||||
|
||||
const Card: React.FC<CardProps> = ({ title, image, onSwipe }) => {
|
||||
const pan = useRef(new Animated.ValueXY()).current;
|
||||
const panResponder = useRef(
|
||||
PanResponder.create({
|
||||
onMoveShouldSetPanResponder: (evt, gestureState) => {
|
||||
// Only set the pan responder if the user has moved the card more than a certain threshold
|
||||
if (Math.abs(gestureState.dx) > 10) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
},
|
||||
onPanResponderMove: (evt, gestureState) => {
|
||||
// Update the position of the card as the user swipes it
|
||||
pan.setValue({ x: gestureState.dx, y: 0 });
|
||||
console.log("Card");
|
||||
},
|
||||
onPanResponderRelease: (evt, gestureState) => {
|
||||
// Handle the swipe action based on the swipe direction
|
||||
if (gestureState.dx > 50) {
|
||||
onSwipe("right");
|
||||
} else if (gestureState.dx < -50) {
|
||||
onSwipe("left");
|
||||
} else {
|
||||
// Swiped a small amount, reset the position of the card
|
||||
Animated.spring(pan, {
|
||||
toValue: { x: 0, y: 0 },
|
||||
useNativeDriver: true,
|
||||
}).start();
|
||||
}
|
||||
},
|
||||
})
|
||||
).current;
|
||||
|
||||
return (
|
||||
<View>
|
||||
<Animated.View
|
||||
style={{ transform: [{ translateX: pan.x }] }}
|
||||
{...panResponder.panHandlers}
|
||||
>
|
||||
<Image source={image} style={{ width: 200, height: 200 }} />
|
||||
</Animated.View>
|
||||
</View>
|
||||
);
|
||||
};
|
||||
|
||||
export default Card;
|
||||
|
||||
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,26 @@
|
||||
{
|
||||
"name": "flad",
|
||||
"version": "1.0.0",
|
||||
"main": "node_modules/expo/AppEntry.js",
|
||||
"scripts": {
|
||||
"start": "expo start",
|
||||
"android": "expo start --android",
|
||||
"ios": "expo start --ios",
|
||||
"web": "expo start --web"
|
||||
},
|
||||
"dependencies": {
|
||||
"expo": "~47.0.12",
|
||||
"expo-status-bar": "~1.4.2",
|
||||
"react": "18.1.0",
|
||||
"react-dom": "18.1.0",
|
||||
"react-native": "0.70.5",
|
||||
"react-native-web": "~0.18.9"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.12.9",
|
||||
"@types/react": "~18.0.14",
|
||||
"@types/react-native": "~0.70.6",
|
||||
"typescript": "^4.6.3"
|
||||
},
|
||||
"private": true
|
||||
}
|
@ -0,0 +1,6 @@
|
||||
{
|
||||
"extends": "expo/tsconfig.base",
|
||||
"compilerOptions": {
|
||||
"strict": true
|
||||
}
|
||||
}
|
Loading…
Reference in new issue