Skip to content

Improve shared bill loading and draft state handling#19

Merged
Aarekaz merged 13 commits into
mainfrom
feat/shared-bill-state-model
May 29, 2026
Merged

Improve shared bill loading and draft state handling#19
Aarekaz merged 13 commits into
mainfrom
feat/shared-bill-state-model

Conversation

@Aarekaz
Copy link
Copy Markdown
Owner

@Aarekaz Aarekaz commented May 29, 2026

Summary

  • extract shared bill query helpers and make shared reloads depend on actual bill id changes
  • clear shared bill params when starting a new draft and return readable backend proxy failures
  • add explicit shared vs draft bill source modes, fork shared bills into local copies on edit, and keep shared views out of draft persistence
  • show shared bill mode in the header and expand regression coverage around shared bill transitions

Testing

  • pnpm test --runInBand
  • pnpm typecheck
  • pnpm build

@vercel
Copy link
Copy Markdown
Contributor

vercel Bot commented May 29, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
split-simple Ready Ready Preview, Comment May 29, 2026 6:08am

@github-actions
Copy link
Copy Markdown

Coverage after merging feat/shared-bill-state-model into main will be

21.81%

Coverage Report
FileStmtsBranchesFuncsLinesUncovered Lines
app
   layout.tsx0%0%0%0%1, 1, 10–19, 2, 20–29, 3, 30–39, 4, 40–49, 5, 50–59, 6, 60–69, 7, 70–79, 8, 80–87, 9
   page.tsx0%0%0%0%1, 1, 10–12, 2–9
app/admin
   layout.tsx0%0%0%0%1, 1, 10–16, 2–9
   page.tsx0%0%0%0%1, 1, 10, 100, 1000–1009, 101, 1010–1019, 102, 1020–1029, 103, 1030–1039, 104, 1040–1049, 105, 1050–1059, 106, 1060–1069, 107, 1070–1079, 108, 1080–1089, 109, 1090–1099, 11, 110, 1100–1109, 111, 1110–1119, 112, 1120–1124, 113–119, 12, 120–129, 13, 130–139, 14, 140–149, 15, 150–159, 16, 160–169, 17, 170–179, 18, 180–189, 19, 190–199, 2, 20, 200–209, 21, 210–219, 22, 220–229, 23, 230–239, 24, 240–249, 25, 250–259, 26, 260–269, 27, 270–279, 28, 280–289, 29, 290–299, 3, 30, 300–309, 31, 310–319, 32, 320–329, 33, 330–339, 34, 340–349, 35, 350–359, 36, 360–369, 37, 370–379, 38, 380–389, 39, 390–399, 4, 40, 400–409, 41, 410–419, 42, 420–429, 43, 430–439, 44, 440–449, 45, 450–459, 46, 460–469, 47, 470–479, 48, 480–489, 49, 490–499, 5, 50, 500–509, 51, 510–519, 52, 520–529, 53, 530–539, 54, 540–549, 55, 550–559, 56, 560–569, 57, 570–579, 58, 580–589, 59, 590–599, 6, 60, 600–609, 61, 610–619, 62, 620–629, 63, 630–639, 64, 640–649, 65, 650–659, 66, 660–669, 67, 670–679, 68, 680–689, 69, 690–699, 7, 70, 700–709, 71, 710–719, 72, 720–729, 73, 730–739, 74, 740–749, 75, 750–759, 76, 760–769, 77, 770–779, 78, 780–789, 79, 790–799, 8, 80, 800–809, 81, 810–819, 82, 820–829, 83, 830–839, 84, 840–849, 85, 850–859, 86, 860–869, 87, 870–879, 88, 880–889, 89, 890–899, 9, 90, 900–909, 91, 910–919, 92, 920–929, 93, 930–939, 94, 940–949, 95, 950–959, 96, 960–969, 97, 970–979, 98, 980–989, 99, 990–999
app/api/admin/bills
   route.ts0%0%0%0%1, 1–9
app/api/admin/bills/[id]
   route.ts0%0%0%0%1, 1, 10–19, 2, 20–29, 3, 30–39, 4, 40, 5–9
app/api/admin/export
   route.ts0%0%0%0%1, 1–9
app/api/admin/login
   route.ts0%0%0%0%1, 1, 10–19, 2, 20–29, 3, 30–39, 4–9
app/api/admin/logout
   route.ts0%0%0%0%1, 1, 10–19, 2–9
app/api/bills/[id]
   route.ts100%100%100%100%
app/api/receipt/scan
   route.ts0%0%0%0%1, 1, 10, 100–109, 11, 110–119, 12, 120–129, 13, 130–139, 14, 140–149, 15, 150–159, 16, 160–169, 17, 170–179, 18, 180–189, 19, 190–199, 2, 20, 200–209, 21, 210–219, 22, 220, 23–29, 3, 30–39, 4, 40–49, 5, 50–59, 6, 60–69, 7, 70–79, 8, 80–89, 9, 90–99
app/og-image
   page.tsx0%0%0%0%1, 1, 10–19, 2, 20–29, 3, 30–39, 4, 40–49, 5, 50–59, 6, 60–69, 7, 70–79, 8, 80–89, 9, 90–93
cloudflare/src
   bill-store.ts0%0%0%0%1, 1, 10, 100–109, 11, 110–119, 12, 120–129, 13, 130–139, 14, 140–149, 15, 150–159, 16, 160–169, 17, 170–179, 18, 180–189, 19, 190–199, 2, 20, 200–209, 21, 210–219, 22, 220–229, 23, 230–236, 24–29, 3, 30–39, 4, 40–49, 5, 50–59, 6, 60–69, 7, 70–79, 8, 80–89, 9, 90–99
   worker.ts0%0%0%0%1, 1, 10, 100–109, 11, 110–119, 12, 120–129, 13, 130–139, 14, 140–149, 15, 150–159, 16, 160–169, 17, 170–179, 18, 180–189, 19, 190–199, 2, 20, 200–209, 21, 210–219, 22, 220–229, 23, 230–239, 24, 240–249, 25, 250–259, 26, 260–269, 27, 270–279, 28, 280–289, 29, 290–299, 3, 30, 300–309, 31, 310–319, 32, 320–329, 33, 330–339, 34, 340–349, 35, 350–359, 36, 360–369, 37, 370–379, 38, 380–389, 39, 390–399, 4, 40, 400–409, 41, 410–419, 42, 420–429,

1 similar comment
@github-actions
Copy link
Copy Markdown

Coverage after merging feat/shared-bill-state-model into main will be

21.81%

Coverage Report
FileStmtsBranchesFuncsLinesUncovered Lines
app
   layout.tsx0%0%0%0%1, 1, 10–19, 2, 20–29, 3, 30–39, 4, 40–49, 5, 50–59, 6, 60–69, 7, 70–79, 8, 80–87, 9
   page.tsx0%0%0%0%1, 1, 10–12, 2–9
app/admin
   layout.tsx0%0%0%0%1, 1, 10–16, 2–9
   page.tsx0%0%0%0%1, 1, 10, 100, 1000–1009, 101, 1010–1019, 102, 1020–1029, 103, 1030–1039, 104, 1040–1049, 105, 1050–1059, 106, 1060–1069, 107, 1070–1079, 108, 1080–1089, 109, 1090–1099, 11, 110, 1100–1109, 111, 1110–1119, 112, 1120–1124, 113–119, 12, 120–129, 13, 130–139, 14, 140–149, 15, 150–159, 16, 160–169, 17, 170–179, 18, 180–189, 19, 190–199, 2, 20, 200–209, 21, 210–219, 22, 220–229, 23, 230–239, 24, 240–249, 25, 250–259, 26, 260–269, 27, 270–279, 28, 280–289, 29, 290–299, 3, 30, 300–309, 31, 310–319, 32, 320–329, 33, 330–339, 34, 340–349, 35, 350–359, 36, 360–369, 37, 370–379, 38, 380–389, 39, 390–399, 4, 40, 400–409, 41, 410–419, 42, 420–429, 43, 430–439, 44, 440–449, 45, 450–459, 46, 460–469, 47, 470–479, 48, 480–489, 49, 490–499, 5, 50, 500–509, 51, 510–519, 52, 520–529, 53, 530–539, 54, 540–549, 55, 550–559, 56, 560–569, 57, 570–579, 58, 580–589, 59, 590–599, 6, 60, 600–609, 61, 610–619, 62, 620–629, 63, 630–639, 64, 640–649, 65, 650–659, 66, 660–669, 67, 670–679, 68, 680–689, 69, 690–699, 7, 70, 700–709, 71, 710–719, 72, 720–729, 73, 730–739, 74, 740–749, 75, 750–759, 76, 760–769, 77, 770–779, 78, 780–789, 79, 790–799, 8, 80, 800–809, 81, 810–819, 82, 820–829, 83, 830–839, 84, 840–849, 85, 850–859, 86, 860–869, 87, 870–879, 88, 880–889, 89, 890–899, 9, 90, 900–909, 91, 910–919, 92, 920–929, 93, 930–939, 94, 940–949, 95, 950–959, 96, 960–969, 97, 970–979, 98, 980–989, 99, 990–999
app/api/admin/bills
   route.ts0%0%0%0%1, 1–9
app/api/admin/bills/[id]
   route.ts0%0%0%0%1, 1, 10–19, 2, 20–29, 3, 30–39, 4, 40, 5–9
app/api/admin/export
   route.ts0%0%0%0%1, 1–9
app/api/admin/login
   route.ts0%0%0%0%1, 1, 10–19, 2, 20–29, 3, 30–39, 4–9
app/api/admin/logout
   route.ts0%0%0%0%1, 1, 10–19, 2–9
app/api/bills/[id]
   route.ts100%100%100%100%
app/api/receipt/scan
   route.ts0%0%0%0%1, 1, 10, 100–109, 11, 110–119, 12, 120–129, 13, 130–139, 14, 140–149, 15, 150–159, 16, 160–169, 17, 170–179, 18, 180–189, 19, 190–199, 2, 20, 200–209, 21, 210–219, 22, 220, 23–29, 3, 30–39, 4, 40–49, 5, 50–59, 6, 60–69, 7, 70–79, 8, 80–89, 9, 90–99
app/og-image
   page.tsx0%0%0%0%1, 1, 10–19, 2, 20–29, 3, 30–39, 4, 40–49, 5, 50–59, 6, 60–69, 7, 70–79, 8, 80–89, 9, 90–93
cloudflare/src
   bill-store.ts0%0%0%0%1, 1, 10, 100–109, 11, 110–119, 12, 120–129, 13, 130–139, 14, 140–149, 15, 150–159, 16, 160–169, 17, 170–179, 18, 180–189, 19, 190–199, 2, 20, 200–209, 21, 210–219, 22, 220–229, 23, 230–236, 24–29, 3, 30–39, 4, 40–49, 5, 50–59, 6, 60–69, 7, 70–79, 8, 80–89, 9, 90–99
   worker.ts0%0%0%0%1, 1, 10, 100–109, 11, 110–119, 12, 120–129, 13, 130–139, 14, 140–149, 15, 150–159, 16, 160–169, 17, 170–179, 18, 180–189, 19, 190–199, 2, 20, 200–209, 21, 210–219, 22, 220–229, 23, 230–239, 24, 240–249, 25, 250–259, 26, 260–269, 27, 270–279, 28, 280–289, 29, 290–299, 3, 30, 300–309, 31, 310–319, 32, 320–329, 33, 330–339, 34, 340–349, 35, 350–359, 36, 360–369, 37, 370–379, 38, 380–389, 39, 390–399, 4, 40, 400–409, 41, 410–419, 42, 420–429,

@github-actions
Copy link
Copy Markdown

Coverage after merging feat/shared-bill-state-model into main will be

22.09%

Coverage Report
FileStmtsBranchesFuncsLinesUncovered Lines
app
   layout.tsx0%0%0%0%1, 1, 10–19, 2, 20–29, 3, 30–39, 4, 40–49, 5, 50–59, 6, 60–69, 7, 70–79, 8, 80–87, 9
   page.tsx0%0%0%0%1, 1, 10–19, 2, 20–29, 3, 30–39, 4, 40–49, 5, 50–51, 6–9
app/admin
   layout.tsx0%0%0%0%1, 1, 10–16, 2–9
   page.tsx0%0%0%0%1, 1, 10, 100, 1000–1009, 101, 1010–1019, 102, 1020–1029, 103, 1030–1039, 104, 1040–1049, 105, 1050–1059, 106, 1060–1069, 107, 1070–1079, 108, 1080–1089, 109, 1090–1099, 11, 110, 1100–1109, 111, 1110–1119, 112, 1120–1124, 113–119, 12, 120–129, 13, 130–139, 14, 140–149, 15, 150–159, 16, 160–169, 17, 170–179, 18, 180–189, 19, 190–199, 2, 20, 200–209, 21, 210–219, 22, 220–229, 23, 230–239, 24, 240–249, 25, 250–259, 26, 260–269, 27, 270–279, 28, 280–289, 29, 290–299, 3, 30, 300–309, 31, 310–319, 32, 320–329, 33, 330–339, 34, 340–349, 35, 350–359, 36, 360–369, 37, 370–379, 38, 380–389, 39, 390–399, 4, 40, 400–409, 41, 410–419, 42, 420–429, 43, 430–439, 44, 440–449, 45, 450–459, 46, 460–469, 47, 470–479, 48, 480–489, 49, 490–499, 5, 50, 500–509, 51, 510–519, 52, 520–529, 53, 530–539, 54, 540–549, 55, 550–559, 56, 560–569, 57, 570–579, 58, 580–589, 59, 590–599, 6, 60, 600–609, 61, 610–619, 62, 620–629, 63, 630–639, 64, 640–649, 65, 650–659, 66, 660–669, 67, 670–679, 68, 680–689, 69, 690–699, 7, 70, 700–709, 71, 710–719, 72, 720–729, 73, 730–739, 74, 740–749, 75, 750–759, 76, 760–769, 77, 770–779, 78, 780–789, 79, 790–799, 8, 80, 800–809, 81, 810–819, 82, 820–829, 83, 830–839, 84, 840–849, 85, 850–859, 86, 860–869, 87, 870–879, 88, 880–889, 89, 890–899, 9, 90, 900–909, 91, 910–919, 92, 920–929, 93, 930–939, 94, 940–949, 95, 950–959, 96, 960–969, 97, 970–979, 98, 980–989, 99, 990–999
app/api/admin/bills
   route.ts0%0%0%0%1, 1–9
app/api/admin/bills/[id]
   route.ts0%0%0%0%1, 1, 10–19, 2, 20–29, 3, 30–39, 4, 40, 5–9
app/api/admin/export
   route.ts0%0%0%0%1, 1–9
app/api/admin/login
   route.ts0%0%0%0%1, 1, 10–19, 2, 20–29, 3, 30–39, 4–9
app/api/admin/logout
   route.ts0%0%0%0%1, 1, 10–19, 2–9
app/api/bills/[id]
   route.ts100%100%100%100%
app/api/receipt/scan
   route.ts0%0%0%0%1, 1, 10, 100–109, 11, 110–119, 12, 120–129, 13, 130–139, 14, 140–149, 15, 150–159, 16, 160–169, 17, 170–179, 18, 180–189, 19, 190–199, 2, 20, 200–209, 21, 210–219, 22, 220, 23–29, 3, 30–39, 4, 40–49, 5, 50–59, 6, 60–69, 7, 70–79, 8, 80–89, 9, 90–99
app/b/[billId]
   page.tsx0%0%0%0%1, 1, 10, 2–9
app/og-image
   page.tsx0%0%0%0%1, 1, 10–19, 2, 20–29, 3, 30–39, 4, 40–49, 5, 50–59, 6, 60–69, 7, 70–79, 8, 80–89, 9, 90–93
cloudflare/src
   bill-store.ts0%0%0%0%1, 1, 10, 100–109, 11, 110–119, 12, 120–129, 13, 130–139, 14, 140–149, 15, 150–159, 16, 160–169, 17, 170–179, 18, 180–189, 19, 190–199, 2, 20, 200–209, 21, 210–219, 22, 220–229, 23, 230–236, 24–29, 3, 30–39, 4, 40–49, 5, 50–59, 6, 60–69, 7, 70–79, 8, 80–89, 9, 90–99
   worker.ts0%0%0%0%1, 1, 10, 100–109, 11, 110–119, 12, 120–129, 13, 130–139, 14, 140–149, 15, 150–159, 16, 160–169, 17, 170–179, 18, 180–189, 19, 190–199, 2, 20, 200–209, 21, 210–219, 22, 220–229, 23, 230–239, 24, 240–249, 25, 250–259, 26, 260–269, 27, 270–279, 28, 280–289, 29, 290–299, 3, 30, 300–309, 31, 310–319, 32, 320–329, 33, 330–339, 34, 340–349, 35, 350–359, 36, 360–369,

1 similar comment
@github-actions
Copy link
Copy Markdown

Coverage after merging feat/shared-bill-state-model into main will be

22.09%

Coverage Report
FileStmtsBranchesFuncsLinesUncovered Lines
app
   layout.tsx0%0%0%0%1, 1, 10–19, 2, 20–29, 3, 30–39, 4, 40–49, 5, 50–59, 6, 60–69, 7, 70–79, 8, 80–87, 9
   page.tsx0%0%0%0%1, 1, 10–19, 2, 20–29, 3, 30–39, 4, 40–49, 5, 50–51, 6–9
app/admin
   layout.tsx0%0%0%0%1, 1, 10–16, 2–9
   page.tsx0%0%0%0%1, 1, 10, 100, 1000–1009, 101, 1010–1019, 102, 1020–1029, 103, 1030–1039, 104, 1040–1049, 105, 1050–1059, 106, 1060–1069, 107, 1070–1079, 108, 1080–1089, 109, 1090–1099, 11, 110, 1100–1109, 111, 1110–1119, 112, 1120–1124, 113–119, 12, 120–129, 13, 130–139, 14, 140–149, 15, 150–159, 16, 160–169, 17, 170–179, 18, 180–189, 19, 190–199, 2, 20, 200–209, 21, 210–219, 22, 220–229, 23, 230–239, 24, 240–249, 25, 250–259, 26, 260–269, 27, 270–279, 28, 280–289, 29, 290–299, 3, 30, 300–309, 31, 310–319, 32, 320–329, 33, 330–339, 34, 340–349, 35, 350–359, 36, 360–369, 37, 370–379, 38, 380–389, 39, 390–399, 4, 40, 400–409, 41, 410–419, 42, 420–429, 43, 430–439, 44, 440–449, 45, 450–459, 46, 460–469, 47, 470–479, 48, 480–489, 49, 490–499, 5, 50, 500–509, 51, 510–519, 52, 520–529, 53, 530–539, 54, 540–549, 55, 550–559, 56, 560–569, 57, 570–579, 58, 580–589, 59, 590–599, 6, 60, 600–609, 61, 610–619, 62, 620–629, 63, 630–639, 64, 640–649, 65, 650–659, 66, 660–669, 67, 670–679, 68, 680–689, 69, 690–699, 7, 70, 700–709, 71, 710–719, 72, 720–729, 73, 730–739, 74, 740–749, 75, 750–759, 76, 760–769, 77, 770–779, 78, 780–789, 79, 790–799, 8, 80, 800–809, 81, 810–819, 82, 820–829, 83, 830–839, 84, 840–849, 85, 850–859, 86, 860–869, 87, 870–879, 88, 880–889, 89, 890–899, 9, 90, 900–909, 91, 910–919, 92, 920–929, 93, 930–939, 94, 940–949, 95, 950–959, 96, 960–969, 97, 970–979, 98, 980–989, 99, 990–999
app/api/admin/bills
   route.ts0%0%0%0%1, 1–9
app/api/admin/bills/[id]
   route.ts0%0%0%0%1, 1, 10–19, 2, 20–29, 3, 30–39, 4, 40, 5–9
app/api/admin/export
   route.ts0%0%0%0%1, 1–9
app/api/admin/login
   route.ts0%0%0%0%1, 1, 10–19, 2, 20–29, 3, 30–39, 4–9
app/api/admin/logout
   route.ts0%0%0%0%1, 1, 10–19, 2–9
app/api/bills/[id]
   route.ts100%100%100%100%
app/api/receipt/scan
   route.ts0%0%0%0%1, 1, 10, 100–109, 11, 110–119, 12, 120–129, 13, 130–139, 14, 140–149, 15, 150–159, 16, 160–169, 17, 170–179, 18, 180–189, 19, 190–199, 2, 20, 200–209, 21, 210–219, 22, 220, 23–29, 3, 30–39, 4, 40–49, 5, 50–59, 6, 60–69, 7, 70–79, 8, 80–89, 9, 90–99
app/b/[billId]
   page.tsx0%0%0%0%1, 1, 10, 2–9
app/og-image
   page.tsx0%0%0%0%1, 1, 10–19, 2, 20–29, 3, 30–39, 4, 40–49, 5, 50–59, 6, 60–69, 7, 70–79, 8, 80–89, 9, 90–93
cloudflare/src
   bill-store.ts0%0%0%0%1, 1, 10, 100–109, 11, 110–119, 12, 120–129, 13, 130–139, 14, 140–149, 15, 150–159, 16, 160–169, 17, 170–179, 18, 180–189, 19, 190–199, 2, 20, 200–209, 21, 210–219, 22, 220–229, 23, 230–236, 24–29, 3, 30–39, 4, 40–49, 5, 50–59, 6, 60–69, 7, 70–79, 8, 80–89, 9, 90–99
   worker.ts0%0%0%0%1, 1, 10, 100–109, 11, 110–119, 12, 120–129, 13, 130–139, 14, 140–149, 15, 150–159, 16, 160–169, 17, 170–179, 18, 180–189, 19, 190–199, 2, 20, 200–209, 21, 210–219, 22, 220–229, 23, 230–239, 24, 240–249, 25, 250–259, 26, 260–269, 27, 270–279, 28, 280–289, 29, 290–299, 3, 30, 300–309, 31, 310–319, 32, 320–329, 33, 330–339, 34, 340–349, 35, 350–359, 36, 360–369,

@Aarekaz Aarekaz merged commit afabbdc into main May 29, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant