Convert files in themes/ services/ contexts/ to TS

Convert all Javascript files in `client/src/themes`, `client/src/service`, `client/src/contexts` to Typescript.
Convert SvgIcon, Input, ConversationView, Button components to Typescript

Gitlab #30

Change-Id: I0d0505c28e21c771906edf8d5e7b8ce36126fa64
diff --git a/client/src/services/Conversation.ts b/client/src/services/Conversation.ts
new file mode 100644
index 0000000..400617c
--- /dev/null
+++ b/client/src/services/Conversation.ts
@@ -0,0 +1,30 @@
+import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
+import axios from 'axios';
+
+export const useConversationQuery = (accountId: string, conversationId: string) => {
+  return useQuery(['conversation', accountId, conversationId], () => fetchConversation(accountId, conversationId), {
+    enabled: !!(accountId && conversationId),
+  });
+};
+
+export const useMessagesQuery = (accountId: string, conversationId: string) => {
+  return useQuery(['messages', accountId, conversationId], () => fetchMessages(accountId, conversationId), {
+    enabled: !!(accountId && conversationId),
+  });
+};
+
+export const useSendMessageMutation = (accountId: string, conversationId: string) => {
+  const queryClient = useQueryClient();
+  return useMutation(
+    (message: string) => axios.post(`/api/accounts/${accountId}/conversations/${conversationId}`, { message }),
+    {
+      onSuccess: () => queryClient.invalidateQueries(['messages', accountId, conversationId]),
+    }
+  );
+};
+
+const fetchConversation = (accountId: string, conversationId: string) =>
+  axios.get(`/api/accounts/${accountId}/conversations/${conversationId}`).then((result) => result.data);
+
+const fetchMessages = (accountId: string, conversationId: string) =>
+  axios.get(`/api/accounts/${accountId}/conversations/${conversationId}/messages`).then((result) => result.data);