Angular job portal app
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. import { IonButton, IonCheckbox, IonItem, IonLabel, IonList, IonRadio, IonRadioGroup } from '@ionic/react';
  2. import { useEffect, useRef, useState } from 'react';
  3. import { Link } from 'react-router-dom';
  4. import styles from './Options.module.scss';
  5. import { OptionType } from '../../models/QuizDetails'
  6. interface OwnProps {
  7. options: string[] | undefined;
  8. type: OptionType;
  9. answer: string[];
  10. lastQuestion: boolean;
  11. questionNumber: number;
  12. updateQuestionNumber: () => void;
  13. }
  14. const Options: React.FC<OwnProps> = (props) => {
  15. const [selected, setSelected] = useState<string | undefined>(undefined);
  16. const [selectedOptions, setSelectedOptions] = useState<string[]>([]);
  17. const [textInput, setTextInput] = useState<string>("");
  18. const [answers, setAnswers] = useState<number>(0);
  19. const inputRef = useRef<HTMLTextAreaElement>(null);
  20. useEffect(() => {
  21. setSelected(undefined);
  22. setSelectedOptions([]);
  23. setTextInput("");
  24. }, [props.options]);
  25. const selectChecked = (option: string) => {
  26. let newOption: string[] = [];
  27. if (selectedOptions.includes(option)) {
  28. newOption = selectedOptions.filter(oldOption => oldOption !== option);
  29. } else {
  30. newOption = selectedOptions.concat([option]);
  31. }
  32. setSelectedOptions(newOption);
  33. }
  34. const validateAnswer = () => {
  35. if (props.type === "singleSelect") {
  36. if (props.answer.includes(selected!)) {
  37. setAnswers(answers + 1);
  38. }
  39. } else if (props.type === "multiSelect") {
  40. if (props.answer.length === selectedOptions.length && props.answer.sort().join(',') === selectedOptions.sort().join(',')) {
  41. setAnswers(answers + 1);
  42. }
  43. } else if (props.type === "textInput") {
  44. if (props.answer.includes(textInput)) {
  45. setAnswers(answers + 1);
  46. }
  47. }
  48. }
  49. const handleInput = () => {
  50. setTextInput(inputRef.current?.value!)
  51. }
  52. const setAnswer = () => {
  53. localStorage.setItem("answer", answers.toString());
  54. }
  55. const options = props.options!.map((option, key) => {
  56. return (
  57. <IonItem lines='none' key={key} className={(option === selected) ? styles.highlighted : ""}>
  58. <IonLabel>{option}</IonLabel>
  59. <IonRadio mode='md' slot="start" value={option} />
  60. </IonItem>
  61. );
  62. });
  63. const MultiSelectOptions = props.options!.map((option, key) => {
  64. return (
  65. <IonItem lines='none' key={key} className={(selectedOptions.includes(option)) ? styles.highlighted : ""}>
  66. <div className={(selectedOptions.includes(option)) ? (styles.activeCheck + " " + styles.checkBoxHolder) : styles.checkBoxHolder}>
  67. <IonCheckbox
  68. slot="start"
  69. mode='ios'
  70. className={styles.checkBox}
  71. onIonChange={e => selectChecked(option)} />
  72. </div>
  73. <IonLabel className={styles.multiSelectLabel}>{option}</IonLabel>
  74. </IonItem>
  75. );
  76. });
  77. return (
  78. <div className={styles.optionHolder}>
  79. <IonList>
  80. {props.type === "singleSelect" &&
  81. <IonRadioGroup onIonChange={e => setSelected(e.detail.value)} allowEmptySelection={true} className={styles.options}>
  82. {options}
  83. </IonRadioGroup>
  84. }
  85. {props.type === "multiSelect" &&
  86. <div className={styles.options}>
  87. {MultiSelectOptions}
  88. </div>
  89. }
  90. {props.type === "textInput" &&
  91. <div className={styles.options}>
  92. <textarea
  93. className={styles.textInput}
  94. rows={20}
  95. cols={35}
  96. placeholder="enter your answer here"
  97. ref={inputRef}
  98. onChange={handleInput}>
  99. </textarea>
  100. </div>
  101. }
  102. </IonList>
  103. {!props.lastQuestion &&
  104. <div className={styles.button + " " + ((selected || selectedOptions.length > 0 || textInput) ? styles.active : "")}
  105. onClick={(selected || selectedOptions.length > 0 || textInput) ? () => { props.updateQuestionNumber(); validateAnswer(); } : undefined}>
  106. <IonButton shape="round" expand='block'>Next</IonButton>
  107. </div>
  108. }
  109. {props.lastQuestion &&
  110. < Link to="/preliminaryRoundResults" onClick={setAnswer} className={styles.button + " " + ((selected || selectedOptions.length > 0 || textInput) ? styles.active : "")}>
  111. <IonButton shape="round" expand='block'>Next Step</IonButton>
  112. </Link>
  113. }
  114. </div >
  115. );
  116. }
  117. export default Options;