Files
gitbook/packages/react-contentkit/src/ElementButton.tsx
T
Samy Pessé 70c6c9df42 First pass at implementing ContentKit (#69)
* Start

* Try webframe

* Lint and format

* Move to package

* Continue

* Implement card and cleanup contexts

* Start code blocks

* Start rendering image

* Continue with card

* Start stack

* Start text

* Start modal

* Format

* Continue

* Fix TS errors

* Cleanup

* Make markdown work with server components

* Format

* Add visual test

* Lint and format

* Fix lifecycle

* Implement textinput

* Divider

* Remove console logs

* Remove listSpaceIntegrationsBlocks
2024-02-28 14:46:47 +01:00

54 lines
1.5 KiB
TypeScript

'use client';
import { ContentKitButton } from '@gitbook/api';
import { ContentKitClientElementProps } from './types';
import classNames from 'classnames';
import { useContentKitClientContext } from './context';
import React from 'react';
export function ElementButton(
props: ContentKitClientElementProps<ContentKitButton> & {
icon: React.ReactNode | null;
trailingIcon: React.ReactNode | null;
},
) {
const { element, icon, trailingIcon } = props;
const clientContext = useContentKitClientContext();
const [loading, setLoading] = React.useState(false);
// TODO:
// - loading
// - confirm
return (
<button
title={element.tooltip}
className={classNames(
'contentkit-button',
`contentkit-button-style-${element.style ?? 'secondary'}`,
loading ? 'contentkit-button-loading' : null,
)}
onClick={(event) => {
if (element.disabled || loading) {
return;
}
event.stopPropagation();
setLoading(true);
clientContext.dispatchAction(element.onPress).finally(() => {
setLoading(false);
});
}}
>
{icon}
{element.label ? (
<span className="contentkit-button-label">{element.label}</span>
) : null}
{trailingIcon}
</button>
);
}