Create new interfaces for objects transmitted using the REST API
Changes:
- Create new IContact, IAccount, and IConversation interfaces in common/
- These interfaces represent the serialized versions of the models which are transferred
- The client models are classes which implement these interfaces
- Create new LookupResult interface for nameserver lookup results
- Create new IConversationMember interface for conversation members
- The client interface ConversationMember extends this interface to have a Contact field rather than IContact
- Create new ConversationInfos interface for conversation infos
- Create new ContactDetails interface for contact details (used by contacts routes)
- Move request and response body interfaces into common/
- Merge AccountConfig into AccountDetails interface
- Create interfaces for server-only objects:
- ConversationMemberInfos
- ConversationRequestMetadata
- Ensure interfaces in jami-signal-interfaces.ts do not contain fields with JamiSwig types
- Rename models/ filenames to camelCase as they are not components
- Rewrite client models to have proper TypeScript accessors and remove unused getters
- Rewrite how client models are initialized from the serialized interface using .fromInterface static methods
- Make client models implement the interfaces in common/ for consistency
- Remove unneeded _next parameter for Express.js route handlers
- Use Partial<T> for all Express.js request body types on server
- Type all Axios response body types with interfaces
GitLab: #92
Change-Id: I4b2c75ac632ec5d9bf12a874a5ba04467c76fa6d
diff --git a/client/src/contexts/MessengerProvider.tsx b/client/src/contexts/MessengerProvider.tsx
index 3ec6164..51a19fb 100644
--- a/client/src/contexts/MessengerProvider.tsx
+++ b/client/src/contexts/MessengerProvider.tsx
@@ -15,11 +15,11 @@
* License along with this program. If not, see
* <https://www.gnu.org/licenses/>.
*/
-import { ConversationMessage, WebSocketMessageType } from 'jami-web-common';
+import { ConversationMessage, IConversation, LookupResult, WebSocketMessageType } from 'jami-web-common';
import { createContext, ReactNode, useContext, useEffect, useState } from 'react';
-import { Contact } from '../models/Contact';
-import { Conversation } from '../models/Conversation';
+import { Contact } from '../models/contact';
+import { Conversation } from '../models/conversation';
import { setRefreshFromSlice } from '../redux/appSlice';
import { useAppDispatch, useAppSelector } from '../redux/hooks';
import { SetState } from '../utils/utils';
@@ -61,11 +61,13 @@
useEffect(() => {
const controller = new AbortController();
axiosInstance
- .get<Conversation[]>('/conversations', {
+ .get<IConversation[]>('/conversations', {
signal: controller.signal,
})
.then(({ data }) => {
- setConversations(Object.values(data).map((c) => Conversation.from(accountId, c)));
+ setConversations(
+ Object.values(data).map((conversationInterface) => Conversation.fromInterface(conversationInterface))
+ );
});
// return () => controller.abort()
}, [axiosInstance, accountId, refresh]);
@@ -89,15 +91,13 @@
useEffect(() => {
if (!searchQuery) return;
const controller = new AbortController();
- // TODO: Type properly https://git.jami.net/savoirfairelinux/jami-web/-/issues/92
axiosInstance
- .get<{ state: number; address: string; username: string }>(`/ns/username/${searchQuery}`, {
+ .get<LookupResult>(`/ns/username/${searchQuery}`, {
signal: controller.signal,
})
.then(({ data }) => {
- const contact = new Contact(data.address);
- contact.setRegisteredName(data.username);
- setSearchResults(contact ? Conversation.fromSingleContact(accountId, contact) : undefined);
+ const contact = new Contact(data.address, data.username);
+ setSearchResults(contact ? Conversation.fromSingleContact(contact) : undefined);
})
.catch(() => {
setSearchResults(undefined);