Skip to content

Commit 92bb75c

Browse files
authored
fix(types): add support for data-* attributes in button props (#58)
- Extend ButtonHTMLAttributes to support custom data-* attributes - Update type definitions in CodeEditor and Renderer components - Ensure type safety while allowing flexible data attributes
1 parent d47e31f commit 92bb75c

File tree

6 files changed

+36
-21
lines changed

6 files changed

+36
-21
lines changed

docs/index.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ const App = () => {
3131
return <div>Footer</div>;
3232
}}
3333
copyButtonProps={{
34+
'data-appearence': 'subtle',
3435
className: 'rs-btn-icon rs-btn-icon-circle rs-btn rs-btn-subtle rs-btn-xs'
3536
}}
3637
>

src/CodeEditor.tsx

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@ import CopyCodeButton from './CopyCodeButton';
44
export interface CodeEditorProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {
55
code?: string;
66
editorConfig?: EditorConfiguration;
7-
copyCodeButtonAs?: React.ElementType;
7+
copyButtonAs?: React.ElementType;
8+
copyButtonProps?: React.HTMLAttributes<HTMLButtonElement> & {
9+
[key: `data-${string}`]: string;
10+
};
811
onChange?: (code?: string) => void;
912
onInitialized?: (editor: EditorFromTextArea) => void;
1013
}
@@ -30,7 +33,8 @@ async function importCodeMirror() {
3033
}
3134

3235
const CodeEditor = React.forwardRef((props: CodeEditorProps, ref: React.Ref<HTMLDivElement>) => {
33-
const { code, editorConfig, copyCodeButtonAs, onChange, onInitialized, ...rest } = props;
36+
const { code, editorConfig, copyButtonAs, copyButtonProps, onChange, onInitialized, ...rest } =
37+
props;
3438

3539
const textareaRef = useRef<HTMLTextAreaElement>(null);
3640
const editor = useRef<EditorFromTextArea | null>(null);
@@ -68,11 +72,7 @@ const CodeEditor = React.forwardRef((props: CodeEditorProps, ref: React.Ref<HTML
6872

6973
return (
7074
<div ref={ref} {...rest}>
71-
<CopyCodeButton
72-
as={copyCodeButtonAs}
73-
className="rs-btn-icon rs-btn-icon-circle rs-btn rs-btn-subtle rs-btn-xs"
74-
code={code?.trim()}
75-
/>
75+
<CopyCodeButton as={copyButtonAs} code={code?.trim()} {...copyButtonProps} />
7676
{!initialized && <div className="rcv-editor-loader">Editor initializing ...</div>}
7777
<textarea ref={textareaRef} defaultValue={code?.trim()} />
7878
</div>

src/CodeView.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ export interface CodeViewProps extends RendererProps {
1111
sourceCode?: string;
1212

1313
/** The properties of the copy button */
14-
copyButtonProps?: React.HTMLAttributes<HTMLButtonElement>;
14+
copyButtonProps?: React.ButtonHTMLAttributes<HTMLButtonElement> & {
15+
[key: `data-${string}`]: string;
16+
};
1517
}
1618

1719
const CodeView = React.forwardRef((props: CodeViewProps, ref: React.Ref<HTMLDivElement>) => {
@@ -23,6 +25,7 @@ const CodeView = React.forwardRef((props: CodeViewProps, ref: React.Ref<HTMLDivE
2325
theme = 'light',
2426
editable,
2527
transformOptions,
28+
copyButtonAs,
2629
copyButtonProps,
2730
renderToolbar,
2831
onChange,
@@ -57,6 +60,8 @@ const CodeView = React.forwardRef((props: CodeViewProps, ref: React.Ref<HTMLDivE
5760
onCloseEditor={onCloseEditor}
5861
beforeCompile={beforeCompile}
5962
renderExtraFooter={renderExtraFooter}
63+
copyButtonProps={copyButtonProps}
64+
copyButtonAs={copyButtonAs}
6065
/>
6166
);
6267
} else if (fragment.type === 'html') {

src/CopyCodeButton.tsx

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useState } from 'react';
1+
import React, { useState, useCallback } from 'react';
22
import copy from 'copy-to-clipboard';
33
import CopyIcon from './icons/Copy';
44
import CheckIcon from './icons/Check';
@@ -12,18 +12,19 @@ function CopyCodeButton(props: CopyCodeButtonProps) {
1212
const { as: Component = 'button', code, ...rest } = props;
1313
const [copied, setCopied] = useState(false);
1414

15-
if (!code) {
16-
return null;
17-
}
18-
19-
const handleClick = () => {
15+
const handleClick = useCallback(() => {
16+
if (!code) {
17+
return;
18+
}
2019
setCopied(true);
2120
copy(code);
2221

23-
setTimeout(() => {
24-
setCopied(false);
25-
}, 2000);
26-
};
22+
setTimeout(() => setCopied(false), 2000);
23+
}, [code]);
24+
25+
if (!code) {
26+
return null;
27+
}
2728

2829
return (
2930
<Component data-type="copy" onClick={handleClick} {...rest}>

src/MarkdownRenderer.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ interface MarkdownRendererProps extends React.HTMLAttributes<HTMLDivElement> {
1010
* Markdown content as HTML string
1111
*/
1212
children?: string | null;
13+
1314
/**
1415
* Props to be passed to the copy button
1516
*/

src/Renderer.tsx

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,12 @@ export interface RendererProps extends Omit<React.HTMLAttributes<HTMLElement>, '
3636
code?: string;
3737

3838
/** The component used to render the copy button */
39-
copyCodeButtonAs?: React.ElementType;
39+
copyButtonAs?: React.ElementType;
40+
41+
/** The properties of the copy button */
42+
copyButtonProps?: React.ButtonHTMLAttributes<HTMLButtonElement> & {
43+
[key: `data-${string}`]: string;
44+
};
4045

4146
/** Dependent objects required by the executed code */
4247
dependencies?: Record<string, unknown>;
@@ -87,7 +92,8 @@ const Renderer = React.forwardRef((props: RendererProps, ref: React.Ref<HTMLDivE
8792
editable: isEditable = false,
8893
transformOptions = defaultTransformOptions,
8994
code,
90-
copyCodeButtonAs,
95+
copyButtonAs,
96+
copyButtonProps,
9197
renderToolbar,
9298
renderExtraFooter,
9399
onOpenEditor,
@@ -209,7 +215,8 @@ const Renderer = React.forwardRef((props: RendererProps, ref: React.Ref<HTMLDivE
209215
<CodeEditor
210216
{...editorProps}
211217
key="jsx"
212-
copyCodeButtonAs={copyCodeButtonAs}
218+
copyButtonAs={copyButtonAs}
219+
copyButtonProps={copyButtonProps}
213220
onChange={handleCodeChange}
214221
className={classNames(editorClassName, 'rcv-editor')}
215222
editorConfig={{ lineNumbers: true, theme: `base16-${theme}` }}

0 commit comments

Comments
 (0)