To create a document and attach a file to it, follow this pattern:
- Use
createDoc to create the base document. - Use the returned document's name (
doc.name) to call upload from useFrappeFileUpload. - Use
updateDoc to save the resulting file_url back into the document's specific field.
export const CreateUser = () => {
const { upload, error, loading } = useFrappeFileUpload();
const { createDoc } = useFrappeCreateDoc();
const { updateDoc } = useFrappeUpdateDoc();
const [email, setEmail] = useState<string>("");
const [firstName, setFirstName] = useState<string>("");
const [file, setFile] = useState<File>();
const createUser = () => {
if (file) {
createDoc("User", {
email: email,
first_name: firstName,
})
.then((doc) => {
return upload(file, {
isPrivate: true,
doctype: "User",
docname: doc.name,
fieldname: "user_image",
});
})
.then((fileResponse) => {
return updateDoc("User", doc.name, {
user_image: fileResponse.file_url,
});
})
.then(() => {
alert("User created");
});
}
};
return (
<div>
{loading && <p>Uploading...</p>}
{error && <p>{error}</p>}
<input type="text" onChange={(e) => setEmail(e.target.value)} />
<input type="text" onChange={(e) => setFirstName(e.target.value)} />
<input type="file" onChange={(e) => setFile(e.target.files?.[0])} />
<button onClick={createUser}>Create</button>
</div>
);
};