feat: Add news detail page with view increment and media loading
This commit is contained in:
parent
5ae26b7036
commit
0dcb798894
@ -67,4 +67,17 @@ public function index(Request $request)
|
|||||||
'filters' => request()->only(['search', 'category']),
|
'filters' => request()->only(['search', 'category']),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function show(News $news)
|
||||||
|
{
|
||||||
|
$news->load(['author', 'categories', 'tags']);
|
||||||
|
$news->increment('views');
|
||||||
|
$news->thumbnail = $news->getFirstMediaUrl('news');
|
||||||
|
|
||||||
|
return Inertia::render('home/news/pages/Show', [
|
||||||
|
'pageTitle' => 'Detail Berita',
|
||||||
|
'pageDescription' => $news->title,
|
||||||
|
'news' => $news,
|
||||||
|
]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -210,6 +210,7 @@ export default function MainContent({ pageTitle, pageDescription, categories, ne
|
|||||||
onBlur={handleBlur}
|
onBlur={handleBlur}
|
||||||
tabIndex={0}
|
tabIndex={0}
|
||||||
className={focusedCardIndex === news.id ? 'Mui-focused' : ''}
|
className={focusedCardIndex === news.id ? 'Mui-focused' : ''}
|
||||||
|
onClick={() => router.get(`/news/${news.slug}`)}
|
||||||
>
|
>
|
||||||
<CardMedia
|
<CardMedia
|
||||||
component="img"
|
component="img"
|
||||||
|
|||||||
81
resources/js/pages/home/news/pages/Show.jsx
Normal file
81
resources/js/pages/home/news/pages/Show.jsx
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
import CssBaseline from '@mui/material/CssBaseline';
|
||||||
|
import Container from '@mui/material/Container';
|
||||||
|
import AppTheme from '../../../theme/AppTheme';
|
||||||
|
import Navbar from '../../components/Navbar';
|
||||||
|
import Footer from '../../components/Footer';
|
||||||
|
import { Box, CardMedia, Chip, styled, Typography } from '@mui/material';
|
||||||
|
import Headline from '../../components/Headline';
|
||||||
|
|
||||||
|
export default function NewsShowPage(props) {
|
||||||
|
const news = props.news;
|
||||||
|
console.log(news.tags, news.categories)
|
||||||
|
|
||||||
|
return (
|
||||||
|
<AppTheme {...props}>
|
||||||
|
<CssBaseline enableColorScheme />
|
||||||
|
|
||||||
|
<Navbar />
|
||||||
|
<Container
|
||||||
|
maxWidth="lg"
|
||||||
|
component="main"
|
||||||
|
sx={{ display: 'flex', flexDirection: 'column', my: 16, gap: 4 }}
|
||||||
|
>
|
||||||
|
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 4 }}>
|
||||||
|
<div>
|
||||||
|
<Headline pageTitle={props.pageTitle} pageDescription={props.pageDescription} />
|
||||||
|
</div>
|
||||||
|
<Box
|
||||||
|
sx={{
|
||||||
|
display: 'flex',
|
||||||
|
flexDirection: { xs: 'column-reverse', md: 'row' },
|
||||||
|
width: '100%',
|
||||||
|
justifyContent: 'space-between',
|
||||||
|
alignItems: { xs: 'start', md: 'center' },
|
||||||
|
gap: 4,
|
||||||
|
overflow: 'auto',
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
</Box>
|
||||||
|
|
||||||
|
<CardMedia
|
||||||
|
component="img"
|
||||||
|
alt={news.title}
|
||||||
|
image={news.thumbnail}
|
||||||
|
sx={{
|
||||||
|
aspectRatio: '16 / 9',
|
||||||
|
borderBottom: '1px solid',
|
||||||
|
borderColor: 'divider',
|
||||||
|
borderRadius: 1,
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<Typography gutterBottom variant="caption" component="div">
|
||||||
|
{news.categories.map((category, index) =>
|
||||||
|
<Chip label={category.name} color="success" variant="outlined" sx={{ mr: 1 }} key={index} />
|
||||||
|
)}
|
||||||
|
</Typography>
|
||||||
|
|
||||||
|
<Typography gutterBottom variant="h6" component="div">
|
||||||
|
{news.title}
|
||||||
|
</Typography>
|
||||||
|
|
||||||
|
<Typography
|
||||||
|
variant="body2"
|
||||||
|
color="text.secondary"
|
||||||
|
gutterBottom
|
||||||
|
dangerouslySetInnerHTML={{ __html: news.content }}
|
||||||
|
/>
|
||||||
|
|
||||||
|
{news.tags && news.tags.length > 0 && (
|
||||||
|
<Typography gutterBottom variant="caption" component="div">
|
||||||
|
{news.tags.map((tag, index) =>
|
||||||
|
<Chip label={tag.name} color="success" variant="outlined" sx={{ mr: 1 }} key={index} />
|
||||||
|
)}
|
||||||
|
</Typography>
|
||||||
|
)}
|
||||||
|
</Box>
|
||||||
|
</Container>
|
||||||
|
<Footer />
|
||||||
|
</AppTheme>
|
||||||
|
);
|
||||||
|
}
|
||||||
@ -6,3 +6,4 @@
|
|||||||
|
|
||||||
Route::get('/', [HomepageController::class, 'index'])->name('homepage');
|
Route::get('/', [HomepageController::class, 'index'])->name('homepage');
|
||||||
Route::get('/news', [NewsController::class, 'index'])->name('news.index');
|
Route::get('/news', [NewsController::class, 'index'])->name('news.index');
|
||||||
|
Route::get('/news/{news:slug}', [NewsController::class, 'show'])->name('news.show');
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user