handle save message from sidebar

This commit is contained in:
2025-09-05 01:40:05 +03:30
parent 297696fba1
commit fd18c75cd9
4 changed files with 147 additions and 15 deletions
@@ -113,4 +113,64 @@ public class Session {
public void setDownloadIndex(DownloadsIndex idx){ this.downloadsIndex = idx; } 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;
}
} }
@@ -207,4 +207,7 @@ public class ChatEntry {
} }
} }
@@ -156,7 +156,7 @@ public class MainController {
} }
private void refreshChatListUI() { void refreshChatListUI() {
Platform.runLater(() -> { Platform.runLater(() -> {
chatListContainer.getChildren().clear(); chatListContainer.getChildren().clear();
itemControllers.clear(); itemControllers.clear();
@@ -19,10 +19,12 @@ import javafx.util.Duration;
import org.json.JSONObject; import org.json.JSONObject;
import org.to.telegramfinalproject.Client.ActionHandler; import org.to.telegramfinalproject.Client.ActionHandler;
import org.to.telegramfinalproject.Client.AvatarLocalResolver; import org.to.telegramfinalproject.Client.AvatarLocalResolver;
import org.to.telegramfinalproject.Models.ChatEntry;
import java.io.IOException; import java.io.IOException;
import java.net.URL; import java.net.URL;
import java.util.UUID;
public class SidebarMenuController { 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() { private void openSettings() {
try { try {
@@ -304,19 +385,7 @@ public class SidebarMenuController {
if (pic != null) profileImage.setImage(pic); 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) { private Image tryLoadImage(String src) {