slack-go / slack

Slack API in Go, originally by @nlopes; Maintainers needed, contact @parsley42
https://pkg.go.dev/github.com/slack-go/slack
BSD 2-Clause "Simplified" License
4.64k stars 1.13k forks source link

update view is not working #1133

Closed irania30 closed 1 year ago

irania30 commented 1 year ago

in view_submission i want to update view by using this function NewUpdateViewSubmissionResponse, but always get error. how to fix it?

resp := slack.NewUpdateViewSubmissionResponse(modal) respByte, _ = json.Marshal(resp)

w.WriteHeader(http.StatusOK) w.Header.Add("Content-Type", "application/json") w.Write(respByte)

kanata2 commented 1 year ago

Please give reproducible code, slack-go's version, Go's version.

irania30 commented 1 year ago

slack version v0.11.3 go version go1.16.15

func GenerateModalFailed() *slack.ModalViewRequest {
    titleText := slack.NewTextBlockObject("plain_text", "Sonic Bot", false, false)
    closeText := slack.NewTextBlockObject("plain_text", "Close", false, false)

    headerText := slack.NewTextBlockObject("mrkdwn", "Failed to submit your request!", false, false)
    headerSection := slack.NewSectionBlock(headerText, nil, nil)

    contentText := slack.NewTextBlockObject("plain_text", "Please wait a minutes and try again", false, false)
    contentSection := slack.NewSectionBlock(contentText, nil, nil)

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

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

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

    headerText := slack.NewTextBlockObject("mrkdwn", "testing", false, false)
    headerSection := slack.NewSectionBlock(headerText, nil, nil)

    //Show dropdown environment
    envOptions := createOptionBlockObjects("staging", true)
    envText := slack.NewTextBlockObject("plain_text", "Environment", false, false)
    envHint := slack.NewTextBlockObject("plain_text", "Mandatory", false, false)
    envSelectOption := slack.NewOptionsSelectBlockElement(slack.OptTypeStatic, nil, "environment", envOptions...)
    envBlock := slack.NewInputBlock("environment", envText, envHint, envSelectOption)

    userIdText := slack.NewTextBlockObject("plain_text", "User ID", false, false)
    userIdHint := slack.NewTextBlockObject("plain_text", "Mandatory. Only input 1 user id", false, false)
    userIdPlaceholder := slack.NewTextBlockObject("plain_text", "Input User ID", false, false)
    userIdElement := slack.NewPlainTextInputBlockElement(userIdPlaceholder, "userIdValue")
    userId := slack.NewInputBlock("User ID", userIdText, userIdHint, userIdElement)

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

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

func getAll(w http.ResponseWriter, r *http.Request) {
    //Parse Response (callback from user interaction)
    var intcb slack.InteractionCallback
    err := json.Unmarshal([]byte(r.FormValue("payload")), &intcb)
    if err != nil {
        log.Println(err)

    if intcb.Type == slack.InteractionTypeBlockActions {
        modalRequest = FirstModal()
        _, err := SlackClient.OpenView(intcb.TriggerID, modalRequest)
        if err != nil {
            log.Println(err)
        }
    }
    if intcb.Type == slack.InteractionTypeViewSubmission {
        modal := GenerateModalFailed()
        resp := slack.NewUpdateViewSubmissionResponse(modal)
        respByte, _ := json.Marshal(resp)

        w.WriteHeader(http.StatusOK)
        w.Header().Add("Content-Type", "application/json")
        w.Write(respByte)
    }
}
KouWakai commented 1 year ago

Is there any chance to use UpdateView instead? When I want to update an existing view it worked fine for me.

irania30 commented 1 year ago

i have tried that function, but it only works in block_action type

but i'll try again, anyway what version do you use @KouWakai ?

KouWakai commented 1 year ago

mines are: github.com/slack-go/slack v0.11.4 go version go1.19.3

KouWakai commented 1 year ago

@irania30 According to https://pkg.go.dev/net/http#ResponseWriter We need to set any HTTP Trailers before writing.

With this order,it worked as expected.

w.Header().Add("Content-Type", "application/json")
w.WriteHeader(http.StatusOK)
w.Write(respByte)

version: github.com/slack-go/slack v0.11.3 go version go1.19.3

irania30 commented 1 year ago

ok, i'll try again

irania30 commented 1 year ago

nice, it works now, thank you @KouWakai

github-actions[bot] commented 1 year ago

This issue is stale because it has been open 45 days with no activity. Remove stale label or comment or this will be closed in 10 days.

kanata2 commented 1 year ago

It seems that this is already resolved.