Skip to content

Xanderbilla-ui #8

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 43 commits into from
May 19, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
0444a79
xanderbilla:main - Add authentication components
Mar 20, 2025
cdcb868
xanderbilla:main - Create basic UI components
Mar 20, 2025
be8a822
xanderbilla:main - Implement dashboard layout
Mar 20, 2025
19bdfbf
xanderbilla:main - Add bucket management functionality
Mar 20, 2025
60d19b0
xanderbilla:main - Setup API health check service
Mar 20, 2025
d2fdfe6
xanderbilla:main - Implement responsive navbar
Mar 20, 2025
17b2d24
xanderbilla:main - Add theme toggle functionality
Mar 20, 2025
e0f9b71
xanderbilla:main - Create custom button component
Mar 20, 2025
8067ee5
xanderbilla:main - Add loading skeletons
Mar 20, 2025
ce1c18e
xanderbilla:main - Implement error handling
Mar 20, 2025
81bd9d1
xanderbilla:main - Add filter components for buckets
Mar 20, 2025
8bdf85a
xanderbilla:main - Setup Docker configuration
Mar 20, 2025
029a200
xanderbilla:main - Add GitHub Actions workflow
Mar 20, 2025
7be59ad
xanderbilla:main - Create documentation for auth flow
Mar 20, 2025
a81ae7f
xanderbilla:main - Add authentication components
Mar 20, 2025
91423e3
xanderbilla:main - Create basic UI components
Mar 20, 2025
71d7e8e
xanderbilla:main - Implement dashboard layout
Mar 20, 2025
707a14f
xanderbilla:main - Add bucket management functionality
Mar 20, 2025
f0c01df
xanderbilla:main - Setup API health check service
Mar 20, 2025
82d08a9
xanderbilla:main - Implement responsive navbar
Mar 20, 2025
9f24110
xanderbilla:main - Add theme toggle functionality
Mar 20, 2025
4810ef0
xanderbilla:main - Create custom button component
Mar 20, 2025
00999e4
xanderbilla:main - Add loading skeletons
Mar 20, 2025
73c028c
xanderbilla:main - Implement error handling
Mar 20, 2025
4a8746e
xanderbilla:main - Add filter components for buckets
Mar 20, 2025
7fd652f
xanderbilla:main - Setup Docker configuration
Mar 20, 2025
5b1df6b
xanderbilla:main - Add GitHub Actions workflow
Mar 20, 2025
9c20c43
xanderbilla:main - Create documentation for auth flow
Mar 20, 2025
9e0f6da
xanderbilla:main - Initial project setup
Mar 20, 2025
d67d3e5
xanderbilla:main - Enhance authentication flow and documentation
xanderbilla Mar 25, 2025
81d051f
xanderbilla:main - Improve dashboard UI and functionality
xanderbilla Apr 2, 2025
a21bf17
xanderbilla:main - Update health check service implementation
xanderbilla Apr 10, 2025
8a00bc9
xanderbilla:main - Enhance bucket management features
xanderbilla Apr 17, 2025
59eef55
xanderbilla:main - Update navigation and theme toggle components
xanderbilla Apr 24, 2025
0ba8c9d
xanderbilla:main - Refactor and enhance button components
xanderbilla May 2, 2025
015d630
xanderbilla:main - Update project configuration files
xanderbilla May 9, 2025
61080ba
xanderbilla:main - Enhance utility functions
xanderbilla May 15, 2025
4ae6b29
xanderbilla:main - Update homepage layout and content
xanderbilla May 19, 2025
310aecb
xanderbilla:main - Remove deprecated files and update configurations
xanderbilla May 19, 2025
f959ba1
xanderbilla:main - cleaned entire project
xanderbilla May 19, 2025
27d8957
xanderbilla:main - Initial project setup
Mar 20, 2025
4a42b26
next.config.ts
xanderbilla May 19, 2025
e2e1494
xanderbilla:main - Update home page UI components
xanderbilla Mar 19, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 0 additions & 3 deletions .eslintrc.json

This file was deleted.

7 changes: 7 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
name: Build
on: push
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
32 changes: 17 additions & 15 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,42 +1,44 @@
# Dependencies
# dependencies
/node_modules
/.pnp
.pnp.js

# Testing
# testing
/coverage

# Next.js
# next.js
/.next/
/out/

# Production
# production
/build

# Misc
# misc
.DS_Store
*.pem

# Debug
# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*

# Local env files
# local env files
.env*.local
.env

# Vercel
# vercel
.vercel

# TypeScript
# typescript
*.tsbuildinfo
next-env.d.ts

# IDE
.idea
.vscode
# IDE files
.idea/
.vscode/
*.swp
*.swo

# Cache
.cache
.npm
# logs
logs
*.log
52 changes: 0 additions & 52 deletions README.md
100644 → 100755
Original file line number Diff line number Diff line change
@@ -1,52 +0,0 @@
# 🌌 NebulaS3 - Advanced AWS S3 Management

## 📋 Overview

NebulaS3 is an advanced Amazon S3 management application providing secure interaction with AWS S3 storage. It simplifies bucket operations while ensuring robust authentication through AWS STS.

## ⭐ Features

- 🔐 Secure AWS STS Authentication
- 🪣 Create, List, and Delete S3 Buckets
- 🔑 Session-Based Authentication with Temporary Credentials
- 🖥️ User-Friendly Interface
- 🔄 Continuous Feature Updates

## 🚀 Getting Started

### 🔗 Quick Access

**Live Application:** [https://nebulas3.vercel.app](https://nebulas3.vercel.app)

### 🔒 Authentication

- 📝 Enter AWS Access Key and Secret Key
- 🌎 Select AWS Region
- ⚡ System generates temporary session credentials via STS

## 🛡️ Security

- 🔐 AWS STS integration for secure authentication
- ⏳ Temporary session tokens
- 👥 IAM role-based access control
- 🚫 No credential storage

## 🛠️ Technical Stack

- 🎯 **Frontend:** Next.js 15
- 🔧 **Backend:** Spring Boot (Java 17)
- ☁️ **AWS Services:** S3, STS
- 🔒 **Security:** Role-based authentication

## 📚 Documentation

Comprehensive guides and API references available on our [GitHub Wiki](https://github.com/xanderbilla/nebulas3/wiki)

## 💬 Support

- 🐛 GitHub Issues: [Create an issue](https://github.com/xanderbilla/nebulas3/issues)
- 📧 Email: [vikas99blr@gmail.com](mailto:vikas99blr@gmail.com)

## 👨‍💻 Author

[Vikas Singh](https://xanderbilla.com)
63 changes: 63 additions & 0 deletions app/(main)/buckets/layout.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
import { Metadata, Viewport } from "next";
import dynamic from "next/dynamic";
import DashboardNavSkeleton from "@/components/custom-ui/skeleton/DashboardNavSkeleton";
import BackgroundShape from "@/components/custom-ui/home/BackgroundShape";

export const viewport: Viewport = {
width: "device-width",
initialScale: 1,
};

export const metadata: Metadata = {
title: "Buckets | Nebula S3",
description:
"Manage and organize your S3 buckets with Nebula S3. Create, monitor, and maintain your cloud storage buckets efficiently.",
keywords: [
"S3 Buckets",
"Cloud Storage",
"Bucket Management",
"Storage Organization",
"Cloud Infrastructure",
"Data Storage",
"Bucket Monitoring",
"Storage Analytics",
],
authors: [{ name: "Nebula S3 Team" }],
robots: "index, follow",
openGraph: {
type: "website",
locale: "en_US",
url: "https://nebula-s3.com/buckets",
title: "NEBULA S3 BUCKETS",
description:
"Manage and organize your S3 buckets with Nebula S3. Create, monitor, and maintain your cloud storage buckets efficiently.",
siteName: "NEBULA S3",
},
twitter: {
card: "summary_large_image",
title: "NEBULA S3 BUCKETS",
description:
"Manage and organize your S3 buckets with Nebula S3. Create, monitor, and maintain your cloud storage buckets efficiently.",
creator: "@nebulas3",
},
};

const DashboardNav = dynamic(() => import("@/components/layout/DashboardNav"), {
loading: () => <DashboardNavSkeleton />,
});

export default function BucketsLayout({
children,
}: {
readonly children: React.ReactNode;
}) {
return (
<div className="min-h-screen bg-background relative overflow-hidden">
<BackgroundShape variant="default" />
<DashboardNav />
<main className="container mx-auto px-4 py-6 relative z-5">
{children}
</main>
</div>
);
}
102 changes: 102 additions & 0 deletions app/(main)/buckets/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
"use client";

import { useState, Suspense, useEffect } from "react";
import dynamic from "next/dynamic";
import BucketHeaderSkeleton from "@/components/custom-ui/skeleton/bucket-header-skeleton";
import BucketFiltersSkeleton from "@/components/custom-ui/skeleton/bucket-filters-skeleton";
import BucketGridSkeleton from "@/components/custom-ui/skeleton/bucket-grid-skeleton";

// Dynamic imports with skeleton loading states
const BucketHeader = dynamic(
() => import("@/components/custom-ui/bucket-component/bucket-header"),
{
loading: () => <BucketHeaderSkeleton />,
ssr: false,
}
);

const BucketFilters = dynamic(
() => import("@/components/custom-ui/bucket-component/bucket-filters"),
{
loading: () => <BucketFiltersSkeleton />,
ssr: false,
}
);

const BucketGrid = dynamic(
() => import("@/components/custom-ui/bucket-component/bucket-grid"),
{
loading: () => <BucketGridSkeleton />,
ssr: false,
}
);

// Static mock data
import { mockBuckets } from "@/static/buckets";

export default function BucketsPage() {
const [mounted, setMounted] = useState(false);
const [searchQuery, setSearchQuery] = useState("");
const [activeFilter, setActiveFilter] = useState<"size" | "date" | null>(
null
);

useEffect(() => {
setMounted(true);
}, []);

const filteredBuckets = mockBuckets
.filter((bucket) =>
bucket.bucketName.toLowerCase().includes(searchQuery.toLowerCase())
)
.sort((a, b) => {
if (activeFilter === "size") {
const sizeA = parseFloat(a.size);
const sizeB = parseFloat(b.size);
return sizeB - sizeA;
} else if (activeFilter === "date") {
return b.createdOn.getTime() - a.createdOn.getTime();
}
return 0;
});

const handleBucketDelete = (bucketId: string) => {
// Implement delete functionality
console.log("Delete bucket:", bucketId);
};

if (!mounted) {
return (
<div className="container mx-auto px-4 py-8">
<div className="space-y-6">
<BucketHeaderSkeleton />
<BucketFiltersSkeleton />
<BucketGridSkeleton />
</div>
</div>
);
}

return (
<div className="container mx-auto px-4 py-8">
<div className="space-y-6">
<Suspense fallback={<BucketHeaderSkeleton />}>
<BucketHeader />
</Suspense>

<Suspense fallback={<BucketFiltersSkeleton />}>
<BucketFilters
searchTerm={searchQuery}
setSearchTerm={setSearchQuery}
activeFilter={activeFilter}
setActiveFilter={setActiveFilter}
/>
</Suspense>

<Suspense fallback={<BucketGridSkeleton />}>
<BucketGrid buckets={filteredBuckets} onDelete={handleBucketDelete} />
</Suspense>
</div>
</div>
);
}
57 changes: 57 additions & 0 deletions app/(main)/dashboard/layout.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
import { Metadata, Viewport } from "next";
import dynamic from "next/dynamic";
import DashboardNavSkeleton from "@/components/custom-ui/skeleton/DashboardNavSkeleton";
import BackgroundShape from "@/components/custom-ui/home/BackgroundShape";
import Footer from "@/components/layout/Footer";

export const viewport: Viewport = {
width: "device-width",
initialScale: 1,
};

export const metadata: Metadata = {
title: "DASHBOARD | NEBULA S3",
description: "Manage your S3 buckets and objects with Nebula S3 dashboard",
keywords: [
"S3",
"Storage",
"Dashboard",
"Cloud Storage",
"Bucket Management",
],
authors: [{ name: "Nebula S3 Team" }],
robots: "index, follow",
openGraph: {
type: "website",
locale: "en_US",
url: "https://nebula-s3.com/dashboard",
title: "NEBULA S3 DASHBOARD",
description: "Manage your S3 buckets and objects with Nebula S3 dashboard",
siteName: "NEBULA S3",
},
twitter: {
card: "summary_large_image",
title: "NEBULA S3 DASHBOARD",
description: "Manage your S3 buckets and objects with Nebula S3 dashboard",
creator: "@nebulas3",
},
};

const DashboardNav = dynamic(() => import("@/components/layout/DashboardNav"), {
loading: () => <DashboardNavSkeleton />,
});

export default function DashboardLayout({
children,
}: {
readonly children: React.ReactNode;
}) {
return (
<div className="min-h-screen bg-background relative overflow-hidden">
<BackgroundShape variant="default" />
<DashboardNav />
<main className="container mx-auto px-4 py-6">{children}</main>
<Footer />
</div>
);
}
15 changes: 15 additions & 0 deletions app/(main)/dashboard/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { Suspense } from "react";
import DashboardSkeleton from "@/components/custom-ui/skeleton/DashboardSkeleton";
import DashboardContent from "@/components/custom-ui/dashboard/DashboardContent";

export default function DashboardPage() {
return (
<>
<main className="container mx-auto p-6 min-h-[calc(100vh-9rem)]">
<Suspense fallback={<DashboardSkeleton />}>
<DashboardContent />
</Suspense>
</main>
</>
);
}
Loading
Loading