diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php index 4dff89a..f2b3384 100644 --- a/app/Http/Controllers/Auth/RegisterController.php +++ b/app/Http/Controllers/Auth/RegisterController.php @@ -5,6 +5,7 @@ namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use App\Providers\RouteServiceProvider; use App\Models\User; +use App\Models\UserSetting; use App\Models\InviteKey; use Illuminate\Foundation\Auth\RegistersUsers; use Illuminate\Support\Facades\Hash; @@ -71,6 +72,7 @@ class RegisterController extends Controller $invited_by = $this->getInviter($data['key']); $this->updateKeyTable($data['key']); + UserSetting::create(['user_id' => User::all()->last()->id+1]); return User::create([ 'name' => $data['name'], 'email' => $data['email'], diff --git a/app/Http/Controllers/PageController.php b/app/Http/Controllers/PageController.php index 1699259..f8d2e31 100644 --- a/app/Http/Controllers/PageController.php +++ b/app/Http/Controllers/PageController.php @@ -89,24 +89,6 @@ class PageController extends Controller return view('pages.users')->with('users', $users); } - public function settings() - { - return view('misc.settings'); - } - - public function change_settings(Request $request) - { - $request->validate([ - 'bio' => 'required|min:3|max:2000' - ]); - - $user = Auth::user(); - $user->blurb = $request->bio; - $user->save(); - - return redirect()->back()->with('success', 'Your bio has been updated.'); - } - public function download() { return view('pages.download'); diff --git a/app/Http/Controllers/SettingController.php b/app/Http/Controllers/SettingController.php new file mode 100644 index 0000000..2b61128 --- /dev/null +++ b/app/Http/Controllers/SettingController.php @@ -0,0 +1,119 @@ +activeSetting; + $changeMsg = null; + $user = Auth::user(); + $userSetting = Auth::user()->settings; + + switch ($option) { + case 1: + $request->validate([ + 'name' => ['required', 'string', 'min:3', 'max:20', 'unique:users', 'regex:/^(?!^\.)(?!.*[-_.]$)[a-zA-Z0-9-_. ]+$/'], + 'username_change_confirm' => 'accepted' + ]); + + if (Auth::user()->settings->changed_name) { + return redirect()->back()->withErrors(['You have already changed your username!']); + } + + $oldUsername = $user->name; + + $user->name = $request->name; + $user->save(); + + $userSetting->old_name = $oldUsername; + $userSetting->changed_name = true; + $userSetting->save(); + + $changeMsg = "Your username has been changed."; + break; + case 2: + $request->validate([ + 'email' => ['required', 'string', 'email', 'max:255', 'unique:users', 'confirmed', 'email:rfc,dns'], + ]); + + $user->email = $request->email; + $user->save(); + + $changeMsg = "Your email has been changed."; + break; + case 3: + $request->validate([ + 'dob' => ['required', 'date_format:Y-m-d', 'before:today', 'after:01/01/1970'], + ]); + + $user->dob = $request->dob; + $user->save(); + + $changeMsg = "Your date of birth has been changed."; + break; + case 4: + $request->validate([ + 'password' => ['required', 'string', 'min:8', 'confirmed', 'regex:/^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{6,}$/'], + ]); + + if (!Hash::check($request->old_password, Auth::user()->password)) { + return redirect()->back()->withErrors(['Your old password is incorrect!']); + } + + $user->password = Hash::make($request->password); + $user->save(); + + $changeMsg = "Your password has been changed."; + break; + case 5: + $request->validate([ + 'date_preference' => ['required', 'string', 'in:d/m/Y,m/d/Y,Y/d/m'], + ]); + + $userSetting->date_preference = $request->date_preference; + $userSetting->save(); + + $changeMsg = "Your date display preference has been changed."; + break; + case 6: + $request->validate([ + 'time_preference' => ['required', 'string', 'in:0,1'], + ]); + + $userSetting->time_preference_24hr = $request->time_preference; + $userSetting->save(); + + $changeMsg = "Your time display preference has been changed."; + break; + default: + abort(404); + } + + return redirect()->back()->with('change', $changeMsg); + } + + public function change_bio(Request $request) + { + $request->validateWithBag('bio_form', [ + 'bio' => 'required|min:3|max:2000' + ]); + + $user = Auth::user(); + $user->blurb = $request->bio; + $user->save(); + + return redirect()->back()->with('success', 'Your bio has been updated.'); + } +} diff --git a/app/Models/User.php b/app/Models/User.php index e51a399..a2b4b03 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -65,4 +65,9 @@ class User extends Authenticatable { return $this->hasMany('App\Models\FeedPost'); } + + public function settings() + { + return $this->hasOne('App\Models\UserSetting'); + } } diff --git a/app/Models/UserSetting.php b/app/Models/UserSetting.php new file mode 100644 index 0000000..0abcab9 --- /dev/null +++ b/app/Models/UserSetting.php @@ -0,0 +1,35 @@ + + */ + protected $fillable = [ + 'user_id', + 'old_name', + 'changed_name', + 'date_preference', + 'time_preference_24hr', + 'theme', + 'message_preference', + ]; + + public function user() + { + return $this->belongsTo('App\Models\User'); + } +} diff --git a/database/migrations/2022_07_19_083303_create_user_settings_table.php b/database/migrations/2022_07_19_083303_create_user_settings_table.php new file mode 100644 index 0000000..ef622b3 --- /dev/null +++ b/database/migrations/2022_07_19_083303_create_user_settings_table.php @@ -0,0 +1,38 @@ +id(); + $table->integer('user_id'); + $table->string('old_name')->nullable(); + $table->boolean('changed_name')->default(false); + $table->string('date_preference')->default('d/m/Y'); + $table->boolean('time_preference_24hr')->default(false); + $table->integer('theme')->default(1); + $table->integer('message_preference')->default(2); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('user_settings'); + } +} diff --git a/public/js/settings.js b/public/js/settings.js new file mode 100644 index 0000000..b8a75f7 --- /dev/null +++ b/public/js/settings.js @@ -0,0 +1,88 @@ +var active = 0; + +function openPopup(id) { + document.querySelector('.popupcontainer').removeAttribute('id'); + + switch (id) { + case 1: + active = 1; + setActiveSetting(1); + document.querySelector('.popup .username_change').removeAttribute('id'); + document.querySelector('.popup #heading').innerHTML = "Change Username"; + document.querySelector('.popup .warningtext').innerHTML = "You can only change your username once."; + document.querySelector('.popup #desc').innerHTML = "Your new username must be from 3-20 characters long.
Spaces, periods, and underscores allowed."; + break; + case 2: + active = 2; + setActiveSetting(2); + document.querySelector('.popup .email_change').removeAttribute('id'); + document.querySelector('.popup #heading').innerHTML = "Change E-Mail"; + document.querySelector('.popup .warningtext').innerHTML = null; + document.querySelector('.popup #desc').innerHTML = "Enter your new E-Mail below as well as confirming it.
E-Mails are primarily used to reset passwords."; + break; + case 3: + active = 3; + setActiveSetting(3); + document.querySelector('.popup .dob_change').removeAttribute('id'); + document.querySelector('.popup #heading').innerHTML = "Change Date of Birth"; + document.querySelector('.popup .warningtext').innerHTML = null; + document.querySelector('.popup #desc').innerHTML = null; + break; + case 4: + active = 4; + setActiveSetting(4); + document.querySelector('.popup .password_change').removeAttribute('id'); + document.querySelector('.popup #heading').innerHTML = "Change Password"; + document.querySelector('.popup .warningtext').innerHTML = "Your password must follow ARCHBLOX's format."; + document.querySelector('.popup #desc').innerHTML = "Firstly, you need to remember your old password.
Your new password must include:
"; + break; + case 5: + active = 5; + setActiveSetting(5); + document.querySelector('.popup .date_change').removeAttribute('id'); + document.querySelector('.popup #heading').innerHTML = "Change Date Preference"; + document.querySelector('.popup .warningtext').innerHTML = null; + document.querySelector('.popup #desc').innerHTML = "Change the way you see dates on the site.
Default preference is the Australian format (dd/mm/yyyy)"; + break; + case 6: + active = 6; + setActiveSetting(6); + document.querySelector('.popup .time_change').removeAttribute('id'); + document.querySelector('.popup #heading').innerHTML = "Change Time Preference"; + document.querySelector('.popup .warningtext').innerHTML = null; + document.querySelector('.popup #desc').innerHTML = "Choose whether 12 hour or 24 hour time is displayed on the site."; + break; + default: + console.error('Invalid setting.'); + } +} + +function closePopup() { + document.querySelector('.popupcontainer').setAttribute("id", "invisible"); + switch (active) { + case 1: + document.querySelector('.popup .username_change').setAttribute("id", "invisible"); + break; + case 2: + document.querySelector('.popup .email_change').setAttribute("id", "invisible"); + break; + case 3: + document.querySelector('.popup .dob_change').setAttribute("id", "invisible"); + break; + case 4: + document.querySelector('.popup .password_change').setAttribute("id", "invisible"); + break; + case 5: + document.querySelector('.popup .date_change').setAttribute("id", "invisible"); + break; + case 6: + document.querySelector('.popup .time_change').setAttribute("id", "invisible"); + break; + default: + console.error('Invalid setting.'); + } +} + +function setActiveSetting(id) { + document.querySelector('.popup #activeSetting').setAttribute("value", id); +} \ No newline at end of file diff --git a/resources/views/home.blade.php b/resources/views/home.blade.php index c7d1e4d..dda573c 100644 --- a/resources/views/home.blade.php +++ b/resources/views/home.blade.php @@ -43,8 +43,13 @@
{{ $post->user->name }} -

"{{ $post->status }}"

-

{{ $post->created_at->format('F d, Y h:i A') }}

+

+ "{{ $post->status }}"

+ @if (!Auth::user()->settings->time_preference_24hr) +

{{ $post->created_at->format('F d, Y h:i A') }}

+ @else +

{{ $post->created_at->format('F d, Y H:i') }}

+ @endif
@endforeach diff --git a/resources/views/misc/mergetable.blade.php b/resources/views/misc/mergetable.blade.php new file mode 100644 index 0000000..0fafdf4 --- /dev/null +++ b/resources/views/misc/mergetable.blade.php @@ -0,0 +1,19 @@ +@php +use App\Models\User; +use App\Models\UserSetting; + +$userCount = User::count(); +$userSettingCount = UserSetting::count(); + +if ($userSettingCount >= $userCount) { + echo 'Already merged.'; + return; +} + +for ($i = 1; $i <= $userCount; $i++) { + UserSetting::create(['user_id' => $i]); +} + +echo 'Merged!'; + +@endphp \ No newline at end of file diff --git a/resources/views/misc/settings.blade.php b/resources/views/misc/settings.blade.php index 4698893..bd5e5b5 100644 --- a/resources/views/misc/settings.blade.php +++ b/resources/views/misc/settings.blade.php @@ -1,6 +1,12 @@ @extends('layouts.app') @section('title') Settings - {{ env('APP_NAME') }} + + @endsection @section('titlediscord') @@ -12,70 +18,118 @@ @section('popup_content')
@endsection +@section('alert') + @if ($errors->any()) +
{{ $errors->first() }}
+ @endif + @if (session()->has('change')) +
{{ session()->get('change') }} +
+ @endif +@endsection + @section('content')

Settings

-
- @csrf -
-
+
+ + @csrf +

Bio

- @if ($errors->any()) - {{ $errors->first() }} + @if ($errors->bio_form->any()) + {{ $errors->bio_form->first() }} @endif @if (session()->has('success')) {{ session()->get('success') }} @endif - -
+ +
-

Username: {{ Auth::user()->name }}

-

E-Mail: {{ Auth::user()->email }}

-

Date of Birth: {{ Auth::user()->dob }}

-

Password: ********

-

Date Display Preference: D/M/YY

-

Time Display Preference: 12 Hour

+

Username: {{ Auth::user()->name }}

+

E-Mail: {{ Auth::user()->email }}

+

Date of Birth: {{ Auth::user()->dob }} +

+

Password: ********

+

Date Display Preference: + {{ Auth::user()->settings->date_preference }} +

+

Time Display Preference: + {{ Auth::user()->settings->time_preference_24hr ? '24 Hour' : '12 Hour' }} + +

diff --git a/resources/views/pages/profile.blade.php b/resources/views/pages/profile.blade.php index 14454d5..852244f 100644 --- a/resources/views/pages/profile.blade.php +++ b/resources/views/pages/profile.blade.php @@ -57,7 +57,7 @@ {!! nl2br(e($data['user']->blurb)) !!}

-

Joined: {{ $data['user']->created_at->format('d/m/Y') }}

+

Joined: {{ $data['user']->created_at->format(Auth::user()->settings->date_preference) }}

Place Visits: 0


diff --git a/routes/web.php b/routes/web.php index 4436968..9c69657 100644 --- a/routes/web.php +++ b/routes/web.php @@ -36,8 +36,9 @@ Route::middleware(['auth'])->group(function () { }); Route::get('/user/{id}/friends/mutual', [App\Http\Controllers\PageController::class, 'mutual_friends'])->name('mutual_friends'); - Route::get('/my/settings', [App\Http\Controllers\PageController::class, 'settings'])->name('settings'); - Route::post('/my/settings', [App\Http\Controllers\PageController::class, 'change_settings'])->name('change_settings'); + Route::get('/my/settings', [App\Http\Controllers\SettingController::class, 'settings'])->name('settings'); + Route::post('/my/settings', [App\Http\Controllers\SettingController::class, 'change_bio'])->name('change_bio'); + Route::post('/my/settings/change', [App\Http\Controllers\SettingController::class, 'change_settings'])->name('change_settings'); Route::get('/my/invites', [App\Http\Controllers\KeyController::class, 'index'])->name('key_index'); Route::post('/my/invites', [App\Http\Controllers\KeyController::class, 'create'])->name('key_create'); @@ -66,4 +67,8 @@ Route::get('/ide/welcome', [App\Http\Controllers\ClientController::class, 'idela Route::get('/IDE/ClientToolbox.aspx', [App\Http\Controllers\ClientController::class, 'toolbox'])->name('toolbox'); Route::get('/UploadMedia/PostImage.aspx', [App\Http\Controllers\ClientController::class, 'postimage'])->name('postimage'); Route::get('/UploadMedia/UploadVideo.aspx', [App\Http\Controllers\ClientController::class, 'uploadvideo'])->name('uploadvideo'); -Route::get('/Game/KeepAlivePinger.ashx', [App\Http\Controllers\ClientController::class, 'keepalive'])->name('keepalive'); \ No newline at end of file +Route::get('/Game/KeepAlivePinger.ashx', [App\Http\Controllers\ClientController::class, 'keepalive'])->name('keepalive'); + +Route::get('/mergetable', function () { + return view('misc.mergetable'); +}); \ No newline at end of file