mirror of
https://github.com/Redocly/redoc.git
synced 2025-08-05 21:00:18 +03:00
feat: add option for display request method in webhook
This commit is contained in:
parent
1f417d67c6
commit
b2d8ef7312
|
@ -18,6 +18,7 @@ import { ResponsesList } from '../Responses/ResponsesList';
|
|||
import { ResponseSamples } from '../ResponseSamples/ResponseSamples';
|
||||
import { SecurityRequirements } from '../SecurityRequirement/SecurityRequirement';
|
||||
import { SECTION_ATTR } from '../../services';
|
||||
import { titleize } from '../../utils/helpers';
|
||||
|
||||
const Description = styled.div`
|
||||
margin-bottom: ${({ theme }) => theme.spacing.unit * 6}px;
|
||||
|
@ -27,48 +28,48 @@ export interface OperationProps {
|
|||
operation: OperationModel;
|
||||
}
|
||||
|
||||
@observer
|
||||
export class Operation extends React.Component<OperationProps> {
|
||||
render() {
|
||||
const { operation } = this.props;
|
||||
|
||||
const { name: summary, description, deprecated, externalDocs, isWebhook } = operation;
|
||||
const hasDescription = !!(description || externalDocs);
|
||||
|
||||
return (
|
||||
<OptionsContext.Consumer>
|
||||
{options => (
|
||||
<Row {...{ [SECTION_ATTR]: operation.operationHash }} id={operation.operationHash}>
|
||||
<MiddlePanel>
|
||||
<H2>
|
||||
<ShareLink to={operation.id} />
|
||||
{summary} {deprecated && <Badge type="warning"> Deprecated </Badge>}
|
||||
{isWebhook && <Badge type="primary"> Webhook </Badge>}
|
||||
</H2>
|
||||
{options.pathInMiddlePanel && !isWebhook && (
|
||||
<Endpoint operation={operation} inverted={true} />
|
||||
export const Operation = observer(({ operation }: OperationProps): JSX.Element => {
|
||||
const { name: summary, description, deprecated, externalDocs, isWebhook, httpVerb } = operation;
|
||||
const hasDescription = !!(description || externalDocs);
|
||||
const { showWebhookVerb } = React.useContext(OptionsContext);
|
||||
return (
|
||||
<OptionsContext.Consumer>
|
||||
{options => (
|
||||
<Row {...{ [SECTION_ATTR]: operation.operationHash }} id={operation.operationHash}>
|
||||
<MiddlePanel>
|
||||
<H2>
|
||||
<ShareLink to={operation.id} />
|
||||
{summary} {deprecated && <Badge type="warning"> Deprecated </Badge>}
|
||||
{isWebhook && (
|
||||
<Badge type="primary">
|
||||
{' '}
|
||||
Webhook {showWebhookVerb && '| ' + titleize(httpVerb)}
|
||||
</Badge>
|
||||
)}
|
||||
{hasDescription && (
|
||||
<Description>
|
||||
{description !== undefined && <Markdown source={description} />}
|
||||
{externalDocs && <ExternalDocumentation externalDocs={externalDocs} />}
|
||||
</Description>
|
||||
)}
|
||||
<Extensions extensions={operation.extensions} />
|
||||
<SecurityRequirements securities={operation.security} />
|
||||
<Parameters parameters={operation.parameters} body={operation.requestBody} />
|
||||
<ResponsesList responses={operation.responses} />
|
||||
<CallbacksList callbacks={operation.callbacks} />
|
||||
</MiddlePanel>
|
||||
<DarkRightPanel>
|
||||
{!options.pathInMiddlePanel && !isWebhook && <Endpoint operation={operation} />}
|
||||
<RequestSamples operation={operation} />
|
||||
<ResponseSamples operation={operation} />
|
||||
<CallbackSamples callbacks={operation.callbacks} />
|
||||
</DarkRightPanel>
|
||||
</Row>
|
||||
)}
|
||||
</OptionsContext.Consumer>
|
||||
);
|
||||
}
|
||||
}
|
||||
</H2>
|
||||
{options.pathInMiddlePanel && !isWebhook && (
|
||||
<Endpoint operation={operation} inverted={true} />
|
||||
)}
|
||||
{hasDescription && (
|
||||
<Description>
|
||||
{description !== undefined && <Markdown source={description} />}
|
||||
{externalDocs && <ExternalDocumentation externalDocs={externalDocs} />}
|
||||
</Description>
|
||||
)}
|
||||
<Extensions extensions={operation.extensions} />
|
||||
<SecurityRequirements securities={operation.security} />
|
||||
<Parameters parameters={operation.parameters} body={operation.requestBody} />
|
||||
<ResponsesList responses={operation.responses} />
|
||||
<CallbacksList callbacks={operation.callbacks} />
|
||||
</MiddlePanel>
|
||||
<DarkRightPanel>
|
||||
{!options.pathInMiddlePanel && !isWebhook && <Endpoint operation={operation} />}
|
||||
<RequestSamples operation={operation} />
|
||||
<ResponseSamples operation={operation} />
|
||||
<CallbackSamples callbacks={operation.callbacks} />
|
||||
</DarkRightPanel>
|
||||
</Row>
|
||||
)}
|
||||
</OptionsContext.Consumer>
|
||||
);
|
||||
});
|
||||
|
|
|
@ -8,11 +8,13 @@ import { MenuItems } from './MenuItems';
|
|||
import { MenuItemLabel, MenuItemLi, MenuItemTitle, OperationBadge } from './styled.elements';
|
||||
import { l } from '../../services/Labels';
|
||||
import { scrollIntoViewIfNeeded } from '../../utils';
|
||||
import { OptionsContext } from '../OptionsProvider';
|
||||
|
||||
export interface MenuItemProps {
|
||||
item: IMenuItem;
|
||||
onActivate?: (item: IMenuItem) => void;
|
||||
withoutChildren?: boolean;
|
||||
children?: React.ReactChild;
|
||||
}
|
||||
|
||||
@observer
|
||||
|
@ -70,37 +72,33 @@ export class MenuItem extends React.Component<MenuItemProps> {
|
|||
|
||||
export interface OperationMenuItemContentProps {
|
||||
item: OperationModel;
|
||||
children?: React.ReactChild;
|
||||
}
|
||||
|
||||
@observer
|
||||
export class OperationMenuItemContent extends React.Component<OperationMenuItemContentProps> {
|
||||
ref = React.createRef<HTMLLabelElement>();
|
||||
export const OperationMenuItemContent = observer((props: OperationMenuItemContentProps) => {
|
||||
const { item } = props;
|
||||
const ref = React.createRef<HTMLLabelElement>();
|
||||
const { showWebhookVerb } = React.useContext(OptionsContext);
|
||||
|
||||
componentDidUpdate() {
|
||||
if (this.props.item.active && this.ref.current) {
|
||||
scrollIntoViewIfNeeded(this.ref.current);
|
||||
React.useEffect(() => {
|
||||
if (props.item.active && ref.current) {
|
||||
scrollIntoViewIfNeeded(ref.current);
|
||||
}
|
||||
}
|
||||
}, [props.item.active, ref]);
|
||||
|
||||
render() {
|
||||
const { item } = this.props;
|
||||
return (
|
||||
<MenuItemLabel
|
||||
depth={item.depth}
|
||||
active={item.active}
|
||||
deprecated={item.deprecated}
|
||||
ref={this.ref}
|
||||
>
|
||||
{item.isWebhook ? (
|
||||
<OperationBadge type="hook">{l('webhook')}</OperationBadge>
|
||||
) : (
|
||||
<OperationBadge type={item.httpVerb}>{shortenHTTPVerb(item.httpVerb)}</OperationBadge>
|
||||
)}
|
||||
<MenuItemTitle width="calc(100% - 38px)">
|
||||
{item.sidebarLabel}
|
||||
{this.props.children}
|
||||
</MenuItemTitle>
|
||||
</MenuItemLabel>
|
||||
);
|
||||
}
|
||||
}
|
||||
return (
|
||||
<MenuItemLabel depth={item.depth} active={item.active} deprecated={item.deprecated} ref={ref}>
|
||||
{item.isWebhook ? (
|
||||
<OperationBadge type="hook">
|
||||
{showWebhookVerb ? item.httpVerb : l('webhook')}
|
||||
</OperationBadge>
|
||||
) : (
|
||||
<OperationBadge type={item.httpVerb}>{shortenHTTPVerb(item.httpVerb)}</OperationBadge>
|
||||
)}
|
||||
<MenuItemTitle width="calc(100% - 38px)">
|
||||
{item.sidebarLabel}
|
||||
{props.children}
|
||||
</MenuItemTitle>
|
||||
</MenuItemLabel>
|
||||
);
|
||||
});
|
||||
|
|
|
@ -106,6 +106,7 @@ exports[`Components SchemaView discriminator should correctly render SchemaView
|
|||
"scrollYOffset": [Function],
|
||||
"showExtensions": false,
|
||||
"showObjectSchemaExamples": false,
|
||||
"showWebhookVerb": false,
|
||||
"sideNavStyle": "summary-only",
|
||||
"simpleOneOfTypeLabel": false,
|
||||
"sortEnumValuesAlphabetically": false,
|
||||
|
@ -360,6 +361,7 @@ exports[`Components SchemaView discriminator should correctly render SchemaView
|
|||
"scrollYOffset": [Function],
|
||||
"showExtensions": false,
|
||||
"showObjectSchemaExamples": false,
|
||||
"showWebhookVerb": false,
|
||||
"sideNavStyle": "summary-only",
|
||||
"simpleOneOfTypeLabel": false,
|
||||
"sortEnumValuesAlphabetically": false,
|
||||
|
@ -589,6 +591,7 @@ exports[`Components SchemaView discriminator should correctly render SchemaView
|
|||
"scrollYOffset": [Function],
|
||||
"showExtensions": false,
|
||||
"showObjectSchemaExamples": false,
|
||||
"showWebhookVerb": false,
|
||||
"sideNavStyle": "summary-only",
|
||||
"simpleOneOfTypeLabel": false,
|
||||
"sortEnumValuesAlphabetically": false,
|
||||
|
@ -885,6 +888,7 @@ exports[`Components SchemaView discriminator should correctly render SchemaView
|
|||
"scrollYOffset": [Function],
|
||||
"showExtensions": false,
|
||||
"showObjectSchemaExamples": false,
|
||||
"showWebhookVerb": false,
|
||||
"sideNavStyle": "summary-only",
|
||||
"simpleOneOfTypeLabel": false,
|
||||
"sortEnumValuesAlphabetically": false,
|
||||
|
@ -1139,6 +1143,7 @@ exports[`Components SchemaView discriminator should correctly render SchemaView
|
|||
"scrollYOffset": [Function],
|
||||
"showExtensions": false,
|
||||
"showObjectSchemaExamples": false,
|
||||
"showWebhookVerb": false,
|
||||
"sideNavStyle": "summary-only",
|
||||
"simpleOneOfTypeLabel": false,
|
||||
"sortEnumValuesAlphabetically": false,
|
||||
|
@ -1368,6 +1373,7 @@ exports[`Components SchemaView discriminator should correctly render SchemaView
|
|||
"scrollYOffset": [Function],
|
||||
"showExtensions": false,
|
||||
"showObjectSchemaExamples": false,
|
||||
"showWebhookVerb": false,
|
||||
"sideNavStyle": "summary-only",
|
||||
"simpleOneOfTypeLabel": false,
|
||||
"sortEnumValuesAlphabetically": false,
|
||||
|
@ -1620,6 +1626,7 @@ exports[`Components SchemaView discriminator should correctly render SchemaView
|
|||
"scrollYOffset": [Function],
|
||||
"showExtensions": false,
|
||||
"showObjectSchemaExamples": false,
|
||||
"showWebhookVerb": false,
|
||||
"sideNavStyle": "summary-only",
|
||||
"simpleOneOfTypeLabel": false,
|
||||
"sortEnumValuesAlphabetically": false,
|
||||
|
@ -1913,6 +1920,7 @@ exports[`Components SchemaView discriminator should correctly render SchemaView
|
|||
"scrollYOffset": [Function],
|
||||
"showExtensions": false,
|
||||
"showObjectSchemaExamples": false,
|
||||
"showWebhookVerb": false,
|
||||
"sideNavStyle": "summary-only",
|
||||
"simpleOneOfTypeLabel": false,
|
||||
"sortEnumValuesAlphabetically": false,
|
||||
|
@ -2167,6 +2175,7 @@ exports[`Components SchemaView discriminator should correctly render SchemaView
|
|||
"scrollYOffset": [Function],
|
||||
"showExtensions": false,
|
||||
"showObjectSchemaExamples": false,
|
||||
"showWebhookVerb": false,
|
||||
"sideNavStyle": "summary-only",
|
||||
"simpleOneOfTypeLabel": false,
|
||||
"sortEnumValuesAlphabetically": false,
|
||||
|
@ -2396,6 +2405,7 @@ exports[`Components SchemaView discriminator should correctly render SchemaView
|
|||
"scrollYOffset": [Function],
|
||||
"showExtensions": false,
|
||||
"showObjectSchemaExamples": false,
|
||||
"showWebhookVerb": false,
|
||||
"sideNavStyle": "summary-only",
|
||||
"simpleOneOfTypeLabel": false,
|
||||
"sortEnumValuesAlphabetically": false,
|
||||
|
|
|
@ -59,6 +59,7 @@ export interface RedocRawOptions {
|
|||
nonce?: string;
|
||||
hideFab?: boolean;
|
||||
minCharacterLengthToInitSearch?: number;
|
||||
showWebhookVerb?: boolean;
|
||||
}
|
||||
|
||||
export function argValueToBoolean(val?: string | boolean, defaultValue?: boolean): boolean {
|
||||
|
@ -257,6 +258,7 @@ export class RedocNormalizedOptions {
|
|||
generatedPayloadSamplesMaxDepth: number;
|
||||
hideFab: boolean;
|
||||
minCharacterLengthToInitSearch: number;
|
||||
showWebhookVerb: boolean;
|
||||
|
||||
nonce?: string;
|
||||
|
||||
|
@ -334,5 +336,6 @@ export class RedocNormalizedOptions {
|
|||
this.nonce = raw.nonce;
|
||||
this.hideFab = argValueToBoolean(raw.hideFab);
|
||||
this.minCharacterLengthToInitSearch = argValueToNumber(raw.minCharacterLengthToInitSearch) || 3;
|
||||
this.showWebhookVerb = argValueToBoolean(raw.showWebhookVerb);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user