rcs 2.0.16 → 2.0.18

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.
Files changed (110) hide show
  1. checksums.yaml +4 -4
  2. data/.fern/metadata.json +6 -5
  3. data/.rubocop.yml +5 -15
  4. data/lib/pinnacle/brands/client.rb +3 -3
  5. data/lib/pinnacle/campaigns/dlc/client.rb +2 -2
  6. data/lib/pinnacle/campaigns/rcs/client.rb +2 -2
  7. data/lib/pinnacle/campaigns/toll_free/client.rb +2 -2
  8. data/lib/pinnacle/client.rb +6 -1
  9. data/lib/pinnacle/conversations/client.rb +1 -1
  10. data/lib/pinnacle/forms/client.rb +217 -0
  11. data/lib/pinnacle/forms/submissions/client.rb +56 -0
  12. data/lib/pinnacle/forms/submissions/types/list_form_submissions_params.rb +15 -0
  13. data/lib/pinnacle/forms/types/forms_send_response.rb +14 -0
  14. data/lib/pinnacle/forms/types/list_forms_params.rb +12 -0
  15. data/lib/pinnacle/forms/types/update_form_params.rb +18 -0
  16. data/lib/pinnacle/internal/http/base_request.rb +14 -0
  17. data/lib/pinnacle/internal/http/raw_client.rb +21 -3
  18. data/lib/pinnacle/internal/json/request.rb +6 -4
  19. data/lib/pinnacle/internal/multipart/multipart_request.rb +6 -4
  20. data/lib/pinnacle/internal/types/boolean.rb +1 -1
  21. data/lib/pinnacle/internal/types/union.rb +1 -1
  22. data/lib/pinnacle/internal/types/utils.rb +2 -2
  23. data/lib/pinnacle/messages/client.rb +1 -1
  24. data/lib/pinnacle/messages/schedule/client.rb +1 -1
  25. data/lib/pinnacle/rcs/client.rb +1 -1
  26. data/lib/pinnacle/rcs/test/client.rb +3 -3
  27. data/lib/pinnacle/status/get/client.rb +5 -5
  28. data/lib/pinnacle/tools/url/client.rb +2 -2
  29. data/lib/pinnacle/types/address_field.rb +14 -0
  30. data/lib/pinnacle/types/agent_summary_carrier_launches.rb +7 -1
  31. data/lib/pinnacle/types/campaign_status_event.rb +21 -0
  32. data/lib/pinnacle/types/campaign_status_event_agent.rb +11 -0
  33. data/lib/pinnacle/types/campaign_status_event_brand.rb +11 -0
  34. data/lib/pinnacle/types/campaign_status_event_campaign.rb +11 -0
  35. data/lib/pinnacle/types/campaign_status_event_campaign_type.rb +13 -0
  36. data/lib/pinnacle/types/campaign_status_event_carrier_launches.rb +13 -0
  37. data/lib/pinnacle/types/campaign_status_event_carrier_launches_carriers.rb +16 -0
  38. data/lib/pinnacle/types/campaign_status_event_carrier_launches_verification.rb +15 -0
  39. data/lib/pinnacle/types/carrier_launches.rb +5 -5
  40. data/lib/pinnacle/types/carrier_launches_carriers.rb +16 -0
  41. data/lib/pinnacle/types/carrier_launches_verification.rb +15 -0
  42. data/lib/pinnacle/types/checkbox_field.rb +13 -0
  43. data/lib/pinnacle/types/color_field.rb +8 -0
  44. data/lib/pinnacle/types/create_form_request.rb +23 -0
  45. data/lib/pinnacle/types/date_field.rb +12 -0
  46. data/lib/pinnacle/types/datetime_field.rb +12 -0
  47. data/lib/pinnacle/types/email_field.rb +10 -0
  48. data/lib/pinnacle/types/field_base.rb +14 -0
  49. data/lib/pinnacle/types/form.rb +22 -0
  50. data/lib/pinnacle/types/form_background.rb +17 -0
  51. data/lib/pinnacle/types/form_background_gradient.rb +12 -0
  52. data/lib/pinnacle/types/form_background_image.rb +13 -0
  53. data/lib/pinnacle/types/form_background_pattern.rb +10 -0
  54. data/lib/pinnacle/types/form_background_pattern_preset.rb +16 -0
  55. data/lib/pinnacle/types/form_background_solid.rb +34 -0
  56. data/lib/pinnacle/types/form_color_palette.rb +12 -0
  57. data/lib/pinnacle/types/form_definition.rb +15 -0
  58. data/lib/pinnacle/types/form_field.rb +29 -0
  59. data/lib/pinnacle/types/form_field_option.rb +11 -0
  60. data/lib/pinnacle/types/form_gradient.rb +12 -0
  61. data/lib/pinnacle/types/form_gradient_angle.rb +12 -0
  62. data/lib/pinnacle/types/form_id_reference.rb +23 -0
  63. data/lib/pinnacle/types/form_submission.rb +19 -0
  64. data/lib/pinnacle/types/form_submission_answer.rb +20 -0
  65. data/lib/pinnacle/types/form_submission_event.rb +15 -0
  66. data/lib/pinnacle/types/form_submission_event_conversation.rb +20 -0
  67. data/lib/pinnacle/types/form_submission_event_form.rb +12 -0
  68. data/lib/pinnacle/types/form_submission_event_submission.rb +17 -0
  69. data/lib/pinnacle/types/form_submitted_field.rb +13 -0
  70. data/lib/pinnacle/types/form_theme_override.rb +25 -0
  71. data/lib/pinnacle/types/form_theme_override_colors.rb +12 -0
  72. data/lib/pinnacle/types/form_theme_override_content_alignment.rb +13 -0
  73. data/lib/pinnacle/types/form_theme_override_corner_radius.rb +13 -0
  74. data/lib/pinnacle/types/form_theme_override_font_family.rb +15 -0
  75. data/lib/pinnacle/types/form_theme_override_theme_mode.rb +13 -0
  76. data/lib/pinnacle/types/list_form_submissions_response.rb +12 -0
  77. data/lib/pinnacle/types/list_forms_response.rb +12 -0
  78. data/lib/pinnacle/types/message_event.rb +1 -1
  79. data/lib/pinnacle/types/message_event_type.rb +12 -0
  80. data/lib/pinnacle/types/number_field.rb +13 -0
  81. data/lib/pinnacle/types/phone_field.rb +11 -0
  82. data/lib/pinnacle/types/radio_field.rb +10 -0
  83. data/lib/pinnacle/types/range_field.rb +12 -0
  84. data/lib/pinnacle/types/rating_field.rb +11 -0
  85. data/lib/pinnacle/types/scheduled_form_send_response_form.rb +10 -0
  86. data/lib/pinnacle/types/scheduled_form_send_response_submission.rb +10 -0
  87. data/lib/pinnacle/types/scheduled_form_send_result.rb +13 -0
  88. data/lib/pinnacle/types/select_field.rb +11 -0
  89. data/lib/pinnacle/types/send_form_options.rb +11 -0
  90. data/lib/pinnacle/types/send_form_options_webview_mode.rb +13 -0
  91. data/lib/pinnacle/types/send_form_params.rb +20 -0
  92. data/lib/pinnacle/types/send_form_result.rb +17 -0
  93. data/lib/pinnacle/types/send_form_via_rcs_params.rb +14 -0
  94. data/lib/pinnacle/types/send_form_via_rcs_request_fallback.rb +10 -0
  95. data/lib/pinnacle/types/send_form_via_rcs_request_form.rb +13 -0
  96. data/lib/pinnacle/types/send_form_via_sms_params.rb +13 -0
  97. data/lib/pinnacle/types/send_form_via_sms_request_form.rb +12 -0
  98. data/lib/pinnacle/types/text_field.rb +13 -0
  99. data/lib/pinnacle/types/textarea_field.rb +13 -0
  100. data/lib/pinnacle/types/time_field.rb +12 -0
  101. data/lib/pinnacle/types/url_field.rb +10 -0
  102. data/lib/pinnacle/types/user_event_conversation.rb +1 -1
  103. data/lib/pinnacle/types/verification_status.rb +13 -0
  104. data/lib/pinnacle/types/webhook_event_enum.rb +2 -0
  105. data/lib/pinnacle/version.rb +1 -1
  106. data/lib/pinnacle/wrapper/messages/client.rb +11 -2
  107. data/lib/pinnacle.rb +79 -2
  108. data/lib/rcs.rb +206 -15
  109. data/reference.md +807 -300
  110. metadata +79 -2
@@ -81,10 +81,10 @@ module Pinnacle
81
81
  }
82
82
  return type.coerce(value, strict: strict)
83
83
  else
84
- value
84
+ value # rubocop:disable Lint/Void
85
85
  end
86
86
  else
87
- value
87
+ value # rubocop:disable Lint/Void
88
88
  end
89
89
 
90
90
  raise Errors::TypeError, "cannot coerce value of type `#{value.class}` to `#{target}`" if strict
@@ -27,7 +27,7 @@ module Pinnacle
27
27
  request = Pinnacle::Internal::JSON::Request.new(
28
28
  base_url: request_options[:base_url],
29
29
  method: "GET",
30
- path: "messages/#{params[:id]}",
30
+ path: "messages/#{URI.encode_uri_component(params[:id].to_s)}",
31
31
  request_options: request_options
32
32
  )
33
33
  begin
@@ -31,7 +31,7 @@ module Pinnacle
31
31
  request = Pinnacle::Internal::JSON::Request.new(
32
32
  base_url: request_options[:base_url],
33
33
  method: "DELETE",
34
- path: "messages/schedule/#{params[:id]}",
34
+ path: "messages/schedule/#{URI.encode_uri_component(params[:id].to_s)}",
35
35
  request_options: request_options
36
36
  )
37
37
  begin
@@ -30,7 +30,7 @@ module Pinnacle
30
30
  request = Pinnacle::Internal::JSON::Request.new(
31
31
  base_url: request_options[:base_url],
32
32
  method: "GET",
33
- path: "rcs/#{params[:agent_id]}",
33
+ path: "rcs/#{URI.encode_uri_component(params[:agent_id].to_s)}",
34
34
  request_options: request_options
35
35
  )
36
36
  begin
@@ -115,7 +115,7 @@ module Pinnacle
115
115
  request = Pinnacle::Internal::JSON::Request.new(
116
116
  base_url: request_options[:base_url],
117
117
  method: "PATCH",
118
- path: "rcs/test/agents/#{params[:agent_id]}",
118
+ path: "rcs/test/agents/#{URI.encode_uri_component(params[:agent_id].to_s)}",
119
119
  body: body,
120
120
  request_options: request_options
121
121
  )
@@ -186,7 +186,7 @@ module Pinnacle
186
186
  request = Pinnacle::Internal::JSON::Request.new(
187
187
  base_url: request_options[:base_url],
188
188
  method: "POST",
189
- path: "rcs/test/agents/#{params[:agent_id]}/whitelist",
189
+ path: "rcs/test/agents/#{URI.encode_uri_component(params[:agent_id].to_s)}/whitelist",
190
190
  body: body,
191
191
  request_options: request_options
192
192
  )
@@ -252,7 +252,7 @@ module Pinnacle
252
252
  request = Pinnacle::Internal::JSON::Request.new(
253
253
  base_url: request_options[:base_url],
254
254
  method: "GET",
255
- path: "rcs/test/agents/#{params[:agent_id]}/numbers",
255
+ path: "rcs/test/agents/#{URI.encode_uri_component(params[:agent_id].to_s)}/numbers",
256
256
  query: query_params,
257
257
  request_options: request_options
258
258
  )
@@ -28,7 +28,7 @@ module Pinnacle
28
28
  request = Pinnacle::Internal::JSON::Request.new(
29
29
  base_url: request_options[:base_url],
30
30
  method: "GET",
31
- path: "status/brand/#{params[:brand_id]}",
31
+ path: "status/brand/#{URI.encode_uri_component(params[:brand_id].to_s)}",
32
32
  request_options: request_options
33
33
  )
34
34
  begin
@@ -62,7 +62,7 @@ module Pinnacle
62
62
  request = Pinnacle::Internal::JSON::Request.new(
63
63
  base_url: request_options[:base_url],
64
64
  method: "GET",
65
- path: "status/toll-free-campaign/#{params[:campaign_id]}",
65
+ path: "status/toll-free-campaign/#{URI.encode_uri_component(params[:campaign_id].to_s)}",
66
66
  request_options: request_options
67
67
  )
68
68
  begin
@@ -96,7 +96,7 @@ module Pinnacle
96
96
  request = Pinnacle::Internal::JSON::Request.new(
97
97
  base_url: request_options[:base_url],
98
98
  method: "GET",
99
- path: "status/dlc-campaign/#{params[:campaign_id]}",
99
+ path: "status/dlc-campaign/#{URI.encode_uri_component(params[:campaign_id].to_s)}",
100
100
  request_options: request_options
101
101
  )
102
102
  begin
@@ -130,7 +130,7 @@ module Pinnacle
130
130
  request = Pinnacle::Internal::JSON::Request.new(
131
131
  base_url: request_options[:base_url],
132
132
  method: "GET",
133
- path: "status/rcs-campaign/#{params[:campaign_id]}",
133
+ path: "status/rcs-campaign/#{URI.encode_uri_component(params[:campaign_id].to_s)}",
134
134
  request_options: request_options
135
135
  )
136
136
  begin
@@ -166,7 +166,7 @@ module Pinnacle
166
166
  request = Pinnacle::Internal::JSON::Request.new(
167
167
  base_url: request_options[:base_url],
168
168
  method: "GET",
169
- path: "status/phone-number/#{params[:phone_number]}",
169
+ path: "status/phone-number/#{URI.encode_uri_component(params[:phone_number].to_s)}",
170
170
  request_options: request_options
171
171
  )
172
172
  begin
@@ -62,7 +62,7 @@ module Pinnacle
62
62
  request = Pinnacle::Internal::JSON::Request.new(
63
63
  base_url: request_options[:base_url],
64
64
  method: "GET",
65
- path: "tools/url/#{params[:link_id]}",
65
+ path: "tools/url/#{URI.encode_uri_component(params[:link_id].to_s)}",
66
66
  request_options: request_options
67
67
  )
68
68
  begin
@@ -101,7 +101,7 @@ module Pinnacle
101
101
  request = Pinnacle::Internal::JSON::Request.new(
102
102
  base_url: request_options[:base_url],
103
103
  method: "PUT",
104
- path: "tools/url/#{params[:link_id]}",
104
+ path: "tools/url/#{URI.encode_uri_component(params[:link_id].to_s)}",
105
105
  body: body,
106
106
  request_options: request_options
107
107
  )
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pinnacle
4
+ module Types
5
+ # Free-form text input backed by a client-side Google Places autocomplete. Shares text-field validation (length /
6
+ # pattern); the place lookup happens entirely in the browser and is purely for suggestion UX.
7
+ class AddressField < Internal::Types::Model
8
+ field :placeholder, -> { String }, optional: true, nullable: false
9
+ field :pattern, -> { String }, optional: true, nullable: false
10
+ field :min_length, -> { Integer }, optional: true, nullable: false
11
+ field :max_length, -> { Integer }, optional: true, nullable: false
12
+ end
13
+ end
14
+ end
@@ -2,12 +2,18 @@
2
2
 
3
3
  module Pinnacle
4
4
  module Types
5
- # Per-carrier launch status for the agent.
5
+ # Raw per-carrier launch + verification state for the agent. Each
6
+ # value is tri-state — `null` means "no launch requested" or "not
7
+ # sent yet"; `false` means "pending" / "sent"; `true` means
8
+ # "launched" / "verified". Use the [GET /rcs/{agentId}](/api-reference/rcs-agents/get)
9
+ # endpoint for the resolved enum representation.
6
10
  class AgentSummaryCarrierLaunches < Internal::Types::Model
7
11
  field :att, -> { Internal::Types::Boolean }, optional: true, nullable: false, api_name: "ATT"
8
12
  field :others, -> { Internal::Types::Boolean }, optional: true, nullable: false, api_name: "OTHERS"
9
13
  field :tmobile, -> { Internal::Types::Boolean }, optional: true, nullable: false, api_name: "TMOBILE"
10
14
  field :verizon, -> { Internal::Types::Boolean }, optional: true, nullable: false, api_name: "VERIZON"
15
+ field :aegis, -> { Internal::Types::Boolean }, optional: true, nullable: false, api_name: "AEGIS"
16
+ field :google, -> { Internal::Types::Boolean }, optional: true, nullable: false, api_name: "GOOGLE"
11
17
  end
12
18
  end
13
19
  end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pinnacle
4
+ module Types
5
+ # Webhook body delivered to subscribers of `CAMPAIGN.STATUS` whenever
6
+ # an RCS campaign's per-carrier launch status or verification status
7
+ # (AEGIS / Google) changes. `CAMPAIGN.STATUS` is only supported for
8
+ # RCS agent senders — the attach call rejects phone-number senders
9
+ # with `400 Bad Request`. Verify the `PINNACLE-SIGNING-SECRET` header
10
+ # matches the signing secret of the webhook this event was delivered
11
+ # to before trusting the payload.
12
+ class CampaignStatusEvent < Internal::Types::Model
13
+ field :type, -> { String }, optional: false, nullable: false
14
+ field :agent, -> { Pinnacle::Types::CampaignStatusEventAgent }, optional: false, nullable: false
15
+ field :campaign, -> { Pinnacle::Types::CampaignStatusEventCampaign }, optional: false, nullable: false
16
+ field :brand, -> { Pinnacle::Types::CampaignStatusEventBrand }, optional: false, nullable: false
17
+ field :carrier_launches, -> { Pinnacle::Types::CampaignStatusEventCarrierLaunches }, optional: false, nullable: false, api_name: "carrierLaunches"
18
+ field :updated_at, -> { String }, optional: false, nullable: false, api_name: "updatedAt"
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pinnacle
4
+ module Types
5
+ # The RCS agent the campaign-status update is for.
6
+ class CampaignStatusEventAgent < Internal::Types::Model
7
+ field :id, -> { String }, optional: false, nullable: false
8
+ field :name, -> { String }, optional: false, nullable: true
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pinnacle
4
+ module Types
5
+ # Reference to the brand owning the agent's connected campaign.
6
+ class CampaignStatusEventBrand < Internal::Types::Model
7
+ field :public_id, -> { String }, optional: false, nullable: true, api_name: "publicId"
8
+ field :name, -> { String }, optional: false, nullable: true
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pinnacle
4
+ module Types
5
+ # Reference to the connected campaign.
6
+ class CampaignStatusEventCampaign < Internal::Types::Model
7
+ field :public_id, -> { String }, optional: false, nullable: true, api_name: "publicId"
8
+ field :type, -> { Pinnacle::Types::CampaignStatusEventCampaignType }, optional: false, nullable: false
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pinnacle
4
+ module Types
5
+ module CampaignStatusEventCampaignType
6
+ extend Pinnacle::Internal::Types::Enum
7
+
8
+ RCS = "RCS"
9
+ TOLL_FREE = "TOLL_FREE"
10
+ TEN_DLC = "10DLC"
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pinnacle
4
+ module Types
5
+ # Resolved per-key launch status for the campaign's agent. Carrier
6
+ # statuses live under `carriers` and verifier statuses under
7
+ # `verification`.
8
+ class CampaignStatusEventCarrierLaunches < Internal::Types::Model
9
+ field :carriers, -> { Pinnacle::Types::CampaignStatusEventCarrierLaunchesCarriers }, optional: false, nullable: false
10
+ field :verification, -> { Pinnacle::Types::CampaignStatusEventCarrierLaunchesVerification }, optional: false, nullable: false
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pinnacle
4
+ module Types
5
+ # Per-carrier launch status. Each carrier moves through
6
+ # `NOT_LAUNCHED` → `PENDING` → `LAUNCHED` as Pinnacle submits the
7
+ # agent for review and the carrier accepts it. The agent is only
8
+ # deliverable on a carrier once that carrier reports `LAUNCHED`.
9
+ class CampaignStatusEventCarrierLaunchesCarriers < Internal::Types::Model
10
+ field :att, -> { Pinnacle::Types::CarrierLaunchStatus }, optional: false, nullable: false, api_name: "ATT"
11
+ field :tmobile, -> { Pinnacle::Types::CarrierLaunchStatus }, optional: false, nullable: false, api_name: "TMOBILE"
12
+ field :verizon, -> { Pinnacle::Types::CarrierLaunchStatus }, optional: false, nullable: false, api_name: "VERIZON"
13
+ field :others, -> { Pinnacle::Types::CarrierLaunchStatus }, optional: false, nullable: false, api_name: "OTHERS"
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pinnacle
4
+ module Types
5
+ # External verifier status. AEGIS (the U.S. carrier vetting
6
+ # authority used by AT&T, T-Mobile, and Verizon) and Google each
7
+ # send a verification email to the brand's contact address. Each
8
+ # verifier moves through `NOT_SENT` → `SENT` → `VERIFIED` once
9
+ # the brand replies and the verifier confirms ownership.
10
+ class CampaignStatusEventCarrierLaunchesVerification < Internal::Types::Model
11
+ field :aegis, -> { Pinnacle::Types::VerificationStatus }, optional: false, nullable: false, api_name: "AEGIS"
12
+ field :google, -> { Pinnacle::Types::VerificationStatus }, optional: false, nullable: false, api_name: "GOOGLE"
13
+ end
14
+ end
15
+ end
@@ -2,12 +2,12 @@
2
2
 
3
3
  module Pinnacle
4
4
  module Types
5
- # Per-carrier launch status.
5
+ # Per-carrier launch status grouped by category. `carriers` covers
6
+ # AT&T / T-Mobile / Verizon / other carriers; `verification` covers
7
+ # the AEGIS and Google verification flows.
6
8
  class CarrierLaunches < Internal::Types::Model
7
- field :att, -> { Pinnacle::Types::CarrierLaunchStatus }, optional: false, nullable: false, api_name: "ATT"
8
- field :tmobile, -> { Pinnacle::Types::CarrierLaunchStatus }, optional: false, nullable: false, api_name: "TMOBILE"
9
- field :verizon, -> { Pinnacle::Types::CarrierLaunchStatus }, optional: false, nullable: false, api_name: "VERIZON"
10
- field :others, -> { Pinnacle::Types::CarrierLaunchStatus }, optional: false, nullable: false, api_name: "OTHERS"
9
+ field :carriers, -> { Pinnacle::Types::CarrierLaunchesCarriers }, optional: false, nullable: false
10
+ field :verification, -> { Pinnacle::Types::CarrierLaunchesVerification }, optional: false, nullable: false
11
11
  end
12
12
  end
13
13
  end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pinnacle
4
+ module Types
5
+ # Per-carrier launch status. Each carrier moves through
6
+ # `NOT_LAUNCHED` → `PENDING` → `LAUNCHED` as Pinnacle submits the
7
+ # agent for review and the carrier accepts it. The agent is only
8
+ # deliverable on a carrier once that carrier reports `LAUNCHED`.
9
+ class CarrierLaunchesCarriers < Internal::Types::Model
10
+ field :att, -> { Pinnacle::Types::CarrierLaunchStatus }, optional: false, nullable: false, api_name: "ATT"
11
+ field :tmobile, -> { Pinnacle::Types::CarrierLaunchStatus }, optional: false, nullable: false, api_name: "TMOBILE"
12
+ field :verizon, -> { Pinnacle::Types::CarrierLaunchStatus }, optional: false, nullable: false, api_name: "VERIZON"
13
+ field :others, -> { Pinnacle::Types::CarrierLaunchStatus }, optional: false, nullable: false, api_name: "OTHERS"
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pinnacle
4
+ module Types
5
+ # External verifier status. AEGIS (the U.S. carrier vetting
6
+ # authority used by AT&T, T-Mobile, and Verizon) and Google each
7
+ # send a verification email to the brand's contact address. Each
8
+ # verifier moves through `NOT_SENT` → `SENT` → `VERIFIED` once
9
+ # the brand replies and the verifier confirms ownership.
10
+ class CarrierLaunchesVerification < Internal::Types::Model
11
+ field :aegis, -> { Pinnacle::Types::VerificationStatus }, optional: false, nullable: false, api_name: "AEGIS"
12
+ field :google, -> { Pinnacle::Types::VerificationStatus }, optional: false, nullable: false, api_name: "GOOGLE"
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pinnacle
4
+ module Types
5
+ # Multi-select checkbox group when `options` is provided. If `options` is omitted the field renders as a single
6
+ # boolean checkbox.
7
+ class CheckboxField < Internal::Types::Model
8
+ field :options, -> { Internal::Types::Array[Pinnacle::Types::FormFieldOption] }, optional: true, nullable: false
9
+ field :min_selected, -> { Integer }, optional: true, nullable: false
10
+ field :max_selected, -> { Integer }, optional: true, nullable: false
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pinnacle
4
+ module Types
5
+ # Native color picker. Submitted value is a 6-digit hex string like `#ff6b35`.
6
+ class ColorField < Internal::Types::Model; end
7
+ end
8
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pinnacle
4
+ module Types
5
+ module CreateFormRequest
6
+ # CreateFormRequest is an alias for FormDefinition
7
+
8
+ # @option str [String]
9
+ #
10
+ # @return [untyped]
11
+ def self.load(str)
12
+ ::JSON.parse(str)
13
+ end
14
+
15
+ # @option value [untyped]
16
+ #
17
+ # @return [String]
18
+ def self.dump(value)
19
+ ::JSON.generate(value)
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pinnacle
4
+ module Types
5
+ # Date picker. `min`/`max` accept `YYYY-MM-DD`.
6
+ class DateField < Internal::Types::Model
7
+ field :placeholder, -> { String }, optional: true, nullable: false
8
+ field :min, -> { String }, optional: true, nullable: false
9
+ field :max, -> { String }, optional: true, nullable: false
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pinnacle
4
+ module Types
5
+ # Local-datetime picker. `min`/`max` accept ISO 8601 timestamps.
6
+ class DatetimeField < Internal::Types::Model
7
+ field :placeholder, -> { String }, optional: true, nullable: false
8
+ field :min, -> { String }, optional: true, nullable: false
9
+ field :max, -> { String }, optional: true, nullable: false
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pinnacle
4
+ module Types
5
+ # Email input. Server rejects values that fail RFC 5322 validation.
6
+ class EmailField < Internal::Types::Model
7
+ field :placeholder, -> { String }, optional: true, nullable: false
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pinnacle
4
+ module Types
5
+ # Properties shared by every field variant. Not intended to be referenced directly — use a specific field type from
6
+ # `FormField`.
7
+ class FieldBase < Internal::Types::Model
8
+ field :key, -> { String }, optional: false, nullable: false
9
+ field :label, -> { String }, optional: false, nullable: false
10
+ field :required, -> { Internal::Types::Boolean }, optional: true, nullable: false
11
+ field :help_text, -> { String }, optional: true, nullable: false
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pinnacle
4
+ module Types
5
+ # A hosted form definition.
6
+ class Form < Internal::Types::Model
7
+ field :id, -> { String }, optional: false, nullable: false
8
+ field :url, -> { String }, optional: false, nullable: false
9
+ field :name, -> { String }, optional: false, nullable: true
10
+ field :description, -> { String }, optional: false, nullable: true
11
+ field :fields, -> { Internal::Types::Array[Pinnacle::Types::FormField] }, optional: false, nullable: false
12
+ field :can_update, -> { Internal::Types::Boolean }, optional: false, nullable: false
13
+ field :expires_at, -> { String }, optional: false, nullable: true
14
+ field :theme_override, -> { Pinnacle::Types::FormThemeOverride }, optional: false, nullable: true
15
+ field :submission_count, -> { Integer }, optional: false, nullable: false
16
+ field :last_submitted_at, -> { String }, optional: false, nullable: true
17
+ field :archived_at, -> { String }, optional: false, nullable: true
18
+ field :created_at, -> { String }, optional: false, nullable: false
19
+ field :updated_at, -> { String }, optional: false, nullable: false
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pinnacle
4
+ module Types
5
+ # Background layer for the form page. Discriminated by `type`.
6
+ class FormBackground < Internal::Types::Model
7
+ extend Pinnacle::Internal::Types::Union
8
+
9
+ discriminant :type
10
+
11
+ member -> { Pinnacle::Types::FormBackgroundSolid }, key: "SOLID"
12
+ member -> { Pinnacle::Types::FormBackgroundGradient }, key: "GRADIENT"
13
+ member -> { Pinnacle::Types::FormBackgroundImage }, key: "IMAGE"
14
+ member -> { Pinnacle::Types::FormBackgroundPattern }, key: "PATTERN"
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pinnacle
4
+ module Types
5
+ # Two-stop linear gradient. Supply separate light- and dark-mode gradients; the renderer picks based on
6
+ # `theme_mode`.
7
+ class FormBackgroundGradient < Internal::Types::Model
8
+ field :light, -> { Pinnacle::Types::FormGradient }, optional: false, nullable: false
9
+ field :dark, -> { Pinnacle::Types::FormGradient }, optional: false, nullable: false
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pinnacle
4
+ module Types
5
+ # Image background. The image is tiled or scaled across the page with optional blur and dark tint overlay.
6
+ class FormBackgroundImage < Internal::Types::Model
7
+ field :url, -> { String }, optional: false, nullable: false
8
+ field :tint_opacity, -> { Integer }, optional: false, nullable: false
9
+ field :blur, -> { Internal::Types::Boolean }, optional: false, nullable: false
10
+ field :zoom, -> { Integer }, optional: false, nullable: false
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pinnacle
4
+ module Types
5
+ # Subtle repeating SVG pattern tinted by the palette's foreground color.
6
+ class FormBackgroundPattern < Internal::Types::Model
7
+ field :preset, -> { Pinnacle::Types::FormBackgroundPatternPreset }, optional: false, nullable: false
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pinnacle
4
+ module Types
5
+ module FormBackgroundPatternPreset
6
+ extend Pinnacle::Internal::Types::Enum
7
+
8
+ NOISE = "noise"
9
+ DOTS = "dots"
10
+ MESH = "mesh"
11
+ GRID = "grid"
12
+ WAVES = "waves"
13
+ TOPO = "topo"
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pinnacle
4
+ module Types
5
+ # No background effect — the form page is filled with a single flat color. The color itself isn't specified on this
6
+ # object; it's read from the sibling `colors` field on the same `theme_override` object (i.e.
7
+ # `theme_override.colors.light.background` in light mode, `theme_override.colors.dark.background` in dark mode). If
8
+ # you don't override `colors`, the color falls back to the one your team has configured in the [Pinnacle
9
+ # Dashboard](https://app.pinnacle.sh/dashboard/forms).
10
+ #
11
+ # Complete example — a POST `/forms` body that sets a white form in light mode and near-black in dark mode with no
12
+ # background effect:
13
+ #
14
+ # ```json
15
+ # {
16
+ # "name": "Contact request",
17
+ # "fields": [
18
+ # { "type": "text", "key": "full_name", "label": "Full name", "required": true }
19
+ # ],
20
+ # "theme_override": {
21
+ # "background": { "type": "solid" },
22
+ # "colors": {
23
+ # "light": { "background": "#ffffff" },
24
+ # "dark": { "background": "#0a0a0a" }
25
+ # }
26
+ # }
27
+ # }
28
+ # ```
29
+ #
30
+ # Pick `solid` when you want a clean one-color page with no gradient / image / pattern overlay. Use `gradient`,
31
+ # `image`, or `pattern` instead when you want something layered on top of the base color.
32
+ class FormBackgroundSolid < Internal::Types::Model; end
33
+ end
34
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pinnacle
4
+ module Types
5
+ # Per-mode palette. All three colors are optional; any you omit fall back to the team default for that mode.
6
+ class FormColorPalette < Internal::Types::Model
7
+ field :primary, -> { String }, optional: true, nullable: false
8
+ field :background, -> { String }, optional: true, nullable: false
9
+ field :text, -> { String }, optional: true, nullable: false
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pinnacle
4
+ module Types
5
+ # The minimum shape needed to create a form. Used by `POST /forms` and inline by `POST /forms/send`.
6
+ class FormDefinition < Internal::Types::Model
7
+ field :name, -> { String }, optional: true, nullable: false
8
+ field :description, -> { String }, optional: true, nullable: false
9
+ field :fields, -> { Internal::Types::Array[Pinnacle::Types::FormField] }, optional: false, nullable: false
10
+ field :can_update, -> { Internal::Types::Boolean }, optional: true, nullable: false
11
+ field :expires_at, -> { String }, optional: true, nullable: false
12
+ field :theme_override, -> { Pinnacle::Types::FormThemeOverride }, optional: true, nullable: false
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pinnacle
4
+ module Types
5
+ # A single field definition inside a form. Discriminated by `type`.
6
+ class FormField < Internal::Types::Model
7
+ extend Pinnacle::Internal::Types::Union
8
+
9
+ discriminant :type
10
+
11
+ member -> { Pinnacle::Types::TextField }, key: "TEXT"
12
+ member -> { Pinnacle::Types::TextareaField }, key: "TEXTAREA"
13
+ member -> { Pinnacle::Types::AddressField }, key: "ADDRESS"
14
+ member -> { Pinnacle::Types::EmailField }, key: "EMAIL"
15
+ member -> { Pinnacle::Types::UrlField }, key: "URL"
16
+ member -> { Pinnacle::Types::PhoneField }, key: "PHONE"
17
+ member -> { Pinnacle::Types::NumberField }, key: "NUMBER"
18
+ member -> { Pinnacle::Types::RangeField }, key: "RANGE"
19
+ member -> { Pinnacle::Types::RatingField }, key: "RATING"
20
+ member -> { Pinnacle::Types::DateField }, key: "DATE"
21
+ member -> { Pinnacle::Types::TimeField }, key: "TIME"
22
+ member -> { Pinnacle::Types::DatetimeField }, key: "DATETIME"
23
+ member -> { Pinnacle::Types::ColorField }, key: "COLOR"
24
+ member -> { Pinnacle::Types::SelectField }, key: "SELECT"
25
+ member -> { Pinnacle::Types::RadioField }, key: "RADIO"
26
+ member -> { Pinnacle::Types::CheckboxField }, key: "CHECKBOX"
27
+ end
28
+ end
29
+ end