Support CMD + Enter to publish post
parent
8917cf77a0
commit
31df05825c
|
@ -123,65 +123,67 @@ export const ComposePost = observer(function ComposePost({
|
||||||
[gallery, track],
|
[gallery, track],
|
||||||
)
|
)
|
||||||
|
|
||||||
const onPressPublish = useCallback(async () => {
|
const onPressPublish = useCallback(
|
||||||
if (isProcessing || richtext.graphemeLength > MAX_GRAPHEME_LENGTH) {
|
async rt => {
|
||||||
return
|
if (isProcessing || rt.graphemeLength_ > MAX_GRAPHEME_LENGTH) {
|
||||||
}
|
return
|
||||||
|
|
||||||
setError('')
|
|
||||||
|
|
||||||
if (richtext.text.trim().length === 0 && gallery.isEmpty) {
|
|
||||||
setError('Did you want to say anything?')
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
setIsProcessing(true)
|
|
||||||
|
|
||||||
try {
|
|
||||||
await apilib.post(store, {
|
|
||||||
rawText: richtext.text,
|
|
||||||
replyTo: replyTo?.uri,
|
|
||||||
images: gallery.paths,
|
|
||||||
quote: quote,
|
|
||||||
extLink: extLink,
|
|
||||||
onStateChange: setProcessingState,
|
|
||||||
knownHandles: autocompleteView.knownHandles,
|
|
||||||
})
|
|
||||||
track('Create Post', {
|
|
||||||
imageCount: gallery.size,
|
|
||||||
})
|
|
||||||
} catch (e: any) {
|
|
||||||
if (extLink) {
|
|
||||||
setExtLink({
|
|
||||||
...extLink,
|
|
||||||
isLoading: true,
|
|
||||||
localThumb: undefined,
|
|
||||||
} as apilib.ExternalEmbedDraft)
|
|
||||||
}
|
}
|
||||||
setError(cleanError(e.message))
|
|
||||||
setIsProcessing(false)
|
setError('')
|
||||||
return
|
|
||||||
}
|
if (rt.text.trim().length === 0 && gallery.isEmpty) {
|
||||||
store.me.mainFeed.checkForLatest({autoPrepend: true})
|
setError('Did you want to say anything?')
|
||||||
onPost?.()
|
return false
|
||||||
hackfixOnClose()
|
}
|
||||||
Toast.show(`Your ${replyTo ? 'reply' : 'post'} has been published`)
|
|
||||||
}, [
|
setIsProcessing(true)
|
||||||
isProcessing,
|
|
||||||
richtext,
|
try {
|
||||||
setError,
|
await apilib.post(store, {
|
||||||
setIsProcessing,
|
rawText: rt.text,
|
||||||
replyTo,
|
replyTo: replyTo?.uri,
|
||||||
autocompleteView.knownHandles,
|
images: gallery.paths,
|
||||||
extLink,
|
quote: quote,
|
||||||
hackfixOnClose,
|
extLink: extLink,
|
||||||
onPost,
|
onStateChange: setProcessingState,
|
||||||
quote,
|
knownHandles: autocompleteView.knownHandles,
|
||||||
setExtLink,
|
})
|
||||||
store,
|
track('Create Post', {
|
||||||
track,
|
imageCount: gallery.size,
|
||||||
gallery,
|
})
|
||||||
])
|
} catch (e: any) {
|
||||||
|
if (extLink) {
|
||||||
|
setExtLink({
|
||||||
|
...extLink,
|
||||||
|
isLoading: true,
|
||||||
|
localThumb: undefined,
|
||||||
|
} as apilib.ExternalEmbedDraft)
|
||||||
|
}
|
||||||
|
setError(cleanError(e.message))
|
||||||
|
setIsProcessing(false)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
store.me.mainFeed.checkForLatest({autoPrepend: true})
|
||||||
|
onPost?.()
|
||||||
|
hackfixOnClose()
|
||||||
|
Toast.show(`Your ${replyTo ? 'reply' : 'post'} has been published`)
|
||||||
|
},
|
||||||
|
[
|
||||||
|
isProcessing,
|
||||||
|
setError,
|
||||||
|
setIsProcessing,
|
||||||
|
replyTo,
|
||||||
|
autocompleteView.knownHandles,
|
||||||
|
extLink,
|
||||||
|
hackfixOnClose,
|
||||||
|
onPost,
|
||||||
|
quote,
|
||||||
|
setExtLink,
|
||||||
|
store,
|
||||||
|
track,
|
||||||
|
gallery,
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
const canPost = graphemeLength <= MAX_GRAPHEME_LENGTH
|
const canPost = graphemeLength <= MAX_GRAPHEME_LENGTH
|
||||||
|
|
||||||
|
@ -218,7 +220,9 @@ export const ComposePost = observer(function ComposePost({
|
||||||
) : canPost ? (
|
) : canPost ? (
|
||||||
<TouchableOpacity
|
<TouchableOpacity
|
||||||
testID="composerPublishBtn"
|
testID="composerPublishBtn"
|
||||||
onPress={onPressPublish}>
|
onPress={() => {
|
||||||
|
onPressPublish(richtext)
|
||||||
|
}}>
|
||||||
<LinearGradient
|
<LinearGradient
|
||||||
colors={[gradients.blueLight.start, gradients.blueLight.end]}
|
colors={[gradients.blueLight.start, gradients.blueLight.end]}
|
||||||
start={{x: 0, y: 0}}
|
start={{x: 0, y: 0}}
|
||||||
|
@ -281,6 +285,7 @@ export const ComposePost = observer(function ComposePost({
|
||||||
autocompleteView={autocompleteView}
|
autocompleteView={autocompleteView}
|
||||||
setRichText={setRichText}
|
setRichText={setRichText}
|
||||||
onPhotoPasted={onPhotoPasted}
|
onPhotoPasted={onPhotoPasted}
|
||||||
|
onPressPublish={onPressPublish}
|
||||||
onSuggestedLinksChanged={setSuggestedLinks}
|
onSuggestedLinksChanged={setSuggestedLinks}
|
||||||
onError={setError}
|
onError={setError}
|
||||||
/>
|
/>
|
||||||
|
|
|
@ -34,6 +34,7 @@ interface TextInputProps {
|
||||||
autocompleteView: UserAutocompleteModel
|
autocompleteView: UserAutocompleteModel
|
||||||
setRichText: (v: RichText) => void
|
setRichText: (v: RichText) => void
|
||||||
onPhotoPasted: (uri: string) => void
|
onPhotoPasted: (uri: string) => void
|
||||||
|
onPressPublish: (richtext: RichText) => Promise<false | undefined>
|
||||||
onSuggestedLinksChanged: (uris: Set<string>) => void
|
onSuggestedLinksChanged: (uris: Set<string>) => void
|
||||||
onError: (err: string) => void
|
onError: (err: string) => void
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,6 +26,7 @@ interface TextInputProps {
|
||||||
autocompleteView: UserAutocompleteModel
|
autocompleteView: UserAutocompleteModel
|
||||||
setRichText: (v: RichText) => void
|
setRichText: (v: RichText) => void
|
||||||
onPhotoPasted: (uri: string) => void
|
onPhotoPasted: (uri: string) => void
|
||||||
|
onPressPublish: (richtext: RichText) => Promise<false | undefined>
|
||||||
onSuggestedLinksChanged: (uris: Set<string>) => void
|
onSuggestedLinksChanged: (uris: Set<string>) => void
|
||||||
onError: (err: string) => void
|
onError: (err: string) => void
|
||||||
}
|
}
|
||||||
|
@ -39,6 +40,7 @@ export const TextInput = React.forwardRef(
|
||||||
autocompleteView,
|
autocompleteView,
|
||||||
setRichText,
|
setRichText,
|
||||||
onPhotoPasted,
|
onPhotoPasted,
|
||||||
|
onPressPublish,
|
||||||
onSuggestedLinksChanged,
|
onSuggestedLinksChanged,
|
||||||
}: // onError, TODO
|
}: // onError, TODO
|
||||||
TextInputProps,
|
TextInputProps,
|
||||||
|
@ -82,6 +84,16 @@ export const TextInput = React.forwardRef(
|
||||||
|
|
||||||
getImageFromUri(items, onPhotoPasted)
|
getImageFromUri(items, onPhotoPasted)
|
||||||
},
|
},
|
||||||
|
handleKeyDown: (_, event) => {
|
||||||
|
if (event.metaKey && event.code === 'Enter') {
|
||||||
|
// Workaround relying on previous state from `setRichText` to
|
||||||
|
// get the updated text content during editor initialization
|
||||||
|
setRichText((state: RichText) => {
|
||||||
|
onPressPublish(state)
|
||||||
|
return state
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
},
|
},
|
||||||
content: richtext.text.toString(),
|
content: richtext.text.toString(),
|
||||||
autofocus: true,
|
autofocus: true,
|
||||||
|
|
Loading…
Reference in New Issue