How amarathorng/cambodian-village-foods works
Cambodian Village Foods is a bilingual living archive for preserving Cambodian food traditions and community stories. Visitors browse and search published foods; contributors sign in, submit entries with photos, and track their submissions while reviewers approve or return pending entries. The map separates public browsing, contribution and account flows, personal submission management, and moderation. Supabase provides server-side authentication, entry data, and photo storage. Some page and route implementations were not sampled, so their behavior and connections are included only where documented or evidenced by the source index.
Main entry points: page.js Archive home · entries/route.js Entry collection API · supabase.js Supabase client · my-entries/route.js Owner submissions API
Components 29
Public archive
- Archive home
app/page.js - Food search
components/FoodSearch.js - Location filters
components/FoodFilters.js - Food grid
components/FoodGrid.js - Food card
components/FoodCard.js - Food detail
app/food/[id]/FoodDetail.js - Food article
app/food/[id]/FoodArticle.js - Archive storytelling
components/ArchiveIntroduction.js
Accounts
- Login and signup
app/login.page.js - Authentication routes
app/api/auth/login/route.js - Signup route
app/api/auth/signup/route.js
Contribution
- Contribution form
app/contribute-form.js - Entry fields
components/EntryFields.js - Entry validation
components/entryValidation.js - Entry collection API
app/api/entries/route.js - Entry mapping
app/entry-mapper.js - Edit submission
app/food/[id]/edit/EditForm.js
Submission tracking
- My submissions
app/my-entries/MyEntries.js - Owner submissions API
app/api/my-entries/route.js - Submission card
components/MyEntryCard.js - Status badge
components/StatusBadge.js
Review workflow
- Reviewer queue
app/review/ReviewQueue.js - Review card
components/ReviewCard.js - Review queue API
app/api/review/route.js - Review decision API
app/api/review/[id]/route.js
Other components
- Archive visitor
- Supabase client
app/supabase.js - Entries database
- Photo storage
Connections 36
- Archive visitor → Archive home: browses
- Archive home → Entry collection API: fetches published entries
app/page.js - Archive home → Food search: renders
app/page.js - Archive home → Location filters: renders
app/page.js - Archive home → Food grid: renders filtered entries
app/page.js - Food grid → Food card: renders
components/FoodGrid.js - Archive home → Archive storytelling: renders
app/page.js - Food detail → Food article: renders
app/food/[id]/FoodDetail.js - Entry collection API → Supabase client: creates client
app/api/entries/route.js - Entry collection API → Entries database: reads and writes entries
app/api/entries/route.js - Entry collection API → Photo storage: uploads photos
app/api/entries/route.js - Entry collection API → Entry mapping: maps records
app/api/entries/route.js - Login and signup → Authentication routes: authenticates
- Login and signup → Signup route: registers
- Authentication routes → Supabase client: creates client
app/api/auth/login/route.js - Signup route → Supabase client: creates client
app/api/auth/signup/route.js - Archive visitor → Contribution form: submits a story
- Contribution form → Entry fields: renders fields
app/contribute-form.js - Entry fields → Entry validation: validates fields
components/EntryFields.js - Contribution form → Entry collection API: submits entry
- My submissions → Owner submissions API: loads submissions
- Owner submissions API → Supabase client: creates client
app/api/my-entries/route.js - Owner submissions API → Entries database: reads owned entries
app/api/my-entries/route.js - Owner submissions API → Entry mapping: maps records
app/api/my-entries/route.js - My submissions → Submission card: renders submissions
app/my-entries/MyEntries.js - Submission card → Status badge: shows status
components/MyEntryCard.js - Edit submission → Entry fields: renders fields
app/food/[id]/edit/EditForm.js - Reviewer queue → Review queue API: loads pending entries
app/review/ReviewQueue.js - Reviewer queue → Review decision API: sends decisions
app/review/ReviewQueue.js - Reviewer queue → Review card: renders entries
app/review/ReviewQueue.js - Review card → Status badge: shows status
components/ReviewCard.js - Review queue API → Supabase client: creates client
app/api/review/route.js - Review queue API → Entries database: reads pending entries
app/api/review/route.js - Review queue API → Entry mapping: maps records
app/api/review/route.js - Review decision API → Supabase client: creates client
app/api/review/[id]/route.js - Review decision API → Entries database: updates review state