Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2019
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import React, {Component} from 'react';
  2. import styled from 'styled-components';
  3. import { validatePassword, validateLength, validateEmail } from '../utils/Validators';
  4. import { generatePdf } from '../utils/pdfGeneration';
  5. import CustomAnswer from './CustomAnswer';
  6. import Header from '../components/Header';
  7. import Menubar from '../components/Menubar';
  8. import Button from '../components/Button';
  9. import Divider from '../components/Divider';
  10. import Checkbox from '../components/Checkbox';
  11. import localizationIcon from '../assets/localization.png'
  12. import medicinesIcon from '../assets/medicine.png'
  13. import questionmarkIcon from '../assets/questionmark.png'
  14. import auraIcon from '../assets/eye.png'
  15.  
  16. import axios from 'axios';
  17. import TextInput from '../components/TextInput';
  18. import {languageText, setLanguage, getLanguage} from '../languages/MultiLanguage.js';
  19.  
  20. const SettingsComponent = styled.div`
  21.   display: flex;
  22.   justify-content: flex-start;
  23.   padding: 5rem 0.25em;
  24.   margin: 0;
  25.   text-align: center;
  26.   height: auto;
  27.  
  28.   .chosenLang{
  29.     color: red;
  30.   }
  31. `
  32.  
  33. const Buttons = styled.div`
  34.   display: flex;
  35.   width: 100%;
  36.   flex-wrap: wrap;
  37.   justify-content: space-evenly;
  38.   margin-top: 10px;
  39.   h6 {
  40.     margin: 5px 0 0 0;
  41.     text-transform: uppercase;
  42.   }
  43.   img {
  44.     width: 30px;
  45.     heigth: 30px;
  46.   }
  47. `
  48.  
  49. const List = styled.div`
  50.   background-color: #fff;
  51.   box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24);
  52.   margin: 2em 10%;
  53.   margin-bottom: 1em;
  54.   display: flex;
  55.   flex-direction: row;
  56.   width: 80%;
  57.   flex-wrap: wrap;
  58.   justify-content: center;
  59.   h4{
  60.     margin: 5px;
  61.     text-transform: uppercase;
  62.     font-weight: 300;
  63.   }
  64. `
  65.  
  66. class Settings extends Component {
  67.   constructor(props){
  68.     super(props);
  69.  
  70.     const isLoggedIn = localStorage.getItem('isLogged');
  71.     this.state = {
  72.       isLogged: isLoggedIn === 'true',
  73.       message: 'Waiting to log out',
  74.       fields: {
  75.         username: {
  76.           value: '',
  77.           isValid: false,
  78.           errorMsg: '',
  79.         },
  80.         password: {
  81.           value: '',
  82.           isValid: false,
  83.           errorMsg: '',
  84.         },
  85.         oldPassword: {
  86.           value: '',
  87.           isValid: false,
  88.           errorMsg: '',
  89.         },
  90.         email: {
  91.           value: '',
  92.           isValid: false,
  93.           errorMsg: '',
  94.         }
  95.       },
  96.       ifCustomAnswer: false,
  97.       answerType: '',
  98.       current: {},
  99.       customAnswers: {}
  100.     }
  101.     this.baseFieldsState = this.state.fields;
  102.  
  103.     this.toggleUserFormField = this.toggleUserFormField.bind(this);
  104.     this.clearFields = this.clearFields.bind(this);
  105.     this.handleLogOut = this.handleLogOut.bind(this);
  106.     this.handleChange = this.handleChange.bind(this);
  107.     this.handlePasswordChange = this.handlePasswordChange.bind(this);
  108.     this.handleDataChange = this.handleDataChange.bind(this);
  109.     this.addAnswer = this.addAnswer.bind(this);
  110.     this.getAnswers = this.getAnswers.bind(this);
  111.   }
  112.  
  113.   logout(){
  114.     localStorage.setItem('isLogged',false);
  115.     this.setState((prevState) =>(
  116.       {
  117.         isLogged: false
  118.       }
  119.     ))
  120.   }
  121.  
  122.   handleLogOut() {
  123.     axios.get('/api/logout').then(res => {
  124.       this.setState({message: res.data.message});
  125.       this.logout();
  126.       window.location = '/';
  127.         }).catch(err =>{
  128.             console.log(err);
  129.             this.setState({message: languageText.settings.failed});
  130.         });
  131.   };
  132.  
  133.   componentDidMount() {
  134.     window.scrollTo(0, 0);
  135.     this.getAnswers();
  136.   };
  137.  
  138.   getAnswers() {
  139.     axios.get('/api/users/answer')
  140.     .then((res) => {
  141.       if(res.status === 204){
  142.         console.log("No content");
  143.       } else {
  144.         const data = this.parseCustomAnswers(res.data);
  145.         this.setState((prevState) => ({
  146.           ...prevState,
  147.           customAnswers: data
  148.         }))
  149.      }
  150.     })
  151.     .catch((err) => {console.log(err);})
  152.   }
  153.  
  154.   parseCustomAnswers(answers) {
  155.     for(var op in answers) {
  156.       if(answers[op].length > 0){
  157.         answers[op] = this.mapValues(answers[op]);
  158.       }
  159.     }
  160.     return answers;
  161.   }
  162.  
  163.   mapValues(values) {
  164.     return values.map((value) => {
  165.       return {
  166.         text: value,
  167.         value: value
  168.       }
  169.     })
  170.   }
  171.  
  172.   componentWillMount(){
  173.     const isLoggedIn = localStorage.getItem('isLogged');
  174.     this.setState((prevState) => (
  175.       {
  176.         isLogged: isLoggedIn === 'true'
  177.       }
  178.     ))
  179.   }
  180.  
  181.   handleChange(evt) {
  182.     const { value, name } = evt.target;
  183.     this.setState((prevState) => ({
  184.       fields: {
  185.         ...prevState.fields,
  186.         [name]: {
  187.           ...prevState.fields[name],
  188.           value: value,
  189.         },
  190.       }
  191.     }))
  192.   }
  193.  
  194.   changeValidation(fields, field, isValid, errorMsg = '') {
  195.     return {
  196.       ...fields,
  197.       [field]: {
  198.         ...fields[field],
  199.         errorMsg,
  200.         isValid,
  201.       }
  202.     };
  203.   }
  204.  
  205.   clearFields() {
  206.     this.setState((prevState) => ({
  207.       fields: {
  208.         ...this.baseFieldsState
  209.       }
  210.     }))
  211.   }
  212.  
  213.   handlePasswordChange(e) {
  214.     e.preventDefault();
  215.     let isValid = true;
  216.     let fields = this.state.fields;
  217.     const { oldPassword, password } = fields;
  218.  
  219.     if (!validatePassword(password.value)) {
  220.       isValid = false;
  221.       fields = this.changeValidation(fields, 'password', false, languageText.register.error8chars);
  222.     } else {
  223.       fields = this.changeValidation(fields, 'password', true);
  224.     }
  225.  
  226.     this.setState({ fields }, () => {
  227.       if(isValid) {
  228.         axios.put("/api/password", {
  229.           oldPassword: oldPassword.value,
  230.           password: password.value
  231.         })
  232.         .then(res => {
  233.           if(res.status === 404){
  234.             alert(languageText.settings.sthWentWrong);
  235.             return;
  236.           } else if(res.status === 204){
  237.             alert(languageText.settings.oldPasswordIncorrect);
  238.             return;
  239.           } else {
  240.             if(res.data.errors) {
  241.               alert(res.data.errors);
  242.               return;
  243.             }
  244.             alert(languageText.settings.passwordChanged);
  245.             this.clearFields();
  246.           }
  247.         })
  248.         .catch((err) => console.log(err))
  249.       }
  250.     })
  251.   }
  252.  
  253.   handleDataChange(e) {
  254.     e.preventDefault();
  255.     let isValid = true;
  256.     let fields = this.state.fields;
  257.     const { username, email } = fields;
  258.  
  259.     if (username.value.length > 0 && !validateLength(username.value, 4)) {
  260.       isValid = false;
  261.       fields = this.changeValidation(fields, 'username', false, languageText.register.error4chars);
  262.     } else {
  263.       fields = this.changeValidation(fields, 'username', true);
  264.     }
  265.  
  266.     if (email.value.length && !validateEmail(email.value)) {
  267.       isValid = false;
  268.       fields = this.changeValidation(fields, 'email', false, languageText.register.invalidEmail);
  269.     } else {
  270.       fields = this.changeValidation(fields, 'email', true);
  271.     }
  272.  
  273.     this.setState({ fields }, () => {
  274.       if(isValid) {
  275.         axios.put("/api/users", {
  276.           username: username.value,
  277.           email: email.value
  278.         })
  279.         .then(res => {
  280.           if(res.status === 404){
  281.             alert(languageText.settings.sthWentWrong);
  282.             return;
  283.           } else {
  284.             if(res.data.errors) {
  285.               alert(res.data.errors);
  286.               return;
  287.             }
  288.             alert(languageText.settings.dataChanged);
  289.             this.clearFields();
  290.           }
  291.         })
  292.         .catch((err) => console.log(err))
  293.       }
  294.     })
  295.   }
  296.  
  297.   setNewLanguage(lang) {
  298.     setLanguage(lang);
  299.     window.location.reload();
  300.   }
  301.  
  302.   toggleUserFormField(field) {
  303.     const old = this.getUserFormField(field)
  304.     localStorage.setItem(`form-${field}`, !old)
  305.     this.forceUpdate();
  306.   }
  307.  
  308.   getUserFormField(field) {
  309.     return localStorage.getItem(`form-${field}`) === 'true' || localStorage.getItem(`form-${field}`) === null;
  310.   }
  311.  
  312.   addAnswer(option){
  313.     this.setState((prevState) => ({
  314.       ...prevState,
  315.       ifCustomAnswer: false,
  316.       answerType: option.field,
  317.       current: option
  318.     }), () => {
  319.       this.setState((prevState) => ({
  320.         ...prevState,
  321.         ifCustomAnswer: true
  322.       }))
  323.     })
  324.   }
  325.  
  326.   handleCustomAnswer(data,cancel){
  327.     if(data.answer && data.answerType){
  328.       const option = {option: data.answerType, value: data.answer};
  329.       axios.post('/api/users/answer',option)
  330.       .then((res) => {
  331.         console.log(res.data);
  332.         this.setState((prevState) => ({
  333.           ...prevState,
  334.           ifCustomAnswer: false,
  335.           answerType: ''
  336.         }), () => this.getAnswers())
  337.       })
  338.       .catch((err) => {
  339.         console.log(err)
  340.       });
  341.     } else {
  342.       this.setState((prevState) => ({
  343.         ...prevState,
  344.         ifCustomAnswer: false,
  345.         answerType: ''
  346.       }))
  347.     }
  348.   }
  349.  
  350.   getPdf() {
  351.     axios.get("/api/pdf")
  352.     .then((res) => {
  353.         generatePdf(res.data);
  354.     })
  355.     .catch((err) => console.log(err))
  356.   }
  357.  
  358.   render() {
  359.     const customAnswer = this.state.ifCustomAnswer
  360.       ? (<CustomAnswer answerType={this.state.answerType} current={this.state.current} onConfirmFn={this.handleCustomAnswer.bind(this)}/>)
  361.       : '';
  362.    
  363.     const { username, email, oldPassword, password } = this.state.fields;
  364.     const fields = languageText.settings.formFieldsOptions;
  365.     const answers = languageText.settings.customAnswers.map((answer) => {
  366.       return ({
  367.         field: answer.field,
  368.         text: answer.text,
  369.         placeholder: answer.placeholder,
  370.         src: answer.field + 'Icon'
  371.       }
  372.       )
  373.     })
  374.  
  375.     const answersList = this.state.ifCustomAnswer
  376.       ? languageText.addForm[this.state.answerType + `Answers`].concat(this.state.customAnswers[this.state.answerType])
  377.       : [];
  378.  
  379.     const Answers = answersList.length > 0 ? (
  380.       answersList.map((answer, index) => (
  381.         <h4 key={index}>{answer.text}</h4>
  382.       ))
  383.     ) : '';
  384.  
  385.     let currentLang = getLanguage();
  386.     return (
  387.       <SettingsComponent className="Settings">
  388.           <Header />
  389.           <Divider text={languageText.settings.logout}/>
  390.           <Button type="submit" onClick={this.handleLogOut} text={languageText.settings.logout} primary />
  391.           <Divider text={languageText.settings.formFields}/>
  392.           <div>
  393.           {
  394.             fields.map((field, index) => (
  395.               <Checkbox
  396.               key={index}
  397.               small
  398.               text={field.text}
  399.               value={field.text}
  400.               checked={this.getUserFormField(field.field)}
  401.               onChange={() => this.toggleUserFormField(field.field)}
  402.               />
  403.             ))
  404.           }
  405.           </div>
  406.           <Divider text={languageText.settings.setCustomAnswers}/>
  407.           <Buttons>
  408.             {
  409.               answers.map((option, index) => (
  410.                 <div key={index}>
  411.                 <Button
  412.                 key={index}
  413.                 small
  414.                 onClick={() => this.addAnswer(option)}
  415.                 primary={this.state.answerType ===option.field}
  416.                 img= {option.field === 'localization'
  417.                   ? localizationIcon
  418.                   : option.field === "aura"
  419.                     ? auraIcon
  420.                     : option.field === "medicines"
  421.                       ? medicinesIcon
  422.                       : option.field === "triggers"
  423.                         ? questionmarkIcon
  424.                         : questionmarkIcon}/>
  425.                 <h6>{option.text}</h6>
  426.                 </div>
  427.               ))
  428.             }
  429.           </Buttons>
  430.           { this.state.ifCustomAnswer ?
  431.             (<List>
  432.                { Answers }
  433.             </List>) : "" }
  434.           { customAnswer }
  435.           <Divider text={languageText.settings.exportData}/>
  436.             <Button onClick={this.getPdf} text={languageText.settings.generatePdf}/>
  437.           <Divider text={languageText.settings.chooseLanguage}/>
  438.             <Button onClick={() => this.setNewLanguage('eng')} text={languageText.settings.eng} primary={currentLang === "eng" ? true : false} />
  439.             <Button onClick={() => this.setNewLanguage('pl')} text={languageText.settings.pol} primary={currentLang === "pl" ? true : false} />
  440.           <Divider text={languageText.settings.changeData}/>
  441.           <TextInput
  442.             type="text"
  443.             id="username"
  444.             placeholder={languageText.settings.usernamePlaceholder}
  445.             name={languageText.settings.username}
  446.             value={username.value}
  447.             isValid={username.isValid}
  448.             errorMsg={username.errorMsg}
  449.             onChange={this.handleChange}
  450.           />
  451.           <TextInput
  452.             type="email"
  453.             id="email"
  454.             placeholder="Email"
  455.             name="Email"
  456.             value={email.value}
  457.             isValid={email.isValid}
  458.             errorMsg={email.errorMsg}
  459.             onChange={this.handleChange}
  460.           />
  461.           <Button type="submit" onClick={this.handleDataChange} small="true" text={languageText.settings.buttonText} primary />
  462.           <Divider text={languageText.settings.changePassword}/>
  463.           <TextInput
  464.             type="password"
  465.             id="oldPassword"
  466.             placeholder={languageText.settings.oldPassword}
  467.             name={languageText.settings.oldPassword}
  468.             value={oldPassword.value}
  469.             isValid={oldPassword.isValid}
  470.             errorMsg={oldPassword.errorMsg}
  471.             onChange={this.handleChange}
  472.           />
  473.           <TextInput
  474.             type="password"
  475.             id="password"
  476.             placeholder={languageText.settings.newPassword}
  477.             name={languageText.settings.newPassword}
  478.             value={password.value}
  479.             isValid={password.isValid}
  480.             errorMsg={password.errorMsg}
  481.             onChange={this.handleChange}
  482.           />
  483.           <Button type="submit" onClick={this.handlePasswordChange} small="true" text={languageText.settings.buttonText} primary />
  484.         <Menubar />
  485.       </SettingsComponent>
  486.  
  487.     );
  488.   }
  489. }
  490.  
  491.  
  492. export default Settings;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement