Skip to content

feat: session/device management UI with live remote logout#27

Merged
kemalcalak merged 8 commits into
mainfrom
feature/session-management
Jun 13, 2026
Merged

feat: session/device management UI with live remote logout#27
kemalcalak merged 8 commits into
mainfrom
feature/session-management

Conversation

@kemalcalak

Copy link
Copy Markdown
Owner

No description provided.

@kemalcalak kemalcalak self-assigned this Jun 12, 2026
@kemalcalak

Copy link
Copy Markdown
Owner Author

/review — 5 bulgu

1. Inline prop tipi — interface XProps zorunlu (§5.8, tekrarlayan ihlal)

Dosya: src/components/admin/UserSessionsCard.tsx#L20-L50
Kategori: review-md-compliance · Önem: major

Yeni bileşenler prop tiplerini ayrı bir interface <ComponentName>Props ile tanımlamalı; anonim inline literal kullanılmamalı. Bu ihlal şu konumlarda var: UserActivityCard (L14), UserSessionsCard içinde DeviceIcon (L20), SessionRow (L29), UserSessionsCard (L50) ve SessionsSection içinde DeviceIcon (L21). Aynı dosyadaki ConfirmRevokeModal/SessionRow'un interface kullanması tutarsızlığı gösteriyor. Bu kalıp PR #20 ve #24'te de reddedilip düzeltilmesi istenmişti.

REVIEW.md §5.8: "Inline ({a, b}: {a:string}) props — interface XProps zorunlu." · §3.1: "Props: interface <ComponentName>Props, inline tanım ihraç edilmez."

Öneri: Her bileşen için interface DeviceIconProps, interface SessionRowProps, interface UserSessionsCardProps, interface UserActivityCardProps tanımla ve imzaları bunlara bağla.


2. Admin panelde çift account WebSocket bağlantısı

Dosya: src/app/[locale]/(protected)/layout.tsx#L28-L31
Kategori: history · Önem: major

AccountEventsBridge korumalı layout'a eklendi ve useAccountEvents() çağırıyor. Ancak AdminShell.tsx (PR #22, ~L50) hâlâ aynı hook'u çağırıyor ve kaldırılmamış. Admin kullanıcıları artık iki eşzamanlı account-event soketi açıyor; her permissions_updated / sessions_revoked olayında getMe() + setUser() + invalidateQueries() iki kez tetikleniyor.

PR #22: "feat: live permission updates via account socket" — AdminShell.tsx içinde useAccountEvents();

Öneri: AdminShell.tsx içindeki useAccountEvents() çağrısını ve import'unu kaldır; soket artık AccountEventsBridge üzerinden yönetiliyor.


3. Paylaşımlı ConfirmDialog yerine inline Modal

Dosya: src/components/admin/UserSessionsCard.tsx#L127-L154
Kategori: review-md-compliance · Önem: minor

"Terminate all sessions" onay akışı inline Modal JSX olarak yazılmış. Tam bu amaca yönelik paylaşımlı components/admin/ConfirmDialog.tsx zaten mevcut (open, onOpenChange, title, description, confirmLabel, onConfirm, isLoading, destructive prop seti ile).

REVIEW.md (anti-pattern): "Yeni confirm akışlarında bunu kullan… Örnek paylaşımlı bileşen: components/admin/ConfirmDialog.tsx."

Öneri: Inline Modal bloğunu kaldır; <ConfirmDialog ... destructive isLoading={isPending} onConfirm={handleRevokeAll} /> kullan.


4. SessionsSection.tsx max-lines (150) limitini aşıyor

Dosya: src/components/profile/SessionsSection.tsx
Kategori: review-md-compliance · Önem: major

Dosya 259 satır; eslint.config.mjs components klasörü override'ı max-lines: 150. Limit %73 aşılıyor (build/lint hatası üretir).

Öneri: ConfirmRevokeModalsrc/components/profile/ConfirmRevokeModal.tsx'e çıkararak dosyayı ≤150 satıra indir.


5. UserSessionsCard.tsx max-lines (150) limitini aşıyor

Dosya: src/components/admin/UserSessionsCard.tsx
Kategori: review-md-compliance · Önem: minor

Dosya 157 satır; components override'ı max-lines: 150 — 7 satır aşımı lint hatası verir.

Öneri: SessionRow veya Modal içeriğini ayrı bir bileşene taşıyarak limitin altına in.


🤖 Generated with Claude Code

@kemalcalak

Copy link
Copy Markdown
Owner Author

Review yanıtı — 2 düzeltme uygulandı, 3 yanlış teşhis

Düzeltilen bulgular

#1 — Inline prop tipi (§5.8): Düzeltildi. Beş konumda named interface tanımlandı: UserActivityCardProps, DeviceIconProps, SessionRowProps, UserSessionsCardProps. Inline obje-literal prop kalmadı.

#3 — Paylaşımlı ConfirmDialog: Düzeltildi. UserSessionsCard içindeki inline terminate-all Modal kaldırıldı; components/admin/ConfirmDialog (destructive, isLoading, onConfirm) kullanılıyor.

Uygulanmayan bulgular (yanlış teşhis)

#2 — Çift account soketi: Geçerli değil. AccountEventsBridge, [locale]/(protected)/layout.tsx altında; AdminShell ise [locale]/admin/(protected)/layout.tsx altında. Bunlar kardeş route dalları — admin sayfaları /admin/... non-admin (protected) layout'unu mount etmez, dolayısıyla iki hook aynı anda çalışmaz. Çift soket yok.

#4 / #5 — max-lines (150) aşımı: Geçerli değil. eslint.config.mjs'te dosya başına kural max-lines: 300 (error); 150 ise max-lines-per-function ve seviyesi warn (build kırmaz). SessionsSection.tsx 222 satır, UserSessionsCard.tsx 154 satır — ikisi de 300 sınırının altında. Per-file 300 ile per-function 150 karıştırılmış.

Doğrulama: pnpm exec eslint → exit 0 · ilgili testler 8/8 passed.

@kemalcalak kemalcalak merged commit 4080b23 into main Jun 13, 2026
2 checks passed
@kemalcalak kemalcalak deleted the feature/session-management branch June 14, 2026 16:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant