mirror of
https://github.com/AutoMaker-Org/automaker.git
synced 2026-02-03 08:53:36 +00:00
Extract all "Enhance with AI" functionality into reusable shared components following DRY principles and clean code guidelines. Changes: - Create shared/enhancement/ folder for related functionality - Extract EnhanceWithAI component (AI enhancement with model override) - Extract EnhancementHistoryButton component (version history UI) - Extract enhancement constants and types - Refactor add-feature-dialog.tsx to use shared components - Refactor edit-feature-dialog.tsx to use shared components - Refactor follow-up-dialog.tsx to use shared components - Add history tracking to add-feature-dialog for consistency Benefits: - Eliminated ~527 lines of duplicated code - Single source of truth for enhancement logic - Consistent UX across all dialogs - Easier maintenance and extensibility - Better code organization Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
68 lines
2.0 KiB
TypeScript
68 lines
2.0 KiB
TypeScript
import { useState, useCallback } from 'react';
|
|
import { Feature } from '@/store/app-store';
|
|
import {
|
|
FeatureImagePath as DescriptionImagePath,
|
|
ImagePreviewMap,
|
|
} from '@/components/ui/description-image-dropzone';
|
|
import type { FollowUpHistoryEntry } from '../dialogs/follow-up-dialog';
|
|
|
|
/**
|
|
* Custom hook for managing follow-up dialog state including prompt history
|
|
*/
|
|
export function useFollowUpState() {
|
|
const [showFollowUpDialog, setShowFollowUpDialog] = useState(false);
|
|
const [followUpFeature, setFollowUpFeature] = useState<Feature | null>(null);
|
|
const [followUpPrompt, setFollowUpPrompt] = useState('');
|
|
const [followUpImagePaths, setFollowUpImagePaths] = useState<DescriptionImagePath[]>([]);
|
|
const [followUpPreviewMap, setFollowUpPreviewMap] = useState<ImagePreviewMap>(() => new Map());
|
|
const [followUpPromptHistory, setFollowUpPromptHistory] = useState<FollowUpHistoryEntry[]>([]);
|
|
|
|
const resetFollowUpState = useCallback(() => {
|
|
setShowFollowUpDialog(false);
|
|
setFollowUpFeature(null);
|
|
setFollowUpPrompt('');
|
|
setFollowUpImagePaths([]);
|
|
setFollowUpPreviewMap(new Map());
|
|
setFollowUpPromptHistory([]);
|
|
}, []);
|
|
|
|
const handleFollowUpDialogChange = useCallback(
|
|
(open: boolean) => {
|
|
if (!open) {
|
|
resetFollowUpState();
|
|
} else {
|
|
setShowFollowUpDialog(open);
|
|
}
|
|
},
|
|
[resetFollowUpState]
|
|
);
|
|
|
|
/**
|
|
* Adds a new entry to the prompt history
|
|
*/
|
|
const addToPromptHistory = useCallback((entry: FollowUpHistoryEntry) => {
|
|
setFollowUpPromptHistory((prev) => [...prev, entry]);
|
|
}, []);
|
|
|
|
return {
|
|
// State
|
|
showFollowUpDialog,
|
|
followUpFeature,
|
|
followUpPrompt,
|
|
followUpImagePaths,
|
|
followUpPreviewMap,
|
|
followUpPromptHistory,
|
|
// Setters
|
|
setShowFollowUpDialog,
|
|
setFollowUpFeature,
|
|
setFollowUpPrompt,
|
|
setFollowUpImagePaths,
|
|
setFollowUpPreviewMap,
|
|
setFollowUpPromptHistory,
|
|
// Helpers
|
|
resetFollowUpState,
|
|
handleFollowUpDialogChange,
|
|
addToPromptHistory,
|
|
};
|
|
}
|