Skip to content

Dashboard

PreviousNext

One place for everyone who signs in — staff, members and guests.

The dashboard lives at /ar/dashboard and /en/dashboard. It is not indexed by search engines. Older addresses still work: /admin/… redirects to /dashboard/…, /account to /dashboard/bookings and /notifications to /dashboard/notifications.

Who sees what

Everyone signs in on the same page and lands on /dashboard, which renders a home for their role:

RoleOpens
AdminEverything under /dashboard, including staff accounts
CashierBookings, the front desk, the café counter, POS, bar and member tabs
BaristaThe café bar display
MemberA guest whose desk customer (matched by phone, then email) holds an active hour package: their package, visits and bookings
GuestTheir own bookings, notifications and profile

Member is not a stored role — it is a USER with an active package, so it never drifts from what the desk sold.

The home

Laid out like the hogwarts dashboard, the same three sections for every role:

  1. Now — a flip card with the one thing that matters (today at the space, the bar queue, your next booking or your package), beside Port Sudan's time and weather (Open-Meteo, cached 30 minutes).
  2. Quick look — four counts: bookings, inbox, notifications, events for an admin; your bookings, notifications, events and membership for a guest.
  3. Quick actions — the role's four most frequent jobs.

Below them the admin keeps the café-today totals and the latest bookings, enquiries and events; a guest sees upcoming bookings and a member recent visits.

/dashboard/bookings is role-aware too: the desk works every booking there, a guest or member sees their own. /dashboard/profile and /dashboard/notifications are everyone's.

Sessions

Sign-in is Auth.js (email + password, an email code, Google or Facebook). Every request re-reads the account, so deactivating someone or changing a role takes effect immediately.

  • src/proxy.ts makes an optimistic cookie check and redirects to the login page.
  • requireUser() guards the layout and everyone's pages; requireAdmin() every admin-only page and action; requireStaff(locale, roles) and staffFor(roles) the desk and café screens.
  • A signed-in person who opens a page outside their role is sent to /dashboard.

Sections

SectionManages
InboxRegistrations, applications and enquiries
BookingsBooking requests and their status
EventsEvents and speakers
ProgramsPrograms and modules
CommunityPeople and companies
OpportunitiesJobs, grants, fellowships and tenders
StoriesEditorial stories
PartnersPartners and sponsors
CaféCounter queue, POS, bar, tabs, menu, sales — see Café
StaffStaff accounts and roles