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.
 
 
 

110 line
4.5 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 { IWord } from "../../structure/word";
  8. import { ALL_WORDS } from "../../data/all-words";
  9. import { NavLink } from "react-router-dom";
  10. import { userProfileData } from "../../App";
  11. export const AddWord: React.FC = () => {
  12. const [searchWordResult, setSearchResult] = useState<Array<IWord>>([]);
  13. const [selectedWord, setSelectedWord] = useState<IWord>();
  14. const searchWords = (searchWord: string) => {
  15. if (searchWord.length > 0) {
  16. let result = ALL_WORDS.filter((word) => {
  17. return word.name.toLowerCase().includes(searchWord.toLowerCase());
  18. });
  19. setSearchResult(result);
  20. } else {
  21. setSearchResult([]);
  22. }
  23. }
  24. return <section className="modalPage">
  25. <header className={styles.navHeader}>
  26. <button onClick={() => {
  27. if (selectedWord) {
  28. setSelectedWord(undefined);
  29. } else {
  30. window.history.back()
  31. }
  32. }}>
  33. <ChevronLeft />
  34. </button>
  35. { !selectedWord && <h5> Add a Word </h5> }
  36. { selectedWord && <h5> Add to Shelf </h5> }
  37. <figure style={{ opacity: selectedWord ? 0 : 1 }}>
  38. {/* eslint-disable-next-line */}
  39. <img src={ userProfileData.image } alt="profile-image" />
  40. </figure>
  41. </header>
  42. { !selectedWord && <section>
  43. <div className={styles.searchBarHolder}>
  44. <div className={styles.searchBar}>
  45. <input type="text" autoFocus={true} placeholder={'Search and add a word'} onChange={(event) => searchWords(event.currentTarget.value)} />
  46. <SearchIcon />
  47. </div>
  48. </div>
  49. <ul className={styles.searchResult}>
  50. { searchWordResult.map((word) => {
  51. return <li key={word.name}>
  52. <header>
  53. <h4> { word.name } <span> { word.pronounciation } </span> </h4>
  54. <button>
  55. <SpeakerIcon />
  56. </button>
  57. </header>
  58. <div className={styles.description}>
  59. <span> { word.grammaticalDetails[0].typeName } </span>
  60. <p> { word.grammaticalDetails[0].description } </p>
  61. </div>
  62. <button className={styles.addButton} onClick={() => setSelectedWord(word)}> <AddIcon /> Add </button>
  63. </li>
  64. }) }
  65. </ul>
  66. </section> }
  67. { selectedWord && <section>
  68. <div className={styles.searchBarHolder}>
  69. <div className={styles.searchBar}>
  70. <input type="text" placeholder={'Search shelves'}/>
  71. <SearchIcon />
  72. </div>
  73. </div>
  74. <ul className={styles.shelfList}>
  75. <header>
  76. <h5> All Shelves </h5>
  77. </header>
  78. { userProfileData.categories.map((category, categoryIndex) => {
  79. return category.shelves.map((shelf, shelfIndex) => {
  80. return <li key={shelf.name} onClick={() => {
  81. userProfileData.categories[categoryIndex].shelves[shelfIndex].words.push(selectedWord);
  82. }}>
  83. <div className={styles.icon}>
  84. { category.icon }
  85. </div>
  86. <div className={styles.info}>
  87. <label> { shelf.name } </label>
  88. <span> { category.name } </span>
  89. </div>
  90. </li>
  91. })
  92. }) }
  93. <NavLink to={'/add-shelf'} className={styles.AddShelfButton}> <span> <AddIcon /> </span> Create New Shelf </NavLink>
  94. </ul>
  95. </section> }
  96. </section>
  97. }