-
Notifications
You must be signed in to change notification settings - Fork 141
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add logic hook with context-to-context logics
- Loading branch information
1 parent
8af3eda
commit c8e0bcc
Showing
3 changed files
with
113 additions
and
99 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,105 @@ | ||
import React, { useContext, useState, useEffect } from 'react'; | ||
import { type UseAppStoreType, AppContext } from './AppContext'; | ||
|
||
import { GarageContext, type UseGarageStoreType } from './GarageContext'; | ||
import { FederationContext, UseFederationStoreType } from './FederationContext'; | ||
import { Order } from '../models'; | ||
|
||
const statusToDelay = [ | ||
3000, // 'Waiting for maker bond' | ||
35000, // 'Public' | ||
180000, // 'Paused' | ||
3000, // 'Waiting for taker bond' | ||
999999, // 'Cancelled' | ||
999999, // 'Expired' | ||
8000, // 'Waiting for trade collateral and buyer invoice' | ||
8000, // 'Waiting only for seller trade collateral' | ||
8000, // 'Waiting only for buyer invoice' | ||
10000, // 'Sending fiat - In chatroom' | ||
10000, // 'Fiat sent - In chatroom' | ||
100000, // 'In dispute' | ||
999999, // 'Collaboratively cancelled' | ||
10000, // 'Sending satoshis to buyer' | ||
60000, // 'Sucessful trade' | ||
30000, // 'Failed lightning network routing' | ||
300000, // 'Wait for dispute resolution' | ||
300000, // 'Maker lost dispute' | ||
300000, // 'Taker lost dispute' | ||
]; | ||
|
||
const useLogic = () => { | ||
const { page, open } = useContext<UseAppStoreType>(AppContext); | ||
const { federation, delay, setDelay } = useContext<UseFederationStoreType>(FederationContext); | ||
const { garage, setBadOrder } = useContext<UseGarageStoreType>(GarageContext); | ||
|
||
const [timer, setTimer] = useState<NodeJS.Timer | undefined>(() => | ||
setInterval(() => null, delay), | ||
); | ||
|
||
const onOrderReceived = (order: Order): void => { | ||
let newDelay = 5000; | ||
if (order?.bad_request) { | ||
newDelay = 99999999; | ||
console.log('bad request on order, new delay', newDelay); | ||
setBadOrder(order.bad_request); | ||
garage.updateOrder(null); | ||
} | ||
if (order?.id) { | ||
newDelay = | ||
order.status >= 0 && order.status <= 18 | ||
? page === 'order' | ||
? statusToDelay[order.status] | ||
: statusToDelay[order.status] * 5 // If user is not looking at "order" tab, refresh less often. | ||
: 99999999; | ||
console.log('has order id, new delay is', newDelay); | ||
garage.updateOrder(order); | ||
setBadOrder(undefined); | ||
} | ||
console.log('page:', page, 'Why remains as initial page?'); | ||
console.log('setting delay!', newDelay); | ||
setDelay(newDelay); | ||
setTimer(setTimeout(fetchCurrentOrder, newDelay)); | ||
}; | ||
|
||
const fetchCurrentOrder: () => void = () => { | ||
const slot = garage?.getSlot(); | ||
const robot = slot?.getRobot(); | ||
if (slot?.token && slot?.activeShortAlias && robot?.activeOrderId) { | ||
const coordinator = federation.getCoordinator(slot.activeShortAlias); | ||
void coordinator?.fetchOrder(robot.activeOrderId, robot, slot.token).then((order) => { | ||
onOrderReceived(order as Order); | ||
}); | ||
} else { | ||
console.log('Hit no order, delay', 5000); | ||
setTimer(setTimeout(fetchCurrentOrder, 5000)); | ||
} | ||
}; | ||
|
||
useEffect(() => { | ||
clearInterval(timer); | ||
fetchCurrentOrder(); | ||
setDelay(5000); | ||
return () => { | ||
clearInterval(timer); | ||
}; | ||
}, [page]); | ||
|
||
useEffect(() => { | ||
if (page === 'offers') void federation.updateBook(); | ||
}, [page]); | ||
|
||
useEffect(() => { | ||
const slot = garage.getSlot(); | ||
const robot = slot?.getRobot(); | ||
|
||
if (robot && garage.currentSlot) { | ||
if (open.profile && Boolean(slot?.hashId) && slot?.token) { | ||
void federation.fetchRobot(garage, slot?.token); // refresh/update existing robot | ||
} else if (slot?.token && robot.encPrivKey && robot.pubKey) { | ||
void federation.fetchRobot(garage, slot.token); // create new robot with existing token and keys (on network and coordinator change) | ||
} | ||
} | ||
}, [open.profile]); | ||
}; | ||
|
||
export default useLogic; |