Your view state is doing the job the router already does for free. That is the seam.
Split along it: app/page.tsx for the picker, app/confirm/[slot]/page.tsx, app/admin/page.tsx. Three files, each one screen, and the browser back button starts working, which it currently does not.
Then move the fetching. Those three pages can stay server components that query Supabase directly and pass plain data down. Only the bits with a click handler need 'use client'. In a file like yours that is usually the form and nothing else, and the client bundle drops sharply.
Do it in that order. Routes first, then client boundaries. Trying to do both at once is where these refactors stall.