Skip to content

Commit 09a9d32

Browse files
mckenzieartsdependabot[bot]cybersoldattech
authored
mep | merge develop into main (#321)
Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Chris Samory <[email protected]>
1 parent ed5f911 commit 09a9d32

File tree

14 files changed

+218
-177
lines changed

14 files changed

+218
-177
lines changed

app/Livewire/Components/User/Activities.php

+14-3
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,27 @@
77
use App\Models\Activity;
88
use App\Models\User;
99
use Illuminate\Contracts\View\View;
10+
use Illuminate\Support\Collection;
11+
use Illuminate\Support\Facades\Cache;
12+
use Livewire\Attributes\Computed;
1013
use Livewire\Component;
1114

1215
final class Activities extends Component
1316
{
1417
public User $user;
1518

19+
#[Computed(persist: true)]
20+
public function activities(): Collection
21+
{
22+
return Cache::remember(
23+
key: 'activities.'.$this->user->id,
24+
ttl: now()->addDays(3),
25+
callback: fn () => Activity::latestFeed($this->user)
26+
);
27+
}
28+
1629
public function render(): View
1730
{
18-
return view('livewire.components.user.activities', [
19-
'activities' => Activity::latestFeed($this->user),
20-
]);
31+
return view('livewire.components.user.activities');
2132
}
2233
}

app/Livewire/Pages/Account/Profile.php

+48-10
Original file line numberDiff line numberDiff line change
@@ -4,30 +4,68 @@
44

55
namespace App\Livewire\Pages\Account;
66

7+
use App\Models\Article;
8+
use App\Models\Discussion;
9+
use App\Models\Thread;
710
use App\Models\User;
811
use Illuminate\Contracts\View\View;
12+
use Illuminate\Support\Collection;
13+
use Illuminate\Support\Facades\Cache;
14+
use Livewire\Attributes\Computed;
915
use Livewire\Component;
1016

1117
final class Profile extends Component
1218
{
1319
public User $user;
1420

15-
public function render(): View
21+
#[Computed(persist: true)]
22+
public function articles(): Collection
1623
{
17-
return view('livewire.pages.account.profile', [
18-
'articles' => $this->user->articles() // @phpstan-ignore-line
19-
->recent()
24+
return Cache::remember(
25+
key: 'articles.'.$this->user->id,
26+
ttl: now()->addDays(3),
27+
callback: fn () => Article::with('media', 'tags')
28+
->select('id', 'title', 'slug', 'body', 'published_at')
29+
->whereBelongsTo($this->user)
2030
->published()
31+
->recent()
2132
->limit(5)
22-
->get(),
23-
'threads' => $this->user->threads()
33+
->get()
34+
);
35+
}
36+
37+
#[Computed(persist: true)]
38+
public function threads(): Collection
39+
{
40+
return Cache::remember(
41+
key: 'threads.'.$this->user->id,
42+
ttl: now()->addDays(3),
43+
callback: fn () => Thread::with('channels')
44+
->withCount('replies')
45+
->whereBelongsTo($this->user)
2446
->orderByDesc('created_at')
2547
->limit(5)
26-
->get(),
27-
'discussions' => $this->user->discussions()
48+
->get()
49+
);
50+
}
51+
52+
#[Computed(persist: true)]
53+
public function discussions(): Collection
54+
{
55+
return Cache::remember(
56+
key: 'discussions.'.$this->user->id,
57+
ttl: now()->addDays(3),
58+
callback: fn () => Discussion::with('tags')
59+
->withCount('replies', 'reactions')
60+
->whereBelongsTo($this->user)
2861
->limit(5)
29-
->get(),
30-
])
62+
->get()
63+
);
64+
}
65+
66+
public function render(): View
67+
{
68+
return view('livewire.pages.account.profile')
3169
->title($this->user->username.' ( '.$this->user->name.')');
3270
}
3371
}

composer.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@
4848
"symfony/http-client": "^7.1.8",
4949
"symfony/mailgun-mailer": "^7.1",
5050
"torchlight/torchlight-laravel": "^0.6",
51-
"vormkracht10/filament-mails": "^1.0",
51+
"vormkracht10/filament-mails": "^2.0",
5252
"wire-elements/modal": "^2.0",
5353
"wire-elements/spotlight": "^2.0",
5454
"yarri/link-finder": "^2.7.10",

composer.lock

+8-8
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

resources/views/components/forum/thread.blade.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<x-forum.thread-channels :thread="$thread" />
77

88
<div class="flex items-center gap-4">
9-
<h2 id="question-title-{{ $thread->id }}" class="truncate text-xl font-medium text-gray-900 dark:text-white lg:text-xl">
9+
<h2 id="question-title-{{ $thread->id }}" class="truncate text-lg font-heading/7 font-semibold text-gray-900 dark:text-white lg:text-xl">
1010
<x-link :href="route('forum.show', $thread)" class="hover:underline">
1111
{{ $thread->subject() }}
1212
</x-link>

resources/views/components/user/articles.blade.php

+45-47
Original file line numberDiff line numberDiff line change
@@ -3,56 +3,54 @@
33
'articles',
44
])
55

6-
<div>
7-
@if ($articles->isNotEmpty())
8-
<div class="-mt-6 divide-y divide-gray-200 dark:divide-white/20">
9-
@foreach ($articles as $article)
10-
<div class="py-6">
11-
<x-articles.card :article="$article" is-summary />
12-
</div>
13-
@endforeach
14-
</div>
15-
@else
16-
<x-empty-state>
6+
@if ($articles->isNotEmpty())
7+
<div class="-mt-6 divide-y divide-gray-200 dark:divide-white/20">
8+
@foreach ($articles as $article)
9+
<div class="py-6">
10+
<x-articles.card :article="$article" is-summary />
11+
</div>
12+
@endforeach
13+
</div>
14+
@else
15+
<x-empty-state>
16+
<div class="relative">
17+
<div class="absolute scale-90 shadow inset-x-0 -top-4 flex items-start -z-10 bg-white gap-3 p-3 rounded-lg ring-1 ring-gray-200/50 dark:bg-gray-900 dark:ring-white/10">
18+
</div>
1719
<div class="relative">
18-
<div class="absolute scale-90 shadow inset-x-0 -top-4 flex items-start -z-10 bg-white gap-3 p-3 rounded-lg ring-1 ring-gray-200/50 dark:bg-gray-900 dark:ring-white/10">
19-
</div>
20-
<div class="relative">
21-
<div class="absolute -inset-1 bg-gradient-to-r from-flag-green to-flag-red rounded-lg blur opacity-25"></div>
22-
<div class="relative flex items-start z-20 bg-white gap-3 p-3 rounded-lg ring-1 ring-gray-200/50 dark:bg-gray-900 dark:ring-white/10">
23-
<div class="w-1/4 h-20 bg-gray-50 ring-1 ring-gray-200/50 dark:ring-white/20 rounded-lg dark:bg-gray-800"></div>
24-
<div class="w-3/4 pt-2 space-y-2">
25-
<div class="grid grid-cols-3 gap-2 w-2/3">
26-
<div class="h-3 bg-gray-50 ring-1 ring-gray-200/50 dark:ring-white/20 rounded dark:bg-gray-800"></div>
27-
<div class="h-3 bg-gray-50 ring-1 ring-gray-200/50 dark:ring-white/20 rounded dark:bg-gray-800"></div>
28-
<div class="h-3 bg-gray-50 ring-1 ring-gray-200/50 dark:ring-white/20 rounded dark:bg-gray-800"></div>
29-
</div>
30-
<div class="h-4 bg-gray-50 ring-1 ring-gray-200/50 dark:ring-white/20 rounded-md dark:bg-gray-800"></div>
31-
<div class="h-6 bg-gray-50 ring-1 ring-gray-200/50 dark:ring-white/20 rounded-md dark:bg-gray-800"></div>
20+
<div class="absolute -inset-1 bg-gradient-to-r from-flag-green to-flag-red rounded-lg blur opacity-25"></div>
21+
<div class="relative flex items-start z-20 bg-white gap-3 p-3 rounded-lg ring-1 ring-gray-200/50 dark:bg-gray-900 dark:ring-white/10">
22+
<div class="w-1/4 h-20 bg-gray-50 ring-1 ring-gray-200/50 dark:ring-white/20 rounded-lg dark:bg-gray-800"></div>
23+
<div class="w-3/4 pt-2 space-y-2">
24+
<div class="grid grid-cols-3 gap-2 w-2/3">
25+
<div class="h-3 bg-gray-50 ring-1 ring-gray-200/50 dark:ring-white/20 rounded dark:bg-gray-800"></div>
26+
<div class="h-3 bg-gray-50 ring-1 ring-gray-200/50 dark:ring-white/20 rounded dark:bg-gray-800"></div>
27+
<div class="h-3 bg-gray-50 ring-1 ring-gray-200/50 dark:ring-white/20 rounded dark:bg-gray-800"></div>
3228
</div>
29+
<div class="h-4 bg-gray-50 ring-1 ring-gray-200/50 dark:ring-white/20 rounded-md dark:bg-gray-800"></div>
30+
<div class="h-6 bg-gray-50 ring-1 ring-gray-200/50 dark:ring-white/20 rounded-md dark:bg-gray-800"></div>
3331
</div>
3432
</div>
35-
<div class="absolute scale-[0.8] inset-x-0 -z-10 shadow -bottom-3 flex items-start bg-white gap-3 p-3 rounded-lg ring-1 ring-gray-200/50 dark:bg-gray-900 dark:ring-white/10">
36-
</div>
3733
</div>
38-
<div class="mt-8 space-y-4">
39-
<p class="mt-8 text-base text-gray-500 dark:text-gray-400">
40-
<span class="font-medium text-gray-700 dark:text-gray-300">{{ $user->name }}</span>
41-
{{ __('pages/account.activities.empty_articles') }}
42-
</p>
43-
44-
@if ($user->isLoggedInUser())
45-
@can('create', \App\Models\Article::class)
46-
<x-buttons.primary
47-
type="button"
48-
onclick="Livewire.dispatch('openPanel', { component: 'components.slideovers.article-form' })"
49-
>
50-
<x-untitledui-file-06 class="size-5" aria-hidden="true" />
51-
{{ __('global.launch_modal.article_action') }}
52-
</x-buttons.primary>
53-
@endcan
54-
@endif
34+
<div class="absolute scale-[0.8] inset-x-0 -z-10 shadow -bottom-3 flex items-start bg-white gap-3 p-3 rounded-lg ring-1 ring-gray-200/50 dark:bg-gray-900 dark:ring-white/10">
5535
</div>
56-
</x-empty-state>
57-
@endif
58-
</div>
36+
</div>
37+
<div class="mt-8 space-y-4">
38+
<p class="mt-8 text-base text-gray-500 dark:text-gray-400">
39+
<span class="font-medium text-gray-700 dark:text-gray-300">{{ $user->name }}</span>
40+
{{ __('pages/account.activities.empty_articles') }}
41+
</p>
42+
43+
@if ($user->isLoggedInUser())
44+
@can('create', \App\Models\Article::class)
45+
<x-buttons.primary
46+
type="button"
47+
onclick="Livewire.dispatch('openPanel', { component: 'components.slideovers.article-form' })"
48+
>
49+
<x-untitledui-file-06 class="size-5" aria-hidden="true" />
50+
{{ __('global.launch_modal.article_action') }}
51+
</x-buttons.primary>
52+
@endcan
53+
@endif
54+
</div>
55+
</x-empty-state>
56+
@endif

resources/views/components/user/discussions.blade.php

+43-45
Original file line numberDiff line numberDiff line change
@@ -3,58 +3,56 @@
33
'discussions',
44
])
55

6-
<div>
7-
@if ($discussions->isNotEmpty())
8-
<div class="relative -mt-6 divide-y divide-gray-200 dark:divide-white/20">
9-
@foreach ($discussions as $discussion)
10-
<x-discussions.overview :discussion="$discussion" />
11-
@endforeach
12-
</div>
13-
@else
14-
<x-empty-state>
6+
@if ($discussions->isNotEmpty())
7+
<div class="relative -mt-6 divide-y divide-gray-200 dark:divide-white/20">
8+
@foreach ($discussions as $discussion)
9+
<x-discussions.overview :discussion="$discussion" />
10+
@endforeach
11+
</div>
12+
@else
13+
<x-empty-state>
14+
<div class="relative">
1515
<div class="relative">
16-
<div class="relative">
17-
<div class="absolute -inset-1 bg-gradient-to-r rotate-3 w-72 from-flag-green to-flag-red rounded-lg blur opacity-25"></div>
18-
<div class="relative z-20 bg-white gap-3 rotate-3 p-3 w-72 rounded-lg shadow ring-1 ring-gray-200/50 dark:bg-gray-900 dark:ring-white/10">
19-
<div class="space-y-2">
20-
<div class="grid grid-cols-3 gap-2 w-1/3">
21-
<div class="h-3 bg-gray-50 ring-1 ring-gray-200/50 dark:ring-white/20 rounded dark:bg-gray-800"></div>
22-
<div class="h-3 bg-gray-50 ring-1 ring-gray-200/50 dark:ring-white/20 rounded dark:bg-gray-800"></div>
23-
</div>
24-
<div class="h-4 bg-gray-50 ring-1 ring-gray-200/50 dark:ring-white/20 rounded-md dark:bg-gray-800"></div>
25-
<div class="h-6 bg-gray-50 ring-1 ring-gray-200/50 dark:ring-white/20 rounded-md dark:bg-gray-800"></div>
26-
</div>
27-
</div>
28-
</div>
29-
<div class="absolute transform scale-[0.8] bottom-10 right-2 shadow w-40 -rotate-6 z-20 bg-white gap-3 p-3 rounded-lg ring-1 ring-gray-200/50 dark:bg-gray-900 dark:ring-white/10">
16+
<div class="absolute -inset-1 bg-gradient-to-r rotate-3 w-72 from-flag-green to-flag-red rounded-lg blur opacity-25"></div>
17+
<div class="relative z-20 bg-white gap-3 rotate-3 p-3 w-72 rounded-lg shadow ring-1 ring-gray-200/50 dark:bg-gray-900 dark:ring-white/10">
3018
<div class="space-y-2">
31-
<div class="grid grid-cols-3 gap-2 w-2/3">
19+
<div class="grid grid-cols-3 gap-2 w-1/3">
3220
<div class="h-3 bg-gray-50 ring-1 ring-gray-200/50 dark:ring-white/20 rounded dark:bg-gray-800"></div>
3321
<div class="h-3 bg-gray-50 ring-1 ring-gray-200/50 dark:ring-white/20 rounded dark:bg-gray-800"></div>
3422
</div>
35-
<div class="h-2 bg-gray-50 ring-1 ring-gray-200/50 dark:ring-white/20 rounded-md dark:bg-gray-800"></div>
23+
<div class="h-4 bg-gray-50 ring-1 ring-gray-200/50 dark:ring-white/20 rounded-md dark:bg-gray-800"></div>
3624
<div class="h-6 bg-gray-50 ring-1 ring-gray-200/50 dark:ring-white/20 rounded-md dark:bg-gray-800"></div>
3725
</div>
3826
</div>
3927
</div>
40-
<div class="mt-8 space-y-4">
41-
<p class="mt-8 text-base text-gray-500 dark:text-gray-400">
42-
<span class="font-medium text-gray-700 dark:text-gray-300">{{ $user->name }}</span>
43-
{{ __('pages/account.activities.empty_discussions') }}
44-
</p>
45-
46-
@if ($user->isLoggedInUser())
47-
@can('create', \App\Models\Discussion::class)
48-
<x-buttons.primary
49-
type="button"
50-
onclick="Livewire.dispatch('openPanel', { component: 'components.slideovers.thread-form' })"
51-
>
52-
<x-untitledui-message-text-square class="size-5" aria-hidden="true" />
53-
{{ __('global.launch_modal.discussion_action') }}
54-
</x-buttons.primary>
55-
@endcan
56-
@endif
28+
<div class="absolute transform scale-[0.8] bottom-10 right-2 shadow w-40 -rotate-6 z-20 bg-white gap-3 p-3 rounded-lg ring-1 ring-gray-200/50 dark:bg-gray-900 dark:ring-white/10">
29+
<div class="space-y-2">
30+
<div class="grid grid-cols-3 gap-2 w-2/3">
31+
<div class="h-3 bg-gray-50 ring-1 ring-gray-200/50 dark:ring-white/20 rounded dark:bg-gray-800"></div>
32+
<div class="h-3 bg-gray-50 ring-1 ring-gray-200/50 dark:ring-white/20 rounded dark:bg-gray-800"></div>
33+
</div>
34+
<div class="h-2 bg-gray-50 ring-1 ring-gray-200/50 dark:ring-white/20 rounded-md dark:bg-gray-800"></div>
35+
<div class="h-6 bg-gray-50 ring-1 ring-gray-200/50 dark:ring-white/20 rounded-md dark:bg-gray-800"></div>
36+
</div>
5737
</div>
58-
</x-empty-state>
59-
@endif
60-
</div>
38+
</div>
39+
<div class="mt-8 space-y-4">
40+
<p class="mt-8 text-base text-gray-500 dark:text-gray-400">
41+
<span class="font-medium text-gray-700 dark:text-gray-300">{{ $user->name }}</span>
42+
{{ __('pages/account.activities.empty_discussions') }}
43+
</p>
44+
45+
@if ($user->isLoggedInUser())
46+
@can('create', \App\Models\Discussion::class)
47+
<x-buttons.primary
48+
type="button"
49+
onclick="Livewire.dispatch('openPanel', { component: 'components.slideovers.thread-form' })"
50+
>
51+
<x-untitledui-message-text-square class="size-5" aria-hidden="true" />
52+
{{ __('global.launch_modal.discussion_action') }}
53+
</x-buttons.primary>
54+
@endcan
55+
@endif
56+
</div>
57+
</x-empty-state>
58+
@endif

0 commit comments

Comments
 (0)