use istyles::istyles;
use leptos::{html::Input, prelude::*, tachys::html};
use reactive_stores::Store;
use sqlformat::{FormatOptions, QueryParams};
use wasm_bindgen::{JsCast, prelude::Closure};
use web_sys::{Blob, Event, FileReader, HtmlInputElement, MouseEvent, Url, UrlSearchParams};
use crate::{
FragileComfirmed, LoadDbOptions, RunOptions, SQLightError, WorkerRequest,
app::{
ImportProgress,
advanced_options_menu::AdvancedOptionsMenu,
button_set::{Button, ButtonSet, IconButton, LinkButton, Rule},
config_menu::ConfigMenu,
context_menu::ContextMenu,
database_menu::DatabaseMenu,
icon::{build_icon, config_icon, expandable_icon, github_icon, more_options_icon},
output::change_focus,
pop_button::PopButton,
state::{Focus, GlobalState, GlobalStateStoreFields},
tools_menu::ToolsMenu,
vfs_menu::VfsMenu,
},
send_request,
};
istyles!(styles, "assets/module.postcss/header.module.css.map");
#[component]
pub fn Header() -> impl IntoView {
let menu_container = NodeRef::new();
let input_ref = NodeRef::new();
view! {
<>
>
}
}
pub fn execute(state: Store) -> Box {
Box::new(move || {
let editor_guard = state.editor().read_untracked();
let Some(editor) = editor_guard.as_ref() else {
return;
};
let (code, selected_code) = (editor.get_value(), editor.get_selected_value());
drop(editor_guard);
state.sql().set(code.clone());
change_focus(state, Some(Focus::Execute));
std::mem::take(&mut *state.output().write());
let run_selected_code =
!selected_code.is_empty() && state.run_selected_sql().get_untracked();
send_request(
state,
WorkerRequest::Run(RunOptions {
embed: false,
sql: if run_selected_code {
selected_code
} else {
code
},
clear_on_prepare: !*state.keep_ctx().read_untracked(),
}),
);
})
}
#[component]
fn ExecuteButton() -> impl IntoView {
let state = expect_context::>();
let on_click = execute(state);
view! {
}
}
#[component]
fn VfsMenuButton(menu_container: NodeRef) -> impl IntoView {
let state = expect_context::>();
let button = move |toggle, node_ref| {
view! {
}
.into_any()
};
view! {
}.into_any() })
menu_container=menu_container
>
}
}
#[component]
fn ContextMenuButton(menu_container: NodeRef) -> impl IntoView {
let state = expect_context::>();
let button = move |toggle, node_ref| {
view! {
}
.into_any()
};
view! {
}.into_any() })
menu_container=menu_container
>
}
}
#[component]
fn ConfigMenuButton(menu_container: NodeRef) -> impl IntoView {
let button = |toggle, node_ref| {
view! {
}
.into_any()
};
view! {
}.into_any() })
menu_container=menu_container
>
}
}
#[component]
fn AdvancedOptionsMenuButton(menu_container: NodeRef) -> impl IntoView {
let button = |toggle, node_ref| {
view! {
{more_options_icon()}
}
.into_any()
};
view! {
}.into_any() })
menu_container=menu_container
>
}
}
#[component]
fn ToolsButton(menu_container: NodeRef) -> impl IntoView {
let state = expect_context::>();
let button = |toggle, node_ref| {
view! {
}
.into_any()
};
let on_format = move |_event, signal: WriteSignal| {
let Some(editor) = &*state.editor().read() else {
return;
};
let format_options = FormatOptions {
uppercase: Some(true),
lines_between_queries: 2,
..Default::default()
};
let sql = sqlformat::format(
&editor.get_value(),
&QueryParams::default(),
&format_options,
);
editor.set_value(sql);
signal.set(false);
};
let on_embed = move |_event, signal: WriteSignal| {
let editor_guard = state.editor().read_untracked();
let Some(editor) = editor_guard.as_ref() else {
return;
};
let sql = editor.get_value();
drop(editor_guard);
std::mem::take(&mut *state.output().write());
send_request(
state,
WorkerRequest::Run(RunOptions {
embed: true,
sql,
clear_on_prepare: !*state.keep_ctx().read_untracked(),
}),
);
signal.set(false);
};
view! {
| {
view! {
}
.into_any()
})
menu_container=menu_container
>
}
}
#[component]
fn DatabaseButton(
input_ref: NodeRef,
menu_container: NodeRef,
) -> impl IntoView {
let state = expect_context::>();
let button = |toggle, node_ref| {
view! {
}
.into_any()
};
let (file, set_file) = signal::