Skip to content

Commit c2f9aee

Browse files
authored
Merge pull request #187 from gaiin-platform/feature/data-disclosure-viewer
View data disclosure in a tab in the user settings
2 parents 10a626f + c344462 commit c2f9aee

File tree

2 files changed

+128
-1
lines changed

2 files changed

+128
-1
lines changed
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
import React, { FC, useEffect, useState } from 'react';
2+
import { getLatestDataDisclosure } from "@/services/dataDisclosureService";
3+
import { IconExternalLink } from '@tabler/icons-react';
4+
5+
interface Props {
6+
open: boolean;
7+
}
8+
9+
export const DataDisclosureViewer: FC<Props> = ({ open }) => {
10+
const [dataDisclosure, setDataDisclosure] = useState<{url: string, html: string | null} | null>(null);
11+
const [isLoading, setIsLoading] = useState(false);
12+
const [error, setError] = useState<string | null>(null);
13+
14+
useEffect(() => {
15+
const fetchDataDisclosure = async () => {
16+
if (!open) return;
17+
18+
setIsLoading(true);
19+
setError(null);
20+
21+
try {
22+
const latestDisclosure = await getLatestDataDisclosure();
23+
const latestDisclosureBodyObject = JSON.parse(latestDisclosure.body);
24+
const latestDisclosureUrlPDF = latestDisclosureBodyObject.pdf_pre_signed_url;
25+
const latestDisclosureHTML = latestDisclosureBodyObject.html_content;
26+
27+
setDataDisclosure({
28+
url: latestDisclosureUrlPDF,
29+
html: latestDisclosureHTML
30+
});
31+
} catch (err) {
32+
console.error('Failed to fetch data disclosure:', err);
33+
setError('Failed to load data disclosure. Please try again later.');
34+
} finally {
35+
setIsLoading(false);
36+
}
37+
};
38+
39+
fetchDataDisclosure();
40+
}, [open]);
41+
42+
if (isLoading) {
43+
return (
44+
<div className="flex flex-col items-center justify-center min-h-[400px]">
45+
<div className="animate-spin rounded-full h-12 w-12 border-b-2 border-blue-500"></div>
46+
<p className="mt-4 text-gray-600 dark:text-gray-400">Loading data disclosure...</p>
47+
</div>
48+
);
49+
}
50+
51+
if (error) {
52+
return (
53+
<div className="flex flex-col items-center justify-center min-h-[400px]">
54+
<p className="text-red-500 dark:text-red-400">{error}</p>
55+
</div>
56+
);
57+
}
58+
59+
if (!dataDisclosure) {
60+
return (
61+
<div className="flex flex-col items-center justify-center min-h-[400px]">
62+
<p className="text-gray-600 dark:text-gray-400">No data disclosure available.</p>
63+
</div>
64+
);
65+
}
66+
67+
return (
68+
<div className="settings-card">
69+
<div className="settings-card-header flex flex-row items-center gap-4 justify-between">
70+
<div>
71+
<h3 className="settings-card-title">Amplify Data Disclosure Agreement</h3>
72+
<p className="settings-card-description">Review Amplify's data handling and privacy practices</p>
73+
</div>
74+
{dataDisclosure.url && (
75+
<a
76+
href={dataDisclosure.url}
77+
target="_blank"
78+
rel="noopener noreferrer"
79+
className="flex items-center gap-2 px-4 py-2 bg-blue-200 dark:bg-blue-700 hover:bg-blue-600 dark:text-white rounded-md transition-colors duration-200"
80+
>
81+
<IconExternalLink size={18} />
82+
Download PDF
83+
</a>
84+
)}
85+
</div>
86+
87+
<div className="settings-card-content">
88+
{dataDisclosure.html ? (
89+
<div
90+
className="data-disclosure-content p-4 border border-gray-300 dark:border-neutral-600 rounded-md bg-white dark:bg-[#343541] max-h-[600px] overflow-y-auto"
91+
dangerouslySetInnerHTML={{ __html: dataDisclosure.html }}
92+
/>
93+
) : (
94+
<div className="flex flex-col items-center justify-center min-h-[200px]">
95+
<p className="text-gray-600 dark:text-gray-400 mb-4">
96+
The data disclosure content is not available for preview.
97+
</p>
98+
{dataDisclosure.url && (
99+
<a
100+
href={dataDisclosure.url}
101+
target="_blank"
102+
rel="noopener noreferrer"
103+
className="text-blue-500 hover:text-blue-600 underline"
104+
>
105+
Please download the PDF to view the full disclosure
106+
</a>
107+
)}
108+
</div>
109+
)}
110+
</div>
111+
</div>
112+
);
113+
};

components/Settings/SettingDialog.tsx

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import { Accounts } from './AccountComponents/Account';
2525
import { Account, noCoaAccount } from '@/types/accounts';
2626
import { getAccounts } from '@/services/accountService';
2727
import { noRateLimit } from '@/types/rateLimit';
28+
import { DataDisclosureViewer } from './DataDisclosureViewer';
2829

2930
interface Props {
3031
open: boolean;
@@ -516,14 +517,27 @@ export const SettingDialog: FC<Props> = ({ open, onClose, openToTab }) => {
516517
// Conversation Storage
517518

518519
{label: `Conversation Storage`,
519-
title: "Enable conversations to sync across devices or keep them priavte",
520+
title: "Enable conversations to sync across devices or keep them private",
520521
content: <>
521522
{featureFlags.storeCloudConversations &&
522523
<ConversationsStorage open={open} />
523524
}
524525
</>
525526

526527
},
528+
///////////////////////////////////////////////////////////////////////////////
529+
// Review Data Disclosure
530+
531+
{label: `Review Data Disclosure`,
532+
title: "Review the Amplify data disclosure",
533+
content: <>
534+
{featureFlags.dataDisclosure &&
535+
<DataDisclosureViewer open={open} />
536+
}
537+
</>
538+
539+
},
540+
527541
///////////////////////////////////////////////////////////////////////////////
528542
// Legacy Workspaces
529543
...(workspaces && workspaces.length > 0 ?

0 commit comments

Comments
 (0)