Files
Telegram-Final-Project/src/main/java/org/to/telegramfinalproject/UI/LoginController.java
T
2025-09-02 18:12:49 +03:30

208 lines
6.8 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package org.to.telegramfinalproject.UI;
import javafx.animation.PauseTransition;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.Parent;
import javafx.scene.control.*;
import javafx.stage.Stage;
import javafx.util.Duration;
import org.json.JSONObject;
import org.to.telegramfinalproject.Client.ActionHandler;
import org.to.telegramfinalproject.Client.ClientConnection;
import org.to.telegramfinalproject.Client.Session;
import org.to.telegramfinalproject.Client.TelegramClient;
import org.to.telegramfinalproject.Database.userDatabase;
import org.to.telegramfinalproject.Models.User;
import org.to.telegramfinalproject.Security.PasswordHashing;
import java.io.IOException;
import static org.to.telegramfinalproject.UI.AppRouter.showRegister;
public class LoginController {
@FXML private TextField usernameField;
@FXML private PasswordField passwordField;
@FXML private TextField visiblePasswordField;
@FXML private Button toggleVisibilityBtn;
@FXML private Label errorLabel;
private ClientConnection connection;
private boolean passwordVisible = false;
@FXML
public void initialize() {
// Sync hidden and visible password fields
visiblePasswordField.textProperty().bindBidirectional(passwordField.textProperty());
try {
connection = new ClientConnection("localhost", 8080);
} catch (Exception e) {
System.out.println("Could not connect to server: " + e.getMessage());
}
}
@FXML
private void togglePasswordVisibility() {
passwordVisible = !passwordVisible;
visiblePasswordField.setVisible(passwordVisible);
visiblePasswordField.setManaged(passwordVisible);
passwordField.setVisible(!passwordVisible);
passwordField.setManaged(!passwordVisible);
toggleVisibilityBtn.setText(passwordVisible ? "👁" : "👁");
}
// @FXML
// private void handleLogin() {
// String username = usernameField.getText();
// String password = passwordField.getText();
//
// // 1. Check for empty fields
// if (username.isEmpty() || password.isEmpty()) {
// showError("Please fill in all required fields.");
// return;
// }
//
// // 2. Check if username exists
// userDatabase userDb = new userDatabase();
// if (!userDb.existsByUsername(username)) {
// showError("This username doesnt exist.");
// return;
// }
//
// // 3. Check if password is correct
// User user = userDb.findByUsername(username);
// if (!PasswordHashing.verify(password, user.getPassword())) {
// showError("Incorrect password.");
// return;
// }
//
// // 4. Attempt to send to server
// try {
// JSONObject request = new JSONObject();
// request.put("action", "login");
// request.put("user_id", JSONObject.NULL);
// request.put("username", username);
// request.put("password", password);
// request.put("profile_name", JSONObject.NULL);
//
// if (connection != null) {
// connection.send(request.toString());
// String responseStr = connection.receive();
// JSONObject response = new JSONObject(responseStr);
// System.out.println("Status: " + response.getString("status"));
// System.out.println("Message: " + response.getString("message"));
//
// // Simulate successful login (since main.fxml isnt ready)
// Alert alert = new Alert(Alert.AlertType.INFORMATION, "Login successful!");
// alert.show();
// }
//
// } catch (Exception ex) {
// showError("Unable to connect to server. Please try again later.");
// }
// }
@FXML
private void handleLogin() {
String u = usernameField.getText().trim();
String p = passwordField.getText();
// 1. Check for empty fields
if (u.isEmpty() || p.isEmpty()) {
showError("Please fill in all required fields.");
return;
}
// 2. Check if username exists
userDatabase userDb = new userDatabase();
if (!userDb.existsByUsername(u)) {
showError("This username doesnt exist.");
return;
}
// 3. Check if password is correct
User user = userDb.findByUsername(u);
if (!PasswordHashing.verify(p, user.getPassword())) {
showError("Incorrect password.");
return;
}
setUiBusy(true);
new Thread(() -> {
try {
var cli = org.to.telegramfinalproject.Client.TelegramClient.getOrInitForUI();
var handler = cli.getHandler();
handler.login(u,p);
javafx.application.Platform.runLater(() -> {
setUiBusy(false);
if (!handler.wasSuccess() || Session.currentUser == null) {
showError(handler.getLastMessage().isEmpty() ? "Login failed." : handler.getLastMessage());
return;
}
// موفق: Session از داخل send پر شده
goMain(); // بدون Alert → مستقیم به main.fxml
});
} catch (Exception ex) {
javafx.application.Platform.runLater(() -> {
setUiBusy(false);
showError("Connection error.");
});
}
}, "login-thread").start();
}
private void goMain() {
AppRouter.showMain();
}
private void setUiBusy(boolean b) {
usernameField.setDisable(b);
passwordField.setDisable(b);
}
@FXML
private void switchToRegister() throws IOException {
showRegister();
}
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();
}
}