first commit

This commit is contained in:
saqib mir
2026-08-20 16:08:29 +05:30
commit f4c71d6ef3
62 changed files with 8489 additions and 0 deletions
View File
View File
+24
View File
@@ -0,0 +1,24 @@
# ==========================================
# SupportHub Web Development Configuration (.env.development)
# ==========================================
NEXT_PUBLIC_APP_NAME="SupportHub Web (Dev)"
NEXT_PUBLIC_APP_ENV="development"
NEXT_PUBLIC_APP_URL="https://support-dev.maskantech.in"
NEXT_PUBLIC_API_URL="https://supportdev-api.maskantech.in/api/v1"
NEXT_PUBLIC_WS_URL="wss://supportdev-api.maskantech.in/ws"
NEXT_PUBLIC_SAAS_PLATFORM_NAME="SaaS Parent Platform (Dev)"
NEXT_PUBLIC_SAAS_AUTH_HEADER="X-SaaS-User-Token"
NEXT_PUBLIC_SAAS_EMBED_MODE="false"
NEXT_PUBLIC_FEATURE_AI_ASSISTANT="true"
NEXT_PUBLIC_FEATURE_KNOWLEDGE_FIRST_TRIAGE="true"
NEXT_PUBLIC_FEATURE_LIVE_CHAT="true"
NEXT_PUBLIC_FEATURE_SLA_MONITORING="true"
NEXT_PUBLIC_KB_DEFAULT_PRODUCT_ID="prod_default"
NEXT_PUBLIC_AGENT_AUTO_SUGGEST_KB="true"
NEXT_PUBLIC_LOG_LEVEL="debug"
+30
View File
@@ -0,0 +1,30 @@
# ==========================================
# SupportHub Web Environment Configuration (.env.example)
# ==========================================
# Application Settings
NEXT_PUBLIC_APP_NAME="SupportHub Web"
NEXT_PUBLIC_APP_ENV="development"
NEXT_PUBLIC_APP_URL="http://localhost:3000"
# SupportHub Backend API Integration (supporthub-api)
NEXT_PUBLIC_API_URL="http://localhost:4501/api/v1"
NEXT_PUBLIC_WS_URL="ws://localhost:4501/ws"
# SaaS Parent Platform Integration
NEXT_PUBLIC_SAAS_PLATFORM_NAME="SaaS Parent Platform"
NEXT_PUBLIC_SAAS_AUTH_HEADER="X-SaaS-User-Token"
NEXT_PUBLIC_SAAS_EMBED_MODE="false"
# Feature Flags
NEXT_PUBLIC_FEATURE_AI_ASSISTANT="true"
NEXT_PUBLIC_FEATURE_KNOWLEDGE_FIRST_TRIAGE="true"
NEXT_PUBLIC_FEATURE_LIVE_CHAT="true"
NEXT_PUBLIC_FEATURE_SLA_MONITORING="true"
# Knowledge Base & Agent Triage Settings
NEXT_PUBLIC_KB_DEFAULT_PRODUCT_ID="prod_default"
NEXT_PUBLIC_AGENT_AUTO_SUGGEST_KB="true"
# Logging & Analytics
NEXT_PUBLIC_LOG_LEVEL="debug"
+24
View File
@@ -0,0 +1,24 @@
# ==========================================
# SupportHub Web Production Configuration (.env.production)
# ==========================================
NEXT_PUBLIC_APP_NAME="SupportHub Web"
NEXT_PUBLIC_APP_ENV="production"
NEXT_PUBLIC_APP_URL="https://support.your-domain.com"
NEXT_PUBLIC_API_URL="https://api.support.your-domain.com/api/v1"
NEXT_PUBLIC_WS_URL="wss://api.support.your-domain.com/ws"
NEXT_PUBLIC_SAAS_PLATFORM_NAME="SaaS Parent Platform"
NEXT_PUBLIC_SAAS_AUTH_HEADER="X-SaaS-User-Token"
NEXT_PUBLIC_SAAS_EMBED_MODE="true"
NEXT_PUBLIC_FEATURE_AI_ASSISTANT="true"
NEXT_PUBLIC_FEATURE_KNOWLEDGE_FIRST_TRIAGE="true"
NEXT_PUBLIC_FEATURE_LIVE_CHAT="true"
NEXT_PUBLIC_FEATURE_SLA_MONITORING="true"
NEXT_PUBLIC_KB_DEFAULT_PRODUCT_ID="prod_live"
NEXT_PUBLIC_AGENT_AUTO_SUGGEST_KB="true"
NEXT_PUBLIC_LOG_LEVEL="info"
+30
View File
@@ -0,0 +1,30 @@
# ==========================================
# SupportHub Web Environment Template (.env.template)
# ==========================================
# Application Settings
NEXT_PUBLIC_APP_NAME="SupportHub Web"
NEXT_PUBLIC_APP_ENV="development"
NEXT_PUBLIC_APP_URL="http://localhost:3000"
# SupportHub Backend API Integration (supporthub-api)
NEXT_PUBLIC_API_URL="http://localhost:4501/api/v1"
NEXT_PUBLIC_WS_URL="ws://localhost:4501/ws"
# SaaS Parent Platform Integration
NEXT_PUBLIC_SAAS_PLATFORM_NAME="SaaS Parent Platform"
NEXT_PUBLIC_SAAS_AUTH_HEADER="X-SaaS-User-Token"
NEXT_PUBLIC_SAAS_EMBED_MODE="false"
# Feature Flags
NEXT_PUBLIC_FEATURE_AI_ASSISTANT="true"
NEXT_PUBLIC_FEATURE_KNOWLEDGE_FIRST_TRIAGE="true"
NEXT_PUBLIC_FEATURE_LIVE_CHAT="true"
NEXT_PUBLIC_FEATURE_SLA_MONITORING="true"
# Knowledge Base & Agent Triage Settings
NEXT_PUBLIC_KB_DEFAULT_PRODUCT_ID="prod_default"
NEXT_PUBLIC_AGENT_AUTO_SUGGEST_KB="true"
# Logging & Analytics
NEXT_PUBLIC_LOG_LEVEL="debug"
+24
View File
@@ -0,0 +1,24 @@
# ==========================================
# SupportHub Web Test Configuration (.env.test)
# ==========================================
NEXT_PUBLIC_APP_NAME="SupportHub Web (Test)"
NEXT_PUBLIC_APP_ENV="test"
NEXT_PUBLIC_APP_URL="https://support-test.maskantech.in"
NEXT_PUBLIC_API_URL="https://supportdtest-api.maskantech.in/api/v1"
NEXT_PUBLIC_WS_URL="wss://supportdtest-api.maskantech.in/ws"
NEXT_PUBLIC_SAAS_PLATFORM_NAME="SaaS Parent Platform (Test)"
NEXT_PUBLIC_SAAS_AUTH_HEADER="X-SaaS-User-Token"
NEXT_PUBLIC_SAAS_EMBED_MODE="false"
NEXT_PUBLIC_FEATURE_AI_ASSISTANT="true"
NEXT_PUBLIC_FEATURE_KNOWLEDGE_FIRST_TRIAGE="true"
NEXT_PUBLIC_FEATURE_LIVE_CHAT="true"
NEXT_PUBLIC_FEATURE_SLA_MONITORING="true"
NEXT_PUBLIC_KB_DEFAULT_PRODUCT_ID="prod_test"
NEXT_PUBLIC_AGENT_AUTO_SUGGEST_KB="true"
NEXT_PUBLIC_LOG_LEVEL="error"
View File
+38
View File
@@ -0,0 +1,38 @@
# ==========================================
# SupportHub Web .gitignore
# ==========================================
# Dependencies
/node_modules
/.pnp
.pnp.js
# Next.js build output
/.next/
/out/
/build
/dist
# Debug & Logs
npm-debug.log*
yarn-debug.log*
yarn-error.log*
.pnpm-debug.log*
# Local Environment Overrides (keep .env.example, .env.development, .env.test, .env.production tracked)
.env*.local
.env.local
# Vercel
.vercel
# TypeScript & Next build cache
*.tsbuildinfo
next-env.d.ts
# Operating System & IDE Files
.DS_Store
Thumbs.db
*.pem
.idea/
.vscode/
View File
View File
View File
View File
View File
+6
View File
@@ -0,0 +1,6 @@
/** @type {import('next').NextConfig} */
const nextConfig = {
reactStrictMode: true,
};
export default nextConfig;
+7829
View File
File diff suppressed because it is too large Load Diff
+42
View File
@@ -0,0 +1,42 @@
{
"name": "supporthub-web",
"version": "0.1.0",
"private": true,
"scripts": {
"dev": "next dev -p 3000",
"build": "next build",
"build:dev": "npx dotenv-cli -o -e .env.development -- next build",
"build:test": "npx dotenv-cli -o -e .env.test -- next build",
"build:prod": "npx dotenv-cli -o -e .env.production -- next build",
"start": "next start -p 3000",
"lint": "next lint",
"typecheck": "tsc --noEmit",
"test": "vitest run",
"test:watch": "vitest",
"test:e2e": "playwright test"
},
"dependencies": {
"next": "^14.2.5",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"@tanstack/react-query": "^5.51.15",
"clsx": "^2.1.1",
"tailwind-merge": "^2.4.0",
"lucide-react": "^0.417.0",
"axios": "^1.7.2"
},
"devDependencies": {
"@types/node": "^20.14.12",
"@types/react": "^18.3.3",
"@types/react-dom": "^18.3.0",
"dotenv-cli": "^7.4.2",
"typescript": "^5.5.4",
"tailwindcss": "^3.4.7",
"postcss": "^8.4.40",
"autoprefixer": "^10.4.20",
"eslint": "^8.57.0",
"eslint-config-next": "^14.2.5",
"vitest": "^2.0.4",
"@playwright/test": "^1.45.3"
}
}
View File
View File
View File
View File
+10
View File
@@ -0,0 +1,10 @@
import React from 'react';
export default function AgentsAdminPage() {
return (
<div style={{ padding: '2rem', fontFamily: 'system-ui, sans-serif' }}>
<h1>Agents Admin</h1>
<p>Module loaded under SupportHub Web.</p>
</div>
);
}
@@ -0,0 +1,10 @@
import React from 'react';
export default function AssignmentEngineRulesPage() {
return (
<div style={{ padding: '2rem', fontFamily: 'system-ui, sans-serif' }}>
<h1>Assignment Engine Rules</h1>
<p>Module loaded under SupportHub Web.</p>
</div>
);
}
+10
View File
@@ -0,0 +1,10 @@
import React from 'react';
export default function AuditLogsPage() {
return (
<div style={{ padding: '2rem', fontFamily: 'system-ui, sans-serif' }}>
<h1>Audit Logs</h1>
<p>Module loaded under SupportHub Web.</p>
</div>
);
}
+10
View File
@@ -0,0 +1,10 @@
import React from 'react';
export default function AdminExecutiveDashboardPage() {
return (
<div style={{ padding: '2rem', fontFamily: 'system-ui, sans-serif' }}>
<h1>Admin Executive Dashboard</h1>
<p>Module loaded under SupportHub Web.</p>
</div>
);
}
@@ -0,0 +1,10 @@
import React from 'react';
export default function EscalationPolicyBuilderPage() {
return (
<div style={{ padding: '2rem', fontFamily: 'system-ui, sans-serif' }}>
<h1>Escalation Policy Builder</h1>
<p>Module loaded under SupportHub Web.</p>
</div>
);
}
+10
View File
@@ -0,0 +1,10 @@
import React from 'react';
export default function OrganizationalHierarchyPage() {
return (
<div style={{ padding: '2rem', fontFamily: 'system-ui, sans-serif' }}>
<h1>Organizational Hierarchy</h1>
<p>Module loaded under SupportHub Web.</p>
</div>
);
}
+10
View File
@@ -0,0 +1,10 @@
import React from 'react';
export default function KnowledgeGovernancePage() {
return (
<div style={{ padding: '2rem', fontFamily: 'system-ui, sans-serif' }}>
<h1>Knowledge Governance</h1>
<p>Module loaded under SupportHub Web.</p>
</div>
);
}
+10
View File
@@ -0,0 +1,10 @@
import React from 'react';
export default function ProductsCatalogAdminPage() {
return (
<div style={{ padding: '2rem', fontFamily: 'system-ui, sans-serif' }}>
<h1>Products Catalog Admin</h1>
<p>Module loaded under SupportHub Web.</p>
</div>
);
}
+10
View File
@@ -0,0 +1,10 @@
import React from 'react';
export default function AnalyticsReportsPage() {
return (
<div style={{ padding: '2rem', fontFamily: 'system-ui, sans-serif' }}>
<h1>Analytics Reports</h1>
<p>Module loaded under SupportHub Web.</p>
</div>
);
}
+10
View File
@@ -0,0 +1,10 @@
import React from 'react';
export default function RoutingEngineRulesPage() {
return (
<div style={{ padding: '2rem', fontFamily: 'system-ui, sans-serif' }}>
<h1>Routing Engine Rules</h1>
<p>Module loaded under SupportHub Web.</p>
</div>
);
}
+10
View File
@@ -0,0 +1,10 @@
import React from 'react';
export default function PlatformSettingsPage() {
return (
<div style={{ padding: '2rem', fontFamily: 'system-ui, sans-serif' }}>
<h1>Platform Settings</h1>
<p>Module loaded under SupportHub Web.</p>
</div>
);
}
@@ -0,0 +1,10 @@
import React from 'react';
export default function SLAPolicyBuilderPage() {
return (
<div style={{ padding: '2rem', fontFamily: 'system-ui, sans-serif' }}>
<h1>SLA Policy Builder</h1>
<p>Module loaded under SupportHub Web.</p>
</div>
);
}
+10
View File
@@ -0,0 +1,10 @@
import React from 'react';
export default function TeamsAdminPage() {
return (
<div style={{ padding: '2rem', fontFamily: 'system-ui, sans-serif' }}>
<h1>Teams Admin</h1>
<p>Module loaded under SupportHub Web.</p>
</div>
);
}
+5
View File
@@ -0,0 +1,5 @@
import React from 'react';
export default function AdminLayout({ children }: { children: React.ReactNode }) {
return <div className="adminlayout">{children}</div>;
}
+5
View File
@@ -0,0 +1,5 @@
import React from 'react';
export default function CustomerLayout({ children }: { children: React.ReactNode }) {
return <div className="customerlayout">{children}</div>;
}
+10
View File
@@ -0,0 +1,10 @@
import React from 'react';
export default function AIAssistantSupportPage() {
return (
<div style={{ padding: '2rem', fontFamily: 'system-ui, sans-serif' }}>
<h1>AI Assistant Support</h1>
<p>Module loaded under SupportHub Web.</p>
</div>
);
}
+10
View File
@@ -0,0 +1,10 @@
import React from 'react';
export default function NewTicketSubmissionPage() {
return (
<div style={{ padding: '2rem', fontFamily: 'system-ui, sans-serif' }}>
<h1>New Ticket Submission</h1>
<p>Module loaded under SupportHub Web.</p>
</div>
);
}
+10
View File
@@ -0,0 +1,10 @@
import React from 'react';
export default function CustomerSupportOverviewPage() {
return (
<div style={{ padding: '2rem', fontFamily: 'system-ui, sans-serif' }}>
<h1>Customer Support Overview</h1>
<p>Module loaded under SupportHub Web.</p>
</div>
);
}
@@ -0,0 +1,15 @@
import React from 'react';
export async function generateStaticParams() {
return [{ ticketId: 'sample-ticket-id' }];
}
export default function CustomerTicketDetailPage({ params }: { params: { ticketId: string } }) {
return (
<div style={{ padding: '2rem', fontFamily: 'system-ui, sans-serif' }}>
<h1>Customer Ticket Detail</h1>
<p>Ticket ID: {params?.ticketId || 'N/A'}</p>
<p>Module loaded under SupportHub Web.</p>
</div>
);
}
@@ -0,0 +1,10 @@
import React from 'react';
export default function CustomerTicketsPage() {
return (
<div style={{ padding: '2rem', fontFamily: 'system-ui, sans-serif' }}>
<h1>Customer Tickets</h1>
<p>Module loaded under SupportHub Web.</p>
</div>
);
}
+10
View File
@@ -0,0 +1,10 @@
import React from 'react';
export default function HelpCenterPage() {
return (
<div style={{ padding: '2rem', fontFamily: 'system-ui, sans-serif' }}>
<h1>Help Center</h1>
<p>Module loaded under SupportHub Web.</p>
</div>
);
}
+10
View File
@@ -0,0 +1,10 @@
import React from 'react';
export default function PublicHomePage() {
return (
<div style={{ padding: '2rem', fontFamily: 'system-ui, sans-serif' }}>
<h1>Public Home</h1>
<p>Module loaded under SupportHub Web.</p>
</div>
);
}
+10
View File
@@ -0,0 +1,10 @@
import React from 'react';
export default function SystemStatusPage() {
return (
<div style={{ padding: '2rem', fontFamily: 'system-ui, sans-serif' }}>
<h1>System Status</h1>
<p>Module loaded under SupportHub Web.</p>
</div>
);
}
+5
View File
@@ -0,0 +1,5 @@
import React from 'react';
export default function SupportLayout({ children }: { children: React.ReactNode }) {
return <div className="supportlayout">{children}</div>;
}
@@ -0,0 +1,15 @@
import React from 'react';
export async function generateStaticParams() {
return [{ ticketId: 'sample-ticket-id' }];
}
export default function AgentTicketDetailPage({ params }: { params: { ticketId: string } }) {
return (
<div style={{ padding: '2rem', fontFamily: 'system-ui, sans-serif' }}>
<h1>Agent Ticket Detail</h1>
<p>Ticket ID: {params?.ticketId || 'N/A'}</p>
<p>Module loaded under SupportHub Web.</p>
</div>
);
}
@@ -0,0 +1,10 @@
import React from 'react';
export default function AgentTicketWorkbenchPage() {
return (
<div style={{ padding: '2rem', fontFamily: 'system-ui, sans-serif' }}>
<h1>Agent Ticket Workbench</h1>
<p>Module loaded under SupportHub Web.</p>
</div>
);
}
@@ -0,0 +1,10 @@
import React from 'react';
export default function SupportAgentDashboardPage() {
return (
<div style={{ padding: '2rem', fontFamily: 'system-ui, sans-serif' }}>
<h1>Support Agent Dashboard</h1>
<p>Module loaded under SupportHub Web.</p>
</div>
);
}
@@ -0,0 +1,10 @@
import React from 'react';
export default function EscalationsMatrixPage() {
return (
<div style={{ padding: '2rem', fontFamily: 'system-ui, sans-serif' }}>
<h1>Escalations Matrix</h1>
<p>Module loaded under SupportHub Web.</p>
</div>
);
}
@@ -0,0 +1,10 @@
import React from 'react';
export default function ProblemManagementPage() {
return (
<div style={{ padding: '2rem', fontFamily: 'system-ui, sans-serif' }}>
<h1>Problem Management</h1>
<p>Module loaded under SupportHub Web.</p>
</div>
);
}
+10
View File
@@ -0,0 +1,10 @@
import React from 'react';
export default function QueueDispatchPage() {
return (
<div style={{ padding: '2rem', fontFamily: 'system-ui, sans-serif' }}>
<h1>Queue Dispatch</h1>
<p>Module loaded under SupportHub Web.</p>
</div>
);
}
+10
View File
@@ -0,0 +1,10 @@
import React from 'react';
export default function SLAMonitorPage() {
return (
<div style={{ padding: '2rem', fontFamily: 'system-ui, sans-serif' }}>
<h1>SLA Monitor</h1>
<p>Module loaded under SupportHub Web.</p>
</div>
);
}
+31
View File
@@ -0,0 +1,31 @@
'use client';
import React from 'react';
export default function Error({
error,
reset,
}: {
error: Error & { digest?: string };
reset: () => void;
}) {
return (
<div style={{ padding: '2rem', fontFamily: 'system-ui, sans-serif' }}>
<h2>Something went wrong!</h2>
<p>{error?.message || 'An unexpected error occurred.'}</p>
<button
onClick={() => reset()}
style={{
padding: '0.5rem 1rem',
cursor: 'pointer',
borderRadius: '4px',
background: '#0066cc',
color: '#fff',
border: 'none',
}}
>
Try again
</button>
</div>
);
}
+35
View File
@@ -0,0 +1,35 @@
'use client';
import React from 'react';
export default function GlobalError({
error,
reset,
}: {
error: Error & { digest?: string };
reset: () => void;
}) {
return (
<html lang="en">
<body>
<div style={{ padding: '2rem', fontFamily: 'system-ui, sans-serif' }}>
<h2>Global Application Error</h2>
<p>{error?.message || 'An unexpected error occurred.'}</p>
<button
onClick={() => reset()}
style={{
padding: '0.5rem 1rem',
cursor: 'pointer',
borderRadius: '4px',
background: '#0066cc',
color: '#fff',
border: 'none',
}}
>
Try again
</button>
</div>
</body>
</html>
);
}
+18
View File
@@ -0,0 +1,18 @@
import React from 'react';
export const metadata = {
title: 'SupportHub',
description: 'Enterprise Support Platform',
};
export default function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
return (
<html lang="en">
<body>{children}</body>
</html>
);
}
+9
View File
@@ -0,0 +1,9 @@
import React from 'react';
export default function Loading() {
return (
<div style={{ padding: '2rem', fontFamily: 'system-ui, sans-serif' }}>
<p>Loading SupportHub...</p>
</div>
);
}
+10
View File
@@ -0,0 +1,10 @@
import React from 'react';
export default function NotFound() {
return (
<div style={{ padding: '2rem', fontFamily: 'system-ui, sans-serif' }}>
<h2>404 - Page Not Found</h2>
<p>Could not find requested resource.</p>
</div>
);
}
View File
View File
View File
+34
View File
@@ -0,0 +1,34 @@
{
"compilerOptions": {
"lib": [
"dom",
"dom.iterable",
"esnext"
],
"allowJs": true,
"skipLibCheck": true,
"strict": false,
"noEmit": true,
"incremental": true,
"module": "esnext",
"esModuleInterop": true,
"moduleResolution": "node",
"resolveJsonModule": true,
"isolatedModules": true,
"jsx": "preserve",
"plugins": [
{
"name": "next"
}
]
},
"include": [
"next-env.d.ts",
".next/types/**/*.ts",
"**/*.ts",
"**/*.tsx"
],
"exclude": [
"node_modules"
]
}
View File