forked from cybrespace/pinafore
		
	
		
			
				
	
	
		
			107 lines
		
	
	
		
			No EOL
		
	
	
		
			3.6 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			107 lines
		
	
	
		
			No EOL
		
	
	
		
			3.6 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
| <div class="compose-autosuggest {shown ? 'shown' : ''} {realm === 'dialog' ? 'is-dialog' : ''}"
 | |
|        aria-hidden="true" >
 | |
|   <ComposeAutosuggestionList
 | |
|     items={autosuggestSearchResults}
 | |
|     on:click="onClick(event)"
 | |
|     type={autosuggestType}
 | |
|     selected={autosuggestSelected}
 | |
|   />
 | |
| </div>
 | |
| <style>
 | |
|   .compose-autosuggest {
 | |
|     position: absolute;
 | |
|     left: 5px;
 | |
|     top: 0;
 | |
|     pointer-events: none;
 | |
|     opacity: 0;
 | |
|     transition: opacity 0.1s linear;
 | |
|     min-width: 400px;
 | |
|     max-width: calc(100vw - 20px);
 | |
|     z-index: 7000;
 | |
|   }
 | |
|   .compose-autosuggest.is-dialog {
 | |
|     z-index: 11000;
 | |
|   }
 | |
|   .compose-autosuggest.shown {
 | |
|     pointer-events: auto;
 | |
|     opacity: 1;
 | |
|   }
 | |
| 
 | |
|   @media (max-width: 479px) {
 | |
|     .compose-autosuggest {
 | |
|       /* hack: move this over to the left on mobile so it's easier to see */
 | |
|       transform: translateX(-58px); /* avatar size 48px + 10px padding */
 | |
|       min-width: 0;
 | |
|       width: calc(100vw - 20px);
 | |
|     }
 | |
|   }
 | |
| 
 | |
| </style>
 | |
| <script>
 | |
|   import { store } from '../../_store/store'
 | |
|   import ComposeAutosuggestionList from './ComposeAutosuggestionList.html'
 | |
|   import get from 'lodash-es/get'
 | |
|   import { selectAutosuggestItem } from '../../_actions/autosuggest'
 | |
|   import { observe } from 'svelte-extras'
 | |
|   import { once } from '../../_utils/once'
 | |
| 
 | |
|   export default {
 | |
|     oncreate () {
 | |
|       this._promiseChain = Promise.resolve()
 | |
|       this.observe('shouldBeShown', (shouldBeShown) => {
 | |
|         // TODO: hack so that when the user clicks the button, and the textarea blurs,
 | |
|         // we don't immediately hide the dropdown which would cause the click to get lost
 | |
|         this._promiseChain = this._promiseChain.then(() => {
 | |
|           if (!shouldBeShown) {
 | |
|             return Promise.race([
 | |
|               new Promise(resolve => setTimeout(resolve, 200)),
 | |
|               new Promise(resolve => this.once('autosuggestItemSelected', resolve))
 | |
|             ])
 | |
|           }
 | |
|         }).then(() => {
 | |
|           this.set({shown: shouldBeShown})
 | |
|         })
 | |
|       })
 | |
|     },
 | |
|     methods: {
 | |
|       observe,
 | |
|       once,
 | |
|       onClick (item) {
 | |
|         this.fire('autosuggestItemSelected')
 | |
|         selectAutosuggestItem(item)
 | |
|       }
 | |
|     },
 | |
|     computed: {
 | |
|       /* eslint-disable camelcase */
 | |
|       composeSelectionStart: ({ $autosuggestData_composeSelectionStart, $currentInstance, realm }) => (
 | |
|         get($autosuggestData_composeSelectionStart, [$currentInstance, realm], 0)
 | |
|       ),
 | |
|       composeFocused: ({ $autosuggestData_composeFocused, $currentInstance, realm }) => (
 | |
|         get($autosuggestData_composeFocused, [$currentInstance, realm], false)
 | |
|       ),
 | |
|       autosuggestSearchResults: ({ $autosuggestData_autosuggestSearchResults, $currentInstance, realm }) => (
 | |
|         get($autosuggestData_autosuggestSearchResults, [$currentInstance, realm], [])
 | |
|       ),
 | |
|       autosuggestType: ({ $autosuggestData_autosuggestType, $currentInstance, realm }) => (
 | |
|         get($autosuggestData_autosuggestType, [$currentInstance, realm])
 | |
|       ),
 | |
|       autosuggestSelected: ({ $autosuggestData_autosuggestSelected, $currentInstance, realm }) => (
 | |
|         get($autosuggestData_autosuggestSelected, [$currentInstance, realm], 0)
 | |
|       ),
 | |
|       autosuggestSearchText: ({ $autosuggestData_autosuggestSelected, $currentInstance, realm }) => (
 | |
|         get($autosuggestData_autosuggestSelected, [$currentInstance, realm])
 | |
|       ),
 | |
|       /* eslint-enable camelcase */
 | |
|       shouldBeShown: ({ realm, $autosuggestShown, composeFocused }) => (
 | |
|         !!($autosuggestShown && composeFocused)
 | |
|       )
 | |
|     },
 | |
|     data: () => ({
 | |
|       shown: false
 | |
|     }),
 | |
|     store: () => store,
 | |
|     components: {
 | |
|       ComposeAutosuggestionList
 | |
|     }
 | |
|   }
 | |
| </script> |