File tree Expand file tree Collapse file tree 5 files changed +122
-22
lines changed Expand file tree Collapse file tree 5 files changed +122
-22
lines changed Original file line number Diff line number Diff line change 1+ <?php
2+
3+ namespace App \Livewire ;
4+
5+ use App \Concerns \SendsAlerts ;
6+ use App \Jobs \UpdateUserIdenticonStatus ;
7+ use App \Models \User ;
8+ use Illuminate \Support \Facades \RateLimiter ;
9+ use Illuminate \View \View ;
10+ use Livewire \Component ;
11+
12+ final class RefreshAvatar extends Component
13+ {
14+ use SendsAlerts;
15+
16+ public User $ user ;
17+
18+ public function mount (User $ user ): void
19+ {
20+ $ this ->user = $ user ;
21+ }
22+
23+ public function refresh (): void
24+ {
25+ if (! $ this ->user ->hasConnectedGitHubAccount ()) {
26+ $ this ->error ('You need to connect your GitHub account to refresh your avatar. ' );
27+
28+ $ this ->redirectRoute ('settings.profile ' );
29+
30+ return ;
31+ }
32+
33+ // Rate limiting: 1 request per 1 minute per user.
34+ $ key = 'avatar-refresh: ' .$ this ->user ->id ();
35+
36+ if (RateLimiter::tooManyAttempts ($ key , 1 )) {
37+ $ this ->error ('Please wait 1 minute before refreshing your avatar again. ' );
38+
39+ $ this ->redirectRoute ('settings.profile ' );
40+
41+ return ;
42+ }
43+
44+ // Record this attempt for 1 minute.
45+ RateLimiter::hit ($ key , 60 );
46+
47+ UpdateUserIdenticonStatus::dispatchSync ($ this ->user );
48+
49+ $ this ->success ('Avatar refreshed successfully! ' );
50+
51+ $ this ->redirectRoute ('settings.profile ' );
52+ }
53+
54+ public function render (): View
55+ {
56+ return view ('livewire.refresh-avatar ' );
57+ }
58+ }
Original file line number Diff line number Diff line change @@ -123,7 +123,7 @@ public function hasConnectedGitHubAccount(): bool
123123 return ! is_null ($ this ->githubId ());
124124 }
125125
126- public function hasIdenticon (): bool
126+ public function hasGitHubIdenticon (): bool
127127 {
128128 return (bool ) $ this ->github_has_identicon ;
129129 }
Original file line number Diff line number Diff line change 11@props ([
22 ' user' ,
33 ' unlinked' => false ,
4+ ' showRefresh' => false ,
45] )
56
67<?php
7- $src = $user -> githubId () && ! $user -> hasIdenticon ()
8+ $src = $user -> githubId () && ! $user -> hasGitHubIdenticon ()
89 ? sprintf (' https://avatars.githubusercontent.com/u/%s' , $user -> githubId ())
910 : asset (' https://laravel.io/images/laravelio-icon-gray.svg' );
1011? >
1112
12- @unless ($unlinked )
13- <a href =" {{ route (' profile' , $user -> username ()) } }" >
14- @endunless
13+ <div class =" relative inline-block" >
14+ @unless ($unlinked )
15+ <a href =" {{ route (' profile' , $user -> username ()) } }" >
16+ @endunless
1517
16- <flux:avatar
17- circle
18- loading =" lazy"
19- src =" {{ $src } }"
20- alt =" {{ $user -> name () } }"
21- {{ $attributes -> merge ([' class' => ' bg-gray-50' ]) } }
22- />
18+ <flux:avatar
19+ circle
20+ loading =" lazy"
21+ src =" {{ $src } }"
22+ alt =" {{ $user -> name () } }"
23+ {{ $attributes -> merge ([' class' => ' bg-gray-50' ]) } } />
2324
24- @unless ($unlinked )
25- </a >
26- @endunless
25+ @unless ($unlinked )
26+ </a >
27+ @endunless
28+
29+ @if ($showRefresh && $user -> hasConnectedGitHubAccount () )
30+ <div class =" absolute bottom-0 right-0 transform translate-x-1 translate-y-1" >
31+ <livewire:refresh-avatar :user =" $user" />
32+ </div >
33+ @endif
34+ </div >
Original file line number Diff line number Diff line change 1+ <div >
2+ <button
3+ wire:click =" refresh"
4+ wire:loading.attr =" disabled"
5+ type =" button"
6+ class =" flex items-center justify-center w-10 h-10 bg-white border-2 border-gray-300 rounded-full shadow-sm hover:bg-gray-50 hover:border-lio-500 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-lio-500 transition-colors disabled:opacity-50 disabled:cursor-not-allowed"
7+ title =" Refresh avatar from GitHub" >
8+ <svg
9+ wire:loading.remove
10+ xmlns =" http://www.w3.org/2000/svg"
11+ class =" h-5 w-5 text-gray-600"
12+ fill =" none"
13+ viewBox =" 0 0 24 24"
14+ stroke =" currentColor" >
15+ <path stroke-linecap =" round" stroke-linejoin =" round" stroke-width =" 2" d =" M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15" />
16+ </svg >
17+ <svg
18+ wire:loading
19+ class =" animate-spin h-5 w-5 text-gray-600"
20+ xmlns =" http://www.w3.org/2000/svg"
21+ fill =" none"
22+ viewBox =" 0 0 24 24" >
23+ <circle class =" opacity-25" cx =" 12" cy =" 12" r =" 10" stroke =" currentColor" stroke-width =" 4" ></circle >
24+ <path class =" opacity-75" fill =" currentColor" d =" M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z" ></path >
25+ </svg >
26+ </button >
27+ </div >
Original file line number Diff line number Diff line change 1313 </p >
1414 </div >
1515
16- <div class =" flex flex-col space-y-6 lg:flex-row lg:space-y-0 lg:space-x -6" >
17- <div class =" grow space-y-6" >
18- <div class = " space-y-1 " >
16+ <div class =" grid grid-cols-12 gap -6" >
17+ <div class =" col-span-12 sm:col-span-6 space-y-6" >
18+ <div >
1919 <x-forms .label for =" name" />
2020
2121 <x-forms .inputs.input name =" name" :value =" Auth::user()->name()" required />
2222 </div >
2323
24- <div class = " space-y-1 " >
24+ <div >
2525 <x-forms .label for =" bio" />
2626
2727 <x-forms .inputs.textarea name =" bio" maxlength =" 160" >
3434 </div >
3535 </div >
3636
37- <div class =" grow space-y-1 lg:grow-0 lg:shrink-0 " >
37+ <div class =" col-span-12 sm:col-span-6 " >
3838 <p class =" block text-sm leading-5 font-medium text-gray-700" aria-hidden =" true" >
3939 Profile Image
4040 </p >
4141
4242 <div class =" flex items-center mt-2" >
4343 <div class =" shrink-0 inline-block overflow-hidden" aria-hidden =" true" >
44- <x-avatar :user =" Auth::user()" class =" h-32 w-32 mt-4" unlinked />
44+ <div class =" flex justify-center lg:justify-start" >
45+ <x-avatar
46+ :user =" Auth::user()"
47+ class =" h-32 w-32 mt-4"
48+ unlinked
49+ :show-refresh =" Auth::user()->isLoggedInUser()"
50+ />
51+ </div >
4552
4653 <span class =" mt-4 inline-block text-sm text-gray-500" >
47- Change your avatar for
54+ Change or refresh your avatar for< br >
4855
4956 <a href =" https://github.com/{{ Auth:: user ()-> githubUsername () } }" class =" text-lio-700" >
5057 your GitHub profile
You can’t perform that action at this time.
0 commit comments