Skip to content

Commit ffdb030

Browse files
authored
Merge pull request #64 from laravelcm/add-time-read-post
Add time read post
2 parents b7a7d39 + 98a1357 commit ffdb030

38 files changed

+1278
-630
lines changed

app/Http/Controllers/ArticlesController.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,9 @@ public function show(Article $article)
4444
->twitterSite('laravelcm')
4545
->withUrl();
4646

47-
return view('articles.show', compact('article'));
47+
return view('articles.show', [
48+
'article' => $article->loadCount('views'),
49+
]);
4850
}
4951

5052
public function create()

app/Http/Livewire/Articles/Browse.php

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,25 @@ class Browse extends Component
1313
{
1414
use WithInfiniteScroll, WithTags;
1515

16+
public string $viewMode = 'list';
17+
1618
protected $queryString = [
1719
'tag' => ['except' => ''],
1820
'sortBy' => ['except' => 'recent'],
1921
];
2022

23+
public function mount()
24+
{
25+
$this->viewMode = session('viewMode', $this->viewMode);
26+
}
27+
28+
public function changeViewMode($mode)
29+
{
30+
session()->put('viewMode', $mode);
31+
32+
$this->viewMode = $mode;
33+
}
34+
2135
public function validSort($sort): bool
2236
{
2337
return in_array($sort, [
@@ -29,10 +43,12 @@ public function validSort($sort): bool
2943

3044
public function render(): View
3145
{
32-
$articles = Article::with('tags')->published()
46+
$articles = Article::with('tags')
47+
->withCount(['views', 'reactions'])
48+
->published()
3349
->notPinned()
3450
->orderByDesc('sponsored_at')
35-
->orderByDesc('submitted_at');
51+
->orderByDesc('published_at');
3652

3753
$tags = Tag::whereHas('articles', function ($query) {
3854
$query->published();

app/Http/Livewire/Articles/Create.php

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@
99
use App\Models\User;
1010
use App\Traits\WithArticleAttributes;
1111
use App\Traits\WithTagsAssociation;
12+
use Illuminate\Contracts\View\View;
1213
use Illuminate\Support\Facades\Auth;
14+
use Illuminate\Support\Str;
1315
use Livewire\Component;
1416
use Livewire\WithFileUploads;
1517

@@ -24,15 +26,11 @@ public function mount()
2426
/** @var User $user */
2527
$user = Auth::user();
2628

29+
$this->published_at = now()->toDateTimeLocalString();
2730
$this->submitted_at = $user->hasAnyRole(['admin', 'moderator']) ? now() : null;
2831
$this->approved_at = $user->hasAnyRole(['admin', 'moderator']) ? now() : null;
2932
}
3033

31-
public function onMarkdownUpdate(string $content)
32-
{
33-
$this->body = $content;
34-
}
35-
3634
public function submit()
3735
{
3836
$this->submitted_at = now();
@@ -83,7 +81,7 @@ public function store()
8381
$this->redirectRoute('articles.show', $article);
8482
}
8583

86-
public function render()
84+
public function render(): View
8785
{
8886
return view('livewire.articles.create', [
8987
'tags' => Tag::whereJsonContains('concerns', ['post'])->get(),

app/Http/Livewire/Articles/Edit.php

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,6 @@ public function mount(Article $article)
3838
$this->associateTags = $this->tags_selected = old('tags', $article->tags()->pluck('id')->toArray());
3939
}
4040

41-
public function onMarkdownUpdate(string $content)
42-
{
43-
$this->body = $content;
44-
}
45-
4641
public function submit()
4742
{
4843
$this->alreadySubmitted = $this->article->submitted_at !== null;

app/Models/Article.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -395,8 +395,8 @@ public function scopeNotDeclined(Builder $query): Builder
395395
*/
396396
public function scopeRecent(Builder $query): Builder
397397
{
398-
return $query->orderBy('is_pinned', 'desc')
399-
->orderBy('published_at', 'desc');
398+
return $query->orderByDesc('published_at')
399+
->orderByDesc('published_at');
400400
}
401401

402402
/**

app/Traits/WithArticleAttributes.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ trait WithArticleAttributes
2222

2323
public ?string $published_at = null;
2424

25+
public int $reading_time = 1;
26+
2527
public $file;
2628

2729
protected $rules = [
@@ -51,4 +53,10 @@ public function updatedTitle(string $value): void
5153
{
5254
$this->slug = Str::slug($value);
5355
}
56+
57+
public function onMarkdownUpdate(string $content)
58+
{
59+
$this->body = $content;
60+
$this->reading_time = Str::readDuration($content);
61+
}
5462
}

app/View/Components/WireUI/Button.php

Lines changed: 199 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,199 @@
1+
<?php
2+
3+
namespace App\View\Components\WireUI;
4+
5+
use WireUi\View\Components;
6+
7+
class Button extends Components\Button
8+
{
9+
public function defaultColors(): array
10+
{
11+
return [
12+
self::DEFAULT => <<<EOT
13+
border text-skin-base bg-skin-button hover:bg-skin-button-hover border-skin-input
14+
focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-offset-body focus:ring-green-500
15+
EOT,
16+
17+
'primary' => <<<EOT
18+
ring-primary-500 text-white bg-primary-500 hover:bg-primary-600 hover:ring-primary-600
19+
dark:ring-offset-slate-800 dark:bg-primary-700 dark:ring-primary-700
20+
dark:hover:bg-primary-600 dark:hover:ring-primary-600
21+
EOT,
22+
23+
'secondary' => <<<EOT
24+
ring-secondary-500 text-white bg-secondary-500 hover:bg-secondary-600 hover:ring-secondary-600
25+
dark:ring-offset-slate-800 dark:bg-secondary-700 dark:ring-secondary-700
26+
dark:hover:bg-secondary-600 dark:hover:ring-secondary-600
27+
EOT,
28+
29+
'positive' => <<<EOT
30+
ring-positive-500 text-white bg-positive-500 hover:bg-positive-600 hover:ring-positive-600
31+
dark:ring-offset-slate-800 dark:bg-positive-700 dark:ring-positive-700
32+
dark:hover:bg-positive-600 dark:hover:ring-positive-600
33+
EOT,
34+
35+
'negative' => <<<EOT
36+
ring-negative-500 text-white bg-negative-500 hover:bg-negative-600 hover:ring-negative-600
37+
dark:ring-offset-slate-800 dark:bg-negative-700 dark:ring-negative-700
38+
dark:hover:bg-negative-600 dark:hover:ring-negative-600
39+
EOT,
40+
41+
'warning' => <<<EOT
42+
ring-warning-500 text-white bg-warning-500 hover:bg-warning-600 hover:ring-warning-600
43+
dark:ring-offset-slate-800 dark:bg-warning-700 dark:ring-warning-700
44+
dark:hover:bg-warning-600 dark:hover:ring-warning-600
45+
EOT,
46+
47+
'info' => <<<EOT
48+
ring-info-500 text-white bg-info-500 hover:bg-info-600 hover:ring-info-600
49+
dark:ring-offset-slate-800 dark:bg-info-700 dark:ring-info-700
50+
dark:hover:bg-info-600 dark:hover:ring-info-600
51+
EOT,
52+
53+
'dark' => <<<EOT
54+
ring-gray-700 text-white bg-gray-700 hover:bg-gray-900 hover:ring-gray-900
55+
dark:ring-offset-gray-800 dark:bg-gray-700 dark:ring-gray-700
56+
dark:hover:bg-gray-600 dark:hover:ring-gray-600
57+
EOT,
58+
59+
'white' => <<<EOT
60+
bg-white border text-slate-500 hover:bg-slate-50 ring-slate-200
61+
dark:text-slate-200 dark:ring-slate-700 dark:border-slate-700
62+
dark:bg-slate-700 dark:hover:bg-slate-600 dark:hover:ring-slate-600
63+
dark:ring-offset-slate-800
64+
EOT,
65+
66+
'black' => <<<EOT
67+
bg-black text-slate-100 hover:bg-slate-900 ring-black
68+
dark:ring-slate-700 dark:border-slate-700 dark:bg-slate-700 dark:hover:bg-slate-600
69+
dark:ring-offset-slate-800 dark:hover:ring-slate-600
70+
EOT,
71+
72+
'slate' => <<<EOT
73+
ring-slate-500 text-white bg-slate-500 hover:bg-slate-600 hover:ring-slate-600
74+
dark:ring-offset-slate-800 dark:bg-slate-700 dark:ring-slate-700
75+
dark:hover:bg-slate-600 dark:hover:ring-slate-600
76+
EOT,
77+
78+
'gray' => <<<EOT
79+
ring-gray-500 text-white bg-gray-500 hover:bg-gray-600 hover:ring-gray-600
80+
dark:ring-offset-slate-800 dark:bg-gray-700 dark:ring-gray-700
81+
dark:hover:bg-gray-600 dark:hover:ring-gray-600
82+
EOT,
83+
84+
'zinc' => <<<EOT
85+
ring-zinc-500 text-white bg-zinc-500 hover:bg-zinc-600 hover:ring-zinc-600
86+
dark:ring-offset-slate-800 dark:bg-zinc-700 dark:ring-zinc-700
87+
dark:hover:bg-zinc-600 dark:hover:ring-zinc-600
88+
EOT,
89+
90+
'neutral' => <<<EOT
91+
ring-neutral-500 text-white bg-neutral-500 hover:bg-neutral-600 hover:ring-neutral-600
92+
dark:ring-offset-slate-800 dark:bg-neutral-700 dark:ring-neutral-700
93+
dark:hover:bg-neutral-600 dark:hover:ring-neutral-600
94+
EOT,
95+
96+
'stone' => <<<EOT
97+
ring-stone-500 text-white bg-stone-500 hover:bg-stone-600 hover:ring-stone-600
98+
dark:ring-offset-slate-800 dark:bg-stone-700 dark:ring-stone-700
99+
dark:hover:bg-stone-600 dark:hover:ring-stone-600
100+
EOT,
101+
102+
'red' => <<<EOT
103+
ring-red-500 text-white bg-red-500 hover:bg-red-600 hover:ring-red-600
104+
dark:ring-offset-slate-800 dark:bg-red-700 dark:ring-red-700
105+
dark:hover:bg-red-600 dark:hover:ring-red-600
106+
EOT,
107+
108+
'orange' => <<<EOT
109+
ring-orange-500 text-white bg-orange-500 hover:bg-orange-600 hover:ring-orange-600
110+
dark:ring-offset-slate-800 dark:bg-orange-700 dark:ring-orange-700
111+
dark:hover:bg-orange-600 dark:hover:ring-orange-600
112+
EOT,
113+
114+
'amber' => <<<EOT
115+
ring-amber-500 text-white bg-amber-500 hover:bg-amber-600 hover:ring-amber-600
116+
dark:ring-offset-slate-800 dark:bg-amber-700 dark:ring-amber-700
117+
dark:hover:bg-amber-600 dark:hover:ring-amber-600
118+
EOT,
119+
120+
'lime' => <<<EOT
121+
ring-lime-500 text-white bg-lime-500 hover:bg-lime-600 hover:ring-lime-600
122+
dark:ring-offset-slate-800 dark:bg-lime-700 dark:ring-lime-700
123+
dark:hover:bg-lime-600 dark:hover:ring-lime-600
124+
EOT,
125+
126+
'green' => <<<EOT
127+
ring-green-500 text-white bg-green-500 hover:bg-green-600 hover:ring-green-600
128+
dark:ring-offset-slate-800 dark:bg-green-700 dark:ring-green-700
129+
dark:hover:bg-green-600 dark:hover:ring-green-600
130+
EOT,
131+
132+
'emerald' => <<<EOT
133+
ring-emerald-500 text-white bg-emerald-500 hover:bg-emerald-600 hover:ring-emerald-600
134+
dark:ring-offset-slate-800 dark:bg-emerald-700 dark:ring-emerald-700
135+
dark:hover:bg-emerald-600 dark:hover:ring-emerald-600
136+
EOT,
137+
138+
'teal' => <<<EOT
139+
ring-teal-500 text-white bg-teal-500 hover:bg-teal-600 hover:ring-teal-600
140+
dark:ring-offset-slate-800 dark:bg-teal-700 dark:ring-teal-700
141+
dark:hover:bg-teal-600 dark:hover:ring-teal-600
142+
EOT,
143+
144+
'cyan' => <<<EOT
145+
ring-cyan-500 text-white bg-cyan-500 hover:bg-cyan-600 hover:ring-cyan-600
146+
dark:ring-offset-slate-800 dark:bg-cyan-700 dark:ring-cyan-700
147+
dark:hover:bg-cyan-600 dark:hover:ring-cyan-600
148+
EOT,
149+
150+
'sky' => <<<EOT
151+
ring-sky-500 text-white bg-sky-500 hover:bg-sky-600 hover:ring-sky-600
152+
dark:ring-offset-slate-800 dark:bg-sky-700 dark:ring-sky-700
153+
dark:hover:bg-sky-600 dark:hover:ring-sky-600
154+
EOT,
155+
156+
'blue' => <<<EOT
157+
ring-blue-500 text-white bg-blue-500 hover:bg-blue-600 hover:ring-blue-600
158+
dark:ring-offset-slate-800 dark:bg-blue-700 dark:ring-blue-700
159+
dark:hover:bg-blue-600 dark:hover:ring-blue-600
160+
EOT,
161+
162+
'indigo' => <<<EOT
163+
ring-indigo-500 text-white bg-indigo-500 hover:bg-indigo-600 hover:ring-indigo-600
164+
dark:ring-offset-slate-800 dark:bg-indigo-700 dark:ring-indigo-700
165+
dark:hover:bg-indigo-600 dark:hover:ring-indigo-600
166+
EOT,
167+
168+
'violet' => <<<EOT
169+
ring-violet-500 text-white bg-violet-500 hover:bg-violet-600 hover:ring-violet-600
170+
dark:ring-offset-slate-800 dark:bg-violet-700 dark:ring-violet-700
171+
dark:hover:bg-violet-600 dark:hover:ring-violet-600
172+
EOT,
173+
174+
'purple' => <<<EOT
175+
ring-purple-500 text-white bg-purple-500 hover:bg-purple-600 hover:ring-purple-600
176+
dark:ring-offset-slate-800 dark:bg-purple-700 dark:ring-purple-700
177+
dark:hover:bg-purple-600 dark:hover:ring-purple-600
178+
EOT,
179+
180+
'fuchsia' => <<<EOT
181+
ring-fuchsia-500 text-white bg-fuchsia-500 hover:bg-fuchsia-600 hover:ring-fuchsia-600
182+
dark:ring-offset-slate-800 dark:bg-fuchsia-700 dark:ring-fuchsia-700
183+
dark:hover:bg-fuchsia-600 dark:hover:ring-fuchsia-600
184+
EOT,
185+
186+
'pink' => <<<EOT
187+
ring-pink-500 text-white bg-pink-500 hover:bg-pink-600 hover:ring-pink-600
188+
dark:ring-offset-slate-800 dark:bg-pink-700 dark:ring-pink-700
189+
dark:hover:bg-pink-600 dark:hover:ring-pink-600
190+
EOT,
191+
192+
'rose' => <<<EOT
193+
ring-rose-500 text-white bg-rose-500 hover:bg-rose-600 hover:ring-rose-600
194+
dark:ring-offset-slate-800 dark:bg-rose-700 dark:ring-rose-700
195+
dark:hover:bg-rose-600 dark:hover:ring-rose-600
196+
EOT,
197+
];
198+
}
199+
}

app/View/Components/WireUI/Input.php

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<?php
2+
3+
namespace App\View\Components\WireUI;
4+
5+
use WireUi\View\Components;
6+
use Illuminate\Support\Str;
7+
use Illuminate\Support\Stringable;
8+
9+
class Input extends Components\Input
10+
{
11+
protected function getDefaultColorClasses(): string
12+
{
13+
return Str::of('placeholder-skin-input bg-skin-input text-skin-base')
14+
->unless($this->borderless, function (Stringable $stringable) {
15+
return $stringable
16+
->append(' border border-skin-input focus:ring-flag-green focus:border-flag-green');
17+
});
18+
}
19+
20+
protected function getErrorClasses(): string
21+
{
22+
return Str::of('text-negative-900 placeholder-negative-500')
23+
->unless($this->borderless, function (Stringable $stringable) {
24+
return $stringable
25+
->append(' border border-negative-300 focus:ring-negative-500 focus:border-negative-500');
26+
});
27+
}
28+
29+
protected function getDefaultClasses(): string
30+
{
31+
return Str::of('block w-full sm:text-sm rounded-md transition ease-in-out duration-100 focus:outline-none')
32+
->unless($this->shadowless, fn (Stringable $stringable) => $stringable->append(' shadow-sm'))
33+
->when($this->borderless, function (Stringable $stringable) {
34+
return $stringable->append(' border-transparent focus:border-transparent focus:ring-transparent');
35+
});
36+
}
37+
}

composer.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
"laravel-notification-channels/telegram": "^2.0",
2222
"laravel-notification-channels/twitter": "^6.0",
2323
"laravel/fortify": "^1.13",
24-
"laravel/framework": "^9.0",
24+
"laravel/framework": "^9.24",
2525
"laravel/slack-notification-channel": "^2.4",
2626
"laravel/socialite": "^5.2",
2727
"laravel/tinker": "^2.5",
@@ -42,7 +42,7 @@
4242
"torchlight/torchlight-commonmark": "^0.5.5",
4343
"wire-elements/modal": "^1.0",
4444
"wire-elements/spotlight": "^1.0",
45-
"wireui/wireui": "^1.6.0",
45+
"wireui/wireui": "^1.13.3",
4646
"yarri/link-finder": "^2.7"
4747
},
4848
"require-dev": {

0 commit comments

Comments
 (0)