handle save message from sidebar
This commit is contained in:
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user