Summary: Bumps [prettier](https://github.com/prettier/prettier) from 2.2.1 to 2.3.0. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/prettier/prettier/releases">prettier's releases</a>.</em></p> <blockquote> <h2>2.3.0</h2> <p><a href="https://github.com/prettier/prettier/compare/2.2.1...2.3.0">diff</a></p> <p>{emoji:1f517} <a href="https://prettier.io/blog/2021/05/09/2.3.0.html">Release Notes</a></p> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/prettier/prettier/blob/main/CHANGELOG.md">prettier's changelog</a>.</em></p> <blockquote> <h1>2.3.0</h1> <p><a href="https://github.com/prettier/prettier/compare/2.2.1...2.3.0">diff</a></p> <p>{emoji:1f517} <a href="https://prettier.io/blog/2021/05/09/2.3.0.html">Release Notes</a></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="2afc3b9ae6"><code>2afc3b9</code></a> Release 2.3.0</li> <li><a href="7cfa9aa89b"><code>7cfa9aa</code></a> Fix pre-commit hook setup command (<a href="https://github-redirect.dependabot.com/prettier/prettier/issues/10710">#10710</a>)</li> <li><a href="c8c02b4753"><code>c8c02b4</code></a> Build(deps-dev): Bump concurrently from 6.0.2 to 6.1.0 in /website (<a href="https://github-redirect.dependabot.com/prettier/prettier/issues/10834">#10834</a>)</li> <li><a href="6506e0f50e"><code>6506e0f</code></a> Build(deps-dev): Bump webpack-cli from 4.6.0 to 4.7.0 in /website (<a href="https://github-redirect.dependabot.com/prettier/prettier/issues/10836">#10836</a>)</li> <li><a href="69fae9c291"><code>69fae9c</code></a> Build(deps): Bump flow-parser from 0.150.0 to 0.150.1 (<a href="https://github-redirect.dependabot.com/prettier/prettier/issues/10839">#10839</a>)</li> <li><a href="164a6e2351"><code>164a6e2</code></a> Switch CLI to async (<a href="https://github-redirect.dependabot.com/prettier/prettier/issues/10804">#10804</a>)</li> <li><a href="d3e7e2f634"><code>d3e7e2f</code></a> Build(deps): Bump codecov/codecov-action from v1.4.1 to v1.5.0 (<a href="https://github-redirect.dependabot.com/prettier/prettier/issues/10833">#10833</a>)</li> <li><a href="9e09845da0"><code>9e09845</code></a> Build(deps): Bump <code>@angular/compiler</code> from 11.2.12 to 11.2.13 (<a href="https://github-redirect.dependabot.com/prettier/prettier/issues/10838">#10838</a>)</li> <li><a href="1bfab3d045"><code>1bfab3d</code></a> Build(deps-dev): Bump eslint from 7.25.0 to 7.26.0 (<a href="https://github-redirect.dependabot.com/prettier/prettier/issues/10840">#10840</a>)</li> <li><a href="387fce4ed8"><code>387fce4</code></a> Minor formatting tweaks (<a href="https://github-redirect.dependabot.com/prettier/prettier/issues/10807">#10807</a>)</li> <li>Additional commits viewable in <a href="https://github.com/prettier/prettier/compare/2.2.1...2.3.0">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `dependabot rebase` will rebase this PR - `dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `dependabot merge` will merge this PR after your CI passes on it - `dependabot squash and merge` will squash and merge this PR after your CI passes on it - `dependabot cancel merge` will cancel a previously requested merge and block automerging - `dependabot reopen` will reopen this PR if it is closed - `dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Pull Request resolved: https://github.com/facebook/flipper/pull/2300 Reviewed By: passy Differential Revision: D28323849 Pulled By: cekkaewnumchai fbshipit-source-id: 1842877ccc9a9587af7f0d9ff9432c2075c8ee22
213 lines
5.9 KiB
TypeScript
213 lines
5.9 KiB
TypeScript
/**
|
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*
|
|
* @format
|
|
*/
|
|
|
|
import React, {
|
|
useContext,
|
|
useState,
|
|
useMemo,
|
|
useEffect,
|
|
useCallback,
|
|
} from 'react';
|
|
import {MockResponseDetails} from './MockResponseDetails';
|
|
import {NetworkRouteContext, Route} from './NetworkRouteManager';
|
|
import {RequestId} from '../types';
|
|
import {Checkbox, Modal, Tooltip, Button, Typography} from 'antd';
|
|
import {
|
|
NUX,
|
|
Layout,
|
|
DataList,
|
|
Toolbar,
|
|
createState,
|
|
useValue,
|
|
} from 'flipper-plugin';
|
|
import {CloseCircleOutlined, WarningOutlined} from '@ant-design/icons';
|
|
|
|
const {Text} = Typography;
|
|
|
|
type Props = {
|
|
routes: {[id: string]: Route};
|
|
};
|
|
|
|
type RouteItem = {
|
|
id: string;
|
|
title: string;
|
|
route: Route;
|
|
isDuplicate: boolean;
|
|
};
|
|
|
|
// return ids that have the same pair of requestUrl and method; this will return only the duplicate
|
|
function _duplicateIds(routes: {[id: string]: Route}): Array<RequestId> {
|
|
const idSet: {[id: string]: {[method: string]: boolean}} = {};
|
|
return Object.entries(routes).reduce((acc: Array<RequestId>, [id, route]) => {
|
|
if (idSet.hasOwnProperty(route.requestUrl)) {
|
|
if (idSet[route.requestUrl].hasOwnProperty(route.requestMethod)) {
|
|
return acc.concat(id);
|
|
}
|
|
idSet[route.requestUrl] = {
|
|
...idSet[route.requestUrl],
|
|
[route.requestMethod]: true,
|
|
};
|
|
return acc;
|
|
} else {
|
|
idSet[route.requestUrl] = {[route.requestMethod]: true};
|
|
return acc;
|
|
}
|
|
}, []);
|
|
}
|
|
|
|
export function ManageMockResponsePanel(props: Props) {
|
|
const networkRouteManager = useContext(NetworkRouteContext);
|
|
const [selectedIdAtom] = useState(() => createState<RequestId | undefined>());
|
|
const selectedId = useValue(selectedIdAtom);
|
|
|
|
useEffect(() => {
|
|
selectedIdAtom.update((selectedId) => {
|
|
const keys = Object.keys(props.routes);
|
|
let returnValue: string | undefined = undefined;
|
|
// selectId is undefined when there are no rows or it is the first time rows are shown
|
|
if (selectedId === undefined) {
|
|
if (keys.length === 0) {
|
|
// there are no rows
|
|
returnValue = undefined;
|
|
} else {
|
|
// first time rows are shown
|
|
returnValue = keys[0];
|
|
}
|
|
} else {
|
|
if (keys.includes(selectedId)) {
|
|
returnValue = selectedId;
|
|
} else {
|
|
// selectedId row value not in routes so default to first line
|
|
returnValue = keys[0];
|
|
}
|
|
}
|
|
return returnValue;
|
|
});
|
|
}, [props.routes, selectedIdAtom]);
|
|
const duplicatedIds = useMemo(
|
|
() => _duplicateIds(props.routes),
|
|
[props.routes],
|
|
);
|
|
|
|
const items: RouteItem[] = Object.entries(props.routes).map(
|
|
([id, route]) => ({
|
|
id,
|
|
route,
|
|
title: route.requestUrl,
|
|
isDuplicate: duplicatedIds.includes(id),
|
|
}),
|
|
);
|
|
|
|
const handleDelete = useCallback(
|
|
(id: string) => {
|
|
Modal.confirm({
|
|
title: 'Are you sure you want to delete this item?',
|
|
icon: '',
|
|
onOk() {
|
|
networkRouteManager.removeRoute(id);
|
|
selectedIdAtom.set(undefined);
|
|
},
|
|
onCancel() {},
|
|
});
|
|
},
|
|
[networkRouteManager, selectedIdAtom],
|
|
);
|
|
const handleToggle = useCallback(
|
|
(id: string) => {
|
|
networkRouteManager.enableRoute(id);
|
|
},
|
|
[networkRouteManager],
|
|
);
|
|
|
|
const handleRender = useCallback(
|
|
(item: RouteItem) => (
|
|
<RouteEntry item={item} onDelete={handleDelete} onToggle={handleToggle} />
|
|
),
|
|
[handleDelete, handleToggle],
|
|
);
|
|
|
|
return (
|
|
<Layout.Left resizable style={{minHeight: 400}}>
|
|
<Layout.Top>
|
|
<Toolbar>
|
|
<Button
|
|
onClick={() => {
|
|
const newId = networkRouteManager.addRoute();
|
|
selectedIdAtom.set(newId);
|
|
}}>
|
|
Add Route
|
|
</Button>
|
|
<NUX
|
|
title="It is now possible to select calls from the network call list and convert them into mock routes."
|
|
placement="bottom">
|
|
<Button
|
|
onClick={() => {
|
|
networkRouteManager.copyHighlightedCalls();
|
|
}}>
|
|
Copy Highlighted Calls
|
|
</Button>
|
|
</NUX>
|
|
<Button onClick={networkRouteManager.importRoutes}>Import</Button>
|
|
<Button onClick={networkRouteManager.exportRoutes}>Export</Button>
|
|
<Button onClick={networkRouteManager.clearRoutes}>Clear</Button>
|
|
</Toolbar>
|
|
<DataList
|
|
items={items}
|
|
selection={selectedIdAtom}
|
|
onRenderItem={handleRender}
|
|
scrollable
|
|
/>
|
|
</Layout.Top>
|
|
<Layout.Container gap pad>
|
|
{selectedId && props.routes.hasOwnProperty(selectedId) && (
|
|
<MockResponseDetails
|
|
id={selectedId}
|
|
route={props.routes[selectedId]}
|
|
isDuplicated={duplicatedIds.includes(selectedId)}
|
|
/>
|
|
)}
|
|
</Layout.Container>
|
|
</Layout.Left>
|
|
);
|
|
}
|
|
|
|
const RouteEntry = ({
|
|
item,
|
|
onToggle,
|
|
onDelete,
|
|
}: {
|
|
item: RouteItem;
|
|
onToggle(id: string): void;
|
|
onDelete(id: string): void;
|
|
}) => {
|
|
const tip = item.route.enabled
|
|
? 'Un-check to disable mock route'
|
|
: 'Check to enable mock route';
|
|
return (
|
|
<Layout.Horizontal gap center>
|
|
<Tooltip title={tip} mouseEnterDelay={1.1}>
|
|
<Checkbox
|
|
onClick={() => onToggle(item.id)}
|
|
checked={item.route.enabled}></Checkbox>
|
|
</Tooltip>
|
|
{item.route.requestUrl.length === 0 ? (
|
|
<Text ellipsis>untitled</Text>
|
|
) : (
|
|
<Text ellipsis>{item.route.requestUrl}</Text>
|
|
)}
|
|
<Tooltip title="Click to delete mock route" mouseEnterDelay={1.1}>
|
|
<Layout.Horizontal onClick={() => onDelete(item.id)}>
|
|
<CloseCircleOutlined />
|
|
</Layout.Horizontal>
|
|
</Tooltip>
|
|
{item.isDuplicate && <WarningOutlined />}
|
|
</Layout.Horizontal>
|
|
);
|
|
};
|