Prettier format pending files
This commit is contained in:
parent
d86df67a3c
commit
9a1d1c24f0
12 changed files with 254 additions and 100 deletions
|
|
@ -364,11 +364,20 @@ const App = () => (
|
|||
{/* Staff Arm Routes */}
|
||||
<Route path="/staff" element={<Staff />} />
|
||||
<Route path="/staff/login" element={<StaffLogin />} />
|
||||
<Route path="/staff/dashboard" element={<StaffDashboard />} />
|
||||
<Route path="/staff/directory" element={<StaffDirectory />} />
|
||||
<Route
|
||||
path="/staff/dashboard"
|
||||
element={<StaffDashboard />}
|
||||
/>
|
||||
<Route
|
||||
path="/staff/directory"
|
||||
element={<StaffDirectory />}
|
||||
/>
|
||||
<Route path="/staff/admin" element={<StaffAdmin />} />
|
||||
<Route path="/staff/docs" element={<StaffDocs />} />
|
||||
<Route path="/staff/achievements" element={<StaffAchievements />} />
|
||||
<Route
|
||||
path="/staff/achievements"
|
||||
element={<StaffAchievements />}
|
||||
/>
|
||||
<Route path="/staff/chat" element={<StaffChat />} />
|
||||
|
||||
<Route path="/support" element={<Support />} />
|
||||
|
|
|
|||
|
|
@ -80,7 +80,8 @@ const ARMS: Arm[] = [
|
|||
];
|
||||
|
||||
const LOGO_URLS: Record<string, string> = {
|
||||
staff: "https://cdn.builder.io/api/v1/image/assets%2Ffc53d607e21d497595ac97e0637001a1%2Fc0414efd7af54ef4b821a05d469150d0?format=webp&width=800",
|
||||
staff:
|
||||
"https://cdn.builder.io/api/v1/image/assets%2Ffc53d607e21d497595ac97e0637001a1%2Fc0414efd7af54ef4b821a05d469150d0?format=webp&width=800",
|
||||
labs: "https://cdn.builder.io/api/v1/image/assets%2Ffc53d607e21d497595ac97e0637001a1%2F85fe7910cff6483db1ea99c154684844?format=webp&width=800",
|
||||
gameforge:
|
||||
"https://cdn.builder.io/api/v1/image/assets%2Ffc53d607e21d497595ac97e0637001a1%2Fcd3534c1caa0497abfd44224040c6059?format=webp&width=800",
|
||||
|
|
@ -168,7 +169,10 @@ export default function ArmSwitcher() {
|
|||
</div>
|
||||
|
||||
{/* Modal for mobile fullscreen arm switching */}
|
||||
<ArmSwitcherModal isOpen={isModalOpen} onClose={() => setIsModalOpen(false)} />
|
||||
<ArmSwitcherModal
|
||||
isOpen={isModalOpen}
|
||||
onClose={() => setIsModalOpen(false)}
|
||||
/>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -87,7 +87,8 @@ const ARMS: Arm[] = [
|
|||
];
|
||||
|
||||
const LOGO_URLS: Record<string, string> = {
|
||||
staff: "https://cdn.builder.io/api/v1/image/assets%2Ffc53d607e21d497595ac97e0637001a1%2Fc0414efd7af54ef4b821a05d469150d0?format=webp&width=800",
|
||||
staff:
|
||||
"https://cdn.builder.io/api/v1/image/assets%2Ffc53d607e21d497595ac97e0637001a1%2Fc0414efd7af54ef4b821a05d469150d0?format=webp&width=800",
|
||||
labs: "https://cdn.builder.io/api/v1/image/assets%2Ffc53d607e21d497595ac97e0637001a1%2F85fe7910cff6483db1ea99c154684844?format=webp&width=800",
|
||||
gameforge:
|
||||
"https://cdn.builder.io/api/v1/image/assets%2Ffc53d607e21d497595ac97e0637001a1%2Fcd3534c1caa0497abfd44224040c6059?format=webp&width=800",
|
||||
|
|
|
|||
|
|
@ -52,7 +52,8 @@ const ARMS = [
|
|||
];
|
||||
|
||||
const ARM_LOGOS: Record<string, string> = {
|
||||
staff: "https://cdn.builder.io/api/v1/image/assets%2Ffc53d607e21d497595ac97e0637001a1%2Fc0414efd7af54ef4b821a05d469150d0?format=webp&width=800",
|
||||
staff:
|
||||
"https://cdn.builder.io/api/v1/image/assets%2Ffc53d607e21d497595ac97e0637001a1%2Fc0414efd7af54ef4b821a05d469150d0?format=webp&width=800",
|
||||
labs: "https://cdn.builder.io/api/v1/image/assets%2Ffc53d607e21d497595ac97e0637001a1%2F85fe7910cff6483db1ea99c154684844?format=webp&width=800",
|
||||
gameforge:
|
||||
"https://cdn.builder.io/api/v1/image/assets%2Ffc53d607e21d497595ac97e0637001a1%2Fcd3534c1caa0497abfd44224040c6059?format=webp&width=800",
|
||||
|
|
|
|||
|
|
@ -230,8 +230,7 @@ export default function Login() {
|
|||
console.error("Web3 error:", error);
|
||||
toastError({
|
||||
title: "Web3 verification failed",
|
||||
description:
|
||||
error?.message || "Could not verify your wallet signature",
|
||||
description: error?.message || "Could not verify your wallet signature",
|
||||
});
|
||||
}
|
||||
};
|
||||
|
|
@ -245,11 +244,7 @@ export default function Login() {
|
|||
<SEO
|
||||
title="Sign In to AeThex"
|
||||
description="Create or access your AeThex creator account"
|
||||
image={
|
||||
window.location.href
|
||||
? window.location.href
|
||||
: (undefined as any)
|
||||
}
|
||||
image={window.location.href ? window.location.href : (undefined as any)}
|
||||
/>
|
||||
<Layout>
|
||||
<div className="min-h-screen bg-aethex-gradient py-12 flex items-center justify-center">
|
||||
|
|
|
|||
|
|
@ -4,7 +4,13 @@ import Layout from "@/components/Layout";
|
|||
import SEO from "@/components/SEO";
|
||||
import { useAuth } from "@/contexts/AuthContext";
|
||||
import { Button } from "@/components/ui/button";
|
||||
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
|
||||
import {
|
||||
Card,
|
||||
CardContent,
|
||||
CardDescription,
|
||||
CardHeader,
|
||||
CardTitle,
|
||||
} from "@/components/ui/card";
|
||||
import { Badge } from "@/components/ui/badge";
|
||||
import { Lock, Users, FileText, Zap, Award, MessageSquare } from "lucide-react";
|
||||
|
||||
|
|
@ -45,8 +51,9 @@ export default function Staff() {
|
|||
</h1>
|
||||
|
||||
<p className="text-xl text-purple-200/80 max-w-2xl mx-auto mb-12">
|
||||
The internal hub for AeThex employees and authorized contractors.
|
||||
Unified access to dashboards, tools, documentation, and collaboration features.
|
||||
The internal hub for AeThex employees and authorized contractors.
|
||||
Unified access to dashboards, tools, documentation, and
|
||||
collaboration features.
|
||||
</p>
|
||||
|
||||
<div className="flex flex-col sm:flex-row gap-4 justify-center">
|
||||
|
|
@ -88,7 +95,8 @@ export default function Staff() {
|
|||
</CardHeader>
|
||||
<CardContent>
|
||||
<CardDescription className="text-purple-200/70">
|
||||
Real-time operations metrics, service status, and quick access to common tools.
|
||||
Real-time operations metrics, service status, and quick
|
||||
access to common tools.
|
||||
</CardDescription>
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
|
@ -105,7 +113,8 @@ export default function Staff() {
|
|||
</CardHeader>
|
||||
<CardContent>
|
||||
<CardDescription className="text-blue-200/70">
|
||||
Browse team members, view profiles, and find contact information.
|
||||
Browse team members, view profiles, and find contact
|
||||
information.
|
||||
</CardDescription>
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
|
@ -117,12 +126,15 @@ export default function Staff() {
|
|||
<div className="p-2 rounded bg-indigo-500/20">
|
||||
<Lock className="h-5 w-5 text-indigo-400" />
|
||||
</div>
|
||||
<CardTitle className="text-indigo-100">Admin Tools</CardTitle>
|
||||
<CardTitle className="text-indigo-100">
|
||||
Admin Tools
|
||||
</CardTitle>
|
||||
</div>
|
||||
</CardHeader>
|
||||
<CardContent>
|
||||
<CardDescription className="text-indigo-200/70">
|
||||
Manage users, roles, permissions, and platform configuration.
|
||||
Manage users, roles, permissions, and platform
|
||||
configuration.
|
||||
</CardDescription>
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
|
@ -139,7 +151,8 @@ export default function Staff() {
|
|||
</CardHeader>
|
||||
<CardContent>
|
||||
<CardDescription className="text-cyan-200/70">
|
||||
Internal documentation, API keys, credentials, and setup guides.
|
||||
Internal documentation, API keys, credentials, and setup
|
||||
guides.
|
||||
</CardDescription>
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
|
@ -151,12 +164,15 @@ export default function Staff() {
|
|||
<div className="p-2 rounded bg-amber-500/20">
|
||||
<Award className="h-5 w-5 text-amber-400" />
|
||||
</div>
|
||||
<CardTitle className="text-amber-100">Achievements</CardTitle>
|
||||
<CardTitle className="text-amber-100">
|
||||
Achievements
|
||||
</CardTitle>
|
||||
</div>
|
||||
</CardHeader>
|
||||
<CardContent>
|
||||
<CardDescription className="text-amber-200/70">
|
||||
Track team accomplishments, milestones, and performance metrics.
|
||||
Track team accomplishments, milestones, and performance
|
||||
metrics.
|
||||
</CardDescription>
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
|
@ -168,7 +184,9 @@ export default function Staff() {
|
|||
<div className="p-2 rounded bg-rose-500/20">
|
||||
<MessageSquare className="h-5 w-5 text-rose-400" />
|
||||
</div>
|
||||
<CardTitle className="text-rose-100">Collaboration</CardTitle>
|
||||
<CardTitle className="text-rose-100">
|
||||
Collaboration
|
||||
</CardTitle>
|
||||
</div>
|
||||
</CardHeader>
|
||||
<CardContent>
|
||||
|
|
@ -184,7 +202,9 @@ export default function Staff() {
|
|||
<div className="container mx-auto px-4 py-20 border-t border-purple-500/20">
|
||||
<div className="grid md:grid-cols-2 gap-12">
|
||||
<div>
|
||||
<h3 className="text-2xl font-bold mb-4 text-purple-100">Who Can Access?</h3>
|
||||
<h3 className="text-2xl font-bold mb-4 text-purple-100">
|
||||
Who Can Access?
|
||||
</h3>
|
||||
<ul className="space-y-3 text-purple-200/80">
|
||||
<li className="flex gap-2">
|
||||
<span className="text-purple-400">✓</span>
|
||||
|
|
@ -202,7 +222,9 @@ export default function Staff() {
|
|||
</div>
|
||||
|
||||
<div>
|
||||
<h3 className="text-2xl font-bold mb-4 text-purple-100">Getting Started</h3>
|
||||
<h3 className="text-2xl font-bold mb-4 text-purple-100">
|
||||
Getting Started
|
||||
</h3>
|
||||
<ol className="space-y-3 text-purple-200/80">
|
||||
<li className="flex gap-2">
|
||||
<span className="text-purple-400">1.</span>
|
||||
|
|
|
|||
|
|
@ -75,7 +75,7 @@ export default function StaffLogin() {
|
|||
if (!isAethexDev) {
|
||||
// Email is not @aethex.dev - show error
|
||||
setErrorFromUrl(
|
||||
"Only @aethex.dev email addresses can access the Staff Portal. If you're an authorized contractor, please use your assigned contractor email."
|
||||
"Only @aethex.dev email addresses can access the Staff Portal. If you're an authorized contractor, please use your assigned contractor email.",
|
||||
);
|
||||
toastError({
|
||||
title: "Access Denied",
|
||||
|
|
@ -114,10 +114,7 @@ export default function StaffLogin() {
|
|||
|
||||
return (
|
||||
<Layout>
|
||||
<SEO
|
||||
title="Staff Login"
|
||||
description="AeThex staff and employees only"
|
||||
/>
|
||||
<SEO title="Staff Login" description="AeThex staff and employees only" />
|
||||
|
||||
<div className="min-h-screen bg-gradient-to-br from-slate-900 via-slate-800 to-slate-900 flex items-center justify-center p-4">
|
||||
<div className="absolute inset-0 opacity-10">
|
||||
|
|
@ -159,7 +156,9 @@ export default function StaffLogin() {
|
|||
className="w-full bg-white hover:bg-slate-100 text-slate-900 font-semibold"
|
||||
>
|
||||
<GoogleIcon />
|
||||
<span>{isLoading ? "Signing in..." : "Sign in with Google"}</span>
|
||||
<span>
|
||||
{isLoading ? "Signing in..." : "Sign in with Google"}
|
||||
</span>
|
||||
</Button>
|
||||
</div>
|
||||
|
||||
|
|
@ -188,7 +187,10 @@ export default function StaffLogin() {
|
|||
<div className="pt-4 border-t border-slate-700">
|
||||
<p className="text-xs text-slate-500 text-center">
|
||||
Public login available at{" "}
|
||||
<a href="/login" className="text-purple-400 hover:text-purple-300">
|
||||
<a
|
||||
href="/login"
|
||||
className="text-purple-400 hover:text-purple-300"
|
||||
>
|
||||
aethex.dev/login
|
||||
</a>
|
||||
</p>
|
||||
|
|
|
|||
|
|
@ -2,7 +2,13 @@ import { useEffect, useState } from "react";
|
|||
import Layout from "@/components/Layout";
|
||||
import { useAuth } from "@/contexts/AuthContext";
|
||||
import { useNavigate } from "react-router-dom";
|
||||
import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/components/ui/card";
|
||||
import {
|
||||
Card,
|
||||
CardContent,
|
||||
CardHeader,
|
||||
CardTitle,
|
||||
CardDescription,
|
||||
} from "@/components/ui/card";
|
||||
import { Badge } from "@/components/ui/badge";
|
||||
import { Progress } from "@/components/ui/progress";
|
||||
import { Trophy, Zap, Users, Target } from "lucide-react";
|
||||
|
|
@ -61,7 +67,12 @@ export default function StaffAchievements() {
|
|||
}
|
||||
}, [user, loading, navigate]);
|
||||
|
||||
if (loading) return <Layout><div className="container py-20">Loading...</div></Layout>;
|
||||
if (loading)
|
||||
return (
|
||||
<Layout>
|
||||
<div className="container py-20">Loading...</div>
|
||||
</Layout>
|
||||
);
|
||||
|
||||
return (
|
||||
<Layout>
|
||||
|
|
@ -69,14 +80,18 @@ export default function StaffAchievements() {
|
|||
<div className="container mx-auto px-4 py-12">
|
||||
<div className="mb-8">
|
||||
<h1 className="text-4xl font-bold text-white mb-2">Achievements</h1>
|
||||
<p className="text-slate-400">Track team accomplishments and milestones</p>
|
||||
<p className="text-slate-400">
|
||||
Track team accomplishments and milestones
|
||||
</p>
|
||||
</div>
|
||||
|
||||
{/* Stats */}
|
||||
<div className="grid md:grid-cols-4 gap-6 mb-12">
|
||||
<Card className="border-slate-700/50 bg-slate-900/50 backdrop-blur">
|
||||
<CardContent className="p-6">
|
||||
<div className="text-sm text-slate-400 mb-2">Total Achievements</div>
|
||||
<div className="text-sm text-slate-400 mb-2">
|
||||
Total Achievements
|
||||
</div>
|
||||
<div className="text-3xl font-bold text-white">4</div>
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
|
@ -97,7 +112,9 @@ export default function StaffAchievements() {
|
|||
|
||||
<Card className="border-slate-700/50 bg-slate-900/50 backdrop-blur">
|
||||
<CardContent className="p-6">
|
||||
<div className="text-sm text-slate-400 mb-2">Completion Rate</div>
|
||||
<div className="text-sm text-slate-400 mb-2">
|
||||
Completion Rate
|
||||
</div>
|
||||
<div className="text-3xl font-bold text-purple-400">50%</div>
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
|
@ -133,7 +150,11 @@ export default function StaffAchievements() {
|
|||
/>
|
||||
</div>
|
||||
<div>
|
||||
<CardTitle className={achievement.earned ? "text-green-300" : "text-white"}>
|
||||
<CardTitle
|
||||
className={
|
||||
achievement.earned ? "text-green-300" : "text-white"
|
||||
}
|
||||
>
|
||||
{achievement.title}
|
||||
</CardTitle>
|
||||
<CardDescription className="text-slate-400 mt-1">
|
||||
|
|
@ -149,20 +170,27 @@ export default function StaffAchievements() {
|
|||
</div>
|
||||
</CardHeader>
|
||||
<CardContent className="space-y-4">
|
||||
{!achievement.earned && achievement.progress !== undefined && (
|
||||
<div>
|
||||
<div className="flex justify-between items-center mb-2">
|
||||
<span className="text-xs text-slate-400">Progress</span>
|
||||
<span className="text-xs text-slate-300 font-medium">
|
||||
{achievement.progress}%
|
||||
</span>
|
||||
{!achievement.earned &&
|
||||
achievement.progress !== undefined && (
|
||||
<div>
|
||||
<div className="flex justify-between items-center mb-2">
|
||||
<span className="text-xs text-slate-400">
|
||||
Progress
|
||||
</span>
|
||||
<span className="text-xs text-slate-300 font-medium">
|
||||
{achievement.progress}%
|
||||
</span>
|
||||
</div>
|
||||
<Progress
|
||||
value={achievement.progress}
|
||||
className="h-2"
|
||||
/>
|
||||
</div>
|
||||
<Progress value={achievement.progress} className="h-2" />
|
||||
</div>
|
||||
)}
|
||||
)}
|
||||
{achievement.earnedDate && (
|
||||
<p className="text-xs text-slate-500">
|
||||
Earned on {new Date(achievement.earnedDate).toLocaleDateString()}
|
||||
Earned on{" "}
|
||||
{new Date(achievement.earnedDate).toLocaleDateString()}
|
||||
</p>
|
||||
)}
|
||||
</CardContent>
|
||||
|
|
|
|||
|
|
@ -2,10 +2,23 @@ import { useEffect } from "react";
|
|||
import Layout from "@/components/Layout";
|
||||
import { useAuth } from "@/contexts/AuthContext";
|
||||
import { useNavigate } from "react-router-dom";
|
||||
import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/components/ui/card";
|
||||
import {
|
||||
Card,
|
||||
CardContent,
|
||||
CardHeader,
|
||||
CardTitle,
|
||||
CardDescription,
|
||||
} from "@/components/ui/card";
|
||||
import { Badge } from "@/components/ui/badge";
|
||||
import { Button } from "@/components/ui/button";
|
||||
import { Users, Shield, Settings, GitBranch, Eye, RefreshCw } from "lucide-react";
|
||||
import {
|
||||
Users,
|
||||
Shield,
|
||||
Settings,
|
||||
GitBranch,
|
||||
Eye,
|
||||
RefreshCw,
|
||||
} from "lucide-react";
|
||||
|
||||
export default function StaffAdmin() {
|
||||
const { user, roles, loading } = useAuth();
|
||||
|
|
@ -17,14 +30,19 @@ export default function StaffAdmin() {
|
|||
return;
|
||||
}
|
||||
const isAdmin = roles?.some((r) =>
|
||||
["owner", "admin", "founder"].includes(r.toLowerCase())
|
||||
["owner", "admin", "founder"].includes(r.toLowerCase()),
|
||||
);
|
||||
if (!isAdmin) {
|
||||
navigate("/staff/dashboard");
|
||||
}
|
||||
}, [user, roles, loading, navigate]);
|
||||
|
||||
if (loading) return <Layout><div className="container py-20">Loading...</div></Layout>;
|
||||
if (loading)
|
||||
return (
|
||||
<Layout>
|
||||
<div className="container py-20">Loading...</div>
|
||||
</Layout>
|
||||
);
|
||||
|
||||
return (
|
||||
<Layout>
|
||||
|
|
@ -32,7 +50,9 @@ export default function StaffAdmin() {
|
|||
<div className="container mx-auto px-4 py-12">
|
||||
<div className="mb-8">
|
||||
<h1 className="text-4xl font-bold text-white mb-2">Admin Tools</h1>
|
||||
<p className="text-slate-400">Manage users, roles, and platform configuration</p>
|
||||
<p className="text-slate-400">
|
||||
Manage users, roles, and platform configuration
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="grid md:grid-cols-2 lg:grid-cols-3 gap-6">
|
||||
|
|
@ -45,7 +65,9 @@ export default function StaffAdmin() {
|
|||
<Users className="h-5 w-5 text-blue-400" />
|
||||
Users
|
||||
</CardTitle>
|
||||
<CardDescription className="text-slate-400">Manage team members and roles</CardDescription>
|
||||
<CardDescription className="text-slate-400">
|
||||
Manage team members and roles
|
||||
</CardDescription>
|
||||
</div>
|
||||
</div>
|
||||
</CardHeader>
|
||||
|
|
@ -65,7 +87,9 @@ export default function StaffAdmin() {
|
|||
<Shield className="h-5 w-5 text-purple-400" />
|
||||
Permissions
|
||||
</CardTitle>
|
||||
<CardDescription className="text-slate-400">Configure role-based access</CardDescription>
|
||||
<CardDescription className="text-slate-400">
|
||||
Configure role-based access
|
||||
</CardDescription>
|
||||
</div>
|
||||
</div>
|
||||
</CardHeader>
|
||||
|
|
@ -85,7 +109,9 @@ export default function StaffAdmin() {
|
|||
<Settings className="h-5 w-5 text-indigo-400" />
|
||||
Settings
|
||||
</CardTitle>
|
||||
<CardDescription className="text-slate-400">Platform configuration</CardDescription>
|
||||
<CardDescription className="text-slate-400">
|
||||
Platform configuration
|
||||
</CardDescription>
|
||||
</div>
|
||||
</div>
|
||||
</CardHeader>
|
||||
|
|
@ -105,7 +131,9 @@ export default function StaffAdmin() {
|
|||
<GitBranch className="h-5 w-5 text-green-400" />
|
||||
API Keys
|
||||
</CardTitle>
|
||||
<CardDescription className="text-slate-400">Manage authentication tokens</CardDescription>
|
||||
<CardDescription className="text-slate-400">
|
||||
Manage authentication tokens
|
||||
</CardDescription>
|
||||
</div>
|
||||
</div>
|
||||
</CardHeader>
|
||||
|
|
@ -125,7 +153,9 @@ export default function StaffAdmin() {
|
|||
<Eye className="h-5 w-5 text-yellow-400" />
|
||||
Audit Log
|
||||
</CardTitle>
|
||||
<CardDescription className="text-slate-400">Platform activity history</CardDescription>
|
||||
<CardDescription className="text-slate-400">
|
||||
Platform activity history
|
||||
</CardDescription>
|
||||
</div>
|
||||
</div>
|
||||
</CardHeader>
|
||||
|
|
@ -145,7 +175,9 @@ export default function StaffAdmin() {
|
|||
<RefreshCw className="h-5 w-5 text-red-400" />
|
||||
Maintenance
|
||||
</CardTitle>
|
||||
<CardDescription className="text-slate-400">System operations</CardDescription>
|
||||
<CardDescription className="text-slate-400">
|
||||
System operations
|
||||
</CardDescription>
|
||||
</div>
|
||||
</div>
|
||||
</CardHeader>
|
||||
|
|
|
|||
|
|
@ -2,7 +2,13 @@ import { useEffect } from "react";
|
|||
import Layout from "@/components/Layout";
|
||||
import { useAuth } from "@/contexts/AuthContext";
|
||||
import { useNavigate } from "react-router-dom";
|
||||
import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/components/ui/card";
|
||||
import {
|
||||
Card,
|
||||
CardContent,
|
||||
CardHeader,
|
||||
CardTitle,
|
||||
CardDescription,
|
||||
} from "@/components/ui/card";
|
||||
import { Button } from "@/components/ui/button";
|
||||
import { Badge } from "@/components/ui/badge";
|
||||
import { MessageSquare, Users, Hash, Lock, Plus } from "lucide-react";
|
||||
|
|
@ -57,7 +63,12 @@ export default function StaffChat() {
|
|||
}
|
||||
}, [user, loading, navigate]);
|
||||
|
||||
if (loading) return <Layout><div className="container py-20">Loading...</div></Layout>;
|
||||
if (loading)
|
||||
return (
|
||||
<Layout>
|
||||
<div className="container py-20">Loading...</div>
|
||||
</Layout>
|
||||
);
|
||||
|
||||
return (
|
||||
<Layout>
|
||||
|
|
@ -65,7 +76,9 @@ export default function StaffChat() {
|
|||
<div className="container mx-auto px-4 py-12">
|
||||
<div className="mb-8">
|
||||
<h1 className="text-4xl font-bold text-white mb-2">Team Chat</h1>
|
||||
<p className="text-slate-400">Internal collaboration and team discussions</p>
|
||||
<p className="text-slate-400">
|
||||
Internal collaboration and team discussions
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="grid md:grid-cols-3 gap-8">
|
||||
|
|
@ -160,9 +173,12 @@ export default function StaffChat() {
|
|||
<div className="flex gap-3">
|
||||
<div className="w-10 h-10 rounded-full bg-blue-500/20 flex-shrink-0" />
|
||||
<div>
|
||||
<p className="text-sm text-white font-medium">Sarah Johnson</p>
|
||||
<p className="text-sm text-white font-medium">
|
||||
Sarah Johnson
|
||||
</p>
|
||||
<p className="text-slate-300 text-sm mt-1">
|
||||
Welcome to the internal team chat! This is where we collaborate and share updates.
|
||||
Welcome to the internal team chat! This is where we
|
||||
collaborate and share updates.
|
||||
</p>
|
||||
<p className="text-xs text-slate-500 mt-2">10:30 AM</p>
|
||||
</div>
|
||||
|
|
@ -171,9 +187,12 @@ export default function StaffChat() {
|
|||
<div className="flex gap-3">
|
||||
<div className="w-10 h-10 rounded-full bg-purple-500/20 flex-shrink-0" />
|
||||
<div>
|
||||
<p className="text-sm text-white font-medium">Mike Chen</p>
|
||||
<p className="text-sm text-white font-medium">
|
||||
Mike Chen
|
||||
</p>
|
||||
<p className="text-slate-300 text-sm mt-1">
|
||||
Great! Looking forward to building amazing things together.
|
||||
Great! Looking forward to building amazing things
|
||||
together.
|
||||
</p>
|
||||
<p className="text-xs text-slate-500 mt-2">10:35 AM</p>
|
||||
</div>
|
||||
|
|
@ -187,7 +206,9 @@ export default function StaffChat() {
|
|||
placeholder="Type a message..."
|
||||
className="flex-1 px-4 py-2 rounded bg-slate-800 border border-slate-700 text-white placeholder-slate-500 focus:outline-none focus:border-purple-500"
|
||||
/>
|
||||
<Button className="bg-purple-600 hover:bg-purple-700">Send</Button>
|
||||
<Button className="bg-purple-600 hover:bg-purple-700">
|
||||
Send
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
</Card>
|
||||
|
|
@ -201,18 +222,10 @@ export default function StaffChat() {
|
|||
</CardTitle>
|
||||
</CardHeader>
|
||||
<CardContent className="text-blue-200/80 space-y-2">
|
||||
<p>
|
||||
• Full-featured internal messaging platform
|
||||
</p>
|
||||
<p>
|
||||
• Channels for teams and projects
|
||||
</p>
|
||||
<p>
|
||||
• Direct messages and group chats
|
||||
</p>
|
||||
<p>
|
||||
• File sharing and integrations
|
||||
</p>
|
||||
<p>• Full-featured internal messaging platform</p>
|
||||
<p>• Channels for teams and projects</p>
|
||||
<p>• Direct messages and group chats</p>
|
||||
<p>• File sharing and integrations</p>
|
||||
</CardContent>
|
||||
</Card>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -71,21 +71,30 @@ export default function StaffDirectory() {
|
|||
(member) =>
|
||||
member.full_name.toLowerCase().includes(query) ||
|
||||
member.email.toLowerCase().includes(query) ||
|
||||
member.department?.toLowerCase().includes(query)
|
||||
member.department?.toLowerCase().includes(query),
|
||||
);
|
||||
setFilteredMembers(filtered);
|
||||
}
|
||||
}, [searchQuery, staffMembers]);
|
||||
|
||||
if (loading) return <Layout><div className="container py-20">Loading...</div></Layout>;
|
||||
if (loading)
|
||||
return (
|
||||
<Layout>
|
||||
<div className="container py-20">Loading...</div>
|
||||
</Layout>
|
||||
);
|
||||
|
||||
return (
|
||||
<Layout>
|
||||
<div className="min-h-screen bg-gradient-to-br from-slate-900 via-slate-800 to-slate-900">
|
||||
<div className="container mx-auto px-4 py-12">
|
||||
<div className="mb-8">
|
||||
<h1 className="text-4xl font-bold text-white mb-2">Team Directory</h1>
|
||||
<p className="text-slate-400">Find and connect with AeThex team members</p>
|
||||
<h1 className="text-4xl font-bold text-white mb-2">
|
||||
Team Directory
|
||||
</h1>
|
||||
<p className="text-slate-400">
|
||||
Find and connect with AeThex team members
|
||||
</p>
|
||||
</div>
|
||||
|
||||
{/* Search Bar */}
|
||||
|
|
@ -105,7 +114,9 @@ export default function StaffDirectory() {
|
|||
|
||||
{/* Results */}
|
||||
{isLoading ? (
|
||||
<div className="text-center py-12 text-slate-400">Loading team members...</div>
|
||||
<div className="text-center py-12 text-slate-400">
|
||||
Loading team members...
|
||||
</div>
|
||||
) : filteredMembers.length === 0 ? (
|
||||
<div className="text-center py-12 text-slate-400">
|
||||
No staff members found matching your search
|
||||
|
|
@ -120,8 +131,12 @@ export default function StaffDirectory() {
|
|||
<CardHeader>
|
||||
<div className="flex items-start justify-between">
|
||||
<div className="flex-1">
|
||||
<CardTitle className="text-white">{member.full_name}</CardTitle>
|
||||
<p className="text-sm text-slate-400 mt-1">{member.position || "Team Member"}</p>
|
||||
<CardTitle className="text-white">
|
||||
{member.full_name}
|
||||
</CardTitle>
|
||||
<p className="text-sm text-slate-400 mt-1">
|
||||
{member.position || "Team Member"}
|
||||
</p>
|
||||
</div>
|
||||
{member.role && (
|
||||
<Badge className="bg-purple-500/30 text-purple-300 border-purple-500/50 capitalize">
|
||||
|
|
@ -143,7 +158,10 @@ export default function StaffDirectory() {
|
|||
{member.phone && (
|
||||
<div className="flex items-center gap-2 text-slate-400 text-sm">
|
||||
<Phone className="h-4 w-4 text-slate-500" />
|
||||
<a href={`tel:${member.phone}`} className="hover:text-purple-400">
|
||||
<a
|
||||
href={`tel:${member.phone}`}
|
||||
className="hover:text-purple-400"
|
||||
>
|
||||
{member.phone}
|
||||
</a>
|
||||
</div>
|
||||
|
|
@ -163,7 +181,8 @@ export default function StaffDirectory() {
|
|||
{/* Stats */}
|
||||
<div className="mt-12 pt-8 border-t border-slate-700/50">
|
||||
<p className="text-center text-slate-400">
|
||||
Showing {filteredMembers.length} of {staffMembers.length} team members
|
||||
Showing {filteredMembers.length} of {staffMembers.length} team
|
||||
members
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -2,7 +2,13 @@ import { useEffect } from "react";
|
|||
import Layout from "@/components/Layout";
|
||||
import { useAuth } from "@/contexts/AuthContext";
|
||||
import { useNavigate } from "react-router-dom";
|
||||
import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/components/ui/card";
|
||||
import {
|
||||
Card,
|
||||
CardContent,
|
||||
CardHeader,
|
||||
CardTitle,
|
||||
CardDescription,
|
||||
} from "@/components/ui/card";
|
||||
import { Button } from "@/components/ui/button";
|
||||
import { Badge } from "@/components/ui/badge";
|
||||
import { FileText, Key, Database, Code2, ExternalLink } from "lucide-react";
|
||||
|
|
@ -17,7 +23,12 @@ export default function StaffDocs() {
|
|||
}
|
||||
}, [user, loading, navigate]);
|
||||
|
||||
if (loading) return <Layout><div className="container py-20">Loading...</div></Layout>;
|
||||
if (loading)
|
||||
return (
|
||||
<Layout>
|
||||
<div className="container py-20">Loading...</div>
|
||||
</Layout>
|
||||
);
|
||||
|
||||
const docs = [
|
||||
{
|
||||
|
|
@ -57,13 +68,19 @@ export default function StaffDocs() {
|
|||
<div className="min-h-screen bg-gradient-to-br from-slate-900 via-slate-800 to-slate-900">
|
||||
<div className="container mx-auto px-4 py-12">
|
||||
<div className="mb-8">
|
||||
<h1 className="text-4xl font-bold text-white mb-2">Documentation & API</h1>
|
||||
<p className="text-slate-400">Internal docs, API keys, and credentials</p>
|
||||
<h1 className="text-4xl font-bold text-white mb-2">
|
||||
Documentation & API
|
||||
</h1>
|
||||
<p className="text-slate-400">
|
||||
Internal docs, API keys, and credentials
|
||||
</p>
|
||||
</div>
|
||||
|
||||
{/* Documentation */}
|
||||
<div className="mb-12">
|
||||
<h2 className="text-2xl font-bold text-white mb-6">Documentation</h2>
|
||||
<h2 className="text-2xl font-bold text-white mb-6">
|
||||
Documentation
|
||||
</h2>
|
||||
<div className="grid md:grid-cols-2 gap-6">
|
||||
{docs.map((doc, idx) => {
|
||||
const IconComponent = doc.icon;
|
||||
|
|
@ -79,7 +96,9 @@ export default function StaffDocs() {
|
|||
<IconComponent className="h-5 w-5 text-blue-400" />
|
||||
</div>
|
||||
<div>
|
||||
<CardTitle className="text-white">{doc.title}</CardTitle>
|
||||
<CardTitle className="text-white">
|
||||
{doc.title}
|
||||
</CardTitle>
|
||||
<CardDescription className="text-slate-400">
|
||||
{doc.description}
|
||||
</CardDescription>
|
||||
|
|
@ -88,7 +107,10 @@ export default function StaffDocs() {
|
|||
</div>
|
||||
</CardHeader>
|
||||
<CardContent>
|
||||
<Button variant="ghost" className="text-blue-400 hover:text-blue-300 p-0">
|
||||
<Button
|
||||
variant="ghost"
|
||||
className="text-blue-400 hover:text-blue-300 p-0"
|
||||
>
|
||||
Read Docs <ExternalLink className="ml-2 h-4 w-4" />
|
||||
</Button>
|
||||
</CardContent>
|
||||
|
|
@ -116,13 +138,19 @@ export default function StaffDocs() {
|
|||
>
|
||||
<div>
|
||||
<p className="text-white font-medium">{key.name}</p>
|
||||
<p className="text-slate-400 text-sm font-mono">{key.key}</p>
|
||||
<p className="text-slate-400 text-sm font-mono">
|
||||
{key.key}
|
||||
</p>
|
||||
</div>
|
||||
<div className="flex items-center gap-3">
|
||||
<Badge className="bg-green-500/20 text-green-300 border-green-500/50 capitalize">
|
||||
{key.status}
|
||||
</Badge>
|
||||
<Button variant="ghost" size="sm" className="text-blue-400 hover:text-blue-300">
|
||||
<Button
|
||||
variant="ghost"
|
||||
size="sm"
|
||||
className="text-blue-400 hover:text-blue-300"
|
||||
>
|
||||
Copy
|
||||
</Button>
|
||||
</div>
|
||||
|
|
|
|||
Loading…
Reference in a new issue