From 4fba77ceda3698028abb5f5fd43b77160842755d Mon Sep 17 00:00:00 2001 From: Christian Landgren Date: Tue, 15 Dec 2020 02:38:36 +0100 Subject: [PATCH] continued learning react-native --- lerna-debug.log | 20 --- packages/api/index.js | 6 + packages/api/lib/backend.js | 5 + packages/api/lib/urls.js | 1 + packages/api/spec/skolplattformen-1.0.0.yaml | 46 +++++++ packages/app/App.js | 5 +- packages/app/assets/avatar.png | Bin 0 -> 23874 bytes packages/app/assets/logo_print.svg | 128 ++++++++++++++++++ packages/app/components/calendar.component.js | 41 ++++-- .../app/components/childList.component.js | 39 +++--- .../childTopNavigation.component.js | 63 +++++++++ packages/app/components/newsList.component.js | 45 +++--- packages/app/components/tabs.component.js | 16 +-- 13 files changed, 327 insertions(+), 88 deletions(-) delete mode 100644 lerna-debug.log create mode 100644 packages/app/assets/avatar.png create mode 100644 packages/app/assets/logo_print.svg create mode 100644 packages/app/components/childTopNavigation.component.js diff --git a/lerna-debug.log b/lerna-debug.log deleted file mode 100644 index 33d5b4d9..00000000 --- a/lerna-debug.log +++ /dev/null @@ -1,20 +0,0 @@ -0 silly argv { _: [ 'create' ], -0 silly argv lernaVersion: '3.22.1', -0 silly argv '$0': 'lerna', -0 silly argv name: 'app' } -1 notice cli v3.22.1 -2 verbose rootPath /Users/cln/src/skolplattformen -3 warn ENOREMOTE No git remote found, skipping repository property -4 error Error: canceled -4 error at Interface. (/Users/cln/.nvm/versions/node/v10.11.0/lib/node_modules/lerna/node_modules/read/lib/read.js:66:13) -4 error at Interface.emit (events.js:182:13) -4 error at Interface._ttyWrite (readline.js:783:16) -4 error at ReadStream.onkeypress (readline.js:168:10) -4 error at ReadStream.emit (events.js:182:13) -4 error at emitKeys (internal/readline.js:424:14) -4 error at emitKeys.next () -4 error at ReadStream.onData (readline.js:1022:36) -4 error at ReadStream.emit (events.js:182:13) -4 error at addChunk (_stream_readable.js:283:12) -4 error at readableAddChunk (_stream_readable.js:264:11) -4 error at ReadStream.Readable.push (_stream_readable.js:219:10) diff --git a/packages/api/index.js b/packages/api/index.js index 5a18f9eb..1cc1d242 100644 --- a/packages/api/index.js +++ b/packages/api/index.js @@ -92,6 +92,12 @@ api.register({ const schedule = await backend.getSchedule(childId, cookie) return res.status(200).json(schedule) }, + getClassmates: async (c, req, res) => { + const cookie = c.security.bearerAuth + const childId = c.request.params.order + const classmates = await backend.getClassmates(childId, cookie) + return res.status(200).json(classmates) + }, download: async (c, req, res) => { const cookie = c.security.bearerAuth const url = c.request.query.url diff --git a/packages/api/lib/backend.js b/packages/api/lib/backend.js index f7709953..2cbf8b32 100644 --- a/packages/api/lib/backend.js +++ b/packages/api/lib/backend.js @@ -52,6 +52,10 @@ const getSchedule = (childId, cookie) => fetchJson(urls.schedule(childId, moment .then(schedule => schedule.map(({title, id, description, location, longEventDateTime: startDate, longEndDateTime: endDate, allDayEvent: allDay, mentor}) => ({title, id, description, location, startDate, endDate, allDay, mentor}))) .catch(err => ({err})) +const getClassmates = (childId, cookie) => fetchJson(urls.classmates(childId), cookie) +.then(classmates => classmates.map(({sisId, firstname, lastname, location, guardians, className}) => ({sisId, firstname, lastname, location, guardians, className}))) +.catch(err => ({err})) + const getChildById = async (childId, cookie) => { const children = await getChildren() const child = children.find(c => c.id == childId) @@ -76,5 +80,6 @@ module.exports = { getNotifications, getMenu, getSchedule, + getClassmates, download } \ No newline at end of file diff --git a/packages/api/lib/urls.js b/packages/api/lib/urls.js index ff880029..9306e8a0 100644 --- a/packages/api/lib/urls.js +++ b/packages/api/lib/urls.js @@ -5,6 +5,7 @@ const urls = { //loginTarget: `https://login001.stockholm.se/NECSadc/mbid/b64startpage.jsp?startpage=aHR0cHM6Ly9ldGphbnN0LnN0b2NraG9sbS5zZS92YXJkbmFkc2hhdmFyZS9pbmxvZ2dhZDIvaGVt`, loginTarget: 'https://login003.stockholm.se/NECSadcmbid/authenticate/SiteMinderAuthADC?TYPE=33554433&REALMOID=06-42f40edd-0c5b-4dbc-b714-1be1e907f2de&GUID=&SMAUTHREASON=0&METHOD=GET&SMAGENTNAME=IfNE0iMOtzq2TcxFADHylR6rkmFtwzoxRKh5nRMO9NBqIxHrc38jFyt56FASdxk1&TARGET=-SM-HTTPS%3a%2f%2flogin001%2estockholm%2ese%2fNECSadc%2fmbid%2fb64startpage%2ejsp%3fstartpage%3daHR0cHM6Ly9ldGphbnN0LnN0b2NraG9sbS5zZS92YXJkbmFkc2hhdmFyZS9pbmxvZ2dhZDIvR2V0Q2hpbGRyZW4%3d', children: `${baseUrl}/vardnadshavare/inloggad2/GetChildren`, + classmates: childId => `${baseurl}/vardnadshavare/inloggad2/contacts/GetStudentsByClass?studentId=${childId}`, calendar: childId => `${baseUrl}/vardnadshavare/inloggad2/Calender/GetSchoolCalender?childId=${childId}&rowLimit=50`, user: `${baseUrl}/vardnadshavare/base/getuserdata`, news: childId => `${baseUrl}/vardnadshavare/inloggad2/News/GetNewsOverview?childId=${childId}`, diff --git a/packages/api/spec/skolplattformen-1.0.0.yaml b/packages/api/spec/skolplattformen-1.0.0.yaml index 45892777..7c05467a 100644 --- a/packages/api/spec/skolplattformen-1.0.0.yaml +++ b/packages/api/spec/skolplattformen-1.0.0.yaml @@ -189,6 +189,29 @@ paths: application/json: schema: $ref: "#/components/schemas/Calendar" + /children/{childSdsId}/classmates: + get: + summary: Classmates + operationId: getClassmates + description: Get list of class mates and guardians in this childs class + security: + - bearerAuth: [] + tags: + - Children + parameters: + - name: childId + in: path + description: Child Id (received from /children) + required: true + schema: + type: string + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: "#/components/schemas/Classmates" /children/{childSdsId}/notifications: get: summary: Notifications @@ -369,6 +392,29 @@ components: notifications: $ref: "#/components/schemas/Notifications" + Classmates: + type: array + items: + $ref: "#/components/schemas/Classmate" + Classmate: + type: object + properties: + sisId: + type: string + format: uuid + className: + type: string + description: The name of the class of this classmate + example: "8C" + firstname: + type: string + example: "Max" + lastname: + type: string + example: "Svensson" + guardians: + type: object + Notifications: type: array items: diff --git a/packages/app/App.js b/packages/app/App.js index bf043d22..85b3a84a 100644 --- a/packages/app/App.js +++ b/packages/app/App.js @@ -5,16 +5,17 @@ import { IconRegistry } from '@ui-kitten/components'; import { EvaIconsPack } from '@ui-kitten/eva-icons'; -import * as material from '@eva-design/material'; +import * as eva from '@eva-design/eva'; import customization from './design/customization.json'; import children from './output.json'; import {ChildList} from './components/childList.component' +import {AppNavigator} from './components/tabs.component' export default () => ( <> - + diff --git a/packages/app/assets/avatar.png b/packages/app/assets/avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..6a29d9d5bf7f6e7f6214a74dd9f45f7e57169593 GIT binary patch literal 23874 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 literal 0 HcmV?d00001 diff --git a/packages/app/assets/logo_print.svg b/packages/app/assets/logo_print.svg new file mode 100644 index 00000000..a49325ce --- /dev/null +++ b/packages/app/assets/logo_print.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/app/components/calendar.component.js b/packages/app/components/calendar.component.js index 07b65481..b77bf354 100644 --- a/packages/app/components/calendar.component.js +++ b/packages/app/components/calendar.component.js @@ -1,24 +1,35 @@ import React from 'react'; -import { StyleSheet, View } from 'react-native'; -import { Card, List, Text } from '@ui-kitten/components'; -import CalendarStrip from 'react-native-calendar-strip'; +import { StyleSheet } from 'react-native'; +import { Divider, List, ListItem, Icon, Text} from '@ui-kitten/components'; export const Calendar = ({calendar}) => { + + const renderItemIcon = (props) => ( + + ); + + const renderItem = ({ item }) => ( + + ); + + return ( - - - + ); }; const styles = StyleSheet.create({ - container: { flex: 1, height: 100 } + container: { + maxHeight: 200, + width: "100%" + }, }); \ No newline at end of file diff --git a/packages/app/components/childList.component.js b/packages/app/components/childList.component.js index d3cf7cce..41d7c60d 100644 --- a/packages/app/components/childList.component.js +++ b/packages/app/components/childList.component.js @@ -3,17 +3,26 @@ import { StyleSheet } from 'react-native'; import { Layout, Text, ViewPager, Button, Icon } from '@ui-kitten/components'; import { NewsList } from './newsList.component' import { Calendar } from './calendar.component' +import { ChildTopNavigation } from './childTopNavigation.component'; +import { BottomNavigation, BottomNavigationTab } from '@ui-kitten/components'; +const SelectCategory = ({child}) => { + + const [selectedIndex, setSelectedIndex] = React.useState(0); + + return ( + setSelectedIndex(index)}> + + + + + ); +}; export const ChildList = ({children}) => { const [selectedIndex, setSelectedIndex] = React.useState(0); - const renderShakeIcon = (props) => ( - - ) return ( { key={child.id} style={{...styles.tab}} level='2'> - { child.name} - + + + + )} @@ -45,9 +51,4 @@ const styles = StyleSheet.create({ alignItems: 'center', justifyContent: 'center', }, - button: { - flex: 1, - marginVertical: 10, - backgroundColor: "#FEF2DC" - } }); \ No newline at end of file diff --git a/packages/app/components/childTopNavigation.component.js b/packages/app/components/childTopNavigation.component.js new file mode 100644 index 00000000..ec470afe --- /dev/null +++ b/packages/app/components/childTopNavigation.component.js @@ -0,0 +1,63 @@ +import React from 'react' +import { StyleSheet, View } from 'react-native' +import { Avatar, Icon, MenuItem, OverflowMenu, Text, TopNavigation, TopNavigationAction } from '@ui-kitten/components' + +const MenuIcon = (props) => ( + +) + +const InfoIcon = (props) => ( + +) + +const LogoutIcon = (props) => ( + +) + +export const ChildTopNavigation = ({child}) => { + + const [menuVisible, setMenuVisible] = React.useState(false) + + const toggleMenu = () => { + setMenuVisible(!menuVisible) + } + + const renderMenuAction = () => ( + + ) + + const renderOverflowMenuAction = () => ( + + + + + + + + ) + + const renderTitle = (props) => ( + + + + {child.name} + + + ) + + return ( + + ) +} + +const styles = StyleSheet.create({ + titleContainer: { + flexDirection: 'row', + alignItems: 'center' + }, + logo: { + marginHorizontal: 16, + width: 16, + height: 16 + } +}) diff --git a/packages/app/components/newsList.component.js b/packages/app/components/newsList.component.js index 78d112b0..1fc18342 100644 --- a/packages/app/components/newsList.component.js +++ b/packages/app/components/newsList.component.js @@ -1,10 +1,11 @@ -import React from 'react'; -import { StyleSheet, View } from 'react-native'; -import { Card, List, Text } from '@ui-kitten/components'; -import Markdown from 'react-native-markdown-display'; - +import React from 'react' +import { StyleSheet, View } from 'react-native' +import { Card, List, Text } from '@ui-kitten/components' +import Markdown from 'react-native-markdown-display' +import { Image } from 'react-native-svg' -export const NewsList = ({news: data}) => { + +export const NewsList = ({news}) => { const renderItemHeader = (headerProps, info) => ( @@ -12,13 +13,13 @@ export const NewsList = ({news: data}) => { {info.item.header} - ); + ) const renderItemFooter = (footerProps, info) => ( Publicerad i Skolplattformen - ); + ) const renderItem = (info) => ( { status='basic' header={headerProps => renderItemHeader(headerProps, info)} footer={footerProps => renderItemFooter(footerProps, info)}> - + {decodeURIComponent(info.item.body)} - ); + ) return ( - ); -}; + data={news} + renderItem={renderItem} /> + ) +} const styles = StyleSheet.create({ - header:{ + header: { backgroundColor: '#fff', minHeight: 30, - padding: 3 + padding: 25 }, headerText: { color: '#000' @@ -58,12 +55,12 @@ const styles = StyleSheet.create({ maxHeight: '100%' }, contentContainer: { - paddingVertical: 4, + paddingVertical: 4 }, item: { - marginVertical: 4, + marginVertical: 4 }, footer: { - backgroundColor: '#000', + backgroundColor: '#000' } -}); \ No newline at end of file +}) diff --git a/packages/app/components/tabs.component.js b/packages/app/components/tabs.component.js index 3b7c282d..a8160a93 100644 --- a/packages/app/components/tabs.component.js +++ b/packages/app/components/tabs.component.js @@ -2,14 +2,14 @@ import React from 'react'; import { NavigationContainer } from '@react-navigation/native'; import { createMaterialTopTabNavigator } from '@react-navigation/material-top-tabs'; import { TabBar, Tab, Layout, Text } from '@ui-kitten/components'; -import { NewsList } from './newsList.component'; +import { ChildList } from './childList.component'; +import { DetailsScreen } from './details.component'; const { Navigator, Screen } = createMaterialTopTabNavigator(); -const NewsScreen = ({child}) => ( +const ChildScreen = ({data}) => ( Nyheter - ); @@ -22,15 +22,15 @@ const TopTabBar = ({ navigation, state }) => ( ); -const TabNavigator = () => ( +const TabNavigator = ({children}) => ( }> - - + + ); -export const AppNavigator = () => ( +export const AppNavigator = ({children}) => ( - + ); \ No newline at end of file