Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
VCCI-News
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Văn Hoàng
VCCI-News
Commits
8ef9343a
Commit
8ef9343a
authored
Nov 12, 2025
by
Văn Hoàng
Browse files
Options
Browse Files
Download
Plain Diff
[tag]0.1-vcci
parents
c05eecdb
15d6837b
Pipeline
#43876
passed with stages
in 20 minutes and 36 seconds
Changes
1
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
54 additions
and
65 deletions
+54
-65
page.tsx
src/app/(main)/[...slug]/page.tsx
+54
-65
No files found.
src/app/(main)/[...slug]/page.tsx
View file @
8ef9343a
...
@@ -23,79 +23,75 @@ export default function DynamicPage() {
...
@@ -23,79 +23,75 @@ export default function DynamicPage() {
const
params
=
useParams
();
const
params
=
useParams
();
const
slugArray
=
Array
.
isArray
(
params
.
slug
)
?
params
.
slug
:
[
params
.
slug
];
const
slugArray
=
Array
.
isArray
(
params
.
slug
)
?
params
.
slug
:
[
params
.
slug
];
const
lastPart
=
slugArray
[
slugArray
.
length
-
1
];
const
lastPart
=
slugArray
[
slugArray
.
length
-
1
];
const
url
=
slugArray
.
join
(
"/"
);
//
check id post
//
states
const
isUUID
=
/^
[
0-9a-fA-F
]{8}
-
[
0-9a-fA-F
]{4}
-
[
0-9a-fA-F
]{4}
-
[
0-9a-fA-F
]{4}
-
[
0-9a-fA-F
]{12}
$/
.
test
(
const
[
submitSearch
,
setSubmitSearch
]
=
useState
(
""
);
lastPart
as
string
const
[
page
,
setPage
]
=
useState
(
1
);
)
;
const
pageSize
=
5
;
const
{
data
:
categoriesPage
}
=
// query
useGetNewsPageConfigGetHierarchical
<
GetNewsPageConfigResponseType
>
({
const
{
data
:
categoriesPage
}
=
useGetNewsPageConfigGetHierarchical
<
GetNewsPageConfigResponseType
>
({
static_link
:
`/
${
slugArray
[
0
]}
`
,
code
:
`
${
slugArray
[
0
]}
`
,
});
});
const
{
data
:
newsDetail
,
isLoading
:
isLoadingDetail
}
=
useGetNews
<
GetNewsResponseType
>
({
filters
:
`external_link@=
${
lastPart
}
`
,
});
const
{
data
:
news
,
isLoading
}
=
useGetNews
<
GetNewsResponseType
>
({
pageSize
:
String
(
pageSize
),
currentPage
:
String
(
page
),
filters
:
`page_config.static_link==/
${
url
}
`
+
(
submitSearch
?
`,title@=
${
submitSearch
}
`
:
""
),
});
if
(
isUUID
)
{
if
(
isLoadingDetail
)
{
const
id
=
lastPart
;
return
(
const
{
data
,
isLoading
}
=
useGetNewsId
<
GetNewsDetailResponseType
>
(
<
div
className=
"flex justify-center py-12"
>
id
as
string
<
Spinner
/>
</
div
>
);
);
}
// detail news page
const
isDetailPage
=
newsDetail
?.
responseData
?.
rows
?.
length
===
1
;
if
(
isDetailPage
)
{
return
(
return
(
<
div
className=
'container w-full flex justify-center items-center pb-10'
>
<
div
className=
'container w-full flex justify-center items-center pb-10'
>
{
isLoading
?
(
<
div
className=
'flex flex-col gap-5 w-full'
>
<
Spinner
/>
<
ListCategory
categories=
{
categoriesPage
?.
responseData
?.
children
}
/>
)
:
(
<
div
className=
"grid grid-cols-1 lg:grid-cols-3 gap-5"
>
<
div
className=
'flex flex-col gap-5 w-full'
>
<
main
className=
"lg:col-span-2 bg-white border rounded-md p-8"
>
<
ListCategory
categories=
{
categoriesPage
?.
responseData
?.
children
}
/>
<
div
className=
'pb-5 text-primary text-2xl leading-normal font-medium'
>
<
div
className=
"grid grid-cols-1 lg:grid-cols-3 gap-5"
>
{
newsDetail
?.
responseData
?.
rows
[
0
].
title
}
{
/* Main content */
}
</
div
>
<
main
className=
"lg:col-span-2 bg-white border rounded-md p-8"
>
<
div
className=
'flex items-center gap-2 text-sm mb-4'
>
<
div
className=
'pb-5 text-primary text-2xl leading-normal font-medium'
>
<
span
className=
'text-base text-blue-700'
>
{
data
?.
responseData
?.
title
}
{
dayjs
(
newsDetail
?.
responseData
?.
rows
[
0
].
created_at
).
format
(
'DD/MM/YYYY'
)
}
</
div
>
</
span
>
<
div
className=
'flex items-center gap-2 text-sm mb-4'
>
</
div
>
<
span
className=
'text-base text-blue-700'
>
<
hr
className=
"my-5"
/>
{
dayjs
(
data
?.
responseData
?.
created_at
).
format
(
'DD/MM/YYYY'
)
}
<
div
className=
'flex-1 text-app-grey text-base overflow-hidden'
>
</
span
>
<
div
className=
"prose tiptap overflow-hidden"
>
</
div
>
{
parse
(
newsDetail
?.
responseData
?.
rows
[
0
].
description
??
''
)
}
<
hr
className=
"my-5"
/>
<
div
className=
'flex-1 text-app-grey text-base overflow-hidden'
>
<
div
className=
"prose tiptap overflow-hidden"
>
{
parse
(
data
?.
responseData
?.
description
??
''
)
}
</
div
>
</
div
>
</
div
>
</
main
>
</
div
>
</
main
>
{
/* Sidebar */
}
<
aside
className=
"space-y-6"
>
<
aside
className=
"space-y-6"
>
<
EventCalendar
/>
<
EventCalendar
/>
</
aside
>
</
aside
>
</
div
>
</
div
>
</
div
>
)
}
</
div
>
</
div
>
</
div
>
);
);
}
}
// nếu là trang danh sách tin tức
// list news page
const
url
=
slugArray
.
join
(
"/"
);
const
[
submitSearch
,
setSubmitSearch
]
=
useState
(
""
);
const
[
page
,
setPage
]
=
useState
(
1
);
const
pageSize
=
5
;
const
{
data
:
news
,
isLoading
}
=
useGetNews
<
GetNewsResponseType
>
({
pageSize
:
String
(
pageSize
),
currentPage
:
String
(
page
),
filters
:
`page_config.static_link==/
${
url
}
`
+
(
submitSearch
?
`,title@=
${
submitSearch
}
`
:
""
),
});
return
(
return
(
<
div
className=
"min-h-screen container mx-auto"
>
<
div
className=
"min-h-screen container mx-auto"
>
<
div
className=
"w-full flex flex-col gap-5"
>
<
div
className=
"w-full flex flex-col gap-5"
>
<
ListCategory
categories=
{
categoriesPage
?.
responseData
?.
children
}
/>
<
ListCategory
categories=
{
categoriesPage
?.
responseData
?.
children
}
/>
<
div
className=
"grid grid-cols-1 lg:grid-cols-3 gap-6"
>
<
div
className=
"grid grid-cols-1 lg:grid-cols-3 gap-6"
>
{
/* Main content */
}
<
main
className=
"lg:col-span-2 bg-background"
>
<
main
className=
"lg:col-span-2 bg-background"
>
<
div
className=
"pb-5 overflow-hidden"
>
<
div
className=
"pb-5 overflow-hidden"
>
{
isLoading
?
(
{
isLoading
?
(
...
@@ -111,10 +107,9 @@ export default function DynamicPage() {
...
@@ -111,10 +107,9 @@ export default function DynamicPage() {
<
CardNews
<
CardNews
key=
{
item
.
id
}
key=
{
item
.
id
}
news=
{
item
}
news=
{
item
}
link=
{
`
/${url}/${item.id
}`
}
link=
{
`
${item.external_link
}`
}
/>
/>
))
}
))
}
<
div
className=
"w-full flex justify-center mt-4"
>
<
div
className=
"w-full flex justify-center mt-4"
>
<
Pagination
<
Pagination
pageCount=
{
Number
(
news
?.
responseData
.
totalPages
??
1
)
}
pageCount=
{
Number
(
news
?.
responseData
.
totalPages
??
1
)
}
...
@@ -130,18 +125,12 @@ export default function DynamicPage() {
...
@@ -130,18 +125,12 @@ export default function DynamicPage() {
)
}
)
}
</
div
>
</
div
>
</
main
>
</
main
>
{
/* Sidebar */
}
<
aside
className=
"space-y-6"
>
<
aside
className=
"space-y-6"
>
<
ListFilter
onSearch=
{
setSubmitSearch
}
/>
<
ListFilter
onSearch=
{
setSubmitSearch
}
/>
<
EventCalendar
/>
<
EventCalendar
/>
<
div
className=
"bg-white border rounded-md overflow-hidden"
>
<
div
className=
"bg-white border rounded-md overflow-hidden"
>
<
div
className=
"w-full relative bg-gray-100"
>
<
div
className=
"w-full relative bg-gray-100"
>
<
img
<
img
src=
"/banner.webp"
alt=
"Quảng cáo"
className=
"object-cover"
/>
src=
"/banner.webp"
alt=
"Quảng cáo"
className=
"object-cover"
/>
</
div
>
</
div
>
</
div
>
</
div
>
</
aside
>
</
aside
>
...
@@ -149,4 +138,4 @@ export default function DynamicPage() {
...
@@ -149,4 +138,4 @@ export default function DynamicPage() {
</
div
>
</
div
>
</
div
>
</
div
>
);
);
}
}
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment