@@ -11,6 +11,7 @@ import { CurrencySelection } from "./CurrencySelection";
1111import { CalculationResults } from "./CalculationResults" ;
1212import { CurrencyInput } from "./CurrencyInput" ;
1313import { HiddenDataInfo } from "./HiddenDataInfo" ;
14+ import ErrorBoundary from "../ErrorBoundary" ;
1415
1516import { currencies } from "../../constant" ;
1617
@@ -20,26 +21,35 @@ export function CalculationView() {
2021 const [ value , setValue ] = useState ( preferences . starred ? "1" : "" ) ;
2122 const currencyMap = useContext ( CurrencyMapContext ) ;
2223
23- const convertedResults = useMemo ( ( ) => {
24+ const results = useMemo ( ( ) => {
25+ const values : ConversionResults = { conversions : [ ] , highestConfidence : 0 } ;
2426 if ( ! selected || ! currencyMap ) {
25- return [ ] ;
27+ return values ;
2628 }
2729
28- const conversions = [ ] ;
29- for ( const currency of currencies . filter ( ( c ) => c !== selected ) ) {
30- const conversion = convert ( selected , currency , currencyMap ) ;
30+ try {
31+ for ( const currency of currencies . filter ( ( c ) => c !== selected ) ) {
32+ const conversion = convert ( selected , currency , currencyMap ) ;
3133
32- if ( conversion == null ) {
33- continue ;
34- }
34+ if ( conversion . rate == null ) {
35+ continue ;
36+ }
37+
38+ if ( conversion . confidence && conversion . confidence > values . highestConfidence ) {
39+ values . highestConfidence = conversion . confidence ;
40+ }
3541
36- conversions . push ( {
37- currency,
38- calculation : value ? parseFloat ( value ) * conversion : 0
39- } ) ;
42+ values . conversions . push ( {
43+ currency,
44+ calculation : value ? parseFloat ( value ) * conversion . rate : 0 ,
45+ confidence : conversion . confidence ?? 0
46+ } ) ;
47+ }
48+ } catch ( e ) {
49+ console . error ( e ) ;
4050 }
4151
42- return conversions ;
52+ return values ;
4353 } , [ selected , value , currencyMap ] ) ;
4454
4555 if ( currencyMap == null ) {
@@ -52,25 +62,29 @@ export function CalculationView() {
5262
5363 return (
5464 < div className = 'w-full flex flex-1 overflow-x-hidden justify-center px-4' >
55- < div className = { clsx ( "flex flex-col gap-4" , "lg:gap-6 lg:flex-row" ) } >
65+ < div className = { clsx ( "flex flex-col h-min gap-4" , "lg:gap-6 lg:flex-row" ) } >
5666 < CurrencySelection selected = { selected } setSelected = { setSelected } />
5767
58- < div className = 'flex flex-col gap-4 min-w-[390px ]' >
68+ < div className = 'flex flex-col h-full gap-4 md: min-w-[410px ]' >
5969 { selected ? (
6070 < CurrencyInput value = { value } setValue = { setValue } selected = { selected } />
6171 ) : (
6272 < p > Please select a currency</ p >
6373 ) }
6474
65- < div className = 'min-h-[230px] flex flex-col justify-between gap-2' >
66- { selected && < CalculationResults primary = { selected } results = { convertedResults } /> }
75+ < ErrorBoundary >
76+ < div className = 'flex flex-col gap-2' >
77+ { selected && < CalculationResults primary = { selected } results = { results } /> }
6778
68- { selected && convertedResults . length < currencies . length - 2 && < HiddenDataInfo /> }
69- < p className = 'flex items-center gap-1 text-primary-darker italic text-xs' >
70- < DatabaseBackup className = 'w-4 h-4' /> Last Updated:{ " " }
71- { new Date ( currencyMap . meta . createdAt ) . toLocaleString ( ) }
72- </ p >
73- </ div >
79+ < div className = 'flex flex-col gap-2' >
80+ { selected && results . conversions . length < currencies . length - 2 && < HiddenDataInfo /> }
81+ < p className = 'flex items-center gap-1 text-primary-darker italic text-xs' >
82+ < DatabaseBackup className = 'w-4 h-4' /> Last Updated:{ " " }
83+ { new Date ( currencyMap . meta . createdAt ) . toLocaleString ( ) }
84+ </ p >
85+ </ div >
86+ </ div >
87+ </ ErrorBoundary >
7488 </ div >
7589 </ div >
7690 </ div >
0 commit comments