{"ast":null,"code":"var _jsxFileName = \"/home/gnx/Desktop/gnx-mail/frontend/src/pages/Register.js\",\n _s = $RefreshSig$();\nimport React, { useState } from 'react';\nimport { Link, useNavigate } from 'react-router-dom';\nimport { useForm } from 'react-hook-form';\nimport { Mail, Lock, Eye, EyeOff, User } from 'lucide-react';\nimport { useAuth } from '../hooks/useAuth';\nimport LoadingSpinner from '../components/LoadingSpinner';\nimport { jsxDEV as _jsxDEV } from \"react/jsx-dev-runtime\";\nconst Register = () => {\n _s();\n const [showPassword, setShowPassword] = useState(false);\n const [showConfirmPassword, setShowConfirmPassword] = useState(false);\n const {\n register: registerUser,\n isRegistering\n } = useAuth();\n const navigate = useNavigate();\n const {\n register,\n handleSubmit,\n watch,\n formState: {\n errors\n }\n } = useForm();\n const password = watch('password');\n const onSubmit = async data => {\n try {\n await registerUser(data);\n navigate('/dashboard');\n } catch (error) {\n // Error is handled by the auth hook\n }\n };\n return /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"min-h-screen flex items-center justify-center bg-gray-50 py-12 px-4 sm:px-6 lg:px-8\",\n children: /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"max-w-md w-full space-y-8\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"mx-auto h-12 w-12 flex items-center justify-center rounded-full bg-primary-600\",\n children: /*#__PURE__*/_jsxDEV(Mail, {\n className: \"h-6 w-6 text-white\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 37,\n columnNumber: 13\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 36,\n columnNumber: 11\n }, this), /*#__PURE__*/_jsxDEV(\"h2\", {\n className: \"mt-6 text-center text-3xl font-extrabold text-gray-900\",\n children: \"Create your account\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 39,\n columnNumber: 11\n }, this), /*#__PURE__*/_jsxDEV(\"p\", {\n className: \"mt-2 text-center text-sm text-gray-600\",\n children: [\"Or\", ' ', /*#__PURE__*/_jsxDEV(Link, {\n to: \"/login\",\n className: \"font-medium text-primary-600 hover:text-primary-500\",\n children: \"sign in to your existing account\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 44,\n columnNumber: 13\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 42,\n columnNumber: 11\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 35,\n columnNumber: 9\n }, this), /*#__PURE__*/_jsxDEV(\"form\", {\n className: \"mt-8 space-y-6\",\n onSubmit: handleSubmit(onSubmit),\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"space-y-4\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"grid grid-cols-2 gap-4\",\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n children: [/*#__PURE__*/_jsxDEV(\"label\", {\n htmlFor: \"first_name\",\n className: \"block text-sm font-medium text-gray-700\",\n children: \"First name\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 57,\n columnNumber: 17\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"mt-1 relative\",\n children: [/*#__PURE__*/_jsxDEV(\"input\", {\n ...register('first_name', {\n required: 'First name is required',\n minLength: {\n value: 2,\n message: 'First name must be at least 2 characters'\n }\n }),\n type: \"text\",\n autoComplete: \"given-name\",\n className: `input ${errors.first_name ? 'input-error' : ''}`,\n placeholder: \"First name\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 61,\n columnNumber: 19\n }, this), /*#__PURE__*/_jsxDEV(User, {\n className: \"absolute right-3 top-1/2 transform -translate-y-1/2 h-5 w-5 text-gray-400\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 74,\n columnNumber: 19\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 60,\n columnNumber: 17\n }, this), errors.first_name && /*#__PURE__*/_jsxDEV(\"p\", {\n className: \"mt-1 text-sm text-red-600\",\n children: errors.first_name.message\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 77,\n columnNumber: 19\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 56,\n columnNumber: 15\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n children: [/*#__PURE__*/_jsxDEV(\"label\", {\n htmlFor: \"last_name\",\n className: \"block text-sm font-medium text-gray-700\",\n children: \"Last name\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 82,\n columnNumber: 17\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"mt-1 relative\",\n children: [/*#__PURE__*/_jsxDEV(\"input\", {\n ...register('last_name', {\n required: 'Last name is required',\n minLength: {\n value: 2,\n message: 'Last name must be at least 2 characters'\n }\n }),\n type: \"text\",\n autoComplete: \"family-name\",\n className: `input ${errors.last_name ? 'input-error' : ''}`,\n placeholder: \"Last name\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 86,\n columnNumber: 19\n }, this), /*#__PURE__*/_jsxDEV(User, {\n className: \"absolute right-3 top-1/2 transform -translate-y-1/2 h-5 w-5 text-gray-400\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 99,\n columnNumber: 19\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 85,\n columnNumber: 17\n }, this), errors.last_name && /*#__PURE__*/_jsxDEV(\"p\", {\n className: \"mt-1 text-sm text-red-600\",\n children: errors.last_name.message\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 102,\n columnNumber: 19\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 81,\n columnNumber: 15\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 55,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n children: [/*#__PURE__*/_jsxDEV(\"label\", {\n htmlFor: \"username\",\n className: \"block text-sm font-medium text-gray-700\",\n children: \"Username\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 108,\n columnNumber: 15\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"mt-1 relative\",\n children: [/*#__PURE__*/_jsxDEV(\"input\", {\n ...register('username', {\n required: 'Username is required',\n minLength: {\n value: 3,\n message: 'Username must be at least 3 characters'\n },\n pattern: {\n value: /^[a-zA-Z0-9_]+$/,\n message: 'Username can only contain letters, numbers, and underscores'\n }\n }),\n type: \"text\",\n autoComplete: \"username\",\n className: `input ${errors.username ? 'input-error' : ''}`,\n placeholder: \"Choose a username\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 112,\n columnNumber: 17\n }, this), /*#__PURE__*/_jsxDEV(User, {\n className: \"absolute right-3 top-1/2 transform -translate-y-1/2 h-5 w-5 text-gray-400\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 129,\n columnNumber: 17\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 111,\n columnNumber: 15\n }, this), errors.username && /*#__PURE__*/_jsxDEV(\"p\", {\n className: \"mt-1 text-sm text-red-600\",\n children: errors.username.message\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 132,\n columnNumber: 17\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 107,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n children: [/*#__PURE__*/_jsxDEV(\"label\", {\n htmlFor: \"email\",\n className: \"block text-sm font-medium text-gray-700\",\n children: \"Email address\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 137,\n columnNumber: 15\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"mt-1 relative\",\n children: [/*#__PURE__*/_jsxDEV(\"input\", {\n ...register('email', {\n required: 'Email is required',\n pattern: {\n value: /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}$/i,\n message: 'Invalid email address'\n }\n }),\n type: \"email\",\n autoComplete: \"email\",\n className: `input ${errors.email ? 'input-error' : ''}`,\n placeholder: \"Enter your email\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 141,\n columnNumber: 17\n }, this), /*#__PURE__*/_jsxDEV(Mail, {\n className: \"absolute right-3 top-1/2 transform -translate-y-1/2 h-5 w-5 text-gray-400\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 154,\n columnNumber: 17\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 140,\n columnNumber: 15\n }, this), errors.email && /*#__PURE__*/_jsxDEV(\"p\", {\n className: \"mt-1 text-sm text-red-600\",\n children: errors.email.message\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 157,\n columnNumber: 17\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 136,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n children: [/*#__PURE__*/_jsxDEV(\"label\", {\n htmlFor: \"password\",\n className: \"block text-sm font-medium text-gray-700\",\n children: \"Password\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 162,\n columnNumber: 15\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"mt-1 relative\",\n children: [/*#__PURE__*/_jsxDEV(\"input\", {\n ...register('password', {\n required: 'Password is required',\n minLength: {\n value: 8,\n message: 'Password must be at least 8 characters'\n },\n pattern: {\n value: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)/,\n message: 'Password must contain at least one uppercase letter, one lowercase letter, and one number'\n }\n }),\n type: showPassword ? 'text' : 'password',\n autoComplete: \"new-password\",\n className: `input pr-10 ${errors.password ? 'input-error' : ''}`,\n placeholder: \"Create a password\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 166,\n columnNumber: 17\n }, this), /*#__PURE__*/_jsxDEV(\"button\", {\n type: \"button\",\n className: \"absolute right-3 top-1/2 transform -translate-y-1/2 text-gray-400 hover:text-gray-600\",\n onClick: () => setShowPassword(!showPassword),\n children: showPassword ? /*#__PURE__*/_jsxDEV(EyeOff, {\n className: \"h-5 w-5\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 189,\n columnNumber: 21\n }, this) : /*#__PURE__*/_jsxDEV(Eye, {\n className: \"h-5 w-5\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 191,\n columnNumber: 21\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 183,\n columnNumber: 17\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 165,\n columnNumber: 15\n }, this), errors.password && /*#__PURE__*/_jsxDEV(\"p\", {\n className: \"mt-1 text-sm text-red-600\",\n children: errors.password.message\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 196,\n columnNumber: 17\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 161,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n children: [/*#__PURE__*/_jsxDEV(\"label\", {\n htmlFor: \"password_confirm\",\n className: \"block text-sm font-medium text-gray-700\",\n children: \"Confirm password\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 201,\n columnNumber: 15\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"mt-1 relative\",\n children: [/*#__PURE__*/_jsxDEV(\"input\", {\n ...register('password_confirm', {\n required: 'Please confirm your password',\n validate: value => value === password || 'Passwords do not match'\n }),\n type: showConfirmPassword ? 'text' : 'password',\n autoComplete: \"new-password\",\n className: `input pr-10 ${errors.password_confirm ? 'input-error' : ''}`,\n placeholder: \"Confirm your password\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 205,\n columnNumber: 17\n }, this), /*#__PURE__*/_jsxDEV(\"button\", {\n type: \"button\",\n className: \"absolute right-3 top-1/2 transform -translate-y-1/2 text-gray-400 hover:text-gray-600\",\n onClick: () => setShowConfirmPassword(!showConfirmPassword),\n children: showConfirmPassword ? /*#__PURE__*/_jsxDEV(EyeOff, {\n className: \"h-5 w-5\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 222,\n columnNumber: 21\n }, this) : /*#__PURE__*/_jsxDEV(Eye, {\n className: \"h-5 w-5\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 224,\n columnNumber: 21\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 216,\n columnNumber: 17\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 204,\n columnNumber: 15\n }, this), errors.password_confirm && /*#__PURE__*/_jsxDEV(\"p\", {\n className: \"mt-1 text-sm text-red-600\",\n children: errors.password_confirm.message\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 229,\n columnNumber: 17\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 200,\n columnNumber: 13\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 54,\n columnNumber: 11\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"flex items-center\",\n children: [/*#__PURE__*/_jsxDEV(\"input\", {\n id: \"agree-terms\",\n name: \"agree-terms\",\n type: \"checkbox\",\n required: true,\n className: \"h-4 w-4 text-primary-600 focus:ring-primary-500 border-gray-300 rounded\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 235,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(\"label\", {\n htmlFor: \"agree-terms\",\n className: \"ml-2 block text-sm text-gray-900\",\n children: [\"I agree to the\", ' ', /*#__PURE__*/_jsxDEV(\"a\", {\n href: \"#\",\n className: \"text-primary-600 hover:text-primary-500\",\n children: \"Terms of Service\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 244,\n columnNumber: 15\n }, this), ' ', \"and\", ' ', /*#__PURE__*/_jsxDEV(\"a\", {\n href: \"#\",\n className: \"text-primary-600 hover:text-primary-500\",\n children: \"Privacy Policy\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 248,\n columnNumber: 15\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 242,\n columnNumber: 13\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 234,\n columnNumber: 11\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n children: /*#__PURE__*/_jsxDEV(\"button\", {\n type: \"submit\",\n disabled: isRegistering,\n className: \"group relative w-full flex justify-center py-2 px-4 border border-transparent text-sm font-medium rounded-md text-white bg-primary-600 hover:bg-primary-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary-500 disabled:opacity-50 disabled:cursor-not-allowed\",\n children: isRegistering ? /*#__PURE__*/_jsxDEV(LoadingSpinner, {\n size: \"sm\",\n className: \"text-white\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 261,\n columnNumber: 17\n }, this) : 'Create account'\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 255,\n columnNumber: 13\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 254,\n columnNumber: 11\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 53,\n columnNumber: 9\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 34,\n columnNumber: 7\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 33,\n columnNumber: 5\n }, this);\n};\n_s(Register, \"jYjomS5jgJxyXAjpTa6IXgEcD5s=\", false, function () {\n return [useAuth, useNavigate, useForm];\n});\n_c = Register;\nexport default Register;\nvar _c;\n$RefreshReg$(_c, \"Register\");","map":{"version":3,"names":["React","useState","Link","useNavigate","useForm","Mail","Lock","Eye","EyeOff","User","useAuth","LoadingSpinner","jsxDEV","_jsxDEV","Register","_s","showPassword","setShowPassword","showConfirmPassword","setShowConfirmPassword","register","registerUser","isRegistering","navigate","handleSubmit","watch","formState","errors","password","onSubmit","data","error","className","children","fileName","_jsxFileName","lineNumber","columnNumber","to","htmlFor","required","minLength","value","message","type","autoComplete","first_name","placeholder","last_name","pattern","username","email","onClick","validate","password_confirm","id","name","href","disabled","size","_c","$RefreshReg$"],"sources":["/home/gnx/Desktop/gnx-mail/frontend/src/pages/Register.js"],"sourcesContent":["import React, { useState } from 'react';\nimport { Link, useNavigate } from 'react-router-dom';\nimport { useForm } from 'react-hook-form';\nimport { Mail, Lock, Eye, EyeOff, User } from 'lucide-react';\nimport { useAuth } from '../hooks/useAuth';\nimport LoadingSpinner from '../components/LoadingSpinner';\n\nconst Register = () => {\n const [showPassword, setShowPassword] = useState(false);\n const [showConfirmPassword, setShowConfirmPassword] = useState(false);\n const { register: registerUser, isRegistering } = useAuth();\n const navigate = useNavigate();\n \n const {\n register,\n handleSubmit,\n watch,\n formState: { errors },\n } = useForm();\n\n const password = watch('password');\n\n const onSubmit = async (data) => {\n try {\n await registerUser(data);\n navigate('/dashboard');\n } catch (error) {\n // Error is handled by the auth hook\n }\n };\n\n return (\n
\n Or{' '}\n \n sign in to your existing account\n \n
\n