diff --git a/packages/core/src/models/content.model.ts b/packages/core/src/models/content.model.ts index 0ed6c04..7c1d0ba 100644 --- a/packages/core/src/models/content.model.ts +++ b/packages/core/src/models/content.model.ts @@ -11,32 +11,28 @@ export interface IContent { // ? persist length of clip for easier viewing for others... // ?they have to load it anyway and will get metadata anyway? -export class AudioClip implements IContent { +export class ContentBlock implements IContent { id: string; constructor( public creatorUserId: string, public contentUrl: string, + + public contentType: ContentType, + public blobType: string, + public createdDate: Timestamp = Timestamp.now(), ) {} } -export class Link implements IContent { - id: string; - constructor( - public creatorUserId: string, - public contentUrl: string, - public createdDate: Timestamp = Timestamp.now(), - ) {} +export enum ContentType { + audio = 'audio', + + link = 'link', + + image = 'image', } -export class Image implements IContent { - id: string; - - constructor( - public creatorUserId: string, - public contentUrl: string, - public thumbnailUrl?: string, - public createdDate: Timestamp = Timestamp.now(), - ) {} +export function isUrlImage(url: string) { + return url.match(/\.(jpeg|jpg|gif|png)$/) != null; } diff --git a/packages/desktop/src/components/Terminal.tsx b/packages/desktop/src/components/Terminal.tsx index 4d9b77a..75065b4 100644 --- a/packages/desktop/src/components/Terminal.tsx +++ b/packages/desktop/src/components/Terminal.tsx @@ -58,9 +58,8 @@ import { joinConversation, leaveConversation, searchUsers, - sendAudioClipToConversation, + sendContentBlockToConversation, } from '../firebase/firestore'; -import { Link, AudioClip, Image } from '@nirvana/core/src/models/content.model'; import { useImmer } from 'use-immer'; import { User } from '@nirvana/core/src/models/user.model'; import { onSnapshot } from 'firebase/firestore'; @@ -71,6 +70,7 @@ import { useDebounce, useEffectOnce, useKeyPressEvent } from 'react-use'; import KeyboardShortcutLabel from './KeyboardShortcutLabel'; import Channels from '../electron/constants'; import { uploadAudioClip } from '../firebase/firebaseStorage'; +import { ContentBlock, ContentType } from '@nirvana/core/src/models/content.model'; type ConversationMap = { [conversationId: string]: Conversation; }; @@ -80,7 +80,7 @@ type UserMap = { }; type ConversationContentMap = { - [conversationId: string]: { audio: AudioClip[]; links: Link[]; images: Image[] }; + [conversationId: string]: ContentBlock[]; }; interface ITerminalContext { @@ -175,7 +175,7 @@ export function TerminalProvider({ children }: { children?: React.ReactNode }) { return () => unsub(); }, [user, updateConversationMap, enqueueSnackbar]); - // cached listeners for audioClips + // cached listeners for a // useEffect(() => { // }, []) @@ -296,8 +296,13 @@ export function TerminalProvider({ children }: { children?: React.ReactNode }) { audioChunks[0], ); - const audioClip = new AudioClip(user.uid, downloadUrl); - await sendAudioClipToConversation(audioClip, selectedConversation.id); + const contentBlock = new ContentBlock( + user.uid, + downloadUrl, + ContentType.audio, + audioChunks[0].type, + ); + await sendContentBlockToConversation(contentBlock, selectedConversation.id); enqueueSnackbar('clip sent!', { variant: 'success' }); } catch (error) { diff --git a/packages/desktop/src/firebase/firestore.ts b/packages/desktop/src/firebase/firestore.ts index 64497ab..0f92407 100644 --- a/packages/desktop/src/firebase/firestore.ts +++ b/packages/desktop/src/firebase/firestore.ts @@ -32,7 +32,7 @@ import Conversation, { MemberState, } from '@nirvana/core/src/models/conversation.model'; import useAuth from '../providers/AuthProvider'; -import { AudioClip } from '@nirvana/core/src/models/content.model'; +import { ContentBlock } from '@nirvana/core/src/models/content.model'; interface Document { id: string; @@ -66,8 +66,8 @@ const db = { conversation: (conversationId: string) => docPoint(`conversations/${conversationId}`), - conversationAudioClips: (conversationId: string) => - collectionPoint(`conversations/${conversationId}/audioClips`), + conversationContent: (conversationId: string) => + collectionPoint(`conversations/${conversationId}/content`), }; // enum COLLECTION { @@ -203,9 +203,12 @@ export const createGroupConversation = async ( } }; -export const sendAudioClipToConversation = async (audioClip: AudioClip, conversationId: string) => { +export const sendContentBlockToConversation = async ( + contentBlock: ContentBlock, + conversationId: string, +) => { try { - await addDoc(db.conversationAudioClips(conversationId), audioClip); + await addDoc(db.conversationContent(conversationId), contentBlock); } catch (e) { console.error('Error ', e);