implement websocket to send reindex messages
This commit is contained in:
		@@ -2,7 +2,6 @@ import React from 'react';
 | 
			
		||||
import style from './MovieSettings.module.css';
 | 
			
		||||
import {APINode, callAPI} from '../../utils/Api';
 | 
			
		||||
import {GeneralSuccess} from '../../types/GeneralTypes';
 | 
			
		||||
import {SettingsTypes} from '../../types/ApiTypes';
 | 
			
		||||
 | 
			
		||||
interface state {
 | 
			
		||||
    text: string[];
 | 
			
		||||
@@ -11,13 +10,23 @@ interface state {
 | 
			
		||||
 | 
			
		||||
interface Props {}
 | 
			
		||||
 | 
			
		||||
interface MessageBase {
 | 
			
		||||
    Action: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
interface TextMessage extends MessageBase {
 | 
			
		||||
    Message: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
interface ReindexEvent extends MessageBase {
 | 
			
		||||
    Event: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Component for MovieSettings on Settingspage
 | 
			
		||||
 * handles settings concerning to movies in general
 | 
			
		||||
 */
 | 
			
		||||
class MovieSettings extends React.Component<Props, state> {
 | 
			
		||||
    myinterval: number = -1;
 | 
			
		||||
 | 
			
		||||
    constructor(props: Props) {
 | 
			
		||||
        super(props);
 | 
			
		||||
 | 
			
		||||
@@ -28,12 +37,61 @@ class MovieSettings extends React.Component<Props, state> {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    componentDidMount(): void {
 | 
			
		||||
        this.myinterval = window.setInterval(this.updateStatus, 1000);
 | 
			
		||||
        // expectingMessage is set to true
 | 
			
		||||
        this.dial();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    componentWillUnmount(): void {
 | 
			
		||||
        if (this.myinterval !== -1) {
 | 
			
		||||
            clearInterval(this.myinterval);
 | 
			
		||||
    dial(): void {
 | 
			
		||||
        console.log('trying to connect...');
 | 
			
		||||
        const conn = new WebSocket(`ws://${window.location.host}/subscribe`);
 | 
			
		||||
        console.log('dd to connect...');
 | 
			
		||||
        conn.addEventListener('close', (ev) => {
 | 
			
		||||
            this.appendLog(`WebSocket Disconnected code: ${ev.code}, reason: ${ev.reason}`, true);
 | 
			
		||||
            if (ev.code !== 1001) {
 | 
			
		||||
                this.appendLog('Reconnecting in 1s', true);
 | 
			
		||||
                setTimeout((): void => this.dial(), 1000);
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
        conn.addEventListener('open', (_ev) => {
 | 
			
		||||
            console.info('websocket connected');
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        // This is where we handle messages received.
 | 
			
		||||
        conn.addEventListener('message', (ev) => {
 | 
			
		||||
            console.log('new message!');
 | 
			
		||||
            if (typeof ev.data !== 'string') {
 | 
			
		||||
                console.error('unexpected message type', typeof ev.data);
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            this.handleMessage(ev.data);
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    handleMessage(message: string): void {
 | 
			
		||||
        const obj: MessageBase = JSON.parse(message);
 | 
			
		||||
 | 
			
		||||
        if (obj.Action === 'message') {
 | 
			
		||||
            const msg = obj as TextMessage;
 | 
			
		||||
            this.appendLog(msg.Message);
 | 
			
		||||
        } else if (obj.Action === 'reindexAction') {
 | 
			
		||||
            const msg = obj as ReindexEvent;
 | 
			
		||||
            if (msg.Event === 'start') {
 | 
			
		||||
                this.setState({startbtnDisabled: true});
 | 
			
		||||
            } else if (msg.Event === 'stop') {
 | 
			
		||||
                this.setState({startbtnDisabled: false});
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // appendLog appends the passed text to messageLog.
 | 
			
		||||
    appendLog(text: string, error?: boolean): void {
 | 
			
		||||
        this.setState({
 | 
			
		||||
            // insert a string for each line
 | 
			
		||||
            text: [text, ...this.state.text]
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        if (error) {
 | 
			
		||||
            console.log('heyy err');
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -51,9 +109,9 @@ class MovieSettings extends React.Component<Props, state> {
 | 
			
		||||
                <button
 | 
			
		||||
                    className='btn btn-warning'
 | 
			
		||||
                    onClick={(): void => {
 | 
			
		||||
                        this.cleanupGravity();
 | 
			
		||||
                        this.startTVShowReindex();
 | 
			
		||||
                    }}>
 | 
			
		||||
                    Cleanup Gravity
 | 
			
		||||
                    TVShow Reindex
 | 
			
		||||
                </button>
 | 
			
		||||
                <div className={style.indextextarea}>
 | 
			
		||||
                    {this.state.text.map((m) => (
 | 
			
		||||
@@ -70,44 +128,15 @@ class MovieSettings extends React.Component<Props, state> {
 | 
			
		||||
     * starts the reindex process of the videos in the specified folder
 | 
			
		||||
     */
 | 
			
		||||
    startReindex(): void {
 | 
			
		||||
        this.setState({text: []});
 | 
			
		||||
        // clear output text before start
 | 
			
		||||
        this.setState({text: [], startbtnDisabled: true});
 | 
			
		||||
 | 
			
		||||
        callAPI(APINode.Settings, {action: 'startReindex'}, (result: GeneralSuccess): void => {
 | 
			
		||||
            console.log(result);
 | 
			
		||||
            if (result.result === 'success') {
 | 
			
		||||
                console.log('started successfully');
 | 
			
		||||
            } else {
 | 
			
		||||
                console.log('error, reindex already running');
 | 
			
		||||
                this.setState({startbtnDisabled: true});
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        if (this.myinterval !== -1) {
 | 
			
		||||
            clearInterval(this.myinterval);
 | 
			
		||||
        }
 | 
			
		||||
        this.myinterval = window.setInterval(this.updateStatus, 1000);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This interval function reloads the current status of reindexing from backend
 | 
			
		||||
     */
 | 
			
		||||
    updateStatus = (): void => {
 | 
			
		||||
        callAPI(APINode.Settings, {action: 'getStatusMessage'}, (result: SettingsTypes.getStatusMessageType) => {
 | 
			
		||||
            this.setState({
 | 
			
		||||
                // insert a string for each line
 | 
			
		||||
                text: [...result.Messages, ...this.state.text]
 | 
			
		||||
            });
 | 
			
		||||
            // todo 2020-07-4: scroll to bottom of div here
 | 
			
		||||
            if (!result.ContentAvailable) {
 | 
			
		||||
                // clear refresh interval if no content available
 | 
			
		||||
                clearInterval(this.myinterval);
 | 
			
		||||
 | 
			
		||||
                this.setState({startbtnDisabled: false});
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * send request to cleanup db gravity
 | 
			
		||||
     */
 | 
			
		||||
@@ -118,6 +147,15 @@ class MovieSettings extends React.Component<Props, state> {
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private startTVShowReindex(): void {
 | 
			
		||||
        this.setState({text: []});
 | 
			
		||||
        callAPI(APINode.Settings, {action: 'startTVShowReindex'}, (result: GeneralSuccess): void => {
 | 
			
		||||
            if (result.result === 'success') {
 | 
			
		||||
                console.log('started successfully');
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export default MovieSettings;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user