github.com/EngineerKamesh/gofullstack@v0.0.0-20180609171605-d41341d7d4ee/volume3/section5/gopherface/client/handlers/feed.go (about) 1 package handlers 2 3 import ( 4 "context" 5 "encoding/json" 6 "strconv" 7 "strings" 8 "time" 9 10 "github.com/EngineerKamesh/gofullstack/volume3/section5/gopherface/models/socialmedia" 11 12 "honnef.co/go/js/dom" 13 "honnef.co/go/js/xhr" 14 15 "github.com/EngineerKamesh/gofullstack/volume3/section5/gopherface/client/common" 16 "github.com/EngineerKamesh/gofullstack/volume3/section5/gopherface/forms" 17 "github.com/gopherjs/gopherjs/js" 18 19 "go.isomorphicgo.org/go/isokit" 20 ) 21 22 var postForm *forms.SocialMediaPostForm 23 24 func FeedHandler(env *common.Env) isokit.Handler { 25 return isokit.HandlerFunc(func(ctx context.Context) { 26 println("Client-side Feed Handler") 27 postForm = forms.NewSocialMediaPostForm(nil) 28 postForm.PageTitle = "Feed" 29 env.TemplateSet.Render("feed_content", &isokit.RenderParams{Data: postForm, Disposition: isokit.PlacementReplaceInnerContents, Element: env.PrimaryContent}) 30 31 InitializeFeedEventHandlers(env) 32 }) 33 } 34 35 func InitializeFeedEventHandlers(env *common.Env) { 36 37 if postForm == nil { 38 postForm = forms.NewSocialMediaPostForm(nil) 39 } 40 41 postButton := env.Document.GetElementByID("postButton").(*dom.HTMLButtonElement) 42 postButton.AddEventListener("click", false, func(event dom.Event) { 43 VerifyPostForm(env, event, postForm) 44 }) 45 46 go PopulateFeedPosts(env) 47 48 } 49 50 func VerifyPostForm(env *common.Env, event dom.Event, postForm *forms.SocialMediaPostForm) { 51 event.PreventDefault() 52 53 formElement := env.Document.GetElementByID("smpostform").(*dom.HTMLFormElement) 54 postForm.SetFormParams(&isokit.FormParams{FormElement: formElement}) 55 validationResult := postForm.Validate() 56 if validationResult == true { 57 58 caption := env.Document.GetElementByID("caption").(*dom.HTMLInputElement).Value 59 messageBody := env.Document.GetElementByID("messageBody").(*dom.HTMLTextAreaElement).Value 60 mood := env.Document.GetElementByID("mood").(*dom.HTMLSelectElement).Value 61 62 p := socialmedia.Post{} 63 p.Caption = caption 64 p.MessageBody = messageBody 65 moodValue, err := strconv.Atoi(mood) 66 if err != nil { 67 println(err) 68 moodValue = 0 69 } 70 p.RawMoodValue = moodValue 71 go SavePostRequest(env, p) 72 formElement.Underlying().Call("reset") 73 } else { 74 postForm.DisplayErrors() 75 } 76 77 } 78 79 func SavePostRequest(env *common.Env, p socialmedia.Post) { 80 81 postBytes, err := json.Marshal(p) 82 if err != nil { 83 println(err) 84 } 85 data, err := xhr.Send("POST", "/restapi/save-post", postBytes) 86 if err != nil { 87 println(err) 88 } 89 90 if strings.Contains(string(data), "ERROR:") { 91 92 js.Global.Get("alertify").Call("error", string(data)) 93 94 } else { 95 96 js.Global.Get("alertify").Call("success", "Post saved successfully!") 97 PopulateFeedPosts(env) 98 } 99 100 } 101 102 func PopulateFeedPosts(env *common.Env) { 103 104 data, err := xhr.Send("POST", "/restapi/fetch-posts", nil) 105 if err != nil { 106 println("Encountered error while attempting to submit POST request via XHR: ", err) 107 println(err) 108 } 109 110 var posts []socialmedia.Post 111 json.Unmarshal(data, &posts) 112 113 for i := 0; i < len(posts); i++ { 114 moodValue := posts[i].RawMoodValue 115 posts[i].AuthorMoodEmoji = socialmedia.MoodsEmoji[socialmedia.MoodState(moodValue)] 116 posts[i].TimeCreated = time.Unix(int64(posts[i].TimeCreatedUnixTS), 0) 117 } 118 119 postsContainer := env.Document.GetElementByID("postsContainer").(*dom.HTMLDivElement) 120 env.TemplateSet.Render("partials/feed_posts", &isokit.RenderParams{Data: posts, Disposition: isokit.PlacementReplaceInnerContents, Element: postsContainer}) 121 122 }