var __assign = (this && this.__assign) || function () {
    __assign = Object.assign || function(t) {
        for (var s, i = 1, n = arguments.length; i < n; i++) {
            s = arguments[i];
            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
                t[p] = s[p];
        }
        return t;
    };
    return __assign.apply(this, arguments);
};
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
var __generator = (this && this.__generator) || function (thisArg, body) {
    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
    function verb(n) { return function (v) { return step([n, v]); }; }
    function step(op) {
        if (f) throw new TypeError("Generator is already executing.");
        while (_) try {
            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
            if (y = 0, t) op = [op[0] & 2, t.value];
            switch (op[0]) {
                case 0: case 1: t = op; break;
                case 4: _.label++; return { value: op[1], done: false };
                case 5: _.label++; y = op[1]; op = [0]; continue;
                case 7: op = _.ops.pop(); _.trys.pop(); continue;
                default:
                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                    if (t[2]) _.ops.pop();
                    _.trys.pop(); continue;
            }
            op = body.call(thisArg, _);
        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
    }
};
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
import { useEffect, useState } from 'react';
import { useSelector, useDispatch } from 'react-redux';
import { asyncPoll } from 'sw-web-shared';
import { Box, Typography } from '@mui/material';
import { QRCode } from 'react-qrcode-logo';
import { useHistory } from 'react-router-dom';
import { fetchSkillWallet, getActivationNonce, getTokenId, isQrCodeActive } from '../services/web3/web3Service';
import { currentCommunity } from '../store/sw-auth.reducer';
import { loadingFinished, showDialog, startLoading } from '../store/sw-ui-reducer';
import { setUserData } from '../store/sw-user-data.reducer';
import ErrorBox from '../components/ErrorBox';
import { ErrorTypes } from '../types/error-types';
import { OutputEventTypes } from '../types/event-types';
import { dispatchSwEvent } from '../utils/utils';
var ScanQR = function (props) {
    var dispatch = useDispatch();
    var history = useHistory();
    var community = useSelector(currentCommunity);
    var _a = useState(undefined), qrData = _a[0], setQrData = _a[1];
    var _b = useState(undefined), errorData = _b[0], setErrorData = _b[1];
    var pollQRCodeActivated = function (token) { return __awaiter(void 0, void 0, void 0, function () {
        var fn, condition;
        return __generator(this, function (_a) {
            fn = function () { return isQrCodeActive(token); };
            condition = function (active) { return !active; };
            return [2 /*return*/, asyncPoll(fn, condition, 8000, 50)];
        });
    }); };
    useEffect(function () {
        var fetchData = function () { return __awaiter(void 0, void 0, void 0, function () {
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        dispatch(startLoading('Generating activation QR.'));
                        return [4 /*yield*/, getTokenId()
                                .then(function (token) { return __awaiter(void 0, void 0, void 0, function () {
                                return __generator(this, function (_a) {
                                    switch (_a.label) {
                                        case 0: return [4 /*yield*/, getActivationNonce(token.toString()).then(function (nonce) { return __awaiter(void 0, void 0, void 0, function () {
                                                return __generator(this, function (_a) {
                                                    switch (_a.label) {
                                                        case 0:
                                                            console.log('NONCE', nonce);
                                                            setQrData({ tokenId: token.toString(), nonce: nonce });
                                                            dispatch(loadingFinished());
                                                            return [4 /*yield*/, pollQRCodeActivated(token).then(function (result) { return __awaiter(void 0, void 0, void 0, function () {
                                                                    var sw;
                                                                    return __generator(this, function (_a) {
                                                                        switch (_a.label) {
                                                                            case 0:
                                                                                if (!result) return [3 /*break*/, 2];
                                                                                dispatchSwEvent(OutputEventTypes.SkillWalletActivated, true);
                                                                                return [4 /*yield*/, fetchSkillWallet()];
                                                                            case 1:
                                                                                sw = _a.sent();
                                                                                window.sessionStorage.setItem('skillWallet', JSON.stringify(sw));
                                                                                dispatch(setUserData({
                                                                                    username: sw.nickname,
                                                                                    profileImageUrl: sw.imageUrl,
                                                                                    isLoggedIn: true,
                                                                                }));
                                                                                // dispatch(setLoggedIn(true));
                                                                                // dispatch(setUserName(sw.nickname));
                                                                                // dispatch(setUserProfilePicture(sw.imageUrl));
                                                                                dispatch(showDialog(false));
                                                                                history.push('/');
                                                                                dispatchSwEvent(OutputEventTypes.Login, true);
                                                                                return [3 /*break*/, 3];
                                                                            case 2:
                                                                                setErrorData({
                                                                                    errorMessage: 'QR Code not scanned.',
                                                                                    actionLabel: 'Retry',
                                                                                    action: function () {
                                                                                        setErrorData(undefined);
                                                                                        fetchData();
                                                                                    },
                                                                                });
                                                                                _a.label = 3;
                                                                            case 3: return [2 /*return*/];
                                                                        }
                                                                    });
                                                                }); })];
                                                        case 1:
                                                            _a.sent();
                                                            return [2 /*return*/];
                                                    }
                                                });
                                            }); })];
                                        case 1:
                                            _a.sent();
                                            return [2 /*return*/];
                                    }
                                });
                            }); })
                                .catch(function (e) {
                                console.log(e);
                                if (e.message === ErrorTypes.CouldNotGetActivationNonce) {
                                    setErrorData({
                                        errorMessage: 'Could not retreave activation nonce.',
                                        actionLabel: 'Retry',
                                        action: function () {
                                            setErrorData(undefined);
                                            fetchData();
                                        },
                                    });
                                }
                                else {
                                    if (e.message === 'Already processing eth_requestAccounts. Please wait.') {
                                        e.message = ErrorTypes.GetAccountsInProgress;
                                    }
                                    setErrorData({
                                        errorMessage: e.message,
                                        actionLabel: 'Retry',
                                        action: function () {
                                            setErrorData(undefined);
                                            fetchData();
                                        },
                                    });
                                }
                                dispatch(loadingFinished());
                            })];
                    case 1:
                        _a.sent();
                        return [2 /*return*/];
                }
            });
        }); };
        fetchData();
    }, []);
    return (_jsx(Box, __assign({ sx: {
            width: '100%',
            minHeight: '429px',
            display: 'flex',
            justifyContent: 'center',
            flexDirection: 'column',
            alignItems: 'center',
            py: '16px',
        } }, { children: errorData ? (_jsx(ErrorBox, { errorData: errorData }, void 0)) : (_jsxs(_Fragment, { children: [_jsx(Box, __assign({ sx: {
                        width: '100%',
                        display: 'flex',
                        justifyContent: 'center',
                        flexDirection: 'column',
                        alignItems: 'center',
                    } }, { children: _jsx(Box, __assign({ sx: {
                            mb: '40px',
                            display: 'flex',
                            flexDirection: 'column',
                            alignItems: 'center',
                            justifyContent: 'center',
                            gridGap: '20px',
                            minWidth: '282px',
                            minHeight: '251px',
                            border: 2,
                            borderColor: 'secondary',
                            backgroundColor: '#FFFFFF',
                        } }, { children: qrData && (_jsx(QRCode, { size: 250, logoImage: community.image, logoWidth: 70, logoHeight: 70, value: JSON.stringify(qrData) }, void 0)) }), void 0) }), void 0), _jsx(Box, __assign({ sx: {
                        backgroundColor: '#FFFFFF',
                        minWidth: '282px',
                        height: '69px',
                        display: 'flex',
                        flexDirection: 'column',
                        justifyContent: 'center',
                        alignItems: 'center',
                        maxWidth: '282px',
                    } }, { children: _jsxs(Typography, __assign({ align: "center", variant: "h3", sx: { color: '#000000', fontWeight: '400' } }, { children: ["Scan with your", ' ', _jsxs(Typography, __assign({ variant: "h3", component: "span", sx: { color: '#000000', fontWeight: '400', textDecorationLine: 'underline' } }, { children: ["SkillWallet App", ' '] }), void 0), "to Claim your", ' ', _jsx(Typography, __assign({ variant: "h3", component: "span", sx: { color: '#000000', fontWeight: '400', textDecorationLine: 'underline' } }, { children: "Membership!" }), void 0)] }), void 0) }), void 0)] }, void 0)) }), void 0));
};
export default ScanQR;
