Fix admin reference mode regressions
This commit is contained in:
@@ -14,6 +14,8 @@ interface ThemeCustomizerEnhancedProps {
|
||||
isPreviewMode?: boolean;
|
||||
showGalleryLayouts?: boolean;
|
||||
hideActions?: boolean;
|
||||
onApply?: (theme: ThemeConfig, metadata: { presetName: string }) => Promise<void> | void;
|
||||
isApplying?: boolean;
|
||||
}
|
||||
|
||||
const layoutIcons: Record<GalleryLayoutType, React.ReactNode> = {
|
||||
@@ -34,7 +36,9 @@ export const ThemeCustomizerEnhanced: React.FC<ThemeCustomizerEnhancedProps> = (
|
||||
onPresetChange,
|
||||
isPreviewMode = false,
|
||||
showGalleryLayouts = true,
|
||||
hideActions = false
|
||||
hideActions = false,
|
||||
onApply,
|
||||
isApplying = false
|
||||
}) => {
|
||||
const { t } = useTranslation();
|
||||
const [localTheme, setLocalTheme] = useState<ThemeConfig>(value);
|
||||
@@ -80,8 +84,13 @@ export const ThemeCustomizerEnhanced: React.FC<ThemeCustomizerEnhancedProps> = (
|
||||
}
|
||||
};
|
||||
|
||||
const handleApply = () => {
|
||||
onChange({ ...localTheme, customCss });
|
||||
const handleApply = async () => {
|
||||
const themeWithCss = { ...localTheme, customCss };
|
||||
onChange(themeWithCss);
|
||||
|
||||
if (onApply) {
|
||||
await onApply(themeWithCss, { presetName: selectedPreset });
|
||||
}
|
||||
};
|
||||
|
||||
const handleReset = () => {
|
||||
@@ -587,11 +596,12 @@ export const ThemeCustomizerEnhanced: React.FC<ThemeCustomizerEnhancedProps> = (
|
||||
variant="primary"
|
||||
leftIcon={<Palette className="w-4 h-4" />}
|
||||
onClick={handleApply}
|
||||
disabled={isApplying}
|
||||
>
|
||||
{t('branding.applyTheme')}
|
||||
{isApplying ? t('common.applying', 'Applying...') : t('branding.applyTheme')}
|
||||
</Button>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
};
|
||||
|
||||
@@ -0,0 +1,70 @@
|
||||
import { render, screen } from '@testing-library/react';
|
||||
import userEvent from '@testing-library/user-event';
|
||||
import { vi } from 'vitest';
|
||||
|
||||
import { ThemeCustomizerEnhanced } from '../ThemeCustomizerEnhanced';
|
||||
import type { ThemeConfig } from '../../../types/theme.types';
|
||||
|
||||
vi.mock('react-i18next', async () => {
|
||||
const actual = await vi.importActual<typeof import('react-i18next')>('react-i18next');
|
||||
return {
|
||||
...actual,
|
||||
useTranslation: () => ({
|
||||
t: (_key: string, fallback?: string) => fallback ?? _key
|
||||
})
|
||||
};
|
||||
});
|
||||
|
||||
describe('ThemeCustomizerEnhanced', () => {
|
||||
const baseTheme: ThemeConfig = {
|
||||
primaryColor: '#000000',
|
||||
accentColor: '#ffffff',
|
||||
backgroundColor: '#eeeeee',
|
||||
textColor: '#111111',
|
||||
galleryLayout: 'grid',
|
||||
gallerySettings: {
|
||||
spacing: 'normal'
|
||||
}
|
||||
};
|
||||
|
||||
it('invokes onApply when Apply Theme is clicked', async () => {
|
||||
const user = userEvent.setup();
|
||||
const handleChange = vi.fn();
|
||||
const handleApply = vi.fn().mockResolvedValue(undefined);
|
||||
|
||||
render(
|
||||
<ThemeCustomizerEnhanced
|
||||
value={baseTheme}
|
||||
onChange={handleChange}
|
||||
presetName="default"
|
||||
onApply={handleApply}
|
||||
/>
|
||||
);
|
||||
|
||||
const applyButton = screen.getByRole('button', { name: /branding\.applyTheme/i });
|
||||
await user.click(applyButton);
|
||||
|
||||
expect(handleChange).toHaveBeenCalled();
|
||||
expect(handleApply).toHaveBeenCalledTimes(1);
|
||||
expect(handleApply).toHaveBeenCalledWith(
|
||||
expect.objectContaining({ primaryColor: '#000000' }),
|
||||
expect.objectContaining({ presetName: 'default' })
|
||||
);
|
||||
});
|
||||
|
||||
it('disables the Apply button while applying', () => {
|
||||
const handleChange = vi.fn();
|
||||
|
||||
render(
|
||||
<ThemeCustomizerEnhanced
|
||||
value={baseTheme}
|
||||
onChange={handleChange}
|
||||
presetName="default"
|
||||
isApplying={true}
|
||||
/>
|
||||
);
|
||||
|
||||
const applyButton = screen.getByRole('button', { name: /applying/i });
|
||||
expect(applyButton).toBeDisabled();
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user