import { put, StrictEffect, take, takeEvery } from '@redux-saga/core/effects';
import { push } from 'connected-react-router';
import apiActions from '../api/actions';
import apiProto from '../api/proto';
import { ApiActionType, OutputType, ReadApiAction } from '../api/types';
import userActions from './actions';
import { JoinUserAction, UserActionType } from './types';

function* handleJoin(action: JoinUserAction): Generator<StrictEffect> {
    yield put(apiActions.write(apiProto.join(action.payload.name)));

    while (true) {
        const read = (yield take(ApiActionType.Read)) as ReadApiAction;

        if (read.payload.type === OutputType.Error) {
            yield put(userActions.joined({ error: true, code: read.payload.payload.code }));
            break;
        } else if (read.payload.type === OutputType.Joined) {
            const output = read.payload.payload;
            yield put(userActions.joined({
                error: false,
                user: output.user,
                others: output.others,
                messages: output.messages,
            }));
            break;
        }
    }

    yield put(push('/feed'));
}

export function* userSaga(): Generator<StrictEffect> {
    yield takeEvery(UserActionType.Join, handleJoin);
}