Here is the handler to get a product
const productHandler = {
name: 'product',
priority: 10,
pattern: '/product/:slug',
func: async ({ route, params, state, libraries }) => {
// 1. get product data
const response = await libraries.source.api.get({
endpoint: '/wc/v3/products',
params: { slug: params.slug}
});
// 2. add product to state
const productData = await response.json();
// 3. add route to data
Object.assign(state.source.data[route], {
productData,
isProduct: true
});
}
}
1 Like
I would like to share the code done so far to see your opinions
https://github.com/vscopise/frontity-wc
I would also like to ask you if you recommend Bootstrap, Material-UI or if you prefer another UI-framework to Frontity
Our recommended framework is Chakra UI because it works seamlessly with Emotion
Looks great so far. Thanks for sharing
1 Like
I can save and get the cart from the localstorage:
const addToCart = ({ state, actions }) => ({ productId, quantity }) => {
state.theme.cart.push({ productId, quantity });
localStorage.setItem(
'frontity_wc_cart',
JSON.stringify(state.theme.cart)
);
actions.theme.calculateCartTotal();
}
...
actions: {
theme: {
afterCSR: ({ state, actions, libraries }) => {
const cachedCart = window.localStorage.getItem('frontity_wc_cart');
if (cachedCart && cachedCart.length !== 0) {
state.theme.cart = JSON.parse(cachedCart);
state.theme.cart.map(cartItem => {
//here I need to read the details of the products of the cart
//and save them in the state
});
}
}
}
How can I get the details of the products stored in the cart?
As far as I can tell you should do it in the same way as desribed by @luisherranz in How do I add woocommerce endpoint to the state?
Does it not work? What approaches have you tried? Do you have an errors that occur with your solution?
@luisherranz describes a handler to load a product, which is not necessary now, since I handle products like Custom Post Types.
Now I need to load the products from the shopping cart (which I charge from localStorage) at the start of the app, I have the product id(s) from the localStorage
Thks!
Using localStorage now I be able to get the saved cart, in my connected component:
const HeaderCart = ({ state, actions }) => {
...
if (state.frontity.platform === 'client') {
if ( 0 === state.theme.cart.length ) {
const storedCart = localStorage.getItem(
'frontity_wc_cart'
);
if (storedCart && storedCart.length !== 0) {
state.theme.cart = JSON.parse(storedCart);
state.theme.cart.map(cartItem => {
// here i need to fetch each product from the api...
})
};
}
}
Do I need a handler to get each product?
the solution was a handler to read the necessary products:
const HeaderCart = ({ state, actions }) => {
...
useEffect(() => {
if (state.frontity.platform === 'client') {
if (0 === state.theme.cart.length) {
const storedCart = localStorage.getItem(
'frontity_wc_cart'
);
if (storedCart && storedCart.length !== 0) {
state.theme.cart = JSON.parse(storedCart);
state.theme.cart.map(cartItem => {
actions.source.fetch(
`/product/${cartItem.productId}`,
);
})
};
}
}
}, []);
and the handler:
export const productHandler = {
name: 'product',
priority: 10,
pattern: '/product/:slug',
func: async ({ route, params, state, libraries }) => {
// 1. get product
const response = await libraries.source.api.get({
endpoint: `product/${params.slug}`,
});
// 2. add product to state
const [product] = await libraries.source.populate({ response, state });
// 3. add route to data
Object.assign(state.source.data[route], { product });
}
}
It is important to consider when the product is loaded in the state to be able to display it in the component
Thanks everybody !
1 Like
Great work @vscopise!!
Out of curiousity: why did you end up using useEffect
instead of afterCSR
to do the fetches?
Good point @luisherranz,
now the handler is in afterCSR.
Until now you can see my progress in
https://frontity-wc.now.sh/
https://github.com/vscopise/frontity-wc
1 Like
Hey @vscopise! This method is awesome. I only just got around to trying it out. Did you ever get around to figuring out the payment handling and sending the order back to wordpress for processing? Working on it now, just curious if you already found a decent method.
1 Like
Hey @403page!
The payment works ok, I did not try many payment gateways, but the order is generated and confirmation emails are sent !
2 Likes
Nice!
Iām just working on the create order bit. On submitting it Iām getting {ācodeā:ārest_no_routeā,āmessageā:āNo route was found matching the URL and request methodā,ādataā:{āstatusā:404}} for /wp-json/wp/v2/create-order. Iāve put your PXE Extends WC Api Rest plugin on the Wordpress side - but I guess I still need to write that specific endpoint in.
Hey @403page !
Iāve update de WC Plugin in https://github.com/vscopise/pxe-wc-api-rest to include de create-order endpoint
Let me see if itās ok for you
1 Like
Hey @vscopise! I was just taking a look at the https://frontity-wc.now.sh/ project and it looks really promising! Have you launched it yet it or was it just a proof of concept?
Would love to hear what problems you came across (if any) and how you managed to solve them
Hi, @mmczaplinski
Until now, its a proof of concept, and I am taking advantage to learn React and Frontity.
I think Woocommerce is an excellent opportunity to apply the framework.
Soon I will include news, such as variable products and different payment gateways
I just updated the code on my local. Absolutely AWESOME. Orders work perfectly! I just want to add Stripe to my test frontity build to actually grab the payment before sending the order to wordpress and itās ready for a basic live woocommerce store.
This use case is genuinely exciting. Woocommerce is a monster for CPU with all its admin ajax, cart refresh fragments, uncached logged in user sessions, etc.
Offloading that intensive part of the store to Frontity would save someone thousands, even tens of thousands in hardware costs at scale.
Really incredible work @vscopise!
3 Likes