Standard routingu w AGENTS.md i usuniecie atrap href="#"
- AGENTS.md: obowiazkowy standard architektoniczny - kazdy widok ma wlasny
URL w React Routerze, zakaz nawigacji na useState/setView/activeView,
identyfikatory w parametrach URL, filtry w query string, ProtectedRoute
- 7 z 9 atrap href="#" zamienionych na <Link> do istniejacych tras
- pozostaly 2 w ServicesPage ("Zobacz firmy", "Zobacz wszystkie") - brak
docelowej strony listy firm, wymagaja decyzji produktowej
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -44,6 +44,31 @@ Pull requests should include a short summary, testing performed, linked issues w
|
|||||||
|
|
||||||
Do not commit secrets, local credentials, generated build output, or machine-specific configuration. Store required environment variables in an ignored `.env` file and document safe example values in `.env.example`.
|
Do not commit secrets, local credentials, generated build output, or machine-specific configuration. Store required environment variables in an ignored `.env` file and document safe example values in `.env.example`.
|
||||||
|
|
||||||
|
## Standard architektoniczny: routing (obowiązkowy)
|
||||||
|
|
||||||
|
Każdy nowy widok, ekran, zakładka lub podstrona **musi mieć własny, jednoznaczny adres URL** i być obsługiwana przez React Router. To twardy standard całego projektu, nie sugestia.
|
||||||
|
|
||||||
|
Zasady:
|
||||||
|
|
||||||
|
- **Nie buduj nawigacji na stanie.** Zakazane jako mechanizm przełączania stron: `useState('view')`, `setView`, `activeView`, `selectedPage`, `selectedTab` i pochodne.
|
||||||
|
- **Nie przełączaj całych stron warunkowym renderowaniem** bez zmiany adresu (`{view === 'x' && <Page />}`).
|
||||||
|
- **Do nawigacji używaj** `Link`, `NavLink`, `useNavigate` oraz tras zadeklarowanych w `Routes`.
|
||||||
|
- **Identyfikatory obiektów trzymaj w parametrach URL**: `/oferta/:id`, `/profil/:id`, `/wiadomosci/:conversationId` — nie w stanie Reacta.
|
||||||
|
- **Filtry, sortowanie, wyszukiwanie i paginację zapisuj w query string** wszędzie tam, gdzie użytkownik powinien móc skopiować lub odświeżyć widok.
|
||||||
|
- **Zakładki paneli twórz jako trasy zagnieżdżone**: `/konto/ustawienia`, `/admin/uzytkownicy`.
|
||||||
|
- **Trasy wymagające logowania zabezpieczaj `ProtectedRoute`** (`frontend/src/ProtectedRoute.tsx`). Pamiętaj, że to zabezpieczenie interfejsu — autoryzację egzekwuje backend.
|
||||||
|
- **Nie używaj `href="#"`** ani przycisków imitujących linki.
|
||||||
|
- **Każdy link musi działać** po odświeżeniu (F5), przy bezpośrednim wejściu z adresu, po użyciu Wstecz/Dalej i po otwarciu w nowej karcie.
|
||||||
|
|
||||||
|
Gdzie co leży:
|
||||||
|
|
||||||
|
- `frontend/src/routes.ts` — centralna mapa adresów (`ROUTES`) i helpery (`listingPath`, `mapPath`, `adminTabPath`). Nowy widok zaczynaj od wpisu tutaj, nie od literału ścieżki w JSX.
|
||||||
|
- `frontend/src/ProtectedRoute.tsx` — bramka autoryzacji, obsługuje stan `loading` z `AuthProvider`.
|
||||||
|
- `frontend/src/App.tsx` — deklaracja `<Routes>`.
|
||||||
|
- `nginx/default.conf` — `try_files $uri $uri/ /index.html` (SPA fallback, już skonfigurowany).
|
||||||
|
|
||||||
|
Przed zakończeniem każdego zadania sprawdź, czy dodane widoki mają trasy i czy adres zmienia się podczas nawigacji. Jeżeli istniejący kod łamie ten standard, nie powielaj starego rozwiązania — dostosuj go do React Routera.
|
||||||
|
|
||||||
## Behavioral Guidelines To Reduce Common LLM Coding Mistakes
|
## Behavioral Guidelines To Reduce Common LLM Coding Mistakes
|
||||||
|
|
||||||
Tradeoff: These guidelines bias toward caution over speed. For trivial tasks, use judgment.
|
Tradeoff: These guidelines bias toward caution over speed. For trivial tasks, use judgment.
|
||||||
|
|||||||
@@ -10987,7 +10987,7 @@ function HomePage({ filters, onOpenMap }: { filters: FilterState; onOpenMap: (ci
|
|||||||
<section className="offers" aria-label="Polecane ogłoszenia">
|
<section className="offers" aria-label="Polecane ogłoszenia">
|
||||||
<div className="section-head">
|
<div className="section-head">
|
||||||
<h2>Polecane ogłoszenia</h2>
|
<h2>Polecane ogłoszenia</h2>
|
||||||
<a href="#">Zobacz wszystkie <Icon name="arrow" /></a>
|
<Link to={ROUTES.buy}>Zobacz wszystkie <Icon name="arrow" /></Link>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="listing-loop">
|
<div className="listing-loop">
|
||||||
@@ -13239,10 +13239,10 @@ function GuidesPage() {
|
|||||||
</div>
|
</div>
|
||||||
<div className="popular-links">
|
<div className="popular-links">
|
||||||
<span>Popularne:</span>
|
<span>Popularne:</span>
|
||||||
<a href="#">Kredyt hipoteczny</a>
|
<Link to={ROUTES.creditCalculator}>Kredyt hipoteczny</Link>
|
||||||
<a href="#">Umowa najmu</a>
|
<Link to={ROUTES.rent}>Umowa najmu</Link>
|
||||||
<a href="#">Podatek od sprzedaży</a>
|
<Link to={ROUTES.sell}>Podatek od sprzedaży</Link>
|
||||||
<a href="#">Księga wieczysta</a>
|
<Link to={ROUTES.guideBuying}>Księga wieczysta</Link>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -13294,7 +13294,7 @@ function GuidesPage() {
|
|||||||
<section className="guides-section">
|
<section className="guides-section">
|
||||||
<div className="section-head">
|
<div className="section-head">
|
||||||
<h2>Polecane artykuły</h2>
|
<h2>Polecane artykuły</h2>
|
||||||
<a href="#">Zobacz wszystkie <Icon name="arrow" /></a>
|
<Link to={ROUTES.guideBuying}>Zobacz wszystkie <Icon name="arrow" /></Link>
|
||||||
</div>
|
</div>
|
||||||
<div className="article-grid">
|
<div className="article-grid">
|
||||||
{guideArticles.map((article) => (
|
{guideArticles.map((article) => (
|
||||||
@@ -13327,7 +13327,7 @@ function GuidesPage() {
|
|||||||
<div>
|
<div>
|
||||||
<h3>{offer.title}</h3>
|
<h3>{offer.title}</h3>
|
||||||
<span>{offer.count}</span>
|
<span>{offer.count}</span>
|
||||||
<a href="#">Zobacz oferty <Icon name="arrow" /></a>
|
<Link to={ROUTES.buy}>Zobacz oferty <Icon name="arrow" /></Link>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
className="related-offer-image"
|
className="related-offer-image"
|
||||||
|
|||||||
Reference in New Issue
Block a user