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 +4 -4
- data/README.md +20 -0
- data/lib/bolt_rb/handlers/view_closed_handler.rb +128 -0
- data/lib/bolt_rb/middleware/logging.rb +6 -0
- data/lib/bolt_rb/version.rb +1 -1
- data/lib/bolt_rb.rb +1 -0
- metadata +3 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 9a65a4b02cee36004cad5c01b6dc37c1dc3eb42cfda3b9b81af3ddabc21a9f07
|
|
4
|
+
data.tar.gz: d1feff607f8b44eba86e970abc01afd5d3c99ca8af4b41d3da04e74f595d9610
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
data/lib/bolt_rb/version.rb
CHANGED
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.
|
|
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-
|
|
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
|