Skip to content

Commit

Permalink
✨ adds profile api
Browse files Browse the repository at this point in the history
  • Loading branch information
chriamue committed Jul 1, 2024
1 parent 3d38886 commit de9470c
Show file tree
Hide file tree
Showing 9 changed files with 111 additions and 48 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;
25 changes: 25 additions & 0 deletions src/api/profile.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
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 client = reqwest::Client::new();
let response = client.get(url).fetch_mode_no_cors().send().await?;
let profile = response.json::<PlayerProfile>().await?;
Ok(profile)
}

pub async fn save_profile(profile: PlayerProfile) -> Result<()> {
let url = "https://api.konnektoren.help/api/v1/profiles";
let client = reqwest::Client::new();
let _response = client.post(url).json(&profile).send().await?;
Ok(())
}
16 changes: 15 additions & 1 deletion 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 @@ -11,7 +12,20 @@ pub fn app() -> Html {
let address = use_state(|| String::new());

use_effect(move || {
telegram::ready();
let _ = telegram::ready()
.map_err(|error| log::error!("Error initializing telegram: {:?}", error));

wasm_bindgen_futures::spawn_local(async move {
let id: i64 = telegram::get_user_id().unwrap_or(0);
log::debug!("ID: {}", id);
let username: String = telegram::get_user_name().unwrap_or("Anonymous".to_string());
log::debug!("Username: {}", username);

let profile = fetch_profile(id.to_string(), 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
14 changes: 14 additions & 0 deletions src/js/telegram.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,20 @@ export function tma_version() {
return Telegram.WebApp.version;
}

export function tma_get_user_id() {
if (typeof Telegram.WebApp.initDataUnsafe.user === "undefined") {
throw new Error("User ID is undefined");
}
return Telegram.WebApp.initDataUnsafe.user.id;
}

export function tma_get_user_name() {
if (typeof Telegram.WebApp.initDataUnsafe.user === "undefined") {
throw new Error("User name is undefined");
}
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
10 changes: 8 additions & 2 deletions src/telegram.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ use wasm_bindgen::prelude::*;

#[wasm_bindgen(module = "/src/js/telegram.js")]
extern "C" {
#[wasm_bindgen(js_name = tma_ready)]
pub fn ready();
#[wasm_bindgen(catch, js_name = tma_ready)]
pub fn ready() -> Result<(), JsValue>;

#[wasm_bindgen(js_name = tma_version)]
pub fn version() -> String;
Expand All @@ -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 fn get_user_id() -> Result<i64, JsValue>;

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

0 comments on commit de9470c

Please sign in to comment.