Skip to content

Commit 61ff686

Browse files
committed
feat: add support for cta url interactive message type
Signed-off-by: sarthakjdev <jsarthak448@gmail.com>
1 parent a13afd4 commit 61ff686

File tree

2 files changed

+139
-0
lines changed

2 files changed

+139
-0
lines changed

pkg/components/cta_message.go

Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
package components
2+
3+
import (
4+
"encoding/json"
5+
"fmt"
6+
7+
"github.com/wapikit/wapi.go/internal"
8+
)
9+
10+
type CallToAction struct {
11+
DisplayText string `json:"display_text" validate:"required"`
12+
Url string `json:"url" validate:"required"`
13+
}
14+
15+
func (p *CallToAction) SetDisplayText(text string) {
16+
p.DisplayText = text
17+
}
18+
19+
func (p *CallToAction) SetUrl(url string) {
20+
p.Url = url
21+
}
22+
23+
type CtaMessageBody struct {
24+
Text string `json:"text" validate:"required"`
25+
}
26+
27+
type CtaMessageFooter struct {
28+
Text string `json:"text"`
29+
}
30+
31+
type CtaMessageHeaderType string
32+
33+
const (
34+
CtaMessageHeaderTypeText CtaMessageHeaderType = "text"
35+
)
36+
37+
// ! TODO: support more header types
38+
type CtaMessageHeader struct {
39+
Type CtaMessageHeaderType `json:"type" validate:"required"`
40+
Text string `json:"text"`
41+
}
42+
43+
type CtaMessageActionParams struct {
44+
DisplayText string `json:"display_text" validate:"required"`
45+
Url string `json:"url" validate:"required"`
46+
}
47+
48+
type CtaMessageAction struct {
49+
Name string `json:"name" validate:"required"`
50+
Parameters CtaMessageActionParams `json:"parameters" validate:"required"`
51+
}
52+
53+
// CtaMessage represents a cta message.
54+
type CtaMessage struct {
55+
Action CtaMessageAction `json:"action" validate:"required"`
56+
Body CtaMessageBody `json:"body" validate:"required"`
57+
Footer *CtaMessageFooter `json:"footer,omitempty"`
58+
Header CtaMessageHeader `json:"header,omitempty"`
59+
Type InteractiveMessageType `json:"type" validate:"required"`
60+
}
61+
62+
func (message *CtaMessage) SetBody(text string) {
63+
message.Body = CtaMessageBody{
64+
Text: text,
65+
}
66+
}
67+
68+
func (message *CtaMessage) SetFooter(text string) {
69+
message.Footer = &CtaMessageFooter{
70+
Text: text,
71+
}
72+
}
73+
74+
func (message *CtaMessage) SetHeader(text string) {
75+
message.Header = CtaMessageHeader{
76+
Type: CtaMessageHeaderTypeText,
77+
Text: text,
78+
}
79+
}
80+
81+
func (message *CtaMessage) SetAction(params CtaMessageActionParams) {
82+
message.Action = CtaMessageAction{
83+
Name: "cta_url",
84+
Parameters: params,
85+
}
86+
}
87+
88+
// CtaMessageParams represents the parameters for creating a cta message.
89+
type CtaMessageParams struct {
90+
BodyText string `validate:"required"`
91+
Footer *string `validate:"required"`
92+
}
93+
94+
// CtaMessageApiPayload represents the API payload for a cta message.
95+
type CtaMessageApiPayload struct {
96+
BaseMessagePayload
97+
Interactive CtaMessage `json:"interactive" validate:"required"`
98+
}
99+
100+
// NewCtaMessage creates a new cta message.
101+
func NewCtaMessage(params CtaMessageParams) (*CtaMessage, error) {
102+
if err := internal.GetValidator().Struct(params); err != nil {
103+
return nil, fmt.Errorf("error validating configs: %v", err)
104+
}
105+
106+
return &CtaMessage{
107+
Type: InteractiveMessageTypeCta,
108+
Body: CtaMessageBody{
109+
Text: params.BodyText,
110+
},
111+
}, nil
112+
}
113+
114+
// ToJson converts the cta message to JSON.
115+
func (m *CtaMessage) ToJson(configs ApiCompatibleJsonConverterConfigs) ([]byte, error) {
116+
if err := internal.GetValidator().Struct(configs); err != nil {
117+
return nil, fmt.Errorf("error validating configs: %v", err)
118+
}
119+
120+
jsonData := CtaMessageApiPayload{
121+
BaseMessagePayload: NewBaseMessagePayload(configs.SendToPhoneNumber, MessageTypeInteractive),
122+
Interactive: *m,
123+
}
124+
125+
if configs.ReplyToMessageId != "" {
126+
jsonData.Context = &Context{
127+
MessageId: configs.ReplyToMessageId,
128+
}
129+
}
130+
131+
jsonToReturn, err := json.Marshal(jsonData)
132+
133+
if err != nil {
134+
return nil, fmt.Errorf("error marshalling json: %v", err)
135+
}
136+
137+
return jsonToReturn, nil
138+
}

pkg/components/interactive_message.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ const (
66
InteractiveMessageTypeButton InteractiveMessageType = "button"
77
InteractiveMessageTypeProduct InteractiveMessageType = "product"
88
InteractiveMessageTypeProductList InteractiveMessageType = "product_list"
9+
InteractiveMessageTypeCta InteractiveMessageType = "cta_url"
910
InteractiveMessageTypeList InteractiveMessageType = "list"
1011
InteractiveMessageTypeCatalog InteractiveMessageType = "catalog_message"
1112
InteractiveMessageTypeLocationRequest InteractiveMessageType = "location_request_message"

0 commit comments

Comments
 (0)