Este es un clon de Discord, una aplicación de chat y voz en tiempo real. Este proyecto está construido con NextJS, TypeScript entre otras librerías.
-
Tailwind: un framework de CSS que permite crear diseños personalizados de manera rápida y sencilla.
-
Shadcn/ui: una librería de componentes de React que proporciona una amplia variedad de elementos de interfaz de usuario.
-
Clerk: una plataforma de autenticación y autorización que permite agregar fácilmente funciones de inicio de sesión y registro a una aplicación.
-
Next-Themes: una librería de React que permite agregar soporte para temas oscuros y claros a una aplicación.
-
Prisma: un ORM (Object-Relational Mapping) para Node.js que permite interactuar con una base de datos de manera sencilla y segura.
-
React Hook Form: una librería de React que permite crear formularios de manera sencilla y eficiente.
-
uploadthing: una librería de React que permite subir archivos a un servidor.
-
react-dropzone: una librería de React que proporciona una zona de arrastrar y soltar para subir archivos.
-
Axios: Nos permite realizar solicitudes HTTP desde el navegador o desde Node.js.
-
UUID: una librería de JavaScript que permite generar identificadores únicos.
-
Zustand: una librería de React que permite gestionar el estado de una aplicación de manera sencilla y eficiente.
-
Query-String: una librería de JavaScript que permite analizar y generar cadenas de consulta.
-
Socket.io: una librería de Node.js que permite agregar soporte para comunicación en tiempo real a una aplicación.
-
Socket.io Client: una librería de JavaScript que permite conectarse a un servidor de Socket.io desde el navegador.
-
emoji-mart, @emoji-mart/data, @emoji-mart/react: una colección de librerías de React que proporcionan una amplia variedad de emojis.
-
@tanstack/react-query: una librería de React que permite realizar solicitudes a una API de manera sencilla y eficiente.
-
LiveKit: LiveKit es una alternativa de código abierto a Twilio Video o Agora. Cree aplicaciones y funciones de audio y video en vivo utilizando una pila WebRTC moderna y de extremo a extremo.
Para ejecutar este proyecto, sigue estos pasos:
-
Clona este repositorio en tu máquina local.
-
Abre una terminal en la carpeta raíz del proyecto.
-
Ejecuta el siguiente comando para instalar las dependencias:
npm install
- Ejecuta el siguiente comando para iniciar la aplicación:
npm run dev
- Abre tu navegador y navega a http://localhost:3000 para ver la aplicación en funcionamiento.
En el archivo .env.local se muestran las variables de entorno a tener en cuenta para el correcto funcionamiento de la aplicación en modo local. A tener en cuenta que la última variable es la url del deploy final
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY= CLERK_SECRET_KEY= NEXT_PUBLIC_CLERK_SIGN_IN_URL= NEXT_PUBLIC_CLERK_SIGN_UP_URL= NEXT_PUBLIC_CLERK_AFTER_SIGN_IN_URL= NEXT_PUBLIC_CLERK_AFTER_SIGN_UP_URL= DATABASE_URL= UPLOADTHING_SECRET= UPLOADTHING_APP_ID= LIVEKIT_API_KEY= LIVEKIT_API_SECRET= NEXT_PUBLIC_LIVEKIT_URL= NEXT_PUBLIC_SITE_URL=
Si deseas contribuir a este proyecto, sigue estos pasos:
-
Haz un fork de este repositorio.
-
Clona tu fork en tu máquina local.
-
Crea una nueva rama para tu contribución:
git checkout -b mi-nueva-funcionalidad
-
Realiza tus cambios y haz commit de tus cambios:
-
Haz push de tus cambios a tu fork:
-
Abre un pull request en este repositorio y describe tus cambios.
-
Espera a que se revise y apruebe tu pull request.
Este proyecto está licenciado bajo la Licencia MIT. Consulta el archivo LICENSE.md para obtener más información.
-
Tailwind
-
Shadcn/ui
-
Clerk
-
Next-Themes
-
Prisma npx prisma generate -> Cada vez que modifiquemos el schema prisma npx prisma db push -> Creamos las colecciones en planetscale o mysql gestion npx prisma studio -> Para ver las tablas
-
React Hook Form
-
uploadthing
-
react-dropzone
-
Axios
-
UUID
-
Zustand
-
Query-String
-
Socket.io
-
Socket.io CLient
-
emoji-mart @emoji-mart/data @emoji-mart/react
-
@tanstack/react-query
-
dat-fns
-
LiveKit
Referencias -> https://www.youtube.com/watch?v=ZbX4Ok9YX94&t=605s
-
const [isMounted, setIsMounted] = useState(false)
-
useEffect(() => { setIsMounted(true) }, [])
-
if (!isMounted) return null