Skip to content

mozaddedalfeshani/cvd_web

Repository files navigation

πŸ“± CVD Risk Assessment Frontend

🎯 Overview

Modern React/Next.js web application providing an intuitive interface for healthcare professionals to assess cardiovascular disease risk using AI-powered predictions.

✨ Features

πŸ₯ Clinical Interface

  • Professional healthcare-focused design
  • Comprehensive patient assessment form
  • Real-time risk calculation and visualization
  • Example patient data for testing

🎨 Modern UI/UX

  • Responsive design for all devices
  • Shadcn/UI component library
  • Tailwind CSS for styling
  • Accessibility-compliant interface

πŸ”’ Production Ready

  • TypeScript for type safety
  • ESLint for code quality
  • Performance optimized
  • SEO optimized

πŸ“ Structure

frontend/
β”œβ”€β”€ src/
β”‚   β”œβ”€β”€ app/                    # Next.js app directory
β”‚   β”‚   β”œβ”€β”€ page.tsx           # Main assessment page
β”‚   β”‚   β”œβ”€β”€ layout.tsx         # Root layout
β”‚   β”‚   └── globals.css        # Global styles
β”‚   β”œβ”€β”€ components/
β”‚   β”‚   β”œβ”€β”€ CVDAssessmentForm.tsx  # Main form component
β”‚   β”‚   β”œβ”€β”€ PredictionResult.tsx   # Results display
β”‚   β”‚   └── ui/                # Reusable UI components
β”‚   β”‚       β”œβ”€β”€ button.tsx
β”‚   β”‚       β”œβ”€β”€ card.tsx
β”‚   β”‚       β”œβ”€β”€ form.tsx
β”‚   β”‚       β”œβ”€β”€ input.tsx
β”‚   β”‚       └── select.tsx
β”‚   └── lib/
β”‚       └── utils.ts           # Utility functions
β”œβ”€β”€ public/                    # Static assets
β”œβ”€β”€ package.json              # Dependencies
β”œβ”€β”€ next.config.ts            # Next.js configuration
β”œβ”€β”€ tailwind.config.ts        # Tailwind configuration
β”œβ”€β”€ tsconfig.json             # TypeScript configuration
└── README.md                 # This file

πŸš€ Quick Start

Prerequisites

  • Node.js 20.9+
  • pnpm 10.x

Installation

cd frontend
pnpm install

Development Server

pnpm dev

Visit http://localhost:3000 to view the application.

Production Build

pnpm build
pnpm start

🎯 Component Overview

CVDAssessmentForm

Main form component handling patient data input and validation.

Features:

  • Comprehensive medical form with validation
  • Auto-calculation of derived metrics (BMI, ratios)
  • Example data loading for testing
  • Real-time field validation
  • Professional medical interface

Key Sections:

  • Demographics (age, sex, height, weight)
  • Vital Signs (blood pressure, heart rate)
  • Laboratory Values (cholesterol, glucose)
  • Risk Factors (smoking, diabetes, family history)
  • Additional Measurements (waist circumference)

PredictionResult

Results display component showing risk assessment.

Features:

  • Risk level visualization (Low/Intermediate/High)
  • Confidence scores and probabilities
  • Clinical recommendations
  • Model accuracy information
  • Printable results format

πŸ”§ Configuration

API Configuration

Update API endpoints in components:

// CVDAssessmentForm.tsx
const API_BASE_URL =
  process.env.NEXT_PUBLIC_API_BASE_URL || "https://cvdapi.imurad.me";

const response = await fetch(`${API_BASE_URL}/api/predict`, {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
  },
  body: JSON.stringify(patientData),
});

Environment Variables

Create .env.local:

NEXT_PUBLIC_API_BASE_URL=https://cvdapi.imurad.me
NEXT_PUBLIC_APP_NAME="CVD Risk Assessment"
NEXT_PUBLIC_MODEL_VERSION="1.0"

🎨 UI Components

Form Components

Built with Shadcn/UI for professional appearance:

import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import { Select } from "@/components/ui/select";
import { Card } from "@/components/ui/card";

Styling

Tailwind CSS classes for responsive design:

<div className="min-h-screen bg-gradient-to-br from-blue-50 to-indigo-100 p-4">
  <div className="max-w-4xl mx-auto">
    <Card className="shadow-lg">{/* Content */}</Card>
  </div>
</div>

πŸ“± Responsive Design

Breakpoints

  • Mobile: < 768px
  • Tablet: 768px - 1024px
  • Desktop: > 1024px

Grid Layout

<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
  {/* Form fields */}
</div>

πŸ”’ Form Validation

Client-Side Validation

const validateAge = (age: number) => {
  if (age < 18 || age > 100) {
    return "Age must be between 18 and 100";
  }
  return null;
};

const validateBP = (systolic: number, diastolic: number) => {
  if (systolic <= diastolic) {
    return "Systolic must be greater than diastolic";
  }
  return null;
};

Required Fields

All clinical fields are marked as required:

<Input
  type="number"
  required
  min="18"
  max="100"
  value={formData.Age}
  onChange={(e) => handleInputChange("Age", e.target.value)}
/>

πŸ§ͺ Testing

Unit Tests

Not configured in this repo yet.

E2E Tests

Not configured in this repo yet.

Component Tests

// __tests__/CVDAssessmentForm.test.tsx
import { render, screen } from "@testing-library/react";
import CVDAssessmentForm from "@/components/CVDAssessmentForm";

test("renders assessment form", () => {
  render(<CVDAssessmentForm onSubmit={jest.fn()} />);
  expect(screen.getByText("Patient Assessment Form")).toBeInTheDocument();
});

πŸ“Š Performance Optimization

Code Splitting

// Lazy load heavy components
const PredictionResult = dynamic(() => import("./PredictionResult"), {
  loading: () => <div>Loading...</div>,
});

Image Optimization

import Image from "next/image";

<Image
  src="/medical-icon.svg"
  alt="Medical Icon"
  width={64}
  height={64}
  priority
/>;

🌐 Deployment

Vercel (Recommended)

pnpm add -g vercel
vercel

Docker

FROM node:20-alpine

WORKDIR /app
RUN corepack enable
COPY package.json pnpm-lock.yaml ./
RUN pnpm install --frozen-lockfile --prod

COPY . .
RUN pnpm build

EXPOSE 3000
CMD ["pnpm", "start"]

Environment Setup

# Production environment variables
NEXT_PUBLIC_API_BASE_URL=https://cvdapi.imurad.me
NEXT_PUBLIC_GA_ID=G-XXXXXXXXXX
NODE_ENV=production

🎯 Clinical Usage

User Workflow

  1. Patient Input: Enter comprehensive medical data
  2. Validation: Real-time field validation and checks
  3. Prediction: Submit for AI risk assessment
  4. Results: View risk level and recommendations
  5. Action: Use results for clinical decision making

Risk Categories

  • 🟒 LOW RISK: Routine monitoring recommended
  • 🟑 INTERMEDIATE: Enhanced screening suggested
  • πŸ”΄ HIGH RISK: Immediate clinical intervention

Example Data

Quick testing with realistic patient scenarios:

  • Low risk: Young, healthy patient profile
  • High risk: Multiple risk factors present

πŸ“‹ Dependencies

Core Framework

{
  "next": "^14.0.0",
  "react": "^18.0.0",
  "react-dom": "^18.0.0",
  "typescript": "^5.0.0"
}

UI Components

{
  "@radix-ui/react-select": "^2.0.0",
  "tailwindcss": "^3.3.0",
  "class-variance-authority": "^0.7.0",
  "clsx": "^2.0.0",
  "tailwind-merge": "^2.0.0"
}

Development Tools

{
  "eslint": "^8.0.0",
  "eslint-config-next": "^14.0.0",
  "@types/react": "^18.0.0",
  "@types/node": "^20.0.0"
}

πŸ” Accessibility

WCAG Compliance

  • Semantic HTML structure
  • Proper ARIA labels
  • Keyboard navigation support
  • Screen reader compatibility
  • Color contrast compliance

Implementation

<Label htmlFor="age" className="sr-only">
  Patient Age
</Label>
<Input
  id="age"
  aria-describedby="age-help"
  aria-required="true"
  type="number"
/>

🎯 Professional healthcare interface for clinical CVD risk assessment!

cvd_web

About

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors