| 
									
										
										
										
											2018-05-01 17:05:36 -07:00
										 |  |  | <div class="toast-modal {shown ? 'shown' : ''}" role="alert" aria-hidden={shown}> | 
					
						
							| 
									
										
										
										
											2018-01-14 11:22:57 -08:00
										 |  |  |   <div class="toast-container"> | 
					
						
							| 
									
										
										
										
											2018-05-01 17:05:36 -07:00
										 |  |  |     {text} | 
					
						
							| 
									
										
										
										
											2018-01-14 11:22:57 -08:00
										 |  |  |   </div> | 
					
						
							|  |  |  | </div> | 
					
						
							|  |  |  | <style> | 
					
						
							|  |  |  |   .toast-modal { | 
					
						
							|  |  |  |     position: fixed; | 
					
						
							|  |  |  |     bottom: 40px; | 
					
						
							|  |  |  |     left: 0; | 
					
						
							|  |  |  |     right: 0; | 
					
						
							|  |  |  |     opacity: 0; | 
					
						
							|  |  |  |     transition: opacity 333ms linear; | 
					
						
							|  |  |  |     display: flex; | 
					
						
							|  |  |  |     flex-direction: column; | 
					
						
							|  |  |  |     align-items: center; | 
					
						
							|  |  |  |     pointer-events: none; | 
					
						
							| 
									
										
										
										
											2018-05-12 15:00:11 -07:00
										 |  |  |     z-index: 100000; | 
					
						
							| 
									
										
										
										
											2018-01-14 11:22:57 -08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   .toast-container { | 
					
						
							|  |  |  |     max-width: 600px; | 
					
						
							|  |  |  |     max-height: 20vh; | 
					
						
							|  |  |  |     overflow: hidden; | 
					
						
							|  |  |  |     display: flex; | 
					
						
							|  |  |  |     flex-direction: column; | 
					
						
							|  |  |  |     align-items: center; | 
					
						
							|  |  |  |     border: 2px solid var(--toast-border); | 
					
						
							|  |  |  |     background: var(--toast-bg); | 
					
						
							|  |  |  |     border-radius: 5px; | 
					
						
							|  |  |  |     margin: 0 40px; | 
					
						
							|  |  |  |     padding: 20px; | 
					
						
							|  |  |  |     font-size: 1.3em; | 
					
						
							|  |  |  |     color: var(--toast-text); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   .toast-modal.shown { | 
					
						
							| 
									
										
										
										
											2018-01-14 12:14:47 -08:00
										 |  |  |     opacity: 0.9; | 
					
						
							| 
									
										
										
										
											2018-01-14 11:22:57 -08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   @media (max-width: 767px) { | 
					
						
							|  |  |  |     .toast-container { | 
					
						
							|  |  |  |       max-width: 80vw; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | </style> | 
					
						
							|  |  |  | <script> | 
					
						
							| 
									
										
										
										
											2018-04-30 08:29:04 -07:00
										 |  |  |   import { splice, push, observe } from 'svelte-extras' | 
					
						
							| 
									
										
										
										
											2018-01-14 11:22:57 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   const TIME_TO_SHOW_TOAST = 5000 | 
					
						
							|  |  |  |   const DELAY_BETWEEN_TOASTS = 1000 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   export default { | 
					
						
							|  |  |  |     oncreate () { | 
					
						
							|  |  |  |       this._queue = Promise.resolve() | 
					
						
							|  |  |  |       this.observe('messages', (messages) => { | 
					
						
							|  |  |  |         if (messages.length) { | 
					
						
							|  |  |  |           this.onNewToast(messages[0]) | 
					
						
							|  |  |  |           this.splice('messages', 0, 1) | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }) | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     data: () => ({ | 
					
						
							|  |  |  |       text: '', | 
					
						
							|  |  |  |       shown: false, | 
					
						
							|  |  |  |       messages: [] | 
					
						
							|  |  |  |     }), | 
					
						
							|  |  |  |     methods: { | 
					
						
							| 
									
										
										
										
											2018-04-30 08:29:04 -07:00
										 |  |  |       observe, | 
					
						
							| 
									
										
										
										
											2018-01-14 11:22:57 -08:00
										 |  |  |       push, | 
					
						
							|  |  |  |       splice, | 
					
						
							| 
									
										
										
										
											2018-04-19 21:38:01 -07:00
										 |  |  |       say (text) { | 
					
						
							| 
									
										
										
										
											2018-01-14 11:22:57 -08:00
										 |  |  |         this.push('messages', text) | 
					
						
							|  |  |  |       }, | 
					
						
							| 
									
										
										
										
											2018-04-19 21:38:01 -07:00
										 |  |  |       onNewToast (text) { | 
					
						
							| 
									
										
										
										
											2018-01-14 11:22:57 -08:00
										 |  |  |         this._queue = this._queue.then(() => { | 
					
						
							|  |  |  |           this.set({ | 
					
						
							|  |  |  |             'text': text, | 
					
						
							|  |  |  |             shown: true | 
					
						
							|  |  |  |           }) | 
					
						
							|  |  |  |           return new Promise(resolve => { | 
					
						
							|  |  |  |             setTimeout(resolve, TIME_TO_SHOW_TOAST) | 
					
						
							|  |  |  |           }) | 
					
						
							|  |  |  |         }).then(() => { | 
					
						
							|  |  |  |           this.set({ | 
					
						
							|  |  |  |             shown: false | 
					
						
							|  |  |  |           }) | 
					
						
							|  |  |  |           return new Promise(resolve => { | 
					
						
							|  |  |  |             setTimeout(resolve, DELAY_BETWEEN_TOASTS) | 
					
						
							|  |  |  |           }) | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | </script> |