.get_element_by_id(id)
.ok_or_else(|| format!("Failed to get element with id \"{}\"", id))?;
let new_class = format!("{} {}", element.class_name(), class);
- element.set_class_name(&new_class);
+ element.set_class_name(&string_remove_extra_whitespace(&new_class));
Ok(())
}
let mut remaining = element_class.split_off(idx);
element_class += &remaining.split_off(class.len());
}
- element.set_class_name(&element_class);
+ element.set_class_name(&string_remove_extra_whitespace(&element_class));
Ok(())
}
+fn string_remove_extra_whitespace(s: &str) -> String {
+ let mut replacement_string = String::with_capacity(s.len());
+ let mut is_space = false;
+ for c in s.chars() {
+ if c != ' ' {
+ replacement_string.push(c);
+ is_space = false;
+ } else if is_space {
+ continue;
+ } else {
+ replacement_string.push(c);
+ is_space = true;
+ }
+ }
+
+ replacement_string
+}
+
pub fn element_has_class(document: &Document, id: &str, class: &str) -> Result<bool, String> {
let element = document
.get_element_by_id(id)
.clone()
.downcast::<Wrapper>()
.send_message(WrapperMsg::BackendTick);
+ // set reset when page "unload"
+ ctx.link()
+ .get_parent()
+ .expect("Wrapper should be a parent of MainMenu")
+ .clone()
+ .downcast::<Wrapper>()
+ .send_future(async {
+ let promise =
+ Promise::new(&mut |resolve: js_sys::Function, _reject| {
+ let window =
+ web_sys::window().expect("Should be able to get window");
+ window
+ .add_event_listener_with_callback("pagehide", &resolve)
+ .expect("Should be able to set \"pagehide\" callback");
+ });
+ let js_fut = JsFuture::from(promise);
+ js_fut.await.ok();
+ WrapperMsg::Reset
+ });
}
_ => {
append_to_info_text(
));
}
- // set up onbeforeunload to disconnect with the received id
- let function = Function::new_no_args(&format!(
- "
- window.addEventListener(\"beforeunload\", function(event) {{
- let xhr = new XMLHttpRequest();
- xhr.open('POST', '{}');
- xhr.send('{{\"type\": \"disconnect\", \"id\": {}}}');
- }});
- ",
- BACKEND_URL, request.id
- ));
- function.call0(&function).ok();
-
if let Some(color) = request.color {
WrapperMsg::BackendResponse(BREnum::GotID(
request.id,
BackendTick,
BackendRequest { place: u8 },
BackendResponse(BREnum),
+ Reset,
}
impl WrapperMsg {
}
}
}
+ WrapperMsg::Reset => {
+ shared.game_state.set(GameState::default());
+ shared.turn.set(Turn::CyanPlayer);
+ for idx in 0..((ROWS * COLS) as usize) {
+ shared.placed[idx].set(false);
+ shared.board[idx].set(BoardState::Empty);
+ element_remove_class(&document, &format!("slot{}", idx), "open").ok();
+ element_remove_class(&document, &format!("slot{}", idx), "placed").ok();
+ element_remove_class(&document, &format!("slot{}", idx), "win").ok();
+ element_remove_class(&document, &format!("slot{}", idx), "cyan").ok();
+ element_remove_class(&document, &format!("slot{}", idx), "magenta").ok();
+ element_append_class(&document, &format!("slot{}", idx), "open").ok();
+ }
+ if let Some(id) = self.player_id.take() {
+ let function = Function::new_no_args(&format!(
+ "
+ let xhr = new XMLHttpRequest();
+ xhr.open('POST', '{}');
+ xhr.send('{{\"type\": \"disconnect\", \"id\": {}}}');
+ ",
+ BACKEND_URL, id
+ ));
+ function.call0(&function).ok();
+ }
+ self.place_request = None;
+ self.do_backend_tick = false;
+ }
} // match (msg)
true