feat: visa summering per dag inkl indikation om gymnastik

This commit is contained in:
Christian Landgren 2021-04-09 11:47:35 +02:00 committed by Viktor Sarström
parent d3d2be3a3e
commit ea182035d8
2 changed files with 418 additions and 4 deletions

View File

@ -4,7 +4,6 @@ import { Divider, List, ListItem, Text } from '@ui-kitten/components'
import moment from 'moment'
import React from 'react'
import { Image, ListRenderItemInfo, StyleSheet, View } from 'react-native'
import { ScrollView } from 'react-native-gesture-handler'
import { useChild } from './childContext.component'
import { CalendarOutlineIcon } from './icon.component'
import { Week } from './week.component'
@ -24,9 +23,7 @@ export const Calendar = () => {
</View>
) : (
<View>
<Text category="h1">Schema</Text>
<Week />
<Text category="h1">Händelser</Text>
<List
contentContainerStyle={styles.contentContainer}
data={data.sort((a, b) =>
@ -65,6 +62,9 @@ const styles = StyleSheet.create({
width: '100%',
},
contentContainer: {
padding: 10,
padding: 15,
},
header: {
paddingLeft: 15,
},
})

View File

@ -0,0 +1,414 @@
import {
List,
ListItem,
ViewPager,
Text,
TabBar,
Tab,
Card,
} from '@ui-kitten/components'
import React from 'react'
import moment from 'moment'
import { StyleSheet, View } from 'react-native'
const week = 15
const lessonInfo = [
{
guidId: 'NDRhMTM1MGMtZmJmZi05MTYzLWVmNzUtMGEyZDM4Mzk0N2Q4',
texts: ['IDH', 'ANB', 'IdA'],
timeStart: '13:15:00',
timeEnd: '14:35:00',
dayOfWeekNumber: 1,
blockName: '',
},
{
guidId: 'OGZmNzQyYWEtOGJmNS05YThmLWVhZWEtMmQ1MDRhNzYxMzEw',
texts: ['SO', 'FEW', 'A251'],
timeStart: '11:10:00',
timeEnd: '12:20:00',
dayOfWeekNumber: 1,
blockName: '',
},
{
guidId: 'ODhiNjlhOGQtNGU3YS05ZjkzLWZjYWMtOWIzMTE0NGMyNDkw',
texts: ['NO', 'PÄA', 'A206'],
timeStart: '10:00:00',
timeEnd: '11:05:00',
dayOfWeekNumber: 1,
blockName: '',
},
{
guidId: 'MGExY2U3NWUtMGY3OC05NzM4LWZhY2YtNjIxOGRhMDU5NDdl',
texts: ['Prandium', '', ''],
timeStart: '12:20:00',
timeEnd: '12:50:00',
dayOfWeekNumber: 1,
blockName: '',
},
{
guidId: 'MjZjYjZjZWQtMWJhOC05M2Q1LWY2NGItZDdhZDRlMWFkNjFj',
texts: ['EV', 'MIZ', 'HKK'],
timeStart: '14:55:00',
timeEnd: '16:15:00',
dayOfWeekNumber: 1,
blockName: '',
},
{
guidId: 'NGRjOGQ1YTEtZWI1MC05ZjQ2LWMzMzQtZDVlZmU4NDMwOTBh',
texts: ['SL', 'HAL', 'TM'],
timeStart: '09:20:00',
timeEnd: '10:40:00',
dayOfWeekNumber: 2,
blockName: '',
},
{
guidId: 'Mzg5MGE3Y2MtOTA5My05NmFkLWY2MGQtYWMyNzQwZmY0MmQ0',
texts: ['MA', 'DAG', 'A251'],
timeStart: '10:45:00',
timeEnd: '11:40:00',
dayOfWeekNumber: 2,
blockName: '',
},
{
guidId: 'MDIzNjQ0MGMtYTZhZS05N2JkLWQwODQtOGQ4N2Y5OTc1NTFk',
texts: ['M2FR', 'STT', 'G205'],
timeStart: '15:05:00',
timeEnd: '15:55:00',
dayOfWeekNumber: 2,
blockName: '',
},
{
guidId: 'YTc1MTg3ODctMWVmOC05MjJmLWNjM2UtODdkMGI4NjAwMTI2',
texts: ['EN', 'ANL', 'A251'],
timeStart: '12:30:00',
timeEnd: '13:25:00',
dayOfWeekNumber: 2,
blockName: '',
},
{
guidId: 'OGM4N2ZlYjEtZjRmYi05ZGU1LWNkOWMtZDViYTc1ZTc5MWYz',
texts: ['NO', 'PÄA', 'A210'],
timeStart: '13:50:00',
timeEnd: '14:55:00',
dayOfWeekNumber: 2,
blockName: '',
},
{
guidId: 'OWFlNTNhOWQtNGIzYS05MTU1LWMzOTUtMTU3ZTBkM2VkOTE1',
texts: ['Prandium', '', ''],
timeStart: '11:40:00',
timeEnd: '12:10:00',
dayOfWeekNumber: 2,
blockName: '',
},
{
guidId: 'MmVkNGNhYzAtOTQyNC05MDhmLWNmNzgtNzllOGY2YWQ4ZGI0',
texts: ['NO', 'PÄA', 'A211'],
timeStart: '14:20:00',
timeEnd: '15:20:00',
dayOfWeekNumber: 3,
blockName: '',
},
{
guidId: 'NDVkOTljZDEtNTc1NS05ZjY1LWM3Y2UtNzk5NjFmMDUyM2Rm',
texts: ['M2FR', 'STT', 'G205'],
timeStart: '11:20:00',
timeEnd: '12:10:00',
dayOfWeekNumber: 3,
blockName: '',
},
{
guidId: 'YmY0ZGRhZDEtM2U2NS05NjY2LWMwYjgtMDY2N2Y1MGJhZWVj',
texts: ['MU', 'ANL', 'MU'],
timeStart: '13:10:00',
timeEnd: '14:10:00',
dayOfWeekNumber: 3,
blockName: '',
},
{
guidId: 'YjEyY2MwZjAtNDM5MC05NDE4LWRjYzItZTMyMzU5MGZkZDIz',
texts: ['SV', 'MPH', 'A245'],
timeStart: '10:25:00',
timeEnd: '11:15:00',
dayOfWeekNumber: 3,
blockName: '',
},
{
guidId: 'YjhmYWUyYTItNmM0OC05NWI1LWRlYWItODkwYTBkYzgzZWM0',
texts: ['MA', 'DAG', 'A210'],
timeStart: '08:15:00',
timeEnd: '09:10:00',
dayOfWeekNumber: 3,
blockName: '',
},
{
guidId: 'ZDMxYTc4ZDYtOThiZC05NTFmLWQ0ODItNjMzNjNiODRhZDUx',
texts: ['SO', 'FEW', 'A251'],
timeStart: '09:15:00',
timeEnd: '10:10:00',
dayOfWeekNumber: 3,
blockName: '',
},
{
guidId: 'NGEyZDRhMzUtMjlmYS05ODk1LWU0ZTAtMjNjNTM5MTVjMzFh',
texts: ['Prandium', '', ''],
timeStart: '12:20:00',
timeEnd: '12:50:00',
dayOfWeekNumber: 3,
blockName: '',
},
{
guidId: 'OWVkM2RkYzktNjUwZi05YjI1LWRhMjktMDlhMTlkOTAwOTdj',
texts: ['M2FR', 'STT', 'G205'],
timeStart: '10:10:00',
timeEnd: '11:00:00',
dayOfWeekNumber: 4,
blockName: '',
},
{
guidId: 'MzhlZmEwMTQtNzA5Zi05ZjNlLWRhNmUtYzI1ZmMyMTJkODEz',
texts: ['MENTOR', 'MIZ,MAH,HAL', 'A251'],
timeStart: '14:10:00',
timeEnd: '14:40:00',
dayOfWeekNumber: 4,
blockName: '',
},
{
guidId: 'OTQ1MWFiN2EtYWM4ZC05OTFkLWM5MDktMmFiNjllNTk1MzRj',
texts: ['SV', 'MPH', 'G305'],
timeStart: '08:15:00',
timeEnd: '09:05:00',
dayOfWeekNumber: 4,
blockName: '',
},
{
guidId: 'MjFlYjFhODYtZTJlNC05MTA3LWY1YjItYjMzMjJlYjhhMGI5',
texts: ['Prandium', '', ''],
timeStart: '12:20:00',
timeEnd: '12:50:00',
dayOfWeekNumber: 4,
blockName: '',
},
{
guidId: 'ZGIzMmVmNGQtMzgzNy05M2UxLWQ5MjItNmNlM2RiODA1YjQy',
texts: ['SV', 'MPH', 'G305'],
timeStart: '09:10:00',
timeEnd: '10:05:00',
dayOfWeekNumber: 4,
blockName: '',
},
{
guidId: 'YjZkYzYzZDItNzFmMy05ZTc5LWRlZDQtM2E4NDA1ZWU5ZjZh',
texts: ['MA', 'DAG', 'A210'],
timeStart: '11:25:00',
timeEnd: '12:20:00',
dayOfWeekNumber: 4,
blockName: '',
},
{
guidId: 'ZjUxMGIyYjgtNTE0YS05MmUwLWRjOWMtNDA5NjUyZDMxODU4',
texts: ['SO', 'FEW', 'A208'],
timeStart: '12:55:00',
timeEnd: '14:00:00',
dayOfWeekNumber: 4,
blockName: '',
},
{
guidId: 'M2VkOTQ2NjAtNGYwNC05MjdlLWQyM2EtNmQwNmNlMzYyNTJi',
texts: ['Prandium', '', ''],
timeStart: '12:35:00',
timeEnd: '13:05:00',
dayOfWeekNumber: 5,
blockName: '',
},
{
guidId: 'M2ZlY2M2NjctNzljMS05ZTlkLWQ2MTQtODc5NzY0ZWQ3MGJk',
texts: ['IDH', 'ANB', 'IdA'],
timeStart: '11:00:00',
timeEnd: '12:20:00',
dayOfWeekNumber: 5,
blockName: '',
},
{
guidId: 'ZGQ2OTAyZGUtZWRlNS05Mzc5LWUxMWItY2MwYmY1NGJmN2Q4',
texts: ['EN', 'ANL', 'A245'],
timeStart: '09:35:00',
timeEnd: '10:30:00',
dayOfWeekNumber: 5,
blockName: '',
},
{
guidId: 'MWNkMTUyNjQtODY0OS05OGJhLWQ0YmItZTE2YjIzNTNhZTI4',
texts: ['MA', 'DAG', 'A210'],
timeStart: '08:35:00',
timeEnd: '09:30:00',
dayOfWeekNumber: 5,
blockName: '',
},
{
guidId: 'NTlkZGMzNmEtYTEzZS05Nzg3LWQ1YTEtMjZmNWFmNDIwNmNj',
texts: ['HKK', 'MIZ', 'HKK'],
timeStart: '13:35:00',
timeEnd: '15:45:00',
dayOfWeekNumber: 5,
blockName: '',
},
]
const days = [
'söndag', // yeah, they have us-type weeks in Skola24..
'måndag',
'tisdag',
'onsdag',
'torsdag',
'fredag',
'lördag',
]
const subjects = {
BL: 'Bild',
BI: 'Biologi',
EN: 'Engelska',
EV: 'Elevens val', // jag gissar
FY: 'Fysik',
GE: 'Geografi',
HKK: 'Hem- och konsumentkunskap',
HI: 'Historia',
IDH: 'Idrott och hälsa',
KE: 'Kemi',
MA: 'Matematik',
M1: 'Moderna språk', // will have extra language code
M2: 'Moderna språk', // will have extra language code
ML: 'Modersmål', // will have extra language code
M2FR: 'Franska',
MU: 'Musik',
RE: 'Religionskunskap',
SH: 'Samhällskunskap',
SL: 'Slöjd',
SV: 'Svenska',
SVA: 'Svenska som andraspråk',
TN: 'Teckenspråk för hörande',
TK: 'Teknik',
Prandium: 'Lunch',
}
const convert = (lessonInfo) =>
lessonInfo
.map(
({
guidId: id,
texts: [subject, teacher, room],
timeStart,
timeEnd,
dayOfWeekNumber: day,
}) => ({
id,
subjectCode: subject,
subject: subjects[subject] || subject,
teacher,
room,
date: moment()
.week(week)
.weekday(day)
.hours(timeStart.slice(0, 2))
.minute(timeStart.slice(3, 5)),
start: timeStart.slice(0, 5),
end: timeEnd.slice(0, 5),
day: days[day],
})
)
.sort((a, b) => a.date - b.date)
.reduce(
(week, item) => ({
...week,
[item.day]: [...(week[item.day] || []), item],
}),
{}
)
const LessonList = ({ lessons, header, ...props }) => (
<List
{...props}
data={lessons}
ListHeaderComponent={() => <Text category="c2">{header}</Text>}
renderItem={({ item: { id, subject, start, end, room } }) => (
<ListItem
key={id}
style={styles.item}
title={`${subject}`}
description={`${start} - ${end}
${room}`}
/>
)}
/>
)
export const Week = () => {
const data = convert(lessonInfo)
const [selectedIndex, setSelectedIndex] = React.useState()
return (
<View>
<TabBar
selectedIndex={selectedIndex}
onSelect={(index) => setSelectedIndex(index)}
>
{Object.entries(data).map(([dayName, day]) => (
<Tab title={dayName} />
))}
</TabBar>
{selectedIndex >= 0 ? (
<ViewPager
selectedIndex={selectedIndex}
onSelect={(index) => setSelectedIndex(index)}
>
{Object.entries(data).map(([dayName, day]) => (
<View style={styles.tab} key={dayName}>
<Card>
<Text category="c1">Börjar</Text>
<Text category="h3">{day[0].start}</Text>
<Text category="c1">Slutar</Text>
<Text category="h3">{day[day.length - 1].end}</Text>
<Text category="h2">{day.some(lesson => lesson.subjectCode === 'IDH') ? '🤼‍♀️': ''}</Text>
</Card>
<LessonList
style={styles.part}
header="FM"
lessons={day
.filter(({ start }) => start <= '12:00')
.sort((a, b) => a.date - b.date)}
/>
<LessonList
style={styles.part}
header="EM"
lessons={day
.filter(({ start }) => start >= '12:00')
.sort((a, b) => a.date - b.date)}
/>
</View>
))}
</ViewPager>
) : null}
</View>
)
}
const styles = StyleSheet.create({
tab: {
height: 200,
flexDirection: 'row',
},
item: {
height: 45,
},
part: {
width: '50%',
},
time: {
color: '#333',
fontSize: 9,
},
dayTab: {
textAlign: 'left',
},
})