/
shoppingcart.go
103 lines (83 loc) · 2.94 KB
/
shoppingcart.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
package handlers
import (
"context"
"encoding/json"
"strings"
"github.com/EngineerKamesh/igb/igweb/client/common"
"github.com/EngineerKamesh/igb/igweb/shared/cogs/notify"
"github.com/EngineerKamesh/igb/igweb/shared/models"
"github.com/EngineerKamesh/igb/igweb/shared/templatedata"
"go.isomorphicgo.org/go/isokit"
"honnef.co/go/js/dom"
"honnef.co/go/js/xhr"
)
func ShoppingCartHandler(env *common.Env) isokit.Handler {
return isokit.HandlerFunc(func(ctx context.Context) {
renderShoppingCartItems(env)
})
}
func renderShoppingCartItems(env *common.Env) {
productsChannel := make(chan []*models.Product)
go fetchProductsInShoppingCart(productsChannel)
products := <-productsChannel
templateData := &templatedata.ShoppingCart{PageTitle: "Shopping Cart", Products: products}
env.TemplateSet.Render("shopping_cart_content", &isokit.RenderParams{Data: templateData, Disposition: isokit.PlacementReplaceInnerContents, Element: env.PrimaryContent, PageTitle: templateData.PageTitle})
InitializeShoppingCartPage(env)
env.Router.RegisterLinks("#primaryContent a")
}
func fetchProductsInShoppingCart(productsChannel chan []*models.Product) {
data, err := xhr.Send("GET", "/restapi/get-cart-items", nil)
if err != nil {
println("Encountered error: ", err)
println(err)
}
var products []*models.Product
json.NewDecoder(strings.NewReader(string(data))).Decode(&products)
productsChannel <- products
}
func InitializeShoppingCartPage(env *common.Env) {
buttons := env.Document.GetElementsByClassName("removeFromCartButton")
for _, button := range buttons {
button.AddEventListener("click", false,
func(event dom.Event) {
handleRemoveFromCartButtonClickEvent(env, event)
})
}
}
func addToCart(productSKU string) {
m := make(map[string]string)
m["productSKU"] = productSKU
jsonData, _ := json.Marshal(m)
data, err := xhr.Send("PUT", "/restapi/add-item-to-cart", jsonData)
if err != nil {
println("Encountered error: ", err)
notify.Error("Failed to add item to cart!")
return
}
var products []*models.Product
json.NewDecoder(strings.NewReader(string(data))).Decode(&products)
notify.Success("Item added to cart")
}
func handleAddToCartButtonClickEvent(event dom.Event) {
productSKU := event.Target().GetAttribute("data-sku")
go addToCart(productSKU)
}
func removeFromCart(env *common.Env, productSKU string) {
m := make(map[string]string)
m["productSKU"] = productSKU
jsonData, _ := json.Marshal(m)
data, err := xhr.Send("DELETE", "/restapi/remove-item-from-cart", jsonData)
if err != nil {
println("Encountered error: ", err)
notify.Error("Failed to remove item from cart!")
return
}
var products []*models.Product
json.NewDecoder(strings.NewReader(string(data))).Decode(&products)
renderShoppingCartItems(env)
notify.Success("Item removed from cart")
}
func handleRemoveFromCartButtonClickEvent(env *common.Env, event dom.Event) {
productSKU := event.Target().GetAttribute("data-sku")
go removeFromCart(env, productSKU)
}