import apiInstance from '@api/instance' import Icon from '@components/Icon' import ComponentSeparator from '@components/Separator' import CustomText from '@components/Text' import HeaderSharedCreated from '@components/Timeline/Shared/HeaderShared/Created' import { useNavigation } from '@react-navigation/native' import { useAppDispatch } from '@root/store' import { getInstanceDrafts, removeInstanceDraft } from '@utils/slices/instancesSlice' import { StyleConstants } from '@utils/styles/constants' import { useTheme } from '@utils/styles/ThemeManager' import React, { useCallback, useContext, useState } from 'react' import { useTranslation } from 'react-i18next' import { Dimensions, Image, Modal, Platform, Pressable, View } from 'react-native' import { PanGestureHandler } from 'react-native-gesture-handler' import { SwipeListView } from 'react-native-swipe-list-view' import { useSelector } from 'react-redux' import formatText from '../formatText' import ComposeContext from '../utils/createContext' import { ComposeStateDraft, ExtendedAttachment } from '../utils/types' export interface Props { timestamp: number } const ComposeDraftsListRoot: React.FC = ({ timestamp }) => { const { composeDispatch } = useContext(ComposeContext) const { t } = useTranslation('screenCompose') const navigation = useNavigation() const dispatch = useAppDispatch() const { colors, theme } = useTheme() const instanceDrafts = useSelector(getInstanceDrafts)?.filter( draft => draft.timestamp !== timestamp ) const actionWidth = StyleConstants.Font.Size.L + StyleConstants.Spacing.Global.PagePadding * 4 const [checkingAttachments, setCheckingAttachments] = useState(false) const removeDraft = useCallback(ts => { dispatch(removeInstanceDraft(ts)) }, []) const renderItem = useCallback( ({ item }: { item: ComposeStateDraft }) => { return ( { setCheckingAttachments(true) let tempDraft = item let tempUploads: ExtendedAttachment[] = [] if (item.attachments && item.attachments.uploads.length) { for (const attachment of item.attachments.uploads) { await apiInstance({ method: 'get', url: `media/${attachment.remote?.id}` }) .then(res => { if (res.body.id === attachment.remote?.id) { tempUploads.push(attachment) } }) .catch(() => {}) } tempDraft = { ...tempDraft, attachments: { ...item.attachments, uploads: tempUploads } } } tempDraft.spoiler?.length && formatText({ textInput: 'text', composeDispatch, content: tempDraft.spoiler }) tempDraft.text?.length && formatText({ textInput: 'text', composeDispatch, content: tempDraft.text }) composeDispatch({ type: 'loadDraft', payload: tempDraft }) dispatch(removeInstanceDraft(item.timestamp)) navigation.goBack() }} > {item.text || item.spoiler || t('content.draftsList.content.textEmpty')} {item.attachments?.uploads.length ? ( {item.attachments.uploads.map((attachment, index) => ( ))} ) : null} ) }, [theme] ) const renderHiddenItem = useCallback( ({ item }) => ( removeDraft(item.timestamp)} children={ } /> } /> ), [theme] ) return ( <> {t('content.draftsList.warning')} item.timestamp.toString()} /> } /> } /> ) } export default ComposeDraftsListRoot