@@ -6,117 +6,100 @@ import { SOL_MINT_ADDRESS } from '@/constants/tokens';
66import { type RootStore } from '@/state/_store' ;
77import { appQueryClient } from '@/state/appQueryClient' ;
88import { getCurrentPath , getSpotApiEndpoint } from '@/state/appSelectors' ;
9+ import { createAppSelector } from '@/state/appTypes' ;
910import { setSolPrice , setTokenMetadata } from '@/state/raw' ;
1011import { getCurrentSpotToken } from '@/state/spot' ;
1112
1213import { SpotApiClient } from '@/clients/spotApi' ;
1314
1415import { createStoreEffect } from '../lib/createStoreEffect' ;
1516import { loadableIdle } from '../lib/loadable' ;
16- import { mapLoadableData } from '../lib/mapLoadable' ;
1717import { logBonsaiError , wrapAndLogBonsaiError } from '../logs' ;
1818import { queryResultToLoadable } from './lib/queryResultToLoadable' ;
1919import { safeSubscribeObserver } from './lib/safeSubscribe' ;
2020
21- export function setUpTokenMetadataQuery ( store : RootStore ) {
22- return createStoreEffect (
23- store ,
24- ( state ) => {
25- const currentSpotToken = getCurrentSpotToken ( state ) ;
26- const spotApiEndpoint = getSpotApiEndpoint ( state ) ;
21+ const getSpotApiEndpointWhenOnSpotPage = createAppSelector (
22+ [ getCurrentPath , getSpotApiEndpoint , getCurrentSpotToken ] ,
23+ ( currentPath , spotApiEndpoint , currentSpotToken ) => {
24+ if ( ! currentPath . startsWith ( '/spot' ) || ! currentSpotToken ) {
25+ return null ;
26+ }
27+ return { endpoint : spotApiEndpoint , currentSpotToken } ;
28+ }
29+ ) ;
2730
28- // Only poll when there's an active spot token
29- if ( ! currentSpotToken ) {
30- return null ;
31- }
31+ export function setUpTokenMetadataQuery ( store : RootStore ) {
32+ return createStoreEffect ( store , getSpotApiEndpointWhenOnSpotPage , ( params ) => {
33+ if ( ! params ) {
34+ store . dispatch ( setTokenMetadata ( loadableIdle ( ) ) ) ;
35+ return ( ) => { } ;
36+ }
3237
33- return { endpoint : spotApiEndpoint , mint : currentSpotToken } ;
34- } ,
35- ( params ) => {
36- if ( ! params ) {
37- store . dispatch ( setTokenMetadata ( loadableIdle ( ) ) ) ;
38- return ( ) => { } ;
38+ const { endpoint, currentSpotToken } = params ;
39+ const spotApiClient = new SpotApiClient ( endpoint ) ;
40+
41+ const observer = new QueryObserver ( appQueryClient , {
42+ queryKey : [ 'spot' , 'tokenMetadata' , currentSpotToken ] ,
43+ queryFn : wrapAndLogBonsaiError (
44+ ( ) => spotApiClient . getTokenMetadata ( currentSpotToken ) ,
45+ 'tokenMetadata'
46+ ) ,
47+ retry : 5 ,
48+ retryDelay : ( attempt ) => timeUnits . second * 3 * 2 ** attempt ,
49+ } ) ;
50+
51+ const unsubscribe = safeSubscribeObserver ( observer , ( result ) => {
52+ try {
53+ store . dispatch ( setTokenMetadata ( queryResultToLoadable ( result ) ) ) ;
54+ } catch ( e ) {
55+ logBonsaiError (
56+ 'setUpTokenMetadataQuery' ,
57+ 'Error handling result from react query' ,
58+ e ,
59+ result
60+ ) ;
3961 }
62+ } ) ;
4063
41- const { endpoint, mint } = params ;
42- const spotApiClient = new SpotApiClient ( endpoint ) ;
43-
44- const observer = new QueryObserver ( appQueryClient , {
45- queryKey : [ 'spot' , 'tokenMetadata' , mint ] ,
46- queryFn : wrapAndLogBonsaiError ( ( ) => spotApiClient . getTokenMetadata ( mint ) , 'tokenMetadata' ) ,
47- retry : 5 ,
48- retryDelay : ( attempt ) => timeUnits . second * 3 * 2 ** attempt ,
49- } ) ;
50-
51- const unsubscribe = safeSubscribeObserver ( observer , ( result ) => {
52- try {
53- store . dispatch ( setTokenMetadata ( queryResultToLoadable ( result ) ) ) ;
54- } catch ( e ) {
55- logBonsaiError (
56- 'setUpTokenMetadataQuery' ,
57- 'Error handling result from react query' ,
58- e ,
59- result
60- ) ;
61- }
62- } ) ;
63-
64- return ( ) => {
65- store . dispatch ( setTokenMetadata ( loadableIdle ( ) ) ) ;
66- unsubscribe ( ) ;
67- } ;
68- }
69- ) ;
64+ return ( ) => {
65+ store . dispatch ( setTokenMetadata ( loadableIdle ( ) ) ) ;
66+ unsubscribe ( ) ;
67+ } ;
68+ } ) ;
7069}
7170
7271export function setUpSolPriceQuery ( store : RootStore ) {
73- return createStoreEffect (
74- store ,
75- ( state ) => {
76- const currentPath = getCurrentPath ( state ) ;
77- const spotApiEndpoint = getSpotApiEndpoint ( state ) ;
78-
79- // Only poll when user is on the spot page
80- if ( ! currentPath . startsWith ( '/spot' ) ) {
81- return null ;
82- }
72+ return createStoreEffect ( store , getSpotApiEndpointWhenOnSpotPage , ( params ) => {
73+ if ( ! params ) {
74+ store . dispatch ( setSolPrice ( loadableIdle ( ) ) ) ;
75+ return ( ) => { } ;
76+ }
8377
84- return spotApiEndpoint ;
85- } ,
86- ( endpoint ) => {
87- if ( ! endpoint ) {
88- store . dispatch ( setSolPrice ( loadableIdle ( ) ) ) ;
89- return ( ) => { } ;
78+ const spotApiClient = new SpotApiClient ( params . endpoint ) ;
79+
80+ const observer = new QueryObserver ( appQueryClient , {
81+ queryKey : [ 'spot' , 'solPrice' ] ,
82+ queryFn : wrapAndLogBonsaiError (
83+ ( ) => spotApiClient . getTokenPrice ( SOL_MINT_ADDRESS ) ,
84+ 'solPrice'
85+ ) ,
86+ refetchInterval : timeUnits . second * 10 ,
87+ staleTime : timeUnits . second * 10 ,
88+ retry : 5 ,
89+ retryDelay : ( attempt ) => timeUnits . second * 3 * 2 ** attempt ,
90+ } ) ;
91+
92+ const unsubscribe = safeSubscribeObserver ( observer , ( result ) => {
93+ try {
94+ store . dispatch ( setSolPrice ( queryResultToLoadable ( result ) ) ) ;
95+ } catch ( e ) {
96+ logBonsaiError ( 'setUpSolPriceQuery' , 'Error handling result from react query' , e , result ) ;
9097 }
98+ } ) ;
9199
92- const spotApiClient = new SpotApiClient ( endpoint ) ;
93-
94- const observer = new QueryObserver ( appQueryClient , {
95- queryKey : [ 'spot' , 'solPrice' ] ,
96- queryFn : wrapAndLogBonsaiError (
97- ( ) => spotApiClient . getTokenPrice ( SOL_MINT_ADDRESS ) ,
98- 'solPrice'
99- ) ,
100- refetchInterval : timeUnits . second * 10 ,
101- staleTime : timeUnits . second * 10 ,
102- retry : 5 ,
103- retryDelay : ( attempt ) => timeUnits . second * 3 * 2 ** attempt ,
104- } ) ;
105-
106- const unsubscribe = safeSubscribeObserver ( observer , ( result ) => {
107- try {
108- store . dispatch (
109- setSolPrice ( mapLoadableData ( queryResultToLoadable ( result ) , ( data ) => data . price ) )
110- ) ;
111- } catch ( e ) {
112- logBonsaiError ( 'setUpSolPriceQuery' , 'Error handling result from react query' , e , result ) ;
113- }
114- } ) ;
115-
116- return ( ) => {
117- store . dispatch ( setSolPrice ( loadableIdle ( ) ) ) ;
118- unsubscribe ( ) ;
119- } ;
120- }
121- ) ;
100+ return ( ) => {
101+ store . dispatch ( setSolPrice ( loadableIdle ( ) ) ) ;
102+ unsubscribe ( ) ;
103+ } ;
104+ } ) ;
122105}
0 commit comments