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+ } ;
0 commit comments