| 
									
										
										
										
											2018-03-30 01:06:17 -07:00
										 |  |  | <div class="{{computedClassName}} {{hideAndFadeIn}}"> | 
					
						
							| 
									
										
										
										
											2018-03-03 10:11:32 -08:00
										 |  |  |   <ComposeAuthor /> | 
					
						
							| 
									
										
										
										
											2018-03-03 15:44:43 -08:00
										 |  |  |   {{#if contentWarningShown}} | 
					
						
							| 
									
										
										
										
											2018-03-03 16:25:22 -08:00
										 |  |  |     <div class="compose-content-warning-wrapper" | 
					
						
							|  |  |  |          transition:slide="{duration: 333}"> | 
					
						
							|  |  |  |       <ComposeContentWarning :realm :contentWarning /> | 
					
						
							|  |  |  |     </div> | 
					
						
							| 
									
										
										
										
											2018-03-03 15:44:43 -08:00
										 |  |  |   {{/if}} | 
					
						
							| 
									
										
										
										
											2018-03-16 19:04:48 -07:00
										 |  |  |   <ComposeInput :realm :text :autoFocus /> | 
					
						
							| 
									
										
										
										
											2018-03-03 16:12:48 -08:00
										 |  |  |   <ComposeLengthGauge :length :overLimit /> | 
					
						
							| 
									
										
										
										
											2018-03-24 18:04:54 -07:00
										 |  |  |   <ComposeToolbar :realm :postPrivacy :media :contentWarningShown :text /> | 
					
						
							| 
									
										
										
										
											2018-03-03 16:12:48 -08:00
										 |  |  |   <ComposeLengthIndicator :length :overLimit /> | 
					
						
							| 
									
										
										
										
											2018-03-03 14:51:48 -08:00
										 |  |  |   <ComposeMedia :realm :media /> | 
					
						
							| 
									
										
										
										
											2018-02-25 16:26:43 -08:00
										 |  |  | </div> | 
					
						
							| 
									
										
										
										
											2018-03-29 23:16:53 -07:00
										 |  |  | <div class="compose-box-button-sentinel {{hideAndFadeIn}}" ref:sentinel></div> | 
					
						
							| 
									
										
										
										
											2018-03-30 01:06:17 -07:00
										 |  |  | <div class="compose-box-button-wrapper {{realm === 'home' ? 'compose-button-sticky' : ''}} {{hideAndFadeIn}}" > | 
					
						
							| 
									
										
										
										
											2018-03-27 00:02:55 -07:00
										 |  |  |  <ComposeButton :length :overLimit :sticky on:click="onClickPostButton()" /> | 
					
						
							|  |  |  | </div> | 
					
						
							| 
									
										
										
										
											2018-03-30 01:06:17 -07:00
										 |  |  | {{#if !hideBottomBorder}} | 
					
						
							|  |  |  |   <div class="compose-box-border-bottom {{hideAndFadeIn}}"></div> | 
					
						
							|  |  |  | {{/if}} | 
					
						
							| 
									
										
										
										
											2018-02-25 16:26:43 -08:00
										 |  |  | <style> | 
					
						
							| 
									
										
										
										
											2018-02-26 21:54:21 -08:00
										 |  |  |   .compose-box { | 
					
						
							| 
									
										
										
										
											2018-02-25 16:26:43 -08:00
										 |  |  |     border-radius: 4px; | 
					
						
							| 
									
										
										
										
											2018-03-27 00:02:55 -07:00
										 |  |  |     padding: 20px 20px 0 20px; | 
					
						
							| 
									
										
										
										
											2018-02-25 16:26:43 -08:00
										 |  |  |     display: grid; | 
					
						
							|  |  |  |     align-items: flex-start; | 
					
						
							|  |  |  |     grid-template-areas: | 
					
						
							| 
									
										
										
										
											2018-03-03 15:44:43 -08:00
										 |  |  |       "avatar name       handle    handle" | 
					
						
							|  |  |  |       "avatar cw         cw        cw" | 
					
						
							|  |  |  |       "avatar input      input     input" | 
					
						
							|  |  |  |       "avatar gauge      gauge     gauge" | 
					
						
							|  |  |  |       "avatar toolbar    toolbar   length" | 
					
						
							| 
									
										
										
										
											2018-03-27 00:02:55 -07:00
										 |  |  |       "avatar media      media     media"; | 
					
						
							| 
									
										
										
										
											2018-02-26 20:55:49 -08:00
										 |  |  |     grid-template-columns: min-content minmax(0, max-content) 1fr 1fr; | 
					
						
							| 
									
										
										
										
											2018-02-25 16:26:43 -08:00
										 |  |  |     width: 560px; | 
					
						
							|  |  |  |     max-width: calc(100vw - 40px); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-30 01:06:17 -07:00
										 |  |  |   .compose-box.slim-size { | 
					
						
							| 
									
										
										
										
											2018-03-27 00:02:55 -07:00
										 |  |  |     width: 540px; | 
					
						
							| 
									
										
										
										
											2018-03-28 09:05:22 -07:00
										 |  |  |     max-width: calc(100vw - 60px); | 
					
						
							| 
									
										
										
										
											2018-03-27 00:02:55 -07:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-29 23:16:53 -07:00
										 |  |  |   .compose-box-fade-in { | 
					
						
							|  |  |  |     transition: opacity 0.2s linear; /* main page reveal */ | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-27 00:02:55 -07:00
										 |  |  |   .compose-box-border-bottom { | 
					
						
							|  |  |  |     height: 1px; | 
					
						
							|  |  |  |     background: var(--main-border); | 
					
						
							|  |  |  |     width: 100%; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   .compose-box-button-wrapper { | 
					
						
							|  |  |  |     width: 100%; | 
					
						
							|  |  |  |     display: flex; | 
					
						
							|  |  |  |     justify-content: flex-end; | 
					
						
							| 
									
										
										
										
											2018-03-30 01:06:17 -07:00
										 |  |  |     pointer-events: none; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   .compose-box-button-wrapper.compose-button-sticky { | 
					
						
							| 
									
										
										
										
											2018-03-27 00:02:55 -07:00
										 |  |  |     position: -webkit-sticky; | 
					
						
							|  |  |  |     position: sticky; | 
					
						
							|  |  |  |     top: 10px; | 
					
						
							| 
									
										
										
										
											2018-03-27 09:38:19 -07:00
										 |  |  |     z-index: 1000; | 
					
						
							| 
									
										
										
										
											2018-03-27 00:02:55 -07:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-03 16:25:22 -08:00
										 |  |  |   .compose-content-warning-wrapper { | 
					
						
							|  |  |  |     grid-area: cw; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-25 16:26:43 -08:00
										 |  |  |   @media (max-width: 767px) { | 
					
						
							| 
									
										
										
										
											2018-02-26 21:54:21 -08:00
										 |  |  |     .compose-box { | 
					
						
							| 
									
										
										
										
											2018-03-27 00:02:55 -07:00
										 |  |  |       padding: 10px 10px 0 10px; | 
					
						
							| 
									
										
										
										
											2018-02-25 16:26:43 -08:00
										 |  |  |       max-width: calc(100vw - 20px); | 
					
						
							|  |  |  |       width: 580px; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-03-30 01:06:17 -07:00
										 |  |  |     .compose-box.slim-size { | 
					
						
							| 
									
										
										
										
											2018-03-27 00:02:55 -07:00
										 |  |  |       width: 560px; | 
					
						
							|  |  |  |       max-width: calc(100vw - 40px); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     .compose-box-button-wrapper { | 
					
						
							|  |  |  |       top: 5px; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-02-25 16:26:43 -08:00
										 |  |  |   } | 
					
						
							|  |  |  | </style> | 
					
						
							|  |  |  | <script> | 
					
						
							| 
									
										
										
										
											2018-02-26 21:50:03 -08:00
										 |  |  |   import ComposeToolbar from './ComposeToolbar.html' | 
					
						
							|  |  |  |   import ComposeLengthGauge from './ComposeLengthGauge.html' | 
					
						
							|  |  |  |   import ComposeLengthIndicator from './ComposeLengthIndicator.html' | 
					
						
							| 
									
										
										
										
											2018-02-26 21:54:21 -08:00
										 |  |  |   import ComposeAuthor from './ComposeAuthor.html' | 
					
						
							| 
									
										
										
										
											2018-02-26 22:22:56 -08:00
										 |  |  |   import ComposeInput from './ComposeInput.html' | 
					
						
							|  |  |  |   import ComposeButton from './ComposeButton.html' | 
					
						
							| 
									
										
										
										
											2018-03-01 21:21:49 -08:00
										 |  |  |   import ComposeMedia from './ComposeMedia.html' | 
					
						
							| 
									
										
										
										
											2018-03-03 15:44:43 -08:00
										 |  |  |   import ComposeContentWarning from './ComposeContentWarning.html' | 
					
						
							| 
									
										
										
										
											2018-03-03 14:51:48 -08:00
										 |  |  |   import { measureText } from '../../_utils/measureText' | 
					
						
							|  |  |  |   import { CHAR_LIMIT, POST_PRIVACY_OPTIONS } from '../../_static/statuses' | 
					
						
							|  |  |  |   import { store } from '../../_store/store' | 
					
						
							| 
									
										
										
										
											2018-03-03 16:25:22 -08:00
										 |  |  |   import { slide } from 'svelte-transitions' | 
					
						
							| 
									
										
										
										
											2018-03-09 08:45:12 -08:00
										 |  |  |   import { postStatus, insertHandleForReply } from '../../_actions/compose' | 
					
						
							| 
									
										
										
										
											2018-03-27 00:02:55 -07:00
										 |  |  |   import { importDialogs } from '../../_utils/asyncModules' | 
					
						
							| 
									
										
										
										
											2018-03-29 23:16:53 -07:00
										 |  |  |   import { classname } from '../../_utils/classname' | 
					
						
							| 
									
										
										
										
											2018-02-25 17:21:17 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-30 10:04:35 -07:00
										 |  |  |   const PRIVACY_LEVEL = { | 
					
						
							|  |  |  |     'direct': 1, | 
					
						
							|  |  |  |     'private': 2, | 
					
						
							|  |  |  |     'unlisted': 3, | 
					
						
							|  |  |  |     'public': 4 | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-25 16:26:43 -08:00
										 |  |  |   export default { | 
					
						
							| 
									
										
										
										
											2018-03-07 18:04:20 -08:00
										 |  |  |     oncreate() { | 
					
						
							| 
									
										
										
										
											2018-03-09 08:45:12 -08:00
										 |  |  |       let realm = this.get('realm') | 
					
						
							| 
									
										
										
										
											2018-03-27 00:02:55 -07:00
										 |  |  |       if (realm === 'home') { | 
					
						
							|  |  |  |         this.__stickyObserver = new IntersectionObserver(entries => { | 
					
						
							|  |  |  |           this.set({sticky: !entries[0].isIntersecting}) | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |         this.__stickyObserver.observe(this.refs.sentinel) | 
					
						
							|  |  |  |       } else if (realm !== 'dialog') { | 
					
						
							| 
									
										
										
										
											2018-03-09 08:45:12 -08:00
										 |  |  |         // if this is a reply, populate the handle immediately | 
					
						
							|  |  |  |         insertHandleForReply(realm) | 
					
						
							| 
									
										
										
										
											2018-03-27 00:02:55 -07:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-03-09 08:45:12 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-27 00:02:55 -07:00
										 |  |  |       this.observe('postedStatusForRealm', postedStatusForRealm => { | 
					
						
							|  |  |  |         if (postedStatusForRealm !== realm) { | 
					
						
							|  |  |  |           return | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         this.fire('postedStatus') | 
					
						
							|  |  |  |       }, {init: false}) | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     ondestroy() { | 
					
						
							|  |  |  |       if (this.__stickyObserver) { | 
					
						
							|  |  |  |         this.__stickyObserver.disconnect() | 
					
						
							| 
									
										
										
										
											2018-03-09 22:31:26 -08:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-03-07 18:04:20 -08:00
										 |  |  |     }, | 
					
						
							| 
									
										
										
										
											2018-02-25 16:26:43 -08:00
										 |  |  |     components: { | 
					
						
							| 
									
										
										
										
											2018-02-26 21:54:21 -08:00
										 |  |  |       ComposeAuthor, | 
					
						
							| 
									
										
										
										
											2018-02-26 21:50:03 -08:00
										 |  |  |       ComposeToolbar, | 
					
						
							|  |  |  |       ComposeLengthGauge, | 
					
						
							| 
									
										
										
										
											2018-02-26 22:22:56 -08:00
										 |  |  |       ComposeLengthIndicator, | 
					
						
							|  |  |  |       ComposeInput, | 
					
						
							| 
									
										
										
										
											2018-03-01 21:21:49 -08:00
										 |  |  |       ComposeButton, | 
					
						
							| 
									
										
										
										
											2018-03-03 15:44:43 -08:00
										 |  |  |       ComposeMedia, | 
					
						
							|  |  |  |       ComposeContentWarning | 
					
						
							| 
									
										
										
										
											2018-03-03 14:51:48 -08:00
										 |  |  |     }, | 
					
						
							|  |  |  |     store: () => store, | 
					
						
							|  |  |  |     computed: { | 
					
						
							| 
									
										
										
										
											2018-03-30 01:06:17 -07:00
										 |  |  |       computedClassName: (overLimit, realm, size) => { | 
					
						
							| 
									
										
										
										
											2018-03-29 23:16:53 -07:00
										 |  |  |         return classname( | 
					
						
							|  |  |  |           'compose-box', | 
					
						
							|  |  |  |           overLimit && 'over-char-limit', | 
					
						
							| 
									
										
										
										
											2018-03-30 01:06:17 -07:00
										 |  |  |           size === 'slim' && 'slim-size' | 
					
						
							| 
									
										
										
										
											2018-03-29 23:16:53 -07:00
										 |  |  |         ) | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       hideAndFadeIn: (hidden) => { | 
					
						
							|  |  |  |         return classname( | 
					
						
							|  |  |  |           'compose-box-fade-in', | 
					
						
							|  |  |  |           hidden && 'hidden' | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |       }, | 
					
						
							| 
									
										
										
										
											2018-03-03 14:51:48 -08:00
										 |  |  |       composeData: ($currentComposeData, realm) => $currentComposeData[realm] || {}, | 
					
						
							|  |  |  |       text: (composeData) => composeData.text || '', | 
					
						
							|  |  |  |       media: (composeData) => composeData.media || [], | 
					
						
							|  |  |  |       postPrivacy: (postPrivacyKey) => POST_PRIVACY_OPTIONS.find(_ => _.key === postPrivacyKey), | 
					
						
							| 
									
										
										
										
											2018-03-30 10:04:35 -07:00
										 |  |  |       defaultPostPrivacyKey: ($currentVerifyCredentials, replyVisibility) => { | 
					
						
							|  |  |  |         let defaultVisibility = $currentVerifyCredentials.source.privacy | 
					
						
							|  |  |  |         // return the most private between the user's preferred default privacy | 
					
						
							|  |  |  |         // and the privacy of the status they're replying to | 
					
						
							|  |  |  |         if (replyVisibility && | 
					
						
							|  |  |  |             PRIVACY_LEVEL[replyVisibility] < PRIVACY_LEVEL[defaultVisibility]) { | 
					
						
							|  |  |  |           return replyVisibility | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return defaultVisibility | 
					
						
							|  |  |  |       }, | 
					
						
							| 
									
										
										
										
											2018-03-03 14:51:48 -08:00
										 |  |  |       postPrivacyKey: (composeData, defaultPostPrivacyKey) => composeData.postPrivacy || defaultPostPrivacyKey, | 
					
						
							|  |  |  |       textLength: (text) => measureText(text), | 
					
						
							| 
									
										
										
										
											2018-03-03 16:12:48 -08:00
										 |  |  |       contentWarningLength: (contentWarning) => measureText(contentWarning), | 
					
						
							|  |  |  |       length: (textLength, contentWarningLength, contentWarningShown) => { | 
					
						
							|  |  |  |         return textLength + (contentWarningShown ? contentWarningLength : 0) | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       overLimit: (length) => length > CHAR_LIMIT, | 
					
						
							| 
									
										
										
										
											2018-03-03 15:44:43 -08:00
										 |  |  |       contentWarningShown: (composeData) => composeData.contentWarningShown, | 
					
						
							| 
									
										
										
										
											2018-03-07 18:04:20 -08:00
										 |  |  |       contentWarning: (composeData) => composeData.contentWarning || '', | 
					
						
							|  |  |  |       postedStatusForRealm: ($postedStatusForRealm) => $postedStatusForRealm | 
					
						
							| 
									
										
										
										
											2018-03-03 16:25:22 -08:00
										 |  |  |     }, | 
					
						
							|  |  |  |     transitions: { | 
					
						
							|  |  |  |       slide | 
					
						
							| 
									
										
										
										
											2018-03-04 16:27:15 -08:00
										 |  |  |     }, | 
					
						
							|  |  |  |     methods: { | 
					
						
							| 
									
										
										
										
											2018-03-27 00:02:55 -07:00
										 |  |  |       async onClickPostButton() { | 
					
						
							|  |  |  |         if (this.get('sticky')) { | 
					
						
							|  |  |  |           // when the button is sticky, we're scrolled down the home timeline, | 
					
						
							|  |  |  |           // so we should launch a new compose dialog | 
					
						
							|  |  |  |           let dialogs = await importDialogs() | 
					
						
							|  |  |  |           dialogs.showComposeDialog() | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |           // else we're actually posting a new toot | 
					
						
							|  |  |  |           let text = this.get('text') | 
					
						
							|  |  |  |           let media = this.get('media') | 
					
						
							|  |  |  |           let postPrivacyKey = this.get('postPrivacyKey') | 
					
						
							|  |  |  |           let contentWarning = this.get('contentWarning') | 
					
						
							|  |  |  |           let sensitive = media.length && !!contentWarning | 
					
						
							|  |  |  |           let realm = this.get('realm') | 
					
						
							|  |  |  |           let mediaIds = media.map(_ => _.data.id) | 
					
						
							|  |  |  |           let inReplyTo = (realm === 'home' || realm === 'dialog') ? null : realm | 
					
						
							|  |  |  |           let overLimit = this.get('overLimit') | 
					
						
							| 
									
										
										
										
											2018-03-22 17:55:35 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-27 00:02:55 -07:00
										 |  |  |           if (!text || overLimit) { | 
					
						
							|  |  |  |             return // do nothing if invalid | 
					
						
							|  |  |  |           } | 
					
						
							| 
									
										
										
										
											2018-03-07 18:04:20 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-27 00:02:55 -07:00
										 |  |  |           /* no await */ | 
					
						
							|  |  |  |           postStatus(realm, text, inReplyTo, mediaIds, | 
					
						
							|  |  |  |             sensitive, contentWarning, postPrivacyKey) | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-03-04 16:27:15 -08:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-02-25 16:26:43 -08:00
										 |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2018-02-26 00:24:28 -08:00
										 |  |  | </script> |