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);
};
import { createContext, useContext, useMemo } from "react";
import { SuiClient, getFullnodeUrl } from "@mysten/sui/client";
import { useLocalStorage } from "usehooks-ts";
import { EXPLORERS, RPCS, RpcId, } from "@suilend/frontend-sui";
var defaultContextValue = {
    rpc: RPCS[0],
    setRpcId: function () {
        throw Error("SettingsContextProvider not initialized");
    },
    setRpcUrl: function () {
        throw Error("SettingsContextProvider not initialized");
    },
    explorer: EXPLORERS[0],
    setExplorerId: function () {
        throw Error("SettingsContextProvider not initialized");
    },
    gasBudget: "",
    setGasBudget: function () {
        throw Error("SettingsContextProvider not initialized");
    },
    suiClient: new SuiClient({ url: getFullnodeUrl("mainnet") }),
};
var SettingsContext = createContext(defaultContextValue);
export var useSettingsContext = function () { return useContext(SettingsContext); };
export function SettingsContextProvider(_a) {
    var children = _a.children;
    // RPC
    var _b = useLocalStorage("rpcId", defaultContextValue.rpc.id), rpcId = _b[0], setRpcId = _b[1];
    var _c = useLocalStorage("rpcUrl", ""), rpcUrl = _c[0], setRpcUrl = _c[1];
    var rpc = useMemo(function () {
        var _a;
        return rpcId === RpcId.CUSTOM
            ? __assign(__assign({}, RPCS.find(function (_rpc) { return _rpc.id === RpcId.CUSTOM; })), { url: rpcUrl }) : ((_a = RPCS.find(function (_rpc) { return _rpc.id === rpcId; })) !== null && _a !== void 0 ? _a : RPCS[0]);
    }, [rpcId, rpcUrl]);
    // Explorer
    var _d = useLocalStorage("explorerId", defaultContextValue.explorer.id), explorerId = _d[0], setExplorerId = _d[1];
    var explorer = useMemo(function () {
        var _a;
        return (_a = EXPLORERS.find(function (_explorer) { return _explorer.id === explorerId; })) !== null && _a !== void 0 ? _a : EXPLORERS[0];
    }, [explorerId]);
    // Gas budget
    var _e = useLocalStorage("gasBudget", defaultContextValue.gasBudget), gasBudget = _e[0], setGasBudget = _e[1];
    // Sui client
    var suiClient = useMemo(function () { return new SuiClient({ url: rpc.url }); }, [rpc.url]);
    // Context
    var contextValue = useMemo(function () { return ({
        rpc: rpc,
        setRpcId: setRpcId,
        setRpcUrl: setRpcUrl,
        explorer: explorer,
        setExplorerId: setExplorerId,
        gasBudget: gasBudget,
        setGasBudget: setGasBudget,
        suiClient: suiClient,
    }); }, [
        rpc,
        setRpcId,
        setRpcUrl,
        explorer,
        setExplorerId,
        gasBudget,
        setGasBudget,
        suiClient,
    ]);
    return (<SettingsContext.Provider value={contextValue}>
      {children}
    </SettingsContext.Provider>);
}
