69 lines
		
	
	
		
			No EOL
		
	
	
		
			2 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			No EOL
		
	
	
		
			2 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
| <textarea
 | |
|   class="compose-box-input"
 | |
|   placeholder="What's on your mind?"
 | |
|   ref:textarea
 | |
|   bind:value=$rawComposeText
 | |
|   on:blur="onBlur()"
 | |
| ></textarea>
 | |
| <style>
 | |
|   .compose-box-input {
 | |
|     grid-area: input;
 | |
|     margin: 10px 0 0 5px;
 | |
|     padding: 10px;
 | |
|     border: 1px solid var(--input-border);
 | |
|     min-height: 75px;
 | |
|     resize: none;
 | |
|     overflow: hidden;
 | |
|     word-wrap: break-word;
 | |
|     /* Text must be at least 16px or else iOS Safari zooms in */
 | |
|     font-size: 1.2em;
 | |
|     /* Hack to make Edge stretch the element all the way to the right.
 | |
|      * Also desktop Safari makes the gauge stretch too far to the right without it.
 | |
|      */
 | |
|     width: calc(100% - 5px);
 | |
|   }
 | |
| </style>
 | |
| <script>
 | |
|   import { store } from '../../_store/store'
 | |
|   import { autosize } from '../../_utils/autosize'
 | |
|   import { scheduleIdleTask } from '../../_utils/scheduleIdleTask'
 | |
|   import debounce from 'lodash/debounce'
 | |
|   import { mark, stop } from '../../_utils/marks'
 | |
| 
 | |
|   export default {
 | |
|     oncreate() {
 | |
|       this.store.set({rawComposeText: store.get('currentComposeText')})
 | |
| 
 | |
|       requestAnimationFrame(() => {
 | |
|         mark('autosize()')
 | |
|         autosize(this.refs.textarea)
 | |
|         stop('autosize()')
 | |
|       })
 | |
| 
 | |
|       const saveText = debounce(() => scheduleIdleTask(() => this.store.save()), 1000)
 | |
| 
 | |
|       this.observe('rawComposeText', rawComposeText => {
 | |
|         let composeText = this.store.get('composeText')
 | |
|         let currentInstance = this.store.get('currentInstance')
 | |
|         composeText[currentInstance] = rawComposeText || ''
 | |
|         this.store.set({composeText: composeText})
 | |
|         saveText()
 | |
|       }, {init: false})
 | |
|     },
 | |
|     ondestroy() {
 | |
|       mark('autosize.destroy()')
 | |
|       autosize.destroy(this.refs.textarea)
 | |
|       stop('autosize.destroy()')
 | |
|     },
 | |
|     methods: {
 | |
|       onBlur() {
 | |
|         this.store.set({composeSelectionStart: this.refs.textarea.selectionStart})
 | |
|       }
 | |
|     },
 | |
|     store: () => store,
 | |
|     computed: {
 | |
|       rawComposeText: ($rawComposeText) => $rawComposeText,
 | |
|       currentComposeText: ($currentComposeText) => $currentComposeText
 | |
|     }
 | |
|   }
 | |
| </script> |