bolt_rb 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b9b86799c24b51cbd284c829e2fef0b03c307382763c6a646d89c02490f1adde
4
- data.tar.gz: 1e71eee650ed3a747fa7d4742e77e761f24d0725711862e002164e7ce105a98c
3
+ metadata.gz: 9a65a4b02cee36004cad5c01b6dc37c1dc3eb42cfda3b9b81af3ddabc21a9f07
4
+ data.tar.gz: d1feff607f8b44eba86e970abc01afd5d3c99ca8af4b41d3da04e74f595d9610
5
5
  SHA512:
6
- metadata.gz: f85418b52d38d9d0646050250aa3f997fb516670c7b8841d1fb2d8ef060a63ba762d3019d251dd43e27f894a92551646dcee9fcc5ae3fa123a850cd21cd08e78
7
- data.tar.gz: 51cab8883e2867dc6d3da33507bf8bfc523f8aee6402bb26613a0c230424d22b65eb5c818906a8a22e1b17d049c3dd3c5009cda5c7f88f68c6a2b0850d810f90
6
+ metadata.gz: 6658a8b2c099f921d63731ef7ded41c14739054c626e6e2b0b174fc5d6b58664da6bffae33121bbf951b90320947345c6148991ad62b86d22f75cb7de44f29ae
7
+ data.tar.gz: b7f048fddb725c026b63eff2921d82cd95a7ee906b3346e44bff8ab0479811cac1e9394ed498992e5851ba6c2528e436e6b91e51ac06ab803ece4c9c6bc28ce7
data/README.md CHANGED
@@ -169,6 +169,26 @@ end
169
169
 
170
170
  **Available methods:** `view`, `callback_id`, `private_metadata`, `values`, `view_hash`, `response_urls`, `user_id`, `ack`, `say`, `client`
171
171
 
172
+ ### View Closed
173
+
174
+ Handle modal close/cancel events (requires `notify_on_close: true` when opening the modal):
175
+
176
+ ```ruby
177
+ class TicketCancelHandler < BoltRb::ViewClosedHandler
178
+ view_closed 'create_ticket_modal'
179
+
180
+ def handle
181
+ ack
182
+ # Clean up drafts, cancel in-progress operations, etc.
183
+ unless is_cleared?
184
+ # User manually closed (X or Cancel button)
185
+ end
186
+ end
187
+ end
188
+ ```
189
+
190
+ **Available methods:** `view`, `callback_id`, `private_metadata`, `is_cleared?`, `user_id`, `ack`, `client`
191
+
172
192
  ## Handler Methods
173
193
 
174
194
  All handlers have access to:
@@ -0,0 +1,128 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BoltRb
4
+ module Handlers
5
+ # Handler for Slack view closed events (modal cancellation/dismissal)
6
+ #
7
+ # This handler provides the `view_closed` DSL for matching view_closed payloads.
8
+ # View closed events are triggered when users close a modal by clicking the X
9
+ # button or Cancel, but only when the modal was opened with notify_on_close: true.
10
+ #
11
+ # @example Basic modal close handler
12
+ # class CreateTicketCancelHandler < BoltRb::ViewClosedHandler
13
+ # view_closed 'create_ticket_modal'
14
+ #
15
+ # def handle
16
+ # ack
17
+ # # Clean up any in-progress state
18
+ # end
19
+ # end
20
+ #
21
+ # @example Handler checking if view was cleared programmatically
22
+ # class SettingsCloseHandler < BoltRb::ViewClosedHandler
23
+ # view_closed 'settings_modal'
24
+ #
25
+ # def handle
26
+ # ack
27
+ # unless is_cleared?
28
+ # # User manually closed, maybe prompt to save draft
29
+ # end
30
+ # end
31
+ # end
32
+ #
33
+ # @example Regex-based view matching
34
+ # class WizardCancelHandler < BoltRb::ViewClosedHandler
35
+ # view_closed /^wizard_step_/
36
+ #
37
+ # def handle
38
+ # ack
39
+ # # Clean up wizard state for any step
40
+ # end
41
+ # end
42
+ class ViewClosedHandler < Base
43
+ class << self
44
+ # Configures which callback_id this handler responds to
45
+ #
46
+ # @param callback_id [String, Regexp] The callback_id to match (exact string or regex)
47
+ # @return [void]
48
+ #
49
+ # @example Match exact callback_id
50
+ # view_closed 'create_ticket_modal'
51
+ #
52
+ # @example Match callback_id pattern
53
+ # view_closed /^wizard_/
54
+ def view_closed(callback_id)
55
+ @matcher_config = {
56
+ type: :view_closed,
57
+ callback_id: callback_id
58
+ }
59
+ end
60
+
61
+ # Determines if this handler matches the given payload
62
+ #
63
+ # Checks if the payload is a view_closed type and if the
64
+ # callback_id matches the configured pattern.
65
+ #
66
+ # @param payload [Hash] The incoming Slack view_closed payload
67
+ # @return [Boolean] true if this handler should process the close event
68
+ def matches?(payload)
69
+ return false unless matcher_config
70
+ return false unless payload['type'] == 'view_closed'
71
+
72
+ view_callback_id = payload.dig('view', 'callback_id')
73
+ return false unless view_callback_id
74
+
75
+ if matcher_config[:callback_id].is_a?(Regexp)
76
+ matcher_config[:callback_id].match?(view_callback_id)
77
+ else
78
+ view_callback_id == matcher_config[:callback_id]
79
+ end
80
+ end
81
+ end
82
+
83
+ # Returns the view object from the payload
84
+ #
85
+ # @return [Hash, nil] The view object containing callback_id, private_metadata, etc.
86
+ def view
87
+ payload['view']
88
+ end
89
+
90
+ # Returns the callback_id from the view
91
+ #
92
+ # @return [String, nil] The callback_id
93
+ def callback_id
94
+ view&.dig('callback_id')
95
+ end
96
+
97
+ # Returns the private_metadata from the view
98
+ #
99
+ # Private metadata is a string field you can use to pass data between
100
+ # the view open and close events. Often used to store IDs for cleanup.
101
+ #
102
+ # @return [String, nil] The private_metadata value
103
+ def private_metadata
104
+ view&.dig('private_metadata')
105
+ end
106
+
107
+ # Returns whether the view was cleared programmatically
108
+ #
109
+ # This is true when the view was dismissed via views.update with a
110
+ # clear_on_close response, rather than the user clicking X or Cancel.
111
+ #
112
+ # @return [Boolean] true if the view was cleared programmatically
113
+ def is_cleared?
114
+ payload['is_cleared'] == true
115
+ end
116
+
117
+ # Returns the user ID from the payload
118
+ #
119
+ # @return [String, nil] The user ID who closed the modal
120
+ def user_id
121
+ payload.dig('user', 'id')
122
+ end
123
+ end
124
+ end
125
+
126
+ # Top-level alias for convenience
127
+ ViewClosedHandler = Handlers::ViewClosedHandler
128
+ end
@@ -38,6 +38,8 @@ module BoltRb
38
38
  # - Slash commands: command
39
39
  # - Block actions: type with action_ids
40
40
  # - Shortcuts: type with callback_id
41
+ # - View submissions: view_submission with callback_id
42
+ # - View closed: view_closed with callback_id
41
43
  #
42
44
  # @param payload [Hash] The raw Slack payload
43
45
  # @return [String] A descriptive event type string
@@ -51,6 +53,10 @@ module BoltRb
51
53
  "action:#{action_ids}"
52
54
  elsif payload['type'] == 'shortcut' || payload['type'] == 'message_action'
53
55
  "shortcut:#{payload['callback_id']}"
56
+ elsif payload['type'] == 'view_submission'
57
+ "view_submission:#{payload.dig('view', 'callback_id')}"
58
+ elsif payload['type'] == 'view_closed'
59
+ "view_closed:#{payload.dig('view', 'callback_id')}"
54
60
  else
55
61
  'unknown'
56
62
  end
@@ -1,4 +1,4 @@
1
1
  # lib/bolt_rb/version.rb
2
2
  module BoltRb
3
- VERSION = '0.1.1'
3
+ VERSION = '0.2.0'
4
4
  end
data/lib/bolt_rb.rb CHANGED
@@ -71,6 +71,7 @@ require_relative 'bolt_rb/handlers/command_handler'
71
71
  require_relative 'bolt_rb/handlers/action_handler'
72
72
  require_relative 'bolt_rb/handlers/shortcut_handler'
73
73
  require_relative 'bolt_rb/handlers/view_submission_handler'
74
+ require_relative 'bolt_rb/handlers/view_closed_handler'
74
75
  require_relative 'bolt_rb/socket_mode/client'
75
76
  require_relative 'bolt_rb/testing'
76
77
  require_relative 'bolt_rb/app'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bolt_rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jon Whitcraft
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-01-27 00:00:00.000000000 Z
11
+ date: 2026-01-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: slack-ruby-client
@@ -113,6 +113,7 @@ files:
113
113
  - lib/bolt_rb/handlers/command_handler.rb
114
114
  - lib/bolt_rb/handlers/event_handler.rb
115
115
  - lib/bolt_rb/handlers/shortcut_handler.rb
116
+ - lib/bolt_rb/handlers/view_closed_handler.rb
116
117
  - lib/bolt_rb/handlers/view_submission_handler.rb
117
118
  - lib/bolt_rb/middleware/base.rb
118
119
  - lib/bolt_rb/middleware/chain.rb