React app
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

AddWord.tsx 5.3 KiB

il y a 4 ans
il y a 4 ans
il y a 4 ans
il y a 4 ans
il y a 4 ans
il y a 4 ans
il y a 4 ans
il y a 4 ans
il y a 4 ans
il y a 4 ans
il y a 4 ans
il y a 4 ans
il y a 4 ans
il y a 4 ans
il y a 4 ans
il y a 4 ans
il y a 4 ans
il y a 4 ans
il y a 4 ans
il y a 4 ans
il y a 4 ans
il y a 4 ans
il y a 4 ans
il y a 4 ans
il y a 4 ans
il y a 4 ans
il y a 4 ans
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  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 { userProfileData } from "../../App";
  9. import { getWordResult } from "../../services/words";
  10. import { Word } from "../../shared/models/word";
  11. export const AddWord: React.FC = () => {
  12. const [searchWordResult, setSearchResult] = useState<Array<Word>>();
  13. const [selectedWord, setSelectedWord] = useState<Word>();
  14. const history = useHistory();
  15. const searchWords = (searchWord: string) => {
  16. console.log(searchWord.length)
  17. setTimeout(() => {
  18. if (searchWord.length > 0) {
  19. getWordResult(searchWord).then((wordResult: any) => {
  20. let result: Array<Word> = wordResult.data
  21. console.log(result.slice(0,10))
  22. setSearchResult(result);
  23. }, err => {
  24. console.log("Unable to search Words", err)
  25. })
  26. } else {
  27. getWordResult("Aa").then((wordResult: any) => {
  28. let result: Array<Word> = wordResult.data
  29. setSearchResult(result);
  30. })
  31. }
  32. }, 1000)
  33. }
  34. return <section className="modalPage">
  35. <header className={styles.navHeader}>
  36. <button onClick={() => {
  37. if (selectedWord) {
  38. setSelectedWord(undefined);
  39. } else {
  40. window.history.back()
  41. }
  42. }}>
  43. <ChevronLeft />
  44. </button>
  45. {!selectedWord && <h5> Add a Word </h5>}
  46. {selectedWord && <h5> Add to Shelf </h5>}
  47. <figure style={{ opacity: selectedWord ? 0 : 1 }}>
  48. {/* eslint-disable-next-line */}
  49. <img src={userProfileData.image} alt="profile-image" />
  50. </figure>
  51. </header>
  52. {!selectedWord && <section>
  53. <div className={styles.searchBarHolder}>
  54. <div className={styles.searchBar}>
  55. <input type="text" autoFocus={true} placeholder={'Search and add a word'} onChange={(event) => searchWords(event.currentTarget.value)} />
  56. <SearchIcon />
  57. </div>
  58. </div>
  59. <ul className={styles.searchResult}>
  60. {searchWordResult?.map((word) => {
  61. return <li key={word.name}>
  62. <header>
  63. <h4> {word.name} <span> {word.pronounciation} </span> </h4>
  64. <button>
  65. <SpeakerIcon />
  66. </button>
  67. </header>
  68. <div className={styles.description}>
  69. <span> {word.grammaticalDetails[0]?.type} </span>
  70. <p> {word.grammaticalDetails[0]?.description} </p>
  71. </div>
  72. <button className={styles.addButton} onClick={() => setSelectedWord(word)}> <AddIcon /> Add </button>
  73. </li>
  74. })}
  75. </ul>
  76. </section>}
  77. {selectedWord && <section>
  78. <div className={styles.searchBarHolder}>
  79. <div className={styles.searchBar}>
  80. <input type="text" placeholder={'Search shelves'} />
  81. <SearchIcon />
  82. </div>
  83. </div>
  84. <ul className={styles.shelfList}>
  85. <header>
  86. <h5> All Shelves </h5>
  87. </header>
  88. {userProfileData.categories.map((category, categoryIndex) => {
  89. return category.shelves.map((shelf, shelfIndex) => {
  90. return <li key={shelf.name} onClick={() => {
  91. let findWord = userProfileData.categories[categoryIndex].shelves[shelfIndex].words.find(word => word.name.toLowerCase().includes(selectedWord.name.toLowerCase()));
  92. if (findWord) {
  93. alert("Word already Present!");
  94. } else {
  95. // userProfileData.categories[categoryIndex].shelves[shelfIndex].words.push(selectedWord);
  96. history.push('/shelf-details/category_id=' + categoryIndex + '&&shelf_id=' + shelfIndex);
  97. }
  98. }}>
  99. <div className={styles.icon}>
  100. {category.icon}
  101. </div>
  102. <div className={styles.info}>
  103. <label> {shelf.name} </label>
  104. <span> {category.name} </span>
  105. </div>
  106. </li>
  107. })
  108. })}
  109. <NavLink to={'/add-shelf'} className={styles.AddShelfButton}> <span> <AddIcon /> </span> Create New Shelf </NavLink>
  110. </ul>
  111. </section>}
  112. </section>
  113. }