This is great
I canāt wait to see the final result @vscopise
Do you have a handler for the individual products? Something like this:
const homeHandler = {
name: 'producto',
priority: 10,
pattern: '/producto/:slug',
func: async ({ route, params, state, libraries }) => {
// 1. get products data
const response = await libraries.source.api.get({
endpoint: '/wc/v3/products',
params: { slug: params.slug }
});
// 2. add product to state
const [product] = await libraries.source.populate({ state, response });
// 3. add route to data
Object.assign(state.source.data[route], {
id: product.id,
isProduct: true
});
}
}
Then access the data using:
const data = state.source.get(state.router.link);
const product = state.source.product[data.id];
Just curious. Weāve never worked with the woocommerce API
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
});
}
}
Nice!
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
Looks great so far. Thanks for sharing
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 !
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
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.
Hey @403page!
The payment works ok, I did not try many payment gateways, but the order is generated and confirmation emails are sent !
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
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