@retinalabsllc/zairusjs 4.0.12 → 4.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -712,7 +712,7 @@ interface AgentStat {
712
712
  icon: React.ReactNode;
713
713
  }
714
714
  interface AgentFilePayload {
715
- imageBase64: string;
715
+ file: File;
716
716
  fileName: string;
717
717
  fileType: string;
718
718
  fileSize: number;
package/dist/index.d.ts CHANGED
@@ -712,7 +712,7 @@ interface AgentStat {
712
712
  icon: React.ReactNode;
713
713
  }
714
714
  interface AgentFilePayload {
715
- imageBase64: string;
715
+ file: File;
716
716
  fileName: string;
717
717
  fileType: string;
718
718
  fileSize: number;
package/dist/index.js CHANGED
@@ -2946,14 +2946,11 @@ var UniversalAgentConsole = ({
2946
2946
  if (pendingFiles.length === 0 || !selectedApp) return;
2947
2947
  setIsUploading(true);
2948
2948
  try {
2949
- const payloads = await Promise.all(pendingFiles.map(async (file) => {
2950
- const base64data = await new Promise((resolve, reject) => {
2951
- const reader = new FileReader();
2952
- reader.readAsDataURL(file);
2953
- reader.onload = () => resolve(reader.result);
2954
- reader.onerror = (error) => reject(error);
2955
- });
2956
- return { imageBase64: base64data, fileName: file.name, fileType: file.type, fileSize: file.size };
2949
+ const payloads = pendingFiles.map((file) => ({
2950
+ file,
2951
+ fileName: file.name,
2952
+ fileType: file.type,
2953
+ fileSize: file.size
2957
2954
  }));
2958
2955
  const res = await onUploadArchives(selectedApp.id, payloads);
2959
2956
  if (res.success) setPendingFiles([]);
@@ -3995,15 +3992,17 @@ var UniversalRegistrationFlow = ({
3995
3992
  if (optType === "other1") setIsUploadingOther1(true);
3996
3993
  else if (optType === "other2") setIsUploadingOther2(true);
3997
3994
  else if (optType === "other3") setIsUploadingOther3(true);
3998
- const base64data = await getBase64Safe(file);
3999
- const data = await baseApi("upload_document", { imageBase64: base64data, docType: optType });
4000
- if (data.success) {
3995
+ const data = await baseApi("upload_document", { fileName: file.name, contentType: file.type, fileSize: file.size, docType: optType });
3996
+ if (data.success && data.data.uploadUrl) {
3997
+ await fetch(data.data.uploadUrl, { method: "PUT", headers: { "Content-Type": file.type }, body: file });
4001
3998
  const updatedForm = { ...formData };
4002
3999
  const docNum = optType.replace("other", "");
4003
- updatedForm[`otherDoc${docNum}Url`] = data.data.fileUrl || base64data;
4000
+ updatedForm[`otherDoc${docNum}Url`] = data.data.fileUrl;
4004
4001
  updatedForm[`otherDoc${docNum}Meta`] = { fileName: file.name, contentType: file.type, fileSizeInBytes: file.size };
4005
4002
  setFormData(updatedForm);
4006
4003
  saveProgress(updatedForm);
4004
+ } else {
4005
+ throw new Error(data.error || "Failed to secure upload URL.");
4007
4006
  }
4008
4007
  } catch (error) {
4009
4008
  import_react_hot_toast7.default.error(error.message);
@@ -4075,33 +4074,37 @@ var UniversalRegistrationFlow = ({
4075
4074
  const file = e.target.files?.[0];
4076
4075
  if (!file) return;
4077
4076
  try {
4078
- const base64data = await getBase64Safe(file);
4079
4077
  if (docType === "id") {
4080
4078
  setGlobalExtractingId(true);
4081
4079
  setAiTasks([{ id: "1", label: "Document Scanned", status: "success" }, { id: "2", label: `Extracting ID for Member ${memberIndex + 1}...`, status: "loading" }]);
4080
+ const uploadData = await baseApi("upload_document", { fileName: file.name, contentType: file.type, fileSize: file.size, docType: `member_${memberIndex}_id` });
4081
+ if (!uploadData.success) throw new Error(uploadData.error || "Failed to secure upload URL.");
4082
+ await fetch(uploadData.data.uploadUrl, { method: "PUT", headers: { "Content-Type": file.type }, body: file });
4083
+ const base64data = await getBase64Safe(file);
4082
4084
  const data = await baseApi("extract_id", { imageBase64: base64data });
4083
4085
  if (data.success) {
4084
4086
  const updatedMembers = [...formData.members];
4085
- updatedMembers[memberIndex] = { ...updatedMembers[memberIndex], idExtractedData: data.data, idFileUrl: data.data.fileUrl || base64data, idMetadata: { fileName: file.name, contentType: file.type, fileSizeInBytes: file.size } };
4087
+ updatedMembers[memberIndex] = { ...updatedMembers[memberIndex], idExtractedData: data.data, idFileUrl: uploadData.data.fileUrl, idMetadata: { fileName: file.name, contentType: file.type, fileSizeInBytes: file.size } };
4086
4088
  setFormData({ ...formData, members: updatedMembers });
4087
4089
  saveProgress({ ...formData, members: updatedMembers });
4088
4090
  } else import_react_hot_toast7.default.error(data.error || "Uh oh! Something went wrong.");
4089
4091
  } else {
4090
4092
  if (docType === "passport") setGlobalUploadingPassport(true);
4091
4093
  else setGlobalUploadingSignature(true);
4092
- const data = await baseApi("upload_document", { imageBase64: base64data, docType: `member_${memberIndex}_${docType}` });
4093
- if (data.success) {
4094
+ const data = await baseApi("upload_document", { fileName: file.name, contentType: file.type, fileSize: file.size, docType: `member_${memberIndex}_${docType}` });
4095
+ if (data.success && data.data.uploadUrl) {
4096
+ await fetch(data.data.uploadUrl, { method: "PUT", headers: { "Content-Type": file.type }, body: file });
4094
4097
  const updatedMembers = [...formData.members];
4095
4098
  if (docType === "passport") {
4096
- updatedMembers[memberIndex].passportFileUrl = data.data.fileUrl || base64data;
4099
+ updatedMembers[memberIndex].passportFileUrl = data.data.fileUrl;
4097
4100
  updatedMembers[memberIndex].passportMetadata = { fileName: file.name, contentType: file.type, fileSizeInBytes: file.size };
4098
4101
  } else {
4099
- updatedMembers[memberIndex].signatureFileUrl = data.data.fileUrl || base64data;
4102
+ updatedMembers[memberIndex].signatureFileUrl = data.data.fileUrl;
4100
4103
  updatedMembers[memberIndex].signatureMetadata = { fileName: file.name, contentType: file.type, fileSizeInBytes: file.size };
4101
4104
  }
4102
4105
  setFormData({ ...formData, members: updatedMembers });
4103
4106
  saveProgress({ ...formData, members: updatedMembers });
4104
- } else import_react_hot_toast7.default.error(`Failed to upload ${docType}.`);
4107
+ } else import_react_hot_toast7.default.error(`Failed to secure upload URL for ${docType}.`);
4105
4108
  }
4106
4109
  } catch (error) {
4107
4110
  import_react_hot_toast7.default.error(error.message);
@@ -4139,14 +4142,17 @@ var UniversalRegistrationFlow = ({
4139
4142
  const file = e.target.files?.[0];
4140
4143
  if (!file) return;
4141
4144
  try {
4142
- const base64data = await getBase64Safe(file);
4143
4145
  if (docType === "id") {
4144
4146
  setGlobalExtractingId(true);
4145
4147
  setAiTasks([{ id: "1", label: "Document Scanned", status: "success" }, { id: "2", label: "Extracting Identity Data...", status: "loading" }]);
4148
+ const uploadData = await baseApi("upload_document", { fileName: file.name, contentType: file.type, fileSize: file.size, docType });
4149
+ if (!uploadData.success) throw new Error(uploadData.error || "Failed to secure upload URL.");
4150
+ await fetch(uploadData.data.uploadUrl, { method: "PUT", headers: { "Content-Type": file.type }, body: file });
4151
+ const base64data = await getBase64Safe(file);
4146
4152
  const data = await baseApi("extract_id", { imageBase64: base64data });
4147
4153
  if (data.success) {
4148
4154
  setAiTasks([{ id: "1", label: "Document Scanned", status: "success" }, { id: "2", label: "Identity Data Extracted", status: "success" }]);
4149
- const updatedForm = { ...formData, idExtractedData: data.data, idFileUrl: data.data.fileUrl || base64data, idMetadata: { fileName: file.name, contentType: file.type, fileSizeInBytes: file.size } };
4155
+ const updatedForm = { ...formData, idExtractedData: data.data, idFileUrl: uploadData.data.fileUrl, idMetadata: { fileName: file.name, contentType: file.type, fileSizeInBytes: file.size } };
4150
4156
  setFormData(updatedForm);
4151
4157
  saveProgress(updatedForm);
4152
4158
  } else {
@@ -4156,15 +4162,16 @@ var UniversalRegistrationFlow = ({
4156
4162
  } else {
4157
4163
  if (docType === "passport") setGlobalUploadingPassport(true);
4158
4164
  else setGlobalUploadingSignature(true);
4159
- const data = await baseApi("upload_document", { imageBase64: base64data, docType });
4160
- if (data.success) {
4165
+ const data = await baseApi("upload_document", { fileName: file.name, contentType: file.type, fileSize: file.size, docType });
4166
+ if (data.success && data.data.uploadUrl) {
4167
+ await fetch(data.data.uploadUrl, { method: "PUT", headers: { "Content-Type": file.type }, body: file });
4161
4168
  const updatedForm = { ...formData };
4162
4169
  if (docType === "passport") {
4163
- updatedForm.passportFileUrl = data.data.fileUrl || base64data;
4170
+ updatedForm.passportFileUrl = data.data.fileUrl;
4164
4171
  updatedForm.passportMetadata = { fileName: file.name, contentType: file.type, fileSizeInBytes: file.size };
4165
4172
  approveSection("passportApproved", updatedForm);
4166
4173
  } else {
4167
- updatedForm.signatureFileUrl = data.data.fileUrl || base64data;
4174
+ updatedForm.signatureFileUrl = data.data.fileUrl;
4168
4175
  updatedForm.signatureMetadata = { fileName: file.name, contentType: file.type, fileSizeInBytes: file.size };
4169
4176
  approveSection("signatureApproved", updatedForm);
4170
4177
  }
package/dist/index.mjs CHANGED
@@ -2898,14 +2898,11 @@ var UniversalAgentConsole = ({
2898
2898
  if (pendingFiles.length === 0 || !selectedApp) return;
2899
2899
  setIsUploading(true);
2900
2900
  try {
2901
- const payloads = await Promise.all(pendingFiles.map(async (file) => {
2902
- const base64data = await new Promise((resolve, reject) => {
2903
- const reader = new FileReader();
2904
- reader.readAsDataURL(file);
2905
- reader.onload = () => resolve(reader.result);
2906
- reader.onerror = (error) => reject(error);
2907
- });
2908
- return { imageBase64: base64data, fileName: file.name, fileType: file.type, fileSize: file.size };
2901
+ const payloads = pendingFiles.map((file) => ({
2902
+ file,
2903
+ fileName: file.name,
2904
+ fileType: file.type,
2905
+ fileSize: file.size
2909
2906
  }));
2910
2907
  const res = await onUploadArchives(selectedApp.id, payloads);
2911
2908
  if (res.success) setPendingFiles([]);
@@ -3988,15 +3985,17 @@ var UniversalRegistrationFlow = ({
3988
3985
  if (optType === "other1") setIsUploadingOther1(true);
3989
3986
  else if (optType === "other2") setIsUploadingOther2(true);
3990
3987
  else if (optType === "other3") setIsUploadingOther3(true);
3991
- const base64data = await getBase64Safe(file);
3992
- const data = await baseApi("upload_document", { imageBase64: base64data, docType: optType });
3993
- if (data.success) {
3988
+ const data = await baseApi("upload_document", { fileName: file.name, contentType: file.type, fileSize: file.size, docType: optType });
3989
+ if (data.success && data.data.uploadUrl) {
3990
+ await fetch(data.data.uploadUrl, { method: "PUT", headers: { "Content-Type": file.type }, body: file });
3994
3991
  const updatedForm = { ...formData };
3995
3992
  const docNum = optType.replace("other", "");
3996
- updatedForm[`otherDoc${docNum}Url`] = data.data.fileUrl || base64data;
3993
+ updatedForm[`otherDoc${docNum}Url`] = data.data.fileUrl;
3997
3994
  updatedForm[`otherDoc${docNum}Meta`] = { fileName: file.name, contentType: file.type, fileSizeInBytes: file.size };
3998
3995
  setFormData(updatedForm);
3999
3996
  saveProgress(updatedForm);
3997
+ } else {
3998
+ throw new Error(data.error || "Failed to secure upload URL.");
4000
3999
  }
4001
4000
  } catch (error) {
4002
4001
  toast6.error(error.message);
@@ -4068,33 +4067,37 @@ var UniversalRegistrationFlow = ({
4068
4067
  const file = e.target.files?.[0];
4069
4068
  if (!file) return;
4070
4069
  try {
4071
- const base64data = await getBase64Safe(file);
4072
4070
  if (docType === "id") {
4073
4071
  setGlobalExtractingId(true);
4074
4072
  setAiTasks([{ id: "1", label: "Document Scanned", status: "success" }, { id: "2", label: `Extracting ID for Member ${memberIndex + 1}...`, status: "loading" }]);
4073
+ const uploadData = await baseApi("upload_document", { fileName: file.name, contentType: file.type, fileSize: file.size, docType: `member_${memberIndex}_id` });
4074
+ if (!uploadData.success) throw new Error(uploadData.error || "Failed to secure upload URL.");
4075
+ await fetch(uploadData.data.uploadUrl, { method: "PUT", headers: { "Content-Type": file.type }, body: file });
4076
+ const base64data = await getBase64Safe(file);
4075
4077
  const data = await baseApi("extract_id", { imageBase64: base64data });
4076
4078
  if (data.success) {
4077
4079
  const updatedMembers = [...formData.members];
4078
- updatedMembers[memberIndex] = { ...updatedMembers[memberIndex], idExtractedData: data.data, idFileUrl: data.data.fileUrl || base64data, idMetadata: { fileName: file.name, contentType: file.type, fileSizeInBytes: file.size } };
4080
+ updatedMembers[memberIndex] = { ...updatedMembers[memberIndex], idExtractedData: data.data, idFileUrl: uploadData.data.fileUrl, idMetadata: { fileName: file.name, contentType: file.type, fileSizeInBytes: file.size } };
4079
4081
  setFormData({ ...formData, members: updatedMembers });
4080
4082
  saveProgress({ ...formData, members: updatedMembers });
4081
4083
  } else toast6.error(data.error || "Uh oh! Something went wrong.");
4082
4084
  } else {
4083
4085
  if (docType === "passport") setGlobalUploadingPassport(true);
4084
4086
  else setGlobalUploadingSignature(true);
4085
- const data = await baseApi("upload_document", { imageBase64: base64data, docType: `member_${memberIndex}_${docType}` });
4086
- if (data.success) {
4087
+ const data = await baseApi("upload_document", { fileName: file.name, contentType: file.type, fileSize: file.size, docType: `member_${memberIndex}_${docType}` });
4088
+ if (data.success && data.data.uploadUrl) {
4089
+ await fetch(data.data.uploadUrl, { method: "PUT", headers: { "Content-Type": file.type }, body: file });
4087
4090
  const updatedMembers = [...formData.members];
4088
4091
  if (docType === "passport") {
4089
- updatedMembers[memberIndex].passportFileUrl = data.data.fileUrl || base64data;
4092
+ updatedMembers[memberIndex].passportFileUrl = data.data.fileUrl;
4090
4093
  updatedMembers[memberIndex].passportMetadata = { fileName: file.name, contentType: file.type, fileSizeInBytes: file.size };
4091
4094
  } else {
4092
- updatedMembers[memberIndex].signatureFileUrl = data.data.fileUrl || base64data;
4095
+ updatedMembers[memberIndex].signatureFileUrl = data.data.fileUrl;
4093
4096
  updatedMembers[memberIndex].signatureMetadata = { fileName: file.name, contentType: file.type, fileSizeInBytes: file.size };
4094
4097
  }
4095
4098
  setFormData({ ...formData, members: updatedMembers });
4096
4099
  saveProgress({ ...formData, members: updatedMembers });
4097
- } else toast6.error(`Failed to upload ${docType}.`);
4100
+ } else toast6.error(`Failed to secure upload URL for ${docType}.`);
4098
4101
  }
4099
4102
  } catch (error) {
4100
4103
  toast6.error(error.message);
@@ -4132,14 +4135,17 @@ var UniversalRegistrationFlow = ({
4132
4135
  const file = e.target.files?.[0];
4133
4136
  if (!file) return;
4134
4137
  try {
4135
- const base64data = await getBase64Safe(file);
4136
4138
  if (docType === "id") {
4137
4139
  setGlobalExtractingId(true);
4138
4140
  setAiTasks([{ id: "1", label: "Document Scanned", status: "success" }, { id: "2", label: "Extracting Identity Data...", status: "loading" }]);
4141
+ const uploadData = await baseApi("upload_document", { fileName: file.name, contentType: file.type, fileSize: file.size, docType });
4142
+ if (!uploadData.success) throw new Error(uploadData.error || "Failed to secure upload URL.");
4143
+ await fetch(uploadData.data.uploadUrl, { method: "PUT", headers: { "Content-Type": file.type }, body: file });
4144
+ const base64data = await getBase64Safe(file);
4139
4145
  const data = await baseApi("extract_id", { imageBase64: base64data });
4140
4146
  if (data.success) {
4141
4147
  setAiTasks([{ id: "1", label: "Document Scanned", status: "success" }, { id: "2", label: "Identity Data Extracted", status: "success" }]);
4142
- const updatedForm = { ...formData, idExtractedData: data.data, idFileUrl: data.data.fileUrl || base64data, idMetadata: { fileName: file.name, contentType: file.type, fileSizeInBytes: file.size } };
4148
+ const updatedForm = { ...formData, idExtractedData: data.data, idFileUrl: uploadData.data.fileUrl, idMetadata: { fileName: file.name, contentType: file.type, fileSizeInBytes: file.size } };
4143
4149
  setFormData(updatedForm);
4144
4150
  saveProgress(updatedForm);
4145
4151
  } else {
@@ -4149,15 +4155,16 @@ var UniversalRegistrationFlow = ({
4149
4155
  } else {
4150
4156
  if (docType === "passport") setGlobalUploadingPassport(true);
4151
4157
  else setGlobalUploadingSignature(true);
4152
- const data = await baseApi("upload_document", { imageBase64: base64data, docType });
4153
- if (data.success) {
4158
+ const data = await baseApi("upload_document", { fileName: file.name, contentType: file.type, fileSize: file.size, docType });
4159
+ if (data.success && data.data.uploadUrl) {
4160
+ await fetch(data.data.uploadUrl, { method: "PUT", headers: { "Content-Type": file.type }, body: file });
4154
4161
  const updatedForm = { ...formData };
4155
4162
  if (docType === "passport") {
4156
- updatedForm.passportFileUrl = data.data.fileUrl || base64data;
4163
+ updatedForm.passportFileUrl = data.data.fileUrl;
4157
4164
  updatedForm.passportMetadata = { fileName: file.name, contentType: file.type, fileSizeInBytes: file.size };
4158
4165
  approveSection("passportApproved", updatedForm);
4159
4166
  } else {
4160
- updatedForm.signatureFileUrl = data.data.fileUrl || base64data;
4167
+ updatedForm.signatureFileUrl = data.data.fileUrl;
4161
4168
  updatedForm.signatureMetadata = { fileName: file.name, contentType: file.type, fileSizeInBytes: file.size };
4162
4169
  approveSection("signatureApproved", updatedForm);
4163
4170
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@retinalabsllc/zairusjs",
3
- "version": "4.0.12",
3
+ "version": "4.0.13",
4
4
  "description": "A perceptive, Ai data driven Next.js UI component library.",
5
5
  "author": "Retina Labs Company",
6
6
  "license": "MIT",