1
0
mirror of https://github.com/tooot-app/app synced 2025-02-22 06:37:57 +01:00
This commit is contained in:
Zhiyuan Zheng 2021-03-13 17:56:57 +01:00
parent 2620ec52bb
commit bde6c77cc1
No known key found for this signature in database
GPG Key ID: 078A93AB607D85E0
3 changed files with 126 additions and 151 deletions

View File

@ -46,7 +46,6 @@
"expo-firebase-analytics": "~2.6.0", "expo-firebase-analytics": "~2.6.0",
"expo-haptics": "~8.4.0", "expo-haptics": "~8.4.0",
"expo-image-picker": "~9.2.0", "expo-image-picker": "~9.2.0",
"expo-linear-gradient": "~8.4.0",
"expo-linking": "~2.0.1", "expo-linking": "~2.0.1",
"expo-localization": "~9.1.0", "expo-localization": "~9.1.0",
"expo-notifications": "~0.8.2", "expo-notifications": "~0.8.2",

View File

@ -9,10 +9,9 @@ import { StyleConstants } from '@utils/styles/constants'
import layoutAnimation from '@utils/styles/layoutAnimation' import layoutAnimation from '@utils/styles/layoutAnimation'
import { adaptiveScale } from '@utils/styles/scaling' import { adaptiveScale } from '@utils/styles/scaling'
import { useTheme } from '@utils/styles/ThemeManager' import { useTheme } from '@utils/styles/ThemeManager'
import { LinearGradient } from 'expo-linear-gradient'
import React, { useCallback, useState } from 'react' import React, { useCallback, useState } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import { Platform, Pressable, Text, View } from 'react-native' import { Pressable, Text, View } from 'react-native'
import HTMLView from 'react-native-htmlview' import HTMLView from 'react-native-htmlview'
import { useSelector } from 'react-redux' import { useSelector } from 'react-redux'
@ -164,7 +163,8 @@ export interface Props {
disableDetails?: boolean disableDetails?: boolean
} }
const ParseHTML: React.FC<Props> = ({ const ParseHTML = React.memo(
({
content, content,
size = 'M', size = 'M',
adaptiveSize = false, adaptiveSize = false,
@ -175,7 +175,7 @@ const ParseHTML: React.FC<Props> = ({
numberOfLines = 10, numberOfLines = 10,
expandHint, expandHint,
disableDetails = false disableDetails = false
}) => { }: Props) => {
const adaptiveFontsize = useSelector(getSettingsFontsize) const adaptiveFontsize = useSelector(getSettingsFontsize)
const adaptedFontsize = adaptiveScale( const adaptedFontsize = adaptiveScale(
StyleConstants.Font.Size[size], StyleConstants.Font.Size[size],
@ -190,7 +190,7 @@ const ParseHTML: React.FC<Props> = ({
StackNavigationProp<Nav.TabLocalStackParamList> StackNavigationProp<Nav.TabLocalStackParamList>
>() >()
const route = useRoute() const route = useRoute()
const { theme } = useTheme() const { mode, theme } = useTheme()
const { t, i18n } = useTranslation('componentParse') const { t, i18n } = useTranslation('componentParse')
if (!expandHint) { if (!expandHint) {
expandHint = t('HTML.defaultHint') expandHint = t('HTML.defaultHint')
@ -235,18 +235,9 @@ const ParseHTML: React.FC<Props> = ({
const [expanded, setExpanded] = useState(false) const [expanded, setExpanded] = useState(false)
const onTextLayout = useCallback(({ nativeEvent }) => { const onTextLayout = useCallback(({ nativeEvent }) => {
switch (Platform.OS) { if (nativeEvent.lines.length >= numberOfLines) {
case 'ios':
if (nativeEvent.lines.length === numberOfLines + 1) {
setExpandAllow(true) setExpandAllow(true)
} }
break
case 'android':
if (nativeEvent.lines.length > numberOfLines + 1) {
setExpandAllow(true)
}
break
}
}, []) }, [])
return ( return (
@ -254,7 +245,7 @@ const ParseHTML: React.FC<Props> = ({
<Text <Text
children={children} children={children}
onTextLayout={onTextLayout} onTextLayout={onTextLayout}
numberOfLines={expanded ? 999 : numberOfLines + 1} numberOfLines={expanded ? 999 : numberOfLines}
/> />
{expandAllow ? ( {expandAllow ? (
<Pressable <Pressable
@ -264,20 +255,10 @@ const ParseHTML: React.FC<Props> = ({
setExpanded(!expanded) setExpanded(!expanded)
}} }}
style={{ style={{
marginTop: expanded justifyContent: 'center',
? 0 marginTop: expanded ? 0 : -adaptedLineheight,
: -adaptedLineheight * (numberOfLines === 0 ? 1 : 2) minHeight: 44,
}} backgroundColor: theme.background
>
<LinearGradient
colors={[
theme.backgroundGradientStart,
theme.backgroundGradientEnd
]}
locations={[0, adaptedLineheight / (adaptedFontsize * 5)]}
style={{
paddingTop: StyleConstants.Font.Size.S * 2,
paddingBottom: StyleConstants.Font.Size.S
}} }}
> >
<Text <Text
@ -286,18 +267,16 @@ const ParseHTML: React.FC<Props> = ({
...StyleConstants.FontStyle.S, ...StyleConstants.FontStyle.S,
color: theme.primary color: theme.primary
}} }}
> children={t(`HTML.expanded.${expanded.toString()}`, {
{expanded hint: expandHint
? t('HTML.expanded.true', { hint: expandHint }) })}
: t('HTML.expanded.false', { hint: expandHint })} />
</Text>
</LinearGradient>
</Pressable> </Pressable>
) : null} ) : null}
</View> </View>
) )
}, },
[theme, i18n.language] [mode, i18n.language]
) )
return ( return (
@ -308,7 +287,8 @@ const ParseHTML: React.FC<Props> = ({
renderNode={renderNodeCallback} renderNode={renderNodeCallback}
/> />
) )
} },
() => true
)
// export default ParseHTML export default ParseHTML
export default React.memo(ParseHTML, () => true)

View File

@ -1,8 +1,6 @@
import { ParseHTML } from '@components/Parse' import { ParseHTML } from '@components/Parse'
import { StyleConstants } from '@utils/styles/constants'
import React from 'react' import React from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import { View } from 'react-native'
export interface Props { export interface Props {
status: Mastodon.Status status: Mastodon.Status
@ -24,7 +22,6 @@ const TimelineContent = React.memo(
<> <>
{status.spoiler_text ? ( {status.spoiler_text ? (
<> <>
<View style={{ marginBottom: StyleConstants.Font.Size.M }}>
<ParseHTML <ParseHTML
content={status.spoiler_text} content={status.spoiler_text}
size={highlighted ? 'L' : 'M'} size={highlighted ? 'L' : 'M'}
@ -35,7 +32,6 @@ const TimelineContent = React.memo(
numberOfLines={999} numberOfLines={999}
disableDetails={disableDetails} disableDetails={disableDetails}
/> />
</View>
<ParseHTML <ParseHTML
content={status.content} content={status.content}
size={highlighted ? 'L' : 'M'} size={highlighted ? 'L' : 'M'}
@ -43,7 +39,7 @@ const TimelineContent = React.memo(
emojis={status.emojis} emojis={status.emojis}
mentions={status.mentions} mentions={status.mentions}
tags={status.tags} tags={status.tags}
numberOfLines={0} numberOfLines={1}
expandHint={t('shared.content.expandHint')} expandHint={t('shared.content.expandHint')}
disableDetails={disableDetails} disableDetails={disableDetails}
/> />