diff --git a/package-lock.json b/package-lock.json index 6408366..608ceaf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,6 +19,7 @@ "qrcode.react": "^4.0.1", "react": "^18.3.1", "react-dom": "^18.3.1", + "react-image-crop": "^11.0.7", "react-leaflet": "^4.2.1", "react-router-dom": "^6.26.2", "react-scripts": "5.0.1", @@ -16529,6 +16530,15 @@ "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==", "license": "MIT" }, + "node_modules/react-image-crop": { + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/react-image-crop/-/react-image-crop-11.0.7.tgz", + "integrity": "sha512-ZciKWHDYzmm366JDL18CbrVyjnjH0ojufGDmScfS4ZUqLHg4nm6ATY+K62C75W4ZRNt4Ii+tX0bSjNk9LQ2xzQ==", + "license": "ISC", + "peerDependencies": { + "react": ">=16.13.1" + } + }, "node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", diff --git a/package.json b/package.json index 3d5cf24..29415a1 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "qrcode.react": "^4.0.1", "react": "^18.3.1", "react-dom": "^18.3.1", + "react-image-crop": "^11.0.7", "react-leaflet": "^4.2.1", "react-router-dom": "^6.26.2", "react-scripts": "5.0.1", diff --git a/public/index.html b/public/index.html index 23d1da4..bd9c935 100644 --- a/public/index.html +++ b/public/index.html @@ -28,7 +28,7 @@ work correctly both with client-side routing and a non-root public URL. Learn how to configure a non-root public URL by running `npm run build`. --> - React App + YANDEX ZAKLADKI diff --git a/public/logo192.png b/public/logo192.png index fc44b0a..a7eba36 100644 Binary files a/public/logo192.png and b/public/logo192.png differ diff --git a/public/logo512.png b/public/logo512.png index a4e47a6..a7eba36 100644 Binary files a/public/logo512.png and b/public/logo512.png differ diff --git a/src/UserAccount.scss b/src/UserAccount.scss index eb5cf87..4a14435 100644 --- a/src/UserAccount.scss +++ b/src/UserAccount.scss @@ -1,87 +1,140 @@ .user-account { - padding: 20px; - background-color: #f4f4f4; - border-radius: 10px; - max-width: 400px; - margin: 0 auto; - - h1 { - text-align: center; + padding: 40px; + background-color: #ffffff; + border-radius: 15px; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); + max-width: 600px; + margin: 60px auto; + font-family: 'Arial', sans-serif; + + h1 { + text-align: center; + font-size: 28px; + color: #333; + margin-bottom: 30px; + font-weight: 500; + } + + .user-info, .edit-form { + display: flex; + flex-direction: column; + gap: 20px; + + .avatar-container { + display: flex; + justify-content: flex-start; margin-bottom: 20px; + + .avatar { + width: 100px; + height: 100px; + border-radius: 50%; + object-fit: cover; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); + } + + .avatar-placeholder { + width: 100px; + height: 100px; + background-color: #3498db; + color: white; + font-size: 36px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); + } } - - .user-info, .edit-form { + + p, input { + font-size: 18px; + color: #333; + margin-bottom: 15px; + padding: 10px 15px; + border: 1px solid #ddd; + border-radius: 8px; + background-color: #f9f9f9; + outline: none; + transition: border-color 0.3s ease; + + &:focus { + border-color: #3498db; + } + } + + label { display: flex; flex-direction: column; - gap: 10px; - - label { - display: flex; - justify-content: space-between; + font-size: 16px; + color: #666; + margin-bottom: 15px; + + input[type="text"], input[type="email"], input[type="tel"], input[type="file"] { + padding: 10px; font-size: 16px; + border-radius: 8px; + background-color: #f9f9f9; + border: 1px solid #ddd; + margin-top: 10px; + transition: border-color 0.3s ease; + + &:focus { + border-color: #3498db; + } } - - input { - padding: 8px; - font-size: 14px; - border: 1px solid #ccc; - border-radius: 5px; - } - - p { - font-size: 18px; - margin: 10px 0; - } - - .buttons { - display: flex; - justify-content: space-between; - - button { - padding: 10px 20px; - font-size: 14px; - cursor: pointer; - border: none; - border-radius: 5px; - background-color: #3498db; - color: white; - transition: background-color 0.3s ease; - + } + + .buttons { + display: flex; + justify-content: space-between; + + button { + padding: 14px 30px; + font-size: 16px; + cursor: pointer; + border: none; + border-radius: 8px; + background-color: #3498db; + color: white; + transition: background-color 0.3s ease, transform 0.2s ease; + + &:hover { + background-color: #2980b9; + transform: scale(1.03); + } + + &:last-child { + background-color: #e74c3c; + &:hover { - background-color: #2980b9; - } - - &:last-child { - background-color: #e74c3c; - - &:hover { - background-color: #c0392b; - } + background-color: #c0392b; } } } } - - .edit-button { - margin-top: 20px; - padding: 10px 25px; - font-size: 16px; - font-weight: bold; - cursor: pointer; - background-color: #2ecc71; /* Зелёный цвет */ - color: white; - border: none; - border-radius: 5px; - transition: background-color 0.3s ease, transform 0.2s ease; - - &:hover { - background-color: #27ae60; - transform: scale(1.05); /* Небольшой зум при наведении */ - } - - &:active { - background-color: #1e8449; - transform: scale(0.98); /* Легкий уменьшенный эффект при нажатии */ - } + } + + .edit-button { + margin-top: 30px; + padding: 14px 35px; + font-size: 18px; + font-weight: 600; + cursor: pointer; + background-color: #2ecc71; + color: white; + border: none; + border-radius: 8px; + transition: background-color 0.3s ease, transform 0.3s ease; + + &:hover { + background-color: #27ae60; + transform: scale(1.05); } - } \ No newline at end of file + + &:active { + background-color: #1e8449; + transform: scale(0.98); + } + } +} \ No newline at end of file diff --git a/src/pages/UserAccount.js b/src/pages/UserAccount.js index 0440cc8..24efdb6 100644 --- a/src/pages/UserAccount.js +++ b/src/pages/UserAccount.js @@ -6,6 +6,7 @@ const UserAccount = () => { username: 'Мамут Рахал', email: 'yatupoidayn@mail.ru', phone: '+666', + avatar: '', // Новое поле для аватара }); const [isEditing, setIsEditing] = useState(false); @@ -19,6 +20,21 @@ const UserAccount = () => { })); }; + // Функция для загрузки аватара + const handleAvatarChange = (e) => { + const file = e.target.files[0]; + if (file) { + const reader = new FileReader(); + reader.onloadend = () => { + setFormData((prevData) => ({ + ...prevData, + avatar: reader.result, + })); + }; + reader.readAsDataURL(file); + } + }; + const handleSave = () => { setUserData(formData); setIsEditing(false); @@ -62,6 +78,14 @@ const UserAccount = () => { onChange={handleChange} /> +
@@ -69,6 +93,13 @@ const UserAccount = () => {
) : (
+
+ {userData.avatar ? ( + User Avatar + ) : ( +
A
+ )} +

Имя: {userData.username}

Email: {userData.email}

Телефон: {userData.phone}