import { HeaderLeft } from '@components/Header' import Icon from '@components/Icon' import { ParseEmojis } from '@components/Parse' import ComponentSeparator from '@components/Separator' import CustomText from '@components/Text' import TimelineAttachment from '@components/Timeline/Shared/Attachment' import StatusContext from '@components/Timeline/Shared/Context' import HeaderSharedCreated from '@components/Timeline/Shared/HeaderShared/Created' import removeHTML from '@utils/helpers/removeHTML' import { TabSharedStackScreenProps } from '@utils/navigation/navigators' import { useStatusHistory } from '@utils/queryHooks/statusesHistory' import { StyleConstants } from '@utils/styles/constants' import { useTheme } from '@utils/styles/ThemeManager' import { diffChars, diffWords } from 'diff' import React, { useEffect } from 'react' import { useTranslation } from 'react-i18next' import { FlatList, View } from 'react-native' const SCRIPTS_WITHOUT_BOUNDARIES = [ 'my', 'zh', 'ja', 'kar', 'km', 'lp', 'phag', 'pwo', 'kar', 'lana', 'th', 'bo' ] const ContentView: React.FC<{ withoutBoundary: boolean item: Mastodon.StatusHistory prevItem?: Mastodon.StatusHistory }> = ({ withoutBoundary, item, prevItem }) => { const { colors } = useTheme() const changesSpoiler = withoutBoundary ? diffChars( removeHTML(prevItem?.spoiler_text || item.spoiler_text || ''), removeHTML(item.spoiler_text || '') ) : diffWords( removeHTML(prevItem?.spoiler_text || item.spoiler_text || ''), removeHTML(item.spoiler_text || '') ) const changesContent = withoutBoundary ? diffChars(removeHTML(prevItem?.content || item.content), removeHTML(item.content)) : diffWords(removeHTML(prevItem?.content || item.content), removeHTML(item.content)) const changesPoll = item.poll ? item.poll.options.map((option, index) => withoutBoundary ? prevItem?.poll?.options[index]?.title ? diffChars(prevItem?.poll?.options[index].title, option.title) : undefined : prevItem?.poll?.options[index]?.title ? diffWords(prevItem?.poll?.options[index].title, option.title) : undefined ) : null return ( // @ts-ignore {changesSpoiler.length && changesSpoiler[0].count ? ( {changesSpoiler.map(({ value, added, removed }, index) => ( ))} ) : null} {changesContent.map(({ value, added, removed }, index) => ( ))} {item.poll?.options.map((option, index) => ( {changesPoll?.[index]?.length ? ( changesPoll[index]?.map(({ value, added, removed }, index) => ( )) ) : ( )} ))} ) } const TabSharedHistory: React.FC> = ({ navigation, route: { params: { status, detectedLanguage } } }) => { const { t } = useTranslation('screenTabs') const { data } = useStatusHistory({ status }) useEffect(() => { navigation.setOptions({ title: t('shared.history.name'), headerLeft: () => navigation.goBack()} /> }) }, []) const dataReversed = data ? [...data].reverse() : [] const withoutBoundary = !!SCRIPTS_WITHOUT_BOUNDARIES.filter(script => detectedLanguage?.toLocaleLowerCase().startsWith(script) ).length return ( ( )} ItemSeparatorComponent={ComponentSeparator} /> ) } export default TabSharedHistory