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  }