insomnia/packages/insomnia-app/app/ui/components/cookie-list.tsx

140 lines
4.7 KiB
TypeScript
Raw Normal View History

import { autoBindMethodsForReact } from 'class-autobind-decorator';
2018-06-25 17:42:50 +00:00
import { cookieToString } from 'insomnia-cookies';
2021-07-22 23:04:56 +00:00
import React, { PureComponent } from 'react';
import * as toughCookie from 'tough-cookie';
2022-03-17 12:56:11 +00:00
import { v4 as uuidv4 } from 'uuid';
2021-07-22 23:04:56 +00:00
import { AUTOBIND_CFG } from '../../common/constants';
2021-07-22 23:04:56 +00:00
import type { Cookie } from '../../models/cookie-jar';
import { Dropdown } from './base/dropdown/dropdown';
import { DropdownButton } from './base/dropdown/dropdown-button';
import { DropdownItem } from './base/dropdown/dropdown-item';
import { PromptButton } from './base/prompt-button';
import { RenderedText } from './rendered-text';
fixes 'previewHidden' of undefined error (#3409) * readability improvements and reduced indirection * adds type for handleShowModifyCookieModal * correctly types wrapperProps property, thereby fixing bug. if you add `console.log({ previewHidden, propsOne: this.props.wrapperProps.activeWorkspaceMeta });` to the third line of `_renderPreview()` you'll see that `activeWorkspaceMeta` is indeed, sometimes, `undefined. Also, there's no reason to use `await` on `this.setState`. I didn't find any more of these in the codebase, I just found this one. * adds type for swaggerUiSpec * undoes lifting props to state almost always, this is done for performance reasons, but I removed it the app is working pretty quick-and-snappy for me without needing to introduced duplicated application state and keep track of it. I went ahead and measured it before and after this commit (using performance.now): before = [ 1.93500000750646, 1.149999996414408, 0.9499999869149178, 0.9950000094249845, 0.8650000090710819, 1.560000004246831, 1.5699999930802733, 0.8450000023003668, 1.4550000196322799, 1.3299999991431832, 1.3050000125076622, 1.4099999971222132, 1.3099999923724681, 1.3100000214762986, 1.1999999987892807, 1.0099999781232327, 0.830000004498288, 1.2449999921955168, 1.2500000011641532, 1.4349999837577343, ] after = [ 2.9400000057648867, 2.449999999953434, 2.33499999740161, 2.2849999950267375, 1.7700000025797635, 1.8149999959859997, 2.1249999990686774, 1.9150000007357448, 2.074999996693805, 1.9899999897461385, 2.0200000144541264, 2.869999996619299, 2.1450000058393925, 2.33499999740161, 2.130000008037314, 2.119999990100041, 2.144999976735562, 2.130000008037314, 2.380000009201467, 2.8999999922234565, ] > R.mean(before) > 1.2480000004870817 > R.mean(after) > 2.243749999080319 > R.median(before) > 1.2775000068359077 > R.median(after) > 2.137499992386438 So basically, considering a 16ms render rate (i.e. 60hz), 1ms saved by lifting props to state makes no difference in application performance. This is committed separately so that if there's any reason we want to keep the prior implementation, we can just still do so.
2021-05-24 14:14:00 +00:00
export interface CookieListProps {
handleCookieAdd: Function;
handleCookieDelete: Function;
handleDeleteAll: Function;
cookies: Cookie[];
newCookieDomainName: string;
fixes 'previewHidden' of undefined error (#3409) * readability improvements and reduced indirection * adds type for handleShowModifyCookieModal * correctly types wrapperProps property, thereby fixing bug. if you add `console.log({ previewHidden, propsOne: this.props.wrapperProps.activeWorkspaceMeta });` to the third line of `_renderPreview()` you'll see that `activeWorkspaceMeta` is indeed, sometimes, `undefined. Also, there's no reason to use `await` on `this.setState`. I didn't find any more of these in the codebase, I just found this one. * adds type for swaggerUiSpec * undoes lifting props to state almost always, this is done for performance reasons, but I removed it the app is working pretty quick-and-snappy for me without needing to introduced duplicated application state and keep track of it. I went ahead and measured it before and after this commit (using performance.now): before = [ 1.93500000750646, 1.149999996414408, 0.9499999869149178, 0.9950000094249845, 0.8650000090710819, 1.560000004246831, 1.5699999930802733, 0.8450000023003668, 1.4550000196322799, 1.3299999991431832, 1.3050000125076622, 1.4099999971222132, 1.3099999923724681, 1.3100000214762986, 1.1999999987892807, 1.0099999781232327, 0.830000004498288, 1.2449999921955168, 1.2500000011641532, 1.4349999837577343, ] after = [ 2.9400000057648867, 2.449999999953434, 2.33499999740161, 2.2849999950267375, 1.7700000025797635, 1.8149999959859997, 2.1249999990686774, 1.9150000007357448, 2.074999996693805, 1.9899999897461385, 2.0200000144541264, 2.869999996619299, 2.1450000058393925, 2.33499999740161, 2.130000008037314, 2.119999990100041, 2.144999976735562, 2.130000008037314, 2.380000009201467, 2.8999999922234565, ] > R.mean(before) > 1.2480000004870817 > R.mean(after) > 2.243749999080319 > R.median(before) > 1.2775000068359077 > R.median(after) > 2.137499992386438 So basically, considering a 16ms render rate (i.e. 60hz), 1ms saved by lifting props to state makes no difference in application performance. This is committed separately so that if there's any reason we want to keep the prior implementation, we can just still do so.
2021-05-24 14:14:00 +00:00
handleShowModifyCookieModal: (cookie: Cookie) => void;
}
2017-08-22 23:54:31 +00:00
// Use tough-cookie MAX_DATE value
// https://github.com/salesforce/tough-cookie/blob/5ae97c6a28122f3fb309adcd8428274d9b2bd795/lib/cookie.js#L77
const MAX_TIME = 2147483647000;
@autoBindMethodsForReact(AUTOBIND_CFG)
export class CookieList extends PureComponent<CookieListProps> {
2018-06-25 17:42:50 +00:00
_handleCookieAdd() {
2017-08-23 03:33:07 +00:00
const newCookie: Cookie = {
2022-03-17 12:56:11 +00:00
id: uuidv4(),
key: 'foo',
value: 'bar',
domain: this.props.newCookieDomainName,
expires: MAX_TIME,
2017-08-19 22:34:16 +00:00
path: '/',
secure: false,
httpOnly: false,
2017-08-23 03:33:07 +00:00
};
2017-10-31 21:10:08 +00:00
this.props.handleCookieAdd(newCookie);
}
2018-06-25 17:42:50 +00:00
_handleDeleteCookie(cookie: Cookie) {
2017-10-31 21:10:08 +00:00
this.props.handleCookieDelete(cookie);
}
2018-06-25 17:42:50 +00:00
render() {
const { cookies, handleDeleteAll, handleShowModifyCookieModal } = this.props;
return (
<div>
2017-08-19 22:34:16 +00:00
<table className="table--fancy cookie-table table--striped">
<thead>
2018-06-25 17:42:50 +00:00
<tr>
<th
style={{
minWidth: '10rem',
2021-08-07 08:03:56 +00:00
}}
>
Domain
</th>
<th
style={{
width: '90%',
2021-08-07 08:03:56 +00:00
}}
>
Cookie
</th>
<th
style={{
width: '2rem',
}}
2021-08-07 08:03:56 +00:00
className="text-right"
>
2018-06-25 17:42:50 +00:00
<Dropdown right>
<DropdownButton
title="Add cookie"
2021-08-07 08:03:56 +00:00
className="btn btn--super-duper-compact btn--outlined txt-md"
>
2018-06-25 17:42:50 +00:00
Actions <i className="fa fa-caret-down" />
</DropdownButton>
<DropdownItem onClick={this._handleCookieAdd}>
<i className="fa fa-plus-circle" /> Add Cookie
</DropdownItem>
2018-10-17 16:42:33 +00:00
<DropdownItem onClick={handleDeleteAll} buttonClass={PromptButton}>
2018-06-25 17:42:50 +00:00
<i className="fa fa-trash-o" /> Delete All
</DropdownItem>
</Dropdown>
</th>
</tr>
</thead>
<tbody key={cookies.length}>
2018-06-25 17:42:50 +00:00
{cookies.map((cookie, i) => {
2018-10-17 16:42:33 +00:00
const cookieString = cookieToString(toughCookie.Cookie.fromJSON(cookie));
2018-06-25 17:42:50 +00:00
return (
<tr className="selectable" key={i}>
<td>
<RenderedText>{cookie.domain || ''}</RenderedText>
2018-06-25 17:42:50 +00:00
</td>
<td className="force-wrap wide">
<RenderedText>{cookieString || ''}</RenderedText>
2018-06-25 17:42:50 +00:00
</td>
<td onClick={() => {}} className="text-right no-wrap">
2018-06-25 17:42:50 +00:00
<button
className="btn btn--super-compact btn--outlined"
fixes 'previewHidden' of undefined error (#3409) * readability improvements and reduced indirection * adds type for handleShowModifyCookieModal * correctly types wrapperProps property, thereby fixing bug. if you add `console.log({ previewHidden, propsOne: this.props.wrapperProps.activeWorkspaceMeta });` to the third line of `_renderPreview()` you'll see that `activeWorkspaceMeta` is indeed, sometimes, `undefined. Also, there's no reason to use `await` on `this.setState`. I didn't find any more of these in the codebase, I just found this one. * adds type for swaggerUiSpec * undoes lifting props to state almost always, this is done for performance reasons, but I removed it the app is working pretty quick-and-snappy for me without needing to introduced duplicated application state and keep track of it. I went ahead and measured it before and after this commit (using performance.now): before = [ 1.93500000750646, 1.149999996414408, 0.9499999869149178, 0.9950000094249845, 0.8650000090710819, 1.560000004246831, 1.5699999930802733, 0.8450000023003668, 1.4550000196322799, 1.3299999991431832, 1.3050000125076622, 1.4099999971222132, 1.3099999923724681, 1.3100000214762986, 1.1999999987892807, 1.0099999781232327, 0.830000004498288, 1.2449999921955168, 1.2500000011641532, 1.4349999837577343, ] after = [ 2.9400000057648867, 2.449999999953434, 2.33499999740161, 2.2849999950267375, 1.7700000025797635, 1.8149999959859997, 2.1249999990686774, 1.9150000007357448, 2.074999996693805, 1.9899999897461385, 2.0200000144541264, 2.869999996619299, 2.1450000058393925, 2.33499999740161, 2.130000008037314, 2.119999990100041, 2.144999976735562, 2.130000008037314, 2.380000009201467, 2.8999999922234565, ] > R.mean(before) > 1.2480000004870817 > R.mean(after) > 2.243749999080319 > R.median(before) > 1.2775000068359077 > R.median(after) > 2.137499992386438 So basically, considering a 16ms render rate (i.e. 60hz), 1ms saved by lifting props to state makes no difference in application performance. This is committed separately so that if there's any reason we want to keep the prior implementation, we can just still do so.
2021-05-24 14:14:00 +00:00
onClick={() => { handleShowModifyCookieModal(cookie); }}
2021-08-07 08:03:56 +00:00
title="Edit cookie properties"
>
2018-06-25 17:42:50 +00:00
Edit
</button>{' '}
<PromptButton
className="btn btn--super-compact btn--outlined"
addIcon
Version Control (beta) (#1439) * VCS proof of concept underway! * Stuff * Some things * Replace deprecated Electron makeSingleInstance * Rename `window` variables so not to be confused with window object * Don't unnecessarily update request when URL does not change * Regenerate package-lock * Fix tests + ESLint * Publish - insomnia-app@1.0.49 - insomnia-cookies@0.0.12 - insomnia-httpsnippet@1.16.18 - insomnia-importers@2.0.13 - insomnia-libcurl@0.0.23 - insomnia-prettify@0.1.7 - insomnia-url@0.1.6 - insomnia-xpath@1.0.9 - insomnia-plugin-base64@1.0.6 - insomnia-plugin-cookie-jar@1.0.8 - insomnia-plugin-core-themes@1.0.5 - insomnia-plugin-default-headers@1.1.9 - insomnia-plugin-file@1.0.7 - insomnia-plugin-hash@1.0.7 - insomnia-plugin-jsonpath@1.0.12 - insomnia-plugin-now@1.0.11 - insomnia-plugin-os@1.0.13 - insomnia-plugin-prompt@1.1.9 - insomnia-plugin-request@1.0.18 - insomnia-plugin-response@1.0.16 - insomnia-plugin-uuid@1.0.10 * Broken but w/e * Some tweaks * Big refactor. Create local snapshots and push done * POC merging and a lot of improvements * Lots of work done on initial UI/UX * Fix old tests * Atomic writes and size-based batches * Update StageEntry definition once again to be better * Factor out GraphQL query logic * Merge algorithm, history modal, other minor things * Fix test * Merge, checkout, revert w/ user changes now work * Force UI to refresh when switching branches changes active request * Rough draft pull() and some cleanup * E2EE stuff and some refactoring * Add ability to share project with team and fixed tests * VCS now created in root component and better remote project handling * Remove unused definition * Publish - insomnia-account@0.0.2 - insomnia-app@1.1.1 - insomnia-cookies@0.0.14 - insomnia-httpsnippet@1.16.20 - insomnia-importers@2.0.15 - insomnia-libcurl@0.0.25 - insomnia-prettify@0.1.9 - insomnia-sync@0.0.2 - insomnia-url@0.1.8 - insomnia-xpath@1.0.11 - insomnia-plugin-base64@1.0.8 - insomnia-plugin-cookie-jar@1.0.10 - insomnia-plugin-core-themes@1.0.7 - insomnia-plugin-file@1.0.9 - insomnia-plugin-hash@1.0.9 - insomnia-plugin-jsonpath@1.0.14 - insomnia-plugin-now@1.0.13 - insomnia-plugin-os@1.0.15 - insomnia-plugin-prompt@1.1.11 - insomnia-plugin-request@1.0.20 - insomnia-plugin-response@1.0.18 - insomnia-plugin-uuid@1.0.12 * Move some deps around * Fix Flow errors * Update package.json * Fix eslint errors * Fix tests * Update deps * bootstrap insomnia-sync * TRy fixing appveyor * Try something else * Bump lerna * try powershell * Try again * Fix imports * Fixed errors * sync types refactor * Show remote projects in workspace dropdown * Improved pulling of non-local workspaces * Loading indicators and some tweaks * Clean up sync staging modal * Some sync improvements: - No longer store stage - Upgrade Electron - Sync UI/UX improvements * Fix snyc tests * Upgraded deps and hot loader tweaks (it's broken for some reason) * Fix tests * Branches dialog, network refactoring, some tweaks * Fixed merging when other branch is empty * A bunch of small fixes from real testing * Fixed pull merge logic * Fix tests * Some bug fixes * A few small tweaks * Conflict resolution and other improvements * Fix tests * Add revert changes * Deal with duplicate projects per workspace * Some tweaks and accessibility improvements * Tooltip accessibility * Fix API endpoint * Fix tests * Remove jest dep from insomnia-importers
2019-04-18 00:50:03 +00:00
confirmMessage=""
onClick={() => this._handleDeleteCookie(cookie)}
2021-08-07 08:03:56 +00:00
title="Delete cookie"
>
2018-06-25 17:42:50 +00:00
<i className="fa fa-trash-o" />
</PromptButton>
</td>
</tr>
);
})}
</tbody>
</table>
{cookies.length === 0 && (
<div className="pad faint italic text-center">
2018-06-25 17:42:50 +00:00
<p>I couldn't find any cookies for you.</p>
<p>
<button className="btn btn--clicky" onClick={() => this._handleCookieAdd()}>
2018-06-25 17:42:50 +00:00
Add Cookie <i className="fa fa-plus-circle" />
</button>
</p>
</div>
)}
</div>
);
}
}