diff --git a/packages/delivery-service/src/delivery.test.ts b/packages/delivery-service/src/delivery.test.ts index 40f80c0a9..a12b05614 100644 --- a/packages/delivery-service/src/delivery.test.ts +++ b/packages/delivery-service/src/delivery.test.ts @@ -4,6 +4,7 @@ import express from 'express'; import request from 'supertest'; import winston from 'winston'; import delivery from './delivery'; +import { Redis, getDatabase, getRedisClient } from './persistence/getDatabase'; const keysA = { encryptionKeyPair: { @@ -24,7 +25,19 @@ const serverSecret = 'veryImportantSecret'; global.logger = winston.createLogger({ transports: [new winston.transports.Console()], }); + +let redisClient: Redis; describe('Delivery', () => { + beforeEach(async () => { + redisClient = await getRedisClient(); + await redisClient.flushDb(); + }); + + afterEach(async () => { + await redisClient.flushDb(); + await redisClient.disconnect(); + }); + describe('getMessages', () => { it('Returns 200 if schema is valid', async () => { const web3Provider = { @@ -81,7 +94,8 @@ describe('Delivery', () => { ); const db = { - getAccount: async (ensName: string) => ({ + ...(await getDatabase(redisClient)), + getSession: async (ensName: string) => ({ challenge: '123', token, }), @@ -89,10 +103,6 @@ describe('Delivery', () => { return (_: any, __: any, ___: any) => {}; }, getIdEnsName: async (ensName: string) => ensName, - syncAcknowledge: async ( - conversationId: string, - lastMessagePull: string, - ) => Promise, }; const app = express(); app.use(bodyParser.json()); @@ -102,18 +112,18 @@ describe('Delivery', () => { const { status } = await request(app) .post( - '/messages/0x99C19AB10b9EC8aC6fcda9586E81f6B73a298870/syncAcknoledgment/12345', + '/messages/0x99C19AB10b9EC8aC6fcda9586E81f6B73a298870/syncAcknowledgment/12345', ) .set({ authorization: `Bearer ${token}`, }) .send({ - acknoledgments: [ + acknowledgements: [ { contactAddress: '0x99C19AB10b9EC8aC6fcda9586E81f6B73a298870', - messageDeliveryServiceTimestamp: 123, + messageHash: 12345, }, ], }); @@ -131,7 +141,8 @@ describe('Delivery', () => { ); const db = { - getAccount: async (ensName: string) => ({ + ...(await getDatabase(redisClient)), + getSession: async (ensName: string) => ({ challenge: '123', token, }), @@ -140,6 +151,7 @@ describe('Delivery', () => { }, getIdEnsName: async (ensName: string) => ensName, }; + const app = express(); app.use(bodyParser.json()); app.use( @@ -148,14 +160,14 @@ describe('Delivery', () => { const { status } = await request(app) .post( - '/messages/0x99C19AB10b9EC8aC6fcda9586E81f6B73a298870/syncAcknoledgment/fooo', + '/messages/0x99C19AB10b9EC8aC6fcda9586E81f6B73a298870/syncAcknowledgment/fooo', ) .set({ authorization: `Bearer ${token}`, }) .send({ - acknoledgments: [], + syncAcknowledgment: [], }); expect(status).toBe(400); @@ -169,9 +181,9 @@ describe('Delivery', () => { const token = await createAuthToken( '0x99C19AB10b9EC8aC6fcda9586E81f6B73a298870', ); - const db = { - getAccount: async (ensName: string) => ({ + ...(await getDatabase(redisClient)), + getSession: async (ensName: string) => ({ challenge: '123', token, }), @@ -180,6 +192,7 @@ describe('Delivery', () => { }, getIdEnsName: async (ensName: string) => ensName, }; + const app = express(); app.use(bodyParser.json()); app.use( @@ -188,7 +201,7 @@ describe('Delivery', () => { const { status } = await request(app) .post( - '/messages/0x99C19AB10b9EC8aC6fcda9586E81f6B73a298870/syncAcknoledgment/1234', + '/messages/0x99C19AB10b9EC8aC6fcda9586E81f6B73a298870/syncAcknowledgment/1234', ) .set({ authorization: `Bearer ${token}`, diff --git a/packages/delivery-service/src/delivery.ts b/packages/delivery-service/src/delivery.ts index 6105edd95..ebefbc9a3 100644 --- a/packages/delivery-service/src/delivery.ts +++ b/packages/delivery-service/src/delivery.ts @@ -1,4 +1,4 @@ -import { Acknoledgment, getMessages, schema } from '@dm3-org/dm3-lib-delivery'; +import { Acknowledgment, getMessages, schema } from '@dm3-org/dm3-lib-delivery'; import { auth } from '@dm3-org/dm3-lib-server-side'; import { validateSchema } from '@dm3-org/dm3-lib-shared'; import { getConversationId } from '@dm3-org/dm3-lib-delivery'; @@ -8,24 +8,24 @@ import express from 'express'; import { IDatabase } from './persistence/getDatabase'; import { DeliveryServiceProfileKeys } from '@dm3-org/dm3-lib-profile'; -const syncAcknoledgmentParamsSchema = { +const syncAcknowledgementParamsSchema = { type: 'object', properties: { ensName: { type: 'string' }, - last_message_pull: { type: 'string' }, + messageHash: { type: 'string' }, }, - required: ['ensName', 'last_message_pull'], + required: ['ensName', 'messageHash'], additionalProperties: false, }; -const syncAcknoledgmentBodySchema = { +const syncAcknowledgementBodySchema = { type: 'object', properties: { - acknoledgments: { + acknowledgements: { type: 'array', - items: schema.Acknoledgment, + items: schema.Acknowledgment, }, }, - required: ['acknoledgments'], + required: ['acknowledgements'], additionalProperties: false, }; @@ -96,77 +96,20 @@ export default ( } }, ); - - //TODO remove after storage refactoring - router.post( - '/messages/:ensName/syncAcknoledgment/:last_message_pull', - async (req, res, next) => { - const hasValidParams = validateSchema( - syncAcknoledgmentParamsSchema, - req.params, - ); - - const hasValidBody = validateSchema( - syncAcknoledgmentBodySchema, - req.body, - ); - - // eslint-disable-next-line max-len - //Express transform number inputs into strings. So we have to check if a string used as last_message_pull can be converted to a number later on. - const isLastMessagePullNumber = !isNaN( - Number.parseInt(req.params.last_message_pull), - ); - - if (!hasValidParams || !isLastMessagePullNumber || !hasValidBody) { - return res.sendStatus(400); - } - - try { - const ensName = await db.getIdEnsName(req.params.ensName); - - await Promise.all( - req.body.acknoledgments.map(async (ack: Acknoledgment) => { - const contactEnsName = await db.getIdEnsName( - ack.contactAddress, - ); - const conversationId = getConversationId( - ensName, - contactEnsName, - ); - - await db.syncAcknowledge( - conversationId, - Number.parseInt(req.params.last_message_pull), - ); - }), - ); - - res.json(); - } catch (e) { - next(e); - } - }, - ); router.post( - '/messages/:ensName/syncAcknowledgment/:last_message_pull', + '/messages/:ensName/syncAcknowledgment/:messageHash', async (req, res, next) => { const hasValidParams = validateSchema( - syncAcknoledgmentParamsSchema, + syncAcknowledgementParamsSchema, req.params, ); const hasValidBody = validateSchema( - syncAcknoledgmentBodySchema, + syncAcknowledgementBodySchema, req.body, ); - // eslint-disable-next-line max-len - //Express transform number inputs into strings. So we have to check if a string used as last_message_pull can be converted to a number later on. - const isLastMessagePullNumber = !isNaN( - Number.parseInt(req.params.last_message_pull), - ); - - if (!hasValidParams || !isLastMessagePullNumber || !hasValidBody) { + if (!hasValidParams || !hasValidBody) { return res.sendStatus(400); } @@ -174,20 +117,22 @@ export default ( const ensName = await db.getIdEnsName(req.params.ensName); await Promise.all( - req.body.acknoledgments.map(async (ack: Acknoledgment) => { - const contactEnsName = await db.getIdEnsName( - ack.contactAddress, - ); - const conversationId = getConversationId( - ensName, - contactEnsName, - ); - - await db.syncAcknowledge( - conversationId, - Number.parseInt(req.params.last_message_pull), - ); - }), + req.body.acknowledgements.map( + async (ack: Acknowledgment) => { + const contactEnsName = await db.getIdEnsName( + ack.contactAddress, + ); + const conversationId = getConversationId( + ensName, + contactEnsName, + ); + + await db.syncAcknowledge( + conversationId, + req.params.messageHash, + ); + }, + ), ); res.json(); diff --git a/packages/delivery-service/src/persistence/getDatabase.ts b/packages/delivery-service/src/persistence/getDatabase.ts index 55a69eac2..573277af7 100644 --- a/packages/delivery-service/src/persistence/getDatabase.ts +++ b/packages/delivery-service/src/persistence/getDatabase.ts @@ -117,14 +117,13 @@ export interface IDatabase extends IAccountDatabase { createMessage: ( conversationId: string, envelop: EncryptionEnvelop, - createdAt?: number, ) => Promise; deleteExpiredMessages: (time: number) => Promise; getIdEnsName: (ensName: string) => Promise; syncAcknowledge: ( conversationId: string, - syncTime: number, - ) => Promise; + messageHash: string, + ) => Promise; getUsersNotificationChannels: ( ensName: string, ) => Promise; diff --git a/packages/delivery-service/src/persistence/messages/getIncomingMessages.ts b/packages/delivery-service/src/persistence/messages/getIncomingMessages.ts index 9be3689ca..9456f88b2 100644 --- a/packages/delivery-service/src/persistence/messages/getIncomingMessages.ts +++ b/packages/delivery-service/src/persistence/messages/getIncomingMessages.ts @@ -14,11 +14,13 @@ export function getIncomingMessages(redis: Redis) { { REV: true }, ); - //For each conversation we're fetching the last 10 messages - const conversations = await Promise.all( + console.log('conversationIds', conversationIds); + + //For each conversation we're fetching the latest messages + const messages = await Promise.all( conversationIds.map((id) => getMessages(redis)(id, 0, limit)), ); - return conversations.reduce((acc, cur) => [...acc, ...cur], []); + return messages.reduce((acc, cur) => [...acc, ...cur], []); }; } diff --git a/packages/delivery-service/src/persistence/messages/syncAcknowledge.test.ts b/packages/delivery-service/src/persistence/messages/syncAcknowledge.test.ts index 607873757..a956140c7 100644 --- a/packages/delivery-service/src/persistence/messages/syncAcknowledge.test.ts +++ b/packages/delivery-service/src/persistence/messages/syncAcknowledge.test.ts @@ -28,7 +28,20 @@ describe('Sync Acknowledge', () => { }); it('Removes acknowledged messages from DS', async () => { - const envelop: EncryptionEnvelop = { + const envelop1: EncryptionEnvelop = { + message: '', + metadata: { + deliveryInformation: { + to: RECEIVER_ADDRESS, + from: SENDER_ADDRESS, + }, + signature: '', + encryptedMessageHash: '0x123', + version: '', + encryptionScheme: 'x25519-chacha20-poly1305', + }, + }; + const envelop2: EncryptionEnvelop = { message: '', metadata: { deliveryInformation: { @@ -36,7 +49,7 @@ describe('Sync Acknowledge', () => { from: SENDER_ADDRESS, }, signature: '', - encryptedMessageHash: '', + encryptedMessageHash: '0x456', version: '', encryptionScheme: 'x25519-chacha20-poly1305', }, @@ -51,25 +64,31 @@ describe('Sync Acknowledge', () => { expect(priorCreateMessages.length).toBe(0); - await db.createMessage(conversionId, envelop, 200); + await db.createMessage(conversionId, envelop1); + await db.createMessage(conversionId, envelop2); const afterCreateMessages = await db.getIncomingMessages( RECEIVER_ADDRESS, 10, ); - expect(afterCreateMessages.length).toBe(1); + expect(afterCreateMessages.length).toBe(2); + + const res = await db.syncAcknowledge(conversionId, '0x123'); - await db.syncAcknowledge(conversionId, 300); + expect(res).toBe(true); const afterSyncAcknowledge = await db.getIncomingMessages( RECEIVER_ADDRESS, 10, ); - expect(afterSyncAcknowledge.length).toBe(0); + expect(afterSyncAcknowledge.length).toBe(1); + expect(afterSyncAcknowledge[0].metadata.encryptedMessageHash).toBe( + '0x456', + ); }); - it('Keeps messages on the DS that have been created after the sync ', async () => { + it('returns false if message is not found', async () => { const envelop1: EncryptionEnvelop = { message: '', metadata: { @@ -78,33 +97,7 @@ describe('Sync Acknowledge', () => { from: SENDER_ADDRESS, }, signature: '', - encryptedMessageHash: '', - version: '', - encryptionScheme: 'x25519-chacha20-poly1305', - }, - }; - const envelop2: EncryptionEnvelop = { - message: 'foo', - metadata: { - deliveryInformation: { - to: RECEIVER_ADDRESS, - from: SENDER_ADDRESS, - }, - signature: '', - encryptedMessageHash: '', - version: '', - encryptionScheme: 'x25519-chacha20-poly1305', - }, - }; - const envelop3: EncryptionEnvelop = { - message: 'bar', - metadata: { - deliveryInformation: { - to: RECEIVER_ADDRESS, - from: SENDER_ADDRESS, - }, - signature: '', - encryptedMessageHash: '', + encryptedMessageHash: '0x123', version: '', encryptionScheme: 'x25519-chacha20-poly1305', }, @@ -119,32 +112,17 @@ describe('Sync Acknowledge', () => { expect(priorCreateMessages.length).toBe(0); - await db.createMessage(conversionId, envelop1, 200); - await db.createMessage(conversionId, envelop2, 301); - await db.createMessage(conversionId, envelop3, 302); + await db.createMessage(conversionId, envelop1); const afterCreateMessages = await db.getIncomingMessages( RECEIVER_ADDRESS, 10, ); - expect(afterCreateMessages.length).toBe(3); - - await db.syncAcknowledge(conversionId, 300); - - let afterSyncAcknowledge = await db.getIncomingMessages( - RECEIVER_ADDRESS, - 10, - ); - - expect(afterSyncAcknowledge.length).toBe(2); + expect(afterCreateMessages.length).toBe(1); - await db.syncAcknowledge(conversionId, 303); + const res = await db.syncAcknowledge(conversionId, 'foooo'); - afterSyncAcknowledge = await db.getIncomingMessages( - RECEIVER_ADDRESS, - 10, - ); - expect(afterSyncAcknowledge.length).toBe(0); + expect(res).toBe(false); }); }); diff --git a/packages/delivery-service/src/persistence/messages/syncAcknowledge.ts b/packages/delivery-service/src/persistence/messages/syncAcknowledge.ts index ca9a2e951..190e6f576 100644 --- a/packages/delivery-service/src/persistence/messages/syncAcknowledge.ts +++ b/packages/delivery-service/src/persistence/messages/syncAcknowledge.ts @@ -1,10 +1,39 @@ import { Redis, RedisPrefix } from '../getDatabase'; +import { getMessages } from './getMessages'; +/** + * Function to acknowledge synchronization of messages. + * It removes the message with the given hash from the Redis sorted set. + * + * @param {Redis} redis - The Redis client instance. + * @return {Function} - Returns an async function that takes a conversationId and a messageHash. + */ export function syncAcknowledge(redis: Redis) { - return async (conversationId: string, syncTime: number) => { - await redis.zRemRangeByScore( + return async ( + conversationId: string, + messageHash: string, + ): Promise => { + console.log('msgs'); + //deleting a message by its id is not possible in redis using a sorted set. + //hence we have to fetch all the messages and then remove the message from the sorted set. + const msgs = await getMessages(redis)(conversationId, 0, 100000); + + //find the message with the given hash + const message = msgs.find( + (m) => m.metadata.encryptedMessageHash === messageHash, + ); + + //return if the message is not found + if (!message) { + console.log('message not found ', messageHash); + return false; + } + + //remove the message from the sorted set + const res = await redis.zRem( RedisPrefix.Conversation + conversationId, - 0, - syncTime, + JSON.stringify(message), ); + //returns true if the message is removed successfully + return !!res; }; } diff --git a/packages/lib/delivery-api/src/messaging-http.ts b/packages/lib/delivery-api/src/messaging-http.ts index 924df0a90..0fbef06d3 100644 --- a/packages/lib/delivery-api/src/messaging-http.ts +++ b/packages/lib/delivery-api/src/messaging-http.ts @@ -4,7 +4,7 @@ import { getDeliveryServiceClient, normalizeEnsName, } from '@dm3-org/dm3-lib-profile'; -import { Acknoledgment } from '@dm3-org/dm3-lib-delivery'; +import { Acknowledgment } from '@dm3-org/dm3-lib-delivery'; import { EncryptionEnvelop } from '@dm3-org/dm3-lib-messaging'; import { ethers } from 'ethers'; import { checkAccount, getAxiosConfig } from './utils'; @@ -15,7 +15,7 @@ const DELIVERY_PATH = process.env.REACT_APP_BACKEND + '/delivery'; export async function syncAcknoledgment( provider: ethers.providers.JsonRpcProvider, account: Account, - acknoledgments: Acknoledgment[], + acknoledgments: Acknowledgment[], token: string, lastMessagePull: number, ): Promise { @@ -45,7 +45,7 @@ export type SyncAcknoledgment = typeof syncAcknoledgment; export async function syncAcknowledgment( provider: ethers.providers.JsonRpcProvider, account: Account, - acknoledgments: Acknoledgment[], + acknoledgments: Acknowledgment[], token: string, lastSyncTime: number, ): Promise { diff --git a/packages/lib/delivery/schemas.sh b/packages/lib/delivery/schemas.sh index 4f2cf8f02..52d95b523 100644 --- a/packages/lib/delivery/schemas.sh +++ b/packages/lib/delivery/schemas.sh @@ -1,4 +1,4 @@ yarn ts-json-schema-generator -f tsconfig.json --path Delivery.ts --type DeliveryServiceProperties -o ./src/schema/DeliveryServiceProperties.schema.json --no-type-check \ -&& yarn ts-json-schema-generator -f tsconfig.json --path Messages.ts --type Acknoledgment -o ./src/schema/Acknoledgment.schema.json --no-type-check \ +&& yarn ts-json-schema-generator -f tsconfig.json --path Messages.ts --type Acknowledgment -o ./src/schema/Acknowledgment.schema.json --no-type-check \ && yarn ts-json-schema-generator -f tsconfig.json --path Session.ts --type Session -o ./src/schema/Session.schema.json --no-type-check \ && yarn ts-json-schema-generator -f tsconfig.json --path notifications/types.ts --type NotificationChannel -o ./src/schema/NotificationChannel.schema.json --no-type-check \ diff --git a/packages/lib/delivery/src/Messages.ts b/packages/lib/delivery/src/Messages.ts index f12f0a56c..faf3f663f 100644 --- a/packages/lib/delivery/src/Messages.ts +++ b/packages/lib/delivery/src/Messages.ts @@ -33,7 +33,7 @@ import { Session } from './Session'; import { isSpam } from './spam-filter'; import { SpamFilterRules } from './spam-filter/SpamFilterRules'; -export interface Acknoledgment { +export interface Acknowledgment { contactAddress: string; messageDeliveryServiceTimestamp: number; } diff --git a/packages/lib/delivery/src/index.ts b/packages/lib/delivery/src/index.ts index 624f242af..75e0d91a4 100644 --- a/packages/lib/delivery/src/index.ts +++ b/packages/lib/delivery/src/index.ts @@ -10,7 +10,7 @@ export { incomingMessage, handleIncomingMessage, } from './Messages'; -export type { Acknoledgment } from './Messages'; +export type { Acknowledgment } from './Messages'; export { getConversationId } from './Messages'; export type {} from './PublicMessages'; export * as schema from './schema'; diff --git a/packages/lib/delivery/src/schema/index.ts b/packages/lib/delivery/src/schema/index.ts index 169937c4a..095feb766 100644 --- a/packages/lib/delivery/src/schema/index.ts +++ b/packages/lib/delivery/src/schema/index.ts @@ -1,9 +1,9 @@ -import AcknoledgmentSchema from './Acknoledgment.schema.json'; +import AcknowledgmentSchema from './Acknowledgment.schema.json'; import DeliveryServicePropertiesSchema from './DeliveryServiceProperties.schema.json'; import SessionSchema from './Session.schema.json'; import NotificationChannelSchema from './NotificationChannel.schema.json'; -export const Acknoledgment = AcknoledgmentSchema.definitions.Acknoledgment; +export const Acknowledgment = AcknowledgmentSchema.definitions.Acknowledgment; export const DeliveryServiceProperties = DeliveryServicePropertiesSchema; export const Session = SessionSchema; export const NotificationChannel = NotificationChannelSchema; diff --git a/packages/lib/storage/src/Storage.ts b/packages/lib/storage/src/Storage.ts index 12be8431e..cbde5969c 100644 --- a/packages/lib/storage/src/Storage.ts +++ b/packages/lib/storage/src/Storage.ts @@ -1,5 +1,5 @@ import { decrypt, encrypt, EncryptedPayload } from '@dm3-org/dm3-lib-crypto'; -import { Acknoledgment } from '@dm3-org/dm3-lib-delivery'; +import { Acknowledgment } from '@dm3-org/dm3-lib-delivery'; import { Envelop, MessageState } from '@dm3-org/dm3-lib-messaging'; import { Account, ProfileKeys } from '@dm3-org/dm3-lib-profile'; import { logInfo, stringify } from '@dm3-org/dm3-lib-shared'; @@ -176,13 +176,13 @@ export async function sync( deliveryServiceToken: string, ): Promise<{ userStorage: UserStorage; - acknoledgments: Acknoledgment[]; + acknoledgments: Acknowledgment[]; }> { if (!userDb) { throw Error(`User db hasn't been create`); } - const acknoledgments: Acknoledgment[] = Array.from( + const acknoledgments: Acknowledgment[] = Array.from( userDb.conversations.keys(), ) // get newest delivery service query timestamp diff --git a/packages/messenger-widget/src/components/Contacts/Contacts.css b/packages/messenger-widget/src/components/Contacts/Contacts.css index d79be03d0..f595e456d 100644 --- a/packages/messenger-widget/src/components/Contacts/Contacts.css +++ b/packages/messenger-widget/src/components/Contacts/Contacts.css @@ -106,9 +106,12 @@ font-weight: bolder; } +.last-hidden-contact{ + flex-grow: 1; +} -.infinite-scroll-component__outerdiv{ - height: 100vh; +.paginated-contacts{ + height: 100% !important; } /* =================== Mobile Responsive CSS =================== */ diff --git a/packages/messenger-widget/src/components/Contacts/Contacts.tsx b/packages/messenger-widget/src/components/Contacts/Contacts.tsx index c6b98aba7..004843c06 100644 --- a/packages/messenger-widget/src/components/Contacts/Contacts.tsx +++ b/packages/messenger-widget/src/components/Contacts/Contacts.tsx @@ -38,9 +38,6 @@ export function Contacts() { boolean | null >(null); - /* Hidden content for highlighting css */ - const [hiddenData, setHiddenData] = useState([]); - const [hasMoreContact, setHasMoreContact] = useState(true); const getMoreContacts = async () => { @@ -133,33 +130,16 @@ export function Contacts() { return contactIsSelected && contactIsLoading(contactName); }; - // updates hidden contacts data for highlighted border - const setHiddenContentForHighlightedBorder = () => { - const element: HTMLElement = document.getElementById( - 'chat-scroller', - ) as HTMLElement; - if (element) { - // fetch height of chat window - const height = element.clientHeight; - // divide it by each contact height to show in UI - const minimumContactCount = height / 64; - // get count of hidden contacts to add - const hiddenContacts = minimumContactCount - contacts.length + 10; - if (hiddenData.length !== hiddenContacts) { - setHiddenData( - Array.from({ length: hiddenContacts }, (_, i) => i + 1), - ); - } - } - }; - - // handles change in screen size - window.addEventListener('resize', setHiddenContentForHighlightedBorder); - - // sets hidden content styles for higlighted border - useEffect(() => { - setHiddenContentForHighlightedBorder(); - }, [contacts]); + /** + * Add height 100% to InfiniteScroll component. + * This is done through javascript & not with css directly using class name + * because it affects pagination window of chat screen + */ + const element: HTMLElement | null = + document.getElementById('chat-scroller'); + if (element && element.children.length) { + element.children[0].classList.add('paginated-contacts'); + } return (
); diff --git a/packages/messenger-widget/src/context/DeliveryServiceContext.tsx b/packages/messenger-widget/src/context/DeliveryServiceContext.tsx index 3f6091f1a..9cbc9c05a 100644 --- a/packages/messenger-widget/src/context/DeliveryServiceContext.tsx +++ b/packages/messenger-widget/src/context/DeliveryServiceContext.tsx @@ -1,10 +1,7 @@ +import { NotificationChannelType } from '@dm3-org/dm3-lib-shared'; import React from 'react'; import { useDeliveryService } from '../hooks/server-side/useDeliveryService'; -import { - Acknoledgment, - DeliveryServiceProperties, -} from '@dm3-org/dm3-lib-delivery'; -import { NotificationChannelType } from '@dm3-org/dm3-lib-shared'; +import { Acknowledgment } from '@dm3-org/dm3-lib-delivery'; export type DeliveryServiceContextType = { getDeliveryServiceProperties: () => Promise; @@ -27,7 +24,7 @@ export type DeliveryServiceContextType = { fetchIncommingMessages: (ensName: string) => any; syncAcknowledgment: ( ensName: string, - acknoledgments: Acknoledgment[], + acknowledgments: Acknowledgment[], lastSyncTime: number, ) => void; getGlobalNotification: (ensName: string) => any; @@ -68,7 +65,7 @@ export const DeliveryServiceContext = fetchIncommingMessages: (ensName: string) => {}, syncAcknowledgment: ( ensName: string, - acknoledgments: Acknoledgment[], + acknowledgments: Acknowledgment[], lastSyncTime: number, ) => {}, getGlobalNotification: (ensName: string) => {}, diff --git a/packages/messenger-widget/src/context/testHelper/getMockedDeliveryServiceContext.ts b/packages/messenger-widget/src/context/testHelper/getMockedDeliveryServiceContext.ts index 96e6167d4..f0f416b19 100644 --- a/packages/messenger-widget/src/context/testHelper/getMockedDeliveryServiceContext.ts +++ b/packages/messenger-widget/src/context/testHelper/getMockedDeliveryServiceContext.ts @@ -1,4 +1,4 @@ -import { Acknoledgment } from '@dm3-org/dm3-lib-delivery'; +import { Acknowledgment } from '@dm3-org/dm3-lib-delivery'; import { NotificationChannelType } from '@dm3-org/dm3-lib-shared'; import { DeliveryServiceContextType } from '../DeliveryServiceContext'; @@ -20,7 +20,7 @@ export const getMockedDeliveryServiceContext = ( }, syncAcknowledgment: function ( ensName: string, - acknoledgments: Acknoledgment[], + acknowledgments: Acknowledgment[], lastSyncTime: number, ): void { throw new Error('Function not implemented.'); diff --git a/packages/messenger-widget/src/hooks/messages/sources/handleMessagesFromDeliveryService.ts b/packages/messenger-widget/src/hooks/messages/sources/handleMessagesFromDeliveryService.ts index 8d6116401..bf0620318 100644 --- a/packages/messenger-widget/src/hooks/messages/sources/handleMessagesFromDeliveryService.ts +++ b/packages/messenger-widget/src/hooks/messages/sources/handleMessagesFromDeliveryService.ts @@ -7,7 +7,7 @@ import { import { MessageModel, MessageSource } from '../useMessage'; import { Account, ProfileKeys } from '@dm3-org/dm3-lib-profile'; import { AddConversation, StoreMessageBatch } from '../../storage/useStorage'; -import { Acknoledgment } from '@dm3-org/dm3-lib-delivery'; +import { Acknowledgment } from '@dm3-org/dm3-lib-delivery'; export const handleMessagesFromDeliveryService = async ( account: Account, @@ -18,7 +18,7 @@ export const handleMessagesFromDeliveryService = async ( fetchNewMessages: (ensName: string, contactAddress: string) => any, syncAcknowledgment: ( ensName: string, - acknoledgments: Acknoledgment[], + acknoledgments: Acknowledgment[], lastSyncTime: number, ) => void, updateConversationList: (conversation: string, updatedAt: number) => void, diff --git a/packages/messenger-widget/src/hooks/messages/useMessage.tsx b/packages/messenger-widget/src/hooks/messages/useMessage.tsx index b27e2aee1..90d5c26ab 100644 --- a/packages/messenger-widget/src/hooks/messages/useMessage.tsx +++ b/packages/messenger-widget/src/hooks/messages/useMessage.tsx @@ -1,6 +1,5 @@ import { encryptAsymmetric } from '@dm3-org/dm3-lib-crypto'; import { - DispatchableEnvelop, EncryptionEnvelop, Envelop, Message, @@ -10,20 +9,19 @@ import { import { normalizeEnsName } from '@dm3-org/dm3-lib-profile'; import { sha256, stringify } from '@dm3-org/dm3-lib-shared'; import { StorageEnvelopContainer as StorageEnvelopContainerNew } from '@dm3-org/dm3-lib-storage'; -import axios from 'axios'; import { useCallback, useContext, useEffect, useState } from 'react'; import { AuthContext } from '../../context/AuthContext'; import { ConversationContext } from '../../context/ConversationContext'; import { DeliveryServiceContext } from '../../context/DeliveryServiceContext'; import { StorageContext } from '../../context/StorageContext'; import { TLDContext } from '../../context/TLDContext'; +import { submitEnvelopsToReceiversDs } from '../../utils/deliveryService/submitEnvelopsToReceiversDs'; +import { useHaltDelivery } from '../haltDelivery/useHaltDelivery'; import { renderMessage } from './renderer/renderMessage'; import { checkIfEnvelopAreInSizeLimit } from './sizeLimit/checkIfEnvelopIsInSizeLimit'; import { handleMessagesFromDeliveryService } from './sources/handleMessagesFromDeliveryService'; import { handleMessagesFromStorage } from './sources/handleMessagesFromStorage'; import { handleMessagesFromWebSocket } from './sources/handleMessagesFromWebSocket'; -import { useHaltDelivery } from '../haltDelivery/useHaltDelivery'; -import { submitEnvelopsToReceiversDs } from '../../utils/deliveryService/submitEnvelopsToReceiversDs'; const DEFAULT_MESSAGE_PAGESIZE = 100; @@ -118,7 +116,7 @@ export const useMessage = () => { return () => { removeOnNewMessageListener(); }; - }, [onNewMessage, selectedContact]); + }, [onNewMessage, selectedContact, contacts]); //Mark messages as read when the selected contact changes useEffect(() => { diff --git a/packages/messenger-widget/src/hooks/server-side/DeliveryServiceConnector.ts b/packages/messenger-widget/src/hooks/server-side/DeliveryServiceConnector.ts index 08f43fe88..b0827e157 100644 --- a/packages/messenger-widget/src/hooks/server-side/DeliveryServiceConnector.ts +++ b/packages/messenger-widget/src/hooks/server-side/DeliveryServiceConnector.ts @@ -1,4 +1,4 @@ -import { Acknoledgment } from '@dm3-org/dm3-lib-delivery'; +import { Acknowledgment } from '@dm3-org/dm3-lib-delivery'; import { ServerSideConnector } from './ServerSideConnector'; import { normalizeEnsName } from '@dm3-org/dm3-lib-profile'; import { NotificationChannelType } from '@dm3-org/dm3-lib-shared'; @@ -16,7 +16,7 @@ export class DeliveryServiceConnector extends ServerSideConnector { public async syncAcknowledgement( ensName: string, - acknoledgments: Acknoledgment[], + acknowledgments: Acknowledgment[], lastSyncTime: number, ) { const url = `/delivery/messages/${normalizeEnsName( @@ -24,7 +24,7 @@ export class DeliveryServiceConnector extends ServerSideConnector { )}/syncAcknowledgment/${lastSyncTime}`; return await this.getAuthenticatedAxiosClient().post(url, { - acknoledgments, + acknowledgments, }); } @@ -94,14 +94,14 @@ export class DeliveryServiceConnector extends ServerSideConnector { public async syncAcknowledgment( ensName: string, - acknoledgments: Acknoledgment[], + acknowledgments: Acknowledgment[], lastSyncTime: number, ) { const url = `/delivery/messages/${normalizeEnsName( ensName, )}/syncAcknowledgment/${lastSyncTime}`; const { data } = await this.getAuthenticatedAxiosClient().post(url, { - acknoledgments, + acknowledgments, }); return data; } diff --git a/packages/messenger-widget/src/hooks/server-side/useDeliveryService.ts b/packages/messenger-widget/src/hooks/server-side/useDeliveryService.ts index 42ddf3494..279132e6c 100644 --- a/packages/messenger-widget/src/hooks/server-side/useDeliveryService.ts +++ b/packages/messenger-widget/src/hooks/server-side/useDeliveryService.ts @@ -1,4 +1,4 @@ -import { Acknoledgment } from '@dm3-org/dm3-lib-delivery'; +import { Acknowledgment } from '@dm3-org/dm3-lib-delivery'; import { EncryptionEnvelop } from '@dm3-org/dm3-lib-messaging'; import { getDeliveryServiceProfile } from '@dm3-org/dm3-lib-profile'; import { NotificationChannelType } from '@dm3-org/dm3-lib-shared'; @@ -177,7 +177,7 @@ export const useDeliveryService = () => { }, syncAcknowledgment: ( ensName: string, - acknoledgments: Acknoledgment[], + acknowledgments: Acknowledgment[], lastSyncTime: number, ) => { const connectors = _getConnectors(); @@ -185,7 +185,7 @@ export const useDeliveryService = () => { connectors.map((c) => c.syncAcknowledgement( ensName, - acknoledgments, + acknowledgments, lastSyncTime, ), ),