Turnpike  Volunteer Portal
{#if !token}
No volunteer token found in URL.
Check the link you were sent.
{:else if loading}
Loading…
{:else if error && !state}
{error}
{:else if state}
{#if error}
{error}
{/if} {#if conflictShift}

Scheduling Conflict

{conflictShift.name} ({fmt(conflictShift.start_time)}–{fmt(conflictShift.end_time)}) overlaps with:

    {#each conflictingShifts as s}
  • {s.name} — {fmt(s.start_time)}–{fmt(s.end_time)}
  • {/each}

You can still sign up — just confirm you're aware of the overlap.

{/if}
{state.volunteer.name}
{state.volunteer.email || ''} {state.volunteer.is_lead ? ' · Department Lead' : ''}
Token: {token}
{#if state.shifts.length > 0}

My Shifts

{#each groupByDay(state.shifts) as [day, shifts]}
{day}
{#each shifts as s}
{s.name} {fmt(s.start_time)} – {fmt(s.end_time)}
{/each} {/each}
{:else}
You haven't signed up for any shifts yet.
{/if} {#if state.available.length > 0}

Available Shifts

{#each groupByDay(state.available) as [day, shifts]}
{day}
{#each shifts as s} {@const assigned = isAssigned(s.id)} {#if !assigned}
{s.name} {fmt(s.start_time)} – {fmt(s.end_time)} {#if s.capacity > 0} {s.capacity} spots {/if}
{/if} {/each} {/each}
{:else if state.shifts.length === 0}
No shifts are currently available in your department.
{/if}
{/if}