Class: BoltRb::Handlers::ViewSubmissionHandler

Inherits:
Base
  • Object
show all
Defined in:
lib/bolt_rb/handlers/view_submission_handler.rb

Overview

Handler for Slack view submissions (modal form submissions)

This handler provides the view DSL for matching view_submission payloads. View submissions are triggered when users click the submit button on modals opened via views.open or views.push.

Examples:

Basic modal submission handler

class CreateTicketSubmitHandler < BoltRb::ViewSubmissionHandler
  view 'create_ticket_modal'

  def handle
    ack
    # Process the form submission
    ticket_title = values.dig('title_block', 'title_input', 'value')
  end
end

Handler with validation errors

class ValidatedSubmitHandler < BoltRb::ViewSubmissionHandler
  view 'validated_form'

  def handle
    if invalid_input?
      ack(response_action: 'errors', errors: { 'input_block' => 'Invalid input' })
    else
      ack
      process_submission
    end
  end
end

Regex-based view matching

class DynamicFormHandler < BoltRb::ViewSubmissionHandler
  view /^form_step_/

  def handle
    ack
    step = callback_id.gsub('form_step_', '')
    # Handle based on step
  end
end

Instance Attribute Summary

Attributes inherited from Base

#context

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Base

#ack, #call, #channel, #client, #handle, inherited, #initialize, middleware_stack, #payload, #respond, #say, use, #user

Constructor Details

This class inherits a constructor from BoltRb::Handlers::Base

Class Method Details

.matches?(payload) ⇒ Boolean

Determines if this handler matches the given payload

Checks if the payload is a view_submission type and if the callback_id matches the configured pattern.

Parameters:

  • payload (Hash)

    The incoming Slack view_submission payload

Returns:

  • (Boolean)

    true if this handler should process the submission



72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/bolt_rb/handlers/view_submission_handler.rb', line 72

def matches?(payload)
  return false unless matcher_config
  return false unless payload['type'] == 'view_submission'

  view_callback_id = payload.dig('view', 'callback_id')
  return false unless view_callback_id

  if matcher_config[:callback_id].is_a?(Regexp)
    matcher_config[:callback_id].match?(view_callback_id)
  else
    view_callback_id == matcher_config[:callback_id]
  end
end

.view(callback_id) ⇒ void

This method returns an undefined value.

Configures which callback_id this handler responds to

Examples:

Match exact callback_id

view 'create_ticket_modal'

Match callback_id pattern

view /^create_/

Parameters:

  • callback_id (String, Regexp)

    The callback_id to match (exact string or regex)



58
59
60
61
62
63
# File 'lib/bolt_rb/handlers/view_submission_handler.rb', line 58

def view(callback_id)
  @matcher_config = {
    type: :view_submission,
    callback_id: callback_id
  }
end

Instance Method Details

#callback_idString?

Returns the callback_id from the view

Returns:

  • (String, nil)

    The callback_id



97
98
99
# File 'lib/bolt_rb/handlers/view_submission_handler.rb', line 97

def callback_id
  view&.dig('callback_id')
end

#private_metadataString?

Returns the private_metadata from the view

Private metadata is a string field you can use to pass data between the view open and submission events. Often used to store IDs.

Returns:

  • (String, nil)

    The private_metadata value



107
108
109
# File 'lib/bolt_rb/handlers/view_submission_handler.rb', line 107

def 
  view&.dig('private_metadata')
end

#response_urlsArray<Hash>

Returns the response URLs for block-based responses

Only present if the modal was opened from a message interaction.

Returns:

  • (Array<Hash>)

    Array of response_url objects



142
143
144
# File 'lib/bolt_rb/handlers/view_submission_handler.rb', line 142

def response_urls
  payload['response_urls'] || []
end

#user_idString?

Returns the user ID from the payload

Returns:

  • (String, nil)

    The user ID who submitted the form



133
134
135
# File 'lib/bolt_rb/handlers/view_submission_handler.rb', line 133

def user_id
  payload.dig('user', 'id')
end

#valuesHash

Returns the state values from the submitted form

The values hash is keyed by block_id, then action_id, then contains the input value (format depends on input type).

Examples:

Structure

{
  'title_block' => {
    'title_input' => { 'type' => 'plain_text_input', 'value' => 'My Title' }
  },
  'select_block' => {
    'select_input' => { 'type' => 'static_select', 'selected_option' => { 'value' => 'opt1' } }
  }
}

Returns:

  • (Hash)

    The form values hash



126
127
128
# File 'lib/bolt_rb/handlers/view_submission_handler.rb', line 126

def values
  view&.dig('state', 'values') || {}
end

#viewHash?

Returns the view object from the payload

Returns:

  • (Hash, nil)

    The view object containing callback_id, private_metadata, state, etc.



90
91
92
# File 'lib/bolt_rb/handlers/view_submission_handler.rb', line 90

def view
  payload['view']
end

#view_hashString?

Returns the hash value of the submitted view

Used for optimistic locking when updating views.

Returns:

  • (String, nil)

    The view hash



151
152
153
# File 'lib/bolt_rb/handlers/view_submission_handler.rb', line 151

def view_hash
  view&.dig('hash')
end