diff --git a/my-app/package-lock.json b/my-app/package-lock.json index e40eff3c54d179826e0ae0bf0d9b211e984f3303..29a0e033bb87d8ea6ec7e86381eda6ada333dfdd 100644 --- a/my-app/package-lock.json +++ b/my-app/package-lock.json @@ -18,6 +18,7 @@ "react-redux": "^8.0.5", "react-scripts": "5.0.1", "redux": "^4.2.0", + "redux-thunk": "^2.4.2", "web-vitals": "^2.1.4" } }, @@ -14572,6 +14573,14 @@ "@babel/runtime": "^7.9.2" } }, + "node_modules/redux-thunk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz", + "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==", + "peerDependencies": { + "redux": "^4" + } + }, "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", diff --git a/my-app/package.json b/my-app/package.json index 29f593b496df6e9b537e6455eef0ce122bf6d1de..11177b9bf24fac42543b0c4d5dbfe2f8577017c7 100644 --- a/my-app/package.json +++ b/my-app/package.json @@ -13,6 +13,7 @@ "react-redux": "^8.0.5", "react-scripts": "5.0.1", "redux": "^4.2.0", + "redux-thunk": "^2.4.2", "web-vitals": "^2.1.4" }, "scripts": { diff --git a/my-app/src/App.js b/my-app/src/App.js index 6adc924cb8217ec6880dc4ffcadc145ddd944ce8..033b731f97727e54f0d107bf1f7170edbca078f9 100644 --- a/my-app/src/App.js +++ b/my-app/src/App.js @@ -1,16 +1,34 @@ -import React from 'react'; +import React, { Component } from 'react'; import './App.css'; import TopMenu from './components/TopMenu'; -// import PublicPage from './components/PublicPage'; -import BlankPage from './components/blankPage'; +import PublicPage from './components/PublicPage'; +import PrivatePage from './components/PrivatePage'; +import { connect } from 'react-redux'; -function App() { - return ( - <div className="App"> - <TopMenu /> - <BlankPage /> - </div> - ); +const mapStateToProps = state => { + return state } -export default App; +class App extends Component { + + render() { + + const user = this.props.user + let workspace; + if (user) { + workspace = <PrivatePage /> + } else { + workspace = <PublicPage /> + } + + return ( + <div className="App"> + <TopMenu /> + {workspace} + </div> + ); + } +} + + +export default connect(mapStateToProps)(App); diff --git a/my-app/src/actions/AuthenticationActions.js b/my-app/src/actions/AuthenticationActions.js new file mode 100644 index 0000000000000000000000000000000000000000..9082864d93f64d09e6e6919a3ca73d02a0908ceb --- /dev/null +++ b/my-app/src/actions/AuthenticationActions.js @@ -0,0 +1,109 @@ +export const SHOW_LOGIN_DIALOG = 'SHOW_LOGIN_DIALOG'; +export const HIDE_LOGIN_DIALOG = 'HIDE_LOGIN_DIALOG'; + +export const AUTHENTICATION_PENDING = 'AUTHENTICATION_PENDING' +export const AUTHENTICATION_SUCCESS = 'AUTHENTICATION_SUCCESS' +export const AUTHENTICATION_ERROR = 'AUTHENTICATION_ERROR' + +export function getShowLoginDialogAction() { + return { + type: SHOW_LOGIN_DIALOG + } +} + +export function getHideLoginDialogAction() { + return { + type: HIDE_LOGIN_DIALOG + } +} + +export function getAuthenticationPendingAction() { + return { + type: AUTHENTICATION_PENDING + } +} + +export function getAuthenticationSuccessAction(userSession) { + return { + type: AUTHENTICATION_SUCCESS, + user: userSession.user, + accessToken: userSession.accessToken + } +} + +export function getAuthenticationErrorAction(error) { + return { + type: AUTHENTICATION_ERROR, + error: error + } +} + +export function authenticateUser(userID, password) { + + console.log("Authenticate") + + return dispatch => { + dispatch(getAuthenticationPendingAction()); + login(userID, password) + .then( + userSession => { + const action = getAuthenticationSuccessAction(userSession); + dispatch(action); + }, + error => { + dispatch(getAuthenticationErrorAction(error)); + } + ) + .catch(error => { + dispatch(getAuthenticationErrorAction(error)) + }) + } +} + +function login(userID, password) { + const requestOptions = { + method: 'GET', + headers: { 'Authorization': 'Basic ' + btoa(userID + ":" + password) } + }; + + console.log(userID) + console.log(password) + + return fetch('https://localhost/api/authenticate', requestOptions) + .then(handleResponse) + .then(userSession => { + return userSession + }); +} + +function handleResponse(response) { + const authorizationHeader = response.headers.get('Authorization'); + + return response.text().then(text => { + console.log('Receive result: ' + authorizationHeader) + + const data = text && JSON.parse(text); + var token + if (authorizationHeader) { + token = authorizationHeader.split(" ")[1]; + } + + if (!response.ok) { + if (response.status === 401) { + logout(); + } + const error = (data && data.message) || response.statusText; + return Promise.reject(error); + } else { + let userSession = { + user: data, + accessToken: token + } + return userSession + } + }); +} + +function logout() { + console.error('Should irgendas') +} \ No newline at end of file diff --git a/my-app/src/components/PrivatePage.js b/my-app/src/components/PrivatePage.js new file mode 100644 index 0000000000000000000000000000000000000000..573ba7689847c5915909691554ecd9a610758133 --- /dev/null +++ b/my-app/src/components/PrivatePage.js @@ -0,0 +1,13 @@ +import React, { Component } from "react"; + +class PrivatePage extends Component { + render() { + return ( + <div> + <h1>PSSSST thats private!</h1> + </div> + ) + } +} + +export default PrivatePage \ No newline at end of file diff --git a/my-app/src/components/PublicPage.js b/my-app/src/components/PublicPage.js index ff5a08c7232fbbfbfefe26a29467c22ae62fe4c5..2d8c6b91f3e37f32908ef7a8810275f8f7aae185 100644 --- a/my-app/src/components/PublicPage.js +++ b/my-app/src/components/PublicPage.js @@ -1,258 +1,11 @@ import React, { Component } from "react"; +import LoginButton from "./loginButton"; class PublicPage extends Component { - render() { return ( - - <div> - <head> - - <meta charset="utf-8" /> - - - - - <title>Startseite: BHT Berlin</title> - <meta name="generator" content="TYPO3 CMS" /> - <meta name="viewport" content="width=device-width, initial-scale=1.0" /> - <meta name="robots" content="index,follow" /> - <meta name="description" content="Studiere Zukunft: Die staatliche Berliner Hochschule für Technik (BHT) bietet über 70 Studiengänge in den angewandten Ingenieur-, Natur- und Wirtschaftswissenschaften." /> - <meta name="keywords" content="Beuth,Hochschule,BHT,BHTB,Fachhochschule,Berlin,Studium,Forschung,Technik,TFH, Technische Fachhochschule Berlin, Berlin-Wedding, Ingenieurwissenschaften, Naturwissenschaften, Wirtschaftswissenschaften, Studieren, Bachelor, Master" /> - - - <link rel="stylesheet" type="text/css" href="/typo3conf/ext/hdb/Resources/Public/Css/style.css?1554138479" media="all" /> - <link rel="stylesheet" type="text/css" href="/typo3temp/assets/compressed/merged-6bb1364797fc71937f4a4d057c9767f0-0970230cbfe33acfcbab940914127793.css?1670417968" media="all" /> - - - - <script src="/typo3temp/assets/compressed/merged-0f1b354c11bff5cc2f0d405cba4b051d-d6974f58829b648d050584e3aa003b89.js?1629381060" type="text/javascript"></script> - - - <link rel="canonical" href="https://www.bht-berlin.de/" /> - - <link rel="apple-touch-icon" href="/fileadmin/tmpl/apple-touch-icon.png" /><meta property="og:image" content="https://www.bht-berlin.de/configuration/Resources/Public/assets/images/BHT_Logo_og.png" /> - </head> - - <body id="top" class="startseite page-3001"> - <div id="page" class="startseite"> - - - <div class="noscreen printlogo"> - <img src="/configuration/Resources/Public/assets/images/BHT_Logo_print.png" alt="" class="printlogo" /> - </div> - - <header id="header"> - <div id="openCampus"> - - <nav id="servicemenu" class="hide-for-small"> - <a class="invisible" href="#skipNavigation1">Navigation überspringen</a> - <div class="row"> - <div class="col-md-5"> - <ul> - <li> - <a title="Schnellzugriff" class="open-1 header-link" href="#header" data-tab-content-url="/index.php?id=3001&type=2343">Schnellzugriff</a> - <a title="Schnellzugriff" class="close-1" href="#">Schnellzugriff</a> - </li> <li> - <a title="Informationen für …" class="open-3 openCampus-link" href="#openCampus" data-tab-content-url="/index.php?id=3001&type=2342">Informationen für …</a> - <a title="Informationen für …" class="close-3" href="#">Informationen für …</a> - </li> - </ul> - </div> - <div class="col-md-3"> - <form name="f1" id="f1" title="Volltextsuche" action="/suche"><input type="text" name="q" class="text" placeholder="mit Google™ suchen" autofocus /><input type="hidden" name="ie" value="UTF-8" /></form> - </div> - <div class="col-md-4"> - <ul class="right ul_sprachschalter" ><li class="active"><span>DE</span></li><li class="lang"><a href="/en/">EN</a></li><li class="last"><a href="/a-z">A-Z</a></li></ul> - </div> - </div> - <a class="invisible" id="skipNavigation1"> </a> - </nav> - - <nav id="mobilemenu" class="show-for-small"> - <a class="invisible" href="#skipNavigation2">Navigation überspringen</a> - <div class="inside row"> - <div class="col-12"> - <a title="Men� �ffnen" class="toggle-mmenu-1 open" href="#mmenu-1"><i class="fa fa-bars"></i></a> - <a title="Startseite" class="home" href="/"><i class="fa fa-home"></i></a> - <a title="Suche" class="searchmobile" href="/suche"><i class="fa fa-search"></i></a><ul class="right ul_sprachschalter" ><li class="mobil_sprachschalter active"><span>DE</span></li><li class="mobil_sprachschalter"><a href="/en/">EN</a></li></ul> - </div> - </div> - <a class="invisible" id="skipNavigation2"> </a> - </nav> - - <div id="fachbereiche-einrichtungen"> - <div class="inside"> - <div class="mod_article block" id="fachbereiche-einrichtungen-content"></div> - </div> - </div> - - - <div id="campus"> - <div class="inside"> - <div id="campus-content" class="mod_article block"></div> - </div> - </div> - - - - </div> - </header> - </div> - <div> - - <section class="mod_flexSlider block"> - <div class="flex-caption"> - - </div> - - - <div class="light"> - <div id="slider-startseite" class="flexslider"> - <a name="c24472" id="anker24472"></a> - <div id="c24472" class="frame frame-default frame-type-dce_dceuid1 frame-layout-0"> - <div class="tx-dce-pi1"> - <div id="topSlider" class="flexslider"> - <ul class="slides"> - <li> - <a href="/weihnachtskarte"><img alt="Die BHT wünscht frohe Festtage" src="/fileadmin/images/startseite/BHT-Webseite_Weihnachten22.png" width="1024" height="320" /> - </a> - </li> - <li> - <a href="/magazin"> - <img title="BHT. Campus-Magazin 2/2022" alt="BHT. Campus-Magazin 2/2022" src="/fileadmin/_processed_/b/d/csm_header_bht-magazin_2022-2_f1b19f2931.png" width="1024" height="320" /> - </a> - </li> - <li> - <a href="https://www.bht-berlin.de/3331/article/8344" target="_blank"> - <img title="BHT-Top 5 beliebteste Studiengänge" alt="BHT-Top 5 beliebteste Studiengänge" src="/fileadmin/_processed_/b/9/csm_BHT-Webseite_Top5Studiengaenge2_283bc5feaa.png" width="1024" height="320" /> - </a> - </li> - <li> - <a href="https://www.bht-berlin.de/3794" target="_blank"> - <img title="Bilder Lange Nacht der Wissenschaften 2022" alt="Bilder Lange Nacht der Wissenschaften 2022" src="/fileadmin/_processed_/c/8/csm_BHT-Webseite-Header_Startseite2_a9b57201f2.png" width="1024" height="320" /> - </a> - </li> - </ul> - </div> - </div> - </div> - </div> - </div> - </section> - </div> - - <div id="container"> - <div id="main"> - <div class="inside"> - <div class="mod_article zielnavbar alpha block" id="zielgruppe"> - </div> - - <div class="contentBlock"> - - <div class="row"> - <div class="col"> - <a name="c19602" id="anker19602"></a> - <div id="c19602" class="frame frame-default frame-type-list frame-layout-0"><div class="news"><div class="row row-eq-height newsBoxen newsBlock"> - <div class="col-md-4"><div><a title="Energiekrise: Die BHT spart" href="/3326/article/8562"><div class="newsImageLast"><img class="img-responsive" src="/fileadmin/_processed_/4/a/csm_2022-12-20_BHT-Spart_AdobeStock_193324751_335487e3b6.jpg" width="709" height="473" alt="" /></div></a><div class="teaserTxt" itemscope="itemscope" itemtype="http://schema.org/Article"><h3 itemprop="headline"><a title="Energiekrise: Die BHT spart" href="/3326/article/8562"> - Energiekrise: Die BHT spart - </a></h3><p>Die Energiekrise zwingt uns alle zum Handeln. Die Berliner Hochschule für Technik (BHT) steht für Klimaschutz und Nachhaltigkeit und setzt 2022/2023 verantwortungsbewusst einige kurz- und mittelfristigen Maßnahmen um, mit denen gezielt Energie gespart wird. <a title="Energiekrise: Die BHT spart" href="/3326/article/8562">mehr…</a></p></div></div></div> - <div class="col-md-4"><div><a title="VDI-Preis für flexibles Konferenzsystem" href="/3326/article/8536"><div class="newsImageLast"><img class="img-responsive" src="/fileadmin/_processed_/4/6/csm_2022-12-08_VDI-Wettbewerb-Ehrung_0313c7ad24.jpg" width="709" height="473" alt="" /></div></a><div class="teaserTxt" itemscope="itemscope" itemtype="http://schema.org/Article"><h3 itemprop="headline"><a title="VDI-Preis für flexibles Konferenzsystem" href="/3326/article/8536"> - VDI-Preis für flexibles Konferenzsystem - </a></h3><p>Ein Tool, das die Eventbranche revolutionieren könnte: Im Rahmen seiner Bachelorarbeit erarbeitete BHT-Student Yannick Mick ein System, das hybride Veranstaltungen flexibler gestalten soll – und gewann dafür einen Preis des Berlin-Brandenburger VDI-Nachwuchswettbewerbes. <a title="VDI-Preis für flexibles Konferenzsystem" href="/3326/article/8536">mehr…</a></p></div></div></div> - <div class="col-md-4"><div><a title="Entspannter durch das Studium" href="/3326/article/8530"><div class="newsImageLast"><img class="img-responsive" src="/fileadmin/_processed_/8/b/csm_2022-12-06_heyjura_e9ff2073de.jpg" width="709" height="473" alt="" /></div></a><div class="teaserTxt" itemscope="itemscope" itemtype="http://schema.org/Article"><h3 itemprop="headline"><a title="Entspannter durch das Studium" href="/3326/article/8530"> - Entspannter durch das Studium - </a></h3><p>Kurz und knackig juristische Lerninhalte zusammenstellen und bündeln: Der BHT-Student Jackson Adewale und sein Team wollen mithilfe ihres Startups heyJura die digitale Bildung nachhaltig verändern – und Studierende im Jurastudium unterstützen. <a title="Entspannter durch das Studium" href="/3326/article/8530">mehr…</a></p></div></div></div></div></div></div> - - <a name="c12966" id="anker12966"></a> - <div id="c12966" class="frame frame-default frame-type-text frame-layout-0"><p><a href="/aktuelles" class="btn">Weitere News</a></p></div> - - <a name="c31368" id="anker31368"></a><div class="greenBackground"> - <div id="c31368" class="frame frame-100 frame-type-gridelements_pi1 frame-layout-0"><div class="row"><div class="col-12"></div></div><div class="row"><div class="col-lg-6"><a name="c31370" id="anker31370"></a><div id="c31370" class="frame frame-default frame-type-image frame-layout-0 frame-space-before-medium"><div class="ce-image ce-center ce-above"><div class="ce-gallery" data-ce-columns="1" data-ce-images="1"><div class="ce-outer"><div class="ce-inner"><div class="galleryRow"><div class="galleryCol"><figure class="image"><a href="/coronavirus" title="Informationen zum Coronavirus"><img class="image-embed-item" title="Informationen zum Coronavirus" src="/fileadmin/images/startseite/bilder/2020-03-13_coronainformation.jpg" width="963" height="642" alt="" /></a></figure></div></div></div></div></div></div></div><a name="c31366" id="anker31366"></a><div id="c31366" class="frame frame-default frame-type-text frame-layout-0"><header><h4 class=""> - Covid-19 - </h4></header><p>Aktuelle Informationen zum Coronavirus sowie FAQs für Studium, Lehre, Forschung und Verwaltung finden Sie hier:</p><p><a href="/coronavirus/faq-fuer-studierende" title="Coronavirus: FAQ für Studierende" class="internal-link"><i class="fa fa-share-square"></i> FAQ für Studierende</a></p><p><a href="/coronavirus/faq-fuer-lehrende" title="Coronavirus: FAQ für Lehrende" class="internal-link"><i class="fa fa-share-square"></i> </a><a href="/coronavirus/faq-fuer-lehrende" title="Coronavirus: FAQ für Lehrende" class="internal-link">FAQ für Lehrende</a></p><p><a href="/coronavirus/faq-fuer-mitarbeitende" title="Coronavirus: FAQ für Mitarbeitende" class="internal-link"><i class="fa fa-share-square"></i> </a><a href="/coronavirus/faq-fuer-mitarbeitende" title="Coronavirus: FAQ für Mitarbeitende" class="internal-link">FAQ für Mitarbeitende</a></p></div></div><div class="col-lg-6"><a name="c31361" id="anker31361"></a><div id="c31361" class="frame frame-default frame-type-image frame-layout-0 frame-space-before-medium"><div class="ce-image ce-center ce-above"><div class="ce-gallery" data-ce-columns="1" data-ce-images="1"><div class="ce-outer"><div class="ce-inner"><div class="galleryRow"><div class="galleryCol"><figure class="image"><a href="/leitbild" title="BHT Leitbild"><img class="image-embed-item" title="BHT Leitbild" alt="BHT Leitbild" src="/fileadmin/images/startseite/bilder/2022_leitbild-startseite.png" width="963" height="642" /></a></figure></div></div></div></div></div></div></div><a name="c31362" id="anker31362"></a><div id="c31362" class="frame frame-default frame-type-text frame-layout-0"><header><h4 class=""> - Unser Leitbild - </h4></header><p>Hochschule gestalten, Vielfalt leben, Zukunft entwickeln – das sind die Kernthemen unseres Leitbildes, welches 2021 neu erarbeitet wurde. Erfahren Sie, wie Studierende, Mitarbeitende und Lehrende das Leitbild leben.</p></div><a name="c31363" id="anker31363"></a><div id="c31363" class="frame frame-default frame-type-text frame-layout-0"><p><a href="/leitbild" class="btn">zum Leitbild</a></p></div></div></div></div> - - </div><a name="c12626" id="anker12626"></a> - <div id="c12626" class="frame frame-default frame-type-list frame-layout-0"><header><h3 class=""> - Kalender - </h3></header><div class="tx-cal-controller "><div class="list-view owl-cal-carousel owl-theme row"> - <div class="vevent col startseite-cal"><div class="dtstart-container-slider">21.12.2022 13:00 Uhr</div> - <div class="summary"> - <h2> - <a href="/item/cal/event/detail/2022/12/21/176?cHash=a535cbc022730c9d34bea992b3937f73" title="(Berufs-)Beratung für Studierende und Absolvent*innen" class="url">(Berufs-)Beratung für Studierende und Absolvent*innen</a></h2></div><div><p>Offene Sprechstunde mit Ursula Scheele, Berufsberaterin/Hochschulberatung</p></div></div><div class="vevent col startseite-cal"><div class="dtstart-container-slider">12.01.2023 17:00 Uhr</div><div class="summary"><h2><a href="/item/cal/event/detail/2023/01/12/1604?cHash=d090e7477a94cdebd4be67bc55671c38" title="HealthTEC: Technik trifft Medizin" class="url">HealthTEC: Technik trifft Medizin</a></h2></div><div><p>Forum zum hochschulinternen Austausch im Bereich Gesundheit</p></div></div><div class="vevent col startseite-cal"><div class="dtstart-container-slider">25.01.2023 </div><div class="summary"><h2><a href="/item/cal/event/detail/2023/01/25/1598?cHash=fe244caa692d4f6d935256b903bdbcc1" title="Lunchtalk #14: MINT-VR-Labs – Laborübungen im virtuellen Raum – Blick in die vernetzte Arbeitswelt der Zukunft" class="url">Lunchtalk #14: MINT-VR-Labs – Laborübungen im virtuellen Raum – Blick in die vernetzte Arbeitswelt der Zukunft</a></h2></div><div><p>Plattform Forschung & Transfer</p></div></div> - <div class="vevent col startseite-cal"><div class="dtstart-container-slider">08.02.2023 - 08.02.2024</div> - <div class="summary"><h2><a href="/item/cal/event/detail/2023/02/08/1599?cHash=0bf9312d39b5f50b19ae6b1890781cf2" title="Lunchtalk #15: KInsekt" class="url">Lunchtalk #15: KInsekt</a></h2></div><div><p>Plattform Forschung & Transfer</p></div></div></div> - <div class="owl-cal-carousel-navigation"> - <a class="btn prev"> - <i class="fa fa-chevron-left icon-chevron-left icon-white"> - - </i> - </a> - <a class="btn next"> - <i class="fa fa-chevron-right icon-chevron-right icon-white"></i> - </a> - </div> - - </div></div> - - <a name="c12686" id="anker12686"></a> - <div id="c12686" class="frame frame-default frame-type-text frame-layout-0"><p class="noMargin"><a href="/events" class="btn">Weitere Termine</a></p></div> - - </div> - </div> - - - </div> - - <a name="c21" id="anker21"></a> - <div id="c21" class="frame frame-default frame-type-html frame-layout-0"><div class="socialicons"><ul><li><a href="https://www.facebook.com/BHTbln" title="Facebook" target="_blank"><i class="fa fa-facebook-square fa-2x"></i></a></li><li><a href="https://twitter.com/BHT_bln" title="Twitter" target="_blank"><i class="fa fa-twitter fa-2x"></i></a></li><li><a href="https://www.youtube.com/BHTbln" title="YouTube" target="_blank"><i class="fa fa-youtube fa-2x"></i></a></li><li><a href="https://instagram.com/bht_studierezukunft/" title="Instagram" target="_blank"><i class="fa fa-instagram fa-2x"></i></a></li><li><a href="javascript:window.print()" title="Drucken"><i class="fa fa-print fa-2x"></i></a></li></ul></div></div> - - - </div> - </div> - </div> - - <footer id="footer"> - <div class="inside"> - - <nav class="mod_sitemap"> - - <ul class="row"><li class="submenu fs first col"><a href="/studium">Studium</a><ul class="level_2"><li><a href="/studiengaenge">Studiengänge</a></li><li><a href="/bewerbung">Bewerbung</a></li><li><a href="/40">Vor dem Studium</a></li><li><a href="/398">Studierendenservice</a></li><li><a href="/175">Internationales</a></li><li><a href="/3184">Studienorganisation</a></li></ul></li><li class="col"><a href="/weiterbildung">Weiterbildung</a><ul class="level_2"><li><a href="/fsi">Fernstudieninstitut</a></li><li><a href="/master-fernstudiengaenge">Fernstudiengänge</a></li><li><a href="/weiterbildung-fernstudium">Zertifikatskurse</a></li><li><a href="/weiterbildungsseminare">Präsenzseminare</a></li><li><a href="/fsi-anmeldung">Anmeldung</a></li><li><a href="/foerderung">Fördermöglichkeiten</a></li></ul></li><li class="col"><a href="/forschung">Forschung</a><ul class="level_2"><li><a href="/3117">Forschungsschwerpunkte</a></li><li><a href="/4503">Forschungsverbünde</a></li><li><a href="/3115">Forschungsservice</a></li><li><a href="/forschungstag">Forschungs- und Transfertag</a></li><li><a href="/nwz">Nachwuchsförderung und wissenschaftliche Zusammenarbeit</a></li><li><a href="/promotion">Promotion</a></li><li><a href="/technologietransfer">Technologietransfer</a></li><li><a href="/gruenden">Gründung</a></li></ul></li><li class="submenu subnavileft col"><a href="/3005">Hochschule</a><ul class="level_2"><li><a href="/name">Neuer Name</a></li><li><a href="/portraet">Porträt</a></li><li><a href="/3089">Organisation</a></li><li><a href="/3055">Einrichtungen</a></li><li><a href="/3005/campus">Campus</a></li><li><a href="/572">Menschen</a></li><li><a href="/karriere">Karriere</a></li></ul></li><li class="last col"><a href="/news">Aktuelles</a><ul class="level_2"><li><a href="/news">Aktuelle Meldungen</a></li><li><a href="/events">Veranstaltungskalender</a></li><li><a href="/jobs">Stellenausschreibungen</a></li><li><a href="/magazin">Magazin</a></li><li><a href="/pressespiegel">Pressespiegel</a></li></ul></li></ul> - - </nav> - - - <div class="ce_text col-2 block"> - - </div> - - </div> - - <div id="copyright"> - <div class="inside row"> - <div class="col"> - <a name="c19" id="anker19"></a> - <div id="c19" class="frame frame-default frame-type-text frame-layout-0"><p>© 2022 Berliner Hochschule für Technik</p></div> - - - </div> - <div class="col"> - <a name="c20" id="anker20"></a> - <div id="c20" class="frame frame-default frame-type-text frame-layout-0"><p><a href="/impressum" title="Impressum" class="internal-link">Impressum</a> – <a href="/datenschutz" title="Datenschutzerklärung" class="internal-link">Datenschutz</a> – <a href="/barrierefreiheit" title="Erklärung zur digitalen Barrierefreiheit" class="internal-link">Barrierefreiheit</a></p></div> - - - </div> - </div> - </div> - </footer> - - - - - </body > + <LoginButton /> </div> ) } diff --git a/my-app/src/components/TopMenu.js b/my-app/src/components/TopMenu.js index 7811cd1ef0d1b2aed27c36b867f540afe52b3100..084ff19260367d7b6d3375279e1c2314f67f9527 100644 --- a/my-app/src/components/TopMenu.js +++ b/my-app/src/components/TopMenu.js @@ -9,7 +9,7 @@ class TopMenu extends Component { return ( <div> <Navbar bg="light" expand="lg"> - <Navbar.Brand href="#home">React-Bootstrap</Navbar.Brand> + <Navbar.Brand href="#home">BHT</Navbar.Brand> <Navbar.Toggle aria-controls="basic-navbar-nav" /> <Navbar.Collapse id="basic-navbar-nav"> <Nav className="mr-auto"> diff --git a/my-app/src/components/blankPage.js b/my-app/src/components/blankPage.js deleted file mode 100644 index 43eae9e6d67e98721ca9e63a11400591fc0e15bc..0000000000000000000000000000000000000000 --- a/my-app/src/components/blankPage.js +++ /dev/null @@ -1,14 +0,0 @@ -import React, { Component } from "react"; -import LoginButton from "./loginButton"; - -class blankPage extends Component { - render() { - return ( - <div> - <LoginButton /> - </div> - ) - } -} - -export default blankPage \ No newline at end of file diff --git a/my-app/src/components/loginButton.js b/my-app/src/components/loginButton.js index 9796e26512d474a3de1b26976df17b2b5ecc8849..a4e8ef83a43acb63abcea2e4e316493d77fa159b 100644 --- a/my-app/src/components/loginButton.js +++ b/my-app/src/components/loginButton.js @@ -1,7 +1,9 @@ import React, { Component } from "react"; import Button from "react-bootstrap/esm/Button"; + import { connect } from "react-redux"; +import { getShowLoginDialogAction } from "../actions/AuthenticationActions"; class loginButton extends Component { constructor(props) { @@ -11,13 +13,13 @@ class loginButton extends Component { showLoginDialog() { const dispatch = this.props.dispatch; - dispatch() + dispatch(getShowLoginDialogAction()) } render() { return ( <div> - <Button variant="light" onClick={this.showLoginDialog}> + <Button variant="light" onClick={this.showLoginDialog} id="OpenLoginDialogButton"> Login </Button> </div> diff --git a/my-app/src/components/userSessionWidget.js b/my-app/src/components/userSessionWidget.js index c8cd333c696c84d6fe0d78907acb0030a246222a..6fae2848689a0bad5df946c2e3095396669db3a6 100644 --- a/my-app/src/components/userSessionWidget.js +++ b/my-app/src/components/userSessionWidget.js @@ -1,44 +1,92 @@ -import React, { Component } from "react"; import Button from "react-bootstrap/esm/Button"; import Modal from "react-bootstrap/Modal"; +import Form from 'react-bootstrap/Form'; + +import React, { Component } from "react"; +import { connect } from "react-redux"; +import { bindActionCreators } from "redux"; + +import * as authenticationActions from '../actions/AuthenticationActions' + +const mapStateToProps = state => { + return state; +} class userSessionWidget extends Component { constructor(props) { super(props) - this.state = {show: false}; + this.state = { + username: '', + password: '' + }; this.handleShow = this.handleShow.bind(this); this.handleClose = this.handleClose.bind(this); + this.handleChange = this.handleChange.bind(this); + this.handleSubmit = this.handleSubmit.bind(this); } handleShow(e) { e.preventDefault(); - this.setState({show: true}) + const { showLoginDialogAction } = this.props; + showLoginDialogAction(); + } + + handleClose() { + const { hideLoginDialogAction } = this.props; + hideLoginDialogAction(); + } + + handleChange(e) { + const { name, value } = e.target; + this.setState({ [name]: value }) + console.log(JSON.stringify(this.state)) } - handleClose(e) { + handleSubmit(e) { e.preventDefault(); - this.setState({show: false}) + const { username, password } = this.state; + const { authenticateUserAction } = this.props; + authenticateUserAction(username, password); + console.log(username) + console.log(password) + console.log("Pushed Submit") } render() { + + var showDialog = this.props.showLoginDialog + if (showDialog === undefined) { + showDialog = false + } return ( <div> - <Button variant="primary" onClick={this.handleShow}> + <Button variant="primary" onClick={this.handleShow} id="OpenLoginDialogButton"> Login </Button> - <Modal show={this.state.show} onHide={this.handleClose}> + <Modal show={showDialog} onHide={this.handleClose} id="LoginDialog"> <Modal.Header closeButton> - <Modal.Title>Modal title</Modal.Title> + <Modal.Title>Login</Modal.Title> </Modal.Header> - <Modal.Body> - <p>Modal body text goes here.</p> + <Form> + <Form.Group className="mb-3"> + <Form.Label>Email address</Form.Label> + <Form.Control type="email" placeholder="Enter email" name='username' onChange={this.handleChange} id="LoginDialogUserIDText"/> + </Form.Group> + + <Form.Group className="mb-3"> + <Form.Label>Password</Form.Label> + <Form.Control type="password" placeholder="Password" name='password' onChange={this.handleChange} id="LoginDialogPasswordText"/> + </Form.Group> + <Button variant="primary" type="submit" onClick={this.handleSubmit} id="PerformLoginButton"> + Submit + </Button> + </Form> </Modal.Body> <Modal.Footer> - <Button variant="secondary" onClick={this.handleClose}>Close</Button> - <Button variant="primary" onClick={this.handleShow}>Save changes</Button> + Passwort vergessen? </Modal.Footer> </Modal> </div> @@ -46,4 +94,11 @@ class userSessionWidget extends Component { } } -export default userSessionWidget \ No newline at end of file +const mapDispatchToProps = dispatch => bindActionCreators({ + showLoginDialogAction: authenticationActions.getShowLoginDialogAction, + hideLoginDialogAction: authenticationActions.getHideLoginDialogAction, + authenticateUserAction: authenticationActions.authenticateUser +}, dispatch) + +const ConnectedUserSessionWidget = connect(mapStateToProps, mapDispatchToProps)(userSessionWidget) +export default ConnectedUserSessionWidget \ No newline at end of file diff --git a/my-app/src/index.js b/my-app/src/index.js index 2e275e56c06bae2e76dbbfe34cb3897b4644b4a5..11f8876a36432f52de7beb5eead8d128c175d403 100644 --- a/my-app/src/index.js +++ b/my-app/src/index.js @@ -1,16 +1,24 @@ import React from 'react'; import ReactDOM from 'react-dom/client'; -import { createStore } from 'redux' +import { createStore, applyMiddleware } from 'redux' import { Provider } from 'react-redux' +import thunk from 'redux-thunk'; + import './index.css'; import App from './App'; import reportWebVitals from './reportWebVitals'; import '../node_modules/bootstrap/dist/css/bootstrap.min.css'; import rootReducer from './reducer/RootReducer'; -const store = createStore(rootReducer) +const initialState = { + +} + +const middlewares = [thunk] + +const store = createStore(rootReducer, initialState, applyMiddleware(...middlewares)) const root = ReactDOM.createRoot(document.getElementById('root')); root.render( diff --git a/my-app/src/reducer/RootReducer.js b/my-app/src/reducer/RootReducer.js index 122701ab576d2e1fe2a008b6e07c1eba4d1a82ee..a1d8acdaa27a6397a22ab8188971644a6bf0717a 100644 --- a/my-app/src/reducer/RootReducer.js +++ b/my-app/src/reducer/RootReducer.js @@ -1,5 +1,7 @@ +import * as authenticationActions from '../actions/AuthenticationActions' + const initialState = { - user:null, + user: null, loginPending: false, showLoginDialog: false }; @@ -7,7 +9,43 @@ const initialState = { function rootReducer(state = initialState, action) { console.log("Bin im reducer: " + action.type) - return state; + + switch (action.type) { + case authenticationActions.SHOW_LOGIN_DIALOG: + return { + ...state, + showLoginDialog: true, + error: null + } + case authenticationActions.HIDE_LOGIN_DIALOG: + return { + ...state, + showLoginDialog: false, + error: null + } + case authenticationActions.AUTHENTICATION_PENDING: + return { + ...state, + pending: true, + error: null + } + case authenticationActions.AUTHENTICATION_SUCCESS: + return { + ...state, + showLoginDialog: false, + pending: false, + user: action.user, + accessToken: action.accessToken + } + case authenticationActions.AUTHENTICATION_ERROR: + return { + ...state, + pending: false, + error: 'Authentication failed' + } + default: + return state; + } }; export default rootReducer; \ No newline at end of file