From b2db2b27da39770b71860d3e1f06dc78821c4c35 Mon Sep 17 00:00:00 2001 From: jeffvli Date: Tue, 9 May 2023 00:39:11 -0700 Subject: [PATCH] Refactor server list to object instead of array - Improve performance due to frequency of accessing the list --- src/renderer/api/navidrome/navidrome-api.ts | 2 +- .../servers/components/edit-server-form.tsx | 6 +---- .../servers/components/server-list-item.tsx | 2 +- src/renderer/store/auth.store.ts | 26 ++++++++++++++----- 4 files changed, 22 insertions(+), 14 deletions(-) diff --git a/src/renderer/api/navidrome/navidrome-api.ts b/src/renderer/api/navidrome/navidrome-api.ts index 621160c3..2e23fb91 100644 --- a/src/renderer/api/navidrome/navidrome-api.ts +++ b/src/renderer/api/navidrome/navidrome-api.ts @@ -192,8 +192,8 @@ axiosClient.interceptors.response.use( const serverId = currentServer.id; const token = currentServer.ndCredential; console.log(`token is expired: ${token}`); - useAuthStore.getState().actions.setCurrentServer(null); useAuthStore.getState().actions.updateServer(serverId, { ndCredential: undefined }); + useAuthStore.getState().actions.setCurrentServer(null); } } diff --git a/src/renderer/features/servers/components/edit-server-form.tsx b/src/renderer/features/servers/components/edit-server-form.tsx index c0b69b3e..c10b08d3 100644 --- a/src/renderer/features/servers/components/edit-server-form.tsx +++ b/src/renderer/features/servers/components/edit-server-form.tsx @@ -3,7 +3,6 @@ import { Checkbox, Stack, Group } from '@mantine/core'; import { Button, PasswordInput, TextInput, toast } from '/@/renderer/components'; import { useForm } from '@mantine/form'; import { closeAllModals } from '@mantine/modals'; -import { nanoid } from 'nanoid/non-secure'; import { RiInformationLine } from 'react-icons/ri'; import { jellyfinApi } from '/@/renderer/api/jellyfin.api'; import { navidromeApi } from '/@/renderer/api/navidrome.api'; @@ -25,7 +24,7 @@ const AUTH_FUNCTIONS = { }; export const EditServerForm = ({ isUpdate, server, onCancel }: EditServerFormProps) => { - const { updateServer, setCurrentServer } = useAuthStoreActions(); + const { updateServer } = useAuthStoreActions(); const [isLoading, setIsLoading] = useState(false); const form = useForm({ @@ -61,7 +60,6 @@ export const EditServerForm = ({ isUpdate, server, onCancel }: EditServerFormPro const serverItem = { credential: data.credential, - id: nanoid(), name: values.name, ndCredential: data.ndCredential, type: values.type, @@ -71,8 +69,6 @@ export const EditServerForm = ({ isUpdate, server, onCancel }: EditServerFormPro }; updateServer(server.id, serverItem); - setCurrentServer(serverItem); - toast.success({ message: 'Server has been updated' }); } catch (err: any) { setIsLoading(false); diff --git a/src/renderer/features/servers/components/server-list-item.tsx b/src/renderer/features/servers/components/server-list-item.tsx index 15daa1a6..9392bd44 100644 --- a/src/renderer/features/servers/components/server-list-item.tsx +++ b/src/renderer/features/servers/components/server-list-item.tsx @@ -61,7 +61,7 @@ export const ServerListItem = ({ server }: ServerListItemProps) => { } - timeoutProps={{ callback: handleDeleteServer, duration: 1500 }} + timeoutProps={{ callback: handleDeleteServer, duration: 1000 }} variant="subtle" > Remove server diff --git a/src/renderer/store/auth.store.ts b/src/renderer/store/auth.store.ts index 1037358e..36c796f9 100644 --- a/src/renderer/store/auth.store.ts +++ b/src/renderer/store/auth.store.ts @@ -18,7 +18,7 @@ export interface AuthSlice extends AuthState { actions: { addServer: (args: ServerListItem) => void; deleteServer: (id: string) => void; - getServer: (id: string) => ServerListItem | undefined; + getServer: (id: string) => ServerListItem | null; setCurrentServer: (server: ServerListItem | null) => void; updateServer: (id: string, args: Partial) => void; }; @@ -44,7 +44,9 @@ export const useAuthStore = create()( }); }, getServer: (id) => { - return get().serverList[id]; + const server = get().serverList[id]; + if (server) return server; + return null; }, setCurrentServer: (server) => { set((state) => { @@ -62,11 +64,13 @@ export const useAuthStore = create()( }, updateServer: (id: string, args: Partial) => { set((state) => { - state.serverList[id] = { ...state.serverList[id], ...args }; + const updatedServer = { + ...state.serverList[id], + ...args, + }; - if (state.currentServer?.id === id) { - state.currentServer = { ...state.serverList[id], ...args }; - } + state.serverList[id] = updatedServer; + state.currentServer = updatedServer; }); }, }, @@ -79,7 +83,7 @@ export const useAuthStore = create()( { merge: (persistedState, currentState) => merge(currentState, persistedState), name: 'store_authentication', - version: 1, + version: 2, }, ), ); @@ -91,3 +95,11 @@ export const useCurrentServer = () => useAuthStore((state) => state.currentServe export const useServerList = () => useAuthStore((state) => state.serverList); export const useAuthStoreActions = () => useAuthStore((state) => state.actions); + +export const getServerById = (id?: string) => { + if (!id) { + return null; + } + + return useAuthStore.getState().actions.getServer(id); +};