Merge pull request #1009 from acelaya-forks/feature/fix-chart-flickering

Memoize ShlinkWebComponentContainer to fix flickering charts on re-renders
This commit is contained in:
Alejandro Celaya 2023-12-25 14:13:40 +01:00 committed by GitHub
commit 12b6d76a61
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -1,5 +1,6 @@
import type { Settings, ShlinkWebComponentType, TagColorsStorage } from '@shlinkio/shlink-web-component'; import type { Settings, ShlinkWebComponentType, TagColorsStorage } from '@shlinkio/shlink-web-component';
import type { FC } from 'react'; import type { FC } from 'react';
import { memo } from 'react';
import type { ShlinkApiClientBuilder } from '../api/services/ShlinkApiClientBuilder'; import type { ShlinkApiClientBuilder } from '../api/services/ShlinkApiClientBuilder';
import type { FCWithDeps } from '../container/utils'; import type { FCWithDeps } from '../container/utils';
import { componentFactory, useDependencies } from '../container/utils'; import { componentFactory, useDependencies } from '../container/utils';
@ -22,7 +23,11 @@ type ShlinkWebComponentContainerDeps = {
const ShlinkWebComponentContainer: FCWithDeps< const ShlinkWebComponentContainer: FCWithDeps<
ShlinkWebComponentContainerProps, ShlinkWebComponentContainerProps,
ShlinkWebComponentContainerDeps ShlinkWebComponentContainerDeps
> = withSelectedServer(({ selectedServer, settings }) => { // FIXME Using `memo` here to solve a flickering effect in charts.
// memo is probably not the right solution. The root cause is the withSelectedServer HOC, but I couldn't fix the
// extra rendering there.
// This should be revisited at some point.
> = withSelectedServer(memo(({ selectedServer, settings }) => {
const { const {
buildShlinkApiClient, buildShlinkApiClient,
TagColorsStorage: tagColorsStorage, TagColorsStorage: tagColorsStorage,
@ -47,7 +52,7 @@ ShlinkWebComponentContainerDeps
)} )}
/> />
); );
}); }));
export const ShlinkWebComponentContainerFactory = componentFactory(ShlinkWebComponentContainer, [ export const ShlinkWebComponentContainerFactory = componentFactory(ShlinkWebComponentContainer, [
'buildShlinkApiClient', 'buildShlinkApiClient',