/* * Copyright (C) 2015 Actor LLC. <https://actor.im> */ package im.actor.core.js.entity; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.core.client.JsArray; import com.google.gwt.core.client.JsArrayInteger; import com.google.gwt.core.client.JsArrayString; import com.google.gwt.core.client.JsDate; import com.google.gwt.user.datepicker.client.CalendarUtil; import java.util.Date; import im.actor.core.api.ApiTextExMarkdown; import im.actor.core.entity.Message; import im.actor.core.entity.Peer; import im.actor.core.entity.Reaction; import im.actor.core.entity.content.ContactContent; import im.actor.core.entity.content.DocumentContent; import im.actor.core.entity.content.FileLocalSource; import im.actor.core.entity.content.FileRemoteSource; import im.actor.core.entity.content.LocationContent; import im.actor.core.entity.content.PhotoContent; import im.actor.core.entity.content.ServiceContent; import im.actor.core.entity.content.TextContent; import im.actor.core.entity.content.VoiceContent; import im.actor.core.js.JsMessenger; import im.actor.runtime.crypto.Base64Utils; import im.actor.runtime.js.mvvm.JsEntityConverter; public class JsMessage extends JavaScriptObject { public static final JsEntityConverter<Message, JsMessage> CONVERTER = new JsEntityConverter<Message, JsMessage>() { @Override public boolean isSupportOverlays() { return true; } @Override public JavaScriptObject buildOverlay(Message prev, Message current, Message next) { Date nextDate = next != null ? new Date(next.getDate()) : null; Date currentDate = new Date(current.getDate()); boolean showDate; String dateDiv = null; if (next != null) { showDate = !CalendarUtil.isSameDate(nextDate, currentDate); } else { showDate = true; } if (showDate) { dateDiv = JsMessenger.getInstance().getFormatter().formatMonth(currentDate); } boolean useCompact = false; if (next != null && !showDate) { if (next.getSenderId() == current.getSenderId()) { if (next.getDate() - current.getDate() < 10 * 60 * 1000) { useCompact = true; } } } return JsMessageOverlay.create(useCompact, dateDiv); } @Override public JsMessage convert(Message value) { JsMessenger messenger = JsMessenger.getInstance(); String rid = value.getRid() + ""; String sortKey = value.getSortDate() + ""; JsPeerInfo sender = messenger.buildPeerInfo(Peer.user(value.getSenderId())); boolean isOut = value.getSenderId() == messenger.myUid(); boolean isOnServer = value.isOnServer(); String date = messenger.getFormatter().formatTime(value.getDate()); JsDate fullDate = JsDate.create(value.getDate()); JsContent content = JsContent.createContent(value.getContent(), value.getSenderId()); JsArray<JsReaction> reactions = JsArray.createArray().cast(); for (Reaction r : value.getReactions()) { JsArrayInteger uids = (JsArrayInteger) JsArrayInteger.createArray(); boolean isOwnSet = false; for (Integer i : r.getUids()) { uids.push(i); if (i == messenger.myUid()) { isOwnSet = true; } } reactions.push(JsReaction.create(r.getCode(), uids, isOwnSet)); } double sortDate = value.getDate() / 1000.0; return create(rid, sortKey, sender, isOut, date, fullDate, Enums.convert(value.getMessageState()), isOnServer, content, reactions, sortDate); } }; public native static JsMessage create(String rid, String sortKey, JsPeerInfo sender, boolean isOut, String date, JsDate fullDate, String state, boolean isOnServer, JsContent content, JsArray<JsReaction> reactions, double sortDate)/*-{ return { rid: rid, sortKey: sortKey, sender: sender, isOut: isOut, date: date, fullDate: fullDate, state: state, isOnServer: isOnServer, content: content, reactions: reactions, sortDate: sortDate }; }-*/; protected JsMessage() { } public native final String getSortKey()/*-{ return this.sortKey; }-*/; public native final boolean isOnServer()/*-{ return this.isOnServer; }-*/; }