import client from '@api/client' import analytics from '@components/analytics' import haptics from '@components/haptics' import { HeaderCenter, HeaderLeft, HeaderRight } from '@components/Header' import { StackScreenProps } from '@react-navigation/stack' import React, { useCallback, useContext, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import { Alert, KeyboardAvoidingView, Platform } from 'react-native' import { useSharedValue } from 'react-native-reanimated' import { SafeAreaView } from 'react-native-safe-area-context' import { createNativeStackNavigator } from 'react-native-screens/native-stack' import ComposeEditAttachmentRoot from './EditAttachment/Root' import ComposeContext from './utils/createContext' const Stack = createNativeStackNavigator() export type ScreenComposeEditAttachmentProp = StackScreenProps< Nav.ScreenComposeStackParamList, 'Screen-Compose-EditAttachment' > const ComposeEditAttachment: React.FC = ({ route: { params: { index } }, navigation }) => { const { composeState, composeDispatch } = useContext(ComposeContext) const { t } = useTranslation('sharedCompose') const theAttachment = composeState.attachments.uploads[index].remote! const [isSubmitting, setIsSubmitting] = useState(false) const [altText, setAltText] = useState( theAttachment.description ) const focus = useSharedValue({ x: theAttachment.meta?.focus?.x, y: theAttachment.meta?.focus?.y }) useEffect(() => { const unsubscribe = navigation.addListener('beforeRemove', () => { composeDispatch({ type: 'attachment/edit', payload: { ...theAttachment, description: altText, meta: { ...theAttachment.meta, focus: { x: focus.value.x > 1 ? 1 : focus.value.x, y: focus.value.y > 1 ? 1 : focus.value.y } } } }) }) return unsubscribe }, [focus.value.x, focus.value.y, altText]) const headerLeft = useCallback( () => ( navigation.goBack()} /> ), [] ) const headerRight = useCallback( () => ( { analytics('editattachment_confirm_press') if (!altText && focus.value.x === 0 && focus.value.y === 0) { navigation.goBack() return } setIsSubmitting(true) const formData = new FormData() if (altText) { formData.append('description', altText) } if (focus.value.x !== 0 || focus.value.y !== 0) { formData.append('focus', `${focus.value.x},${focus.value.y}`) } client({ method: 'put', instance: 'local', url: `media/${theAttachment.id}`, body: formData }) .then(() => { haptics('Success') navigation.goBack() }) .catch(() => { setIsSubmitting(false) haptics('Error') Alert.alert( t('content.editAttachment.header.right.failed.title'), undefined, [ { text: t( 'content.editAttachment.header.right.failed.button' ), style: 'cancel' } ] ) }) }} /> ), [isSubmitting, altText, focus.value.x, focus.value.y] ) const children = useCallback( () => ( ), [] ) return ( ( ) }) }} /> ) } export default ComposeEditAttachment