blazerapp/app/Home.js

570 lines
29 KiB
JavaScript
Raw Normal View History

2020-10-25 02:57:39 -04:00
import React, { useState } from 'react';
2020-08-09 17:01:25 -04:00
import {
SafeAreaView,
StyleSheet,
ScrollView,
View,
Text,
StatusBar,
2020-10-25 02:57:39 -04:00
Modal,
TouchableHighlight,
Image,
2020-12-23 00:23:53 -05:00
FlatList,
2021-08-17 21:18:32 -04:00
Dimensions,
2020-12-24 01:35:25 -05:00
Linking,
2021-08-17 21:18:32 -04:00
ImageBackground
2020-08-09 17:01:25 -04:00
} from 'react-native';
2021-06-26 17:19:29 -04:00
import { useHeaderHeight } from '@react-navigation/stack';
2020-08-09 17:01:25 -04:00
import {
Header,
LearnMoreLinks,
Colors,
DebugInstructions,
ReloadInstructions,
} from 'react-native/Libraries/NewAppScreen';
2020-10-25 02:57:39 -04:00
import styles from './styles/morestyles'
2020-12-23 00:23:53 -05:00
import liststyles from './styles/liststyles'
2020-12-21 22:34:09 -05:00
import { url } from './resources/fetchInfo.json'
import LinearGradient from 'react-native-linear-gradient';
2020-12-23 00:23:53 -05:00
import StudentWeek from './StudentWeek';
2021-08-17 21:18:32 -04:00
import LunchEvents from './LunchEvents'
2020-12-23 00:23:53 -05:00
import { TouchableOpacity } from 'react-native-gesture-handler';
import { NavigationContainer } from '@react-navigation/native'
import { createStackNavigator } from '@react-navigation/stack'
2020-12-24 01:35:25 -05:00
import Announcements from './Announcements'
2021-08-17 21:18:32 -04:00
import I18n from './i18n.js'
import AsyncStorage from '@react-native-async-storage/async-storage'
2020-12-23 00:23:53 -05:00
2021-08-17 21:18:32 -04:00
const STORAGE_KEY = "teacherAnnouncements"
const Stack = createStackNavigator()
const windowWidth = Dimensions.get('window').width;
const windowHeight = Dimensions.get('window').height;
2020-12-23 00:23:53 -05:00
const getCurrentDate=()=>{
2021-08-17 21:18:32 -04:00
var date = new Date().getDate();
var month = new Date().getMonth();
var year = new Date().getFullYear();
2020-12-24 01:35:25 -05:00
2021-08-17 21:18:32 -04:00
return new Date(year, month, date);
2020-12-24 01:35:25 -05:00
}
const Announcement = ({item}) => {
2021-08-17 21:18:32 -04:00
const todayDate = getCurrentDate()
const itemDate = new Date(item.item.date)
const dateInfo = todayDate.getTime()===itemDate.getTime()&&item.item.time!==undefined?item.item.time:(item.item.date+", " + item.item.time)
2020-12-24 01:35:25 -05:00
return (
2021-08-17 21:18:32 -04:00
<View style={{borderWidth: 1, borderColor: '#323232', padding: '2%', marginHorizontal: '2%', marginBottom: '2%', borderRadius: 12}}>
<View style = {{display: 'flex', flexDirection: 'column', justifyContent: 'space-between'}}>
<View style = {{width: '100%'}}>
<Text style={liststyles.title}>{item.item.message}</Text>
2020-12-24 01:35:25 -05:00
</View>
2021-08-17 21:18:32 -04:00
{dateInfo!==undefined?<Text style={{fontSize: 12, fontWeight: '200'}}>{dateInfo}</Text>:<></>}
2020-12-24 01:35:25 -05:00
</View>
</View>
)
}
2021-08-17 21:18:32 -04:00
function NewTeacherList(props) {
return (
<View>
<LinearGradient start={{x: 0.25, y: .5}} end={{x: 1, y: 1}} colors={['#FF8484', '#FF1111']} style={{backgroundColor: 'red', width: '20%', padding: '2%', borderTopRightRadius: 20, borderBottomRightRadius: 20, marginVertical: '2%'}}>
<Text style={[liststyles.title, {color: 'white', fontWeight: 'bold'}]}>{I18n.t('dates.'+props.name)}</Text>
</LinearGradient>
<FlatList
data={props.list}
renderItem={item=><Announcement item={item}/>}
keyExtractor={item=>JSON.stringify(item)}
/>
</View>
)
}
2020-12-24 01:35:25 -05:00
export const TeacherList = ({route}) => {
2021-08-17 21:18:32 -04:00
const todayDate = getCurrentDate()
const weekPastDate = new Date();
var pastDate = weekPastDate.getDate() - 7;
weekPastDate.setDate(pastDate);
const weekFutureDate = new Date();
var futureDate = weekFutureDate.getDate() + 7;
weekFutureDate.setDate(futureDate);
const today = []
const past = []
const future = []
var todayBoolean = true
var pastBoolean = true
var futureBoolean = true
for (var i = 0; i < route.params.data.length; i++) {
const itemDate = new Date(route.params.data[i].date)
if (itemDate.getTime() == todayDate.getTime()) {
today.push(route.params.data[i])
}
else if (itemDate.getTime() > todayDate.getTime() && itemDate.getTime() <= weekFutureDate.getTime()) {
future.push(route.params.data[i])
}
//else if (itemDate >= weekPastDate && itemDate < todayDate) {
else if (itemDate.getTime() < todayDate.getTime()) {
past.push(route.params.data[i])
}
}
if (today.length === 0) todayBoolean = false
if (past.length === 0) pastBoolean = false
if (future.length === 0) futureBoolean = false
var noAnn = (todayBoolean||pastBoolean||futureBoolean)
2020-12-24 01:35:25 -05:00
return (
2021-08-17 21:18:32 -04:00
<ScrollView style={{flex: 1, backgroundColor: 'white'}}>
{todayBoolean?<NewTeacherList name = 'today' list = {today} />:<></>}
{pastBoolean?<NewTeacherList name = 'past' list = {past} />:<></>}
{futureBoolean?<NewTeacherList name = 'future' list = {future} />:<></>}
{!noAnn?<Text style={{textAlign: 'center', fontSize: 20, paddingTop: '2%'}}>{I18n.t('home.noAnnouncements')}</Text>:<></>}
</ScrollView>
2020-12-24 01:35:25 -05:00
)
2020-12-23 00:23:53 -05:00
}
2021-08-17 21:18:32 -04:00
function NewElement(props) {
var name = props.name
2020-12-24 01:35:25 -05:00
return (
2021-08-17 21:18:32 -04:00
<View style={{}}>
<LinearGradient start={{x: 0.25, y: .5}} end={{x: 1, y: 1}} colors={['#FF8484', '#FF1111']} style={{backgroundColor: 'red', width: '20%', padding: '2%', borderTopRightRadius: 20, borderBottomRightRadius: 20, marginVertical: '2%'}}>
<Text style={[liststyles.title, {color: 'white', fontWeight: 'bold'}]}>{I18n.t('dates.'+props.name)}</Text>
</LinearGradient>
<View style={{display:'flex', flexDirection: 'row', paddingHorizontal: '5%'}}>
<FlatList
data={props.list}
renderItem={item=><New item={item} navigation={props.navigation}/>}
keyExtractor={item=>JSON.stringify(item)}
horizontal
/>
2020-12-24 01:35:25 -05:00
</View>
</View>
)
}
2021-08-17 21:18:32 -04:00
export const whatsNew = ({route}) => {
const todayDate = getCurrentDate()
const weekPastDate = new Date();
var pastDate = weekPastDate.getDate() - 7;
weekPastDate.setDate(pastDate);
const weekFutureDate = new Date();
var futureDate = weekFutureDate.getDate() + 7;
weekFutureDate.setDate(futureDate);
const today = []
const past = []
const future = []
var todayBoolean = true
var pastBoolean = true
var futureBoolean = true
for (var i = 0; i < route.params.data.length; i++) {
const itemDate = new Date(route.params.data[i].date)
if (itemDate.getTime() == todayDate.getTime()) {
today.push(route.params.data[i])
}
else if (itemDate.getTime() > todayDate.getTime() && itemDate.getTime() <= weekFutureDate.getTime()) {
future.push(route.params.data[i])
}
//else if (itemDate >= weekPastDate && itemDate < todayDate) {
else if (itemDate.getTime() < todayDate.getTime()) {
past.push(route.params.data[i])
}
}
if (today.length === 0) todayBoolean = false
if (past.length === 0) pastBoolean = false
if (future.length === 0) futureBoolean = false
2020-12-24 01:35:25 -05:00
2021-08-17 21:18:32 -04:00
const item = route.params
return (
<ScrollView style={{display:'flex', backgroundColor: 'white', height: '100%'}}>
{todayBoolean?<NewElement name = 'today' navigation = {route.params.navigation} list = {today}/>:<></>}
{pastBoolean?<NewElement name = 'past' navigation = {route.params.navigation} list = {past}/>:<></>}
{futureBoolean?<NewElement name = 'future' navigation = {route.params.navigation} list = {future}/>:<></>}
</ScrollView>
)
2020-12-24 01:35:25 -05:00
}
2021-08-17 21:18:32 -04:00
export const NewItem = ({route}) => {
const item = route.params.data
const iconURI = item.icon !== undefined?`data:image/png;charset=utf-8;base64,${item.icon}`:''
return (
<ScrollView style={{height: '100%', backgroundColor: 'white'}}>
<View style={{backgroundColor: '#e3e3e3'}}>
<Image source={require('./assets/blair_logo.png')} style={{width: windowWidth, height: windowHeight*.6, alignSelf: 'center'}}/>
</View>
<View style={{backgroundColor: 'white', marginTop: '-5%', padding: '5%', borderTopLeftRadius: 20, borderTopRightRadius: 20}}>
<Text style={{fontSize: 14, fontWeight: '200', textAlign: 'center'}}>{item.date}</Text>
<Text style={{fontSize: 20, textAlign: 'center', paddingBottom: '2%', fontWeight: 'bold'}}>{item.name}</Text>
<Text style={{}}></Text>
</View>
</ScrollView>
)
2020-12-24 01:35:25 -05:00
}
const AnnouncementToday = ({item}) => {
const teacher = item.item.teacher !==""?item.item.teacher:"No Teacher"
2021-08-17 21:18:32 -04:00
return (
<View style = {{display: 'flex', flexDirection: 'row', alignItems: 'center', padding: '2%', paddingVertical: '2.5%', justifyContent: 'space-between', borderBottomWidth: 1, borderColor: "#b2b2b2"}}>
<View style = {{width: '72%'}}>
<Text style={{fontSize: 18}}>{item.item.message}</Text>
<Text style={{fontSize: 12, fontWeight: '200', paddingTop: '1%'}}>{item.item.time}</Text>
2020-12-23 00:23:53 -05:00
</View>
2021-08-17 21:18:32 -04:00
<View style = {{width: '25%', display: 'flex', flexDirection: 'row', justifyContent: 'flex-end'}}>
<Text style={{fontSize: 14, alignSelf: 'center', fontWeight: '200'}}>{teacher}</Text>
</View>
</View>
)
2020-12-24 01:35:25 -05:00
}
2021-08-17 21:18:32 -04:00
const New = (props) => {
const item = props.item
const iconURI = item.item.icon !== undefined?`data:image/png;charset=utf-8;base64,${item.item.icon}`:''
const textLength = item.item.name.length
var text = item.item.name
if (textLength >=17) {
text = text.substring(0, 14)+"..."
2020-12-24 01:35:25 -05:00
}
2021-08-17 21:18:32 -04:00
return (
<View style={{paddingRight: '2%'}}>
<TouchableOpacity onPress={()=>props.navigation.navigate('NewItem', {data:props.item.item})}>
<ImageBackground style = {{width: windowWidth*.4, height: windowWidth*.55, backgroundColor:'#e3e3e3', borderRadius: 16, alignItems: 'baseline'}}source = {{iconURI}}>
<View style={{padding: '5%', flex: 1, justifyContent: 'flex-end', width: windowWidth*.4, height: windowWidth*.2, shadowColor: '#323232', shadowOffset: {width: 0, height: 0}, shadowOpacity: 0.5}}>
<Text style={{fontSize: 12, color: 'white', fontWeight: '700'}}>{item.item.date}</Text>
<Text style={{fontSize: 16, color: 'white', fontWeight: 'bold'}}>{text}</Text>
</View>
</ImageBackground>
</TouchableOpacity>
2020-12-24 01:35:25 -05:00
</View>
2021-08-17 21:18:32 -04:00
)
2020-12-23 00:23:53 -05:00
}
2020-10-25 02:57:39 -04:00
function Home1() {
const [modalVisible, setModalVisible] = useState(false);
2020-10-25 02:57:39 -04:00
return (
2021-08-17 21:18:32 -04:00
<Modal animationType="slide" transparent={true} visible={modalVisible}>
<View style={styles.modal}>
<View style={{display: 'flex', flexDirection:'row', justifyContent: 'flex-end'}}>
<TouchableHighlight onPress={() => {setModalVisible(false);}}>
<Image source = {require('./assets/exit.png')} style = {{height: 40, width: 40}}/>
</TouchableHighlight>
</View>
<Image source = {require('./assets/blair_logo.png')} style = {{alignSelf: 'center', marginTop: '5%', height: 325, width: 325}}/>
<Text style={styles.modalText}>{url}</Text>
2020-10-25 02:57:39 -04:00
</View>
2021-08-17 21:18:32 -04:00
</Modal>
2020-12-24 01:35:25 -05:00
)
}
2021-08-17 21:18:32 -04:00
2020-12-24 01:35:25 -05:00
const background = (<LinearGradient
colors={['#f99', 'white']}
2021-08-17 21:18:32 -04:00
style = {{flex:1,borderBottomColor:'black',borderBottomWidth:0}}
2020-12-24 01:35:25 -05:00
/>)
function HomeStack() {
return (
<NavigationContainer independent={true}>
<Stack.Navigator>
<Stack.Screen
name="Home"
component={Home}
options={{
title:'Blair',
headerTitleStyle:styles.headerTitle,
headerBackground: ()=>background
}}
/>
<Stack.Screen
name="new"
component={whatsNew}
options={({route})=> ({
2021-08-17 21:18:32 -04:00
title:I18n.t('home.whatsNew'),
2020-12-24 01:35:25 -05:00
headerTitleStyle:styles.headerTitle,
2021-08-17 21:18:32 -04:00
headerBackground: ()=>background,
//headerLeft:null,
headerBackTitleVisible:false,
headerTintColor: 'black',
headerTitleAlign: 'center'
2020-12-24 01:35:25 -05:00
})}
/>
<Stack.Screen
name="Announcements"
component={Announcements}
options={({route})=> ({
2021-08-17 21:18:32 -04:00
title:I18n.t('home.Announcements'),
2020-12-24 01:35:25 -05:00
headerTitleStyle:styles.headerTitle,
2021-08-17 21:18:32 -04:00
headerBackground: ()=>background,
//headerLeft:null,
headerBackTitleVisible:false,
headerTintColor: 'black',
headerTitleAlign: 'center'
2020-12-24 01:35:25 -05:00
})}
/>
<Stack.Screen
name="TeacherList"
component={TeacherList}
options={({route})=>({
2021-08-17 21:18:32 -04:00
headerTitleStyle:[styles.headerTitle],
2020-12-24 01:35:25 -05:00
title:route.params.name,
headerRight:()=>(<></>),
2021-08-17 21:18:32 -04:00
headerBackground: ()=>background,
//headerLeft:null,
headerBackTitleVisible:false,
headerTintColor: 'black',
headerTitleAlign: 'center'
2020-12-24 01:35:25 -05:00
})}
/>
2021-06-26 17:19:29 -04:00
<Stack.Screen
2021-08-17 21:18:32 -04:00
name="LunchEvents"
component={LunchEvents}
options={{
title:I18n.t('home.lunch'),
headerTitleStyle:styles.headerTitle,
//headerLeft:null,
headerBackground: ()=>background,
headerTitleAlign: 'center',
headerBackTitleVisible:false,
headerTintColor: 'black'
}}
/>
<Stack.Screen
name="StudentWeek"
component={StudentWeek}
2021-06-26 17:19:29 -04:00
options={{
2021-08-17 21:18:32 -04:00
title:I18n.t('home.SOTW'),
2021-06-26 17:19:29 -04:00
headerTitleStyle:styles.headerTitle,
2021-08-17 21:18:32 -04:00
headerBackground: ()=>background,
//headerLeft:null,
headerBackTitleVisible:false,
headerTintColor: 'black',
headerTitleAlign: 'center'
2021-06-26 17:19:29 -04:00
}}
/>
2021-08-17 21:18:32 -04:00
<Stack.Screen
name = "NewItem"
component = {NewItem}
options={({route})=> ({
headerTitleStyle:[styles.headerTitle],
title:I18n.t('home.news'),
headerRight:()=>(<></>),
headerBackground: ()=>background,
//headerLeft: null,
headerBackTitleVisible:false,
headerTintColor: 'black',
headerTitleAlign: 'center'
})}
/>
2020-12-24 01:35:25 -05:00
</Stack.Navigator>
</NavigationContainer>
)
}
2020-10-25 02:57:39 -04:00
2020-12-24 01:35:25 -05:00
function HomeScreen (props) {
2020-12-24 02:34:47 -05:00
const iconURI = props.studentData.icon !== undefined?`data:image/png;charset=utf-8;base64,${props.studentData.icon}`:`data:image/png;base64,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
2021-06-26 17:19:29 -04:00
global.headerHeight = useHeaderHeight();
2021-08-17 21:18:32 -04:00
const todayDate = getCurrentDate()
var todayAnn = []
var todayNew = []
var todayAnnBoolean = true
var todayNewBoolean = true
var showLunch = false
for (var i = 0; i < props.annData.length; i++) {
const itemDate = new Date(props.annData[i].date)
if (itemDate == todayDate) todayAnn.push(props.annData[i])
else todayAnn.push(props.annData[i])
}
2020-12-24 01:35:25 -05:00
2021-08-17 21:18:32 -04:00
for (var i = 0; i < props.data.length; i++) {
const itemDate = new Date(props.data[i].date)
if (itemDate == todayDate) todayNew.push(props.data[i])
}
if (todayAnn.length === 0) todayAnnBoolean = false
if (todayNew.length ===0) todayNewBoolean = false
todayAnn = todayAnn.slice(0, 4)
2020-12-24 01:35:25 -05:00
2021-08-17 21:18:32 -04:00
var currentTime = new Date();
var time = currentTime.toLocaleTimeString().replace(/([\d]+:[\d]{2})(:[\d]{2})(.*)/, "$1$3").split(' ')
var dayOfWeek = currentTime.getDay()
var hourTime = parseInt(time[0].split(':')[0])
if (dayOfWeek!=0 && dayOfWeek!=6 && ((hourTime>=10 && time[1]=='AM') || (hourTime ==12 && parseInt(time[0].split(':')[1])<=30 && time[1]=='PM'))) {
showLunch = true
}
2021-08-23 21:46:29 -04:00
if (time[1]!='PM' && time[1]!='AM' && dayOfWeek!=0 && dayOfWeek!=6 && hourTime>=10 && (hourTime <=12 && parseInt(time[0].split(':')[1])<=30)) {
2021-08-17 21:18:32 -04:00
showLunch = true
}
return (
<ScrollView style={{paddingHorizontal:'5%', backgroundColor: 'white', height: '100%'}}>
{showLunch?
<View style={{display: 'flex', flexDirection: 'row', paddingTop: '2%'}}>
<Text style={{textAlign: 'center', alignSelf: 'center', fontSize: 16, fontWeight: '200'}}>{I18n.t('home.shortcut')} {'\t'}</Text>
<TouchableOpacity onPress={()=>props.navigation.navigate(LunchEvents)}>
<View style={{padding: '5%', borderRadius: 16, borderWidth: 1, borderColor: 'red'}}>
<Text style={{fontWeight: '200', color: 'red', textAlign: 'center'}}>{I18n.t('home.seeLunch')}</Text>
</View>
2020-12-24 01:35:25 -05:00
</TouchableOpacity>
</View>
2021-08-17 21:18:32 -04:00
:<></>}
<View style={{paddingTop: '2%'}}>
<View style={{display: 'flex', flexDirection:'row', justifyContent: 'space-between', alignItems: 'center', paddingBottom: '5%'}}>
<Text style={liststyles.homeTitle}>{I18n.t('home.whatsNew')}</Text>
<TouchableOpacity style={{display: 'flex', flexDirection: 'row'}}onPress={()=>props.navigation.navigate('new', {data:props.data, navigation: props.navigation})}>
<LinearGradient start={{x: 0, y: 0.25}} end={{x: .5, y: 1}} colors={['red', '#FF7373']} style={{borderRadius: 24, alignSelf: 'center'}}><Image source = {require('./assets/forward.png')} style={{tintColor: 'white'}}/></LinearGradient>
2021-06-26 17:19:29 -04:00
</TouchableOpacity>
</View>
2021-08-17 21:18:32 -04:00
<View style={{backgroundColor: 'white', display: 'flex', flexDirection: 'row'}}>
{!todayNewBoolean?<Text style={{fontWeight: '200', fontSize: 16, paddingTop: '2%'}}>{I18n.t('home.noNews')}</Text>:<FlatList
data={todayNew}
renderItem={item=><New item={item} navigation={props.navigation}/>}
2021-06-26 17:19:29 -04:00
keyExtractor={item=>JSON.stringify(item)}
horizontal
2021-08-17 21:18:32 -04:00
/>}
2021-06-26 17:19:29 -04:00
</View>
</View>
2021-08-17 21:18:32 -04:00
<View style={{marginTop: '5%'}}>
<View style={{display: 'flex', flexDirection:'row', justifyContent: 'space-between', alignItems: 'center', paddingBottom: '5%'}}>
<Text style={liststyles.homeTitle}>{I18n.t('home.Announcements')}</Text>
<TouchableOpacity style={{}}onPress={()=>props.navigation.navigate(Announcements)}>
<LinearGradient start={{x: 0, y: 0.25}} end={{x: .5, y: 1}} colors={['red', '#FF7373']} style={{borderRadius: 24, alignSelf: 'center'}}><Image source = {require('./assets/forward.png')} style={{tintColor: 'white'}}/></LinearGradient>
2021-06-26 17:19:29 -04:00
</TouchableOpacity>
</View>
2021-08-17 21:18:32 -04:00
{!todayAnnBoolean?<Text style={{fontWeight: '200', fontSize: 16, paddingTop: '2%'}}>{I18n.t('home.noAnnouncements')}</Text>:<FlatList
data={todayAnn}
2021-06-26 17:19:29 -04:00
renderItem={item=><AnnouncementToday item={item}/>}
keyExtractor={item=>JSON.stringify(item)}
2021-08-17 21:18:32 -04:00
/>}
2021-06-26 17:19:29 -04:00
</View>
2021-08-17 21:18:32 -04:00
<View style={{marginTop: '5%', marginBottom: '10%'}}>
<Text style={[liststyles.homeTitle, {paddingBottom: '5%'}]}>{I18n.t('home.SOTW')}</Text>
<View style={{display: 'flex', flexDirection: 'row'}}>
<View style={{backgroundColor: 'white', width: windowWidth*.30, height: windowWidth*.30, shadowColor: 'red', shadowOffset: {width: 0, height: 2}, shadowOpacity: 0.5, shadowRadius: 7, borderRadius: (windowWidth*.30)/2}}>
<Image source = {{iconURI}} style = {{height:'100%', width: '100%', borderTopRightRadius: 8, borderTopLeftRadius:8}}/>
</View>
<View style ={{width: windowWidth*.60, display: 'flex', paddingLeft: '5%', paddingHorizontal: '2%', alignItems: 'center', justifyContent: 'space-around'}}>
<Text style={{fontSize: 18, textAlign: 'center'}}>{props.studentData.name}, <Text style={{fontWeight: '200', textAlign: 'center'}}>Grade {props.studentData.year}</Text></Text>
<TouchableOpacity onPress={()=>props.navigation.navigate(StudentWeek)}>
<View style={{padding: '5%', borderRadius: 16, borderWidth: 1, borderColor: 'red'}}>
<Text style={{fontWeight: '200', color: 'red', textAlign: 'center'}}>{I18n.t('home.moreOn')} {props.studentData.name}</Text>
</View>
</TouchableOpacity>
</View>
2020-12-24 01:35:25 -05:00
</View>
</View>
</ScrollView>
2020-10-25 02:57:39 -04:00
)
2021-08-17 21:18:32 -04:00
}
2020-12-23 00:23:53 -05:00
2020-08-09 17:01:25 -04:00
class Home extends React.Component {
2020-10-25 02:57:39 -04:00
constructor(props) {
super(props)
this.state = {
2020-12-23 00:23:53 -05:00
studentData: [],
2020-12-24 01:35:25 -05:00
annData:[],
2020-12-23 00:23:53 -05:00
data:[],
2021-08-17 21:18:32 -04:00
lunchData:[],
2020-12-24 01:35:25 -05:00
teacherNames: [],
favoriteNames: [],
2020-12-21 22:34:09 -05:00
isLoading:true
2020-10-25 02:57:39 -04:00
}
}
2020-12-23 00:23:53 -05:00
addFavorite = (name) => {
const favoriteNames = this.state.favoriteNames.slice().map(({name})=>name)
const index = favoriteNames.indexOf(name)
if (index < 0) {
favoriteNames.push(name)
}
else {
favoriteNames.splice(index,1)
}
favoriteNames.sort()
this.setState({favoriteNames:favoriteNames.map(name=>({name:name}))})
AsyncStorage.setItem(STORAGE_KEY,JSON.stringify(favoriteNames)).catch(console.log).done()
}
componentDidMount() {
2020-12-24 01:35:25 -05:00
fetch(`${url}/api/en/student`,{
2020-12-23 00:23:53 -05:00
headers: {
'Cache-Control': 'no-cache'
}}
).then((response) => {
2020-12-24 01:35:25 -05:00
return response.text();list
2020-12-23 00:23:53 -05:00
}).then((json) => {
2020-12-24 01:35:25 -05:00
this.setState({studentData: JSON.parse(json),isLoading:false});
}).catch((error) => console.error(error))
2021-08-17 21:18:32 -04:00
fetch(`${url}/api/en/lunchEvents`,{
headers: {
'Cache-Control': 'no-cache'
}}
).then((response) => {
return response.text();
}).then((json) => {
this.setState({lunchData: JSON.parse(json)});
}).catch((error) => console.error(error))
2020-12-23 00:23:53 -05:00
this.getData()
this.props.navigation.addListener(
'focus',
() => {
this.getData()
}
);
this.getData1()
AsyncStorage.getItem(STORAGE_KEY)
.then(value=>value==null?[]:JSON.parse(value).map(x=>({name:x})))
.then(names=>this.setState({favoriteNames:names}))
.catch(console.log)
.done()
}
2020-12-24 01:35:25 -05:00
getData() {
fetch(`${url}/api/en/new`,{
headers: {
'Cache-Control': 'no-cache'
} })
.then((response) => {
return response.text();
})
.then((json) => {
2021-08-23 21:46:29 -04:00
console.log(json)
2020-12-24 01:35:25 -05:00
const data = JSON.parse(json).data
data.sort((a,b)=>new Date(b.date).getTime()-new Date(a.date).getTime())
this.setState({data: data});
})
.catch((error) => console.error(error))
}
2020-12-23 00:23:53 -05:00
getData1() {
fetch(`${url}/api/en/announcements`,{
headers: {
'Cache-Control': 'no-cache'
2021-08-17 21:18:32 -04:00
}})
2020-12-23 00:23:53 -05:00
.then((response) => {
return response.text()
})
.then((txt) => {
const data = JSON.parse(txt).data;
const teacherNames = [...new Set(data.filter(x=>x.teacher!=null&&x.teacher.trim()!=='').map(x=>x.teacher))];
teacherNames.sort()
2020-12-24 01:35:25 -05:00
this.setState({annData: data, teacherNames: teacherNames.map(x=>({name:x})),isLoading:false});
2021-08-17 21:18:32 -04:00
}).catch((error) => console.error(error))
2020-12-23 00:23:53 -05:00
}
2020-10-25 02:57:39 -04:00
2020-08-09 17:01:25 -04:00
render() {
2020-12-23 00:23:53 -05:00
return (
2020-10-25 02:57:39 -04:00
<View>
<Home1></Home1>
2020-12-24 01:35:25 -05:00
<HomeScreen navigation={this.props.navigation} annData={this.state.annData} studentData={this.state.studentData} data={this.state.data} challengeData = {this.state.challengeData}></HomeScreen>
2020-10-25 02:57:39 -04:00
</View>
2020-08-09 17:01:25 -04:00
)
}
}
2020-12-24 01:35:25 -05:00
export default HomeStack;