slack_morphism_models/blocks/
view.rs

1use crate::blocks::kit::SlackBlock;
2use crate::blocks::{SlackBlockId, SlackBlockPlainText, SlackBlockPlainTextOnly};
3use crate::common::SlackCallbackId;
4use crate::*;
5use rsb_derive::Builder;
6use serde::{Deserialize, Serialize};
7use serde_with::skip_serializing_none;
8use std::collections::HashMap;
9
10#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
11#[serde(tag = "type")]
12pub enum SlackView {
13    #[serde(rename = "home")]
14    Home(SlackHomeView),
15    #[serde(rename = "modal")]
16    Modal(SlackModalView),
17}
18
19#[skip_serializing_none]
20#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
21pub struct SlackHomeView {
22    pub blocks: Vec<SlackBlock>,
23    #[serde(with = "serde_with::rust::string_empty_as_none")]
24    pub private_metadata: Option<String>,
25    #[serde(with = "serde_with::rust::string_empty_as_none")]
26    pub callback_id: Option<SlackCallbackId>,
27    #[serde(with = "serde_with::rust::string_empty_as_none")]
28    pub external_id: Option<String>,
29}
30
31#[skip_serializing_none]
32#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
33pub struct SlackModalView {
34    pub title: SlackBlockPlainTextOnly,
35    pub blocks: Vec<SlackBlock>,
36    pub close: Option<SlackBlockPlainTextOnly>,
37    pub submit: Option<SlackBlockPlainTextOnly>,
38    #[serde(with = "serde_with::rust::string_empty_as_none")]
39    pub private_metadata: Option<String>,
40    #[serde(with = "serde_with::rust::string_empty_as_none")]
41    pub callback_id: Option<SlackCallbackId>,
42    pub clear_on_close: Option<bool>,
43    pub notify_on_close: Option<bool>,
44    pub hash: Option<String>,
45    #[serde(with = "serde_with::rust::string_empty_as_none")]
46    pub external_id: Option<String>,
47}
48
49#[skip_serializing_none]
50#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
51pub struct SlackStatefulView {
52    #[serde(flatten)]
53    pub state_params: SlackStatefulStateParams,
54    #[serde(flatten)]
55    pub view: SlackView,
56}
57
58#[skip_serializing_none]
59#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
60pub struct SlackStatefulStateParams {
61    pub id: SlackViewId,
62    pub team_id: SlackTeamId,
63    pub state: Option<SlackViewState>,
64    pub hash: String,
65    pub previous_view_id: Option<SlackViewId>,
66    pub root_view_id: Option<SlackViewId>,
67    pub app_id: Option<SlackAppId>,
68    pub bot_id: Option<SlackBotId>,
69}
70
71#[skip_serializing_none]
72#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
73pub struct SlackViewState {
74    pub values: HashMap<SlackBlockId, HashMap<SlackActionId, SlackViewStateValue>>,
75}
76
77#[skip_serializing_none]
78#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
79pub struct SlackViewStateValue {
80    #[serde(rename = "type")]
81    pub action_type: SlackActionType,
82    pub value: Option<String>,
83    pub selected_date: Option<String>,
84    pub selected_time: Option<String>,
85    pub selected_conversation: Option<SlackConversationId>,
86    pub selected_channel: Option<SlackChannelId>,
87    pub selected_user: Option<SlackUserId>,
88    pub selected_option: Option<SlackViewStateValueSelectedOption>,
89    pub selected_conversations: Option<Vec<SlackConversationId>>,
90    pub selected_users: Option<Vec<SlackUserId>>,
91    pub selected_options: Option<Vec<SlackViewStateValueSelectedOption>>,
92}
93
94#[skip_serializing_none]
95#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Builder)]
96pub struct SlackViewStateValueSelectedOption {
97    pub text: SlackBlockPlainText,
98    pub value: String,
99}