Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add an example of updating modal #1142

Merged
merged 9 commits into from
Feb 10, 2024
54 changes: 44 additions & 10 deletions examples/modal/modal.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import (
"net/http"

"github.com/slack-go/slack"
"time"
)

func generateModalRequest() slack.ModalViewRequest {
Expand Down Expand Up @@ -60,6 +61,30 @@ func generateModalRequest() slack.ModalViewRequest {
return modalRequest
}

func updateModal() slack.ModalViewRequest {
// Create a ModalViewRequest with a header and two inputs
titleText := slack.NewTextBlockObject("plain_text", "My App", false, false)
closeText := slack.NewTextBlockObject("plain_text", "Close", false, false)
submitText := slack.NewTextBlockObject("plain_text", "Submit", false, false)

headerText := slack.NewTextBlockObject("mrkdwn", "Modal updated!", false, false)
headerSection := slack.NewSectionBlock(headerText, nil, nil)

blocks := slack.Blocks{
BlockSet: []slack.Block{
headerSection,
},
}

var modalRequest slack.ModalViewRequest
modalRequest.Type = slack.ViewType("modal")
modalRequest.Title = titleText
modalRequest.Close = closeText
modalRequest.Submit = submitText
modalRequest.Blocks = blocks
return modalRequest
}

// This was taken from the slash example
// https://github.com/slack-go/slack/blob/master/examples/slash/slash.go
func verifySigningSecret(r *http.Request) error {
Expand Down Expand Up @@ -104,7 +129,7 @@ func handleSlash(w http.ResponseWriter, r *http.Request) {
}

switch s.Command {
case "/humboldttest":
case "/slash":
api := slack.New("YOUR_TOKEN_HERE")
modalRequest := generateModalRequest()
_, err = api.OpenView(s.TriggerID, modalRequest)
Expand Down Expand Up @@ -134,21 +159,30 @@ func handleModal(w http.ResponseWriter, r *http.Request) {
return
}

// Note there might be a better way to get this info, but I figured this structure out from looking at the json response
firstName := i.View.State.Values["First Name"]["firstName"].Value
lastName := i.View.State.Values["Last Name"]["lastName"].Value

msg := fmt.Sprintf("Hello %s %s, nice to meet you!", firstName, lastName)

api := slack.New("YOUR_TOKEN_HERE")
_, _, err = api.PostMessage(i.User.ID,
slack.MsgOptionText(msg, false),
slack.MsgOptionAttachments())
if err != nil {
fmt.Printf(err.Error())
w.WriteHeader(http.StatusUnauthorized)
return
}

// update modal sample
switch i.Type {
//update when interaction type is view_submission
case slack.InteractionTypeViewSubmission:

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I couldn't get api.UpdateView to work under this event. I had to use slack.InteractionTypeBlockActions e.g block_action. Is this working for you?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for the feedback,I would check that.

Copy link
Contributor Author

@KouWakai KouWakai Aug 15, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's working but modal closes right after update.

I think this is caused by slack server.
after update modal,app respond http status 200 to slack server and the server see it as over

I'v been running this code on local and connect via ngrok and this happen

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

by adding time.Sleep(time.Second * 2) after api.UpdateView you can prevent sending http 200 and can see updated modal.

	case slack.InteractionTypeViewSubmission:
		//you can use any modal you want to show to users just like creating modal.
		updateModal := updateModal()
		// You must set one of external_id or view_id and you can use hash for avoiding race condition.
		// More details: https://api.slack.com/surfaces/modals/using#updating_apis
		_, err := api.UpdateView(updateModal, "", i.View.Hash, i.View.ID)
		time.Sleep(time.Second * 2)
		if err != nil {
			fmt.Printf("Error updating view: %s", err)
			w.WriteHeader(http.StatusInternalServerError)
			return
		}

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@kanata2 @charlesoconor
sorry for kept you waiting,could you review this code?

//you can use any modal you want to show to users just like creating modal.
updateModal := updateModal()
// You must set one of external_id or view_id and you can use hash for avoiding race condition.
// More details: https://api.slack.com/surfaces/modals/using#updating_apis
_, err := api.UpdateView(updateModal, "", i.View.Hash, i.View.ID)
// Wait for a few seconds to see result this code is necesarry due to slack server modal is going to be closed after the update
time.Sleep(time.Second * 2)
if err != nil {
fmt.Printf("Error updating view: %s", err)
w.WriteHeader(http.StatusInternalServerError)
return
}
}
}

func main() {
Expand Down