+
Conversaciones
+ {chats ? (
+
+ ) : (
+
+
Aun no tienes conversaciones
+
+ )}
+
Salas grupales
{rooms ? (
) : (
diff --git a/app/(protected)/dashboard/room/[id]/page.tsx b/app/(protected)/dashboard/room/[id]/page.tsx
index b7e5c5e..9293c2f 100644
--- a/app/(protected)/dashboard/room/[id]/page.tsx
+++ b/app/(protected)/dashboard/room/[id]/page.tsx
@@ -3,8 +3,8 @@ import { useQuery } from '@tanstack/react-query';
import MessagesList from '../_components/MessagesList';
import LoadingEmoji from '@/app/_components/LoadingEmoji';
import { use } from 'react';
-import { getRoomMessages } from '../../_apis/messages';
import { getRoomById } from '../../_apis/rooms';
+import { useRoomMessages } from '../hooks/useRoomMessages';
interface RouterProps {
params: Promise<{
@@ -14,23 +14,20 @@ interface RouterProps {
export default function RoomPage({ params }: RouterProps) {
const id = use(params).id;
- const { data: messages, isLoading: messagesLoading } = useQuery({
- queryKey: [`room-messages-${id}`],
- queryFn: () => getRoomMessages(id),
- });
+ const { messages, loading } = useRoomMessages({ id });
const { data: room, isLoading: roomLoading } = useQuery({
queryKey: [`room-${id}`],
queryFn: () => getRoomById(id),
});
- if (messagesLoading || roomLoading) return
;
+ if (loading || roomLoading) return
;
return (
{room?.name}
-
Pública
+
{room?.isPrivate ? 'Privada' : 'Pública'}
{room &&
}
diff --git a/app/(protected)/dashboard/room/_components/CreateChat.tsx b/app/(protected)/dashboard/room/_components/CreateChat.tsx
index bde8d24..6edf644 100644
--- a/app/(protected)/dashboard/room/_components/CreateChat.tsx
+++ b/app/(protected)/dashboard/room/_components/CreateChat.tsx
@@ -6,10 +6,11 @@ import { useState } from 'react';
import { createRoom } from '../../_apis/rooms';
import { ICreateRoom } from '@/app/_lib/_interfaces/IRoom';
import { auth } from '@/app/_lib/_firebase/firebase.config';
+import { useRouter } from 'next/navigation';
export default function CreateChat() {
const [createMode, setCreateMode] = useState(false);
-
+ const router = useRouter();
const queryClient = useQueryClient();
const mutation = useMutation({
@@ -18,6 +19,7 @@ export default function CreateChat() {
if (!res) return;
queryClient.invalidateQueries({ queryKey: [`all-rooms-dashboard`] });
setCreateMode(false);
+ router.push(`/dashboard/room/${res.id}`);
},
});
diff --git a/app/(protected)/dashboard/room/_components/Message.tsx b/app/(protected)/dashboard/room/_components/Message.tsx
index 4707c8f..6fcb8da 100644
--- a/app/(protected)/dashboard/room/_components/Message.tsx
+++ b/app/(protected)/dashboard/room/_components/Message.tsx
@@ -1,7 +1,9 @@
+import { useAuth } from '@/app/_hooks/useAuth';
import { IMessage } from '@/app/_lib/_interfaces/IMessage';
interface Props {
message: IMessage;
+ selectUser: (user: { userId: string; displayName: string }) => void;
}
const colorList = [
@@ -26,15 +28,31 @@ function stringToRGBa(str: string) {
return colorList[index];
}
-export default function Message({ message }: Props) {
+export default function Message({ message, selectUser }: Props) {
+ const { user } = useAuth();
const color = stringToRGBa(message.userId);
+ const handleSelectUser = () => {
+ if (message.userId !== user?.uid) {
+ selectUser({
+ userId: message.userId,
+ displayName: message.displayName,
+ });
+ }
+ };
+
return (
-
{message.userId}
+ {message.userId !== user?.uid ? (
+
+ {message.displayName}
+
+ ) : (
+
Tú
+ )}
{message.content}
{message.status === 'pending'
diff --git a/app/(protected)/dashboard/room/_components/MessagesList.tsx b/app/(protected)/dashboard/room/_components/MessagesList.tsx
index fb4012d..416c36c 100644
--- a/app/(protected)/dashboard/room/_components/MessagesList.tsx
+++ b/app/(protected)/dashboard/room/_components/MessagesList.tsx
@@ -1,13 +1,9 @@
'use client';
-import { useChatSocket } from '@/app/_hooks/useChatSocket';
import { IMessage } from '@/app/_lib/_interfaces/IMessage';
-import Message from './Message';
-import useIsBottom from '@/app/_hooks/useScroll';
-import MessageInput from './MessageInput';
import { IRoom } from '@/app/_lib/_interfaces/IRoom';
-import { useAuth } from '@/app/_hooks/useAuth';
-import MessagesInputBlocked from './MessagesInputBlocked';
+import ChatsInit from '../../_components/ChatsInit';
+import { useRoomSocket } from '@/app/_hooks/useRoomSocket';
interface Props {
room: IRoom;
@@ -15,27 +11,14 @@ interface Props {
}
export default function MessagesList({ room, initial_messages }: Props) {
- const { messages, sendMessage } = useChatSocket({ room, initial_messages });
- const { containerRef, bottomRef } = useIsBottom({ items: messages });
- const user = useAuth(state => state.user);
-
- const canSendMessage = () => room?.members.some(member => member === user?.uid);
+ const { messages, sendMessage, pendingMessages } = useRoomSocket({ room, initial_messages });
return (
- <>
-
- {messages.map(msg => (
-
- ))}
-
-
-
- {canSendMessage() ? (
-
- ) : (
-
- )}
-
- >
+
);
}
diff --git a/app/(protected)/dashboard/room/hooks/useRoomMessages.ts b/app/(protected)/dashboard/room/hooks/useRoomMessages.ts
new file mode 100644
index 0000000..f09ab42
--- /dev/null
+++ b/app/(protected)/dashboard/room/hooks/useRoomMessages.ts
@@ -0,0 +1,26 @@
+import { IMessage } from '@/app/_lib/_interfaces/IMessage';
+import { useEffect, useState } from 'react';
+import { getRoomMessages } from '../../_apis/messages';
+
+interface Props {
+ id: string;
+}
+
+export const useRoomMessages = ({ id }: Props) => {
+ const [messages, setMessages] = useState
([]);
+ const [loading, setLoading] = useState(true);
+
+ useEffect(() => {
+ const getMessages = async () => {
+ const newMessages = await getRoomMessages(id);
+ setMessages(newMessages);
+ setLoading(false);
+ };
+ getMessages();
+ }, [id]);
+
+ return {
+ messages,
+ loading,
+ };
+};
diff --git a/app/_components/AsideDashboard.tsx b/app/_components/AsideDashboard.tsx
index ad8a017..d359afc 100644
--- a/app/_components/AsideDashboard.tsx
+++ b/app/_components/AsideDashboard.tsx
@@ -1,7 +1,7 @@
'use client';
import Image from 'next/image';
import Link from 'next/link';
-import { AnonymousMaskIcon, InfoIcon, LinkIcon, RoomIcon } from '../_ui/icons';
+import { AnonymousMaskIcon, InfoIcon, RoomIcon } from '../_ui/icons';
import { useIsMobileLarge } from '../_hooks/useIsMobileLarge';
import { useAuth } from '../_hooks/useAuth';
import { useRouter } from 'next/navigation';
@@ -44,12 +44,6 @@ export default function AsideDashboard() {
Descubre
-
-
-
- Autores
-
-
@@ -76,27 +70,22 @@ export default function AsideDashboard() {
)}
{/* Mobile aside */}
{isMobileLg && (
-
-
@@ -80,7 +80,6 @@ export default function Header() {
>
Parchemos
- Entrar como Invitado
diff --git a/app/_hooks/useAuth.tsx b/app/_hooks/useAuth.tsx
index c1daf65..72b8fbc 100644
--- a/app/_hooks/useAuth.tsx
+++ b/app/_hooks/useAuth.tsx
@@ -1,3 +1,4 @@
+'use client';
/* eslint-disable @typescript-eslint/no-explicit-any */
import { toast } from 'react-toastify';
import { create } from 'zustand';
@@ -6,17 +7,20 @@ import {
onAuthStateChanged,
setPersistence,
signInWithEmailAndPassword,
+ signInWithPopup,
User,
} from 'firebase/auth';
-import { auth } from '../_lib/_firebase/firebase.config';
+import { auth, googleProvider } from '../_lib/_firebase/firebase.config';
import { loginSchema, registerSchema } from '../(auth)/login/_lib/_schemas/auth';
import { registerUser } from '../_apis/auth';
import { createSession, deleteSession } from '../(auth)/login/_lib/_actions/session';
+import { GoogleAuthProvider } from 'firebase/auth/web-extension';
type Auth = {
user: User | null | undefined;
initializeAuth: () => void;
login: (formData: FormData) => Promise