diff --git a/package.json b/package.json index 96fc1cb6..bc2835fd 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "native": "220603", "major": 4, "minor": 1, - "patch": 2, + "patch": 3, "expo": "45.0.0" }, "description": "tooot app for Mastodon", diff --git a/src/components/GracefullyImage.tsx b/src/components/GracefullyImage.tsx index 5fa68666..01db6c04 100644 --- a/src/components/GracefullyImage.tsx +++ b/src/components/GracefullyImage.tsx @@ -5,12 +5,14 @@ import { AccessibilityProps, Image, ImageStyle, + Platform, Pressable, StyleProp, StyleSheet, View, ViewStyle } from 'react-native' +import FastImage from 'react-native-fast-image' import { Blurhash } from 'react-native-blurhash' // blurhas -> if blurhash, show before any loading succeed @@ -125,13 +127,24 @@ const GracefullyImage = ({ ]} /> ) : null} - + {Platform.OS === 'ios' ? ( + + ) : ( + + )} {blurhashView} ) diff --git a/src/components/Timeline/Default.tsx b/src/components/Timeline/Default.tsx index 6c84aec3..d72e427c 100644 --- a/src/components/Timeline/Default.tsx +++ b/src/components/Timeline/Default.tsx @@ -78,6 +78,7 @@ const TimelineDefault: React.FC = ({ status={actualStatus} queryKey={queryKey} rootQueryKey={rootQueryKey} + disabled={highlighted} > + - + {notification.status ? ( diff --git a/src/components/Timeline/Shared/ContextMenu.tsx b/src/components/Timeline/Shared/ContextMenu.tsx index 856e1835..c38272f1 100644 --- a/src/components/Timeline/Shared/ContextMenu.tsx +++ b/src/components/Timeline/Shared/ContextMenu.tsx @@ -5,6 +5,7 @@ import contextMenuStatus from '@components/ContextMenu/status' import { QueryKeyTimeline } from '@utils/queryHooks/timeline' import React from 'react' import { createContext } from 'react' +import { Platform } from 'react-native' import ContextMenu, { ContextMenuAction, ContextMenuProps @@ -14,6 +15,7 @@ export interface Props { status?: Mastodon.Status queryKey?: QueryKeyTimeline rootQueryKey?: QueryKeyTimeline + disabled?: boolean // Allowing toot to be copied when highlighted } export const ContextMenuContext = createContext([]) @@ -23,9 +25,10 @@ const TimelineContextMenu: React.FC = ({ status, queryKey, rootQueryKey, + disabled, ...props }) => { - if (!status || !queryKey) { + if (!status || !queryKey || disabled || Platform.OS === 'android') { return <>{children} } diff --git a/src/components/Timeline/Shared/HeaderDefault.android.tsx b/src/components/Timeline/Shared/HeaderDefault.android.tsx new file mode 100644 index 00000000..968bed11 --- /dev/null +++ b/src/components/Timeline/Shared/HeaderDefault.android.tsx @@ -0,0 +1,120 @@ +import contextMenuAccount from '@components/ContextMenu/account' +import contextMenuInstance from '@components/ContextMenu/instance' +import contextMenuShare from '@components/ContextMenu/share' +import contextMenuStatus from '@components/ContextMenu/status' +import Icon from '@components/Icon' +import { QueryKeyTimeline } from '@utils/queryHooks/timeline' +import { StyleConstants } from '@utils/styles/constants' +import { useTheme } from '@utils/styles/ThemeManager' +import React, { useContext } from 'react' +import { useTranslation } from 'react-i18next' +import { Platform, Pressable, View } from 'react-native' +import ContextMenu, { ContextMenuAction } from 'react-native-context-menu-view' +import { ContextMenuContext } from './ContextMenu' +import HeaderSharedAccount from './HeaderShared/Account' +import HeaderSharedApplication from './HeaderShared/Application' +import HeaderSharedCreated from './HeaderShared/Created' +import HeaderSharedMuted from './HeaderShared/Muted' +import HeaderSharedVisibility from './HeaderShared/Visibility' + +export interface Props { + queryKey?: QueryKeyTimeline + status: Mastodon.Status + highlighted: boolean +} + +const TimelineHeaderDefault = ({ queryKey, status, highlighted }: Props) => { + if (!queryKey) return + + const { t } = useTranslation('componentContextMenu') + const { colors } = useTheme() + + const actions: ContextMenuAction[] = [] + + const shareOnPress = + status.visibility !== 'direct' + ? contextMenuShare({ + actions, + type: 'status', + url: status.url || status.uri + }) + : null + const statusOnPress = contextMenuStatus({ + actions, + status, + queryKey + }) + const accountOnPress = contextMenuAccount({ + actions, + type: 'status', + queryKey, + id: status.account.id + }) + const instanceOnPress = contextMenuInstance({ + actions, + status, + queryKey + }) + + return ( + + + + + + + + + + + + {queryKey ? ( + + { + console.log('index', index) + for (const on of [ + shareOnPress, + statusOnPress, + accountOnPress, + instanceOnPress + ]) { + on && on(index) + } + }} + children={ + + } + /> + + ) : null} + + ) +} + +export default TimelineHeaderDefault diff --git a/src/components/Timeline/Shared/HeaderDefault.tsx b/src/components/Timeline/Shared/HeaderDefault.ios.tsx similarity index 96% rename from src/components/Timeline/Shared/HeaderDefault.tsx rename to src/components/Timeline/Shared/HeaderDefault.ios.tsx index 80a1c1bb..d18668d2 100644 --- a/src/components/Timeline/Shared/HeaderDefault.tsx +++ b/src/components/Timeline/Shared/HeaderDefault.ios.tsx @@ -4,7 +4,7 @@ import { StyleConstants } from '@utils/styles/constants' import { useTheme } from '@utils/styles/ThemeManager' import React, { useContext } from 'react' import { useTranslation } from 'react-i18next' -import { Pressable, View } from 'react-native' +import { Platform, Pressable, View } from 'react-native' import ContextMenu from 'react-native-context-menu-view' import { ContextMenuContext } from './ContextMenu' import HeaderSharedAccount from './HeaderShared/Account' @@ -48,7 +48,7 @@ const TimelineHeaderDefault = ({ queryKey, status, highlighted }: Props) => { - {queryKey ? ( + {queryKey && !highlighted ? ( { + const { colors } = useTheme() + + const contextMenuActions: ContextMenuAction[] = [] + const status = notification.status + const shareOnPress = + status && status?.visibility !== 'direct' + ? contextMenuShare({ + actions: contextMenuActions, + type: 'status', + url: status.url || status.uri + }) + : null + const statusOnPress = contextMenuStatus({ + actions: contextMenuActions, + status, + queryKey + }) + const accountOnPress = contextMenuAccount({ + actions: contextMenuActions, + type: 'status', + queryKey, + id: status?.account.id + }) + const instanceOnPress = contextMenuInstance({ + actions: contextMenuActions, + status, + queryKey + }) + + const actions = useMemo(() => { + switch (notification.type) { + case 'follow': + return + case 'follow_request': + return + default: + if (notification.status) { + return ( + { + for (const on of [ + shareOnPress, + statusOnPress, + accountOnPress, + instanceOnPress + ]) { + on && on(index) + } + }} + children={ + + } + /> + } + /> + ) + } + } + }, [notification.type]) + + return ( + + + + + + {notification.status?.visibility ? ( + + ) : null} + + + + + + + {actions} + + + ) +} + +export default TimelineHeaderNotification diff --git a/src/components/Timeline/Shared/HeaderNotification.tsx b/src/components/Timeline/Shared/HeaderNotification.ios.tsx similarity index 97% rename from src/components/Timeline/Shared/HeaderNotification.tsx rename to src/components/Timeline/Shared/HeaderNotification.ios.tsx index a9b30f2e..16267945 100644 --- a/src/components/Timeline/Shared/HeaderNotification.tsx +++ b/src/components/Timeline/Shared/HeaderNotification.ios.tsx @@ -3,6 +3,7 @@ import { RelationshipIncoming, RelationshipOutgoing } from '@components/Relationship' +import { QueryKeyTimeline } from '@utils/queryHooks/timeline' import { StyleConstants } from '@utils/styles/constants' import { useTheme } from '@utils/styles/ThemeManager' import React, { useContext, useMemo } from 'react' @@ -16,6 +17,7 @@ import HeaderSharedMuted from './HeaderShared/Muted' import HeaderSharedVisibility from './HeaderShared/Visibility' export interface Props { + queryKey: QueryKeyTimeline notification: Mastodon.Notification } diff --git a/src/screens/Tabs/Shared/Account/Header.tsx b/src/screens/Tabs/Shared/Account/Header.tsx index 419f84a8..6b33bf73 100644 --- a/src/screens/Tabs/Shared/Account/Header.tsx +++ b/src/screens/Tabs/Shared/Account/Header.tsx @@ -2,7 +2,8 @@ import Button from '@components/Button' import { useAccessibility } from '@utils/accessibility/AccessibilityManager' import { useTheme } from '@utils/styles/ThemeManager' import React from 'react' -import { Dimensions, Image, View } from 'react-native' +import { Dimensions, View } from 'react-native' +import FastImage from 'react-native-fast-image' import { useSafeAreaInsets } from 'react-native-safe-area-context' export interface Props { @@ -18,7 +19,7 @@ const AccountHeader = React.memo( return ( -