Some checks failed
ci / Validate workspace (push) Successful in 12m32s
landing-page-ci / Validate landing page (push) Successful in 9m41s
landing-page-deploy / Deploy landing page (push) Failing after 5m23s
github-metrics / Generate repository metrics SVG (push) Failing after 2m6s
refresh-contributors-wall / Refresh contributors wall cache bust (push) Failing after 12s
This repository contains the open-design daemon CLI source code, built and packaged at https://helix-mind.ai/cli/open-design/latest.tgz for use by the HelixMind /design slash command. Licenses: Apache-2.0 (root) + MIT (skills/*)
60 lines
1.8 KiB
TypeScript
60 lines
1.8 KiB
TypeScript
import { useState } from 'react';
|
|
import { useT } from '../i18n';
|
|
|
|
interface Props {
|
|
onSave: (name: string, content: string) => void;
|
|
onClose: () => void;
|
|
}
|
|
|
|
export function PasteTextDialog({ onSave, onClose }: Props) {
|
|
const t = useT();
|
|
const [name, setName] = useState('');
|
|
const [content, setContent] = useState('');
|
|
|
|
function commit() {
|
|
const trimmed = content.trim();
|
|
if (!trimmed) return;
|
|
const finalName = name.trim() || `paste-${Date.now()}.txt`;
|
|
onSave(ensureExtension(finalName, '.txt'), content);
|
|
}
|
|
|
|
return (
|
|
<div className="modal-backdrop" onClick={onClose}>
|
|
<div className="modal" onClick={(e) => e.stopPropagation()}>
|
|
<h2>{t('pasteDialog.title')}</h2>
|
|
<p className="hint">{t('pasteDialog.hint')}</p>
|
|
<label>
|
|
{t('pasteDialog.fileNameLabel')}
|
|
<input
|
|
type="text"
|
|
value={name}
|
|
placeholder={t('pasteDialog.namePlaceholder')}
|
|
onChange={(e) => setName(e.target.value)}
|
|
autoFocus
|
|
/>
|
|
</label>
|
|
<label>
|
|
{t('pasteDialog.contentLabel')}
|
|
<textarea
|
|
rows={10}
|
|
value={content}
|
|
placeholder={t('pasteDialog.contentPlaceholder')}
|
|
onChange={(e) => setContent(e.target.value)}
|
|
/>
|
|
</label>
|
|
<div className="row">
|
|
<button onClick={onClose}>{t('pasteDialog.cancel')}</button>
|
|
<button className="primary" onClick={commit} disabled={!content.trim()}>
|
|
{t('pasteDialog.save')}
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
function ensureExtension(name: string, ext: string): string {
|
|
if (/\.[a-z0-9]+$/i.test(name)) return name;
|
|
return `${name}${ext}`;
|
|
}
|