diff --git a/App.tsx b/App.tsx index baae682..68b8015 100644 --- a/App.tsx +++ b/App.tsx @@ -15,6 +15,8 @@ import TabOneScreen from './screens/TabOneScreen'; import TabTwoScreen from './screens/TabTwoScreen'; import ProductDetail from './screens/ProductDetail'; import CartDetail from './screens/Cart'; +import ArticleHome from './screens/ArticleHome'; +import ArticleList from './screens/ArticleList'; export default function App() { const isLoadingComplete = useCachedResources(); @@ -104,6 +106,30 @@ const CartPage = ({ navigation }: { navigation: any }) => { ); } +const ArticleHomePage = ({ navigation }: { navigation: any }) => { + return ( + + + + ); +} + +const ArticleListPage = ({ navigation }: { navigation: any }) => { + return ( + + + + ); +} + const MainContentRouter = () => { return ( @@ -111,6 +137,8 @@ const MainContentRouter = () => { + + ); } diff --git a/components/article/ArticleItem.tsx b/components/article/ArticleItem.tsx new file mode 100644 index 0000000..aa019f5 --- /dev/null +++ b/components/article/ArticleItem.tsx @@ -0,0 +1,86 @@ +import 'react-native-gesture-handler'; +import * as React from 'react'; +import { useState } from 'react'; +import { Alert, Button, Image, StyleSheet, Dimensions, SafeAreaView, ScrollView, TouchableOpacity } from 'react-native'; +import { Text, View, } from '../Themed'; +import { TextInput } from 'react-native-gesture-handler'; +import { Ionicons, FontAwesome } from '@expo/vector-icons'; +import { createDrawerNavigator, DrawerItemList, DrawerItem, DrawerContentScrollView } from '@react-navigation/drawer'; +import { NavigationContainer } from '@react-navigation/native'; +import { createStackNavigator } from '@react-navigation/stack'; +import Animated, { Easing } from 'react-native-reanimated'; + +const winWidth = Dimensions.get('window').width; //full width +const winHeight = Dimensions.get('window').height; //full height +const winWidthP10 = winWidth - 20; +const halfWinWidth = winWidth / 2; +const ratio = winWidthP10 / 850; //541 is actual image width + +const ArticleItem = (props: {id: number, title: string, image: string, category: string, visit: number, comment: number, createDate: string, summary: string, styleTitle: object}) => { + const {id, title, image, category, visit, comment, createDate, summary, styleTitle} = props; + return ( + + + + {title} + + {createDate} + + + {comment} + + + + {visit} + + + + + ) +} + +export { ArticleItem }; + +const styles = StyleSheet.create({ + articleItem: { + width: '100%', + marginBottom: 20, + }, + articleItemImg: { + width: '100%', + height: ratio * 450, + marginBottom: 10, + }, + articleItemInfo: { + width: '100%', + }, + articleItemName: { + width: '100%', + fontSize: 14, + fontWeight: 'bold', + color: '#222222', + marginBottom: 8, + }, + articleItemTimeView: { + flexDirection: 'row', + }, + articleItemTime: { + fontSize: 13, + color: '#888', + alignItems: 'center' + }, + articleItemView: { + flexDirection: 'row', + marginLeft: 10, + alignItems: 'center' + }, + articleItemIcon: { + fontSize: 11, + color: '#2e9fff', + marginRight: 2, + }, + articleItemViewText: { + fontSize: 13, + color: '#888' + }, +}) \ No newline at end of file diff --git a/screens/ArticleHome.tsx b/screens/ArticleHome.tsx new file mode 100644 index 0000000..711da12 --- /dev/null +++ b/screens/ArticleHome.tsx @@ -0,0 +1,556 @@ +import 'react-native-gesture-handler'; +import * as React from 'react'; +import { useState } from 'react'; +import { Alert, Button, Image, StyleSheet, Dimensions, SafeAreaView, ScrollView, TouchableOpacity, Modal, Pressable, Share } from 'react-native'; +import Constants from 'expo-constants'; +import { Ionicons, FontAwesome } from '@expo/vector-icons'; +import { LinearGradient } from 'expo-linear-gradient'; +import { PolicyFooter, Social, ShowroomList, FooterInfo } from '../components/footer/footerMain'; + +import EditScreenInfo from '../components/EditScreenInfo'; +import { Text, View, } from '../components/Themed'; +import useColorScheme from '../hooks/useColorScheme'; +import { TextInput } from 'react-native-gesture-handler'; +import { RadioButton, Checkbox } from 'react-native-paper'; +import { Picker } from '@react-native-picker/picker'; +import { ArticleItem } from '../components/article/ArticleItem'; + +export default function ArticleHome() { + return ( + + + + Trang chủ + + Tin tức + + + + + + + + + + + + + + + + + + + + ) +} + +const dataArticle = [ + { + id: 1, + title: 'Chương trình Khuyến mãi “Play-with Power by MSI”', + image: 'https://hanoicomputercdn.com/media/news/454_cpu_ch__i_game.jpg', + category: 'Review sản phẩm', + visit: 10, + comment: 40, + createDate: '12-03-2021, 5:30 pm', + summary: 'Khi chọn mua cho mình một chiếc laptop để đồng hành mình trong công việc, học lập và giải trí phải chăng chúng ta chỉ quan tâm đến cầu hình', + }, + { + id: 2, + title: 'Tự bẻ khóa tính năng hạn chế khai thác tiền ảo của RTX 3060, Nvidia đang \'tiếp tay\' cho dân đào coin?', + image: 'https://hanoicomputercdn.com/media/news/454_cpu_ch__i_game.jpg', + category: 'Review sản phẩm', + visit: 10, + comment: 40, + createDate: '13-03-2021, 8:30 pm', + summary: 'Khi chọn mua cho mình một chiếc laptop để đồng hành mình trong công việc, học lập và giải trí phải chăng chúng ta chỉ quan tâm đến cầu hình', + }, + { + id: 3, + title: '3 CPU “thần thánh” sẽ cứu rỗi game thủ', + image: 'https://hanoicomputercdn.com/media/news/454_cpu_ch__i_game.jpg', + category: 'Review sản phẩm', + visit: 10, + comment: 40, + createDate: '13-03-2021, 5:30 am', + summary: 'Khi chọn mua cho mình một chiếc laptop để đồng hành mình trong công việc, học lập và giải trí phải chăng chúng ta chỉ quan tâm đến cầu hình', + }, + { + id: 4, + title: 'Chương trình Khuyến mãi “Quà Cực Sốc Khi Dựng Cấu Hình PC Lắp Ráp”', + image: 'https://hanoicomputercdn.com/media/news/454_cpu_ch__i_game.jpg', + category: 'Review sản phẩm', + visit: 10, + comment: 40, + createDate: '22-03-2021, 5:30 pm', + summary: 'Khi chọn mua cho mình một chiếc laptop để đồng hành mình trong công việc, học lập và giải trí phải chăng chúng ta chỉ quan tâm đến cầu hình', + }, +] + +const ArticleHomeNewFirstBlock = () => { + const dataArticleHome = dataArticle; + return ( + + + { + dataArticleHome.map((item, index) => { + if (index == 0) { + return ( + + + + {item.category} + {item.title} + + + ) + } else if (index > 0 && index < 5) { + return ( + + + + {item.title} + {item.createDate} + + + ) + } + }) + } + + + ) +} + +const ArticleNewHome = () => { + const dataArticleNew = dataArticle; + return ( + + + Bài viết mới nhất + + + + { + dataArticleNew.map(item => + + + + {item.title} + + {item.createDate} + + + {item.comment} + + + + {item.visit} + + + + + + + + {item.summary} + + ) + } + + + ) +} + +const ArticleHot = () => { + const dataArticleNew = dataArticle; + let counter = 1; + return ( + + + Bài viết nổi bật + + + + { + dataArticleNew.map((item, index) => { + if (index == 0) { + return ( + + + + 01 + + {item.title} + + + Chia sẻ + + + + + ) + } else if (index > 0 && index < 4) { + { counter++ } + return ( + + + 0{counter} + + {item.title} + + + Chia sẻ + + + + + ) + } + } + ) + } + + + ) +} + +const ArticleListHome = () => { + const listArticleCat = [ + 'Review sản phẩm', + 'Tin game', + 'Tin khuyến mãi', + 'Sự kiện' + ]; + const dataArtileList = dataArticle; + const styleTitle = { + fontSize: 14, + } + return ( + + { + listArticleCat.map((item, index) => + + + {item} + + + + { + dataArtileList.map(item => ) + } + + + + + Xem thêm + + + + + ) + } + + + ) +} + +const winWidth = Dimensions.get('window').width; //full width +const winHeight = Dimensions.get('window').height; //full height +const winWidthP10 = winWidth - 20; +const halfWinWidth = winWidth / 2; +const ratio = winWidthP10 / 850; //541 is actual image width + + +const styles = StyleSheet.create({ + container: { + flex: 1, + alignItems: 'center', + justifyContent: 'center', + backgroundColor: '#fff', + }, + brecrumb: { + display: 'flex', + width: winWidth, + paddingLeft: 10, + paddingRight: 10, + flexDirection: 'row', + height: 18, + alignItems: 'center', + marginTop: 10, + marginBottom: 10, + }, + brecrumbText: { + fontSize: 13, + color: '#222', + }, + brecrumbTextLast: { + fontSize: 13, + color: '#b7b7b7', + }, + brecrumbIcon: { + fontSize: 13, + color: '#222', + marginLeft: 6, + marginRight: 6 + }, + boxArticleHomeNew: { + paddingHorizontal: 10, + width: winWidth, + marginBottom: 10, + }, + boxArticleHomeNewFirst: { + marginBottom: 20, + position: 'relative', + }, + boxArticleHomeNewFirstImg: { + width: '100%', + height: 450 * ratio, + }, + boxArticleHomeNewFirstInfo: { + padding: 10, + position: 'absolute', + left: 0, + bottom: 0, + backgroundColor: 'rgba(0,0,0,0.3)', + width: '100%', + }, + boxArticleHomeNewFirstInfoCat: { + backgroundColor: '#ce0707', + width: 150, + maxWidth: '100%', + textAlign: 'center', + color: '#fff', + textTransform: 'uppercase', + paddingVertical: 5, + overflow: 'hidden', + marginBottom: 8, + }, + boxArticleHomeNewFirstInfoName: { + width: '100%', + fontSize: 30, + fontWeight: 'bold', + color: '#fff', + }, + boxArticleHomeNewList: { + flexDirection: 'column', + }, + boxArticleHomeNewListItem: { + width: '100%', + marginBottom: 10, + }, + boxArticleHomeNewListImg: { + width: '100%', + height: 450 * ratio, + }, + boxArticleHomeNewListItemInfo: {}, + boxArticleHomeNewListItemInfoName: { + marginVertical: 7, + width: '100%', + fontSize: 14, + fontWeight: 'bold', + color: '#222222' + }, + boxArticleHomeNewListItemInfoTime: { + fontSize: 13, + color: '#888888' + }, + boxArticleNewHome: { + width: winWidth, + paddingHorizontal: 10, + }, + boxArticleNewHomeTitle: { + paddingVertical: 10, + marginBottom: 10, + borderBottomWidth: 1, + borderBottomColor: '#e1e1e1', + }, + boxArticleNewHomeTitleText: { + fontSize: 16, + fontWeight: 'bold', + color: '#ce0707', + textTransform: 'uppercase', + }, + boxArticleNewHomeTitleLine: { + width: 100, + height: 1, + backgroundColor: '#ce0707', + position: 'absolute', + bottom: -1, + left: 0, + }, + boxArticleNewHomeList: { + flexDirection: 'column', + width: '100%' + }, + boxArticleNewHomeItem: { + marginBottom: 20, + width: '100%', + flexDirection: 'column', + }, + boxArticleNewHomeItemcontent: { + width: '100%', + marginBottom: 10, + flexDirection: 'row' + }, + boxArticleNewHomeItemInfo: { + width: '65%', + paddingRight: 10, + }, + boxArticleNewHomeItemName: { + width: '100%', + fontSize: 14, + fontWeight: 'bold', + color: '#222222', + marginBottom: 8, + }, + boxArticleNewHomeItemTimeView: { + flexDirection: 'row', + }, + boxArticleNewHomeItemTime: { + fontSize: 13, + color: '#888', + alignItems: 'center' + }, + boxArticleNewHomeItemView: { + flexDirection: 'row', + marginLeft: 10, + alignItems: 'center' + }, + boxArticleNewHomeItemIcon: { + fontSize: 11, + color: '#2e9fff', + marginRight: 2, + }, + boxArticleNewHomeItemViewText: { + fontSize: 13, + color: '#888' + }, + boxArticleNewHomeItemImageCt: { + width: '35%', + paddingTop: '35%', + position: 'relative', + overflow: 'hidden', + }, + boxArticleNewHomeItemImage: { + width: '100%', + position: 'absolute', + top: 0, + left: 0, + right: 0, + bottom: 0, + }, + boxArticleNewHomeItemSummary: {}, + boxArticleHomeHot: { + width: winWidth, + paddingHorizontal: 10, + }, + articleHotFirst: { + marginBottom: 20, + paddingBottom: 10, + borderBottomColor: '#e1e1e1', + borderBottomWidth: 1, + }, + articleHotFirstImg: { + width: '100%', + height: ratio * 450, + marginBottom: 10, + }, + articleHotFirstInfo: { + flexDirection: 'row', + alignItems: 'center' + }, + articleHotFirstInfoNum: { + width: 75, + paddingRight: 10, + fontSize: 50, + fontWeight: 'bold', + color: '#cacaca', + fontStyle: 'italic', + }, + articleHotFirstInfoContent: { + width: winWidth - 95, + paddingLeft: 10, + borderLeftWidth: 1, + borderLeftColor: '#e1e1e1' + }, + articleHotName: { + fontSize: 14, + fontWeight: 'bold', + color: '#222', + marginBottom: 10, + }, + articleHotSahre: { + flexDirection: 'row', + alignItems: 'center' + }, + articleHotSahreIcon: { + color: '#45629f', + marginRight: 3, + }, + articleHotSahreText: { + color: '#999' + }, + articleHotItem: { + marginBottom: 20, + }, + articleHotInfo: { + flexDirection: 'row', + alignItems: 'center' + }, + articleHotNum: { + width: 40, + height: 40, + marginRight: 10, + fontSize: 16, + fontWeight: 'bold', + color: '#222', + fontStyle: 'italic', + backgroundColor: '#f0eded', + textAlign: 'center', + lineHeight: 40, + borderRadius: 20, + overflow: 'hidden', + }, + articleHotInfoContent: { + width: winWidth - 70, + paddingLeft: 10, + }, + boxArticleHomeList: { + width: winWidth, + paddingHorizontal: 10, + marginBottom: 20, + }, + boxArticleHomeListVm: { + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + marginBottom: 20, + }, + boxArticleHomeListVmLineL: { + width: halfWinWidth - 85, + height: 1, + backgroundColor: '#e1e1e1' + }, + boxArticleHomeListVmLineR: { + width: halfWinWidth - 85, + height: 1, + backgroundColor: '#e1e1e1' + }, + boxArticleHomeListVmBt: { + width: 115, + height: 34, + borderRadius: 3, + borderWidth: 1, + borderColor: '#e1e1e1', + flexDirection: 'row', + justifyContent: 'center', + alignItems: 'center', + }, + boxArticleHomeListVmText: { + color: '#888' + }, +}) \ No newline at end of file diff --git a/screens/ArticleList.tsx b/screens/ArticleList.tsx new file mode 100644 index 0000000..51bfd93 --- /dev/null +++ b/screens/ArticleList.tsx @@ -0,0 +1,164 @@ +import 'react-native-gesture-handler'; +import * as React from 'react'; +import { useState } from 'react'; +import { Alert, Button, Image, StyleSheet, Dimensions, SafeAreaView, ScrollView, TouchableOpacity, Modal, Pressable, Share } from 'react-native'; +import Constants from 'expo-constants'; +import { Ionicons, FontAwesome } from '@expo/vector-icons'; +import { LinearGradient } from 'expo-linear-gradient'; +import { PolicyFooter, Social, ShowroomList, FooterInfo } from '../components/footer/footerMain'; + +import EditScreenInfo from '../components/EditScreenInfo'; +import { Text, View, } from '../components/Themed'; +import useColorScheme from '../hooks/useColorScheme'; +import { TextInput } from 'react-native-gesture-handler'; +import { RadioButton, Checkbox } from 'react-native-paper'; +import { Picker } from '@react-native-picker/picker'; +import { ArticleItem } from '../components/article/ArticleItem'; + +export default function ArticleList() { + return ( + + + + Trang chủ + + Tin tức + + + + + + + + + + + + + + ) +} + +const winWidth = Dimensions.get('window').width; //full width +const winHeight = Dimensions.get('window').height; //full height +const winWidthP10 = winWidth - 20; +const halfWinWidth = winWidth / 2; +const ratio = winWidthP10 / 850; //541 is actual image width + +const dataArticle = [ + { + id: 1, + title: 'Chương trình Khuyến mãi “Play-with Power by MSI”', + image: 'https://hanoicomputercdn.com/media/news/454_cpu_ch__i_game.jpg', + category: 'Review sản phẩm', + visit: 10, + comment: 40, + createDate: '12-03-2021, 5:30 pm', + summary: 'Khi chọn mua cho mình một chiếc laptop để đồng hành mình trong công việc, học lập và giải trí phải chăng chúng ta chỉ quan tâm đến cầu hình', + }, + { + id: 2, + title: 'Tự bẻ khóa tính năng hạn chế khai thác tiền ảo của RTX 3060, Nvidia đang \'tiếp tay\' cho dân đào coin?', + image: 'https://hanoicomputercdn.com/media/news/454_cpu_ch__i_game.jpg', + category: 'Review sản phẩm', + visit: 10, + comment: 40, + createDate: '13-03-2021, 8:30 pm', + summary: 'Khi chọn mua cho mình một chiếc laptop để đồng hành mình trong công việc, học lập và giải trí phải chăng chúng ta chỉ quan tâm đến cầu hình', + }, + { + id: 3, + title: '3 CPU “thần thánh” sẽ cứu rỗi game thủ', + image: 'https://hanoicomputercdn.com/media/news/454_cpu_ch__i_game.jpg', + category: 'Review sản phẩm', + visit: 10, + comment: 40, + createDate: '13-03-2021, 5:30 am', + summary: 'Khi chọn mua cho mình một chiếc laptop để đồng hành mình trong công việc, học lập và giải trí phải chăng chúng ta chỉ quan tâm đến cầu hình', + }, + { + id: 4, + title: 'Chương trình Khuyến mãi “Quà Cực Sốc Khi Dựng Cấu Hình PC Lắp Ráp”', + image: 'https://hanoicomputercdn.com/media/news/454_cpu_ch__i_game.jpg', + category: 'Review sản phẩm', + visit: 10, + comment: 40, + createDate: '22-03-2021, 5:30 pm', + summary: 'Khi chọn mua cho mình một chiếc laptop để đồng hành mình trong công việc, học lập và giải trí phải chăng chúng ta chỉ quan tâm đến cầu hình', + }, +] + +const ListArticleCategory = () => { + const dataArtileList = dataArticle; + const styleTitle = { + fontSize: 16, + } + return ( + + { + dataArtileList.map(item => ) + } + + + + Tải thêm + + + + ) +} + + +const styles = StyleSheet.create({ + container: { + flex: 1, + alignItems: 'center', + justifyContent: 'center', + backgroundColor: '#fff', + }, + brecrumb: { + display: 'flex', + width: winWidth, + paddingLeft: 10, + paddingRight: 10, + flexDirection: 'row', + height: 18, + alignItems: 'center', + marginTop: 10, + marginBottom: 10, + }, + brecrumbText: { + fontSize: 13, + color: '#222', + }, + brecrumbTextLast: { + fontSize: 13, + color: '#b7b7b7', + }, + brecrumbIcon: { + fontSize: 13, + color: '#222', + marginLeft: 6, + marginRight: 6 + }, + boxArtcleCategory: { + paddingHorizontal: 10, + marginBottom: 20, + width: winWidth, + }, + boxArtcleCategoryLoadMore: { + }, + boxArtcleCategoryLoadMoreButton: { + width: '100%', + height: 36, + flexDirection: 'row', + justifyContent: 'center', + alignItems: 'center', + backgroundColor: '#ce0707' + }, + boxArtcleCategoryLoadMoreText: { + color: '#fff' + }, +}) \ No newline at end of file