React app
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
 
 
 

140 行
5.9 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. export const AddWord: React.FC = () => {
  13. const [searchResult, setSearchResult] = useState<Array<MobileWord>>();
  14. const [selectedWord, setSelectedWord] = useState<MobileWord>();
  15. const [searchWord, setSearchWord] = useState<string>('');
  16. const userProfile: MobileUser = JSON.parse(localStorage.getItem('userProfile') || "");
  17. const history = useHistory();
  18. const searchWords = () => {
  19. if (searchWord.length > 0) {
  20. getWordResult(searchWord).then((wordResult: any) => {
  21. let result: Array<MobileWord> = wordResult.data;
  22. setSearchResult(result);
  23. }, err => {
  24. console.log("Unable to search Words", err)
  25. });
  26. }
  27. }
  28. return <section className="modalPage">
  29. <header className={styles.navHeader}>
  30. <button onClick={() => {
  31. if (selectedWord) {
  32. setSelectedWord(undefined);
  33. } else {
  34. window.history.back()
  35. }
  36. }}>
  37. <ChevronLeft />
  38. </button>
  39. {!selectedWord && <h5> Add a Word </h5>}
  40. {selectedWord && <h5> Add to Shelf </h5>}
  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) => setSearchWord(event.currentTarget.value)} />
  46. <button onClick={() => searchWords()}>
  47. <SearchIcon />
  48. </button>
  49. </div>
  50. </div>
  51. { searchResult && <ul className={styles.searchResult}>
  52. {searchResult.map((word) => {
  53. return <li key={word.name}>
  54. <header>
  55. <h4> {word.name} <span> {word.pronounciation} </span> </h4>
  56. <button>
  57. <SpeakerIcon />
  58. </button>
  59. </header>
  60. <div className={styles.description}>
  61. <span> {word.grammaticalDetails[0]?.type} </span>
  62. <p> {word.grammaticalDetails[0]?.description} </p>
  63. </div>
  64. <button className={styles.addButton} onClick={() => setSelectedWord(word)}> <AddIcon /> Add </button>
  65. </li>
  66. })}
  67. </ul> }
  68. </section>}
  69. {selectedWord && <section>
  70. <div className={styles.searchBarHolder}>
  71. <div className={styles.searchBar}>
  72. <input type="text" placeholder={'Search shelves'} />
  73. <SearchIcon />
  74. </div>
  75. </div>
  76. <ul className={styles.shelfList}>
  77. <header>
  78. <h5> All Shelves </h5>
  79. </header>
  80. {userProfile.categories.map((category) => {
  81. return category?.shelves?.map((shelf, shelfIndex) => {
  82. return <li key={shelfIndex} onClick={() => {
  83. let words: any = shelf.words ? shelf.words : [];
  84. if (words.findIndex((word: any) => word.word.name === selectedWord.name) >= 0) {
  85. alert("Word already Present!");
  86. } else {
  87. words.push({
  88. word: selectedWord,
  89. notes: [],
  90. isArchived: false,
  91. spaceBetweenRecall: 1,
  92. nextRevisionDateTime: new Date()
  93. })
  94. let updatedWords: any = [];
  95. updatedWords = words.map((word: any) => {
  96. return {
  97. ...word,
  98. word: word.word._id,
  99. }
  100. });
  101. updateShelf(shelf._id, updatedWords).then(() => {
  102. history.push('/shelf-details/category_id=' + category._id + '&&shelf_id=' + shelf._id);
  103. }, (err) => {
  104. window.alert("Failed to update");
  105. console.log(err);
  106. });
  107. }
  108. }}>
  109. <div className={styles.icon}>
  110. {category.icon}
  111. </div>
  112. <div className={styles.info}>
  113. <label> {shelf.name} </label>
  114. <span> {category.name} </span>
  115. </div>
  116. </li>
  117. })
  118. })}
  119. <NavLink to={'/add-shelf'} className={styles.AddShelfButton}> <span> <AddIcon /> </span> Create New Shelf </NavLink>
  120. </ul>
  121. </section>}
  122. </section>
  123. }