Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
22 changes: 22 additions & 0 deletions src/screens/ConfigEditorScreen/ConfigEditorScreen.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,28 @@ describe('ConfigEditorScreen', () => {
localStorage.removeItem('newtab-config');
});

it('saves and closes on successful import', async () => {
const user = userEvent.setup();
const onSave = vi.fn();
const onClose = vi.fn();
render(<ConfigEditor {...defaultProps} onSave={onSave} onClose={onClose} />);

await user.click(screen.getByRole('button', { name: 'Import' }));

const modal = screen.getByText('Import Config').closest('.config-editor-modal')!;
const textarea = within(modal as HTMLElement).getByPlaceholderText('Paste exported base64 string here...');

const validConfig = JSON.stringify(mockConfig);
const encoded = btoa(validConfig);
await user.type(textarea, encoded);

const applyButton = within(modal as HTMLElement).getByRole('button', { name: 'Apply' });
await user.click(applyButton);

expect(onSave).toHaveBeenCalledWith(mockConfig);
expect(onClose).toHaveBeenCalled();
});

it('shows import error on invalid base64 input', async () => {
const user = userEvent.setup();
render(<ConfigEditor {...defaultProps} />);
Expand Down
20 changes: 2 additions & 18 deletions src/screens/ConfigEditorScreen/ConfigEditorScreen.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,6 @@ export function ConfigEditor({ config, onSave, onClose, onPreview }: ConfigEdito
const [copied, setCopied] = useState(false);
const [importString, setImportString] = useState('');
const [importError, setImportError] = useState('');
const [importSuccess, setImportSuccess] = useState(false);

const handleExport = () => {
if (activePanel === 'export') {
Expand Down Expand Up @@ -86,13 +85,11 @@ export function ConfigEditor({ config, onSave, onClose, onPreview }: ConfigEdito
}
setImportString('');
setImportError('');
setImportSuccess(false);
setActivePanel('import');
};

const handleImportApply = () => {
setImportError('');
setImportSuccess(false);

const trimmed = importString.trim();
if (!trimmed) {
Expand Down Expand Up @@ -122,23 +119,13 @@ export function ConfigEditor({ config, onSave, onClose, onPreview }: ConfigEdito
}

onSave(parsed);

const bg = parsed.background;
onPreview(bg ? {
imageUrl: bg.imageUrl,
opacity: bg.opacity ?? 0.5,
color: bg.color ?? '#000000',
gradient: bg.gradient,
} : undefined);

setImportSuccess(true);
onClose();
};

const closePanel = () => {
setActivePanel('none');
setImportString('');
setImportError('');
setImportSuccess(false);
setCopied(false);
};

Expand Down Expand Up @@ -229,16 +216,13 @@ export function ConfigEditor({ config, onSave, onClose, onPreview }: ConfigEdito
<textarea
className="config-editor-textarea"
value={importString}
onChange={(e) => { setImportString(e.target.value); setImportError(''); setImportSuccess(false); }}
onChange={(e) => { setImportString(e.target.value); setImportError(''); }}
rows={5}
placeholder="Paste exported base64 string here..."
/>
{importError && (
<div className="config-editor-ie-error">{importError}</div>
)}
{importSuccess && (
<div className="config-editor-ie-success">Config applied successfully.</div>
)}
<button
className="config-editor-btn config-editor-btn-apply"
onClick={handleImportApply}
Expand Down