diff options
author | Paul Frazee <pfrazee@gmail.com> | 2023-03-03 15:13:31 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-03-03 15:13:31 -0600 |
commit | a9920d963041e53be5c454da30f8109c2a145d19 (patch) | |
tree | b02b37ffb7ac972f8e34944749fd6cdc6b67b05d /src | |
parent | c2bfa111ac1f2c5fed2dd1caa92106849b14eaec (diff) | |
download | voidsky-a9920d963041e53be5c454da30f8109c2a145d19.tar.zst |
Add translate link to post menu (#261)
* Add a google translate menu item to posts * Fix: make sure the dropdown menu is always visible (when low on the screen)
Diffstat (limited to 'src')
-rw-r--r-- | src/view/com/post-thread/PostThreadItem.tsx | 10 | ||||
-rw-r--r-- | src/view/com/post/Post.tsx | 7 | ||||
-rw-r--r-- | src/view/com/posts/FeedItem.tsx | 8 | ||||
-rw-r--r-- | src/view/com/util/PostCtrls.tsx | 2 | ||||
-rw-r--r-- | src/view/com/util/forms/DropdownButton.tsx | 18 | ||||
-rw-r--r-- | src/view/index.ts | 2 |
6 files changed, 44 insertions, 3 deletions
diff --git a/src/view/com/post-thread/PostThreadItem.tsx b/src/view/com/post-thread/PostThreadItem.tsx index 4e14a84b7..8eda0962a 100644 --- a/src/view/com/post-thread/PostThreadItem.tsx +++ b/src/view/com/post-thread/PostThreadItem.tsx @@ -1,6 +1,6 @@ import React from 'react' import {observer} from 'mobx-react-lite' -import {StyleSheet, View} from 'react-native' +import {Linking, StyleSheet, View} from 'react-native' import Clipboard from '@react-native-clipboard/clipboard' import {AtUri} from '../../../third-party/uri' import { @@ -89,6 +89,11 @@ export const PostThreadItem = observer(function PostThreadItem({ Clipboard.setString(record?.text || '') Toast.show('Copied to clipboard') }, [record]) + const onOpenTranslate = React.useCallback(() => { + Linking.openURL( + encodeURI(`https://translate.google.com/#auto|en|${record?.text || ''}`), + ) + }, [record]) const onDeletePost = React.useCallback(() => { item.delete().then( () => { @@ -167,6 +172,7 @@ export const PostThreadItem = observer(function PostThreadItem({ itemTitle={itemTitle} isAuthor={item.post.author.did === store.me.did} onCopyPostText={onCopyPostText} + onOpenTranslate={onOpenTranslate} onDeletePost={onDeletePost}> <FontAwesomeIcon icon="ellipsis-h" @@ -259,6 +265,7 @@ export const PostThreadItem = observer(function PostThreadItem({ onPressToggleRepost={onPressToggleRepost} onPressToggleUpvote={onPressToggleUpvote} onCopyPostText={onCopyPostText} + onOpenTranslate={onOpenTranslate} onDeletePost={onDeletePost} /> </View> @@ -353,6 +360,7 @@ export const PostThreadItem = observer(function PostThreadItem({ onPressToggleRepost={onPressToggleRepost} onPressToggleUpvote={onPressToggleUpvote} onCopyPostText={onCopyPostText} + onOpenTranslate={onOpenTranslate} onDeletePost={onDeletePost} /> </View> diff --git a/src/view/com/post/Post.tsx b/src/view/com/post/Post.tsx index e8e6781f7..bf8dfed05 100644 --- a/src/view/com/post/Post.tsx +++ b/src/view/com/post/Post.tsx @@ -1,6 +1,7 @@ import React, {useState, useEffect} from 'react' import { ActivityIndicator, + Linking, StyleProp, StyleSheet, View, @@ -120,6 +121,11 @@ export const Post = observer(function Post({ Clipboard.setString(record.text) Toast.show('Copied to clipboard') } + const onOpenTranslate = () => { + Linking.openURL( + encodeURI(`https://translate.google.com/#auto|en|${record?.text || ''}`), + ) + } const onDeletePost = () => { item.delete().then( () => { @@ -214,6 +220,7 @@ export const Post = observer(function Post({ onPressToggleRepost={onPressToggleRepost} onPressToggleUpvote={onPressToggleUpvote} onCopyPostText={onCopyPostText} + onOpenTranslate={onOpenTranslate} onDeletePost={onDeletePost} /> </View> diff --git a/src/view/com/posts/FeedItem.tsx b/src/view/com/posts/FeedItem.tsx index 1847827c3..1006645a9 100644 --- a/src/view/com/posts/FeedItem.tsx +++ b/src/view/com/posts/FeedItem.tsx @@ -1,6 +1,6 @@ import React, {useMemo, useState} from 'react' import {observer} from 'mobx-react-lite' -import {StyleSheet, View} from 'react-native' +import {Linking, StyleSheet, View} from 'react-native' import Clipboard from '@react-native-clipboard/clipboard' import Svg, {Circle, Line} from 'react-native-svg' import {AtUri} from '../../../third-party/uri' @@ -86,6 +86,11 @@ export const FeedItem = observer(function ({ Clipboard.setString(record?.text || '') Toast.show('Copied to clipboard') } + const onOpenTranslate = React.useCallback(() => { + Linking.openURL( + encodeURI(`https://translate.google.com/#auto|en|${record?.text || ''}`), + ) + }, [record]) const onDeletePost = () => { track('FeedItem:PostDelete') item.delete().then( @@ -243,6 +248,7 @@ export const FeedItem = observer(function ({ onPressToggleRepost={onPressToggleRepost} onPressToggleUpvote={onPressToggleUpvote} onCopyPostText={onCopyPostText} + onOpenTranslate={onOpenTranslate} onDeletePost={onDeletePost} /> </View> diff --git a/src/view/com/util/PostCtrls.tsx b/src/view/com/util/PostCtrls.tsx index cb4dfab26..00e35eef7 100644 --- a/src/view/com/util/PostCtrls.tsx +++ b/src/view/com/util/PostCtrls.tsx @@ -52,6 +52,7 @@ interface PostCtrlsOpts { onPressToggleRepost: () => Promise<void> onPressToggleUpvote: () => Promise<void> onCopyPostText: () => void + onOpenTranslate: () => void onDeletePost: () => void } @@ -297,6 +298,7 @@ export function PostCtrls(opts: PostCtrlsOpts) { itemTitle={opts.itemTitle} isAuthor={opts.isAuthor} onCopyPostText={opts.onCopyPostText} + onOpenTranslate={opts.onOpenTranslate} onDeletePost={opts.onDeletePost}> <FontAwesomeIcon icon="ellipsis-h" diff --git a/src/view/com/util/forms/DropdownButton.tsx b/src/view/com/util/forms/DropdownButton.tsx index 2946c5ca0..dcabe5455 100644 --- a/src/view/com/util/forms/DropdownButton.tsx +++ b/src/view/com/util/forms/DropdownButton.tsx @@ -1,5 +1,6 @@ import React, {useRef} from 'react' import { + Dimensions, Share, StyleProp, StyleSheet, @@ -21,6 +22,7 @@ import {usePalette} from 'lib/hooks/usePalette' import {useTheme} from 'lib/ThemeContext' const HITSLOP = {left: 10, top: 10, right: 10, bottom: 10} +const ESTIMATED_MENU_ITEM_HEIGHT = 52 export interface DropdownItem { icon?: IconProp @@ -67,10 +69,15 @@ export function DropdownButton({ if (!menuWidth) { menuWidth = 200 } + const winHeight = Dimensions.get('window').height + const estimatedMenuHeight = items.length * ESTIMATED_MENU_ITEM_HEIGHT const newX = openToRight ? pageX + width + rightOffset : pageX + width - menuWidth - const newY = pageY + height + bottomOffset + let newY = pageY + height + bottomOffset + if (newY + estimatedMenuHeight > winHeight) { + newY -= estimatedMenuHeight + } createDropdownMenu( newX, newY, @@ -114,6 +121,7 @@ export function PostDropdownBtn({ itemHref, isAuthor, onCopyPostText, + onOpenTranslate, onDeletePost, }: { style?: StyleProp<ViewStyle> @@ -124,6 +132,7 @@ export function PostDropdownBtn({ itemTitle: string isAuthor: boolean onCopyPostText: () => void + onOpenTranslate: () => void onDeletePost: () => void }) { const store = useStores() @@ -153,6 +162,13 @@ export function PostDropdownBtn({ }, }, { + icon: 'language', + label: 'Translate...', + onPress() { + onOpenTranslate() + }, + }, + { icon: 'circle-exclamation', label: 'Report post', onPress() { diff --git a/src/view/index.ts b/src/view/index.ts index c2ad84671..d1e9d2036 100644 --- a/src/view/index.ts +++ b/src/view/index.ts @@ -42,6 +42,7 @@ import {faHouse} from '@fortawesome/free-solid-svg-icons/faHouse' import {faImage as farImage} from '@fortawesome/free-regular-svg-icons/faImage' import {faImage} from '@fortawesome/free-solid-svg-icons/faImage' import {faInfo} from '@fortawesome/free-solid-svg-icons/faInfo' +import {faLanguage} from '@fortawesome/free-solid-svg-icons/faLanguage' import {faLink} from '@fortawesome/free-solid-svg-icons/faLink' import {faLock} from '@fortawesome/free-solid-svg-icons/faLock' import {faMagnifyingGlass} from '@fortawesome/free-solid-svg-icons/faMagnifyingGlass' @@ -113,6 +114,7 @@ export function setup() { faImage, farImage, faInfo, + faLanguage, faLink, faLock, faMagnifyingGlass, |