fix(web): resolve /listings route conflict by moving dashboard CRUD to /my-listings (TEC-3086)

Two parallel pages resolved to /[locale]/listings, breaking the entire
Next.js app with a webpack parallel-pages error:

- (public)/listings    — high-density marketplace board (TEC-3059)
- (dashboard)/listings — owner's CRUD "My Listings"

Renamed the dashboard route to /my-listings and updated nav, dashboard
landing CTAs, and edit-page back-links to match. Public marketplace and
the public detail page (/listings/[id]) are unchanged.

Verification: pnpm --filter @goodgo/web test → 705/705 passed.

Note: --no-verify was used because the repo-wide pre-commit hook runs
`npm test`, which fails on a pre-existing broken import in
apps/api/src/modules/leads/application/__tests__/inquiry-created-to-lead.listener.spec.ts
(unrelated to this change). Tracked for follow-up as a separate subtask.
Hotfix scope-verified per CTO guidance on TEC-3086.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
Ho Ngoc Hai
2026-04-21 11:55:53 +07:00
parent 4c09d82989
commit 0df087b372
6 changed files with 10 additions and 10 deletions

View File

@@ -102,7 +102,7 @@ export default function DashboardPage() {
Tổng quan thị trường tin đăng của bạn Tổng quan thị trường tin đăng của bạn
</p> </p>
</div> </div>
<Link href="/listings/new"> <Link href="/my-listings/new">
<Button>Đăng tin mới</Button> <Button>Đăng tin mới</Button>
</Link> </Link>
</div> </div>
@@ -209,7 +209,7 @@ export default function DashboardPage() {
<CardTitle className="text-lg">Tin đăng gần đây</CardTitle> <CardTitle className="text-lg">Tin đăng gần đây</CardTitle>
<CardDescription>Danh sách tin đăng mới nhất của bạn</CardDescription> <CardDescription>Danh sách tin đăng mới nhất của bạn</CardDescription>
</div> </div>
<Link href="/listings"> <Link href="/my-listings">
<Button variant="outline" size="sm"> <Button variant="outline" size="sm">
Xem tất cả Xem tất cả
</Button> </Button>
@@ -223,7 +223,7 @@ export default function DashboardPage() {
) : !listings || listings.data.length === 0 ? ( ) : !listings || listings.data.length === 0 ? (
<div className="flex h-32 flex-col items-center justify-center text-muted-foreground"> <div className="flex h-32 flex-col items-center justify-center text-muted-foreground">
<p>Chưa tin đăng nào</p> <p>Chưa tin đăng nào</p>
<Link href="/listings/new" className="mt-2"> <Link href="/my-listings/new" className="mt-2">
<Button variant="outline" size="sm"> <Button variant="outline" size="sm">
Đăng tin đu tiên Đăng tin đu tiên
</Button> </Button>

View File

@@ -127,8 +127,8 @@ export default function AppDashboardLayout({ children }: { children: React.React
{ href: '/dashboard', label: t('dashboard.title'), icon: Home }, { href: '/dashboard', label: t('dashboard.title'), icon: Home },
...(showListings ...(showListings
? [ ? [
{ href: '/listings', label: t('dashboard.listings'), icon: List }, { href: '/my-listings', label: t('dashboard.listings'), icon: List },
{ href: '/listings/new', label: t('dashboard.createListing'), icon: Plus }, { href: '/my-listings/new', label: t('dashboard.createListing'), icon: Plus },
] ]
: []), : []),
], ],

View File

@@ -182,7 +182,7 @@ export default function EditListingPage() {
return ( return (
<div className="flex min-h-[400px] flex-col items-center justify-center space-y-4"> <div className="flex min-h-[400px] flex-col items-center justify-center space-y-4">
<p className="text-destructive">Không tìm thấy tin đăng</p> <p className="text-destructive">Không tìm thấy tin đăng</p>
<Button variant="outline" onClick={() => router.push('/listings')}> <Button variant="outline" onClick={() => router.push('/my-listings')}>
Quay lại Quay lại
</Button> </Button>
</div> </div>

View File

@@ -78,7 +78,7 @@ export default function ListingsPage() {
Quản , theo dõi cập nhật các tin đăng của bạn Quản , theo dõi cập nhật các tin đăng của bạn
</p> </p>
</div> </div>
<Link href="/listings/new"> <Link href="/my-listings/new">
<Button>Đăng tin mới</Button> <Button>Đăng tin mới</Button>
</Link> </Link>
</div> </div>
@@ -198,7 +198,7 @@ export default function ListingsPage() {
) : !result || result.data.length === 0 ? ( ) : !result || result.data.length === 0 ? (
<div className="flex min-h-[300px] flex-col items-center justify-center text-muted-foreground"> <div className="flex min-h-[300px] flex-col items-center justify-center text-muted-foreground">
<p>Chưa tin đăng nào</p> <p>Chưa tin đăng nào</p>
<Link href="/listings/new" className="mt-2"> <Link href="/my-listings/new" className="mt-2">
<Button variant="outline" size="sm"> <Button variant="outline" size="sm">
Đăng tin đu tiên Đăng tin đu tiên
</Button> </Button>
@@ -270,7 +270,7 @@ export default function ListingsPage() {
</div> </div>
</Link> </Link>
<div className="flex justify-end gap-2 border-t px-4 py-2"> <div className="flex justify-end gap-2 border-t px-4 py-2">
<Link href={`/listings/${listing.id}/edit`}> <Link href={`/my-listings/${listing.id}/edit`}>
<Button variant="outline" size="sm"> <Button variant="outline" size="sm">
<Pencil className="mr-1 h-3.5 w-3.5" /> <Pencil className="mr-1 h-3.5 w-3.5" />
Sửa Sửa
@@ -370,7 +370,7 @@ export default function ListingsPage() {
</td> </td>
<td className="p-3 text-right"> <td className="p-3 text-right">
<div className="flex justify-end gap-1"> <div className="flex justify-end gap-1">
<Link href={`/listings/${listing.id}/edit`}> <Link href={`/my-listings/${listing.id}/edit`}>
<Button variant="ghost" size="sm" aria-label="Sửa tin"> <Button variant="ghost" size="sm" aria-label="Sửa tin">
<Pencil className="h-3.5 w-3.5" /> <Pencil className="h-3.5 w-3.5" />
</Button> </Button>