From fd18c75cd966a6fcbd0ce8b2b27de6875fb7fc28 Mon Sep 17 00:00:00 2001 From: Partow Roshani Date: Fri, 5 Sep 2025 01:40:05 +0330 Subject: [PATCH] handle save message from sidebar --- .../telegramfinalproject/Client/Session.java | 60 ++++++++++++ .../Models/ChatEntry.java | 3 + .../UI/MainController.java | 2 +- .../UI/SidebarMenuController.java | 97 ++++++++++++++++--- 4 files changed, 147 insertions(+), 15 deletions(-) diff --git a/src/main/java/org/to/telegramfinalproject/Client/Session.java b/src/main/java/org/to/telegramfinalproject/Client/Session.java index f4f9475..b6fcb77 100644 --- a/src/main/java/org/to/telegramfinalproject/Client/Session.java +++ b/src/main/java/org/to/telegramfinalproject/Client/Session.java @@ -113,4 +113,64 @@ public class Session { public void setDownloadIndex(DownloadsIndex idx){ this.downloadsIndex = idx; } + + // ==== ADD to Session class ==== + + /** پیدا کردن چت با internal_id */ + public static ChatEntry findChatByInternalId(UUID internalId) { + for (ChatEntry c : chatList) { + if (c.getId().equals(internalId)) return c; + } + return null; + } + + /** درج در ابتدای لیست (با جلوگیری از دوبل) و سپس resort + refresh */ + public static void prependChat(ChatEntry entry) { + // اگر قبلاً تو لیست هست، اول پاکش کن + chatList.removeIf(c -> c.getId().equals(entry.getId())); + // اول لیست بذار + chatList.add(0, entry); + resortAndRefresh(); + } + + /** سورت بر اساس lastMessageTime (نزولی) و آپدیت active/archived */ + public static void resortAndRefresh() { + chatList.sort((c1, c2) -> { + if (c1.getLastMessageTime() == null && c2.getLastMessageTime() == null) return 0; + if (c1.getLastMessageTime() == null) return 1; + if (c2.getLastMessageTime() == null) return -1; + return c2.getLastMessageTime().compareTo(c1.getLastMessageTime()); + }); + refreshChatLists(); + } + + + public static ChatEntry upsertSavedMessages(UUID chatId, String name, String chatType, String imageUrlIfAny) { + ChatEntry existing = findChatByInternalId(chatId); + if (existing != null) { + // برای اینکه بیاد بالا، می‌تونی زمان آخرین پیام رو الان بذاری (اختیاری) + if (existing.getLastMessageTime() == null) { + existing.setLastMessageTime(LocalDateTime.now()); + resortAndRefresh(); + } + return existing; + } + + ChatEntry entry = new ChatEntry( + chatId, + "", // displayId برای Saved لازم نیست + (name == null || name.isBlank()) ? "Saved Messages" : name, + imageUrlIfAny == null ? "" : imageUrlIfAny, + (chatType == null || chatType.isBlank()) ? "private" : chatType, + LocalDateTime.now(), // بذار بالا بیاد + true, // owner? برای self-chat می‌تونه true باشه (اثری روی permission نداره) + true // admin? اختیاری—تأثیر خاصی نداره؛ می‌تونی false بذاری + ); + // اگر توی UI برای Saved Messages آیکن خاص داری، اینجا ست کن: + // entry.setImageUrl("/org/to/telegramfinalproject/Icons/saved_messages_dark.png"); + + prependChat(entry); + return entry; + } + } \ No newline at end of file diff --git a/src/main/java/org/to/telegramfinalproject/Models/ChatEntry.java b/src/main/java/org/to/telegramfinalproject/Models/ChatEntry.java index 09b6964..f66c169 100644 --- a/src/main/java/org/to/telegramfinalproject/Models/ChatEntry.java +++ b/src/main/java/org/to/telegramfinalproject/Models/ChatEntry.java @@ -207,4 +207,7 @@ public class ChatEntry { } + + + } diff --git a/src/main/java/org/to/telegramfinalproject/UI/MainController.java b/src/main/java/org/to/telegramfinalproject/UI/MainController.java index 0c135cb..cdcab0d 100644 --- a/src/main/java/org/to/telegramfinalproject/UI/MainController.java +++ b/src/main/java/org/to/telegramfinalproject/UI/MainController.java @@ -156,7 +156,7 @@ public class MainController { } - private void refreshChatListUI() { + void refreshChatListUI() { Platform.runLater(() -> { chatListContainer.getChildren().clear(); itemControllers.clear(); diff --git a/src/main/java/org/to/telegramfinalproject/UI/SidebarMenuController.java b/src/main/java/org/to/telegramfinalproject/UI/SidebarMenuController.java index 267a0ff..c8a4b20 100644 --- a/src/main/java/org/to/telegramfinalproject/UI/SidebarMenuController.java +++ b/src/main/java/org/to/telegramfinalproject/UI/SidebarMenuController.java @@ -19,10 +19,12 @@ import javafx.util.Duration; import org.json.JSONObject; import org.to.telegramfinalproject.Client.ActionHandler; import org.to.telegramfinalproject.Client.AvatarLocalResolver; +import org.to.telegramfinalproject.Models.ChatEntry; import java.io.IOException; import java.net.URL; +import java.util.UUID; public class SidebarMenuController { @@ -266,7 +268,86 @@ public class SidebarMenuController { } } - private void openSavedMessages() { System.out.println("Opening Saved Messages..."); } + + + private void openSavedMessages() { + try { + // 1) درخواست به سرور + JSONObject req = new JSONObject().put("action", "get_or_create_saved_messages"); + JSONObject res = ActionHandler.sendWithResponse(req); + + if (res == null || !"success".equals(res.optString("status"))) { + String msg = (res != null) ? res.optString("message", "Unknown error") : "No response"; + showAlert("Saved Messages", "Failed: " + msg, Alert.AlertType.ERROR); + return; + } + + JSONObject data = res.optJSONObject("data"); + if (data == null) { + showAlert("Saved Messages", "Malformed response.", Alert.AlertType.ERROR); + return; + } + + // 2) داده‌ها + String chatIdStr = data.optString("chat_id", null); + if (chatIdStr == null || chatIdStr.isBlank()) { + showAlert("Saved Messages", "Missing chat_id.", Alert.AlertType.ERROR); + return; + } + UUID chatId = UUID.fromString(chatIdStr); + String name = data.optString("name", "Saved Messages"); + String chatType = data.optString("chat_type", "private"); + boolean isSaved = data.optBoolean("is_saved_messages", true); + + // اگر آیکن اختصاصی برای Saved داری، این مسیر رو بده؛ وگرنه null بذار: + String savedIcon = ICON_PATH + (themeManager.isDarkMode() ? "saved_messages_light.png" : "saved_messages_dark.png"); + // اگر چنین آیکنی نداری، می‌تونی null بدی تا همان image_url خالی بماند: + // String savedIcon = null; + + // 3) درج/به‌روزرسانی در Session و بیاور اول لیست + ChatEntry entry = org.to.telegramfinalproject.Client.Session + .upsertSavedMessages(chatId, name, chatType, savedIcon); + + // 4) وضعیت‌های فعلی سشن برای ناوبری + org.to.telegramfinalproject.Client.Session.currentChatId = chatId.toString(); + org.to.telegramfinalproject.Client.Session.currentChatType = chatType; + org.to.telegramfinalproject.Client.Session.currentChatEntry = entry; + org.to.telegramfinalproject.Client.Session.backToChatList = false; + + // 5) ریفِرش ظاهری لیست چت‌ها (اگر متدی برای این داری، صدا بزن) + try { + MainController.getInstance().refreshChatListUI(); // اگر متد دیگری داری عوضش کن + } catch (Throwable ignore) { } + + // 6) باز کردن چت + // --- مسیر اول: اگر متدی داری که با ChatEntry باز می‌کند: + boolean opened = false; + try { + MainController.getInstance().openChat(entry); + opened = true; + } catch (Throwable t) { + // مسیر دوم: اگر با id/type باز می‌کنی، یا اول info می‌گیری: + try { + ActionHandler.requestChatInfo(String.valueOf(chatId), chatType); + // اگر متد آشکار برای باز کردن با id داری، اینجا صدا بزن: + // MainController.getInstance().openChatById(chatId, chatType); + opened = true; + } catch (Throwable t2) { + t2.printStackTrace(); + } + } + + if (!opened) { + // اگر هیچ‌کدام نداشت، حداقل پیغام بده که چت ساخته و آماده است: + System.out.println("Saved Messages ready. Open manually with currentChatId/currentChatType."); + } + + } catch (Exception ex) { + ex.printStackTrace(); + showAlert("Saved Messages", "Error: " + ex.getMessage(), Alert.AlertType.ERROR); + } + } + private void openSettings() { try { @@ -304,19 +385,7 @@ public class SidebarMenuController { if (pic != null) profileImage.setImage(pic); } - // کمک‌کننده: هم URL و هم ریسورس کلاس‌پث را امتحان می‌کند -// private Image tryLoadImage(String src) { -// if (src == null || src.isBlank()) return null; -// try { -// // اگر ریسورس داخل پروژه است (با / شروع شود یا در resources موجود باشد) -// var res = getClass().getResource(src); -// if (res != null) return new Image(res.toExternalForm(), true); -// // در غیر این صورت فرض کن URL است (http/https/file) -// return new Image(src, true); -// } catch (Exception ignored) { -// return null; -// } -// } + private Image tryLoadImage(String src) {