-
Notifications
You must be signed in to change notification settings - Fork 121
Expand file tree
/
Copy pathApiOperation.tsx
More file actions
60 lines (53 loc) · 1.68 KB
/
ApiOperation.tsx
File metadata and controls
60 lines (53 loc) · 1.68 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import React, { useEffect } from 'react';
import useSpecData from '@theme/useSpecData';
import clsx from 'clsx';
import { ThemeProvider } from 'styled-components';
import '../../global';
import { Operation, OperationModel, Section } from 'redoc';
import { useSpec } from '../../utils/useSpec';
import type { ApiOperationProps } from '../../types/common';
import '../Redoc/styles.css';
import './styles.css';
const ApiOperation: React.FC<ApiOperationProps> = ({
id,
spec,
example = false,
pointer,
...rest
}: ApiOperationProps): React.JSX.Element => {
const specProps = useSpecData(id, spec);
const { store } = useSpec(specProps);
// The # at the start is not included
const operationPointer =
pointer.charAt(0) === '#' ? pointer.substring(1) : pointer;
// The menu contains a flattened list of spec items for easy searching
const model = store.menu.flatItems.find(
(item) =>
item instanceof OperationModel && item.pointer === operationPointer,
) as OperationModel | undefined;
if (!model) {
throw new Error(`Failed to resolve reference "${pointer}"`);
}
useEffect(() => {
/**
* @see https://github.com/Redocly/redoc/blob/823be24b313c3a2445df7e0801a0cc79c20bacd1/src/services/MenuStore.ts#L273-L276
*/
store.menu.dispose();
}, [store]);
return (
<ThemeProvider theme={store.options.theme}>
<div
className={clsx([
'redocusaurus',
'redocusaurus-operation',
example ? null : 'hide-example',
])}
>
<Section id={model.id} $underlined={true}>
<Operation operation={model} {...rest} />
</Section>
</div>
</ThemeProvider>
);
};
export default ApiOperation;