ProjectR Docs
Screen MapDashboard

Raya campaign

Dashboard: every screen, state and flow in Raya campaign.

10 screens and overlays, 52 states, 1 flows. Frames show a real screenshot where one was captured and a wireframe card where the state needs data or conditions a device run cannot produce.

Flows

Pools and Raya campaigns (generation paused)

Step 1
Code Campaigns (Raya) (Web)
Raya code campaigns table
New Campaign
Step 2
Wireframe

Create New Raya Campaign

Success

Campaign created

Toast Campaign created successfully

Needs data: Needs specific backend rows, a role, or a submitted write on a disposable record

Create form saves and opens the campaign
Open detail
Step 3
Raya campaign detail (Web)
Campaign detail with codes and stats
Manage Codes
Step 4
Code Generation, Generation paused (Web)
Code Generation is disabled while paused

Branches and edge cases

Errorfrom step 1
Create Pool, Generation paused (Web)
New pool instead
Edgefrom step 1
Code Pools (Web)
Pools list
Edgefrom step 3
Campaign Analytics (Web)
Analytics
Successfrom step 3
Wireframe

Export claim codes

Success

Exported N codes

Toast Exported N codes successfully

Needs data: Needs specific backend rows, a role, or a submitted write on a disposable record

Export CSV
Edgefrom step 3
Wireframe

Export claim codes

Edge

Export capped

Warning toast at 10,000 codes; export claimed and unclaimed separately

Needs data: Needs specific backend rows, a role, or a submitted write on a disposable record

Export capped at 10000
Edgefrom step 3
Edit Campaign (Web)
Edit campaign
Gatefrom step 3
Wireframe

Delete Campaign

Edge

Copy mismatches behaviour

Says permanent delete but only sets isActive false

Needs data: Needs specific backend rows, a role, or a submitted write on a disposable record

Delete soft-deactivates
Edgefrom step 3
QR Code Preview (Web)
View QR for a code
Gatefrom step 3
Wireframe

Reset Code

Needs data: Needs a Raya campaign with generated codes

Reset a code
Errorfrom step 3
Wireframe

Reset Code

Error

Voucher already used

Server refuses; message toasted

Needs data: Needs specific backend rows, a role, or a submitted write on a disposable record

Reset refused, voucher used
Successfrom step 3
Wireframe

Reset Code

Success

Code reset

Toast Code reset to available

Needs data: Needs specific backend rows, a role, or a submitted write on a disposable record

Reset succeeds
Flow diagram

Screens and states

Code Campaigns (Raya)

Code Campaigns (Raya) (Web)
Screen/dashboard/raya-campaign

Code Campaigns (Raya)

Seasonal QR-code campaign editor; same data as Pools.

src/app/dashboard/raya-campaign/page.tsx

Entry

  • Sidebar
  • Pools Code Campaigns link
  • Templates Raya campaigns

Exits

  • View as Pools → /vouchers/pools
  • New Campaign → /raya-campaign/new
  • Name or View → /[id]
  • Edit, Analytics, Manage Codes
  • Delete → Delete dialog

States · 6

Loading
Table skeleton · DataTableSkeleton 7 colssrc/features/duit-raya/components/campaigns/campaign-listing.tsx
Empty
No campaigns · DataTable default; subtitle says No campaigns yetsrc/features/duit-raya/components/campaigns/campaign-listing.tsx
Edge
Default filter Active · Held in component state so Draft and Ended are hiddensrc/features/duit-raya/components/campaigns/campaign-filters.tsx
Edge
Template filter chip · Filtered by voucher template shows a raw Convex id with clearsrc/features/duit-raya/components/campaigns/campaign-listing.tsx
Edge
Four status badges · Draft, Scheduled, Active, Endedsrc/features/../hooks/convex/use-duit-raya.ts:193
Gate
Route not in access map · access-control maps /duit-raya, not /raya-campaignsrc/lib/access-control.ts:357

Delete Campaign

Delete Campaign (Web)
DialogCampaignDeleteDialog

Delete Campaign

Soft deactivate a Raya campaign (copy says permanent).

src/features/duit-raya/components/campaigns/campaign-delete-dialog.tsx

Entry

  • Row menu Delete
  • Detail More menu

Exits

  • Delete → toast
  • Cancel → closes

States · 4

Edge
Copy mismatches behaviour · Says permanent delete but only sets isActive falsesrc/features/duit-raya/components/campaigns/campaign-delete-dialog.tsx:44
Error
Invalid campaign ID · Guard when the id is invalidsrc/features/duit-raya/components/campaigns/campaign-delete-dialog.tsx
Loading
Deleting... · Buttons disabled while deletingsrc/features/duit-raya/components/campaigns/campaign-delete-dialog.tsx
Success
Campaign deleted · Toast Campaign deleted successfullysrc/features/duit-raya/components/campaigns/campaign-delete-dialog.tsx

Create New Raya Campaign

Create New Raya Campaign (Web)
Screen/dashboard/raya-campaign/new

Create New Raya Campaign

Set up a QR code voucher campaign.

src/app/dashboard/raya-campaign/new/page.tsx

Entry

  • New Campaign

Exits

  • Back arrow → list
  • Cancel → unsaved dialog
  • Create Campaign → /raya-campaign/[id]

States · 6

Edge
Slug auto-generates · Auto-generating from name until editedsrc/features/duit-raya/components/campaigns/campaign-form.tsx
Error
Server reason dropped · success false shows Failed to create campaign, not the reasonsrc/features/duit-raya/components/campaigns/campaign-form.tsx:155
Error
Dates could not be saved · ArgumentValidationError maps to a reselect-schedule messagesrc/features/duit-raya/components/campaigns/campaign-form.tsx
Error
End before start · End date must be after start datesrc/features/duit-raya/components/../utils/schemas.ts:11
Error
Zod default messages · Name and slug length and regex errors use Zod defaultssrc/features/duit-raya/components/../utils/schemas.ts:11
Success
Campaign created · Toast Campaign created successfullysrc/features/duit-raya/components/campaigns/campaign-form.tsx

Raya campaign detail

Raya campaign detail (Web)
Screen/dashboard/raya-campaign/[id]

Raya campaign detail

Campaign overview and its claim codes.

src/app/dashboard/raya-campaign/[id]/page.tsx

Entry

  • List
  • Create redirect
  • Pools links

Exits

  • Back arrow → list
  • Edit → /edit
  • More → Codes, Analytics, Export, Delete
  • Generate More → /codes

States · 6

Loading
Detail skeleton · Skeleton; DataTableSkeleton 5x10 for codessrc/app/dashboard/raya-campaign/[id]/campaign-detail-view.tsx
Error
Campaign not found · Alert with no back linksrc/app/dashboard/raya-campaign/[id]/campaign-detail-view.tsx
Error
Error loading codes · ErrorEmptyState with Try againsrc/features/duit-raya/components/codes/code-table.tsx
Edge
Stats follow type filter · Real or demo filter changes overview statssrc/app/dashboard/raya-campaign/[id]/campaign-detail-view.tsx
Edge
Generate More not gated · Link works even while generation is pausedsrc/app/dashboard/raya-campaign/[id]/campaign-detail-view.tsx
Edge
Filters reset page · Status and type filter changes reset paginationsrc/features/duit-raya/components/codes/code-filters.tsx

QR Code Preview

QR Code Preview (Web)
DialogQRCodePreviewDialog

QR Code Preview

Show a 256px QR with code and template; download as image.

src/features/duit-raya/components/codes/code-table.tsx

Entry

  • Code row View QR

Exits

  • Download QR Code → image
  • Close

States · 1

Error
QR download failed · Toast Failed to download QR codesrc/features/duit-raya/components/codes/code-table.tsx

Reset Code

Wireframe

Reset Code

Needs data: Needs a Raya campaign with generated codes

DialogResetCodeDialog

Reset Code

Return a claimed code to available.

src/features/duit-raya/components/codes/code-table.tsx

Entry

  • Code row Reset Code

Exits

  • Reset → toast
  • Cancel → closes

States · 4

Loading
Resetting... · Button disabled while runningsrc/features/duit-raya/components/codes/code-table.tsx
Success
Code reset · Toast Code reset to availablesrc/features/duit-raya/components/codes/code-table.tsx
Error
Voucher already used · Server refuses; message toastedpackages/backend/convex/duitRaya/mutations.ts
Edge
Shopify code not deleted · Reset deliberately keeps the Shopify codepackages/backend/convex/duitRaya/mutations.ts:813

Edit Campaign

Edit Campaign (Web)
Screen/dashboard/raya-campaign/[id]/edit

Edit Campaign

Update campaign details and active flag.

src/app/dashboard/raya-campaign/[id]/edit/page.tsx

Entry

  • List menu
  • Detail Edit

Exits

  • Back arrow → detail
  • Update Campaign → detail
  • Cancel → unsaved dialog

States · 4

Loading
Form skeleton · Skeleton while loadingsrc/app/dashboard/raya-campaign/[id]/edit/edit-campaign-view.tsx
Error
Campaign not found · Alertsrc/app/dashboard/raya-campaign/[id]/edit/edit-campaign-view.tsx
Edge
Slug immutable · Slug is shown but never sentsrc/features/duit-raya/components/campaigns/campaign-form.tsx
Edge
Only place to flip Active · is_active switch is the only Active/Draft controlsrc/features/duit-raya/components/../utils/schemas.ts

Code Generation

Code Generation (Web)
Screen/dashboard/raya-campaign/[id]/codes

Code Generation

Start generation jobs and watch progress.

src/app/dashboard/raya-campaign/[id]/codes/page.tsx

Entry

  • Detail Generate More
  • List Manage Codes
  • Pool Codes & QR

Exits

  • Back arrow → detail
  • Start Generation → job started

States · 15

Gate
Generation paused · Submit disabled; alert says codes minted today cannot be claimedsrc/app/dashboard/raya-campaign/[id]/codes/codes-view.tsx:220
Edge
Writes to Shopify · Generation creates live Shopify redeem codes via discountRedeemCodeBulkAdd (paused in UI)packages/backend/convex/duitRaya/actions.ts:135
Edge
Write banner shown · ShopifyWriteBanner on this pagesrc/app/dashboard/raya-campaign/[id]/codes/codes-view.tsx
Loading
Jobs loading · Skeleton while jobs loadsrc/app/dashboard/raya-campaign/[id]/codes/codes-view.tsx
Error
Campaign not found · Not found or no access alertsrc/app/dashboard/raya-campaign/[id]/codes/codes-view.tsx
Loading
Templates loading · Loading templates... placeholdersrc/app/dashboard/raya-campaign/[id]/codes/hooks/use-voucher-template-options.ts
Error
Templates failed · Error loading templatessrc/app/dashboard/raya-campaign/[id]/codes/hooks/use-voucher-template-options.ts
Empty
No active templates · No active templates availablesrc/app/dashboard/raya-campaign/[id]/codes/hooks/use-voucher-template-options.ts
Empty
No generation jobs yet · Jobs list emptysrc/app/dashboard/raya-campaign/[id]/codes/codes-view.tsx
Edge
Job progress · Pending or processing shows processed / total progress barsrc/app/dashboard/raya-campaign/[id]/codes/codes-view.tsx
Error
Job failed · Alert with failed code countsrc/app/dashboard/raya-campaign/[id]/codes/codes-view.tsx
Error
Quantity limits · Minimum 1, maximum 1,000 per requestsrc/app/dashboard/raya-campaign/[id]/codes/codes-view.tsx:77
Error
Prefix rule · Prefix must be uppercase alphanumeric, 2 to 10 charssrc/app/dashboard/raya-campaign/[id]/codes/codes-view.tsx:77
Edge
Schemas disagree · generateCodesSchema allows empty prefix; this form does notsrc/features/duit-raya/components/../utils/schemas.ts
Gate
duit_raya:update · Gate for the pagesrc/app/dashboard/raya-campaign/[id]/codes/page.tsx

Captured states

Code Generation, Generation paused (Web)
Generation paused

Campaign Analytics

Campaign Analytics (Web)
Screen/dashboard/raya-campaign/[id]/analytics

Campaign Analytics

Overview cards and claims by denomination chart.

src/app/dashboard/raya-campaign/[id]/analytics/page.tsx

Entry

  • List menu
  • Detail More
  • Pool More

Exits

  • Back arrow → detail
  • Export → /[id]/export

States · 2

Loading
Skeleton · Skeleton while loadingsrc/app/dashboard/raya-campaign/[id]/analytics/analytics-view.tsx
Empty
Analytics not available · Query returns nothing; also covers a bad idsrc/app/dashboard/raya-campaign/[id]/analytics/analytics-view.tsx

Export claim codes

Export claim codes (Web)
Screen/dashboard/raya-campaign/[id]/export

Export claim codes

CSV export of claim codes.

src/app/dashboard/raya-campaign/[id]/export/page.tsx

Entry

  • Detail More Export Data
  • Analytics Export
  • Pool Advanced export

Exits

  • Back arrow → detail
  • Export CSV → browser download

States · 4

Error
Campaign not found · Alertsrc/app/dashboard/raya-campaign/[id]/export/export-view.tsx
Success
Exported N codes · Toast Exported N codes successfullysrc/app/dashboard/raya-campaign/[id]/export/export-view.tsx
Edge
Export capped · Warning toast at 10,000 codes; export claimed and unclaimed separatelysrc/app/dashboard/raya-campaign/[id]/export/export-view.tsx
Error
Export failed · Failed to export codes; server reason droppedsrc/app/dashboard/raya-campaign/[id]/export/export-view.tsx

On this page