Skip to content

Commit

Permalink
✨ adds profile api
Browse files Browse the repository at this point in the history
  • Loading branch information
chriamue committed Jun 30, 2024
1 parent 3d38886 commit a6f3e53
Show file tree
Hide file tree
Showing 9 changed files with 106 additions and 45 deletions.
4 changes: 3 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,6 @@ gloo-timers = "0.3.0"
gloo-utils = "0.2.0"
web-sys = { version="0.3.69", features = ["HtmlAudioElement"] }
serde = { version = "1.0.203", features = ["derive"] }
serde_json = "1.0.117"
serde_json = "1.0.117"
reqwest = { version = "0.12.5", features = ["json"] }
anyhow = "1.0.86"
1 change: 1 addition & 0 deletions src/api/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
pub mod profile;
24 changes: 24 additions & 0 deletions src/api/profile.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
use anyhow::Result;
use konnektoren_core::prelude::PlayerProfile;

pub async fn fetch_profile(id: String, name: String) -> Result<PlayerProfile> {
let url = format!("https://api.konnektoren.help/api/v1/profiles/{}", id);

save_profile(PlayerProfile {
id: id.clone(),
name: name.clone(),
xp: 0,
})
.await?;

let response = reqwest::get(&url).await?;
let profile = response.json::<PlayerProfile>().await?;
Ok(profile)
}

pub async fn save_profile(profile: PlayerProfile) -> Result<()> {
let url = format!("https://api.konnektoren.help/api/v1/profiles");
let client = reqwest::Client::new();
let _response = client.post(&url).json(&profile).send().await?;
Ok(())
}
19 changes: 19 additions & 0 deletions src/app.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
use crate::api::profile::fetch_profile;
use crate::challenge::ChallengeComp;
use crate::footer::FooterComp;
use crate::points::PointsComp;
Expand All @@ -12,6 +13,24 @@ pub fn app() -> Html {

use_effect(move || {
telegram::ready();

wasm_bindgen_futures::spawn_local(async move {
let id: String = telegram::get_user_id()
.await
.expect("error getting id")
.as_string()
.expect("error converting id");
let username: String = telegram::get_user_name()
.await
.expect("error getting username")
.as_string()
.expect("error converting username");

let profile = fetch_profile(id, username)
.await
.expect("error loading profile");
log::info!("Profile: {:?}", profile);
});
});

let on_address = {
Expand Down
2 changes: 1 addition & 1 deletion src/challenge.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ use konnektoren_core::{
use konnektoren_yew::components::challenge::{
ChallengeComponent, ChallengeEvent, ResultSummaryComponent,
};
use web_sys::HtmlAudioElement;
use std::ops::Div;
use web_sys::HtmlAudioElement;
use yew::prelude::*;

#[derive(Properties, PartialEq)]
Expand Down
86 changes: 43 additions & 43 deletions src/claim.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
use gloo_utils::format::JsValueSerdeExt;
use serde::Deserialize;
use wasm_bindgen::prelude::*;
use wasm_bindgen_futures::{js_sys::Promise, JsFuture};
use yew::prelude::*;
use serde::Deserialize;
use gloo_utils::format::JsValueSerdeExt;

#[wasm_bindgen(module = "/src/js/confetti.js")]
extern "C" {
Expand Down Expand Up @@ -74,60 +74,60 @@ pub fn claim_comp(props: &ClaimCompProps) -> Html {
let claim_state = claim_state.clone();

wasm_bindgen_futures::spawn_local(async move {

match CLAIM_VERSION {
ClaimVersion::V1 => {
match JsFuture::from(claim(&address, amount)).await {
Ok(result) => {
log::info!("Claim successful: {:?}", result);
let explorer_url = result.as_string().unwrap_or_default();
log::info!("Claim successful: {}", explorer_url);
claim_state.set(ClaimState::Done(explorer_url));
}
Err(e) => {
let error_message = format!("{:?}", e);
log::error!("Claim failed: {}", error_message);
claim_state.set(ClaimState::Error(error_message));
}
ClaimVersion::V1 => match JsFuture::from(claim(&address, amount)).await {
Ok(result) => {
log::info!("Claim successful: {:?}", result);
let explorer_url = result.as_string().unwrap_or_default();
log::info!("Claim successful: {}", explorer_url);
claim_state.set(ClaimState::Done(explorer_url));
}
Err(e) => {
let error_message = format!("{:?}", e);
log::error!("Claim failed: {}", error_message);
claim_state.set(ClaimState::Error(error_message));
}
}
ClaimVersion::V2 => {
match JsFuture::from(claim_v2(&address, amount)).await {
Ok(result) => {
match result.into_serde::<RawTransaction>() {
Ok(raw_tx) => {
if raw_tx.success {
match JsFuture::from(sendRawTransaction(&raw_tx.raw_transaction, &raw_tx.destination)).await {
Ok(_) => {
log::info!("Transaction sent successfully");
claim_state.set(ClaimState::Done("Transaction sent successfully".to_string()));
}
Err(e) => {
let error_message = format!("{:?}", e);
log::error!("Transaction failed: {}", error_message);
claim_state.set(ClaimState::Error(error_message));
}
}
} else {
let error_message = "Failed to get raw transaction".to_string();
log::error!("{}", error_message);
},
ClaimVersion::V2 => match JsFuture::from(claim_v2(&address, amount)).await {
Ok(result) => match result.into_serde::<RawTransaction>() {
Ok(raw_tx) => {
if raw_tx.success {
match JsFuture::from(sendRawTransaction(
&raw_tx.raw_transaction,
&raw_tx.destination,
))
.await
{
Ok(_) => {
log::info!("Transaction sent successfully");
claim_state.set(ClaimState::Done(
"Transaction sent successfully".to_string(),
));
}
Err(e) => {
let error_message = format!("{:?}", e);
log::error!("Transaction failed: {}", error_message);
claim_state.set(ClaimState::Error(error_message));
}
}
Err(e) => {
let error_message = format!("{:?}", e);
log::error!("Claim failed: {}", error_message);
claim_state.set(ClaimState::Error(error_message));
}
} else {
let error_message = "Failed to get raw transaction".to_string();
log::error!("{}", error_message);
claim_state.set(ClaimState::Error(error_message));
}
}
Err(e) => {
let error_message = format!("{:?}", e);
log::error!("Claim failed: {}", error_message);
claim_state.set(ClaimState::Error(error_message));
}
},
Err(e) => {
let error_message = format!("{:?}", e);
log::error!("Claim failed: {}", error_message);
claim_state.set(ClaimState::Error(error_message));
}
}
},
}
});
})
Expand Down
8 changes: 8 additions & 0 deletions src/js/telegram.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,14 @@ export function tma_version() {
return Telegram.WebApp.version;
}

export function tma_get_user_id() {
return Telegram.WebApp.initDataUnsafe.user.id;
}

export function tma_get_user_name() {
return Telegram.WebApp.initDataUnsafe.user.username;
}

export function tma_set_header_color(color) {
return Telegram.WebApp.setHeaderColor(color);
}
Expand Down
1 change: 1 addition & 0 deletions src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
pub mod api;
pub mod app;
pub mod challenge;
pub mod claim;
Expand Down
6 changes: 6 additions & 0 deletions src/telegram.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,10 @@ extern "C" {

#[wasm_bindgen(catch, js_name = tma_get_item)]
pub async fn get_item(key: &str) -> Result<JsValue, JsValue>;

#[wasm_bindgen(catch, js_name = tma_get_user_id)]
pub async fn get_user_id() -> Result<JsValue, JsValue>;

#[wasm_bindgen(catch, js_name = tma_get_user_name)]
pub async fn get_user_name() -> Result<JsValue, JsValue>;
}

0 comments on commit a6f3e53

Please sign in to comment.