Manage group orders for Aikatsu products, including payments, taxes, and pricing
AI summary · README
CommerceTypeScript · PLpgSQLGitHub @kaylalishhaOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
Admin dashboard for a Group Order (GO) business purchasing Aikatsu products
from Mercari Japan, per the product's PRD. Covers order recap (Box → Batch →
Item → Customer), batch payment management, tax bill management (Tagihan
Pajak EMS), and Price Estimator configuration.
• React 19 + TypeScript, built with Vite
• React Router (hash routing)
• Zustand (+ persist) for state — currently the only data layer
• Tailwind CSS v4Read the full README ↗Admin dashboard for a Group Order (GO) business purchasing Aikatsu products from Mercari Japan, per the product's PRD. Covers order recap (Box → Batch → Item → Customer), batch payment management, tax bill management (Tagihan Pajak EMS), and Price Estimator configuration.
persist) for state — currently the only data layernpm install
npm run dev
The app runs entirely on the Zustand store in src/store/useStore.ts,
persisted to localStorage. There is no backend yet — item photos and
bukti transfer uploads are stored as base64 data URLs in the browser. This
is fine for demoing the workflows, but doesn't scale past a single device
or survive a cleared browser.
supabase/migrations/0001_init.sql has a Postgres schema mirroring
src/types.ts (batches, items, batch_bills, tax_bills, estimator_config,
notifications), with Row Level Security policies so customers only ever
see their own rows and Admin GO has full access. src/lib/supabaseClient.ts
is a client stub — nothing in the app calls it yet.
To connect a real project:
supabase db push or paste it into the SQL editor).batch-photos and bukti-transfer storage buckets (see the
comment at the bottom of the migration file) and add matching storage
policies..env.example to .env and fill in your project URL/anon key.useStore.ts actions to call Supabase instead of
mutating local state — not done yet, since it touches every page.The two dashboards use two separate, unrelated sign-in methods — there is no shared login screen and no SSO between them.
Admin GO signs in with a normal website account: Supabase Auth's built-in
email/password provider. This is an internal tool, not a public signup —
admin accounts are provisioned out-of-band (Supabase dashboard invite, or
a seed script) with role = 'admin' and no line_user_id. No public
"sign up as admin" flow exists or should exist.
Customers sign in with LINE Login and nothing else — no email/
password option on that dashboard. LINE Login (v2.1) is OpenID Connect–
compliant — it issues a signed id_token carrying the user's stable LINE
id (sub), display name, and profile picture. Supabase Auth accepts that
directly via supabase.auth.signInWithIdToken() once LINE is registered
as a custom OIDC provider on the project (LINE Developers Console → a
"LINE Login" channel, Callback URL pointed at the Supabase Auth callback,
Channel ID/Secret entered into Supabase's Auth provider settings).
profiles.line_user_id stores the sub claim and is how a returning
customer is matched back to their row; full_name / avatar_url are
seeded from the LINE profile on first login and editable after.role = 'customer' and always has
line_user_id set — the schema's line_user_id_iff_customer check
constraint enforces that a row is either a LINE customer or an admin
website account, never both.