feat: Enhanced release notes system, fixed invoice installments, and improved logo integration

- Updated release notes to use new JSON structure with individual commit timestamps
- Removed hash display from release notes for cleaner UI
- Fixed automatic recalculation of percentage-based installments in Invoice Editor and Preview
- Integrated custom logo.svg in header and footer with cleaner styling
- Moved all data files to /public/data/ for better organization
- Cleaned up unused release data files and improved file structure
This commit is contained in:
dwindown
2025-09-28 17:14:54 +07:00
parent 9993614073
commit 78570f04f0
20 changed files with 712 additions and 395 deletions

View File

@@ -1,7 +1,6 @@
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([]);
@@ -9,6 +8,7 @@ const ReleaseNotes = () => {
const [expandedReleases, setExpandedReleases] = useState(new Set());
// Parse commit messages into user-friendly release notes (keeping local version for now)
// eslint-disable-next-line no-unused-vars
const parseCommitMessage = (message) => {
// Skip non-user-informative commits
const skipPatterns = [
@@ -186,54 +186,31 @@ const ReleaseNotes = () => {
};
useEffect(() => {
// Fetch dynamic release data from Gitea API
// Load release data from commits.json
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'
};
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 response = await fetch('/data/commits.json');
const data = await response.json();
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);
setReleases(parsedReleases);
// Transform changelog data to release format
const releases = [];
data.changelog.forEach(dateEntry => {
dateEntry.changes.forEach(change => {
releases.push({
id: `${dateEntry.date}-${change.type}-${change.title.replace(/\s+/g, '-')}`,
date: change.datetime || dateEntry.date, // Use datetime if available, fallback to date
type: change.type,
title: change.title,
description: change.description
});
});
});
setReleases(releases);
} catch (error) {
console.error('Failed to load commits.json:', error);
setReleases([]);
} finally {
setLoading(false);
}
@@ -351,7 +328,6 @@ const ReleaseNotes = () => {
minute: '2-digit'
})}
</span>
<span>#{release.hash}</span>
</div>
</div>
</div>