@@ -21,7 +21,7 @@ import {
2121 widgetsSelector ,
2222} from '../store/reselect/widgets' ;
2323import { setWidgetsSortOrder } from '../store/slices/widgets' ;
24- import { TFeedWidget , TWidget } from '../store/types/widgets' ;
24+ import { TFeedWidget } from '../store/types/widgets' ;
2525import { TouchableOpacity , View } from '../styles/components' ;
2626import { Checkmark , PlusIcon , SortAscendingIcon } from '../styles/icons' ;
2727import { Caption13Up } from '../styles/text' ;
@@ -33,10 +33,12 @@ import HeadlinesWidget from './HeadlinesWidget';
3333import LuganoFeedWidget from './LuganoFeedWidget' ;
3434import PriceWidget from './PriceWidget' ;
3535import Button from './buttons/Button' ;
36+ import CalculatorWidget from './widgets/CalculatorWidget' ;
3637
3738const Widgets = ( ) : ReactElement => {
3839 const { t } = useTranslation ( 'slashtags' ) ;
3940 const dispatch = useAppDispatch ( ) ;
41+
4042 const widgets = useAppSelector ( widgetsSelector ) ;
4143 const sortOrder = useAppSelector ( widgetsOrderSelector ) ;
4244 const onboardedWidgets = useAppSelector ( onboardedWidgetsSelector ) ;
@@ -45,15 +47,20 @@ const Widgets = (): ReactElement => {
4547 useFocusEffect ( useCallback ( ( ) => setEditing ( false ) , [ ] ) ) ;
4648
4749 const sortedWidgets = useMemo ( ( ) => {
48- const savedWidgets = Object . entries ( widgets ) as [ string , TWidget ] [ ] ;
49- return savedWidgets . sort (
50- ( [ a ] , [ b ] ) => sortOrder . indexOf ( a ) - sortOrder . indexOf ( b ) ,
51- ) ;
50+ const savedWidgets = Object . keys ( widgets ) ;
51+
52+ const sorted = savedWidgets . sort ( ( a , b ) => {
53+ const indexA = sortOrder . indexOf ( a ) ;
54+ const indexB = sortOrder . indexOf ( b ) ;
55+ return indexA - indexB ;
56+ } ) ;
57+
58+ return sorted ;
5259 } , [ widgets , sortOrder ] ) ;
5360
5461 const onDragEnd = useCallback (
5562 ( { data } ) => {
56- const order = data . map ( ( i ) : string => i [ 0 ] ) ;
63+ const order = data . map ( ( id ) : string => id ) ;
5764 dispatch ( setWidgetsSortOrder ( order ) ) ;
5865 } ,
5966 [ dispatch ] ,
@@ -67,25 +74,41 @@ const Widgets = (): ReactElement => {
6774 } ;
6875
6976 const renderItem = useCallback (
70- ( { item, drag } : RenderItemParams < [ string , TWidget ] > ) : ReactElement => {
71- const [ url , widget ] = item ;
72-
73- const _drag = ( ) : void => {
77+ ( { item : id , drag } : RenderItemParams < string > ) : ReactElement => {
78+ const initiateDrag = ( ) : void => {
7479 // only allow dragging if there are more than 1 widget
7580 if ( sortedWidgets . length > 1 && editing ) {
7681 drag ( ) ;
7782 }
7883 } ;
7984
80- const feedWidget = widget as TFeedWidget ;
81-
8285 let testID : string ;
8386 let Component :
8487 | typeof PriceWidget
8588 | typeof HeadlinesWidget
8689 | typeof BlocksWidget
8790 | typeof FactsWidget
88- | typeof FeedWidget ;
91+ | typeof FeedWidget
92+ | typeof CalculatorWidget ;
93+
94+ if ( id === 'calculator' ) {
95+ Component = CalculatorWidget ;
96+ testID = 'CalculatorWidget' ;
97+
98+ return (
99+ < ScaleDecorator >
100+ < Component
101+ style = { styles . widget }
102+ isEditing = { editing }
103+ testID = { testID }
104+ onLongPress = { initiateDrag }
105+ onPressIn = { initiateDrag }
106+ />
107+ </ ScaleDecorator >
108+ ) ;
109+ }
110+
111+ const feedWidget = widgets [ id ] as TFeedWidget ;
89112
90113 switch ( feedWidget . type ) {
91114 case SUPPORTED_FEED_TYPES . PRICE_FEED :
@@ -117,17 +140,17 @@ const Widgets = (): ReactElement => {
117140 < ScaleDecorator >
118141 < Component
119142 style = { styles . widget }
120- url = { url }
143+ url = { id }
121144 widget = { feedWidget }
122145 isEditing = { editing }
123- onLongPress = { _drag }
124- onPressIn = { _drag }
125146 testID = { testID }
147+ onLongPress = { initiateDrag }
148+ onPressIn = { initiateDrag }
126149 />
127150 </ ScaleDecorator >
128151 ) ;
129152 } ,
130- [ editing , sortedWidgets . length ] ,
153+ [ editing , widgets , sortedWidgets . length ] ,
131154 ) ;
132155
133156 return (
@@ -136,7 +159,6 @@ const Widgets = (): ReactElement => {
136159 < Caption13Up color = "secondary" > { t ( 'widgets' ) } </ Caption13Up >
137160 { sortedWidgets . length > 0 && (
138161 < TouchableOpacity
139- activeOpacity = { 0.7 }
140162 hitSlop = { { top : 15 , right : 15 , bottom : 15 , left : 15 } }
141163 testID = "WidgetsEdit"
142164 onPress = { ( ) : void => setEditing ( ! editing ) } >
@@ -151,7 +173,7 @@ const Widgets = (): ReactElement => {
151173
152174 < DraggableFlatList
153175 data = { sortedWidgets }
154- keyExtractor = { ( item ) : string => item [ 0 ] }
176+ keyExtractor = { ( id ) : string => id }
155177 renderItem = { renderItem }
156178 scrollEnabled = { false }
157179 activationDistance = { editing ? 0 : 100 }
0 commit comments