Section Load Error
Stands in for one dashboard section whose data could not be fetched. It exists because an empty result and a failed one used to be the same value: a failed getProgressSeries returned [] and rendered as a confident "за 0 співбесід" directly above a list of two graded interviews.
Default
Scoped to a section, never the page — the dashboard fetches run in Promise.all, so one failing leaves the others with real data. Retry calls router.refresh(), which re-runs the server render without discarding the sections that did load. Shown at 704px, the width the dashboard content column actually gives a section.
Не вдалося завантажити прогрес
Дані про твої співбесіди тимчасово недоступні. Вони не втрачені — спробуй ще раз.
| Prop | Type | Default | Description |
|---|---|---|---|
| title | string | — | What failed, stated as a failure to load — never as an absence of data. |
| body | string | — | Reassurance that nothing was lost, plus what to do. From dashboardCopy.loadError. |
| retryLabel | string | — | Label for the retry button, which calls router.refresh() — re-runs the server render without discarding the sections that did load. |
Service unavailable
Same component with contactLabel + contactHref: used when the whole account backend (Supabase) is unreachable, not one fetch. Rendered by dashboard/layout.tsx in place of every /dashboard/** page, and only there — no banner or modal anywhere else, since the interview itself needs no account. Shown at 704px.
Кабінет тимчасово недоступний
Твої дані не втрачені. Інтерв'ю можна пройти й без входу.
| Prop | Type | Default | Description |
|---|---|---|---|
| contactLabel | string | — | Optional. With contactHref, renders a link (target=_blank, rel=noopener noreferrer) under the retry button. |
| contactHref | string | — | Optional. LINKEDIN_URL from author-promo.ts — the single percent-encoded source. |
Not an empty state
Side by side with EmptyState, because confusing the two is the whole bug. EmptyState is action-framed for first run: dashed border reading as a slot awaiting content, a ghost preview, a CTA onward. A failure has none of those properties — nothing is waiting, and the user did nothing to cause it.
Не вдалося завантажити прогрес
Дані про твої співбесіди тимчасово недоступні. Вони не втрачені — спробуй ще раз.
Пройди першу співбесіду
Твій профіль навичок з'явиться тут одразу після першої оціненої співбесіди.
Почати співбесіду
VoiceMock was built by one designer
I'm Sergiy, a product designer. I built this trainer myself — research, design system, code. On LinkedIn I show how products like this come together, and what it changes in a designer's work.
Product Designer · AI Design Engineer · Designer for Startups
See it on LinkedIn