tipsypastels

Untitled

Dec 31st, 2018
172
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.62 KB | None | 0 0
  1. import React, { Component } from 'react';
  2.  
  3. class InlineSearch extends Component {
  4. constructor(props) {
  5. super(props);
  6. this.state = {
  7. words: '',
  8. tokens: {},
  9. };
  10. }
  11.  
  12. handleKeyup = (e) => {
  13. let { value } = e.target;
  14.  
  15. let tokens = {};
  16. let wordsAr = [];
  17. let hangingToken = null;
  18.  
  19. value.split(' ').forEach(word => {
  20. if (hangingToken) {
  21. tokens[hangingToken] = word;
  22. hangingToken = undefined;
  23. } else if (word.split(':').length === 2 && !word.endsWith(':')) {
  24. let [token, value] = word.split(':');
  25. tokens[token] = value;
  26. } else if (word.endsWith(':')) {
  27. hangingToken = word.substring(0, word.length - 1);
  28. } else {
  29. wordsAr.push(word);
  30. }
  31. console.log(hangingToken);
  32. });
  33.  
  34. let words = wordsAr.join(' ');
  35. this.setState({ words, tokens })
  36. }
  37.  
  38. getOutput() {
  39. let { tokens } = this.state;
  40. let mappedTokens = Object.keys(tokens).map(t => `${t}: ${tokens[t]}`).join('<br />');
  41.  
  42. return (
  43. <>
  44. <div>
  45. <h2>Search String</h2>
  46. {this.state.words}
  47. </div>
  48.  
  49. <div>
  50. <h2>Tokens</h2>
  51. {mappedTokens}
  52. </div>
  53. </>
  54. )
  55. }
  56.  
  57. render() {
  58. return (
  59. <div className="InlineSearch" style={{margin: '1em'}}>
  60. <input onChange={this.handleKeyup} className="search" type="text" />
  61.  
  62. <div style={{marginTop: '1em'}}>
  63. <h1>
  64. Results
  65. </h1>
  66.  
  67. {this.getOutput()}
  68. </div>
  69. </div>
  70. )
  71. }
  72. }
  73.  
  74. export default InlineSearch;
Advertisement
Add Comment
Please, Sign In to add comment