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  }