React app
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

149 line
6.4 KiB

  1. import React, { useState } from "react";
  2. import styles from './AddWord.module.scss';
  3. import { ReactComponent as ChevronLeft } from '../../assets/icons/chevron-left.svg';
  4. import { ReactComponent as SearchIcon } from '../../assets/icons/bx-search-alt.svg';
  5. import { ReactComponent as SpeakerIcon } from '../../assets/icons/speaker.svg';
  6. import { ReactComponent as AddIcon } from '../../assets/icons/plus.svg';
  7. import { NavLink, useHistory } from "react-router-dom";
  8. import { getWordResult } from "../../services/words";
  9. import { MobileWord } from "../../shared/models/word";
  10. import { MobileUser } from "../../shared/models/user";
  11. import { updateShelf } from "../../services/shelf";
  12. import { getAllData } from "../../services/user";
  13. export const AddWord: React.FC = () => {
  14. const [searchResult, setSearchResult] = useState<Array<MobileWord>>();
  15. const [selectedWord, setSelectedWord] = useState<MobileWord>();
  16. const [searchWord, setSearchWord] = useState<string>('');
  17. const userProfile: MobileUser = JSON.parse(localStorage.getItem('userProfile') || "");
  18. const history = useHistory();
  19. const searchWords = () => {
  20. if (searchWord.length > 0) {
  21. getWordResult(searchWord).then((wordResult: any) => {
  22. let result: Array<MobileWord> = wordResult.data;
  23. setSearchResult(result);
  24. }, err => {
  25. console.log("Unable to search Words", err)
  26. });
  27. }
  28. }
  29. return <section className="modalPage">
  30. <header className={styles.navHeader}>
  31. <button onClick={() => {
  32. if (selectedWord) {
  33. setSelectedWord(undefined);
  34. } else {
  35. window.history.back()
  36. }
  37. }}>
  38. <ChevronLeft />
  39. </button>
  40. {!selectedWord && <h5> Add a Word </h5>}
  41. {selectedWord && <h5> Add to Shelf </h5>}
  42. </header>
  43. {!selectedWord && <section>
  44. <div className={styles.searchBarHolder}>
  45. <div className={styles.searchBar}>
  46. <input type="text" autoFocus={true} placeholder={'Search and add a word'} onChange={(event) => setSearchWord(event.currentTarget.value)} />
  47. <button onClick={() => searchWords()}>
  48. <SearchIcon />
  49. </button>
  50. </div>
  51. </div>
  52. { searchResult && <ul className={styles.searchResult}>
  53. {searchResult.map((word) => {
  54. return <li key={word.name}>
  55. <header>
  56. <h4> {word.name} <span> {word.pronounciation} </span> </h4>
  57. <button>
  58. <SpeakerIcon />
  59. </button>
  60. </header>
  61. <div className={styles.description}>
  62. <span> {word.grammaticalDetails[0]?.type} </span>
  63. <p> {word.grammaticalDetails[0]?.description} </p>
  64. </div>
  65. <button className={styles.addButton} onClick={() => setSelectedWord(word)}> <AddIcon /> Add </button>
  66. </li>
  67. })}
  68. </ul> }
  69. </section>}
  70. {selectedWord && <section>
  71. <div className={styles.searchBarHolder}>
  72. <div className={styles.searchBar}>
  73. <input type="text" placeholder={'Search shelves'} />
  74. <SearchIcon />
  75. </div>
  76. </div>
  77. <ul className={styles.shelfList}>
  78. <header>
  79. <h5> All Shelves </h5>
  80. </header>
  81. {userProfile.categories.map((category, categoryIndex) => {
  82. return category?.shelves?.map((shelf, shelfIndex) => {
  83. return <li key={shelfIndex} onClick={() => {
  84. let words: any = shelf.words ? shelf.words : [];
  85. if (words.findIndex((word: any) => word.word.name === selectedWord.name) >= 0) {
  86. alert("Word already Present!");
  87. } else {
  88. words.push({
  89. word: selectedWord,
  90. notes: [],
  91. isArchived: false,
  92. spaceBetweenRecall: 1,
  93. nextRevisionDateTime: new Date()
  94. })
  95. let updatedWords: any = [];
  96. updatedWords = words.map((word: any) => {
  97. return {
  98. ...word,
  99. word: word.word._id,
  100. }
  101. });
  102. updateShelf(shelf._id, updatedWords).then(() => {
  103. getAllData().then((response: any) => {
  104. localStorage.setItem('userProfile', JSON.stringify(response.data));
  105. history.push('/shelf-details/category_id=' + category._id + '&&shelf_id=' + shelf._id);
  106. }, (err) => {
  107. window.alert("Failed to fetch deep copy of user profile");
  108. console.log(err);
  109. });
  110. }, (err) => {
  111. window.alert("Failed to update");
  112. console.log(err);
  113. });
  114. }
  115. }}>
  116. <div className={styles.icon}>
  117. {category.icon}
  118. </div>
  119. <div className={styles.info}>
  120. <label> {shelf.name} </label>
  121. <span> {category.name} </span>
  122. </div>
  123. </li>
  124. })
  125. })}
  126. <NavLink to={'/add-shelf'} className={styles.AddShelfButton}> <span> <AddIcon /> </span> Create New Shelf </NavLink>
  127. </ul>
  128. </section>}
  129. </section>
  130. }