199 lines
No EOL
5.1 KiB
TypeScript
199 lines
No EOL
5.1 KiB
TypeScript
import { loadChat, loadChatsSorted, loadLatestMessages, loadMedia, loadOlderMessages, upsertChats, upsertMedia, upsertMessages } from "./db";
|
|
import { waha } from "./waha";
|
|
import type { Chat, Message, AppUser, ContactInfo, UserAboutResponse, ChatPictureResponse, StatusResponse, DownloadedMedia, GroupUser, Contact } from "./types";
|
|
|
|
let online = false;
|
|
let chats: Chat[] = [];
|
|
|
|
export async function updateOnlineStatus(): Promise<void> {
|
|
try {
|
|
await waha.getVersion();
|
|
online = true;
|
|
} catch (error) {
|
|
console.log(error);
|
|
online = false;
|
|
}
|
|
}
|
|
|
|
export async function fetchChats(): Promise<void> {
|
|
if (online) {
|
|
await getRemoteChats()
|
|
}
|
|
chats = await loadChatsSorted();
|
|
}
|
|
|
|
export async function getRemoteChats(): Promise<void> {
|
|
const u = await waha.getChats();
|
|
|
|
const mapped: Chat[] = u.map(chat => ({
|
|
id: chat.id,
|
|
name: chat.name,
|
|
lastMessage: chat.lastMessage,
|
|
timestamp: chat.timestamp,
|
|
unreadCount: chat.unreadCount ?? 0
|
|
}));
|
|
|
|
await upsertChats(mapped);
|
|
}
|
|
|
|
export function getUsers(): Chat[] {
|
|
return chats.filter(c => c.id.endsWith("@c.us"));
|
|
}
|
|
|
|
export function getGroups(): Chat[] {
|
|
return chats.filter(c => c.id.endsWith("@g.us"));
|
|
}
|
|
|
|
export async function getUser(number: string): Promise<ContactInfo | undefined> {
|
|
if (online) {
|
|
return await waha.getUser(number);
|
|
} else {
|
|
return;
|
|
}
|
|
}
|
|
|
|
export async function getUserAbout(userId: string): Promise<UserAboutResponse | undefined> {
|
|
if (online) {
|
|
return await waha.getUserAbout(userId);
|
|
} else {
|
|
return;
|
|
}
|
|
}
|
|
|
|
export async function getContact(id: string): Promise<Contact | undefined> {
|
|
if (online) {
|
|
return await waha.getContact(id);
|
|
} else {
|
|
return;
|
|
}
|
|
}
|
|
|
|
export function getChats(): Chat[] {
|
|
return chats;
|
|
}
|
|
|
|
export async function getAppUser(): Promise<AppUser> {
|
|
if (online) {
|
|
const info = await waha.getMyInfo();
|
|
localStorage.setItem('pandora-last-username', info.pushName || info.name || '');
|
|
localStorage.setItem('pandora-last-userid', info.id);
|
|
return info;
|
|
} else {
|
|
return {
|
|
pushName: localStorage.getItem('pandora-last-username') || 'Unknown',
|
|
name: localStorage.getItem('pandora-last-username') || 'Unknown',
|
|
id: localStorage.getItem('pandora-last-userid') || 'Unknown'
|
|
} as AppUser;
|
|
}
|
|
}
|
|
|
|
export async function getMessage(chatId: string, msgId: string, downloadMedia: boolean): Promise<Message> {
|
|
if (online) {
|
|
const newMessage = await waha.getSingleChatMessage(chatId, msgId, downloadMedia);
|
|
upsertMessages([newMessage]);
|
|
return newMessage;
|
|
} else {
|
|
return {
|
|
id: `${Date.now()}-temp`,
|
|
body: "You're offline",
|
|
from: "system",
|
|
timestamp: new Date().toISOString()
|
|
} as Message;
|
|
}
|
|
}
|
|
|
|
export async function getMedia(reqId: string): Promise<DownloadedMedia | undefined> {
|
|
const cached = await loadMedia(reqId);
|
|
if (cached) {
|
|
return { blob: cached.blob, filename: cached.filename };
|
|
}
|
|
|
|
try {
|
|
if (online) {
|
|
const media = await waha.downloadMedia(reqId);
|
|
upsertMedia(reqId, media.blob, media.filename);
|
|
return media;
|
|
}
|
|
} catch (error) {
|
|
return;
|
|
}
|
|
}
|
|
|
|
export async function getChatMessages(chatId: string): Promise<Message[]> {
|
|
if (online) {
|
|
const newMessages = await waha.getChatMessages(chatId);
|
|
upsertMessages(newMessages);
|
|
return newMessages;
|
|
} else {
|
|
return await loadLatestMessages(chatId);
|
|
}
|
|
}
|
|
|
|
export async function getMoreChatMessages(chatId: string, oldestTimestamp: any, oldestId: string): Promise<Message[]> {
|
|
if (online) {
|
|
return waha.getChatMessages(chatId, oldestTimestamp);
|
|
} else {
|
|
return await loadOlderMessages(chatId, oldestTimestamp, oldestId);
|
|
}
|
|
}
|
|
|
|
export async function getChatPicture(chatId: string): Promise<ChatPictureResponse> {
|
|
if (online) {
|
|
return await waha.getChatPicture(chatId);
|
|
} else {
|
|
return { url: "" };
|
|
}
|
|
}
|
|
|
|
export function isOnline(): boolean {
|
|
return online;
|
|
}
|
|
|
|
export async function sendStatus(text: string): Promise<StatusResponse> {
|
|
if (online) {
|
|
return await waha.setStatus(text);
|
|
} else {
|
|
return {
|
|
success: false
|
|
}
|
|
}
|
|
}
|
|
|
|
export async function markRead(chatId: string): Promise<Chat | undefined> {
|
|
if (online) {
|
|
await waha.readChat(chatId);
|
|
}
|
|
|
|
const chat = await loadChat(chatId);
|
|
if (chat) {
|
|
chat.unreadCount = 0;
|
|
// Note: upsertMessages was called with [chat] in JS, but chat is a Chat object, not Message.
|
|
// Keeping JS behavior but chat is Chat type here.
|
|
await upsertChats([chat]);
|
|
}
|
|
return chat;
|
|
}
|
|
|
|
export async function getGroupUsers(groupId: string): Promise<GroupUser[] | undefined> {
|
|
if (online) {
|
|
return await waha.getGroupUsers(groupId);
|
|
}
|
|
|
|
return undefined;
|
|
}
|
|
|
|
export async function getUsersFromGroup(users: (GroupUser | undefined)[]): Promise<(Contact | undefined)[]> {
|
|
if (!online) {
|
|
return users.map(() => undefined);
|
|
}
|
|
|
|
return Promise.all(
|
|
users.map(async u => {
|
|
if (u?.id._serialized) {
|
|
return await getContact(u.id._serialized);
|
|
}
|
|
|
|
return undefined;
|
|
})
|
|
);
|
|
} |