-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSignModule.jsx
More file actions
181 lines (162 loc) · 5.78 KB
/
SignModule.jsx
File metadata and controls
181 lines (162 loc) · 5.78 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
import React, { useState, useRef } from 'react';
import { connectToNCALayer } from '../services/common';
import { requestFilePath as requestSignFilePath, signDocument as signDocumentService } from '../services/signService';
const SignModule = () => {
const fileNameRef = useRef('');
const [filePath, setFilePath] = useState('');
const [fileDir, setFileDir] = useState('');
const [storage, setStorage] = useState('PKCS12');
const [lastSignature, setLastSignature] = useState('');
const [lastFileName, setLastFileName] = useState('');
const [status, setStatus] = useState('');
const [socket, setSocket] = useState(null);
const socketRef = useRef(null);
const [, setPendingRequest] = useState(null);
const pendingRequestRef = useRef(null);
// Auto-connect to NCALayer on component mount
React.useEffect(() => {
const ws = connectToNCALayer(
// onOpen
() => {
console.log('SignModule: WebSocket connected');
setStatus('Connected to NCALayer');
setSocket(ws);
socketRef.current = ws;
},
// onMessage
(response) => {
console.log('SignModule: Received parsed response:', response);
handleNCAResponse(response);
},
// onError
(error) => {
console.error('SignModule: WebSocket error:', error);
setStatus('Connection failed. Make sure NCALayer is running on https://127.0.0.1:13579');
},
// onClose
() => {
console.log('SignModule: WebSocket closed');
setStatus('Disconnected from NCALayer');
setSocket(null);
socketRef.current = null;
}
);
return () => {
if (ws && ws.readyState === WebSocket.OPEN) {
ws.close();
}
};
}, []);
const handleNCAResponse = (response) => {
console.log('Handling response:', response);
console.log('Current pendingRequest:', pendingRequestRef.current);
// Handle browseForFile response (getFilePath)
if (pendingRequestRef.current === 'getFilePath') {
// Success response with responseObject
if (response.responseObject && response.code === '200') {
const selectedPath = response.responseObject.path;
const fileName = response.responseObject.filename || selectedPath.split('\\').pop() || selectedPath.split('/').pop();
const dir = response.responseObject.filedir || selectedPath.substring(0, selectedPath.lastIndexOf('\\'));
fileNameRef.current = fileName;
setFilePath(selectedPath);
setFileDir(dir);
setStatus(`File selected: ${fileName}`);
pendingRequestRef.current = null;
return;
}
// Handle error or cancellation
if (response.result === 'error' || (response.code && response.code !== '200')) {
const errorMsg = response.message || 'File selection failed';
setStatus(errorMsg === 'action.canceled' ? 'File selection canceled' : `Error: ${errorMsg}`);
pendingRequestRef.current = null;
return;
}
}
// Handle signXml response
if (response.responseObject && pendingRequestRef.current === 'signDocument') {
const signedData = response.responseObject;
const signedFileName = `${fileNameRef.current}.cms`;
const signedFilePath = `${fileDir}\\${signedFileName}`;
setLastSignature(signedFilePath);
setLastFileName(signedFileName);
setStatus(`✓ Document signed successfully: ${signedFileName}`);
pendingRequestRef.current = null;
return;
}
// Handle general error response
if (response.result === 'error' || (response.code && response.code !== '200')) {
const errorMsg = response.message || `Error code: ${response.code}`;
setStatus(`Error: ${errorMsg}`);
pendingRequestRef.current = null;
}
};
const requestFilePath = () => {
requestSignFilePath({
socketRef,
socket,
fileDir,
setStatus,
setPendingRequest,
pendingRequestRef
});
};
const signDocument = () => {
signDocumentService({
socketRef,
socket,
filePath,
fileDir,
storage,
fileNameRef,
setStatus,
setPendingRequest,
pendingRequestRef
});
};
return (
<div className="sign-module">
<h2>Sign Document via NCALayer</h2>
{/* Connection Status */}
{status && (
<div className={`status-message ${status.includes('✓') || status.includes('Connected') ? 'success' : ''}`}>
{status}
</div>
)}
{/* File Selection */}
<div className="section">
<h3>1. Select Document to Sign</h3>
<button
onClick={requestFilePath}
disabled={!socket}
className="btn-primary"
>
Choose File (NCALayer)
</button>
{filePath && (
<div className="file-info">
<p className="success-text">✓ Selected file: <strong>{fileNameRef.current}</strong></p>
<p className="file-path">{filePath}</p>
</div>
)}
</div>
{/* Sign Button */}
<div className="section">
<h3>2. Sign Document</h3>
<button
onClick={signDocument}
disabled={!filePath || !socket}
className="btn-primary btn-large"
>
Sign Document
</button>
{lastSignature && lastSignature.includes('\\') && (
<div className="signature-info">
<p className="success-text">✓ File signed and saved: <strong>{lastFileName}</strong></p>
<p className="file-path">{lastSignature}</p>
</div>
)}
</div>
</div>
);
};
export default SignModule;