@expo/vector-icons#FontAwesome TypeScript Examples
The following examples show how to use
@expo/vector-icons#FontAwesome.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: index.tsx From lets-fork-native with MIT License | 6 votes |
export default function Card(props: Props): React.ReactElement {
const {
loading, restaurant, textOpacity, leftOpacity, rightOpacity,
} = props
return (
<View style={styles.container}>
{ !loading
? <Image style={styles.image} source={{ uri: restaurant.image_url, cache: 'force-cache' }} />
: null}
<View style={styles.overlay}>
<View style={styles.header}>
<Animated.View style={{ opacity: leftOpacity }}>
<MaterialIcons name="favorite" color={colors.red} size={64} />
</Animated.View>
<Animated.View style={{ opacity: rightOpacity }}>
<MaterialIcons name="close" color={colors.red} size={64} />
</Animated.View>
</View>
<View>
<Animated.View style={{ opacity: textOpacity }}>
<Text style={styles.name}>{restaurant.name}</Text>
</Animated.View>
<View style={styles.yelp}>
<Rating rating={restaurant.rating} size="lg" />
<FontAwesome name="yelp" size={32} color={colors.white} />
</View>
</View>
</View>
</View>
)
}
Example #2
Source File: index.tsx From selftrace with MIT License | 6 votes |
Icon = {
Question: (props: Props) => <FontAwesome name="question" size={25} {...props} />,
MapMarker: (props: Props) => <MaterialCommunityIcons name="map-marker" size={25} {...props} />,
Earth: (props: Props) => <MaterialCommunityIcons name="earth" size={25} {...props} />,
Lock: (props: Props) => <Foundation name="lock" size={25} {...props} />,
Form: (props: Props) => <AntDesign name="form" size={23} {...props} />,
Person: (props: Props) => <MaterialIcons name="person" size={25} {...props} />,
MapMarkerMultiple: (props: Props) => (
<MaterialCommunityIcons name="map-marker-multiple" size={23} {...props} />
),
}
Example #3
Source File: index.tsx From tiktok-clone with MIT License | 5 votes |
Me: React.FC = () => {
return (
<Container>
<Header>
<AntDesign
style={{ position: 'absolute', left: 10, top: 10 }}
name="adduser"
size={24}
color="black"
/>
<Title>Matheus Castro</Title>
<MaterialIcons name="arrow-drop-down" size={24} color="black" />
<FontAwesome
style={{ position: 'absolute', right: 13, top: 12 }}
name="ellipsis-v"
size={24}
color="black"
/>
</Header>
<ScrollView>
<Content>
<Avatar source={avatar} />
<Username>@matheuscastroweb</Username>
<Stats>
<StatsColumn>
<StatsNumber>1950</StatsNumber>
<StatsText>Following</StatsText>
</StatsColumn>
<Separator>|</Separator>
<StatsColumn>
<StatsNumber>650</StatsNumber>
<StatsText>Followers</StatsText>
</StatsColumn>
<Separator>|</Separator>
<StatsColumn>
<StatsNumber>950</StatsNumber>
<StatsText>Likes</StatsText>
</StatsColumn>
</Stats>
<ProfileColumn>
<ProfileEdit>
<ProfileText>Edit profile</ProfileText>
</ProfileEdit>
<Bookmark name="bookmark" size={24} color="black" />
</ProfileColumn>
<StatsText>Tap to add bio</StatsText>
</Content>
</ScrollView>
</Container>
);
}
Example #4
Source File: index.tsx From ecoleta with MIT License | 5 votes |
Detail = () => {
const [data, setData] = useState<Data>({} as Data);
const navigation = useNavigation();
const route = useRoute();
const routeParams = route.params as Params;
useEffect(() => {
api.get(`points/${routeParams.point_id}`).then(response => {
setData(response.data);
});
}, []);
function handleNavigateBack() {
navigation.goBack();
}
function handleWhatsapp() {
Linking.openURL(`whatsapp://send?phone=${data.point.whatsapp}&text=Tenho interesse sobre coleta de resíduos.`)
}
function handleComposeMail() {
MailComposer.composeAsync({
subject: 'Interesse na coleta de resíduos',
recipients: [data.point.email],
})
}
if (!data.point) {
return null;
}
return (
<SafeAreaView style={{ flex: 1 }} >
<View style={styles.container}>
<TouchableOpacity onPress={handleNavigateBack}>
<Icon name="arrow-left" size={20} color="#34cb79" />
</TouchableOpacity>
<Image style={styles.pointImage} source={{ uri: data.point.image_url }} />
<Text style={styles.pointName}>{data.point.name}</Text>
<Text style={styles.pointItems}>
{data.items.map(item => item.title).join(',')}
</Text>
<View style={styles.address}>
<Text style={styles.addressTitle}>Endereço</Text>
<Text style={styles.addressContent}>{data.point.city}, {data.point.uf}</Text>
</View>
</View>
<View style={styles.footer}>
<RectButton style={styles.button} onPress={handleWhatsapp}>
<FontAwesome name="whatsapp" size={20} color="#FFF" />
<Text style={styles.buttonText}>WhatsApp</Text>
</RectButton>
<RectButton style={styles.button} onPress={handleComposeMail}>
<Icon name="mail" size={20} color="#FFF" />
<Text style={styles.buttonText}>E-mail</Text>
</RectButton>
</View>
</SafeAreaView>
);
}
Example #5
Source File: index.tsx From ecoleta with MIT License | 5 votes |
Detail = () => {
const [data, setData] = useState<Data>({} as Data);
const navigation = useNavigation();
const route = useRoute();
const routeParams = route.params as Params;
useEffect(() => {
api.get(`/points/${routeParams.point_id}`).then((response) => {
setData(response.data);
});
}, []);
function handleNavigateBack() {
navigation.goBack();
}
function handleWhatsapp() {
Linking.openURL(
`whatsapp://send?phone=${data.point.whatsapp}&text=Tenho interesse em ajudar na coleta de resíduos`
);
}
function handleComposeMail() {
MailComposer.composeAsync({
subject: 'Interesse na coleta de resíduos',
recipients: [data.point.email],
});
}
if (!data.point) {
return null;
}
return (
<SafeAreaView style={{ flex: 1 }}>
<View style={styles.container}>
<TouchableOpacity onPress={handleNavigateBack}>
<Feather name="arrow-left" color="#34CB79" size={24} />
</TouchableOpacity>
<Image
style={styles.pointImage}
source={{
uri: data.point.image_url,
}}
/>
<Text style={styles.pointName}>{data.point.name}</Text>
<Text style={styles.pointItems}>
{data.items.map((item) => item.title).join(', ')}
</Text>
<View style={styles.address}>
<Text style={styles.addressTitle}>Endereço:</Text>
<Text style={styles.addressContent}>
{data.point.city}, {data.point.uf}
</Text>
</View>
</View>
<View style={styles.footer}>
<RectButton style={styles.button} onPress={handleWhatsapp}>
<FontAwesome name="whatsapp" size={20} color="#fff" />
<Text style={styles.buttonText}>Whatsapp</Text>
</RectButton>
<RectButton style={styles.button} onPress={handleComposeMail}>
<Feather name="mail" size={20} color="#fff" />
<Text style={styles.buttonText}>E-mail</Text>
</RectButton>
</View>
</SafeAreaView>
);
}
Example #6
Source File: OrphanageDetails.tsx From nlw-03-omnistack with MIT License | 5 votes |
export default function OrphanageDetails() {
return (
<ScrollView style={styles.container}>
<View style={styles.imagesContainer}>
<ScrollView horizontal pagingEnabled>
<Image style={styles.image} source={{ uri: 'https://fmnova.com.br/images/noticias/safe_image.jpg' }} />
<Image style={styles.image} source={{ uri: 'https://fmnova.com.br/images/noticias/safe_image.jpg' }} />
<Image style={styles.image} source={{ uri: 'https://fmnova.com.br/images/noticias/safe_image.jpg' }} />
</ScrollView>
</View>
<View style={styles.detailsContainer}>
<Text style={styles.title}>Orf. Esperança</Text>
<Text style={styles.description}>Presta assistência a crianças de 06 a 15 anos que se encontre em situação de risco e/ou vulnerabilidade social.</Text>
<View style={styles.mapContainer}>
<MapView
initialRegion={{
latitude: -27.2092052,
longitude: -49.6401092,
latitudeDelta: 0.008,
longitudeDelta: 0.008,
}}
zoomEnabled={false}
pitchEnabled={false}
scrollEnabled={false}
rotateEnabled={false}
style={styles.mapStyle}
>
<Marker
icon={mapMarkerImg}
coordinate={{
latitude: -27.2092052,
longitude: -49.6401092
}}
/>
</MapView>
<View style={styles.routesContainer}>
<Text style={styles.routesText}>Ver rotas no Google Maps</Text>
</View>
</View>
<View style={styles.separator} />
<Text style={styles.title}>Instruções para visita</Text>
<Text style={styles.description}>Venha como se sentir a vontade e traga muito amor e paciência para dar.</Text>
<View style={styles.scheduleContainer}>
<View style={[styles.scheduleItem, styles.scheduleItemBlue]}>
<Feather name="clock" size={40} color="#2AB5D1" />
<Text style={[styles.scheduleText, styles.scheduleTextBlue]}>Segunda à Sexta 8h às 18h</Text>
</View>
<View style={[styles.scheduleItem, styles.scheduleItemGreen]}>
<Feather name="info" size={40} color="#39CC83" />
<Text style={[styles.scheduleText, styles.scheduleTextGreen]}>Atendemos fim de semana</Text>
</View>
</View>
<RectButton style={styles.contactButton} onPress={() => {}}>
<FontAwesome name="whatsapp" size={24} color="#FFF" />
<Text style={styles.contactButtonText}>Entrar em contato</Text>
</RectButton>
</View>
</ScrollView>
)
}
Example #7
Source File: index.tsx From nlw-01-omnistack with MIT License | 5 votes |
Detail = () => {
const [data, setData] = useState<Data>({} as Data);
const navigation = useNavigation();
const route = useRoute();
const routeParams = route.params as Params;
useEffect(() => {
api.get(`points/${routeParams.point_id}`).then(response => {
setData(response.data);
});
}, []);
function handleNavigateBack() {
navigation.goBack();
}
function handleWhatsapp() {
Linking.openURL(`whatsapp://send?phone=${data.point.whatsapp}&text=Tenho interesse sobre coleta de resíduos`);
}
function handleComposeMail() {
MailComposer.composeAsync({
subject: 'Interesse na coleta de resíduos',
recipients: [data.point.email],
})
}
if (!data.point) {
return null;
}
return (
<SafeAreaView style={{ flex: 1 }}>
<View style={styles.container}>
<TouchableOpacity onPress={handleNavigateBack}>
<Icon name="arrow-left" size={20} color="#34cb79" />
</TouchableOpacity>
<Image style={styles.pointImage} source={{ uri: data.point.image_url }} />
<Text style={styles.pointName}>{data.point.name}</Text>
<Text style={styles.pointItems}>
{data.items.map(item => item.title).join(', ')}
</Text>
<View style={styles.address}>
<Text style={styles.addressTitle}>Endereço</Text>
<Text style={styles.addressContent}>{data.point.city}, {data.point.uf}</Text>
</View>
</View>
<View style={styles.footer}>
<RectButton style={styles.button} onPress={handleWhatsapp}>
<FontAwesome name="whatsapp" size={20} color="#FFF" />
<Text style={styles.buttonText}>Whatsapp</Text>
</RectButton>
<RectButton style={styles.button} onPress={handleComposeMail}>
<Icon name="mail" size={20} color="#FFF" />
<Text style={styles.buttonText}>E-mail</Text>
</RectButton>
</View>
</SafeAreaView>
);
}
Example #8
Source File: index.tsx From nlw-ecoleta with MIT License | 5 votes |
Detail = () => {
const [data, setData] = useState<Data>({} as Data);
const navigation = useNavigation();
const route = useRoute();
const routeParams = route.params as Params;
useEffect(() => {
api.get(`points/${routeParams.point_id}`).then(response => {
setData(response.data);
});
}, []);
function handleNavigateBack() {
navigation.goBack();
}
function handleNavigateComposeMail() {
MailComposer.composeAsync({
subject: 'Interesse na coleta de resíduos',
recipients: [data.point.email],
})
}
function handleWhatsapp() {
Linking.openURL(`whatsapp://send?phone${data.point.whatsapp}$textTEnho interesse sobre coleta de resíduos`)
}
if(!data.point) {
return null;
}
return (
<SafeAreaView style={{ flex: 1 }}>
<View style={styles.container}>
<TouchableOpacity onPress={handleNavigateBack}>
<Icon name="arrow-left" size={20} color="#34cb79" />
</TouchableOpacity>
<Image style={styles.pointImage} source={{ uri: data.point.image_url }} />
<Text style={styles.pointName}>{data.point.name}</Text>
<Text style={styles.pointItems}>{data.items.map(item =>item.title).join(', ')}</Text>
<View style={styles.address}>
<Text style={styles.addressTitle}>Endereço</Text>
<Text style={styles.addressContent}>{data.point.city}, {data.point.uf}</Text>
</View>
</View>
<View style={styles.footer}>
<RectButton style={styles.button} onPress={handleWhatsapp}>
<FontAwesome name="whatsapp" size={20} color="#FFF" />
<Text style={styles.buttonText}>Whatsapp</Text>
</RectButton>
<RectButton style={styles.button} onPress={handleNavigateComposeMail}>
<Icon name="mail" size={20} color="#FFF" />
<Text style={styles.buttonText}>E-mail</Text>
</RectButton>
</View>
</SafeAreaView>
);
}
Example #9
Source File: index.tsx From tiktok-clone with MIT License | 5 votes |
Record: React.FC = () => {
const [hasPermission, setHasPermission] = useState<boolean | null>(null);
const [type, setType] = useState(Camera.Constants.Type.back);
const navigation = useNavigation();
useEffect(() => {
async function permission(): Promise<void> {
const { status } = await Camera.requestPermissionsAsync();
setHasPermission(status === 'granted');
StatusBar.setHidden(true);
}
permission();
}, []);
if (hasPermission === null) {
return <View />;
}
if (hasPermission === false) {
return <Text>No access to camera</Text>;
}
return (
<Camera style={{ flex: 1 }} type={type}>
<Container>
<Header>
<Button
onPress={() => {
StatusBar.setHidden(false);
navigation.goBack();
}}
>
<AntDesign name="close" size={28} color="#fff" />
</Button>
<Button>
<Row>
<FontAwesome name="music" size={18} color="#fff" />
<Description>Sons</Description>
</Row>
</Button>
<Button
onPress={() => {
setType(
type === Camera.Constants.Type.back
? Camera.Constants.Type.front
: Camera.Constants.Type.back,
);
}}
>
<MaterialCommunityIcons
name="rotate-right"
size={28}
color="#fff"
/>
</Button>
</Header>
<RecordButton />
</Container>
</Camera>
);
}
Example #10
Source File: index.tsx From NLW-1.0 with MIT License | 5 votes |
Detail: React.FC = () => {
const [data, setData] = useState<Data>({} as Data);
const navigation = useNavigation();
const route = useRoute();
const routeParams = route.params as Params;
useEffect(() => {
async function loadPoint() {
const response = await api.get(`/points/${routeParams.point_id}`);
setData(response.data);
}
loadPoint();
}, []);
function handleNavigateBack() {
navigation.goBack();
}
function handleComposeMail() {
MailComposer.composeAsync({
subject: "Interesse na coleta de resíduos",
recipients: [data.point.email],
});
}
function handleWhatsApp() {
Linking.openURL(
`whatsapp://send?phone=${data.point.whatsapp}&text=Tenho interesse na coleta de resíduos`
);
}
if (!data.point) {
return null;
}
return (
<SafeAreaView style={{ flex: 1 }}>
<View style={styles.container}>
<TouchableOpacity onPress={handleNavigateBack}>
<Icon name="arrow-left" size={20} color="#34cb79" />
</TouchableOpacity>
<Image
style={styles.pointImage}
source={{
uri: data.point.image_url,
}}
/>
<Text style={styles.pointName}>{data.point.name}</Text>
<Text style={styles.pointItems}>
{data.items.map((item) => item.title).join(",")}
</Text>
<View style={styles.address}>
<Text style={styles.addressTitle}>Endereço</Text>
<Text style={styles.addressContent}>
{data.point.city}, {data.point.uf}
</Text>
</View>
</View>
<View style={styles.footer}>
<RectButton style={styles.button} onPress={() => handleWhatsApp()}>
<FontAwesome name="whatsapp" size={20} color="#fff" />
<Text style={styles.buttonText}>Whatsapp</Text>
</RectButton>
<RectButton style={styles.button} onPress={() => handleComposeMail()}>
<Icon name="mail" size={20} color="#fff" />
<Text style={styles.buttonText}>E-mail</Text>
</RectButton>
</View>
</SafeAreaView>
);
}
Example #11
Source File: index.tsx From tiktok-clone with MIT License | 4 votes |
Feed: React.FC<Props> = ({ play, item }) => {
const spinValue = new Animated.Value(0);
Animated.loop(
Animated.timing(spinValue, {
toValue: 1,
duration: 10000,
easing: Easing.linear,
useNativeDriver: true,
}),
).start();
const rotateProp = spinValue.interpolate({
inputRange: [0, 1],
outputRange: ['0deg', '360deg'],
});
return (
<>
<LinearGradient
colors={['rgba(0,0,0,.3)', 'transparent']}
style={{
position: 'absolute',
left: 0,
right: 0,
top: 0,
height: '70%',
}}
/>
<Container>
<Video
source={{ uri: item.uri }}
rate={1.0}
volume={1.0}
isMuted={false}
resizeMode="cover"
shouldPlay={play}
isLooping
style={{
width: '100%',
height: '100%',
}}
/>
</Container>
<Details>
<User>{item.username}</User>
<Tags>{item.tags}</Tags>
<MusicBox>
<FontAwesome name="music" size={15} color="#f5f5f5" />
<Music>{item.music}</Music>
</MusicBox>
</Details>
<Actions>
<BoxAction>
<AntDesign
style={{ alignSelf: 'center' }}
name="heart"
size={35}
color="#fff"
/>
<TextAction>{item.likes}</TextAction>
</BoxAction>
<BoxAction>
<FontAwesome
style={{ alignSelf: 'center' }}
name="commenting"
size={35}
color="#fff"
/>
<TextAction>{item.comments}</TextAction>
</BoxAction>
<BoxAction>
<FontAwesome
style={{ alignSelf: 'center' }}
name="whatsapp"
size={35}
color="#06d755"
/>
<TextAction>Share</TextAction>
</BoxAction>
<BoxAction>
<Animated.View
style={{
borderRadius: 50,
borderWidth: 12,
borderColor: '#292929',
transform: [
{
rotate: play ? rotateProp : 0,
},
],
}}
>
<Image
style={{
width: 35,
height: 35,
borderRadius: 25,
}}
source={{
uri: 'https://avatars3.githubusercontent.com/u/45601574',
}}
/>
</Animated.View>
<Lottie
source={musicFly}
progress={play ? spinValue : 0}
style={{ width: 150, position: 'absolute', bottom: 0, right: 0 }}
/>
</BoxAction>
</Actions>
<LinearGradient
colors={['transparent', 'rgba(0,0,0,.4)']}
style={{
position: 'absolute',
left: 0,
right: 0,
bottom: 0,
height: '50%',
}}
/>
</>
);
}
Example #12
Source File: app.routes.tsx From tiktok-clone with MIT License | 4 votes |
AppRoutes: React.FC = () => {
const [home, setHome] = useState(true);
StatusBar.setBarStyle('dark-content');
if (Platform.OS === 'android') StatusBar.setBackgroundColor('#fff');
if (home) {
StatusBar.setHidden(true);
if (Platform.OS === 'android') {
StatusBar.setBackgroundColor('#fff');
StatusBar.setBarStyle('light-content');
}
} else {
StatusBar.setHidden(false);
}
return (
<Tab.Navigator
shifting={false}
barStyle={{
backgroundColor: home ? '#000' : '#fff',
}}
initialRouteName="Home"
activeColor={home ? '#fff' : '#000'}
>
<Tab.Screen
name="Home"
component={Home}
listeners={{
focus: () => setHome(true),
blur: () => setHome(false),
}}
options={{
tabBarLabel: 'Home',
tabBarIcon: ({ color }) => (
<FontAwesome name="home" size={24} color={color} />
),
}}
/>
<Tab.Screen
name="Discover"
component={Discover}
options={{
tabBarLabel: 'Discover',
tabBarIcon: ({ color }) => (
<AntDesign name="search1" size={24} color={color} />
),
}}
/>
<Tab.Screen
name="Live"
component={Record}
listeners={({ navigation }) => ({
tabPress: e => {
// Prevent default action
e.preventDefault();
// Do something with the `navigation` object
navigation.navigate('Record');
},
})}
options={{
tabBarLabel: '',
tabBarIcon: () => <HomeButtom home={home} />,
}}
/>
<Tab.Screen
name="Inbox"
component={Inbox}
options={{
tabBarLabel: 'Inbox',
tabBarIcon: ({ color }) => (
<MaterialCommunityIcons
name="message-text-outline"
size={24}
color={color}
/>
),
}}
/>
<Tab.Screen
name="Me"
component={Me}
options={{
tabBarLabel: 'Me',
tabBarIcon: ({ color }) => (
<AntDesign name="user" size={24} color={color} />
),
}}
/>
</Tab.Navigator>
);
}
Example #13
Source File: index.tsx From NextLevelWeek with MIT License | 4 votes |
OrphanageDetails: React.FC = () => {
const route = useRoute();
// console.log(route.params);
const [orphanage, setOrphanage] = useState<IOpharnage>();
// Forçando o params a ter o formato da interface
const params = route.params as IRouteParams;
useEffect(() => {
api.get(`/orphanages/${params.id}`).then(res => {
setOrphanage(res.data);
});
}, [params.id]);
// Fazer tela de loading
if (!orphanage) {
return (
<View>
<Text>Carregando...</Text>
</View>
);
}
// Abrindo o endereço no Google Maps
function handleOpenGoogleMapRoutes() {
Linking.openURL(`https://www.google.com/maps/dir/?api=1&destination=${orphanage?.latitude},${orphanage?.longitude}`);
}
return (
<Container>
<ImagesContainer>
<ScrollView horizontal pagingEnabled>
{orphanage.images.map(image => {
return (
<OrphanageImage
key={image.id}
source={{ uri: image.url }}
/>
);
})}
</ScrollView>
</ImagesContainer>
<DetailsContainer>
<Title>{orphanage.name}</Title>
<Description>{orphanage.about}</Description>
<MapContainer>
<Map
initialRegion={{
latitude: orphanage.latitude,
longitude: orphanage.longitude,
latitudeDelta: 0.008,
longitudeDelta: 0.008,
}}
zoomEnabled={false}
pitchEnabled={false}
scrollEnabled={false}
rotateEnabled={false}
>
<Marker
icon={mapMarkerImg}
coordinate={{
latitude: orphanage.latitude,
longitude: orphanage.longitude,
}}
/>
</Map>
<RoutesButtonContainer onPress={handleOpenGoogleMapRoutes}>
<RoutesText>Ver rotas no Google Maps</RoutesText>
</RoutesButtonContainer>
</MapContainer>
<Separator />
<Title>Instruções para visita</Title>
<Description>{orphanage.instructions}</Description>
<ScheduleContainer>
<ScheduleItemClock>
<Feather name="clock" size={40} color="#2AB5D1" />
<ScheduleText>{orphanage.opening_hours}</ScheduleText>
</ScheduleItemClock>
{
orphanage.open_on_weekends ? (
<ScheduleItemInfo>
<Feather name="info" size={40} color="#39cc83" />
<ScheduleText style={{ color: '#37c77f' }}>
Atendemos fim de semana
</ScheduleText>
</ScheduleItemInfo>
) : (
<ScheduleItemInfoRed>
<Feather name="info" size={40} color="#ff669d" />
<ScheduleText style={{ color: '#ff669d' }}>
Não atendemos fim de semana
</ScheduleText>
</ScheduleItemInfoRed>
)
}
</ScheduleContainer>
<ContactButton>
<FontAwesome name="whatsapp" size={24} color="#fff" />
<ContactButtonText>Entrar em contato</ContactButtonText>
</ContactButton>
</DetailsContainer>
</Container>
);
}
Example #14
Source File: index.tsx From NextLevelWeek with MIT License | 4 votes |
Detail: React.FC = () => {
const [data, setData] = useState<Data>({} as Data);
const navigation = useNavigation();
const route = useRoute();
// Hack
const routeParams = route.params as Params;
/**
* Carregando o ponto pelo ID que veio.
*/
useEffect(() => {
api.get(`/points/${routeParams.point_id}`).then((res) => {
setData(res.data);
});
}, []);
/**
* Função para voltar na página anterior.
*/
function handleBackToTheFuture() {
navigation.goBack();
}
/**
* Função do e-mail.
*/
function handleComposeMail() {
MailComposer.composeAsync({
subject: "Interesse na coleta de resíduos.",
recipients: [data.point.email],
});
}
/**
* Enviar mensagem para o WhatsApp
*/
function handleWhatsApp() {
Linking.openURL(
`whatsapp://send?phone=${data.point.whatsapp}&text=Tenho interesse sobre coleta de resíduos.`
);
}
/**
* Se não achar o ponto.
*/
if (!data.point) {
return null;
}
return (
<SafeAreaView style={{ flex: 1 }}>
<View style={styles.container}>
<TouchableOpacity onPress={handleBackToTheFuture}>
<Icon name="arrow-left" size={20} color="#34cb79" />
</TouchableOpacity>
<Image
style={styles.pointImage}
source={{
uri: data.point.image_url,
}}
/>
<Text style={styles.pointName}>{data.point.name}</Text>
<Text style={styles.pointItems}>
{data.items.map((item) => item.title).join(", ")}
</Text>
<View style={styles.address}>
<Text style={styles.addressTitle}>Endereço</Text>
<Text style={styles.addressContent}>
{data.point.city}, {data.point.uf}
</Text>
</View>
</View>
<View style={styles.footer}>
<RectButton style={styles.button} onPress={handleWhatsApp}>
<FontAwesome name="whatsapp" size={20} color="#FFF" />
<Text style={styles.buttonText}>WhatsApp</Text>
</RectButton>
<RectButton style={styles.button} onPress={handleComposeMail}>
<Icon name="mail" size={20} color="#FFF" />
<Text style={styles.buttonText}>E-mail</Text>
</RectButton>
</View>
</SafeAreaView>
);
}
Example #15
Source File: index.tsx From lets-fork-native with MIT License | 4 votes |
export default function Details(props: Props): React.ReactElement {
const headerHeight = useHeaderHeight()
const { restaurant: defaultRestaurant, photos } = props
const [restaurant, setRestaurant] = React.useState(defaultRestaurant)
React.useEffect(() => {
const fetchData = async (): Promise<void> => {
// More details about the restaurant can be fetched from
// the server. This can be triggered off a feature flag in the future.
// For the time being this saves on api requests to yelp.
if (false) { // eslint-disable-line
try {
const rest = await getRestaurant(defaultRestaurant.id)
setRestaurant({
...rest,
...defaultRestaurant,
})
} catch (err) {
console.log(err)
}
} else {
setRestaurant(defaultRestaurant)
}
}
fetchData()
}, [defaultRestaurant])
const imageHeight = env.ADS
? height - headerHeight - 50
: height - headerHeight
const images = [(
<Image
key={restaurant.image_url}
style={{
...styles.image,
height: imageHeight,
}}
source={{ uri: restaurant.image_url, cache: 'force-cache' }}
/>
)]
if (restaurant.photos?.length) {
restaurant.photos.forEach((url) => {
if (url !== restaurant.image_url) {
images.push(
<Image
key={url}
style={{
...styles.image,
height: imageHeight,
}}
source={{ uri: url, cache: 'force-cache' }}
/>,
)
}
})
}
return (
<View
style={{
...styles.container,
minHeight: (height - headerHeight) * 0.8,
}}
>
{
photos ? (
<ScrollView
horizontal
alwaysBounceHorizontal={false}
showsHorizontalScrollIndicator
scrollEventThrottle={10}
pagingEnabled
onScroll={
Animated.event(
[{ nativeEvent: { contentOffset: { x: new Animated.Value(0) } } }],
{ useNativeDriver: true },
)
}
>
{images}
</ScrollView>
) : null
}
<View>
<Text style={[styles.text, styles.name]}>{restaurant.name}</Text>
<View style={styles.rating}>
<Rating rating={restaurant.rating} size="sm" />
<Text style={styles.text}>{`• ${restaurant.review_count} reviews`}</Text>
</View>
<Text
style={styles.text}
>
{
restaurant.price
? `${restaurant.price} • ${restaurant?.categories?.map((c) => c.title).join(', ')}`
: restaurant?.categories?.map((c) => c.title).join(', ')
}
</Text>
{ restaurant?.transactions?.length
? (
<Text style={styles.text}>
{restaurant.transactions.map((tran) => `${tran[0].toUpperCase()}${tran.replace('_', ' ').substring(1)}`).join(' • ')}
</Text>
) : null}
</View>
<View style={styles.section}>
<TouchableOpacity onPress={(): void => call(restaurant.display_phone)}>
<MaterialIcons name="phone" size={32} />
</TouchableOpacity>
<TouchableOpacity onPress={(): Promise<any> => Linking.openURL(restaurant.url)}>
<FontAwesome name="yelp" size={32} color={colors.yelpRed} />
</TouchableOpacity>
</View>
{
restaurant?.coordinates?.latitude && restaurant?.coordinates?.longitude
? (
<View style={styles.mapContainer}>
<MapView
region={{
latitude: restaurant.coordinates.latitude,
longitude: restaurant.coordinates.longitude,
latitudeDelta: 0.005,
longitudeDelta: 0.05,
}}
style={styles.map}
rotateEnabled={false}
scrollEnabled={false}
zoomEnabled={false}
>
<Marker
coordinate={{
latitude: restaurant.coordinates.latitude,
longitude: restaurant.coordinates.longitude,
}}
title={restaurant.name}
/>
</MapView>
</View>
) : null
}
<TouchableOpacity
style={styles.section}
onPress={(): void => {
const url = Platform.select({
ios: `maps:0,0?q=${restaurant.coordinates.latitude},${restaurant.coordinates.longitude}`,
android: `geo:0,0?q=${restaurant.coordinates.latitude},${restaurant.coordinates.longitude}`,
})
if (url) {
Linking.openURL(url)
}
}}
>
<Text style={styles.directionText}>Get Directions</Text>
<MaterialIcons name="directions" size={32} />
</TouchableOpacity>
{
restaurant.hours
? <Hours hours={restaurant.hours} />
: null
}
</View>
)
}
Example #16
Source File: SwiperScreen.tsx From vsinder with Apache License 2.0 | 4 votes |
SwiperScreen: React.FC<MainTabNav<"swiper">> = ({
navigation,
}) => {
const viewMap = useRef<Record<string, "loading" | "done">>({});
const [mutate] = useMutation(defaultMutationFn);
const [report] = useMutation(defaultMutationFn);
const swiper = useRef<CardStack>(null);
const { buttonForeground } = useTheme();
const [outOfProfiles, setOutOfProfiles] = useState(false);
const fetchCount = useRef(0);
const { isLoading, isFetching, data, refetch } = useQuery<FeedResponse>(
"/feed",
defaultQueryFn
);
const view = async (i: number, liked: boolean) => {
const id = data?.profiles[i]?.id;
if (!id || id in viewMap.current) {
return;
}
viewMap.current[id] = "loading";
try {
await mutate([`/view`, { liked, userId: id }, "POST"]);
} catch {}
viewMap.current[id] = "done";
if (i >= data!.profiles.length - 1) {
for (let i = 0; i < 50; i++) {
if (Object.values(viewMap.current).some((x) => x === "loading")) {
await sleep(100);
} else {
break;
}
}
refetch({ throwOnError: true })
.then((x) => {
viewMap.current = {};
fetchCount.current++;
if (!x?.profiles) {
setOutOfProfiles(true);
}
})
.catch(() => {});
}
};
const navRef = useRef(navigation);
navRef.current = navigation;
useEffect(() => {
// This listener is fired whenever a user taps on or interacts with a notification (works when app is foregrounded, backgrounded, or killed)
const sub = Notifications.addNotificationResponseReceivedListener(() => {
navRef.current.navigate("matches");
});
return () => {
Notifications.removeNotificationSubscription(sub);
};
}, []);
if (
isLoading ||
isFetching ||
(data && !data.profiles.length && !outOfProfiles && fetchCount.current > 0)
) {
return <FullscreenLoading />;
}
if (!data?.profiles.length) {
return (
<FullscreenMessage message="There are no more profiles, try changing your criteria or come back later" />
);
}
return (
<ScreenWrapper>
<CardStack
ref={swiper}
renderNoMoreCards={() => null}
disableTopSwipe={true}
disableBottomSwipe={true}
onSwipedRight={(i) => {
view(i, true);
}}
onSwipedLeft={(i) => {
view(i, false);
}}
>
{data.profiles.map((x) => (
<Card key={x.id}>
<CodeCard
onReport={(message) => {
report([
"/report",
{ message, unmatchOrReject: "reject", userId: x.id },
"POST",
]).then(() => {
viewMap.current[x.id] = "done";
swiper.current?.swipeLeft();
});
}}
profile={x}
/>
</Card>
))}
</CardStack>
<View
style={{
marginTop: codeImageHeight + 40,
flexDirection: "row",
justifyContent: "center",
}}
>
<View
style={{
flexDirection: "row",
}}
>
<IconButton onPress={() => swiper.current?.swipeLeft()} size={60}>
<AntDesign name="close" size={30} color={buttonForeground} />
</IconButton>
<View style={{ width: 50 }} />
<IconButton onPress={() => swiper.current?.swipeRight()} size={60}>
<FontAwesome
style={{ marginTop: 2 }}
name="heart"
size={30}
color={buttonForeground}
/>
</IconButton>
</View>
</View>
</ScreenWrapper>
);
}
Example #17
Source File: index.tsx From ecoleta with MIT License | 4 votes |
Home: React.FC = () => {
const { title, colors } = useContext(ThemeContext);
const { toggleTheme } = useTheme();
const [ufs, setUfs] = useState<string[]>([]);
const [cities, setCities] = useState<string[]>([]);
const [selectedUf, setSelectedUf] = useState('0');
const [selectedCity, setSelectedCity] = useState('0');
const navigation = useNavigation();
const pickerSelectStyles = {
inputAndroid: {
height: 60,
backgroundColor: colors.cardBackground,
borderRadius: 10,
marginBottom: 8,
paddingHorizontal: 24,
fontSize: 16,
color: colors.text,
},
inputIOS: {
height: 60,
backgroundColor: colors.cardBackground,
borderRadius: 10,
marginBottom: 8,
paddingHorizontal: 24,
fontSize: 16,
color: colors.text,
},
placeholder: { color: colors.placeholder },
};
useEffect(() => {
if (selectedUf === '0') return;
axios
.get<IIBGECityResponse[]>(
`https://servicodados.ibge.gov.br/api/v1/localidades/estados/${selectedUf}/municipios`,
)
.then(response => {
const cityNames = response.data.map(city => city.nome);
setCities(cityNames);
});
}, [selectedUf]);
useEffect(() => {
axios
.get<IIBGEResponse[]>(
'https://servicodados.ibge.gov.br/api/v1/localidades/estados',
)
.then(response => {
const ufInitials = response.data.map(uf => uf.sigla);
setUfs(ufInitials);
});
}, []);
return (
<KeyboardAvoidingView
style={{ flex: 1 }}
behavior={Platform.OS === 'ios' ? 'padding' : undefined}
>
<Container
imageStyle={{
width: 274,
height: 368,
tintColor: title === 'light' ? 'green' : '#f5f5f5',
opacity: 0.2,
}}
// eslint-disable-next-line global-require
source={require('../../assets/home-background.png')}
>
<Main>
<Logo>
<FontAwesome name="recycle" size={50} color="#34cb79" />
<LogoTitle>Ecoleta</LogoTitle>
</Logo>
<ToggleThemeButton onPress={toggleTheme}>
<ThemeIcon name={title === 'light' ? 'sun' : 'moon'} />
</ToggleThemeButton>
<View>
<Title>Seu marketplace de coleta de resíduos</Title>
<Description>
Ajudamos pessoas a encontrarem pontos de coleta de forma
eficiente.
</Description>
</View>
</Main>
<Footer>
<RNPickerSelect
placeholder={{
color: colors.placeholder,
label: 'Selecione a UF',
}}
value={selectedUf}
style={pickerSelectStyles}
useNativeAndroidPickerStyle={false}
onValueChange={setSelectedUf}
items={ufs?.map(uf => ({
label: uf,
value: uf,
}))}
/>
<RNPickerSelect
placeholder={{
label: 'Selecione a Cidade',
}}
value={selectedCity}
style={pickerSelectStyles}
useNativeAndroidPickerStyle={false}
onValueChange={setSelectedCity}
items={cities?.map(city => ({
label: city,
value: city,
}))}
/>
<Button
onPress={() =>
navigation.navigate('Points', {
uf: selectedUf,
city: selectedCity,
})}
>
<IconView>
<Icon name="arrow-right" color="#fff" size={24} />
</IconView>
<ButtonText>Entrar</ButtonText>
</Button>
</Footer>
</Container>
</KeyboardAvoidingView>
);
}
Example #18
Source File: index.tsx From ecoleta with MIT License | 4 votes |
Detail: React.FC = () => {
const [data, setData] = useState<IData>({} as IData);
const navigation = useNavigation();
const route = useRoute();
const { point_id } = route.params as IParams;
useEffect(() => {
api.get<IData>(`points/${point_id}`).then(response => {
setData(response.data);
});
}, [point_id]);
const handleWhatsapp = useCallback(() => {
if (data?.point?.whatsapp) {
Linking.openURL(
`whatsapp://send?phone=${data.point.whatsapp}&text="Tenho interesse sobre a coleta de resíduos"`,
);
}
}, [data]);
const handleComposeMail = useCallback(() => {
if (data.point.email) {
MailComposer.composeAsync({
subject: `Interesse na coleta de resíduos`,
recipients: [data.point.email],
});
}
}, [data]);
if (!data.point)
return (
<ActivityIndicator
color="#333"
style={{
flex: 1,
backgroundColor: '#fff',
justifyContent: 'center',
alignItems: 'center',
}}
/>
);
return (
<S.StyledSafeAreaView style={{ flex: 1 }}>
<S.Container>
<TouchableOpacity onPress={() => navigation.goBack()}>
<Icon name="arrow-left" size={20} color="#34cb79" />
</TouchableOpacity>
<S.PointImage
source={{
uri: data.point.image_url,
}}
/>
<S.PointName>{data.point.name}</S.PointName>
<S.PointItems>
{data.items.map(item => item.title).join(', ')}
</S.PointItems>
<S.Address>
<S.AddressTitle>Endereço</S.AddressTitle>
<S.AddressContent>
{data.point.city}, {data.point.uf}
</S.AddressContent>
</S.Address>
</S.Container>
<S.Footer>
<S.Button onPress={handleWhatsapp}>
<FontAwesome name="whatsapp" size={20} color="#fff" />
<S.ButtonText>Whatsapp</S.ButtonText>
</S.Button>
<S.Button onPress={handleComposeMail}>
<Icon name="mail" size={20} color="#fff" />
<S.ButtonText>E-mail</S.ButtonText>
</S.Button>
</S.Footer>
</S.StyledSafeAreaView>
);
}
Example #19
Source File: index.tsx From SpotifyClone with MIT License | 4 votes |
PlayerWidget = () => {
const [song, setSong] = useState(null);
const [sound, setSound] = useState<Sound|null>(null);
const [isPlaying, setIsPlaying] = useState<boolean>(true);
const [duration, setDuration] = useState<number|null>(null);
const [position, setPosition] = useState<number|null>(null);
const { songId } = useContext(AppContext);
useEffect(() => {
const fetchSong = async () => {
try {
const data = await API.graphql(graphqlOperation(getSong, { id: songId }))
setSong(data.data.getSong);
} catch (e) {
console.log(e);
}
}
fetchSong();
}, [songId])
const onPlaybackStatusUpdate = (status) => {
setIsPlaying(status.isPlaying);
setDuration(status.durationMillis);
setPosition(status.positionMillis);
}
const playCurrentSong = async () => {
if (sound) {
await sound.unloadAsync();
}
const { sound: newSound } = await Sound.createAsync(
{ uri: song.uri },
{ shouldPlay: isPlaying },
onPlaybackStatusUpdate
)
setSound(newSound)
}
useEffect(() => {
if (song) {
playCurrentSong();
}
}, [song])
const onPlayPausePress = async () => {
if (!sound) {
return;
}
if (isPlaying) {
await sound.stopAsync();
} else {
await sound.playAsync();
}
}
const getProgress = () => {
if (sound === null || duration === null || position === null) {
return 0;
}
return (position / duration) * 100;
}
if (!song) {
return null;
}
return (
<View style={styles.container}>
<View style={[styles.progress, { width: `${getProgress()}%`}]} />
<View style={styles.row}>
<Image source={{ uri: song.imageUri }} style={styles.image} />
<View style={styles.rightContainer}>
<View style={styles.nameContainer}>
<Text style={styles.title}>{song.title}</Text>
<Text style={styles.artist}>{song.artist}</Text>
</View>
<View style={styles.iconsContainer}>
<AntDesign name="hearto" size={30} color={"white"}/>
<TouchableOpacity onPress={onPlayPausePress}>
<FontAwesome name={isPlaying ? 'pause' : 'play'} size={30} color={"white"}/>
</TouchableOpacity>
</View>
</View>
</View>
</View>
)
}