|
@@ -1,180 +1,201 @@
|
|
|
-import { StyleSheet, Text, View, ScrollView } from 'react-native'
|
|
|
-import React, { useEffect } from 'react'
|
|
|
-import fonts from '../../../theme/fonts'
|
|
|
-import colors from '../../../theme/colors'
|
|
|
-import { ToggleButton } from 'react-native-paper'
|
|
|
-import SectionHeader from '../Headers/SectionHeader'
|
|
|
-import HorizontalNewsCardVariant from '../Cards/HorizontalNewsCardVariant'
|
|
|
-import {CATEGORY_URL,ARTICLE_URL, PAGINATE_BY} from '../../../utils/Constants/constants'
|
|
|
-import { useConstructor } from '../../../utils/Constants/functions'
|
|
|
-
|
|
|
+import {StyleSheet, Text, View, ScrollView} from 'react-native';
|
|
|
+import React, {useEffect} from 'react';
|
|
|
+import fonts from '../../../theme/fonts';
|
|
|
+import colors from '../../../theme/colors';
|
|
|
+import {ToggleButton} from 'react-native-paper';
|
|
|
+import SectionHeader from '../Headers/SectionHeader';
|
|
|
+import HorizontalNewsCardVariant from '../Cards/HorizontalNewsCardVariant';
|
|
|
+import {
|
|
|
+ CATEGORY_URL,
|
|
|
+ ARTICLE_URL,
|
|
|
+ PAGINATE_BY,
|
|
|
+} from '../../../utils/Constants/constants';
|
|
|
+import {useConstructor} from '../../../utils/Constants/functions';
|
|
|
|
|
|
// * API Handling
|
|
|
|
|
|
const CategorySection = () => {
|
|
|
-
|
|
|
- const [news,setNews] = React.useState({'all':[]})
|
|
|
- const updateNewsByCategories = (key, value) => {
|
|
|
- setNews((prevObject) => ({
|
|
|
- ...prevObject,
|
|
|
- [key]: value,
|
|
|
- }));
|
|
|
- };
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- const [categoryValue, setCategoryValue] = React.useState('');
|
|
|
- const [categories, setCategories] = React.useState([])
|
|
|
- const fetchCategories = () => {
|
|
|
-
|
|
|
- fetch(
|
|
|
- `http://www.newscout.in/api/v1/menus/?domain=newscout`)
|
|
|
- .then((res) => res.json())
|
|
|
- .then((json) => {
|
|
|
- let categoriesHeading = json.body.results.map((item) => item.heading.name)
|
|
|
- setCategories(categoriesHeading)
|
|
|
- setNews({})
|
|
|
- setNews(categoriesHeading.reduce((result, key) => ({ ...result, [key]: []}), {})),
|
|
|
- setCategoryValue(categoriesHeading[0])
|
|
|
- return categoriesHeading
|
|
|
- }).
|
|
|
- then((cats) => {
|
|
|
- cats.forEach(cat=> {
|
|
|
- fetchNews(cat)
|
|
|
- });
|
|
|
- return cats
|
|
|
- })
|
|
|
- .catch((err) => console.log(err))
|
|
|
- .finally(() => console.log("Fetch Categories Executed"))
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- const fetchNews = (category) => {
|
|
|
- fetch(`http://www.newscout.in/api/v1/article/search/?domain=newscout&category=${category}`)
|
|
|
- .then(res => res.json())
|
|
|
- .then((data) => {
|
|
|
- const newsDataFetch = data.body.results
|
|
|
- const finalNewsData = newsDataFetch.slice(0,PAGINATE_BY).map((article) => ({
|
|
|
- headline: article.title,
|
|
|
- image: {uri:article.cover_image},
|
|
|
- category: article.category,
|
|
|
- root_category: article.root_category,
|
|
|
- timestamp: article.published_on,
|
|
|
- tagline: "Bruh Momento Oi Lorem Ipsum di rubi rabbi",
|
|
|
- id:article.id
|
|
|
- }))
|
|
|
- updateNewsByCategories(category,finalNewsData)
|
|
|
- // categories.forEach((category) => {setNews((prev) => ({...prev,[category]:json.body.results}))})
|
|
|
- return finalNewsData
|
|
|
- })
|
|
|
- .catch((err) => console.log(err))
|
|
|
- .finally(() => console.log("Fetch Category News Executed"))
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- useConstructor( () => {
|
|
|
- const cat_data = fetchCategories()
|
|
|
- //console.log(`construct ${categories}`)
|
|
|
- // for (let category in cat_data) {
|
|
|
- // updateNewsByCategories(category,fetchNews(category))
|
|
|
-
|
|
|
- // }
|
|
|
- })
|
|
|
-
|
|
|
- // useEffect(() => {
|
|
|
- // for (let category in cat_data) {
|
|
|
- // fetchNews(category)
|
|
|
-
|
|
|
- // }
|
|
|
- // })
|
|
|
-
|
|
|
- return (
|
|
|
- <View style={styles.categoriesContainer}>
|
|
|
- <SectionHeader label={"Categories"} />
|
|
|
- <View style={styles.categoriesPillContainer}>
|
|
|
- <ScrollView horizontal showsHorizontalScrollIndicator={false}>
|
|
|
- <ToggleButton.Group onValueChange={value => { setCategoryValue(value) }}>
|
|
|
- {
|
|
|
- categories.map((category) =>
|
|
|
- <ToggleButton
|
|
|
- key={category}
|
|
|
- icon={() => <Text style={[category === categoryValue ? styles.selectedPillText : styles.pillText]}>{category}</Text>}
|
|
|
- style={[category === categoryValue ? styles.selectedContainer : styles.container, { marginHorizontal: fonts.getSize(4) }]}
|
|
|
- value={category}
|
|
|
-
|
|
|
- />)
|
|
|
- }
|
|
|
- </ToggleButton.Group>
|
|
|
- </ScrollView>
|
|
|
- </View>
|
|
|
- <ScrollView showsVerticalScrollIndicator={false}>
|
|
|
- <View style={styles.categoriesNewsContainer}>
|
|
|
- {news[categoryValue] !== undefined
|
|
|
- ? news[categoryValue].map((item) =>
|
|
|
- <HorizontalNewsCardVariant
|
|
|
- headline={item.headline}
|
|
|
- image={item.image}
|
|
|
- timestamp={item.timestamp}
|
|
|
- tagline={item.tagline}
|
|
|
- />)
|
|
|
- : <Text> News Not Present</Text>
|
|
|
- }
|
|
|
- </View>
|
|
|
- </ScrollView>
|
|
|
- </View>
|
|
|
-
|
|
|
+ const [news, setNews] = React.useState({all: []});
|
|
|
+ const updateNewsByCategories = (key, value) => {
|
|
|
+ setNews(prevObject => ({
|
|
|
+ ...prevObject,
|
|
|
+ [key]: value,
|
|
|
+ }));
|
|
|
+ };
|
|
|
+
|
|
|
+ const [categoryValue, setCategoryValue] = React.useState('');
|
|
|
+ const [categories, setCategories] = React.useState([]);
|
|
|
+ const fetchCategories = () => {
|
|
|
+ fetch(`http://www.newscout.in/api/v1/menus/?domain=newscout`)
|
|
|
+ .then(res => res.json())
|
|
|
+ .then(json => {
|
|
|
+ let categoriesHeading = json.body.results.map(
|
|
|
+ item => item.heading.name,
|
|
|
+ );
|
|
|
+ setCategories(categoriesHeading);
|
|
|
+ setNews({});
|
|
|
+ setNews(
|
|
|
+ categoriesHeading.reduce(
|
|
|
+ (result, key) => ({...result, [key]: []}),
|
|
|
+ {},
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ setCategoryValue(categoriesHeading[0]);
|
|
|
+ return categoriesHeading;
|
|
|
+ })
|
|
|
+ .then(cats => {
|
|
|
+ cats.forEach(cat => {
|
|
|
+ fetchNews(cat);
|
|
|
+ });
|
|
|
+ return cats;
|
|
|
+ })
|
|
|
+ .catch(err => console.log(err))
|
|
|
+ .finally(() => console.log('Fetch Categories Executed'));
|
|
|
+ };
|
|
|
+
|
|
|
+ const fetchNews = category => {
|
|
|
+ fetch(
|
|
|
+ `http://www.newscout.in/api/v1/article/search/?domain=newscout&category=${category}`,
|
|
|
)
|
|
|
-}
|
|
|
+ .then(res => res.json())
|
|
|
+ .then(data => {
|
|
|
+ const newsDataFetch = data.body.results;
|
|
|
+ const finalNewsData = newsDataFetch
|
|
|
+ .slice(0, PAGINATE_BY)
|
|
|
+ .map(article => ({
|
|
|
+ headline: article.title,
|
|
|
+ image: {uri: article.cover_image},
|
|
|
+ category: article.category,
|
|
|
+ root_category: article.root_category,
|
|
|
+ timestamp: article.published_on,
|
|
|
+ tagline: 'Bruh Momento Oi Lorem Ipsum di rubi rabbi',
|
|
|
+ id: article.id,
|
|
|
+ }));
|
|
|
+ updateNewsByCategories(category, finalNewsData);
|
|
|
+ // categories.forEach((category) => {setNews((prev) => ({...prev,[category]:json.body.results}))})
|
|
|
+ return finalNewsData;
|
|
|
+ })
|
|
|
+ .catch(err => console.log(err))
|
|
|
+ .finally(() => console.log('Fetch Category News Executed'));
|
|
|
+ };
|
|
|
+
|
|
|
+ useConstructor(() => {
|
|
|
+ const cat_data = fetchCategories();
|
|
|
+ //console.log(`construct ${categories}`)
|
|
|
+ // for (let category in cat_data) {
|
|
|
+ // updateNewsByCategories(category,fetchNews(category))
|
|
|
+
|
|
|
+ // }
|
|
|
+ });
|
|
|
+
|
|
|
+ // useEffect(() => {
|
|
|
+ // for (let category in cat_data) {
|
|
|
+ // fetchNews(category)
|
|
|
+
|
|
|
+ // }
|
|
|
+ // })
|
|
|
+
|
|
|
+ return (
|
|
|
+ <View style={styles.categoriesContainer}>
|
|
|
+ <SectionHeader label={'Categories'} />
|
|
|
+ <View style={styles.categoriesPillContainer}>
|
|
|
+ <ScrollView horizontal showsHorizontalScrollIndicator={false}>
|
|
|
+ <ToggleButton.Group
|
|
|
+ onValueChange={value => {
|
|
|
+ setCategoryValue(value);
|
|
|
+ }}>
|
|
|
+ {categories.map(category => (
|
|
|
+ <ToggleButton
|
|
|
+ key={category}
|
|
|
+ icon={() => (
|
|
|
+ <Text
|
|
|
+ style={[
|
|
|
+ category === categoryValue
|
|
|
+ ? styles.selectedPillText
|
|
|
+ : styles.pillText,
|
|
|
+ ]}>
|
|
|
+ {category}
|
|
|
+ </Text>
|
|
|
+ )}
|
|
|
+ style={[
|
|
|
+ category === categoryValue
|
|
|
+ ? styles.selectedContainer
|
|
|
+ : styles.container,
|
|
|
+ {marginHorizontal: fonts.getSize(4)},
|
|
|
+ ]}
|
|
|
+ value={category}
|
|
|
+ />
|
|
|
+ ))}
|
|
|
+ </ToggleButton.Group>
|
|
|
+ </ScrollView>
|
|
|
+ </View>
|
|
|
+ <ScrollView showsVerticalScrollIndicator={false}>
|
|
|
+ <View style={styles.categoriesNewsContainer}>
|
|
|
+ {news[categoryValue] !== undefined ? (
|
|
|
+ news[categoryValue].map(item => (
|
|
|
+ <HorizontalNewsCardVariant
|
|
|
+ headline={item.headline}
|
|
|
+ image={item.image}
|
|
|
+ timestamp={item.timestamp}
|
|
|
+ tagline={item.tagline}
|
|
|
+ />
|
|
|
+ ))
|
|
|
+ ) : (
|
|
|
+ <Text> News Not Present</Text>
|
|
|
+ )}
|
|
|
+ </View>
|
|
|
+ </ScrollView>
|
|
|
+ </View>
|
|
|
+ );
|
|
|
+};
|
|
|
|
|
|
-export default CategorySection
|
|
|
+export default CategorySection;
|
|
|
|
|
|
const styles = StyleSheet.create({
|
|
|
- categoriesTitle: {
|
|
|
- flexDirection: 'row',
|
|
|
- paddingTop: fonts.getSize(20),
|
|
|
- paddingHorizontal: fonts.getSize(20)
|
|
|
- },
|
|
|
- categoriesTitleText: {
|
|
|
- flex: 1,
|
|
|
- fontFamily: fonts.type.semibold,
|
|
|
- fontSize: fonts.getSize(16),
|
|
|
- color: colors.black
|
|
|
- },
|
|
|
- categoriesPillContainer: {
|
|
|
- paddingBottom: fonts.getSize(8),
|
|
|
- flexDirection: 'row',
|
|
|
- alignItems: 'space-between',
|
|
|
- paddingHorizontal: fonts.getSize(16)
|
|
|
- },
|
|
|
- container: {
|
|
|
- borderRadius: fonts.getSize(18),
|
|
|
- paddingVertical: fonts.getSize(8),
|
|
|
- paddingHorizontal: fonts.getSize(16),
|
|
|
- backgroundColor: colors.white,
|
|
|
- width: 'auto'
|
|
|
- },
|
|
|
- selectedContainer: {
|
|
|
- paddingVertical: fonts.getSize(8),
|
|
|
- paddingHorizontal: fonts.getSize(16),
|
|
|
- backgroundColor: colors.topVariantColor,
|
|
|
- borderRadius: fonts.getSize(18),
|
|
|
- width: 'auto'
|
|
|
- },
|
|
|
- selectedPillText: {
|
|
|
- fontFamily: fonts.type.semibold,
|
|
|
- fontSize: fonts.getSize(12),
|
|
|
- color: colors.white
|
|
|
- },
|
|
|
- pillText: {
|
|
|
- fontFamily: fonts.type.semibold,
|
|
|
- fontSize: fonts.getSize(12),
|
|
|
- color: colors.quaternaryColor
|
|
|
- },
|
|
|
- categoriesNewsContainer: {
|
|
|
- paddingHorizontal: fonts.getSize(16),
|
|
|
- paddingTop: fonts.getSize(10),
|
|
|
- gap: 8
|
|
|
-
|
|
|
- }
|
|
|
-})
|
|
|
+ categoriesTitle: {
|
|
|
+ flexDirection: 'row',
|
|
|
+ paddingTop: fonts.getSize(20),
|
|
|
+ paddingHorizontal: fonts.getSize(20),
|
|
|
+ },
|
|
|
+ categoriesTitleText: {
|
|
|
+ flex: 1,
|
|
|
+ fontFamily: fonts.type.semibold,
|
|
|
+ fontSize: fonts.getSize(16),
|
|
|
+ color: colors.black,
|
|
|
+ },
|
|
|
+ categoriesPillContainer: {
|
|
|
+ paddingBottom: fonts.getSize(8),
|
|
|
+ flexDirection: 'row',
|
|
|
+ alignItems: 'space-between',
|
|
|
+ paddingHorizontal: fonts.getSize(16),
|
|
|
+ },
|
|
|
+ container: {
|
|
|
+ borderRadius: fonts.getSize(18),
|
|
|
+ paddingVertical: fonts.getSize(8),
|
|
|
+ paddingHorizontal: fonts.getSize(16),
|
|
|
+ backgroundColor: colors.white,
|
|
|
+ width: 'auto',
|
|
|
+ },
|
|
|
+ selectedContainer: {
|
|
|
+ paddingVertical: fonts.getSize(8),
|
|
|
+ paddingHorizontal: fonts.getSize(16),
|
|
|
+ backgroundColor: colors.topVariantColor,
|
|
|
+ borderRadius: fonts.getSize(18),
|
|
|
+ width: 'auto',
|
|
|
+ },
|
|
|
+ selectedPillText: {
|
|
|
+ fontFamily: fonts.type.semibold,
|
|
|
+ fontSize: fonts.getSize(12),
|
|
|
+ color: colors.white,
|
|
|
+ },
|
|
|
+ pillText: {
|
|
|
+ fontFamily: fonts.type.semibold,
|
|
|
+ fontSize: fonts.getSize(12),
|
|
|
+ color: colors.quaternaryColor,
|
|
|
+ },
|
|
|
+ categoriesNewsContainer: {
|
|
|
+ paddingHorizontal: fonts.getSize(16),
|
|
|
+ paddingTop: fonts.getSize(10),
|
|
|
+ gap: 8,
|
|
|
+ },
|
|
|
+});
|