Skip to content

Commit 8e87766

Browse files
Merge pull request #37 from osain-az/hotfix/instagram_refactor
Refactor Instagram api
2 parents 399359e + f9852bc commit 8e87766

File tree

2 files changed

+50
-40
lines changed

2 files changed

+50
-40
lines changed

examples/seed/src/instagram.rs

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use crate::instagram::Msg::{InstagramAccountIdSuccess, InstagramAccountDetailsSuccess};
2-
use facebook_api_rs::prelude::account::{InstaAccount, InstagramAccount};
2+
use facebook_api_rs::prelude::account::{InstaAccount, InstagramAccount, InstaAccountId};
33
use facebook_api_rs::prelude::publish::{InstaMediaContainerId, InstaPostParams};
44
use facebook_api_rs::prelude::search::{PageSearch, PagesAPI};
55
use facebook_api_rs::prelude::*;
@@ -101,11 +101,16 @@ pub enum Msg {
101101
InstaPostSuccessful(InstaMediaContainerId),
102102
HandleInstaPostingOption(web_sys::Event),
103103
PagesSearch(String),
104-
GetInstagramAccountDetails,
104+
GetInstagramAccountDetails(InstaAccount),
105105
InstagramAccountDetailsSuccess(InstagramAccount),
106106
PageSearchResponse(PageSearch),
107+
107108
MediaContainerStatus,
108109
MediaContainerStatusResponse(MediaContainerStatus),
110+
111+
FetchInstagramAccountId,
112+
FetchInstagramAccountIdSuccess(InstaAccount),
113+
109114
// every error should user this
110115
ResponseFailed(FetchError),
111116
}
@@ -137,8 +142,7 @@ pub fn update(msg: Msg, model: &mut Model, orders: &mut impl Orders<Msg>) {
137142
Msg::InstagramAccountIdSuccess(resp) => {
138143
model.insta_account = Some(resp);
139144
}
140-
141-
Msg::GetInstagramAccountDetails => {
145+
Msg::FetchInstagramAccountId => {
142146
if model.selected_account.is_some() {
143147
if let Some(selected_page) = &model.selected_account {
144148
let page_access_token = selected_page.access_token.to_owned();
@@ -147,6 +151,26 @@ pub fn update(msg: Msg, model: &mut Model, orders: &mut impl Orders<Msg>) {
147151
orders.perform_cmd(async move {
148152
Client::new(Token::default(), page_access_token.clone())
149153
.instagram_account(facebook_page_id)
154+
.account_id()
155+
.await
156+
.map_or_else(Msg::ResponseFailed, Msg::FetchInstagramAccountIdSuccess)
157+
});
158+
}
159+
};
160+
161+
}
162+
Msg::FetchInstagramAccountIdSuccess(insta_id) => {
163+
orders.send_msg(Msg::GetInstagramAccountDetails(insta_id));
164+
}
165+
Msg::GetInstagramAccountDetails(insta_id) => {
166+
let instagram_id = insta_id.instagram_business_account.id.clone();
167+
if model.selected_account.is_some() {
168+
if let Some(selected_page) = &model.selected_account {
169+
let page_access_token = selected_page.access_token.to_owned();
170+
171+
orders.perform_cmd(async move {
172+
Client::new(Token::default(), page_access_token.clone())
173+
.instagram_account(instagram_id)
150174
.account_details()
151175
.await
152176
.map_or_else(Msg::ResponseFailed, InstagramAccountDetailsSuccess)
@@ -398,7 +422,7 @@ pub fn view(model: &Model) -> Node<Msg> {
398422
],
399423
button![
400424
"Get Instagram Account details ",
401-
ev(Ev::Click, |_| { Msg::GetInstagramAccountDetails }),
425+
ev(Ev::Click, |_| { Msg::FetchInstagramAccountId }),
402426
attrs! {
403427
At:: Disabled => model.selected_account.is_none().as_at_value()
404428
}

src/graph/instagram/account/mod.rs

Lines changed: 21 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -49,50 +49,20 @@ impl InstagramApi {
4949
}
5050

5151
/// This method is used to get instagram business account with its details (name, user, id ,etc).
52+
/// It accepts the instagram page id.
5253
/// for reference check <https://developers.facebook.com/docs/instagram-api/reference/ig-user>
5354
pub async fn account_details(self) -> seed::fetch::Result<InstagramAccount> {
54-
let base_url = "https://graph.facebook.com/v11.0/";
55-
56-
let self_data = self.clone();
57-
58-
let result = self.account_id().await;
59-
if result.is_ok(){
60-
let instagram_id = result.unwrap();
61-
let mut url = base_url.to_owned()
62-
+ &instagram_id.instagram_business_account.id.as_str();
63-
64-
// added required filed needed
65-
let mut fields_count = Fields::default().fields.len();
66-
let mut url_fields = "".to_string();
67-
for (count, field) in Fields::default().fields.into_iter().enumerate() {
68-
if count < fields_count - 1 {
69-
url_fields = url_fields+ &field + ",";
70-
} else {
71-
url_fields= url_fields+ &field; // remove the comma in the last filed
72-
}
73-
}
74-
url_fields = String::from(encode(url_fields.as_str()));
55+
let mut url = self.base_url.replace("EDGE", "?");
56+
let url_fields = Fields::default().build_url_with_fields(); // build urlenconded url withe regired fields
7557

7658
let mut request_url = url
77-
+ "?fields="
59+
+ "fields="
7860
+url_fields.as_str()
7961
+ "&access_token="
80-
+ &self_data.page_access_token;
81-
82-
log!(request_url);
62+
+ &self.page_access_token;
8363
let request = Request::new(request_url).method(Method::Get);
8464
fetch(request).await?.json::<InstagramAccount>().await
85-
86-
}else {
87-
let err = JsValue::from_str("The first get request call to fetch the instagram id was not successful,\
88-
therefore the request to get instagram account failed. Try making the request again.");
89-
Err(FetchError::RequestError(err)) // try to generate a customer
90-
// error
91-
}
92-
9365
}
94-
95-
9666
}
9767

9868

@@ -154,3 +124,19 @@ impl Default for Fields {
154124
Self { fields }
155125
}
156126
}
127+
128+
impl Fields {
129+
pub fn build_url_with_fields(self) -> String {
130+
let mut url_fields= "".to_string();
131+
let fields_count = Fields::default().fields.len();
132+
for (count, field) in Fields::default().fields.into_iter().enumerate() {
133+
if count < fields_count - 1 {
134+
url_fields = url_fields+ &field + ",";
135+
} else {
136+
url_fields= url_fields+ &field; // remove the comma in the last filed
137+
}
138+
}
139+
url_fields = String::from(encode(url_fields.as_str())); // encode the url
140+
url_fields
141+
}
142+
}

0 commit comments

Comments
 (0)