From 30a7b7b36bcbca53fc687b8b2bb5f196de0920b0 Mon Sep 17 00:00:00 2001 From: Tanner <88640606+Codetrauma@users.noreply.github.com> Date: Wed, 21 Aug 2024 08:12:30 -0300 Subject: [PATCH] feat: adding connection status to requests store (#82) --- .../ConnectionDetailsModal/index.tsx | 42 +++++++++---------- src/entries/Popup/Popup.tsx | 6 ++- src/reducers/requests.ts | 21 ++++++++++ 3 files changed, 46 insertions(+), 23 deletions(-) diff --git a/src/components/ConnectionDetailsModal/index.tsx b/src/components/ConnectionDetailsModal/index.tsx index 2580aa7a..4d330627 100644 --- a/src/components/ConnectionDetailsModal/index.tsx +++ b/src/components/ConnectionDetailsModal/index.tsx @@ -1,38 +1,39 @@ -import React, { useCallback, useEffect, useState } from 'react'; -import { useActiveTab, useActiveTabUrl } from '../../reducers/requests'; -import Modal, { - ModalHeader, - ModalContent, - ModalFooter, -} from '../../components/Modal/Modal'; +import React, { useCallback, useEffect } from 'react'; +import { useDispatch } from 'react-redux'; +import { + useActiveTabUrl, + setConnection, + useIsConnected, +} from '../../reducers/requests'; +import Modal, { ModalHeader, ModalContent } from '../../components/Modal/Modal'; import { deleteConnection, getConnection } from '../../entries/Background/db'; -import { urlify } from '../../utils/misc'; -import Icon from '../Icon'; const ConnectionDetailsModal = (props: { showConnectionDetails: boolean; - setShowConnectionDetails: any; + setShowConnectionDetails: (show: boolean) => void; }) => { + const dispatch = useDispatch(); const activeTabOrigin = useActiveTabUrl(); - - const [connected, setConnected] = useState(false); + const connected = useIsConnected(); useEffect(() => { (async () => { if (activeTabOrigin) { const isConnected: boolean | null = await getConnection( - activeTabOrigin?.origin, + activeTabOrigin.origin, ); - isConnected ? setConnected(true) : setConnected(false); + dispatch(setConnection(!!isConnected)); } })(); - }, []); + }, [activeTabOrigin, dispatch]); const handleDisconnect = useCallback(async () => { - await deleteConnection(activeTabOrigin?.origin as string); - props.setShowConnectionDetails(false); - setConnected(false); - }, [props.setShowConnectionDetails]); + if (activeTabOrigin?.origin) { + await deleteConnection(activeTabOrigin.origin); + props.setShowConnectionDetails(false); + dispatch(setConnection(false)); + } + }, [activeTabOrigin?.origin, dispatch, props]); return ( handleDisconnect()} + onClick={handleDisconnect} > Disconnect diff --git a/src/entries/Popup/Popup.tsx b/src/entries/Popup/Popup.tsx index 14a4aa7a..f8d25578 100644 --- a/src/entries/Popup/Popup.tsx +++ b/src/entries/Popup/Popup.tsx @@ -32,6 +32,7 @@ import { RunPluginApproval } from '../../pages/RunPluginApproval'; import Icon from '../../components/Icon'; import classNames from 'classnames'; import { getConnection } from '../Background/db'; +import { useIsConnected, setConnection } from '../../reducers/requests'; const Popup = () => { const dispatch = useDispatch(); @@ -123,16 +124,17 @@ const Popup = () => { export default Popup; function AppConnectionLogo() { + const dispatch = useDispatch(); const activeTab = useActiveTab(); const url = useActiveTabUrl(); const [showConnectionDetails, setShowConnectionDetails] = useState(false); - const [connected, setConnected] = useState(false); + const connected = useIsConnected(); useEffect(() => { (async () => { if (url) { const isConnected: boolean | null = await getConnection(url?.origin); - isConnected ? setConnected(true) : setConnected(false); + dispatch(setConnection(!!isConnected)); } })(); }, [url]); diff --git a/src/reducers/requests.ts b/src/reducers/requests.ts index dd6a27fb..da47cf4a 100644 --- a/src/reducers/requests.ts +++ b/src/reducers/requests.ts @@ -18,6 +18,7 @@ enum ActionType { '/requests/setRequests' = '/requests/setRequests', '/requests/addRequest' = '/requests/addRequest', '/requests/setActiveTab' = '/requests/setActiveTab', + '/requests/isConnected' = '/requests/isConnected', } type Action = { @@ -32,11 +33,22 @@ type State = { [requestId: string]: RequestLog; }; activeTab: chrome.tabs.Tab | null; + isConnected: boolean; }; const initialState: State = { map: {}, activeTab: null, + isConnected: false, +}; + +export const setConnection = (isConnected: boolean): Action => ({ + type: ActionType['/requests/isConnected'], + payload: isConnected, +}); + +export const isConnected = (isConnected: boolean) => async () => { + return isConnected; }; export const setRequests = (requests: RequestLog[]): Action => ({ @@ -113,6 +125,11 @@ export default function requests( [action.payload.requestId]: action.payload, }, }; + case ActionType['/requests/isConnected']: + return { + ...state, + isConnected: action.payload, + }; default: return state; } @@ -142,3 +159,7 @@ export const useActiveTabUrl = (): URL | null => { return activeTab?.url ? new URL(activeTab.url) : null; }, deepEqual); }; + +export const useIsConnected = (): boolean => { + return useSelector((state: AppRootState) => state.requests.isConnected); +};