Files
sign/apps/remix/app/components/general/document-signing/document-signing-provider.tsx

87 lines
2.1 KiB
TypeScript
Raw Normal View History

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;
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,
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 || '');
// 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;
})(),
);
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';