mirror of
https://github.com/shlinkio/shlink-web-client.git
synced 2026-08-01 08:31:52 +00:00
Create useSelectedServer hook and use it where reset selected server is done
This commit is contained in:
@@ -23,7 +23,7 @@ export const provideServices = (bottle: Bottle, connect: ConnectDecorator) => {
|
|||||||
|
|
||||||
bottle.serviceFactory('Home', () => Home);
|
bottle.serviceFactory('Home', () => Home);
|
||||||
bottle.decorator('Home', withoutSelectedServer);
|
bottle.decorator('Home', withoutSelectedServer);
|
||||||
bottle.decorator('Home', connect(['servers'], ['resetSelectedServer']));
|
bottle.decorator('Home', connect(['servers'], []));
|
||||||
|
|
||||||
bottle.factory('ShlinkWebComponentContainer', ShlinkWebComponentContainerFactory);
|
bottle.factory('ShlinkWebComponentContainer', ShlinkWebComponentContainerFactory);
|
||||||
bottle.decorator('ShlinkWebComponentContainer', connect(['selectedServer', 'settings'], ['selectServer']));
|
bottle.decorator('ShlinkWebComponentContainer', connect(['selectedServer', 'settings'], ['selectServer']));
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
import { configureStore } from '@reduxjs/toolkit';
|
import { configureStore } from '@reduxjs/toolkit';
|
||||||
|
import { useDispatch, useSelector } from 'react-redux';
|
||||||
import type { RLSOptions } from 'redux-localstorage-simple';
|
import type { RLSOptions } from 'redux-localstorage-simple';
|
||||||
import { load, save } from 'redux-localstorage-simple';
|
import { load, save } from 'redux-localstorage-simple';
|
||||||
import { initReducers } from '../reducers';
|
import { initReducers } from '../reducers';
|
||||||
import { migrateDeprecatedSettings } from '../settings/helpers';
|
import { migrateDeprecatedSettings } from '../settings/helpers';
|
||||||
import type { ShlinkState } from './types';
|
import type { ShlinkState } from './types';
|
||||||
|
|
||||||
const isProduction = process.env.NODE_ENV === 'production';
|
|
||||||
const localStorageConfig: RLSOptions = {
|
const localStorageConfig: RLSOptions = {
|
||||||
states: ['settings', 'servers'],
|
states: ['settings', 'servers'],
|
||||||
namespace: 'shlink',
|
namespace: 'shlink',
|
||||||
@@ -14,6 +14,7 @@ const localStorageConfig: RLSOptions = {
|
|||||||
};
|
};
|
||||||
const getStateFromLocalStorage = () => migrateDeprecatedSettings(load(localStorageConfig) as ShlinkState);
|
const getStateFromLocalStorage = () => migrateDeprecatedSettings(load(localStorageConfig) as ShlinkState);
|
||||||
|
|
||||||
|
const isProduction = process.env.NODE_ENV === 'production';
|
||||||
export const setUpStore = (preloadedState = getStateFromLocalStorage()) => configureStore({
|
export const setUpStore = (preloadedState = getStateFromLocalStorage()) => configureStore({
|
||||||
devTools: !isProduction,
|
devTools: !isProduction,
|
||||||
reducer: initReducers(),
|
reducer: initReducers(),
|
||||||
@@ -22,3 +23,11 @@ export const setUpStore = (preloadedState = getStateFromLocalStorage()) => confi
|
|||||||
defaultMiddlewaresIncludingReduxThunk({ immutableCheck: false, serializableCheck: false }) // State is too big for these
|
defaultMiddlewaresIncludingReduxThunk({ immutableCheck: false, serializableCheck: false }) // State is too big for these
|
||||||
.concat(save(localStorageConfig)),
|
.concat(save(localStorageConfig)),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
export type StoreType = ReturnType<typeof setUpStore>;
|
||||||
|
export type AppDispatch = StoreType['dispatch'];
|
||||||
|
export type RootState = ReturnType<StoreType['getState']>;
|
||||||
|
|
||||||
|
// Typed versions of useDispatch() and useSelector()
|
||||||
|
export const useAppDispatch = useDispatch.withTypes<AppDispatch>();
|
||||||
|
export const useAppSelector = useSelector.withTypes<RootState>();
|
||||||
|
|||||||
@@ -1,13 +1,15 @@
|
|||||||
import type { Settings } from '@shlinkio/shlink-web-component/settings';
|
import type { Settings } from '@shlinkio/shlink-web-component/settings';
|
||||||
import type { SelectedServer, ServersMap } from '../servers/data';
|
import type { SelectedServer, ServersMap } from '../servers/data';
|
||||||
|
|
||||||
export interface ShlinkState {
|
/** Deprecated Use RootState */
|
||||||
|
export type ShlinkState = {
|
||||||
servers: ServersMap;
|
servers: ServersMap;
|
||||||
selectedServer: SelectedServer;
|
selectedServer: SelectedServer;
|
||||||
settings: Settings;
|
settings: Settings;
|
||||||
appUpdated: boolean;
|
appUpdated: boolean;
|
||||||
}
|
};
|
||||||
|
|
||||||
export type ConnectDecorator = (props: string[] | null, actions?: string[]) => any;
|
export type ConnectDecorator = (props: string[] | null, actions?: string[]) => any;
|
||||||
|
|
||||||
|
/** @deprecated */
|
||||||
export type GetState = () => ShlinkState;
|
export type GetState = () => ShlinkState;
|
||||||
|
|||||||
@@ -1,13 +1,10 @@
|
|||||||
import type { FC } from 'react';
|
import type { FC } from 'react';
|
||||||
import { useEffect } from 'react';
|
import { useEffect } from 'react';
|
||||||
|
import { useSelectedServer } from '../reducers/selectedServer';
|
||||||
|
|
||||||
interface WithoutSelectedServerProps {
|
export function withoutSelectedServer<T extends object>(WrappedComponent: FC<T>) {
|
||||||
resetSelectedServer: () => unknown;
|
return (props: T) => {
|
||||||
}
|
const { resetSelectedServer } = useSelectedServer();
|
||||||
|
|
||||||
export function withoutSelectedServer<T extends object>(WrappedComponent: FC<WithoutSelectedServerProps & T>) {
|
|
||||||
return (props: WithoutSelectedServerProps & T) => {
|
|
||||||
const { resetSelectedServer } = props;
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
resetSelectedServer();
|
resetSelectedServer();
|
||||||
}, [resetSelectedServer]);
|
}, [resetSelectedServer]);
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
import { createAction, createSlice } from '@reduxjs/toolkit';
|
import { createAction, createSlice } from '@reduxjs/toolkit';
|
||||||
import { memoizeWith } from '@shlinkio/data-manipulation';
|
import { memoizeWith } from '@shlinkio/data-manipulation';
|
||||||
import type { ShlinkHealth } from '@shlinkio/shlink-web-component/api-contract';
|
import type { ShlinkHealth } from '@shlinkio/shlink-web-component/api-contract';
|
||||||
|
import { useCallback } from 'react';
|
||||||
import type { ShlinkApiClientBuilder } from '../../api/services/ShlinkApiClientBuilder';
|
import type { ShlinkApiClientBuilder } from '../../api/services/ShlinkApiClientBuilder';
|
||||||
|
import { useAppDispatch, useAppSelector } from '../../container/store';
|
||||||
import { createAsyncThunk } from '../../utils/helpers/redux';
|
import { createAsyncThunk } from '../../utils/helpers/redux';
|
||||||
import { versionToPrintable, versionToSemVer as toSemVer } from '../../utils/helpers/version';
|
import { versionToPrintable, versionToSemVer as toSemVer } from '../../utils/helpers/version';
|
||||||
import type { SelectedServer, ServerWithId } from '../data';
|
import type { SelectedServer, ServerWithId } from '../data';
|
||||||
@@ -72,3 +74,19 @@ const { reducer } = createSlice({
|
|||||||
});
|
});
|
||||||
|
|
||||||
export const selectedServerReducer = reducer;
|
export const selectedServerReducer = reducer;
|
||||||
|
|
||||||
|
export const useSelectedServer = () => {
|
||||||
|
const dispatch = useAppDispatch();
|
||||||
|
const dispatchResetSelectedServer = useCallback(() => dispatch(resetSelectedServer()), [dispatch]);
|
||||||
|
const dispatchSelectServer = useCallback(
|
||||||
|
(options: SelectServerOptions) => dispatch(selectServer(options)),
|
||||||
|
[dispatch],
|
||||||
|
);
|
||||||
|
const selectedServer = useAppSelector(({ selectedServer }) => selectedServer);
|
||||||
|
|
||||||
|
return {
|
||||||
|
selectedServer,
|
||||||
|
resetSelectedServer: dispatchResetSelectedServer,
|
||||||
|
selectServer: dispatchSelectServer,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import { ManageServersFactory } from '../ManageServers';
|
|||||||
import { ManageServersRowFactory } from '../ManageServersRow';
|
import { ManageServersRowFactory } from '../ManageServersRow';
|
||||||
import { ManageServersRowDropdownFactory } from '../ManageServersRowDropdown';
|
import { ManageServersRowDropdownFactory } from '../ManageServersRowDropdown';
|
||||||
import { fetchServers } from '../reducers/remoteServers';
|
import { fetchServers } from '../reducers/remoteServers';
|
||||||
import { resetSelectedServer, selectServer } from '../reducers/selectedServer';
|
import { selectServer } from '../reducers/selectedServer';
|
||||||
import { createServers, deleteServer, editServer, setAutoConnect } from '../reducers/servers';
|
import { createServers, deleteServer, editServer, setAutoConnect } from '../reducers/servers';
|
||||||
import { ServersDropdown } from '../ServersDropdown';
|
import { ServersDropdown } from '../ServersDropdown';
|
||||||
import { ServersExporter } from './ServersExporter';
|
import { ServersExporter } from './ServersExporter';
|
||||||
@@ -21,7 +21,7 @@ export const provideServices = (bottle: Bottle, connect: ConnectDecorator) => {
|
|||||||
// Components
|
// Components
|
||||||
bottle.factory('ManageServers', ManageServersFactory);
|
bottle.factory('ManageServers', ManageServersFactory);
|
||||||
bottle.decorator('ManageServers', withoutSelectedServer);
|
bottle.decorator('ManageServers', withoutSelectedServer);
|
||||||
bottle.decorator('ManageServers', connect(['selectedServer', 'servers'], ['resetSelectedServer']));
|
bottle.decorator('ManageServers', connect(['selectedServer', 'servers'], []));
|
||||||
|
|
||||||
bottle.factory('ManageServersRow', ManageServersRowFactory);
|
bottle.factory('ManageServersRow', ManageServersRowFactory);
|
||||||
|
|
||||||
@@ -30,10 +30,10 @@ export const provideServices = (bottle: Bottle, connect: ConnectDecorator) => {
|
|||||||
|
|
||||||
bottle.factory('CreateServer', CreateServerFactory);
|
bottle.factory('CreateServer', CreateServerFactory);
|
||||||
bottle.decorator('CreateServer', withoutSelectedServer);
|
bottle.decorator('CreateServer', withoutSelectedServer);
|
||||||
bottle.decorator('CreateServer', connect(['selectedServer', 'servers'], ['createServers', 'resetSelectedServer']));
|
bottle.decorator('CreateServer', connect(['selectedServer', 'servers'], ['createServers']));
|
||||||
|
|
||||||
bottle.factory('EditServer', EditServerFactory);
|
bottle.factory('EditServer', EditServerFactory);
|
||||||
bottle.decorator('EditServer', connect(['selectedServer'], ['editServer', 'selectServer', 'resetSelectedServer']));
|
bottle.decorator('EditServer', connect(['selectedServer'], ['editServer', 'selectServer']));
|
||||||
|
|
||||||
bottle.serviceFactory('ServersDropdown', () => ServersDropdown);
|
bottle.serviceFactory('ServersDropdown', () => ServersDropdown);
|
||||||
bottle.decorator('ServersDropdown', connect(['servers', 'selectedServer']));
|
bottle.decorator('ServersDropdown', connect(['servers', 'selectedServer']));
|
||||||
@@ -60,6 +60,4 @@ export const provideServices = (bottle: Bottle, connect: ConnectDecorator) => {
|
|||||||
bottle.serviceFactory('editServer', () => editServer);
|
bottle.serviceFactory('editServer', () => editServer);
|
||||||
bottle.serviceFactory('setAutoConnect', () => setAutoConnect);
|
bottle.serviceFactory('setAutoConnect', () => setAutoConnect);
|
||||||
bottle.serviceFactory('fetchServers', fetchServers, 'HttpClient');
|
bottle.serviceFactory('fetchServers', fetchServers, 'HttpClient');
|
||||||
|
|
||||||
bottle.serviceFactory('resetSelectedServer', () => resetSelectedServer);
|
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user