import type { FeedbackEntry } from "convex-feedback"; import { forwardRef, useCallback, useEffect, useImperativeHandle, useState, } from "react"; import { Modal, Platform, Pressable, ScrollView, Text, View, } from "react-native"; import { useFeedbackBody } from "../../../shared/context/FeedbackBodyProvider.js"; import { useFeedbackUi } from "../../../shared/context/FeedbackProvider.js"; import { allowAuthenticatedAction } from "../../../shared/helpers.js"; import { useNativeAction } from "../helpers.js"; import { Button } from "./Button.js"; import { FeedbackForm } from "./primitives.js"; export interface EditEntryFormRef { save: () => void; } export interface EditEntryFormState { canSave: boolean; pending: boolean; } interface EditEntryFormProps { entry: FeedbackEntry; onRequestClose: () => void; onStateChange?: (state: EditEntryFormState) => void; autoFocus?: boolean; showSubmitButton?: boolean; } export const EditEntryForm = forwardRef( function EditEntryForm( { entry, onRequestClose, onStateChange, autoFocus = true, showSubmitButton = true, }, ref, ) { const { hooks, isAuthenticated, onUnauthenticated } = useFeedbackBody(); const { messages, theme } = useFeedbackUi(); const updateEntry = hooks.useUpdateEntry(); const action = useNativeAction({ cancel: messages.form.cancel, retry: messages.form.retry, }); const [title, setTitle] = useState(entry.title); const [body, setBody] = useState(entry.body); const canSave = title.trim().length > 0 && body.trim().length > 0; useEffect(() => { setTitle(entry.title); setBody(entry.body); }, [entry.body, entry.id, entry.title]); const save = useCallback(() => { if ( action.pending || !canSave || !allowAuthenticatedAction(isAuthenticated, onUnauthenticated) ) { return; } void action.run(async () => { await updateEntry({ entryId: entry.id, title: title.trim(), body: body.trim(), }); onRequestClose(); }, messages.form.editError); }, [ action, body, canSave, entry.id, isAuthenticated, messages.form.editError, onRequestClose, onUnauthenticated, title, updateEntry, ]); useImperativeHandle(ref, () => ({ save }), [save]); useEffect(() => { onStateChange?.({ canSave, pending: action.pending }); }, [action.pending, canSave, onStateChange]); return ( <> {messages.form.editDescription} {messages.form.kind} {messages.kinds[entry.kind]} {messages.form.title} {messages.form.body} {showSubmitButton ? (