You've already forked joplin
mirror of
https://github.com/laurent22/joplin.git
synced 2025-11-26 22:41:17 +02:00
40 lines
1.1 KiB
TypeScript
40 lines
1.1 KiB
TypeScript
import { RefObject, useMemo, useRef } from 'react';
|
|
import { PostMessage } from '../types';
|
|
import useMessageHandler from './useMessageHandler';
|
|
|
|
type FormDataRecord = Record<string, unknown>;
|
|
type FormDataListener = (formData: FormDataRecord)=> void;
|
|
|
|
const useFormData = (viewRef: RefObject<HTMLIFrameElement>, postMessage: PostMessage) => {
|
|
const formDataListenersRef = useRef<FormDataListener[]>([]);
|
|
useMessageHandler(viewRef, (event) => {
|
|
if (event.data.message === 'serializedForms') {
|
|
const formData = event.data.formData;
|
|
if (typeof formData !== 'object') {
|
|
throw new Error('Invalid formData result.');
|
|
}
|
|
|
|
const listeners = [...formDataListenersRef.current];
|
|
formDataListenersRef.current = [];
|
|
for (const listener of listeners) {
|
|
listener(formData);
|
|
}
|
|
}
|
|
});
|
|
|
|
return useMemo(() => {
|
|
return {
|
|
getFormData: () => {
|
|
return new Promise<FormDataRecord>(resolve => {
|
|
postMessage('serializeForms', null);
|
|
formDataListenersRef.current.push((data) => {
|
|
resolve(data);
|
|
});
|
|
});
|
|
},
|
|
};
|
|
}, [postMessage]);
|
|
};
|
|
|
|
export default useFormData;
|