|
|
@ -1,7 +1,7 @@ |
|
|
"use client"; |
|
|
"use client"; |
|
|
|
|
|
|
|
|
import Image from "next/image"; |
|
|
import Image from "next/image"; |
|
|
import { useCallback, useEffect, useState } from "react"; |
|
|
|
|
|
|
|
|
import { useCallback, useEffect, useRef, useState } from "react"; |
|
|
import type { QuestionField } from "@/lib/schema-adapter"; |
|
|
import type { QuestionField } from "@/lib/schema-adapter"; |
|
|
import { useUploadTmpMediaMutation } from "@/hooks/marriage/use-upload-tmp-media"; |
|
|
import { useUploadTmpMediaMutation } from "@/hooks/marriage/use-upload-tmp-media"; |
|
|
import { getApiRequestUrl } from "@/lib/http"; |
|
|
import { getApiRequestUrl } from "@/lib/http"; |
|
|
@ -83,6 +83,7 @@ export function QuestionFile({ |
|
|
const [filePreviewUrl, setFilePreviewUrl] = useState<string | null>( |
|
|
const [filePreviewUrl, setFilePreviewUrl] = useState<string | null>( |
|
|
initialFileUrl, |
|
|
initialFileUrl, |
|
|
); |
|
|
); |
|
|
|
|
|
const isInitiatorRef = useRef(false); |
|
|
const [isFlutterPicking, setIsFlutterPicking] = useState(false); |
|
|
const [isFlutterPicking, setIsFlutterPicking] = useState(false); |
|
|
|
|
|
|
|
|
const acceptedFiles = (question.extras?.options ?? []) |
|
|
const acceptedFiles = (question.extras?.options ?? []) |
|
|
@ -93,6 +94,8 @@ export function QuestionFile({ |
|
|
onSuccess: (response) => { |
|
|
onSuccess: (response) => { |
|
|
if (response.path) { |
|
|
if (response.path) { |
|
|
setAnswerValue(question, response.path); |
|
|
setAnswerValue(question, response.path); |
|
|
|
|
|
setSelectedFileName(response.name ?? response.path.split("/").pop() ?? "uploaded"); |
|
|
|
|
|
setFilePreviewUrl(response.path); |
|
|
} |
|
|
} |
|
|
}, |
|
|
}, |
|
|
onError: (error) => { |
|
|
onError: (error) => { |
|
|
@ -108,6 +111,8 @@ export function QuestionFile({ |
|
|
|
|
|
|
|
|
const unsubscribe = window.addFlutterResponseListener?.((event) => { |
|
|
const unsubscribe = window.addFlutterResponseListener?.((event) => { |
|
|
if (event.action !== "upload_file") return; |
|
|
if (event.action !== "upload_file") return; |
|
|
|
|
|
if (event.requestId && String(event.requestId) !== String(question.id)) return; |
|
|
|
|
|
if (!event.requestId && !isInitiatorRef.current) return; |
|
|
|
|
|
|
|
|
switch (event.status) { |
|
|
switch (event.status) { |
|
|
case "picking": |
|
|
case "picking": |
|
|
@ -117,20 +122,23 @@ export function QuestionFile({ |
|
|
if (event.data?.files?.[0]) { |
|
|
if (event.data?.files?.[0]) { |
|
|
const fileName = event.data.files[0].name ?? null; |
|
|
const fileName = event.data.files[0].name ?? null; |
|
|
setSelectedFileName(fileName); |
|
|
setSelectedFileName(fileName); |
|
|
if (fileName) { |
|
|
|
|
|
setAnswerValue(question, fileName); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
} |
|
|
break; |
|
|
break; |
|
|
case "progress": |
|
|
case "progress": |
|
|
break; |
|
|
break; |
|
|
case "completed": { |
|
|
case "completed": { |
|
|
setIsFlutterPicking(false); |
|
|
setIsFlutterPicking(false); |
|
|
|
|
|
isInitiatorRef.current = false; |
|
|
const file = event.data?.files?.[0]; |
|
|
const file = event.data?.files?.[0]; |
|
|
if (file?.url) { |
|
|
|
|
|
setAnswerValue(question, file.url); |
|
|
|
|
|
setSelectedFileName(file.name ?? "uploaded"); |
|
|
|
|
|
setFilePreviewUrl(file.url); |
|
|
|
|
|
|
|
|
const remoteUrl = |
|
|
|
|
|
file?.path || |
|
|
|
|
|
file?.url || |
|
|
|
|
|
(file?.data?.path as string | undefined) || |
|
|
|
|
|
(file?.data?.url as string | undefined); |
|
|
|
|
|
if (remoteUrl) { |
|
|
|
|
|
setAnswerValue(question, remoteUrl); |
|
|
|
|
|
setSelectedFileName(file?.name ?? remoteUrl.split("/").pop() ?? "uploaded"); |
|
|
|
|
|
setFilePreviewUrl(remoteUrl); |
|
|
} else if (file?.base64) { |
|
|
} else if (file?.base64) { |
|
|
const b64 = file.base64; |
|
|
const b64 = file.base64; |
|
|
setSelectedFileName(file.name ?? "upload"); |
|
|
setSelectedFileName(file.name ?? "upload"); |
|
|
@ -148,9 +156,11 @@ export function QuestionFile({ |
|
|
} |
|
|
} |
|
|
case "cancelled": |
|
|
case "cancelled": |
|
|
setIsFlutterPicking(false); |
|
|
setIsFlutterPicking(false); |
|
|
|
|
|
isInitiatorRef.current = false; |
|
|
break; |
|
|
break; |
|
|
case "failed": |
|
|
case "failed": |
|
|
setIsFlutterPicking(false); |
|
|
setIsFlutterPicking(false); |
|
|
|
|
|
isInitiatorRef.current = false; |
|
|
console.error("upload_file failed:", event.message); |
|
|
console.error("upload_file failed:", event.message); |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
@ -168,7 +178,11 @@ export function QuestionFile({ |
|
|
); |
|
|
); |
|
|
const mediaType = resolveMediaType(extensions); |
|
|
const mediaType = resolveMediaType(extensions); |
|
|
|
|
|
|
|
|
|
|
|
isInitiatorRef.current = true; |
|
|
|
|
|
setIsFlutterPicking(true); |
|
|
|
|
|
|
|
|
uploadFile({ |
|
|
uploadFile({ |
|
|
|
|
|
requestId: String(question.id), |
|
|
mediaType, |
|
|
mediaType, |
|
|
source: "gallery", |
|
|
source: "gallery", |
|
|
returnAs: "upload", |
|
|
returnAs: "upload", |
|
|
|