From ae9ec75983761f666d3938242cf63b8c5cc5f7c3 Mon Sep 17 00:00:00 2001 From: Rishi Ghan Date: Tue, 20 Jun 2023 11:32:16 -0400 Subject: [PATCH] =?UTF-8?q?=F0=9F=9A=A5=20Added=20service=20status=20panel?= =?UTF-8?q?=20scaffold?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 4 +-- src/client/actions/fileops.actions.tsx | 16 ++++++++++ .../AirDCPPSettings/AirDCPPSettingsForm.tsx | 30 ++++++++++++------- src/client/components/Dashboard/PullList.tsx | 4 +-- .../ServiceStatuses/ServiceStatuses.tsx | 25 ++++++++++++++++ src/client/components/Settings.tsx | 5 ++++ src/client/constants/action-types.ts | 5 +++- .../constants/settings/settingsMenu.json | 17 ++++++++++- src/client/reducers/fileops.reducer.ts | 16 +++++++--- yarn.lock | 17 ++++------- 10 files changed, 107 insertions(+), 32 deletions(-) create mode 100644 src/client/components/ServiceStatuses/ServiceStatuses.tsx diff --git a/package.json b/package.json index 8808b77..87bb2f3 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "@types/socket.io": "^3.0.2", "@types/socket.io-client": "^3.0.0", "@vitejs/plugin-react": "^3.1.0", - "airdcpp-apisocket": "2.4.5-beta.1", + "airdcpp-apisocket": "~2.4.5-beta.2", "axios": "^1.3.4", "axios-cache-interceptor": "^1.0.1", "axios-rate-limit": "^1.3.0", @@ -56,7 +56,7 @@ "react-collapsible": "^2.9.0", "react-comic-viewer": "^0.4.0", "react-day-picker": "^8.6.0", - "react-dom": "^18.1.0", + "react-dom": "^18.2.0", "react-fast-compare": "^3.2.0", "react-final-form": "^6.5.9", "react-final-form-arrays": "^3.1.4", diff --git a/src/client/actions/fileops.actions.tsx b/src/client/actions/fileops.actions.tsx index ad95488..facb635 100644 --- a/src/client/actions/fileops.actions.tsx +++ b/src/client/actions/fileops.actions.tsx @@ -34,11 +34,27 @@ import { WANTED_COMICS_FETCHED, VOLUMES_FETCHED, CV_WEEKLY_PULLLIST_FETCHED, + LIBRARY_SERVICE_HEALTH, } from "../constants/action-types"; import { success } from "react-notification-system-redux"; import { isNil, map } from "lodash"; +export const getServiceStatus = (serviceName?: string) => async dispatch => { + axios + .request({ + url: `${LIBRARY_SERVICE_BASE_URI}/getHealthInformation`, + method: "GET", + transformResponse: (r: string) => JSON.parse(r), + }) + .then((response) => { + const { data } = response; + dispatch({ + type: LIBRARY_SERVICE_HEALTH, + status: data, + }); + }); +}; export async function walkFolder(path: string): Promise> { return axios .request>({ diff --git a/src/client/components/AirDCPPSettings/AirDCPPSettingsForm.tsx b/src/client/components/AirDCPPSettings/AirDCPPSettingsForm.tsx index 62b5d15..5ba513f 100644 --- a/src/client/components/AirDCPPSettings/AirDCPPSettingsForm.tsx +++ b/src/client/components/AirDCPPSettings/AirDCPPSettingsForm.tsx @@ -15,14 +15,15 @@ export const AirDCPPSettingsForm = (): ReactElement => { try { if (!isUndefined(hostname)) { const matches = hostname.match(hostnameRegex); - return (isNil(matches) && matches.length !== 0) ? hostname : "Invalid hostname; it should not contain special characters"; + return isNil(matches) && matches.length !== 0 + ? hostname + : "Invalid hostname; it should not contain special characters"; } - } - catch { + } catch { return null; } - } - + }; + const onSubmit = useCallback(async (values) => { try { airDCPPSettings.setSettings(values); @@ -39,7 +40,7 @@ export const AirDCPPSettingsForm = (): ReactElement => { airDCPPSettings.setSettings({}); dispatch(deleteSettings()); }, []); - const validate = async () => { }; + const validate = async () => {}; const initFormData = !isUndefined( airDCPPSettings.airDCPPState.settings.directConnect, ) @@ -67,13 +68,20 @@ export const AirDCPPSettingsForm = (): ReactElement => {

- + {({ input, meta }) => (
- - {meta.error && meta.touched && {meta.error}} + + {meta.error && meta.touched && ( + + {meta.error} + + )}
)}
diff --git a/src/client/components/Dashboard/PullList.tsx b/src/client/components/Dashboard/PullList.tsx index 9c2ffc8..00fc9c7 100644 --- a/src/client/components/Dashboard/PullList.tsx +++ b/src/client/components/Dashboard/PullList.tsx @@ -127,7 +127,7 @@ export const PullList = ({ issues }: PullListProps): ReactElement => { (sliderRef = c)}> {!isNil(pullList) && pullList && - map(pullList, ({issue}, idx) => { + map(pullList, ({ issue }, idx) => { return ( { ); }; -export default PullList; \ No newline at end of file +export default PullList; diff --git a/src/client/components/ServiceStatuses/ServiceStatuses.tsx b/src/client/components/ServiceStatuses/ServiceStatuses.tsx new file mode 100644 index 0000000..49645ce --- /dev/null +++ b/src/client/components/ServiceStatuses/ServiceStatuses.tsx @@ -0,0 +1,25 @@ +import React, { ReactElement } from "react"; +import { useDispatch, useSelector } from "react-redux"; +import { useEffect } from "react"; +import { getServiceStatus } from "../../actions/fileops.actions"; + +export const ServiceStatuses = (): ReactElement => { + const serviceStatus = useSelector( + (state: RootState) => state.fileOps.libraryServiceStatus, + ); + const dispatch = useDispatch(); + useEffect(() => { + dispatch(getServiceStatus()); + }, []); + return ( +
+
+

Core Services

+
+ Statuses for core services +
+
+
{JSON.stringify(serviceStatus, null, 2)}
+
+ ); +}; diff --git a/src/client/components/Settings.tsx b/src/client/components/Settings.tsx index d82cfa9..7aa3b8b 100644 --- a/src/client/components/Settings.tsx +++ b/src/client/components/Settings.tsx @@ -2,6 +2,7 @@ import React, { useState, ReactElement } from "react"; import { AirDCPPSettingsForm } from "./AirDCPPSettings/AirDCPPSettingsForm"; import { AirDCPPHubsForm } from "./AirDCPPSettings/AirDCPPHubsForm"; import { SystemSettingsForm } from "./SystemSettings/SystemSettingsForm"; +import { ServiceStatuses } from "./ServiceStatuses/ServiceStatuses"; import settingsObject from "../constants/settings/settingsMenu.json"; import { isUndefined, map } from "lodash"; @@ -22,6 +23,10 @@ export const Settings = (props: ISettingsProps): ReactElement => {
), }, + { + id: "core-service", + content: , + }, { id: "flushdb", content: ( diff --git a/src/client/constants/action-types.ts b/src/client/constants/action-types.ts index efd3f9e..38bca16 100644 --- a/src/client/constants/action-types.ts +++ b/src/client/constants/action-types.ts @@ -139,4 +139,7 @@ export const SETTINGS_DB_FLUSH_SUCCESS = "SETTINGS_DB_FLUSH_SUCCESS"; // Metron Metadata export const METRON_DATA_FETCH_SUCCESS = "METRON_DATA_FETCH_SUCCESS"; export const METRON_DATA_FETCH_IN_PROGRESS = "METRON_DATA_FETCH_IN_PROGRESS"; -export const METRON_DATA_FETCH_ERROR = "METRON_DATA_FETCH_ERROR"; \ No newline at end of file +export const METRON_DATA_FETCH_ERROR = "METRON_DATA_FETCH_ERROR"; + +// service health statuses +export const LIBRARY_SERVICE_HEALTH = "LIBRARY_SERVICE_HEALTH"; diff --git a/src/client/constants/settings/settingsMenu.json b/src/client/constants/settings/settingsMenu.json index e4ac71b..a968c80 100644 --- a/src/client/constants/settings/settingsMenu.json +++ b/src/client/constants/settings/settingsMenu.json @@ -57,6 +57,21 @@ }, { "id": 4, + "category": "statuses", + "displayName": "Service Status", + "children": [ + { + "id": "core-service", + "displayName": "Core Services" + }, + { + "id": "metadata-service", + "displayName": "Metadata Services" + } + ] + }, + { + "id": 5, "category": "system", "displayName": "System", "children": [ @@ -67,7 +82,7 @@ ] }, { - "id": 5, + "id": 6, "category": "acknowledgments", "displayName": "Acknowledgments", "children": [ diff --git a/src/client/reducers/fileops.reducer.ts b/src/client/reducers/fileops.reducer.ts index 210c85c..78cac4b 100644 --- a/src/client/reducers/fileops.reducer.ts +++ b/src/client/reducers/fileops.reducer.ts @@ -30,6 +30,8 @@ import { SS_SEARCH_RESULTS_FETCHED_SPECIAL, VOLUMES_FETCHED, COMICBOOK_EXTRACTION_SUCCESS, + LIBRARY_SERVICE_HEALTH, + HEALTH_STATUS_TICK, } from "../constants/action-types"; import { removeLeadingPeriod } from "../shared/utils/formatting.utils"; import { LIBRARY_SERVICE_HOST } from "../constants/endpoints"; @@ -58,6 +60,7 @@ const initialState = { librarySearchResultCount: 0, libraryQueueResults: [], librarySearchError: {}, + libraryServiceStatus: {}, }; function fileOpsReducer(state = initialState, action) { @@ -153,13 +156,13 @@ function fileOpsReducer(state = initialState, action) { } case LS_COVER_EXTRACTED: { console.log("BASH", action); - if(state.recentComics.length === 5) { + if (state.recentComics.length === 5) { state.recentComics.pop(); } return { ...state, librarySearchResultCount: state.librarySearchResultCount + 1, - recentComics: [...state.recentComics, action.result.data.importResult] + recentComics: [...state.recentComics, action.result.data.importResult], }; } @@ -271,7 +274,12 @@ function fileOpsReducer(state = initialState, action) { SSCallInProgress: false, }; } - + case LIBRARY_SERVICE_HEALTH: { + return { + ...state, + libraryServiceStatus: action.status, + }; + } case FILEOPS_STATE_RESET: { return { ...state, @@ -283,4 +291,4 @@ function fileOpsReducer(state = initialState, action) { } } -export default fileOpsReducer; \ No newline at end of file +export default fileOpsReducer; diff --git a/yarn.lock b/yarn.lock index 6c1920d..b28c944 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4083,12 +4083,12 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" -airdcpp-apisocket@2.4.5-beta.1: - version "2.4.5-beta.1" - resolved "https://registry.yarnpkg.com/airdcpp-apisocket/-/airdcpp-apisocket-2.4.5-beta.1.tgz#f85674e98b7b733d91ee1e9b751ea9e757239964" - integrity sha512-Esa+p72zA9gMWDdlOkEWinvOhu01WvV9CCOvmQUrwLZXCNtT+70QBQqAY+vh0FMYrpkiH8Ync7ues4ERHPnxyw== +airdcpp-apisocket@~2.4.5-beta.2: + version "2.5.0-beta.2" + resolved "https://registry.yarnpkg.com/airdcpp-apisocket/-/airdcpp-apisocket-2.5.0-beta.2.tgz#062541095de75775bfa92b5cb4e785674beb8986" + integrity sha512-N/+39wYrZc/2N5CaZPG8kUSMu9shGGmLqR/0WQbJ1NiHF5VHcifN27ioldijN10KGfssFvTZBjV93m+D8ADDkQ== dependencies: - chalk "^5.1.2" + chalk "^4.1.2" events "^3.3.0" invariant "^2.2.4" is-in-browser "^2.0.0" @@ -5292,11 +5292,6 @@ chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^5.1.2: - version "5.2.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.2.0.tgz#249623b7d66869c673699fb66d65723e54dfcfb3" - integrity sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA== - char-regex@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" @@ -11497,7 +11492,7 @@ react-docgen@^5.4.0: node-dir "^0.1.10" strip-indent "^3.0.0" -react-dom@^18.1.0: +react-dom@^18.2.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== -- 2.49.1