github.com/EngineerKamesh/gofullstack@v0.0.0-20180609171605-d41341d7d4ee/volume3/section5/gopherface/client/handlers/friends.go (about) 1 package handlers 2 3 import ( 4 "context" 5 "encoding/json" 6 "strconv" 7 8 "honnef.co/go/js/dom" 9 "honnef.co/go/js/xhr" 10 11 "github.com/EngineerKamesh/gofullstack/volume3/section5/gopherface/client/common" 12 "github.com/EngineerKamesh/gofullstack/volume3/section5/gopherface/models" 13 "github.com/gopherjs/gopherjs/js" 14 15 "go.isomorphicgo.org/go/isokit" 16 ) 17 18 const ENTERKEY int = 13 19 20 func FriendsHandler(env *common.Env) isokit.Handler { 21 return isokit.HandlerFunc(func(ctx context.Context) { 22 println("Client-side Friends Handler") 23 m := make(map[string]string) 24 m["PageTitle"] = "Friends" 25 env.TemplateSet.Render("friends_content", &isokit.RenderParams{Data: m, Disposition: isokit.PlacementReplaceInnerContents, Element: env.PrimaryContent}) 26 InitializeFriendsEventHandlers(env) 27 }) 28 29 } 30 31 func InitializeFriendsEventHandlers(env *common.Env) { 32 33 friendSearchButton := env.Document.GetElementByID("friendSearchButton").(*dom.HTMLButtonElement) 34 friendSearchButton.AddEventListener("click", false, func(event dom.Event) { 35 go FriendSearchRequest(env, event, true) 36 }) 37 38 friendSearchInput := env.Document.GetElementByID("friendSearchInput").(*dom.HTMLInputElement) 39 friendSearchInput.AddEventListener("keypress", false, func(event dom.Event) { 40 if event.Underlying().Get("keyCode").Int() == ENTERKEY { 41 event.PreventDefault() 42 go FriendSearchRequest(env, event, true) 43 } 44 }) 45 46 } 47 48 func FriendSearchRequest(env *common.Env, event dom.Event, showAlerts bool) { 49 50 friendSearchInput := env.Document.GetElementByID("friendSearchInput").(*dom.HTMLInputElement) 51 searchTerm := friendSearchInput.Value 52 53 if searchTerm == "" { 54 return 55 } 56 57 textBytes, err := json.Marshal(searchTerm) 58 if err != nil { 59 println("Encountered error while attempting to marshal JSON: ", err) 60 println(err) 61 } 62 63 data, err := xhr.Send("POST", "/restapi/find-gophers", textBytes) 64 if err != nil { 65 println("Encountered error while attempting to submit POST request via XHR: ", err) 66 println(err) 67 } 68 69 var gophers []models.Gopher 70 json.Unmarshal(data, &gophers) 71 72 if showAlerts == true { 73 if len(gophers) > 0 { 74 js.Global.Get("alertify").Call("success", "Found "+strconv.Itoa(len(gophers))+" gopher(s)!") 75 } else { 76 js.Global.Get("alertify").Call("error", "No gophers found.") 77 } 78 } 79 80 searchResultsContainer := env.Document.GetElementByID("searchResultsContainer").(*dom.HTMLDivElement) 81 env.TemplateSet.Render("partials/friend_search_results", &isokit.RenderParams{Data: gophers, Disposition: isokit.PlacementReplaceInnerContents, Element: searchResultsContainer}) 82 83 followButtons := searchResultsContainer.QuerySelectorAll(".followButton") 84 for i := 0; i < len(followButtons); i++ { 85 followButtons[i].AddEventListener("click", false, func(event dom.Event) { 86 go FollowGopherRequest(env, event) 87 }) 88 } 89 90 } 91 92 func FollowGopherRequest(env *common.Env, event dom.Event) { 93 button := event.Target() 94 button.SetAttribute("disabled", "") 95 uuid := button.GetAttribute("data-uuid") 96 textBytes, err := json.Marshal(uuid) 97 98 if err != nil { 99 println("Encountered error while attempting to marshal JSON: ", err) 100 println(err) 101 } 102 103 data, err := xhr.Send("POST", "/restapi/follow-gopher", textBytes) 104 if err != nil { 105 println("Encountered error while attempting to submit POST request via XHR: ", err) 106 println(err) 107 } 108 109 var resultErr error 110 json.Unmarshal(data, &resultErr) 111 112 if resultErr == nil { 113 js.Global.Get("alertify").Call("success", "Followed successfully!") 114 115 } else { 116 js.Global.Get("alertify").Call("error", "Follow operation failed.") 117 } 118 119 }