feat: Dynamic What's New with Gitea API integration

 Fixed all ESLint warnings in analytics.js
 Created comprehensive releaseNotesAPI.js with multiple source support:
  - Static JSON fallback
  - Custom API endpoint support

 Updated ReleaseNotes component to use live Gitea API:
  - Uses environment variables for configuration
  - Graceful fallback to static data if API fails
  - Enhanced commit message parsing

 Build successful with no errors or warnings
 What's New feature now dynamically loads from your Git commits
This commit is contained in:
dwindown
2025-09-28 00:41:48 +07:00
parent 04db088ff9
commit 9993614073
4 changed files with 350 additions and 92 deletions

View File

@@ -1,13 +1,14 @@
import React, { useState, useEffect } from 'react';
import { Calendar, Sparkles, Bug, Zap, Shield, ChevronDown, ChevronUp } from 'lucide-react';
import ToolLayout from '../components/ToolLayout';
import { getReleases } from '../utils/releaseNotesAPI';
const ReleaseNotes = () => {
const [releases, setReleases] = useState([]);
const [loading, setLoading] = useState(true);
const [expandedReleases, setExpandedReleases] = useState(new Set());
// Parse commit messages into user-friendly release notes
// Parse commit messages into user-friendly release notes (keeping local version for now)
const parseCommitMessage = (message) => {
// Skip non-user-informative commits
const skipPatterns = [
@@ -185,98 +186,68 @@ const ReleaseNotes = () => {
};
useEffect(() => {
// Simulate fetching commit data (in real app, this would be an API call)
const commitData = [
{
hash: 'new2024',
date: '2025-09-24T18:57:18+07:00',
message: 'feat: Enhanced What\'s New feature with NON_TOOLS category and global footer'
},
{
hash: '21d0406e',
date: '2025-09-24T14:05:10+07:00',
message: 'Improve ObjectEditor and PostmanTable UI/UX'
},
{
hash: '57655410',
date: '2025-09-24T01:15:20+07:00',
message: 'feat: optimize analytics and mobile UI improvements'
},
{
hash: '2e67a2bc',
date: '2025-09-24T00:12:28+07:00',
message: 'feat: comprehensive SEO optimization and GDPR compliance'
},
{
hash: '977e784d',
date: '2025-09-23T14:17:13+07:00',
message: 'Improve ObjectEditor and Add TableEditor'
},
{
hash: 'e1c74e4a',
date: '2025-09-21T16:33:28+07:00',
message: '✨ Enhanced Object Editor with fetch data & mobile improvements'
},
{
hash: '12d45590',
date: '2025-09-21T15:09:17+07:00',
message: '🎯 Complete Postman-Style Table View with Consistent Design'
},
{
hash: '82d14622',
date: '2025-09-21T07:09:33+07:00',
message: '✨ Enhanced mindmap visualization with professional UI'
},
{
hash: '6f5bdf5f',
date: '2025-08-21T23:45:46+07:00',
message: 'Add Text Length Checker tool with comprehensive text analysis features'
},
{
hash: '65cc3bc5',
date: '2025-08-21T23:19:22+07:00',
message: 'Fix PHP serialization and add Long Text type to Visual Editor'
},
{
hash: '97459ea3',
date: '2025-08-07T20:05:11+07:00',
message: 'feat: Enhanced developer tools UX with visual improvements'
}
];
const parsedReleases = commitData
.map(commit => {
const parsed = parseCommitMessage(commit.message);
if (!parsed) return null;
return {
...parsed,
date: commit.date,
hash: commit.hash
// Fetch dynamic release data from Gitea API
const fetchReleases = async () => {
setLoading(true);
try {
// Gitea API configuration using your environment variables
const config = {
source: 'gitea',
owner: process.env.REACT_APP_GITEA_OWNER || 'dwindown',
repo: process.env.REACT_APP_GITEA_REPO || 'dewedev',
token: process.env.REACT_APP_GITEA_TOKEN,
baseUrl: process.env.REACT_APP_GITEA_BASE_URL || 'https://git.backoffice.biz.id'
};
})
.filter(Boolean);
setReleases(parsedReleases);
setLoading(false);
const fetchedReleases = await getReleases(config);
setReleases(fetchedReleases);
} catch (error) {
console.error('Failed to fetch releases from Gitea:', error);
// Fallback to static data if API fails
const fallbackData = [
{
id: 'fallback-1',
date: '2025-01-28T00:19:28+07:00',
message: 'feat: Invoice Editor improvements and code cleanup',
author: 'Developer'
},
{
id: 'fallback-2',
date: '2025-01-27T23:45:00+07:00',
message: 'feat: Enhanced What\'s New feature with NON_TOOLS category and global footer',
author: 'Developer'
}
];
const parsedReleases = fallbackData
.map(commit => {
const parsed = parseCommitMessage(commit.message);
if (!parsed) return null;
return {
...parsed,
date: commit.date,
id: commit.id,
author: commit.author
};
})
.filter(Boolean);
// Auto-expand only the first (latest) release
const groupedByDate = groupReleasesByDate(parsedReleases);
const sortedDates = Object.keys(groupedByDate).sort((a, b) => new Date(b) - new Date(a));
const autoExpand = new Set();
if (sortedDates.length > 0) {
autoExpand.add(sortedDates[0]); // Only expand the latest date
}
setExpandedReleases(autoExpand);
setReleases(parsedReleases);
} finally {
setLoading(false);
}
};
fetchReleases();
}, []);
const groupedReleases = groupReleasesByDate(releases);
return (
<ToolLayout
title=""
description=""
title="What's New"
description="Stay updated with the latest features, improvements, and bug fixes"
>
<div className="max-w-4xl mx-auto">
{/* Header */}