尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗B2B marketplace for medical supplies and equipment. Next.js 16 App Router frontend using vertical modules with light layers, React 19, Redux Toolkit / RTK Query, and TypeScript.
# 1. Install dependencies
pnpm install
# 2. Set up environment
cp .env.example .env.local
# 3. Start the backend (separate repository)
# See suminia-backend README — it must be running on port 8001
# 4. Start development server
pnpm dev
The app runs at http://localhost:3000 and talks to the API at http://localhost:8001.
Suminia is a B2B marketplace connecting suppliers (manufacturers, importers) with buyers (clinics, hospitals, distributors) of medicines and medical supplies in Colombia.
This repository is the web frontend. It is organized in vertical business modules that
mirror the backend's NestJS modules — auth, catalog, orders mean the same thing on
both sides of the stack. Boundaries between layers are enforced by ESLint, not convention.
The project started from a commercial e-commerce template (Voxo). That template is
quarantined under src/_template/ and is deleted screen by screen as real ones replace
it. See ARCHITECTURE.md for the retirement plan.
eslint-config-next├── src/
│ ├── app/ # Next.js App Router — routes only, no business logic
│ │ ├── layout.js # Root layout + global metadata
│ │ ├── providers.tsx # Server/client boundary: Redux + session bootstrap
│ │ ├── api/ # Template mock backend (21 handlers, to be deleted)
│ │ └── (main)/
│ │ ├── (suminia)/ # Real product routes
│ │ └── (template)/ # Voxo demo routes, deleted piece by piece
│ ├── modules/ # Business modules (auth, catalog, suppliers, orders…)
│ │ └── auth/ # api/ model/ lib/ hooks/ ui/ index.ts
│ ├── shared/ # Cross-cutting, no business logic
│ │ ├── api/ # baseApi — the single HTTP client
│ │ ├── lib/ # tokenStorage, validators, apiError
│ │ ├── ui/ # Reusable components
│ │ ├── config/ # Environment variables
│ │ └── i18n/ # i18next configuration and locales
│ ├── store/ # configureStore + typed hooks
│ └── _template/ # Voxo template in quarantine (delete-only)
├── public/ # Static assets and Sass sources
├── ARCHITECTURE.md # Structural source of truth
├── CLAUDE.md # Conventions and commands
├── Dockerfile # Multi-stage production image
└── ecosystem.config.js # PM2 process definition
The dependency rule, enforced by ESLint:
app → modules → shared
Before you begin, ensure you have the following installed:
npm install -g pnpm)Clone the repository
git clone [email protected]:Suminia-Tech/suminia-frontend.git
cd suminia-frontend
Install dependencies
pnpm install
Set up environment
cp .env.example .env.local
Edit .env.local and point NEXT_PUBLIC_API_URL at your backend.
Start the development server
pnpm dev
Environment variables live in .env.local (git-ignored). See .env.example.
# Backend API
# Any variable consumed by the browser must be prefixed NEXT_PUBLIC_.
NEXT_PUBLIC_API_URL=http://localhost:8001
Environment variables are read in a single place — src/shared/config/env.ts. Do not read
process.env anywhere else.
# Development (hot reload)
pnpm dev
# Production build
pnpm build
# Serve the production build
pnpm start
# Lint, including the architecture boundary rules
pnpm lint
# Type check (no emit)
npx tsc --noEmit
# Build the application
pnpm build
Before considering anything finished:
npx tsc --noEmit && pnpm lint && pnpm build
A boundary violation fails pnpm lint exactly like a syntax error would. There are no
tests in the project yet — types are the safety net during refactors.
For structure, module anatomy, and data flow, see:
Every business module follows the same internal layout:
modules/<name>/
├── api/ RTK Query endpoints, via baseApi.injectEndpoints
├── model/ Domain types + state slice
├── lib/ Pure functions (validation, formatting, calculations)
├── hooks/ React hooks owned by the module
├── ui/ Screens (…Screen.tsx) and pieces (ProductCard.tsx)
└── index.ts Public API ← the only thing importable from outside
| Command | Description |
|---|---|
pnpm dev | Start development server |
pnpm build | Production build (Turbopack) |
pnpm start | Serve the production build |
pnpm lint | Lint, including boundary rules |
npx tsc --noEmit | Type check |
Product routes live in the (suminia) route group. Names in parentheses are Next route
groups — they never appear in the URL.
| Route | Description |
|---|---|
/ | Home |
/register | Company registration (buyer or supplier) |
/forgot-password | Request a password reset link |
/reset-password | Set a new password (arrives with ?token=) |
/verify-email | Verify email address (arrives with ?token=) |
Login has no route of its own: it is a modal available from anywhere in the app.
Routes under /shop/…, /blog/…, /product/…, /voxo_plus/… and /page/… are template
demos and will be removed.
Created by the backend seeder (make db-seed in suminia-backend). Their organizations
are already approved, so they can be used for end-to-end flows.
| Password | Role | |
|---|---|---|
[email protected] | SupAdm!n2026 | supplier_admin |
[email protected] | SupOper!2026 | supplier_operator |
[email protected] | BuyAdm!n2026 | buyer_admin |
[email protected] | BuyOper!2026 | buyer_operator |
[email protected] | S3crEtP4ssw0rd! | superuser |
[email protected] | S3crEtP4ssw0rd! | admin |
The header shows which account is active — "Mi cuenta (Administrador · Proveedor)" versus "(Operador · Proveedor)" — which matters when testing several accounts in parallel.
The build produces a Next standalone output (output: "standalone" in
next.config.mjs), which ships only the dependencies the server actually needs.
Docker — multi-stage build, runs as a non-root user, with a healthcheck:
docker build -t suminia-frontend .
docker run -p 3000:3000 -e NEXT_PUBLIC_API_URL=https://api.example.com suminia-frontend
PM2 — ecosystem.config.js defines the suminia-frontend process on port 3000.
CI/CD lives in .github/workflows/deploy.yaml.
NEXT_PUBLIC_*variables are inlined at build time, not read at runtime. Changing the API URL requires rebuilding the image.
Private and proprietary. This repository additionally contains a commercial template
(Voxo) under src/_template/, licensed to Suminia and not redistributable.