import React, {Fragment, useCallback} from 'react';
import StatusCardSkeleton, {type StatusCardSkeletonData} from "./StatusCardSkeleton";
import SkeletonParagraph from "../skeleton/SkeletonParagraph";
import {clientAdapter} from "../../status/ducks";
import type {RootState} from "../../store";
import {connect, type ConnectedProps} from "react-redux";
import {Link} from "react-router-dom";
import {useStartClientMutation, useListenClientMutation} from "./clientDucks";
export interface ClientStatusCardData extends StatusCardSkeletonData, PropsFromRedux {
loading?: boolean
key: any
}
const statusToStatusType = (status: string) => {
const lower = status.toLowerCase();
if(lower.includes('running') || lower.includes('data')) {
return 'active';
}
if(lower.includes('idle')) {
return 'warn';
}
return 'error';
}
const ClientStatusCard = (props: ClientStatusCardData) => {
const {
loading = false,
data,
data: {
name,
type,
display,
status,
scrobbled: scrobbledCount = 0,
queued = 0,
deadLetterScrobbles = 0,
deadLetterScrobblesTotal = 0,
} = {}
} = props;
const [startClientPut, startResult] = useStartClientMutation();
const [listenPut, listenResult] = useListenClientMutation();
const tryStart = useCallback((name: string, force?: boolean) => startClientPut({name, force}), [startClientPut]);
const tryListen = useCallback((name: string, type: string, currentListening?: boolean) => {
// cycle through states
let nextListen: boolean | undefined;
switch(currentListening) {
case true:
nextListen = false;
break;
case false:
nextListen = undefined;
break;
case undefined:
nextListen = true;
break;
}
listenPut({name, type, listening: nextListen});
}, [listenPut]);
let header: string | undefined = display;
let body = ;
const startClientElement = (
tryStart(name)} className="capitalize underline cursor-pointer inline mr-1">{status === 'Running' ? 'Restart' : 'Start'}
( tryStart(name, true)} className="capitalize underline cursor-pointer inline">Force
)
)
let subtitleElement = startClientElement;
if(data !== undefined) {
const {
hasAuth,
hasAuthInteraction,
manualListening,
systemListeningBehavior,
name,
type,
authed,
initialized
} = data;
header = `${display} (Client)`;
const ml = useMemo(() => {
if(listenResult.status !== 'fulfilled' || listenResult.data === undefined) {
return manualListening;
}
return (listenResult.data as any).listening;
}, [manualListening, listenResult]);
const manualListenElement = (
Monitoring:
tryListen(name, type, ml)}
className="capitalize underline cursor-pointer inline mr-1 ml-1">
{ml !== undefined ? (ml ? 'Yes' : 'No') : null}
{ml === undefined ? System {systemListeningBehavior ? '(Yes)' : '(No)'} : null}
{/* {ml !== undefined ? tryListen(name, type, undefined)}
className="capitalize underline cursor-pointer inline">Clear
: null} */}
);
subtitleElement = {startClientElement};//{manualListenElement} | {startClientElement};
const scrobbled = initialized && (!hasAuth || (hasAuth && authed)) ? Tracks Scrobbled : Tracks Scrobbled;
body = (
{scrobbled}: {scrobbledCount}
Queued Scrobbles: {queued}
Failed Scrobbles: {deadLetterScrobbles} Queued / {deadLetterScrobblesTotal} Total
{hasAuthInteraction ? (Re)authenticate : null}
);
}
return (
{body}
);
}
const simpleSelectors = clientAdapter.getSelectors();
const mapStateToProps = (state: RootState, props) => ({
data: simpleSelectors.selectById(state.clients, props.id)
});
const connector = connect(mapStateToProps);
type PropsFromRedux = ConnectedProps
export default connector(ClientStatusCard);