From 4feda40d8eda511e45071375044d2e6f262fce78 Mon Sep 17 00:00:00 2001 From: TheNozomi <13172293+TheNozomi@users.noreply.github.com> Date: Fri, 9 Jul 2021 18:33:26 -0300 Subject: [PATCH 01/17] feat: discord authentication --- src/components/Auth/SignInForm.jsx | 45 ++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/src/components/Auth/SignInForm.jsx b/src/components/Auth/SignInForm.jsx index 843b4dd..bee4930 100644 --- a/src/components/Auth/SignInForm.jsx +++ b/src/components/Auth/SignInForm.jsx @@ -4,6 +4,7 @@ import { motion } from 'framer-motion' import { Dialog } from '@headlessui/react' import { yupResolver } from '@hookform/resolvers/yup' import * as yup from 'yup' +import Image from 'next/image' import { Input } from '@/components/Input' import { Button } from '@/components/Button' @@ -22,6 +23,8 @@ const schema = yup.object().shape({ export const SignIn = ({ onComplete, onRequestSignUp, unauthorizedMessage }) => { const [loading, setLoading] = useState(false) const [error, setError] = useState(null) + const [discordButtonLoading, setDiscordButtonLoading] = useState(false) + const [discordAuthError, setDiscordAuthError] = useState(null) const { register, handleSubmit, formState } = useForm({ resolver: yupResolver(schema), }) @@ -46,11 +49,33 @@ export const SignIn = ({ onComplete, onRequestSignUp, unauthorizedMessage }) => } } + const discordAuth = async () => { + setDiscordAuthError(null) + setDiscordButtonLoading(true) + try { + const { user, error } = await supabase.auth.signIn({ + provider: 'discord' + }, { + redirectTo: window.location.href + }) + + if (error) { + throw error + } else { + onComplete(user) + } + } catch(error) { + setError(error.error_description || error.message) + } finally { + setDiscordButtonLoading(false) + } + } + return (
-
+

Inicia sesión con tu email y contraseña.

@@ -71,6 +96,22 @@ export const SignIn = ({ onComplete, onRequestSignUp, unauthorizedMessage }) => Iniciar sesión
+
+
+ +
+

{getErrorMessage(discordAuthError)}

Date: Sun, 11 Jul 2021 21:12:18 -0300 Subject: [PATCH 02/17] Fix git class index --- .../data/academy/2-git/{2-git-remote => 3-git-remote}/readme.mdx | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename public/data/academy/2-git/{2-git-remote => 3-git-remote}/readme.mdx (100%) diff --git a/public/data/academy/2-git/2-git-remote/readme.mdx b/public/data/academy/2-git/3-git-remote/readme.mdx similarity index 100% rename from public/data/academy/2-git/2-git-remote/readme.mdx rename to public/data/academy/2-git/3-git-remote/readme.mdx From e815b08696ff43547570fb2fc16c865c3a499208 Mon Sep 17 00:00:00 2001 From: tomasdisk Date: Sun, 11 Jul 2021 21:24:24 -0300 Subject: [PATCH 03/17] hasta luego --- src/pages/profile.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/profile.jsx b/src/pages/profile.jsx index f68bfb1..48d7c8f 100644 --- a/src/pages/profile.jsx +++ b/src/pages/profile.jsx @@ -16,7 +16,7 @@ const Profile = () => { supabase.auth.signOut() }} > - Cerrar sesión + Cerrar sesión, hasta luego! From 14b7dc265d66dd10e078972da424e4bc3c013dc6 Mon Sep 17 00:00:00 2001 From: Ema Lorenzo Date: Sun, 11 Jul 2021 21:28:15 -0300 Subject: [PATCH 04/17] Add a little message to signout button --- src/pages/profile.jsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pages/profile.jsx b/src/pages/profile.jsx index f68bfb1..44cc76c 100644 --- a/src/pages/profile.jsx +++ b/src/pages/profile.jsx @@ -11,6 +11,7 @@ const Profile = () => { <> {user &&
{JSON.stringify(user, null, 2)}
} +

Querés cambiar de cuenta cuenta o salir?

From f18d81d9c8f0966138a583ea56f7612f4d42a120 Mon Sep 17 00:00:00 2001 From: Ema Lorenzo Date: Sun, 11 Jul 2021 21:50:43 -0300 Subject: [PATCH 06/17] Styles for signout message --- src/pages/profile.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/profile.jsx b/src/pages/profile.jsx index b7d1a3c..f55dd49 100644 --- a/src/pages/profile.jsx +++ b/src/pages/profile.jsx @@ -11,7 +11,7 @@ const Profile = () => { <> {user &&
{JSON.stringify(user, null, 2)}
} -

Querés cambiar de cuenta cuenta o salir?

+

Querés cambiar de cuenta cuenta o salir?

From fa7c16c07b4efa3592ea4677e933054c62c8b271 Mon Sep 17 00:00:00 2001 From: Ema Lorenzo Date: Thu, 15 Jul 2021 17:52:54 -0300 Subject: [PATCH 08/17] no me deberia dejar esta vez --- src/pages/profile.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/profile.jsx b/src/pages/profile.jsx index 23314a3..f68bfb1 100644 --- a/src/pages/profile.jsx +++ b/src/pages/profile.jsx @@ -16,7 +16,7 @@ const Profile = () => { supabase.auth.signOut() }} > - Cerrar sezión + Cerrar sesión From bde0348e0b9613022c74b1f7e26c467da3317f6c Mon Sep 17 00:00:00 2001 From: tomasdisk Date: Sun, 18 Jul 2021 22:00:48 -0300 Subject: [PATCH 09/17] add TS support --- next-env.d.ts | 2 ++ package.json | 4 ++++ tsconfig.json | 24 ++++++++++++++++++++++++ yarn.lock | 19 +++++++++++++++++++ 4 files changed, 49 insertions(+) create mode 100644 next-env.d.ts create mode 100644 tsconfig.json diff --git a/next-env.d.ts b/next-env.d.ts new file mode 100644 index 0000000..7b7aa2c --- /dev/null +++ b/next-env.d.ts @@ -0,0 +1,2 @@ +/// +/// diff --git a/package.json b/package.json index 98a3005..000abc0 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "lint": "yarn prettier && yarn eslint", "eslint": "eslint --fix 'src/**/*.{js,jsx}' --ext jsconfig.json", "prettier": "prettier --list-different '**/*.{js,jsx,md}'", + "tsc": "tsc --noEmit", "dev": "next dev", "build": "next build", "export": "EXPORT=true next build && EXPORT=true next export", @@ -49,6 +50,8 @@ "devDependencies": { "@babel/core": "^7.12.17", "@next/bundle-analyzer": "^10.0.7", + "@types/node": "^16.3.3", + "@types/react": "^17.0.14", "autoprefixer": "^10.2.6", "babel-eslint": "^10.1.0", "babel-plugin-glsl": "^1.0.0", @@ -75,6 +78,7 @@ "prettier": "^2.2.1", "raw-loader": "^4.0.2", "tailwindcss": "^2.2.4", + "typescript": "^4.3.5", "url-loader": "^4.1.1", "webpack": "^5.36.2" }, diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..64c56b6 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "target": "es5", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": false, + "forceConsistentCasingInFileNames": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "baseUrl": ".", + "paths": { + "@/*": ["src/*"], + "@/data/*": ["public/data/*"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], + "exclude": ["node_modules"] +} diff --git a/yarn.lock b/yarn.lock index b9c2572..f1f5aec 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2710,6 +2710,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-14.17.1.tgz#5e07e0cb2ff793aa7a1b41deae76221e6166049f" integrity sha512-/tpUyFD7meeooTRwl3sYlihx2BrJE7q9XF71EguPFIySj9B7qgnRtHsHTho+0AUm4m1SvWGm6uSncrR94q6Vtw== +"@types/node@^16.3.3": + version "16.3.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.3.3.tgz#0c30adff37bbbc7a50eb9b58fae2a504d0d88038" + integrity sha512-8h7k1YgQKxKXWckzFCMfsIwn0Y61UK6tlD6y2lOb3hTOIMlK3t9/QwHOhc81TwU+RMf0As5fj7NPjroERCnejQ== + "@types/node@^8.5.7": version "8.10.66" resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.66.tgz#dd035d409df322acc83dff62a602f12a5783bbb3" @@ -2756,6 +2761,15 @@ "@types/scheduler" "*" csstype "^3.0.2" +"@types/react@^17.0.14": + version "17.0.14" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.14.tgz#f0629761ca02945c4e8fea99b8177f4c5c61fb0f" + integrity sha512-0WwKHUbWuQWOce61UexYuWTGuGY/8JvtUe/dtQ6lR4sZ3UiylHotJeWpf3ArP9+DSGUoLY3wbU59VyMrJps5VQ== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + "@types/readable-stream@^2.3.9": version "2.3.10" resolved "https://registry.yarnpkg.com/@types/readable-stream/-/readable-stream-2.3.10.tgz#0f1a512ca30bec5e53d3282133b9237a703e7562" @@ -15496,6 +15510,11 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= +typescript@^4.3.5: + version "4.3.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.5.tgz#4d1c37cc16e893973c45a06886b7113234f119f4" + integrity sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA== + unbox-primitive@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" From 9436f6186d1649b2ffc1bb96e928945d12f8e0f9 Mon Sep 17 00:00:00 2001 From: tomasdisk Date: Sun, 18 Jul 2021 22:01:51 -0300 Subject: [PATCH 10/17] add MDX component --- src/components/MDX.tsx | 18 ++++++++++++++++++ src/pages/academy/[module]/[lesson].jsx | 11 ++--------- src/pages/academy/[module]/index.jsx | 11 ++--------- 3 files changed, 22 insertions(+), 18 deletions(-) create mode 100644 src/components/MDX.tsx diff --git a/src/components/MDX.tsx b/src/components/MDX.tsx new file mode 100644 index 0000000..5667984 --- /dev/null +++ b/src/components/MDX.tsx @@ -0,0 +1,18 @@ +import React from 'react' +import { MDXRemote, MDXRemoteSerializeResult } from 'next-mdx-remote' + +const MDX: React.FC<{ source: MDXRemoteSerializeResult> }> = ({ + source, +}) => { + return ( +
    {children}
, + Image: ({ alt, ...props }) => {alt}, + }} + /> + ) +} + +export default MDX diff --git a/src/pages/academy/[module]/[lesson].jsx b/src/pages/academy/[module]/[lesson].jsx index 88fef05..fb8daf2 100644 --- a/src/pages/academy/[module]/[lesson].jsx +++ b/src/pages/academy/[module]/[lesson].jsx @@ -1,5 +1,4 @@ -import { MDXRemote } from 'next-mdx-remote' - +import MDX from '@/components/MDX' import useStore from '@/lib/store' import { getFolderContent, getLesson, getLessons, getModuleTitle } from '@/lib/files' import { LessonLayout } from '@/layouts/Lesson' @@ -10,13 +9,7 @@ const LessonPage = ({ title, pdfURL, mdxSource, frontMatter, lessons }) => { return ( <> -
    {children}
, - Image: ({ children, ...props }) => {children}, - }} - /> +
) diff --git a/src/pages/academy/[module]/index.jsx b/src/pages/academy/[module]/index.jsx index 5793150..80574ac 100644 --- a/src/pages/academy/[module]/index.jsx +++ b/src/pages/academy/[module]/index.jsx @@ -1,5 +1,4 @@ -import { MDXRemote } from 'next-mdx-remote' - +import MDX from '@/components/MDX' import useStore from '@/lib/store' import { ModuleLayout } from '@/layouts/Module' import { @@ -16,13 +15,7 @@ const Module = ({ mdxSource, title, lessons, frontMatter }) => { return ( <> -
    {children}
, - Image: ({ children, ...props }) => {children}, - }} - /> +
) From b1d46a1e3eb312ce99f4661283b94fcb22485de9 Mon Sep 17 00:00:00 2001 From: tomasdisk Date: Sun, 18 Jul 2021 22:02:06 -0300 Subject: [PATCH 11/17] add git videos --- public/data/academy/2-git/1-git-init/readme.mdx | 2 +- public/data/academy/2-git/2-git-branch/readme.mdx | 2 +- public/data/academy/2-git/3-git-remote/readme.mdx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/public/data/academy/2-git/1-git-init/readme.mdx b/public/data/academy/2-git/1-git-init/readme.mdx index 4651eba..526beee 100644 --- a/public/data/academy/2-git/1-git-init/readme.mdx +++ b/public/data/academy/2-git/1-git-init/readme.mdx @@ -3,7 +3,7 @@ title: 'Git init' publishedAt: '2021-06-24' author: 'Tomas' summary: 'Vamos a ver cómo guardar el progreso de nuestros proyectos y las ventajas de los sistemas de control de versiones. Hay que aprender a usar la consola. Veremos cómo publicar y guardar nuestros proyectos en la nube para accederlos y descargarlos donde queramos, que otros puedan verlo.' -youtubeURL: 'https://www.youtube.com/watch?v=7_d_sx773gs' +youtubeURL: 'https://www.youtube.com/embed/7_d_sx773gs' --- import { themes, Image } from 'mdx-deck' diff --git a/public/data/academy/2-git/2-git-branch/readme.mdx b/public/data/academy/2-git/2-git-branch/readme.mdx index 0a39a65..9b3d5fe 100644 --- a/public/data/academy/2-git/2-git-branch/readme.mdx +++ b/public/data/academy/2-git/2-git-branch/readme.mdx @@ -3,7 +3,7 @@ title: 'Git branch' publishedAt: '2021-06-27' author: 'Tomas' summary: '' -youtubeURL: '' +youtubeURL: 'https://www.youtube.com/embed/y23b5MA8KPc' --- import { themes, Image } from 'mdx-deck' diff --git a/public/data/academy/2-git/3-git-remote/readme.mdx b/public/data/academy/2-git/3-git-remote/readme.mdx index b3af85f..2aea531 100644 --- a/public/data/academy/2-git/3-git-remote/readme.mdx +++ b/public/data/academy/2-git/3-git-remote/readme.mdx @@ -3,7 +3,7 @@ title: 'Git remote' publishedAt: '2021-06-27' author: 'Tomas' summary: '' -youtubeURL: '' +youtubeURL: 'https://www.youtube.com/embed/tchGAii8OC4' --- import { themes, Image } from 'mdx-deck' From 9da6987eee0e9fb42922be6d35a41a80ae06c412 Mon Sep 17 00:00:00 2001 From: tomasdisk Date: Sun, 18 Jul 2021 22:03:36 -0300 Subject: [PATCH 12/17] run prettier and eslint --- README.md | 2 +- next.config.js | 8 ++------ package.json | 3 ++- src/components/Auth/SignInForm.jsx | 23 +++++++++++++---------- src/components/Box.jsx | 4 +--- src/components/Head.jsx | 9 ++------- src/examples/canvas/test_shader.js | 3 +-- src/layouts/Lesson.jsx | 13 +++++++++---- src/layouts/Module.jsx | 4 +--- src/pages/index.jsx | 14 +++++++------- src/pages/profile.jsx | 4 +++- 11 files changed, 42 insertions(+), 45 deletions(-) diff --git a/README.md b/README.md index 8d55939..8466bbc 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,3 @@ # coderhood.dev -This project was bootstrapped with [`create-r3f-app`](https://github.com/RenaudROHLINGER/create-r3f-app) \ No newline at end of file +This project was bootstrapped with [`create-r3f-app`](https://github.com/RenaudROHLINGER/create-r3f-app) diff --git a/next.config.js b/next.config.js index f60d331..25abb1f 100644 --- a/next.config.js +++ b/next.config.js @@ -8,9 +8,7 @@ const withBundleAnalyzer = require('@next/bundle-analyzer')({ const withOffline = require('next-offline') function esbuildLoader(config, options) { - const jsLoader = config.module.rules.find( - (rule) => rule.test && rule.test.test('.js') - ) + const jsLoader = config.module.rules.find((rule) => rule.test && rule.test.test('.js')) if (jsLoader && jsLoader.use) { if (jsLoader.use.length > 0) { jsLoader.use.forEach((e) => { @@ -111,9 +109,7 @@ module.exports = plugins( withOffline, { workboxOpts: { - swDest: process.env.NEXT_EXPORT - ? 'service-worker.js' - : 'static/service-worker.js', + swDest: process.env.NEXT_EXPORT ? 'service-worker.js' : 'static/service-worker.js', runtimeCaching: [ { urlPattern: /^https?.*/, diff --git a/package.json b/package.json index 000abc0..4fcd9d7 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,8 @@ "private": false, "scripts": { "lint": "yarn prettier && yarn eslint", - "eslint": "eslint --fix 'src/**/*.{js,jsx}' --ext jsconfig.json", + "eslint": "eslint --max-warnings 20 'src/**/*.{js,jsx}' --ext jsconfig.json", + "eslint-fix": "eslint --fix 'src/**/*.{js,jsx}' --ext jsconfig.json", "prettier": "prettier --list-different '**/*.{js,jsx,md}'", "tsc": "tsc --noEmit", "dev": "next dev", diff --git a/src/components/Auth/SignInForm.jsx b/src/components/Auth/SignInForm.jsx index bee4930..3795942 100644 --- a/src/components/Auth/SignInForm.jsx +++ b/src/components/Auth/SignInForm.jsx @@ -53,18 +53,21 @@ export const SignIn = ({ onComplete, onRequestSignUp, unauthorizedMessage }) => setDiscordAuthError(null) setDiscordButtonLoading(true) try { - const { user, error } = await supabase.auth.signIn({ - provider: 'discord' - }, { - redirectTo: window.location.href - }) + const { user, error } = await supabase.auth.signIn( + { + provider: 'discord', + }, + { + redirectTo: window.location.href, + } + ) if (error) { throw error } else { onComplete(user) } - } catch(error) { + } catch (error) { setError(error.error_description || error.message) } finally { setDiscordButtonLoading(false) @@ -73,7 +76,7 @@ export const SignIn = ({ onComplete, onRequestSignUp, unauthorizedMessage }) => return (
-
+
-
+
-
-

{getErrorMessage(discordAuthError)}

+
+

{getErrorMessage(discordAuthError)}

{ const mesh = useRef() // Subscribe this to the render-loop, rotate the mesh every frame useFrame((state, delta) => - mesh.current - ? (mesh.current.rotation.y = mesh.current.rotation.x += 0.002) - : null + mesh.current ? (mesh.current.rotation.y = mesh.current.rotation.x += 0.002) : null ) // Return the view, these are regular Threejs elements expressed in JSX return ( diff --git a/src/components/Head.jsx b/src/components/Head.jsx index 0e0e4a1..8290f92 100644 --- a/src/components/Head.jsx +++ b/src/components/Head.jsx @@ -2,15 +2,10 @@ import NextHead from 'next/head' const TITLE = 'Coderhood' const URL = 'https://coderhood.dev/' -const DESCRIPTION = - 'La comunidad que impulsa el aprendizaje autodidacta y colaborativo' +const DESCRIPTION = 'La comunidad que impulsa el aprendizaje autodidacta y colaborativo' const author = 'Ema Lorenzo' -export const Head = ({ - title = TITLE, - url = URL, - description = DESCRIPTION, -}) => { +export const Head = ({ title = TITLE, url = URL, description = DESCRIPTION }) => { return ( <> diff --git a/src/examples/canvas/test_shader.js b/src/examples/canvas/test_shader.js index a2c51e4..6875452 100644 --- a/src/examples/canvas/test_shader.js +++ b/src/examples/canvas/test_shader.js @@ -43,8 +43,7 @@ const TestShader = (props) => { mesh.current.rotation.x = mesh.current.rotation.y += 0.01 } if (mesh.current.material) { - mesh.current.material.uniforms.time.value += - Math.sin(delta / 2) * Math.cos(delta / 2) + mesh.current.material.uniforms.time.value += Math.sin(delta / 2) * Math.cos(delta / 2) } }) diff --git a/src/layouts/Lesson.jsx b/src/layouts/Lesson.jsx index 1ab70c1..8fe52ba 100644 --- a/src/layouts/Lesson.jsx +++ b/src/layouts/Lesson.jsx @@ -26,9 +26,14 @@ export const LessonLayout = ({ title, frontMatter, pdfURL, lessons, children }) {/*

{author}

*/} -

- {publishedAt && format(parseISO(publishedAt), 'MMMM dd, yyyy')} -

+
+

+ {publishedAt && format(parseISO(publishedAt), 'MMMM dd, yyyy')} +

+

+ {author || null} +

+
{pdfURL ? ( ⚡️ Descarga el pdf de la clase

) : ( -

Próximamente

+

Próximamente en PDF

)}
diff --git a/src/layouts/Module.jsx b/src/layouts/Module.jsx index b9f6693..90862ae 100644 --- a/src/layouts/Module.jsx +++ b/src/layouts/Module.jsx @@ -12,9 +12,7 @@ export const ModuleLayout = ({ frontMatter, title, lessons, children }) => {
-
- {children} -
+
{children}
diff --git a/src/pages/index.jsx b/src/pages/index.jsx index 6634c9e..d014258 100644 --- a/src/pages/index.jsx +++ b/src/pages/index.jsx @@ -1,13 +1,13 @@ -import { useState, useEffect } from 'react' +// import { useState, useEffect } from 'react' import { motion } from 'framer-motion' -import { Bubbles } from '@/components/Bubbles' +// import { Bubbles } from '@/components/Bubbles' import { Container } from '@/components/Container' -import { learningBubbles } from '@/data/learningBubbles' -import { useAuth } from '@/hooks/useAuth' -import { Account } from '@/components/Account' +// import { learningBubbles } from '@/data/learningBubbles' +// import { useAuth } from '@/hooks/useAuth' +// import { Account } from '@/components/Account' // import { Auth } from '@/components/Auth/_Signin' -import { AuthModal } from '@/components/Auth' -import { supabase } from '@/lib/supabaseClient' +// import { AuthModal } from '@/components/Auth' +// import { supabase } from '@/lib/supabaseClient' const Home = ({ modules }) => { return ( diff --git a/src/pages/profile.jsx b/src/pages/profile.jsx index f55dd49..34f24ef 100644 --- a/src/pages/profile.jsx +++ b/src/pages/profile.jsx @@ -11,7 +11,9 @@ const Profile = () => { <> {user &&
{JSON.stringify(user, null, 2)}
} -

Querés cambiar de cuenta cuenta o salir?

+

+ Querés cambiar de cuenta cuenta o salir? +