2025-03-24 15:25:29 +11:00
|
|
|
import { createContext, useContext, useState } from 'react';
|
|
|
|
|
|
|
|
|
|
import { isBase64Image } from '@documenso/lib/constants/signatures';
|
2023-08-17 19:56:18 +10:00
|
|
|
|
2025-01-02 15:33:37 +11:00
|
|
|
export type DocumentSigningContextValue = {
|
2023-08-17 19:56:18 +10:00
|
|
|
fullName: string;
|
|
|
|
|
setFullName: (_value: string) => void;
|
|
|
|
|
email: string;
|
|
|
|
|
setEmail: (_value: string) => void;
|
|
|
|
|
signature: string | null;
|
|
|
|
|
setSignature: (_value: string | null) => void;
|
|
|
|
|
};
|
|
|
|
|
|
2025-01-02 15:33:37 +11:00
|
|
|
const DocumentSigningContext = createContext<DocumentSigningContextValue | null>(null);
|
2023-08-17 19:56:18 +10:00
|
|
|
|
2025-01-02 15:33:37 +11:00
|
|
|
export const useDocumentSigningContext = () => {
|
|
|
|
|
return useContext(DocumentSigningContext);
|
2023-08-17 19:56:18 +10:00
|
|
|
};
|
|
|
|
|
|
2025-01-02 15:33:37 +11:00
|
|
|
export const useRequiredDocumentSigningContext = () => {
|
|
|
|
|
const context = useDocumentSigningContext();
|
2023-08-17 19:56:18 +10:00
|
|
|
|
|
|
|
|
if (!context) {
|
|
|
|
|
throw new Error('Signing context is required');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return context;
|
|
|
|
|
};
|
|
|
|
|
|
2025-01-02 15:33:37 +11:00
|
|
|
export interface DocumentSigningProviderProps {
|
2023-09-01 18:43:53 +10:00
|
|
|
fullName?: string | null;
|
|
|
|
|
email?: string | null;
|
|
|
|
|
signature?: string | null;
|
2025-03-24 15:25:29 +11:00
|
|
|
typedSignatureEnabled?: boolean;
|
|
|
|
|
uploadSignatureEnabled?: boolean;
|
|
|
|
|
drawSignatureEnabled?: boolean;
|
2023-08-17 19:56:18 +10:00
|
|
|
children: React.ReactNode;
|
|
|
|
|
}
|
|
|
|
|
|
2025-01-02 15:33:37 +11:00
|
|
|
export const DocumentSigningProvider = ({
|
2023-08-17 19:56:18 +10:00
|
|
|
fullName: initialFullName,
|
|
|
|
|
email: initialEmail,
|
|
|
|
|
signature: initialSignature,
|
2025-03-24 15:25:29 +11:00
|
|
|
typedSignatureEnabled = true,
|
|
|
|
|
uploadSignatureEnabled = true,
|
|
|
|
|
drawSignatureEnabled = true,
|
2023-08-17 19:56:18 +10:00
|
|
|
children,
|
2025-01-02 15:33:37 +11:00
|
|
|
}: DocumentSigningProviderProps) => {
|
2023-08-17 19:56:18 +10:00
|
|
|
const [fullName, setFullName] = useState(initialFullName || '');
|
|
|
|
|
const [email, setEmail] = useState(initialEmail || '');
|
|
|
|
|
|
2025-03-24 15:25:29 +11:00
|
|
|
// Ensure the user signature doesn't show up if it's not allowed.
|
|
|
|
|
const [signature, setSignature] = useState(
|
|
|
|
|
(() => {
|
|
|
|
|
const sig = initialSignature || '';
|
|
|
|
|
const isBase64 = isBase64Image(sig);
|
|
|
|
|
|
|
|
|
|
if (isBase64 && (uploadSignatureEnabled || drawSignatureEnabled)) {
|
|
|
|
|
return sig;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!isBase64 && typedSignatureEnabled) {
|
|
|
|
|
return sig;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
})(),
|
|
|
|
|
);
|
2024-11-26 12:03:44 +02:00
|
|
|
|
2023-08-17 19:56:18 +10:00
|
|
|
return (
|
2025-01-02 15:33:37 +11:00
|
|
|
<DocumentSigningContext.Provider
|
2023-08-17 19:56:18 +10:00
|
|
|
value={{
|
|
|
|
|
fullName,
|
|
|
|
|
setFullName,
|
|
|
|
|
email,
|
|
|
|
|
setEmail,
|
|
|
|
|
signature,
|
|
|
|
|
setSignature,
|
|
|
|
|
}}
|
|
|
|
|
>
|
|
|
|
|
{children}
|
2025-01-02 15:33:37 +11:00
|
|
|
</DocumentSigningContext.Provider>
|
2023-08-17 19:56:18 +10:00
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
|
2025-01-02 15:33:37 +11:00
|
|
|
DocumentSigningProvider.displayName = 'DocumentSigningProvider';
|