diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 9ba9f1f78..2b50a6f2d 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -36,7 +36,7 @@ jobs: chmod 600 ./ssh-key - name: Create .env file env: - TARGET_HOST: ${{ vars.HOST_DOMAIN }} + TARGET_HOST: ${{ vars.HOST_DOMAIN}} TARGET_IP: ${{ vars.HOST_IP }} run: | echo "REACT_APP_ADDR_ENS_SUBDOMAIN=${{ vars.ADDR_ENS_SUBDOMAIN }}" >> ./.env.react @@ -57,7 +57,7 @@ jobs: echo "REACT_APP_CHAIN_ID=${{ vars.CHAIN_ID }}" >> ./.env.react echo "REACT_APP_GENOME_REGISTRY_ADDRESS=${{ vars.GENOME_REGISTRY_ADDRESS }}" >> ./.env.react cat ./.env.react >> ./.env - echo "RESOLVER_ADDR=${{ vars.ERC3668_RESOLVER_ADDRESS }}" >> ./.env + echo "RESOLVER_ADDRESS=${{ vars.ERC3668_RESOLVER_ADDRESS }}" >> ./.env echo "SIGNING_PUBLIC_KEY=${{ secrets.SIGNING_PUBLIC_KEY }}" >> ./.env echo "SIGNING_PRIVATE_KEY=${{ secrets.SIGNING_PRIVATE_KEY }}" >> ./.env echo "SIGNER_PRIVATE_KEY=${{ secrets.SIGNER_PRIVATE_KEY }}" >> ./.env @@ -106,10 +106,10 @@ jobs: --tag dm3org/$image_name:$version${{ env.docker_suffix }}.${{ env.unix_now }}.${{ env.sha_short }} . docker save -o ./$image_name.tar $image_name:latest docker push --all-tags dm3org/$image_name - - name: Build offchain-resolver docker image + - name: Build and publish offchain-resolver docker image shell: bash run: | - version=$(NODE_PATH=packages/delivery-service node -p "require('package.json').version") + version=$(NODE_PATH=packages/offchain-resolver node -p "require('package.json').version") image_name=dm3-offchain-resolver docker build --progress=plain -f ./docker/DockerfilePackages --build-arg="PACKAGE=offchain-resolver" \ --tag $image_name:latest \ @@ -142,11 +142,17 @@ jobs: ssh -i ./ssh-key app@${{ vars.HOST_DOMAIN }} "\ cd dm3 && ls |grep -E 'dm3-.*tar' | xargs --no-run-if-empty -L 1 docker load -i; \ rm dm3-*.tar || true" + - name: Reset state of testing environment + run: | + if [ $environment_name == "testing" ]; then + ssh -i ./ssh-key root@${{ vars.HOST_DOMAIN }} "\ + cd /mnt/dm3_prod_volume/db && rm -r * || true" + fi - name: Configure Firewall run: | ssh -i ./ssh-key root@${{ vars.HOST_DOMAIN }} "\ - ufw allow from 172.18.0.1/16 proto tcp to ${{ vars.HOST_IP}} port 80; - ufw allow from 172.18.0.1/16 proto tcp to ${{ secrets.IP_ADDRESS }} port 443; + ufw allow from 172.18.0.1/16 proto tcp to ${{ vars.HOST_IP }} port 80; + ufw allow from 172.18.0.1/16 proto tcp to ${{ vars.HOST_IP }} port 443; ufw enable" - name: Start docker on server run: | diff --git a/.github/workflows/resetStagingState.yml b/.github/workflows/resetStagingState.yml new file mode 100644 index 000000000..f7e86f1ea --- /dev/null +++ b/.github/workflows/resetStagingState.yml @@ -0,0 +1,22 @@ +name: deploy +on: workflow_dispatch + +jobs: + reset-staging-state: + environment: 'staging' + runs-on: ubuntu-latest + steps: + - name: Stop docker on server + run: | + ssh -i ./ssh-key app@${{ vars.HOST_DOMAIN }} "\ + cd dm3 && docker compose down" + ssh -i ./ssh-key root@${{ vars.HOST_DOMAIN }} "\ + systemctl restart docker.service" + - name: Reset state of staging environment + run: | + ssh -i ./ssh-key root@${{ vars.HOST_DOMAIN }} "\ + cd /mnt/dm3_prod_volume/db && rm -r * || true" + - name: Start docker on server + run: | + ssh -i ./ssh-key app@${{ vars.HOST_DOMAIN }} "\ + cd dm3 && docker compose --env-file .env up -d && docker system prune -af" diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index b0a9c565d..ccb52f6cc 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -112,7 +112,7 @@ services: REACT_APP_USER_ENS_SUBDOMAIN: ${REACT_APP_USER_ENS_SUBDOMAIN} REACT_APP_WALLET_CONNECT_PROJECT_ID: ${REACT_APP_WALLET_CONNECT_PROJECT_ID} REACT_APP_GENOME_REGISTRY_ADDRESS: ${REACT_APP_GENOME_REGISTRY_ADDRESS} - RESOLVER_ADDR: ${RESOLVER_ADDR} + RESOLVER_ADDRESS: ${RESOLVER_ADDRESS} certbot: image: certbot/certbot diff --git a/packages/backend/src/storage.ts b/packages/backend/src/storage.ts index 12e3303ad..52b71815e 100644 --- a/packages/backend/src/storage.ts +++ b/packages/backend/src/storage.ts @@ -216,6 +216,8 @@ export default ( try { const ensName = normalizeEnsName(req.params.ensName); + console.log('getConversations query', req.query); + const pageSize = parseInt(req.query.pageSize as string) || DEFAULT_CONVERSATION_PAGE_SIZE; @@ -231,6 +233,8 @@ export default ( return; } + console.log('fetch conversations', pageSize, offset); + const conversations = await db.getConversationList( ensName, pageSize, diff --git a/packages/lib/shared/src/IBackendConnector.ts b/packages/lib/shared/src/IBackendConnector.ts index 1040376d8..e163ce2ff 100644 --- a/packages/lib/shared/src/IBackendConnector.ts +++ b/packages/lib/shared/src/IBackendConnector.ts @@ -1,6 +1,10 @@ export interface IBackendConnector { addConversation(ensName: string, encryptedContactName: string): void; - getConversations(ensName: string): Promise; + getConversations( + ensName: string, + size: number, + offset: number, + ): Promise; toggleHideConversation( ensName: string, encryptedContactName: string, diff --git a/packages/lib/storage/src/new/cloudStorage/getCloudStorage.ts b/packages/lib/storage/src/new/cloudStorage/getCloudStorage.ts index fec3658c4..f4f4f7e8a 100644 --- a/packages/lib/storage/src/new/cloudStorage/getCloudStorage.ts +++ b/packages/lib/storage/src/new/cloudStorage/getCloudStorage.ts @@ -17,9 +17,11 @@ export const getCloudStorage = ( ); }; - const getConversationList = async (page: number) => { + const getConversations = async (size: number, offset: number) => { const encryptedConversations = await backendConnector.getConversations( ensName, + size, + offset, ); return await Promise.all( @@ -174,7 +176,7 @@ export const getCloudStorage = ( return { addConversation: _addConversation, - getConversationList, + getConversations, getMessages, addMessage: _addMessage, addMessageBatch: _addMessageBatch, diff --git a/packages/lib/storage/src/new/types.ts b/packages/lib/storage/src/new/types.ts index 59f760c2a..0ed77ca0a 100644 --- a/packages/lib/storage/src/new/types.ts +++ b/packages/lib/storage/src/new/types.ts @@ -1,7 +1,7 @@ import { Envelop, MessageState } from '@dm3-org/dm3-lib-messaging'; export interface StorageAPI { - getConversationList: (page: number) => Promise; + getConversations: (size: number, offset: number) => Promise; getMessages: ( contactEnsName: string, page: number, diff --git a/packages/messenger-widget/src/context/BackendContext.tsx b/packages/messenger-widget/src/context/BackendContext.tsx index 6a49c5cdd..e829220e5 100644 --- a/packages/messenger-widget/src/context/BackendContext.tsx +++ b/packages/messenger-widget/src/context/BackendContext.tsx @@ -5,7 +5,11 @@ import { useBackend } from '../hooks/server-side/useBackend'; export type BackendContextType = { isInitialized: boolean; addConversation: (ensName: string, encryptedContactName: string) => void; - getConversations: (ensName: string) => Promise; + getConversations: ( + ensName: string, + size: number, + offset: number, + ) => Promise; toggleHideConversation: ( ensName: string, encryptedContactName: string, diff --git a/packages/messenger-widget/src/context/StorageContext.tsx b/packages/messenger-widget/src/context/StorageContext.tsx index a4f6b65d6..3dd4c6574 100644 --- a/packages/messenger-widget/src/context/StorageContext.tsx +++ b/packages/messenger-widget/src/context/StorageContext.tsx @@ -12,10 +12,7 @@ import { useStorage, } from '../hooks/storage/useStorage'; import { AuthContext } from './AuthContext'; -import { DeliveryServiceContext } from './DeliveryServiceContext'; -import { BackendConnector } from '../hooks/server-side/BackendConnector'; -import { BackendContext, BackendContextProvider } from './BackendContext'; -import { IBackendConnector } from '@dm3-org/dm3-lib-shared'; +import { BackendContext } from './BackendContext'; export type StorageContextType = { storeMessage: StoreMessageAsync; @@ -42,7 +39,8 @@ export const StorageContext = React.createContext({ contact: string, batch: StorageEnvelopContainer[], ) => {}, - getConversations: async (page: number) => Promise.resolve([]), + getConversations: async (size: number, offset: number) => + Promise.resolve([]), addConversationAsync: (contact: string) => {}, getMessages: async (contact: string, page: number) => Promise.resolve([]), getNumberOfMessages: async (contact: string) => Promise.resolve(0), diff --git a/packages/messenger-widget/src/context/testHelper/getMockedStorageContext.ts b/packages/messenger-widget/src/context/testHelper/getMockedStorageContext.ts index acf1c0a2e..bf50d0d3e 100644 --- a/packages/messenger-widget/src/context/testHelper/getMockedStorageContext.ts +++ b/packages/messenger-widget/src/context/testHelper/getMockedStorageContext.ts @@ -9,7 +9,7 @@ import { StorageContextType } from '../StorageContext'; export const getMockedStorageContext = ( override?: Partial, ) => { - const defaultValues = { + const defaultValues: StorageContextType = { initialized: false, storeMessage: function ( contact: string, @@ -29,7 +29,10 @@ export const getMockedStorageContext = ( ): void { throw new Error('Function not implemented.'); }, - getConversations: function (page: number): Promise { + getConversations: function ( + size: number, + offset: number, + ): Promise { return Promise.resolve([ { contactEnsName: 'max.eth', diff --git a/packages/messenger-widget/src/hooks/conversation/useConversation.test.tsx b/packages/messenger-widget/src/hooks/conversation/useConversation.test.tsx index 7bcf05f46..4a910d109 100644 --- a/packages/messenger-widget/src/hooks/conversation/useConversation.test.tsx +++ b/packages/messenger-widget/src/hooks/conversation/useConversation.test.tsx @@ -400,6 +400,7 @@ describe('useConversation hook test cases', () => { const storageContext: StorageContextType = getMockedStorageContext({ getConversations: function ( page: number, + offset: number, ): Promise { return Promise.resolve([ { @@ -409,6 +410,7 @@ describe('useConversation hook test cases', () => { }, ]); }, + addConversationAsync: jest.fn(), initialized: true, }); const deliveryServiceContext: DeliveryServiceContextType = @@ -480,6 +482,7 @@ describe('useConversation hook test cases', () => { }, ]); }, + addConversationAsync: jest.fn(), initialized: true, }); const deliveryServiceContext: DeliveryServiceContextType = @@ -568,6 +571,7 @@ describe('useConversation hook test cases', () => { }, ]); }, + addConversationAsync: jest.fn(), initialized: true, }); const deliveryServiceContext: DeliveryServiceContextType = @@ -619,7 +623,7 @@ describe('useConversation hook test cases', () => { 'mydefaultcontract.eth', ); }); - it('hidden contact should not appears as hidden in the conversation list', async () => { + it('hidden contact should appear as hidden in the conversation list', async () => { const configurationContext = getMockedDm3Configuration({ dm3Configuration: { ...DEFAULT_DM3_CONFIGURATION, @@ -661,6 +665,7 @@ describe('useConversation hook test cases', () => { }, ]); }, + addConversationAsync: jest.fn(), initialized: true, }); const deliveryServiceContext: DeliveryServiceContextType = diff --git a/packages/messenger-widget/src/hooks/conversation/useConversation.tsx b/packages/messenger-widget/src/hooks/conversation/useConversation.tsx index 1ffc32ff6..f9f1d4ca6 100644 --- a/packages/messenger-widget/src/hooks/conversation/useConversation.tsx +++ b/packages/messenger-widget/src/hooks/conversation/useConversation.tsx @@ -12,22 +12,23 @@ import { DeliveryServiceContext } from '../../context/DeliveryServiceContext'; import { StorageContext } from '../../context/StorageContext'; import { TLDContext } from '../../context/TLDContext'; import { DM3Configuration } from '../../interfaces/config'; -import { ContactPreview, getDefaultContract } from '../../interfaces/utils'; +import { ContactPreview, getEmptyContact } from '../../interfaces/utils'; import { useMainnetProvider } from '../mainnetprovider/useMainnetProvider'; import { hydrateContract } from './hydrateContact'; +const DEFAULT_CONVERSATION_PAGE_SIZE = 1; + export const useConversation = (config: DM3Configuration) => { const mainnetProvider = useMainnetProvider(); const { dm3Configuration } = useContext(DM3ConfigurationContext); const { account } = useContext(AuthContext); const { - getDeliveryServiceProperties, fetchIncommingMessages, isInitialized: deliveryServiceInitialized, } = useContext(DeliveryServiceContext); const { - getConversations, - addConversationAsync, + getConversations: getConversationsFromStorage, + addConversationAsync: storeConversationAsync, initialized: storageInitialized, toggleHideContactAsync, } = useContext(StorageContext); @@ -71,7 +72,7 @@ export const useConversation = (config: DM3Configuration) => { setConversationsInitialized(false); setSelectedContactName(undefined); setContacts([]); - const init = async (page: number = 0) => { + const init = async () => { if ( !account || !storageInitialized || @@ -79,37 +80,34 @@ export const useConversation = (config: DM3Configuration) => { ) { return; } - const currentConversationsPage = await getConversations(page); - //Hydrate the contacts by fetching their profile and DS profile - const storedContacts = await Promise.all( - currentConversationsPage.map((conversation) => { - const isHidden = conversation.isHidden; - //Hydrating is the most expensive operation. Hence we only hydrate if the contact is not hidden - if (isHidden) { - //If the contact is hidden we only return the contact with the default values. Once its unhidden it will be hydrated - return { - ...getDefaultContract(conversation.contactEnsName), - isHidden: true, - }; - } - return hydrateContract( - mainnetProvider, - conversation, - resolveAliasToTLD, - dm3Configuration.addressEnsSubdomain, - ); - }), - ); + const conversations = await Promise.all([ + //Get the last 5 conversations from the storage + getConversationsFromStorage(DEFAULT_CONVERSATION_PAGE_SIZE, 0), + //Get the conversations that have been added to the DS in absence of the user + getConversationsFromDeliveryService(), + ]); - /** - * It might be the case that contacts are added via websocket. - * In this case we do not want to add them again - */ - _setContactsSafe(storedContacts); + //Flatten the conversations and remove duplicates + conversations + .flat() + .filter( + (conversation, index, self) => + index === + self.findIndex( + (t) => + t.contactEnsName === + conversation.contactEnsName, + ), + ) + //Add the conversations to the list + .forEach((conversation) => { + _addConversation( + conversation.contactEnsName, + conversation.isHidden, + ); + }); - //Conversation that have been added to the DS in absence of the user will be fetched and added to the conversation list using the handlePendingConversations method - await handlePendingConversations(); initDefaultContact(); setConversationsInitialized(true); }; @@ -153,7 +151,9 @@ export const useConversation = (config: DM3Configuration) => { } }; - const handlePendingConversations = async () => { + const getConversationsFromDeliveryService = async (): Promise< + Conversation[] + > => { //The DS does not exposes an endpoint to fetch pending conversations. Hence we're using the fetchIncommingMessages method. //We can make some optimizations here if we use the messages fetched from incommingMessages in useMessages aswell. //This would require a refactor of the useMessages away from a contact based model. @@ -162,16 +162,41 @@ export const useConversation = (config: DM3Configuration) => { account?.ensName as string, ); //Every pending conversation is going to be added to the conversation list - incommingMessages.forEach((pendingMessage: EncryptionEnvelop) => { - const sender = ( - pendingMessage.metadata - .deliveryInformation as DeliveryInformation - ).from; - addConversation(sender); - }); + return ( + incommingMessages + .map((pendingMessage: EncryptionEnvelop) => { + const contactEnsName = ( + pendingMessage.metadata + .deliveryInformation as DeliveryInformation + ).from; + + return { + contactEnsName, + messageCounter: 0, + isHidden: false, + }; + }) + //filter duplicates + .filter((conversation: Conversation) => { + return !contacts.some( + (current) => + current.contactDetails.account.ensName === + conversation.contactEnsName, + ); + }) + ); }; const addConversation = (_ensName: string) => { + //Adds the conversation to the conversation state + const conversationPreview = _addConversation(_ensName, false); + //Add the contact to the storage in the background + storeConversationAsync(_ensName); + + return conversationPreview; + }; + + const _addConversation = (_ensName: string, isHidden: boolean) => { const ensName = normalizeEnsName(_ensName); //Check if the contact is the user itself const isOwnContact = normalizeEnsName(account!.ensName) === ensName; @@ -192,11 +217,9 @@ export const useConversation = (config: DM3Configuration) => { return alreadyAddedContact; } - const newContact: ContactPreview = getDefaultContract(ensName); + const newContact: ContactPreview = getEmptyContact(ensName, isHidden); //Set the new contact to the list _setContactsSafe([newContact]); - //Add the contact to the storage in the background - addConversationAsync(ensName); //Hydrate the contact in the background hydrateExistingContactAsync(newContact); diff --git a/packages/messenger-widget/src/hooks/messages/useMessage.test.tsx b/packages/messenger-widget/src/hooks/messages/useMessage.test.tsx index 32311c3fe..6300a91fa 100644 --- a/packages/messenger-widget/src/hooks/messages/useMessage.test.tsx +++ b/packages/messenger-widget/src/hooks/messages/useMessage.test.tsx @@ -24,7 +24,7 @@ import { } from '../../context/testHelper/getMockedDm3Configuration'; import { getMockedStorageContext } from '../../context/testHelper/getMockedStorageContext'; import { getMockedTldContext } from '../../context/testHelper/getMockedTldContext'; -import { getDefaultContract } from '../../interfaces/utils'; +import { getEmptyContact } from '../../interfaces/utils'; import { DM3Configuration } from '../../widget'; import { useMessage } from './useMessage'; @@ -106,7 +106,7 @@ describe('useMessage hook test cases', () => { storeMessage: jest.fn(), }); const conversationContext = getMockedConversationContext({ - selectedContact: getDefaultContract('max.eth'), + selectedContact: getEmptyContact('max.eth'), }); const deliveryServiceContext = getMockedDeliveryServiceContext({ //Add websocket mock @@ -163,7 +163,7 @@ describe('useMessage hook test cases', () => { storeMessage: jest.fn(), }); const conversationContext = getMockedConversationContext({ - selectedContact: getDefaultContract('max.eth'), + selectedContact: getEmptyContact('max.eth'), }); const deliveryServiceContext = getMockedDeliveryServiceContext({ //Add websocket mock @@ -220,7 +220,7 @@ describe('useMessage hook test cases', () => { storeMessage: jest.fn(), }); const conversationContext = getMockedConversationContext({ - selectedContact: getDefaultContract('max.eth'), + selectedContact: getEmptyContact('max.eth'), }); const deliveryServiceContext = getMockedDeliveryServiceContext({ //Add websocket mock @@ -287,7 +287,7 @@ describe('useMessage hook test cases', () => { }); const conversationContext = getMockedConversationContext({ - selectedContact: getDefaultContract('max.eth'), + selectedContact: getEmptyContact('max.eth'), contacts: [ { name: '', @@ -390,7 +390,7 @@ describe('useMessage hook test cases', () => { }); const conversationContext = getMockedConversationContext({ - selectedContact: getDefaultContract('max.eth'), + selectedContact: getEmptyContact('max.eth'), contacts: [ { name: '', @@ -520,8 +520,8 @@ describe('useMessage hook test cases', () => { getNumberOfMessages: jest.fn().mockResolvedValue(3), }); const conversationContext = getMockedConversationContext({ - selectedContact: getDefaultContract('max.eth'), - contacts: [getDefaultContract('alice.eth')], + selectedContact: getEmptyContact('max.eth'), + contacts: [getEmptyContact('alice.eth')], }); const deliveryServiceContext = getMockedDeliveryServiceContext({ onNewMessage: (cb: Function) => { @@ -597,8 +597,8 @@ describe('useMessage hook test cases', () => { getNumberOfMessages: jest.fn().mockResolvedValue(0), }); const conversationContext = getMockedConversationContext({ - selectedContact: getDefaultContract('max.eth'), - contacts: [getDefaultContract('alice.eth')], + selectedContact: getEmptyContact('max.eth'), + contacts: [getEmptyContact('alice.eth')], }); const deliveryServiceContext = getMockedDeliveryServiceContext({ onNewMessage: (cb: Function) => { diff --git a/packages/messenger-widget/src/hooks/server-side/BackendConnector.ts b/packages/messenger-widget/src/hooks/server-side/BackendConnector.ts index 075fc223f..90f07c895 100644 --- a/packages/messenger-widget/src/hooks/server-side/BackendConnector.ts +++ b/packages/messenger-widget/src/hooks/server-side/BackendConnector.ts @@ -15,13 +15,22 @@ export class BackendConnector encryptedContactName, }); } - public async getConversations(ensName: string) { + public async getConversations( + ensName: string, + pageSize: number, + offset: number, + ) { const url = `/storage/new/${normalizeEnsName( ensName, )}/getConversations`; const axios = this.getAuthenticatedAxiosClient(); - const { data } = await axios.get(url); + const { data } = await axios.get(url, { + params: { + pageSize, + offset, + }, + }); return data ?? []; } public async toggleHideConversation( diff --git a/packages/messenger-widget/src/hooks/server-side/useBackend.ts b/packages/messenger-widget/src/hooks/server-side/useBackend.ts index 74da8df88..c61dba118 100644 --- a/packages/messenger-widget/src/hooks/server-side/useBackend.ts +++ b/packages/messenger-widget/src/hooks/server-side/useBackend.ts @@ -55,8 +55,12 @@ export const useBackend = (): IBackendConnector & { addConversation: (ensName: string, encryptedContactName: string) => { beConnector?.addConversation(ensName, encryptedContactName); }, - getConversations: async (ensName: string) => { - return beConnector?.getConversations(ensName); + getConversations: async ( + ensName: string, + size: number, + offset: number, + ) => { + return beConnector?.getConversations(ensName, size, offset); }, toggleHideConversation: ( ensName: string, diff --git a/packages/messenger-widget/src/hooks/storage/useStorage.tsx b/packages/messenger-widget/src/hooks/storage/useStorage.tsx index d8c0d6195..f627ca266 100644 --- a/packages/messenger-widget/src/hooks/storage/useStorage.tsx +++ b/packages/messenger-widget/src/hooks/storage/useStorage.tsx @@ -1,8 +1,6 @@ import { StorageEnvelopContainer as StorageEnvelopContainerNew, getCloudStorage, - load, - migrageStorage, } from '@dm3-org/dm3-lib-storage'; import { @@ -13,14 +11,9 @@ import { encryptAsymmetric, } from '@dm3-org/dm3-lib-crypto'; import { Account, ProfileKeys } from '@dm3-org/dm3-lib-profile'; -import { IBackendConnector, sha256, stringify } from '@dm3-org/dm3-lib-shared'; -import { - Conversation, - StorageAPI, -} from '@dm3-org/dm3-lib-storage/dist/new/types'; -import { useContext, useEffect, useState } from 'react'; -import axios from 'axios'; -import { TLDContext } from '../../context/TLDContext'; +import { sha256, stringify } from '@dm3-org/dm3-lib-shared'; +import { Conversation, StorageAPI } from '@dm3-org/dm3-lib-storage'; +import { useEffect, useState } from 'react'; import { BackendContextType } from '../../context/BackendContext'; //Handels storage sync and offers an interface for other hooks to interact with the storage @@ -29,7 +22,6 @@ export const useStorage = ( backendContext: BackendContextType, profileKeys: ProfileKeys | undefined, ) => { - const { resolveTLDtoAlias } = useContext(TLDContext); const [storageApi, setStorageApi] = useState( undefined, ); @@ -129,11 +121,11 @@ export const useStorage = ( } await storageApi.addMessageBatch(contact, batch); }; - const getConversations = async (page: number) => { + const getConversations = async (size: number, offset: number) => { if (!storageApi) { return Promise.resolve([]); } - return storageApi.getConversationList(page); + return storageApi.getConversations(size, offset); }; const addConversationAsync = (contact: string) => { @@ -188,7 +180,10 @@ export type StoreMessageBatch = ( contact: string, batch: StorageEnvelopContainerNew[], ) => Promise; -export type GetConversations = (page: number) => Promise; +export type GetConversations = ( + size: number, + offset: number, +) => Promise; export type AddConversation = (contact: string) => void; export type GetMessages = ( contact: string, diff --git a/packages/messenger-widget/src/interfaces/utils.ts b/packages/messenger-widget/src/interfaces/utils.ts index aced396eb..2efd79704 100644 --- a/packages/messenger-widget/src/interfaces/utils.ts +++ b/packages/messenger-widget/src/interfaces/utils.ts @@ -50,7 +50,7 @@ export interface IAttachmentPreview { isImage: boolean; } -export const getDefaultContract = (ensName: string) => { +export const getEmptyContact = (ensName: string, isHidden: boolean = false) => { const newContact: ContactPreview = { name: getAccountDisplayName(ensName, 25), message: null, @@ -63,7 +63,7 @@ export const getDefaultContract = (ensName: string) => { }, deliveryServiceProfiles: [], }, - isHidden: false, + isHidden, messageSizeLimit: 0, };