diff --git a/.gitignore b/.gitignore index 5ef6a52..ce83b01 100644 --- a/.gitignore +++ b/.gitignore @@ -39,3 +39,6 @@ yarn-error.log* # typescript *.tsbuildinfo next-env.d.ts + +# vscode +.vscode/settings.json \ No newline at end of file diff --git a/src/app/page.tsx b/src/app/page.tsx index 9413aa3..a7ffa31 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -67,6 +67,11 @@ const tools: { description: "Test your speed and practice typing code.", href: "https://wpm.silver.dev", }, + { + title: "Roast My Setup", + description: "Recíbi feedback de tu setup.", + href: "/roast-my-setup", + }, ], }, { diff --git a/src/app/roast-my-setup/page.tsx b/src/app/roast-my-setup/page.tsx new file mode 100644 index 0000000..fbb6f9d --- /dev/null +++ b/src/app/roast-my-setup/page.tsx @@ -0,0 +1,68 @@ +"use client"; + +import { Metadata } from "next"; +import Description from "@/components/description"; +import Heading from "@/components/heading"; +import Section from "@/components/section"; +import Spacer from "@/components/spacer"; +import { Button } from "@/components/ui/button"; +import ErrorBadge from "@/components/ui/error-badge"; +import Link from "next/link"; +import { useRouter } from "next/navigation"; +import { useState } from "react"; + +export const metadata: Metadata = { + title: "Roast My Setup", + description: "Submit your setup and get a roast for improvement.", + openGraph: { + title: "Roast My Setup • Open Silver", + description: "Show off your setup and get roasted for fun and improvement.", + type: "website", + }, +}; + +export default function Home() { + const router = useRouter(); + const [error, setError] = useState(null); + + const requestCameraAndMicrophone = () => { + navigator.mediaDevices + .getUserMedia({ video: true, audio: true }) + .then((stream) => { + router.push("/roast-my-setup/roaster"); + }) + .catch((err) => { + setError(new Error("Access to microphone not granted.")); + }); + }; + + return ( +
+ + + Roast My{" "} + Setup + + + Get feedback from your setup. + Como te ven los demas? + +
+ +
+ + +
+ + Política de Privacidad + +
+
+ ); +} diff --git a/src/app/roast-my-setup/privacy/page.tsx b/src/app/roast-my-setup/privacy/page.tsx new file mode 100644 index 0000000..e3db649 --- /dev/null +++ b/src/app/roast-my-setup/privacy/page.tsx @@ -0,0 +1,65 @@ +import Heading from "@/components/heading"; +import Section from "@/components/section"; +import Spacer from "@/components/spacer"; + +export default function Page() { + return ( +
+ Política de Privacidad + +

+ Gracias por utilizar Roast my Setup. Su privacidad es muy importante + para nosotros, y estamos comprometidos a ser transparentes sobre cómo + manejamos sus datos. A continuación, encontrará los detalles sobre + nuestras prácticas de privacidad: +

+
    +
  • +

    + No almacenamos grabaciónes, audio ni información personal +

    +

    + La herramienta Roast my Setup no almacena los videos ni ninguna + información contenida en ellos en nuestros servidores ni en ningún + otro lugar. Una vez que su documento es procesado, todos los datos + se eliminan de forma inmediata. +

    +
  • +
  • +

    + Uso de tecnología de inteligencia artificial +

    +

    + Para el análisis y retroalimentación del contenido, la herramienta + utiliza Gemini AI. Este proceso se realiza de manera segura y no se + retiene ningún dato después del análisis. +

    +
  • +
  • +

    Seguridad de los datos

    +

    + Nos aseguramos de que sus datos sean procesados en un entorno + seguro. Dado que no almacenamos información, no existe riesgo de + acceso no autorizado ni de uso indebido de sus datos. +

    +
  • +
  • +

    Servicios de terceros

    +

    + La herramienta Roast My Setup utiliza [Redacted] para el análisis + del contenido y la generación de feedback. [Redacted] opera bajo sus + propias políticas de privacidad y seguridad, diseñadas para manejar + sus datos de manera responsable. +

    +
  • +
  • +

    Su consentimiento

    +

    + Al utilizar la herramienta Roast my Setup, usted acepta los términos + descritos en esta Política de Privacidad. +

    +
  • +
+
+ ); +} diff --git a/src/app/roast-my-setup/roaster/page.tsx b/src/app/roast-my-setup/roaster/page.tsx new file mode 100644 index 0000000..08d1ec1 --- /dev/null +++ b/src/app/roast-my-setup/roaster/page.tsx @@ -0,0 +1,36 @@ +"use client"; + +import { Card } from "@/components/ui/card"; +import { useEffect, useRef } from "react"; + +export default function Roaster() { + const videoRef = useRef(null); + + useEffect(() => { + navigator.mediaDevices + .getUserMedia({ video: true }) + .then((stream) => { + if (videoRef.current) { + videoRef.current.srcObject = stream; + } + }) + .catch((err) => { + console.error("Error al acceder a la cámara:", err); + }); + }, []); + + return ( +
+
+
+ Say "Roast my Setup" +
+ ); +} diff --git a/src/resume-checker/components/error-badge.tsx b/src/components/ui/error-badge.tsx similarity index 100% rename from src/resume-checker/components/error-badge.tsx rename to src/components/ui/error-badge.tsx diff --git a/src/resume-checker/pages/index.tsx b/src/resume-checker/pages/index.tsx index cd2081a..5d8da7f 100644 --- a/src/resume-checker/pages/index.tsx +++ b/src/resume-checker/pages/index.tsx @@ -6,7 +6,7 @@ import Heading from "@/components/heading"; import Section from "@/components/section"; import Spacer, { spaceSizes } from "@/components/spacer"; import { Button } from "@/components/ui/button"; -import ErrorBadge from "@/resume-checker/components/error-badge"; +import ErrorBadge from "@/components/ui/error-badge"; import { useFormState } from "@/resume-checker/hooks/form-context"; import { useMutationState } from "@tanstack/react-query"; import Link from "next/link";