how profiles can be updated

This commit is contained in:
Ghostie 2024-12-26 22:27:48 -05:00
parent 5b6bbc6883
commit 9b23a1beba
8 changed files with 333 additions and 12 deletions

View File

@ -0,0 +1,81 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use Intervention\Image\ImageManager;
use Intervention\Image\Drivers\Gd\Driver;
use App\Models\User;
class ProfileController extends Controller
{
public function show (User $user)
{
return view ("users.profile", compact ("user"));
}
public function edit ()
{
if (!auth ()->check ()) {
return redirect ()->route ("login");
}
$user = auth ()->user ();
return view ("users.edit", compact ("user"));
}
public function update (Request $request)
{
if (!auth ()->check ()) {
return redirect ()->route ("login");
}
$incoming_fields = $request->validate ([
"avatar" => "image|max:4096",
"bio" => "sometimes|nullable|string",
"general" => "sometimes|nullable|string",
"music" => "sometimes|nullable|string",
"movies" => "sometimes|nullable|string",
"television" => "sometimes|nullable|string",
"books" => "sometimes|nullable|string",
"heroes" => "sometimes|nullable|string"
]);
$user = auth ()->user ();
$fname = $user->id . "-" . uniqid () . ".jpg";
$changing_avatar = false;
if (isset ($incoming_fields["avatar"]) && !empty ($incoming_fields["avatar"]))
{
$manager = new ImageManager (new Driver ());
$image = $manager->read ($request->file ("avatar"));
$image_data = $image->cover (256, 256)->toJpeg ();
Storage::disk ("public")->put ("avatars/" . $fname, $image_data);
$old_avatar = $user->avatar;
$user->avatar = $fname;
$changing_avatar = true;
}
$user->bio = $incoming_fields["bio"];
$user->interests_general = $incoming_fields["general"];
$user->interests_music = $incoming_fields["music"];
$user->interests_movies = $incoming_fields["movies"];
$user->interests_television = $incoming_fields["television"];
$user->interests_books = $incoming_fields["books"];
$user->interests_heroes = $incoming_fields["heroes"];
$user->save ();
if ($changing_avatar)
{
Storage::disk ("public")->delete (str_replace ("/storage/", "", $old_avatar));
}
return back ()->with ("success", "Profile updated successfully!");
}
}

View File

@ -55,9 +55,4 @@ class UserController extends Controller
return redirect ()->route ("login")->with ("success", "You have successfuly logged out!");
}
public function show (User $user)
{
return view ("users.profile", compact ("user"));
}
}

View File

@ -7,6 +7,7 @@
"license": "MIT",
"require": {
"php": "^8.2",
"intervention/image": "^3.10",
"laravel/framework": "^11.31",
"laravel/tinker": "^2.9"
},

146
composer.lock generated
View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "626b9e7ddd47fb7eff9aaa53cce0c9ad",
"content-hash": "64b78dd438697d218ce81a8ea6afcbb3",
"packages": [
{
"name": "brick/math",
@ -1054,6 +1054,150 @@
],
"time": "2023-12-03T19:50:20+00:00"
},
{
"name": "intervention/gif",
"version": "4.2.0",
"source": {
"type": "git",
"url": "https://github.com/Intervention/gif.git",
"reference": "42c131a31b93c440ad49061b599fa218f06f93be"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/Intervention/gif/zipball/42c131a31b93c440ad49061b599fa218f06f93be",
"reference": "42c131a31b93c440ad49061b599fa218f06f93be",
"shasum": ""
},
"require": {
"php": "^8.1"
},
"require-dev": {
"phpstan/phpstan": "^1",
"phpunit/phpunit": "^10.0",
"slevomat/coding-standard": "~8.0",
"squizlabs/php_codesniffer": "^3.8"
},
"type": "library",
"autoload": {
"psr-4": {
"Intervention\\Gif\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Oliver Vogel",
"email": "oliver@intervention.io",
"homepage": "https://intervention.io/"
}
],
"description": "Native PHP GIF Encoder/Decoder",
"homepage": "https://github.com/intervention/gif",
"keywords": [
"animation",
"gd",
"gif",
"image"
],
"support": {
"issues": "https://github.com/Intervention/gif/issues",
"source": "https://github.com/Intervention/gif/tree/4.2.0"
},
"funding": [
{
"url": "https://paypal.me/interventionio",
"type": "custom"
},
{
"url": "https://github.com/Intervention",
"type": "github"
},
{
"url": "https://ko-fi.com/interventionphp",
"type": "ko_fi"
}
],
"time": "2024-09-20T13:35:02+00:00"
},
{
"name": "intervention/image",
"version": "3.10.0",
"source": {
"type": "git",
"url": "https://github.com/Intervention/image.git",
"reference": "1ddc9a096b3a641958515700e09be910bf03a5bd"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/Intervention/image/zipball/1ddc9a096b3a641958515700e09be910bf03a5bd",
"reference": "1ddc9a096b3a641958515700e09be910bf03a5bd",
"shasum": ""
},
"require": {
"ext-mbstring": "*",
"intervention/gif": "^4.2",
"php": "^8.1"
},
"require-dev": {
"mockery/mockery": "^1.6",
"phpstan/phpstan": "^2",
"phpunit/phpunit": "^10.0 || ^11.0",
"slevomat/coding-standard": "~8.0",
"squizlabs/php_codesniffer": "^3.8"
},
"suggest": {
"ext-exif": "Recommended to be able to read EXIF data properly."
},
"type": "library",
"autoload": {
"psr-4": {
"Intervention\\Image\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Oliver Vogel",
"email": "oliver@intervention.io",
"homepage": "https://intervention.io/"
}
],
"description": "PHP image manipulation",
"homepage": "https://image.intervention.io/",
"keywords": [
"gd",
"image",
"imagick",
"resize",
"thumbnail",
"watermark"
],
"support": {
"issues": "https://github.com/Intervention/image/issues",
"source": "https://github.com/Intervention/image/tree/3.10.0"
},
"funding": [
{
"url": "https://paypal.me/interventionio",
"type": "custom"
},
{
"url": "https://github.com/Intervention",
"type": "github"
},
{
"url": "https://ko-fi.com/interventionphp",
"type": "ko_fi"
}
],
"time": "2024-12-21T07:41:40+00:00"
},
{
"name": "laravel/framework",
"version": "v11.36.1",

View File

@ -15,11 +15,11 @@
<div class="inner">
@foreach ($latest_users as $user)
<div class="person">
<a href="#">
<a href="{{ route ('users.show', [ 'user' => $user ]) }}">
<p>{{ $user->name }}</p>
</a>
<a href="#">
<img src="{{ $user->avatar }}" alt="{{ $user->name }}'s profile picture"
<img loading="lazy" src="{{ $user->avatar }}" alt="{{ $user->name }}'s profile picture"
class="pfp-fallback" style="width: 100%; max-height: 95px; aspect-ratio: 1/1">
</a>
</div>

View File

@ -0,0 +1,97 @@
@extends('partials.layout')
@section('title', 'Edit profile')
@section('content')
<div class="row edit-profile">
<div class="col w-20 left"></div>
<div class="col right">
<h1>Edit profile</h1>
<p>All fields are optional and can be left empty</p>
<a href="{{ route ('users.show', [ 'user' => $user ]) }}">« View Profile</a>
<div class="profile-pic">
<h1>{{ $user->name }}</h1>
<br>
<img src="{{ $user->avatar }}" alt="{{ $user->name }}" width="180" height="auto">
<br>
</div>
<hr>
<h1>Profile Picture & Song:</h1>
<br>
<form action="{{ route ('users.edit') }}" method="POST" enctype="multipart/form-data">
@csrf
<small>Select photo:</small>
<input type="file" name="avatar" accept="image/*"><br>
@error("avatar")
<p class="error">{{ $message }}</p>
@enderror
<small>Max file size: 4MB (jpg/png/gif)</small>
<br>
<h1>Bio:</h1>
<br>
<textarea name="bio" id="bio" cols="58" placeholder="Bio">{{ $user->bio }}</textarea>
@error("bio")
<p class="error">{{ $message }}</p>
@enderror
<br>
<small>max limit: 256 characters</small>
<br>
<h1>Interests:</h1>
<br>
<label for="general">General:</label>
<input type="text" name="general" id="general" value="{{ $user->interests_general ? $user->interests_general : '' }}">
@error("general")
<p class="error">{{ $message }}</p>
@enderror
<br>
<br>
<label for="music">Music:</label>
<input type="text" name="music" id="" value="{{ $user->interests_music ? $user->interests_music : '' }}">
@error("music")
<p class="error">{{ $message }}</p>
@enderror
<br>
<br>
<label for="movies">Movies:</label>
<input type="text" name="movies" id="movies" value="{{ $user->interests_movies ? $user->interests_movies : '' }}">
@error("movies")
<p class="error">{{ $message }}</p>
@enderror
<br>
<br>
<label for="television">Television:</label>
<input type="text" name="television" id="television" value="{{ $user->interests_television ? $user->interests_television : '' }}">
@error("television")
<p class="error">{{ $message }}</p>
@enderror
<br>
<br>
<label for="books">Books:</label>
<input type="text" name="books" id="books" value="{{ $user->interests_books ? $user->interests_books : '' }}">
@error("books")
<p class="error">{{ $message }}</p>
@enderror
<br>
<br>
<label for="heroes">Heroes:</label>
<input type="text" name="heroes" id="heroes" value="{{ $user->interests_heroes ? $user->interests_heroes : '' }}">
@error("heroes")
<p class="error">{{ $message }}</p>
@enderror
<br>
<h1>Layout:</h1>
<small>
what you would normally paste into the 'Blurbs' section. Include HTML tags.
</small>
<br>
<textarea name="layout" id="layout" cols="58" placeholder="Layout" disabled></textarea>
<br>
<input type="submit" value="Save">
</form>
</div>
</div>
@endsection

View File

@ -99,9 +99,9 @@
<div class="url-info">
<p>
<b>OurSpace URL:</b>
<b>Federation handle:</b>
</p>
<p>{{ route ('users.show', [ 'user' => $user ]) }}</p>
<p>@php echo "@" . $user->name . "@" . explode ("/", env ("APP_URL"))[2] @endphp</p>
</div>
<div class="table-section">
@ -177,7 +177,7 @@
@if (auth()->user()->is($user))
<div class="profile-info">
<h3>
<a href="#">Edit Your Profile</a>
<a href="{{ route ('users.edit') }}">Edit Your Profile</a>
</h3>
</div>
@endif

View File

@ -4,6 +4,7 @@ use Illuminate\Support\Facades\Route;
use App\Http\Controllers\HomeController;
use App\Http\Controllers\UserController;
use App\Http\Controllers\ProfileController;
Route::get('/', [ HomeController::class, "home" ])->name ("home");
@ -14,6 +15,8 @@ Route::get ("/auth/logout", [ UserController::class, "logout" ])->name ("logout"
Route::post ("/auth/signup", [ UserController::class, "do_signup" ])->middleware ("guest");
Route::post ("/auth/login", [ UserController::class, "do_login" ])->middleware ("guest");
Route::get ("/user/{user:name}", [ UserController::class, "show" ])->name ("users.show");
Route::get ("/user/edit", [ ProfileController::class, "edit" ])->name ("users.edit")->middleware ("auth");
Route::post ("/user/edit", [ ProfileController::class, "update" ])->middleware ("auth");
Route::get ("/user/{user:name}", [ ProfileController::class, "show" ])->name ("users.show");
require __DIR__ . "/api.php";