diff --git a/.cargo/config.toml b/.cargo/config.toml index 1c37730a..f3aa06b2 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -1,3 +1,6 @@ +[build] +target = "wasm32-unknown-unknown" + [profile] [profile.dioxus-wasm] diff --git a/.idea/workspace.xml b/.idea/workspace.xml index e680f727..ccdda06d 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -5,8 +5,8 @@ - - + + @@ -15,7 +15,11 @@ + + + + @@ -231,6 +238,9 @@ + + + diff --git a/.vscode/settings.json b/.vscode/settings.json index 2e62bd7b..be98f618 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,3 @@ { - "rust-analyzer.cargo.target": "wasm32-unknown-unknown" + "rust-analyzer.diagnostics.enable": false } diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 76684c7f..3ce54dd1 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -1,29 +1,31 @@ { "version": "2.0.0", "tasks": [ - { - "label": "dx build", - "type": "shell", - "command": "dx", - "args": ["build", "--platform", "web"], - "options": { - "cwd": "${workspaceFolder}/ui" - }, - "group": { - "kind": "build", - "isDefault": true - }, - "problemMatcher": { - "owner": "rust", - "fileLocation": ["relative", "${workspaceFolder}"], - "pattern": { - "regexp": "^(.*):(\\d+):(\\d+):\\s(\\d+):\\s(.*)$", - "file": 1, - "line": 2, - "column": 3, - "message": 5 + { + "label": "Build with dx in ui directory", + "type": "shell", + "command": "dx build --platform web", + "options": { + "cwd": "${workspaceFolder}/ui" + }, + "problemMatcher": { + "owner": "rust", + "fileLocation": ["relative", "${workspaceFolder}"], + "pattern": [ + { + "regexp": "^(.+):(\\d+):(\\d+):\\s+(error|warning):\\s+(.*)$", + "file": 1, + "line": 2, + "column": 3, + "severity": 4, + "message": 5 + } + ] + }, + "group": { + "kind": "build", + "isDefault": true } } - } ] } diff --git a/ui/src/components/app.rs b/ui/src/components/app.rs index bf8e44d4..754789cf 100644 --- a/ui/src/components/app.rs +++ b/ui/src/components/app.rs @@ -3,18 +3,11 @@ mod freenet_api; use super::{conversation::Conversation, members::MemberList, room_list::RoomList}; use crate::components::members::member_info_modal::MemberInfoModal; use crate::components::room_list::edit_room_modal::EditRoomModal; -use crate::constants::ROOM_CONTRACT_WASM; use crate::room_data::{CurrentRoom, Rooms}; -use crate::util::to_cbor_vec; use common::room_state::member::MemberId; -use common::room_state::ChatRoomParametersV1; use dioxus::prelude::*; use document::Stylesheet; use ed25519_dalek::VerifyingKey; -use freenet_stdlib::client_api::WebApi; -use freenet_stdlib::client_api::{ClientError, ClientRequest, HostResponse}; -use freenet_stdlib::prelude::{ContractCode, ContractInstanceId, Parameters}; -use futures::SinkExt; pub fn App() -> Element { use_context_provider(|| Signal::new(initial_rooms())); @@ -23,7 +16,7 @@ pub fn App() -> Element { use_context_provider(|| Signal::new(EditRoomModalSignal { room: None })); use_context_provider(|| Signal::new(CreateRoomModalSignal { show: false })); - connect_to_freenet(); + //connect_to_freenet(); rsx! { Stylesheet { href: asset!("./assets/bulma.min.css") } diff --git a/ui/src/components/app/freenet_api.rs b/ui/src/components/app/freenet_api.rs new file mode 100644 index 00000000..7bbdf0e2 --- /dev/null +++ b/ui/src/components/app/freenet_api.rs @@ -0,0 +1,65 @@ +use common::room_state::ChatRoomParametersV1; +use ed25519_dalek::VerifyingKey; +use freenet_stdlib::{client_api::{ClientError, ClientRequest, ContractRequest, HostResponse}, prelude::{ContractCode, ContractInstanceId, ContractKey, Parameters}}; +use freenet_stdlib::client_api::WebApi; + +use crate::{constants::ROOM_CONTRACT_WASM, util::to_cbor_vec}; +use futures::sink::SinkExt; + +pub struct FreenetApi<'a> { + pub api: WebApi, + pub requests: futures::channel::mpsc::UnboundedReceiver>, + pub host_responses: futures::channel::mpsc::UnboundedSender, +} + +impl FreenetApi<'_> { + pub fn new() -> Self { + let conn = web_sys::WebSocket::new( + "ws://localhost:50509/contract/command?encodingProtocol=native", + ) + .unwrap(); + let (send_host_responses, host_responses) = futures::channel::mpsc::unbounded(); + let (send_half, requests) = + futures::channel::mpsc::unbounded::(); + let result_handler = move |result: Result| { + let mut send_host_responses_clone = send_host_responses.clone(); + let _ = wasm_bindgen_futures::future_to_promise(async move { + send_host_responses_clone + .send(result) + .await + .expect("channel open"); + Ok(wasm_bindgen::JsValue::NULL) + }); + }; + let (tx, rx) = futures::channel::oneshot::channel(); + let onopen_handler = move || { + let _ = tx.send(()); + }; + let mut api = WebApi::start( + conn, + result_handler, + |err| { + log::error!("host error: {}", err); + }, + onopen_handler, + ); + todo!() + //Self { + // api, + // requests: requests, + // host_responses: host_responses, + // } + } + + pub fn subscribe(&mut self, room_owner: &VerifyingKey) { + let parameters = ChatRoomParametersV1 { owner: *room_owner }; + let parameters = to_cbor_vec(¶meters); + let parameters: Parameters = parameters.into(); + let contract_code = ContractCode::from(ROOM_CONTRACT_WASM); + let contract_instance_id = + ContractInstanceId::from_params_and_code(parameters, contract_code); + let contract_key = ContractKey::from(contract_instance_id); + let request = ContractRequest::Subscribe {key : contract_key, summary : None }; + // self.api.send_request(request); + } +}