- 17 Dec, 2020 3 commits
-
-
Robert Knight authored
Following https://github.com/hypothesis/client/pull/2837 the `SidebarView` component may now be rendered before the profile has been fetched. This component contains an effect which triggers the initial WebSocket connection. Since the WebSocket reconnects after the profile userid changes, this was causing the initial connection to almost immediately be disconnected if the user was logged in. Fix this by deferring the initial connection until after the profile has been fetched.
-
Robert Knight authored
Do not wait for groups and profile to load before calling `router.sync()` to set the initial route and thereby render the appropriate content component. Historically the main view components assumed that the user profile and groups were already loaded before they were rendered, but this is no longer the case. This fixes a brief flash of the sidebar's `TopBar` component inside the notebook when it initially loads. It also results in the `Annotations` and `Page Notes` tabs appearing immediately in the sidebar rather than waiting until the groups list is populated.
-
Robert Knight authored
`ThreadList` was measuring the height and scroll offset of the scroll container inside the render function instead of a layout effect. As a result it could fail if the scroll container is rendered by a parent component and its DOM has not yet been created. This issue was uncovered when trying to change the app to call `router.sync()` before waiting for `groups.load()` to complete. A test expectation had to be changed becaused it turned out that the scroll container had the wrong height when it was measured in the previous way (it was measured as 0px instead of the expected 350px).
-
- 16 Dec, 2020 6 commits
-
-
Robert Knight authored
There was no good reason for the separation between the two any more.
-
Robert Knight authored
- The logic for anchoring and generating range selectors provided by `range.js` has been replaced in `RangeAnchor`. - The normalization of DOM Ranges is no longer required by the rest of the code.
-
Robert Knight authored
Convert `RangeAnchor` to use `TextRange` and the XPath <-> Node mapping functions in xpath.js directly, rather than the `SerializedRange` and `NormalizedRange` classes. This change will mean that all conversion between text positions and (text node, offset) points in the client will use the same implementation. For `RangeAnchor` selectors this conversion is used for the `startOffset` and `endOffset` fields. The new implementation also avoids modifying the DOM, unlike the previous implementation which would sometimes split text nodes. Avoid DOM modifications during anchoring opens up the possibility of optimizing anchoring by caching text position <-> text node associations.
-
Robert Knight authored
https://github.com/hypothesis/client/pull/2818 inadvertently changed the size of the `.menu-toggle__icon` SVG element from 10x10px to 16x16px due to an `svg` selector introduced by the `buttons.button--icon-only` mixin taking precedence over the `.menu-toggle__icon` selector. As a result, the caret's vertical position was incorrect and it did not remain vertically centered when flipped. This commit nests the `.menu-toggle__icon` selector inside the parent `.menu-toggle` selector to restore the caret icon back to its 10x10 pixel size.
-
Robert Knight authored
Fix a typechecking error in `useRootThread`. `@return` has no effect when used above a variable initialized to a value that is not an arrow function or function expression. Therefore the type was inferred based on the `filterValues` local variable to be `{}`. Correct this to `Object.<string,string>` so that it matches up with the `ThreadState` type.
-
Robert Knight authored
Remove the need to define the type of store created by each module manually by adding a `StoreFromModule` helper in `create-store.js` which can infer the store type from a store module configuration. Using this the type of a store composed from several modules can then be created with: ``` import fooModule from './modules/foo'; import barModule from './modules/bar'; // Define type of store returned by `createStore([fooModule, barModule])` /** @typedef {StoreType<fooModule> & StoreType<barModule>} AppStore */ ``` Ideally `createStore` would just infer the type based upon its arguments. I haven't worked out how to do that yet. Nevertheless, this still removes the need for a lot of manually defined types. To ensure more useful error messages from TS if a store module's configuration has the wrong shape a `storeModule` helper has been added. This wraps the configuration for each module to check its shape before the individual modules are combined into one type for the store. This helper could also perform runtime validation in future. - Add `StoreFromModule` type in `create-store.js` and several helpers to support it - Modify each store module to wrap the export in `storeModule` and remove any manually defined store types
-
- 15 Dec, 2020 1 commit
-
-
Kyle Keating authored
- Fix issue where clicking the menu background showed a focus ring - Fix issue where buttons in the top-bar were not animating back from hover color - Prevent button animation from being applied to focus ring styling (caused issue in safari)
-
- 14 Dec, 2020 12 commits
-
-
Lyza Danger Gardner authored
Restructure the filters store module with the following goals in mind: * Simplify the structure of user-focus mode * Make the filtering structure for user-focus filters consistent with other filters * Add some actions and selectors for setting and getting filters, clearing the way to start adding some additional filtering * Be explicit about filter precedence Only one change here that affects the store's API and that is adjusted for in `useRootThread`.
-
dependabot-preview[bot] authored
Bumps [karma-browserify](https://github.com/nikku/karma-browserify) from 7.0.0 to 8.0.0. - [Release notes](https://github.com/nikku/karma-browserify/releases) - [Commits](https://github.com/nikku/karma-browserify/compare/v7.0.0...v8.0.0) Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
-
dependabot-preview[bot] authored
Bumps [autoprefixer](https://github.com/postcss/autoprefixer) from 10.0.4 to 10.1.0. - [Release notes](https://github.com/postcss/autoprefixer/releases) - [Changelog](https://github.com/postcss/autoprefixer/blob/main/CHANGELOG.md) - [Commits](https://github.com/postcss/autoprefixer/compare/10.0.4...10.1.0) Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
-
dependabot-preview[bot] authored
Bumps [postcss](https://github.com/postcss/postcss) from 8.1.14 to 8.2.1. - [Release notes](https://github.com/postcss/postcss/releases) - [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md) - [Commits](https://github.com/postcss/postcss/compare/8.1.14...8.2.1) Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
-
dependabot-preview[bot] authored
Bumps [typescript](https://github.com/Microsoft/TypeScript) from 4.1.2 to 4.1.3. - [Release notes](https://github.com/Microsoft/TypeScript/releases) - [Commits](https://github.com/Microsoft/TypeScript/commits) Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
-
dependabot-preview[bot] authored
Bumps [commander](https://github.com/tj/commander.js) from 6.2.0 to 6.2.1. - [Release notes](https://github.com/tj/commander.js/releases) - [Changelog](https://github.com/tj/commander.js/blob/master/CHANGELOG.md) - [Commits](https://github.com/tj/commander.js/compare/v6.2.0...v6.2.1) Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
-
dependabot-preview[bot] authored
Bumps [sinon](https://github.com/sinonjs/sinon) from 9.2.1 to 9.2.2. - [Release notes](https://github.com/sinonjs/sinon/releases) - [Changelog](https://github.com/sinonjs/sinon/blob/master/CHANGELOG.md) - [Commits](https://github.com/sinonjs/sinon/commits/v9.2.2) Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
-
dependabot-preview[bot] authored
Bumps [@babel/preset-env](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-env) from 7.12.7 to 7.12.10. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.12.10/packages/babel-preset-env) Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
-
dependabot-preview[bot] authored
Bumps [aws-sdk](https://github.com/aws/aws-sdk-js) from 2.804.0 to 2.809.0. - [Release notes](https://github.com/aws/aws-sdk-js/releases) - [Changelog](https://github.com/aws/aws-sdk-js/blob/master/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-js/compare/v2.804.0...v2.809.0) Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
-
dependabot-preview[bot] authored
Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.12.9 to 7.12.10. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.12.10/packages/babel-core) Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
-
dependabot-preview[bot] authored
Bumps [@babel/preset-react](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-react) from 7.12.7 to 7.12.10. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.12.10/packages/babel-preset-react) Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
-
Eduardo Sanz García authored
The text in the input element of the `annotation-share-control` is selected and focused when the element is created. This is to facilitate copy/paste via keyboard shorcuts. This selection/focus mechanism is working well except for iOS (both Chrome and Safari) where: * the selection/focus is not shown in the input field except by clicking on the input element. * the selection overflows the right margin of the input field I tested `overflow: hidden` on the input element but that causes the selection to overflow on the left margin Because of these two issues, I recommend to supress selection/focus on iOS devices.
-
- 11 Dec, 2020 9 commits
-
-
Robert Knight authored
For consistency, and because it is useful/straightforward to do, all of the `TextQuoteAnchor` tests now mock `matchQuote` but not `TextRange`, except for one integration test that is labeled as such.
-
Robert Knight authored
-
Robert Knight authored
Check the properties of the `TextQuoteAnchor` instance have expected values.
-
Robert Knight authored
-
Robert Knight authored
-
Robert Knight authored
Use the new matching algorithm for anchoring text quote selectors. This is faster than the existing one when many quote selectors fail to exactly match and gives us more insight into and control over the fuzzy matching process. - Use the `matchQuote` function to do find the best match for the quote in the text, replacing the `dom-anchor-text-quote` library. This resolves a problem where the browser could become unresponsive for a significant period of time when anchoring large numbers of annotations (hundreds) on pages where there have been significant changes in the content. In the "Public" group on http://www.americanyawp.com/text/01-the-new-world/ for example the client spends a total of ~2.4 seconds running JS in between starting the client and anchoring completing compared to ~11 seconds with the previous implementation. The new implementation also provides more control over the degree of mismatch between quote selector and document text that is allowed. The current settings provide higher recall (larger proportion of "correct" approximate matches found) than the previous implementation. On http://www.americanyawp.com/text/01-the-new-world/ for example the number of orphans dropped from 137 to 63. Finally the new library is also smaller. The minified `annotator.bundle.js` size is reduced by 15% (25KB). - Change `TextQuoteAnchor.fromSelector(...)` to generate the selector directly rather than delegating to `dom-anchor-text-quote`. This gives us more control over how quote selectors are generated and more easily change factors such as the amount of context included.
-
Robert Knight authored
All consumers now use the replacement `useStoreProxy` hook.
-
Robert Knight authored
Implement a `matchQuote` function which will be used to replace `dom-anchor-text-quote` for finding the best match for annotation quotes in the document text. The new implementation is based on the `approx-string-match` library and provides several improvements over the existing one: - Better performance when there are many differences between the quote and closest document text - It will be easier for us to tune the degree of mismatch allowed between the quote and document text and how candidate matches are ranked
-
dependabot-preview[bot] authored
Bumps [ini](https://github.com/isaacs/ini) from 1.3.5 to 1.3.7. **This update includes a security fix.** - [Release notes](https://github.com/isaacs/ini/releases) - [Commits](https://github.com/isaacs/ini/compare/v1.3.5...v1.3.7) Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
-
- 10 Dec, 2020 2 commits
-
-
Robert Knight authored
Change `useRootThread` hook to use the new API for reading data from the store.
-
Robert Knight authored
-
- 09 Dec, 2020 7 commits
-
-
Robert Knight authored
Make several improvements following PR review.
-
Robert Knight authored
Implement a new `useStoreProxy` hook that provides access to read and update the store in UI components. This will replace the existing `useStore` hook. The new hook has a more ergonomic API which should also prevent some of the common mistakes made when using the previous hook. `useStoreProxy` returns an ES proxy for the store. The UI component can use the proxy as if it were using the store directly. The proxy however tracks and caches the results of store selector calls. When the store state changes the proxy checks whether any of the cached calls would return different results and if so invalidates the cache and re-renders the component.
-
Robert Knight authored
This makes store updates faster in debug builds when a lot of data is loaded into the client. In this case most sub-trees in the store are already frozen after an update (since they are objects from the previous state) and only the new parts need to be frozen.
-
Robert Knight authored
Replace remaining uses of `store.getState()` in UI components with selectors. This will avoid unnecessary re-rendering after we change components to use the new `useStoreProxy` hook for reading from the store. It also simplifies the tests.
-
Robert Knight authored
Profiling anchoring of large numbers of annotations in Chrome showed that there was significant overhead for scheduling and executing `requestAnimationFrame` callbacks. In the case of `Guest.anchor`, the callback often did nothing (it called `removeHighlights` with an empty array). There isn't a need for this any more AFAICS so just invoke the logic synchronously, which is much cheaper.
-
Robert Knight authored
This was recomputing frequently even though the result only changes when the selected tab changes.
-
Lyza Danger Gardner authored
Also convert `selectionState` to use `createSelector` to avoid it returning a different reference on each call.
-