A lot of changes and make create project actually clone from premade templates

This commit is contained in:
Lncvrt committed 2025-08-15 19:42:30 -07:00
1 parent 3bb706a531
commit b0ae3a9978
8 files changed
+279 -162

No files matched your search

+3
View File
@@ -17,6 +17,9 @@ serde = { version = "1.0.219", features = ["derive"] }
serde_json = "1.0.142"
tauri-plugin-dialog = "2.3.2"
tokio = "1.47.1"
reqwest = { version = "0.12.23", default-features = false, features = ["json", "rustls-tls"] }
zip = "4.3.0"
anyhow = "1.0.99"
[target.'cfg(not(any(target_os = "android", target_os = "ios")))'.dependencies]
tauri-plugin-single-instance = "2.3.2"
+2 -2
View File
@@ -3,8 +3,8 @@
"identifier": "default",
"description": "Capability for the main window",
"windows": [
"main",
"new_project_popup"
"projectmanager",
"newprojectpopup"
],
"permissions": [
"core:default",
+99 -28
View File
@@ -1,33 +1,103 @@
use tauri::Manager;
use serde_json::Value;
use std::{io::Cursor, path::Path};
use tauri::{AppHandle, Emitter};
use tauri_plugin_dialog::{DialogExt, MessageDialogKind};
use tokio::fs;
use zip::ZipArchive;
#[tauri::command]
async fn create_project(project_type: String, project_folder: String, project_name: String) {
let project_root: String = format!("{}/{}", project_folder, project_name);
async fn create_project(
app: AppHandle,
project_type: String,
project_folder: String,
project_name: String,
) {
let _ = app.emit("new_project_enable_creation_button", "false");
let _ = app.emit("new_project_update_message", "white:Creating project...");
let folder = Path::new(&project_folder);
let name = Path::new(&project_name);
let project_root = folder.join(name);
let _ = fs::create_dir(&project_root).await;
let project_type_str: &str = project_type.as_str();
match project_type_str {
"website" => {
let _ = fs::File::create(format!("{}/index.php", project_root)).await;
if project_type != "empty" {
let _ = app.emit("new_project_update_message", "white:Fetching templates...");
let url = format!(
"https://codefly-repo.lncvrt.xyz/php-fly/templates/mainfest.php?onlyLatest=true&template={}",
project_type
);
if let Ok(templates_res) = reqwest::get(url).await {
if let Ok(json) = templates_res.json::<Value>().await {
if let Some(templatedata) = json.get(&project_type) {
if let Some(latestdata) = templatedata.get("latest") {
if !latestdata.is_null() {
if let Some(latestdownloadurl) =
latestdata.get("download_url").and_then(|v| v.as_str())
{
let _ = app.emit(
"new_project_update_message",
"white:Downloading template...",
);
if let Ok(download_res) = reqwest::get(latestdownloadurl).await {
match download_res.bytes().await {
Ok(bytes) => {
let _ = app.emit(
"new_project_update_message",
"white:Unzipping template...",
);
let result = tokio::task::spawn_blocking(
move || -> anyhow::Result<()> {
let reader = Cursor::new(bytes);
let mut archive = ZipArchive::new(reader)?;
let _ = fs::write(
format!("{}/index.php", project_root),
"<h1>this will be updated later</h1>",
)
.await;
for i in 0..archive.len() {
let mut file = archive.by_index(i)?;
let outpath =
&project_root.join(file.name());
if file.is_dir() {
std::fs::create_dir_all(&outpath)?;
} else {
if let Some(parent) = outpath.parent() {
std::fs::create_dir_all(parent)?;
}
let mut outfile =
std::fs::File::create(&outpath)?;
std::io::copy(&mut file, &mut outfile)?;
}
}
Ok(())
},
)
.await;
match result {
Ok(inner) => {
if let Err(e) = inner {
eprintln!("unzip failed: {:?}", e);
}
}
Err(e) => {
eprintln!("task panicked: {:?}", e);
}
}
}
Err(_) => {}
}
} else {
eprintln!("failed to download file");
}
}
}
}
}
}
}
"webserver" => {
let _ = fs::write(
format!("{}/index.php", project_root),
"<h1>this will be updated later</h1>",
)
.await;
}
_ => {}
}
let _ = app.emit("new_project_enable_creation_button", "true");
let _ = app.emit("new_project_update_message", "");
}
#[cfg_attr(mobile, tauri::mobile_entry_point)]
@@ -35,21 +105,22 @@ pub fn run() {
tauri::Builder::default()
.plugin(tauri_plugin_dialog::init())
.plugin(tauri_plugin_single_instance::init(|app, _args, _cwd| {
let _ = app
.get_webview_window("main")
.expect("no main window")
.set_focus();
app.dialog()
.message("PHP Fly is already open!")
.kind(MessageDialogKind::Error)
.title("Warning")
.blocking_show();
}))
.invoke_handler(tauri::generate_handler![create_project])
.setup(|app| {
tauri::webview::WebviewWindowBuilder::new(
app,
"main",
"projectmanager",
tauri::WebviewUrl::App("projectmanager/projects".into()),
)
.resizable(false)
.maximizable(false)
.title("PHP Fly")
.title("PHP Fly: Project Manager")
.inner_size(800.0, 500.0)
.build()?;
Ok(())