slack_morphism_models/blocks/
view.rs1use 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}