Skip to content

Instantly share code, notes, and snippets.

@aceslick911
Last active July 1, 2021 00:27
Show Gist options
  • Save aceslick911/202c766ce0dda1a9d662818f499552ad to your computer and use it in GitHub Desktop.
Save aceslick911/202c766ce0dda1a9d662818f499552ad to your computer and use it in GitHub Desktop.
Generated by XState Viz: https://xstate.js.org/viz
const resolveInOneSec = async () => {
return await new Promise(resolve => {
setTimeout(() => {
resolve(true);
console.log("RESOLVED");
}, 1000)
});
};
const BCGServices = {
UI_READY: resolveInOneSec,
BASKET_READY: resolveInOneSec,
INVENTORY_READY: resolveInOneSec,
BASKET_CLEARED: resolveInOneSec,
UPDATE_CART: resolveInOneSec,
UPDATE_BILL: resolveInOneSec,
PROCESS_DISCOUNT_RULES: resolveInOneSec,
PROCESS_DISCOUNT_RULE: resolveInOneSec,
PROCESS_DISCOUNT_RULE_FOR_BASKET: resolveInOneSec,
CHECK_DISCOUNT_RULE_ON_ITEM: resolveInOneSec,
MARK_DISCOUNT_NOTAPPLY_FOR_ITEM: resolveInOneSec,
MARK_DISCOUNT_DOESAPPLY_FOR_ITEM: resolveInOneSec,
CALCULATE_LINE_ITEMS: resolveInOneSec,
BILL_IS_READY: resolveInOneSec,
}
const BCGContext = {
discountRules: [],
productInventory: [],
basket: {
lineItems: [],
discountsApplied: [],
totalCost: 0,
totalDiscounts: 0,
amountDue: 0,
discountInfo: ""
},
uiState: {
websiteName: "BCG Checkout"
},
}
const BCGCheckout = Machine/*<typeof BCGContext, any>*/({
id: 'bcg-checkout',
initial: 'start',
context: BCGContext,
states: {
start: {
on: {
LOAD_SHOPPING_ASSETS: {
target: 'prepareShopppingAssets.UserInterface',
}
}
},
prepareShopppingAssets: {
type: 'parallel',
states: {
UserInterface: {
initial: 'loadingUI',
states: {
loadingUI: {
id: 'ui-ready',
after:{
1000:'UI_READY'
},
on:{
UI_READY:'done',
}
},
done: {
type: "final",
}
}
},
ShoppingBasket: {
initial: 'loadingBasket',
states: {
loadingBasket: {
id: 'basket-ready',
after:{
1000:'BASKET_READY'
},
on:{
BASKET_READY:'done',
}
},
done: {
type: "final",
}
}
},
Products: {
initial: 'loadingInventory',
states: {
loadingInventory: {
id: 'inventory-ready',
after:{
1000:'INVENTORY_READY'
},
on:{
INVENTORY_READY:'done',
}
},
done: {
type: "final",
}
}
}
},
onDone: {
target: '#UIActive',
},
},
shopping: {
id: 'shopping',
type: 'parallel',
states: {
uIActive: {
id: 'UIActive',
initial:'shoppingReady',
states: {
shoppingReady:{
},
basketCleared: {
id: 'basket-cleared',
after:{
1000:'BASKET_CLEARED'
},
on:{
BASKET_CLEARED:'#shopping.updatingShopping',
}
},
purchasing: {
states: {
paymentProcessing: {
on:{
PAYMENT_ACCEPTED:{
target:'shoppingComplete'
},
PAYMENT_FAILED:{
target:'paymentFailed'
}
}
},
paymentFailed: {},
shoppingComplete: {
type: "final"
},
}
},
abandonBasket: {
},
},
on: {
// BASKET_UPDATED: {
// target: '#showingProducts.bcgShoppingReady',
// },
ADD_ITEM_TO_BASKET: {
target: ['#shopping.updatingShopping','..updatingShopping.calculatingBill'],
},
REMOVE_ITEM_FROM_BASKET: {
target: ['#shopping.updatingShopping','..updatingShopping.calculatingBill'],
},
CLEAR_BASKET: {
target: '#basket-cleared',
},
GO_TO_CHECKOUT: {
target: ['#shopping.updatingShopping','..updatingShopping.calculatingBill'],
},
},
},
updatingShopping: {
initial: 'waitingForCartChanges',
//type: 'parallel',
states: {
waitingForCartChanges: {
on:{
CART_UPDATED:{
target:"calculatingBill",
}
}
},
calculatingBill: {
initial: 'processingDiscountRules',
states: {
processingDiscountRules: {
after:{
1000:'PROCESS_DISCOUNT_RULES'
},
on:{
PROCESS_DISCOUNT_RULES:'processingDiscountRule',
}
},
processingDiscountRule: {
after:{
1000:'PROCESS_DISCOUNT_RULE'
},
on:{
PROCESS_DISCOUNT_RULE:'checkingBasketItems',
}
},
checkingBasketItems: {
after:{
1000:'PROCESS_DISCOUNT_RULE_FOR_BASKET'
},
on:{
PROCESS_DISCOUNT_RULE_FOR_BASKET:'checkingBasketItem',
}
},
checkingBasketItem: {
after:{
1000:'CHECK_DISCOUNT_RULE_ON_ITEM'
},
on:{
CHECK_DISCOUNT_RULE_ON_ITEM:'skippedDiscountRule',
}
},
skippedDiscountRule: {
after:{
1000:'MARK_DISCOUNT_NOTAPPLY_FOR_ITEM'
},
on:{
MARK_DISCOUNT_NOTAPPLY_FOR_ITEM:'applyDiscountRule',
}
},
applyDiscountRule: {
after:{
1000:'MARK_DISCOUNT_DOESAPPLY_FOR_ITEM'
},
on:{
MARK_DISCOUNT_DOESAPPLY_FOR_ITEM:'calculatingLineItems',
}
},
calculatingLineItems: {
after:{
1000:'CALCULATE_LINE_ITEMS'
},
on:{
CALCULATE_LINE_ITEMS:'calculationsDone',
}
},
calculationsDone: {
after:{
1000:'BILL_IS_READY'
},
on:{
BILL_IS_READY:'done',
}
},
done: {
type: "final"
},
},
onDone: {
target: 'waitingForCartChanges',
},
},
},
onDone: {
actions: assign({
basket: (context, event) => event.data
}),
target: '#UIActive',
},
},
},
},
},
},
// {
// services: BCGServices
// }
);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment