瀏覽代碼

Fixes for Log Out

painor 5 年之前
父節點
當前提交
a5657a3e03

+ 7 - 0
src/api/gramjs/client.ts

@@ -87,9 +87,16 @@ export async function init(sessionId: string) {
   }
 }
 
+<<<<<<< HEAD
 <<<<<<< HEAD
 export async function invokeRequest<T extends InstanceType<GramJsApi.AnyRequest>>(request: T) {
 =======
+=======
+export async function destroy() {
+  await client.destroy();
+}
+
+>>>>>>> 5143ac4c... Fixes for Log Out
 function onUpdate(update: any) {
   if (update instanceof connection.UpdateConnectionState) {
     isConnected = update.state === connection.UpdateConnectionState.states.connected;

+ 16 - 0
src/api/gramjs/sdk.ts

@@ -1,9 +1,18 @@
 import {
   provideAuthPhoneNumber, provideAuthCode, provideAuthPassword, provideAuthRegistration,
 } from './connectors/auth';
+<<<<<<< HEAD
 import { fetchChats } from './connectors/chats';
 import { fetchMessages, sendMessage } from './connectors/messages';
 import { downloadMedia } from './client';
+=======
+import { fetchChats, fetchFullChat, fetchChatOnlines } from './connectors/chats';
+import {
+  fetchMessages, sendMessage, pinMessage, deleteMessages, markMessagesRead,
+} from './connectors/messages';
+import { fetchFullUser, fetchNearestCountry } from './connectors/users';
+import { destroy, downloadMedia } from './client';
+>>>>>>> 5143ac4c... Fixes for Log Out
 
 export default {
   provideAuthPhoneNumber,
@@ -13,5 +22,12 @@ export default {
   fetchChats,
   fetchMessages,
   sendMessage,
+<<<<<<< HEAD
+=======
+  pinMessage,
+  deleteMessages,
+  markMessagesRead,
+  destroy,
+>>>>>>> 5143ac4c... Fixes for Log Out
   downloadMedia,
 };

+ 19 - 0
src/lib/gramjs/client/TelegramClient.js

@@ -218,6 +218,25 @@ class TelegramClient {
         }
     }
 
+<<<<<<< HEAD
+=======
+    /**
+     * Disconnects all senders and removes all handlers
+     * @returns {Promise<void>}
+     */
+    async destroy() {
+        await Promise.all([
+            this.disconnect(),
+            this.session.delete(),
+            ...Object.values(this._borrowedSenderPromises).map((promise) => {
+                return promise
+                    .then((sender) => sender.disconnect())
+            })
+        ]);
+
+        this._eventBuilders = []
+    }
+>>>>>>> 5143ac4c... Fixes for Log Out
 
     async _switchDC(newDc) {
         this._log.info(`Reconnecting to new data center ${newDc}`)

+ 6 - 0
src/lib/gramjs/sessions/CacheApiSession.js

@@ -96,6 +96,12 @@ class CacheApi extends MemorySession {
 
         await saveToCache(this._storageKey, JSON.stringify(sessionData))
     }
+
+    async delete() {
+        const request = new Request(this._storageKey)
+        const cache = await self.caches.open(CACHE_NAME)
+        await cache.delete(request)
+    }
 }
 
 function generateStorageKey() {

+ 7 - 6
src/modules/gramjs/actions/system.ts

@@ -66,11 +66,12 @@ addReducer('saveSession', (global, actions, payload) => {
 
 
 addReducer('signOut', () => {
-  const sessionId = localStorage.getItem(GRAMJS_SESSION_ID_KEY);
-  if (sessionId) {
-    localStorage.removeItem(sessionId);
-    localStorage.removeItem(GRAMJS_SESSION_ID_KEY);
-  }
+  void signOut();
+});
+
+async function signOut() {
+  await callSdk('destroy');
+  localStorage.removeItem(GRAMJS_SESSION_ID_KEY);
 
   getDispatch().init();
-});
+}

+ 81 - 0
src/modules/selectors/messages.ts

@@ -0,0 +1,81 @@
+import { GlobalState } from '../../store/types';
+import { ApiMessage, ApiMessageOutgoingStatus, ApiUser } from '../../api/types';
+import { selectChat, selectIsChatWithSelf } from './chats';
+import {
+  getMessageKey,
+  getSendingState, isChannel, isMessageLocal, isPrivateChat, isSuperGroup,
+} from '../helpers';
+import { selectUser } from './users';
+
+export function selectChatMessages(global: GlobalState, chatId: number) {
+  const byChatId = global.messages.byChatId[chatId];
+
+  return byChatId ? byChatId.byId : null;
+}
+
+export function selectChatMessage(global: GlobalState, chatId: number, messageId: number) {
+  const chatMessages = selectChatMessages(global, chatId);
+
+  return chatMessages ? chatMessages[messageId] : null;
+}
+
+export function selectIsUnread(global: GlobalState, message: ApiMessage) {
+  const chat = selectChat(global, message.chat_id);
+
+  return isMessageLocal(message) || (chat && chat.last_read_outbox_message_id < message.id);
+}
+
+export function selectOutgoingStatus(global: GlobalState, message: ApiMessage): ApiMessageOutgoingStatus {
+  if (!selectIsUnread(global, message)) {
+    return 'read';
+  }
+
+  const sendingState = getSendingState(message);
+
+  if (sendingState === 'succeeded') {
+    const chat = selectChat(global, message.chat_id);
+    if (chat && selectIsChatWithSelf(global, chat)) {
+      return 'read';
+    }
+  }
+
+  return sendingState;
+}
+
+export function selectSender(global: GlobalState, message: ApiMessage): ApiUser | undefined {
+  if (message.sender_user_id) {
+    return selectUser(global, message.sender_user_id);
+  }
+
+  return message.forward_info ? selectUser(global, message.forward_info.origin.sender_user_id) : undefined;
+}
+
+export function selectIsOwnMessage(global: GlobalState, message: ApiMessage): boolean {
+  return message.sender_user_id === global.currentUserId;
+}
+
+export function selectAllowedMessagedActions(global: GlobalState, message: ApiMessage) {
+  const chat = selectChat(global, message.chat_id);
+  const isPrivate = isPrivateChat(chat.id);
+  const isChatWithSelf = isPrivate && selectIsChatWithSelf(global, chat);
+  const isChatChannel = isChannel(chat);
+  const isOwnMessage = selectIsOwnMessage(global, message);
+  const isSuperGroupOrChannel = isChatChannel || isSuperGroup(chat);
+  const isAdminOrOwner = !isPrivate && false; // TODO Implement.
+
+  const canReply = !isChatChannel;
+  const canPin = isChatWithSelf || (isSuperGroupOrChannel && isAdminOrOwner);
+  const canDelete = isOwnMessage || !isSuperGroupOrChannel || isAdminOrOwner;
+  const canDeleteForAll = canDelete && !isChatWithSelf && (isOwnMessage || isPrivate || isAdminOrOwner);
+
+  return {
+    canReply, canPin, canDelete, canDeleteForAll,
+  };
+}
+
+export function selectFileTransferProgress(global: GlobalState, message: ApiMessage) {
+  const messageKey = getMessageKey(message.chat_id, message.id);
+  const fileTransfer = global.fileTransfers.byMessageKey[messageKey];
+
+  return fileTransfer ? fileTransfer.progress : undefined;
+}