| 
									
										
										
										
											2018-04-09 18:30:15 -07:00
										 |  |  | <div class="compose-media"> | 
					
						
							| 
									
										
										
										
											2018-05-01 17:05:36 -07:00
										 |  |  |   <img src={mediaItem.data.preview_url} alt={mediaItem.file.name}/> | 
					
						
							| 
									
										
										
										
											2018-04-09 18:30:15 -07:00
										 |  |  |   <div class="compose-media-delete"> | 
					
						
							|  |  |  |     <button class="compose-media-delete-button" | 
					
						
							| 
									
										
										
										
											2018-05-01 17:05:36 -07:00
										 |  |  |             aria-label="Delete {mediaItem.file.name}" | 
					
						
							| 
									
										
										
										
											2018-04-09 18:30:15 -07:00
										 |  |  |             on:click="onDeleteMedia()" > | 
					
						
							|  |  |  |       <svg class="compose-media-delete-button-svg"> | 
					
						
							|  |  |  |         <use xlink:href="#fa-times" /> | 
					
						
							|  |  |  |       </svg> | 
					
						
							|  |  |  |     </button> | 
					
						
							|  |  |  |   </div> | 
					
						
							|  |  |  |   <div class="compose-media-alt"> | 
					
						
							|  |  |  |     <input type="text" | 
					
						
							|  |  |  |            placeholder="Description" | 
					
						
							| 
									
										
										
										
											2018-05-01 17:05:36 -07:00
										 |  |  |            aria-label="Describe {mediaItem.file.name} for the visually impaired" | 
					
						
							| 
									
										
										
										
											2018-04-09 18:30:15 -07:00
										 |  |  |            bind:value=rawText | 
					
						
							|  |  |  |     > | 
					
						
							|  |  |  |   </div> | 
					
						
							|  |  |  | </div> | 
					
						
							|  |  |  | <style> | 
					
						
							|  |  |  |   .compose-media { | 
					
						
							|  |  |  |     height: 200px; | 
					
						
							|  |  |  |     overflow: hidden; | 
					
						
							|  |  |  |     flex-direction: column; | 
					
						
							|  |  |  |     position: relative; | 
					
						
							|  |  |  |     display: flex; | 
					
						
							|  |  |  |     background: var(--main-bg); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   .compose-media img { | 
					
						
							|  |  |  |     object-fit: contain; | 
					
						
							|  |  |  |     object-position: center center; | 
					
						
							|  |  |  |     flex: 1; | 
					
						
							|  |  |  |     height: 100%; | 
					
						
							|  |  |  |     width: 100%; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   .compose-media-alt { | 
					
						
							|  |  |  |     z-index: 10; | 
					
						
							|  |  |  |     position: absolute; | 
					
						
							|  |  |  |     bottom: 0; | 
					
						
							|  |  |  |     left: 0; | 
					
						
							|  |  |  |     right: 0; | 
					
						
							|  |  |  |     display: flex; | 
					
						
							|  |  |  |     justify-content: center; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   .compose-media-alt input { | 
					
						
							|  |  |  |     width: 100%; | 
					
						
							|  |  |  |     font-size: 1.2em; | 
					
						
							|  |  |  |     background: var(--alt-input-bg); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   .compose-media-alt input:focus { | 
					
						
							|  |  |  |     background: var(--main-bg); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   .compose-media-delete { | 
					
						
							|  |  |  |     position: absolute; | 
					
						
							|  |  |  |     z-index: 10; | 
					
						
							|  |  |  |     top: 0; | 
					
						
							|  |  |  |     right: 0; | 
					
						
							|  |  |  |     left: 0; | 
					
						
							|  |  |  |     display: flex; | 
					
						
							|  |  |  |     justify-content: flex-end; | 
					
						
							|  |  |  |     margin: 2px; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   .compose-media-delete-button { | 
					
						
							|  |  |  |     padding: 10px; | 
					
						
							|  |  |  |     background: none; | 
					
						
							|  |  |  |     border: none; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   .compose-media-delete-button:hover { | 
					
						
							|  |  |  |     background: var(--toast-border); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   .compose-media-delete-button-svg { | 
					
						
							|  |  |  |     fill: var(--button-text); | 
					
						
							|  |  |  |     width: 18px; | 
					
						
							|  |  |  |     height: 18px; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | </style> | 
					
						
							|  |  |  | <script> | 
					
						
							|  |  |  |   import { store } from '../../_store/store' | 
					
						
							|  |  |  |   import { deleteMedia } from '../../_actions/media' | 
					
						
							|  |  |  |   import debounce from 'lodash-es/debounce' | 
					
						
							|  |  |  |   import { scheduleIdleTask } from '../../_utils/scheduleIdleTask' | 
					
						
							| 
									
										
										
										
											2018-04-30 08:29:04 -07:00
										 |  |  |   import { observe } from 'svelte-extras' | 
					
						
							| 
									
										
										
										
											2018-04-09 18:30:15 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   export default { | 
					
						
							| 
									
										
										
										
											2018-04-19 21:38:01 -07:00
										 |  |  |     oncreate () { | 
					
						
							| 
									
										
										
										
											2018-04-09 18:30:15 -07:00
										 |  |  |       this.setupSyncFromStore() | 
					
						
							|  |  |  |       this.setupSyncToStore() | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     data: () => ({ | 
					
						
							|  |  |  |       rawText: '' | 
					
						
							|  |  |  |     }), | 
					
						
							|  |  |  |     store: () => store, | 
					
						
							|  |  |  |     methods: { | 
					
						
							| 
									
										
										
										
											2018-04-30 08:29:04 -07:00
										 |  |  |       observe, | 
					
						
							| 
									
										
										
										
											2018-04-19 21:38:01 -07:00
										 |  |  |       setupSyncFromStore () { | 
					
						
							| 
									
										
										
										
											2018-04-09 18:30:15 -07:00
										 |  |  |         this.observe('mediaDescriptions', mediaDescriptions => { | 
					
						
							|  |  |  |           mediaDescriptions = mediaDescriptions || [] | 
					
						
							| 
									
										
										
										
											2018-04-19 09:37:05 -07:00
										 |  |  |           let { index, rawText } = this.get() | 
					
						
							| 
									
										
										
										
											2018-04-09 18:30:15 -07:00
										 |  |  |           let text = mediaDescriptions[index] || '' | 
					
						
							| 
									
										
										
										
											2018-04-19 09:37:05 -07:00
										 |  |  |           if (rawText !== text) { | 
					
						
							| 
									
										
										
										
											2018-04-09 18:30:15 -07:00
										 |  |  |             this.set({rawText: text}) | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |       }, | 
					
						
							| 
									
										
										
										
											2018-04-19 21:38:01 -07:00
										 |  |  |       setupSyncToStore () { | 
					
						
							| 
									
										
										
										
											2018-04-09 18:30:15 -07:00
										 |  |  |         const saveStore = debounce(() => scheduleIdleTask(() => this.store.save()), 1000) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         this.observe('rawText', rawText => { | 
					
						
							| 
									
										
										
										
											2018-04-19 09:37:05 -07:00
										 |  |  |           let { realm } = this.get() | 
					
						
							|  |  |  |           let { index } = this.get() | 
					
						
							| 
									
										
										
										
											2018-04-09 18:30:15 -07:00
										 |  |  |           let mediaDescriptions = store.getComposeData(realm, 'mediaDescriptions') || [] | 
					
						
							|  |  |  |           if (mediaDescriptions[index] === rawText) { | 
					
						
							|  |  |  |             return | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |           while (mediaDescriptions.length <= index) { | 
					
						
							|  |  |  |             mediaDescriptions.push(null) | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |           mediaDescriptions[index] = rawText | 
					
						
							|  |  |  |           store.setComposeData(realm, {mediaDescriptions}) | 
					
						
							|  |  |  |           saveStore() | 
					
						
							|  |  |  |         }, {init: false}) | 
					
						
							|  |  |  |       }, | 
					
						
							| 
									
										
										
										
											2018-04-19 21:38:01 -07:00
										 |  |  |       onDeleteMedia () { | 
					
						
							| 
									
										
										
										
											2018-04-19 09:37:05 -07:00
										 |  |  |         let { | 
					
						
							|  |  |  |           realm, | 
					
						
							|  |  |  |           index | 
					
						
							|  |  |  |         } = this.get() | 
					
						
							|  |  |  |         deleteMedia(realm, index) | 
					
						
							| 
									
										
										
										
											2018-04-09 18:30:15 -07:00
										 |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | </script> |