# Conflicts: # src/main/java/org/to/telegramfinalproject/UI/ChatPageController.java # src/main/java/org/to/telegramfinalproject/UI/MainController.java
246 lines
9.3 KiB
Java
246 lines
9.3 KiB
Java
package org.to.telegramfinalproject.UI;
|
||
|
||
import javafx.animation.PauseTransition;
|
||
import javafx.fxml.FXML;
|
||
import javafx.fxml.FXMLLoader;
|
||
import javafx.scene.Parent;
|
||
import javafx.scene.Scene;
|
||
import javafx.scene.control.*;
|
||
import javafx.stage.Stage;
|
||
import javafx.util.Duration;
|
||
import org.json.JSONObject;
|
||
import org.to.telegramfinalproject.Client.ClientConnection;
|
||
import org.to.telegramfinalproject.Database.userDatabase;
|
||
|
||
import java.io.IOException;
|
||
|
||
import static org.to.telegramfinalproject.UI.AppRouter.showLogin;
|
||
|
||
public class RegisterController {
|
||
|
||
@FXML private TextField userIdField;
|
||
@FXML private TextField usernameField;
|
||
@FXML private TextField profileNameField;
|
||
|
||
@FXML private PasswordField passwordField;
|
||
@FXML private TextField visiblePasswordField;
|
||
|
||
@FXML private PasswordField confirmPasswordField;
|
||
@FXML private TextField visibleConfirmPasswordField;
|
||
|
||
@FXML private Button togglePasswordBtn;
|
||
@FXML private Button toggleConfirmBtn;
|
||
|
||
@FXML private Label errorLabel;
|
||
|
||
private ClientConnection connection;
|
||
|
||
private boolean passwordVisible = false;
|
||
private boolean confirmVisible = false;
|
||
|
||
@FXML
|
||
public void initialize() {
|
||
|
||
try {
|
||
org.to.telegramfinalproject.Client.TelegramClient.getOrInitForUI();
|
||
} catch (Exception ignored) {
|
||
}
|
||
visiblePasswordField.textProperty().bindBidirectional(passwordField.textProperty());
|
||
visibleConfirmPasswordField.textProperty().bindBidirectional(confirmPasswordField.textProperty());
|
||
}
|
||
|
||
@FXML
|
||
private void togglePasswordVisibility() {
|
||
passwordVisible = !passwordVisible;
|
||
visiblePasswordField.setVisible(passwordVisible);
|
||
visiblePasswordField.setManaged(passwordVisible);
|
||
passwordField.setVisible(!passwordVisible);
|
||
passwordField.setManaged(!passwordVisible);
|
||
togglePasswordBtn.setText(passwordVisible ? "👁" : "👁");
|
||
}
|
||
|
||
@FXML
|
||
private void toggleConfirmPasswordVisibility() {
|
||
confirmVisible = !confirmVisible;
|
||
visibleConfirmPasswordField.setVisible(confirmVisible);
|
||
visibleConfirmPasswordField.setManaged(confirmVisible);
|
||
confirmPasswordField.setVisible(!confirmVisible);
|
||
confirmPasswordField.setManaged(!confirmVisible);
|
||
toggleConfirmBtn.setText(confirmVisible ? "👁" : "👁");
|
||
}
|
||
|
||
// @FXML
|
||
// private void handleRegister() {
|
||
// String userID = userIdField.getText().trim();
|
||
// String username = usernameField.getText().trim();
|
||
// String profileName = profileNameField.getText().trim();
|
||
// String password = passwordField.getText();
|
||
// String confirmPass = confirmPasswordField.getText();
|
||
//
|
||
// userDatabase userDb = new userDatabase();
|
||
// String passwordRegex = "\\b(?=[^\\s]*[A-Z])(?=[^\\s]*[a-z])(?=[^\\s]*\\d)(?=[^\\s]*[!@#$%^&*])[^\\s]{8,}\\b";
|
||
//
|
||
// // 1. Empty fields
|
||
// if (userID.isEmpty() || username.isEmpty() || profileName.isEmpty() || password.isEmpty() || confirmPass.isEmpty()) {
|
||
// showError("Please fill in all required fields.");
|
||
// return;
|
||
// }
|
||
//
|
||
// // 2. Username exists
|
||
// if (userDb.existsByUsername(username)) {
|
||
// showError("This username is already taken.");
|
||
// return;
|
||
// }
|
||
//
|
||
// // 3. User ID exists
|
||
// if (userDb.existsByUserId(userID)) {
|
||
// showError("This user ID is already taken.");
|
||
// return;
|
||
// }
|
||
//
|
||
// // 4. Password mismatch
|
||
// if (!password.equals(confirmPass)) {
|
||
// showError("Passwords do not match.");
|
||
// return;
|
||
// }
|
||
//
|
||
// // 5. Weak password
|
||
// if (!password.matches(passwordRegex)) {
|
||
// showError("Password must be at least 8 characters, include a capital letter, a number, and a special character.");
|
||
// return;
|
||
// }
|
||
//
|
||
// // 6. Attempt registration
|
||
// try {
|
||
// JSONObject request = new JSONObject();
|
||
// request.put("action", "register");
|
||
// request.put("user_id", userID);
|
||
// request.put("username", username);
|
||
// request.put("password", password);
|
||
// request.put("profile_name", profileName);
|
||
// connection.send(request.toString());
|
||
//
|
||
// // Simulate successful registration (since main.fxml isn’t ready)
|
||
// Alert alert = new Alert(Alert.AlertType.INFORMATION, "Registration successful!");
|
||
// alert.show();
|
||
//
|
||
// } catch (Exception ex) {
|
||
// showError("Failed to register. Please try again later.");
|
||
// }
|
||
// }
|
||
|
||
|
||
|
||
@FXML
|
||
private void handleRegister() {
|
||
String userID = userIdField.getText().trim();
|
||
String username = usernameField.getText().trim();
|
||
String profileName = profileNameField.getText().trim();
|
||
String password = passwordField.getText();
|
||
String confirmPass = confirmPasswordField.getText();
|
||
|
||
userDatabase userDb = new userDatabase();
|
||
String passwordRegex = "\\b(?=[^\\s]*[A-Z])(?=[^\\s]*[a-z])(?=[^\\s]*\\d)(?=[^\\s]*[!@#$%^&*])[^\\s]{8,}\\b";
|
||
|
||
// اعتبارسنجیها
|
||
if (userID.isEmpty() || username.isEmpty() || profileName.isEmpty() || password.isEmpty() || confirmPass.isEmpty()) {
|
||
showError("Please fill in all required fields."); return;
|
||
}
|
||
if (userDb.existsByUsername(username)) { showError("This username is already taken."); return; }
|
||
if (userDb.existsByUserId(userID)) { showError("This user ID is already taken."); return; }
|
||
if (!password.equals(confirmPass)) { showError("Passwords do not match."); return; }
|
||
if (!password.matches(passwordRegex)) { showError("Password must be at least 8 characters, include a capital letter, a number, and a special character."); return; }
|
||
|
||
// UI را موقتاً disable کن (اختیاری)
|
||
setBusy(true);
|
||
|
||
new Thread(() -> {
|
||
try {
|
||
// 1) مطمئن شو کانکشن/لیسنر روشن است
|
||
var cli = org.to.telegramfinalproject.Client.TelegramClient.getOrInitForUI();
|
||
var handler = cli.getHandler();
|
||
|
||
// 2) Register
|
||
var regReq = new org.json.JSONObject()
|
||
.put("action", "register")
|
||
.put("user_id", userID)
|
||
.put("username", username)
|
||
.put("password", password)
|
||
.put("profile_name", profileName);
|
||
|
||
var regResp = org.to.telegramfinalproject.Client.ActionHandler.sendWithResponse(regReq);
|
||
if (regResp == null || !"success".equalsIgnoreCase(regResp.optString("status"))) {
|
||
javafx.application.Platform.runLater(() -> {
|
||
setBusy(false);
|
||
showError(regResp != null ? regResp.optString("message","Register failed.") : "Register failed.");
|
||
});
|
||
return;
|
||
}
|
||
|
||
// 3) Auto-Login با همان کانکشن
|
||
handler.login(username, password);
|
||
|
||
javafx.application.Platform.runLater(() -> {
|
||
setBusy(false);
|
||
if (org.to.telegramfinalproject.Client.Session.currentUser == null || !handler.wasSuccess()) {
|
||
showError(handler.getLastMessage().isEmpty() ? "Login failed." : handler.getLastMessage());
|
||
return;
|
||
}
|
||
org.to.telegramfinalproject.UI.AppRouter.showMain();
|
||
});
|
||
|
||
} catch (Exception ex) {
|
||
javafx.application.Platform.runLater(() -> {
|
||
setBusy(false);
|
||
showError("Failed to register/login: " + ex.getMessage());
|
||
});
|
||
}
|
||
}, "register-thread").start();
|
||
}
|
||
|
||
private void setBusy(boolean b){
|
||
userIdField.setDisable(b);
|
||
usernameField.setDisable(b);
|
||
profileNameField.setDisable(b);
|
||
passwordField.setDisable(b);
|
||
visiblePasswordField.setDisable(b);
|
||
confirmPasswordField.setDisable(b);
|
||
visibleConfirmPasswordField.setDisable(b);
|
||
togglePasswordBtn.setDisable(b);
|
||
toggleConfirmBtn.setDisable(b);
|
||
}
|
||
|
||
|
||
|
||
@FXML
|
||
private void switchToLogin() throws IOException {
|
||
showLogin();
|
||
}
|
||
|
||
private void switchScene(String fxmlFile) {
|
||
try {
|
||
FXMLLoader loader = new FXMLLoader(getClass().getResource("/org/to/telegramfinalproject/" + fxmlFile));
|
||
Parent root = loader.load();
|
||
Stage stage = (Stage) usernameField.getScene().getWindow();
|
||
stage.setScene(new Scene(root, 500, 700));
|
||
stage.show();
|
||
} catch (IOException e) {
|
||
e.printStackTrace();
|
||
showError("Could not load scene: " + fxmlFile);
|
||
}
|
||
}
|
||
|
||
private void showError(String message) {
|
||
errorLabel.setVisible(false);
|
||
errorLabel.setText(""); // Clear the label text
|
||
|
||
PauseTransition pause = new PauseTransition(Duration.millis(50));
|
||
pause.setOnFinished(event -> {
|
||
errorLabel.setText(message);
|
||
errorLabel.setStyle("-fx-text-fill: red;"); // 🔴 force red
|
||
errorLabel.setVisible(true);
|
||
});
|
||
pause.play();
|
||
}
|
||
}
|