mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-12-23 09:52:26 +01:00
f5d4ab1cc1
We were including the polyfill for the `Intl.RelativeTimeFormat` API, but we weren't including any locale data. This polyfill doesn't work without the locale data for whichever locale you're formatting. The data for all locales we support is now included. The locale data is loaded from disk as-needed (during app startup, and upon each change in locale).
174 lines
5.2 KiB
JavaScript
174 lines
5.2 KiB
JavaScript
import copyToClipboard from 'copy-to-clipboard'
|
|
import log from 'loglevel'
|
|
import { clone } from 'lodash'
|
|
import React from 'react'
|
|
import { render } from 'react-dom'
|
|
import Root from './app/pages'
|
|
import * as actions from './app/store/actions'
|
|
import configureStore from './app/store/store'
|
|
import txHelper from './lib/tx-helper'
|
|
import { getEnvironmentType } from '../app/scripts/lib/util'
|
|
import { ALERT_TYPES } from '../app/scripts/controllers/alert'
|
|
import { ENVIRONMENT_TYPE_POPUP } from '../app/scripts/lib/enums'
|
|
import { fetchLocale, loadRelativeTimeFormatLocaleData } from './app/helpers/utils/i18n-helper'
|
|
import switchDirection from './app/helpers/utils/switch-direction'
|
|
import { getPermittedAccountsForCurrentTab, getSelectedAddress } from './app/selectors'
|
|
import { ALERT_STATE } from './app/ducks/alerts/unconnected-account'
|
|
import {
|
|
getUnconnectedAccountAlertEnabledness,
|
|
getUnconnectedAccountAlertShown,
|
|
} from './app/ducks/metamask/metamask'
|
|
|
|
log.setLevel(global.METAMASK_DEBUG ? 'debug' : 'warn')
|
|
|
|
export default function launchMetamaskUi (opts, cb) {
|
|
const { backgroundConnection } = opts
|
|
actions._setBackgroundConnection(backgroundConnection)
|
|
// check if we are unlocked first
|
|
backgroundConnection.getState(function (err, metamaskState) {
|
|
if (err) {
|
|
return cb(err)
|
|
}
|
|
startApp(metamaskState, backgroundConnection, opts)
|
|
.then((store) => {
|
|
setupDebuggingHelpers(store)
|
|
cb(null, store)
|
|
})
|
|
})
|
|
}
|
|
|
|
async function startApp (metamaskState, backgroundConnection, opts) {
|
|
// parse opts
|
|
if (!metamaskState.featureFlags) {
|
|
metamaskState.featureFlags = {}
|
|
}
|
|
|
|
const currentLocaleMessages = metamaskState.currentLocale
|
|
? await fetchLocale(metamaskState.currentLocale)
|
|
: {}
|
|
const enLocaleMessages = await fetchLocale('en')
|
|
|
|
await loadRelativeTimeFormatLocaleData('en')
|
|
if (metamaskState.currentLocale) {
|
|
await loadRelativeTimeFormatLocaleData(metamaskState.currentLocale)
|
|
}
|
|
|
|
if (metamaskState.textDirection === 'rtl') {
|
|
await switchDirection('rtl')
|
|
}
|
|
|
|
const draftInitialState = {
|
|
activeTab: opts.activeTab,
|
|
|
|
// metamaskState represents the cross-tab state
|
|
metamask: metamaskState,
|
|
|
|
// appState represents the current tab's popup state
|
|
appState: {},
|
|
|
|
localeMessages: {
|
|
current: currentLocaleMessages,
|
|
en: enLocaleMessages,
|
|
},
|
|
}
|
|
|
|
if (getEnvironmentType() === ENVIRONMENT_TYPE_POPUP) {
|
|
const origin = draftInitialState.activeTab.origin
|
|
const permittedAccountsForCurrentTab = getPermittedAccountsForCurrentTab(draftInitialState)
|
|
const selectedAddress = getSelectedAddress(draftInitialState)
|
|
const unconnectedAccountAlertShownOrigins = getUnconnectedAccountAlertShown(draftInitialState)
|
|
const unconnectedAccountAlertIsEnabled = getUnconnectedAccountAlertEnabledness(draftInitialState)
|
|
|
|
if (
|
|
origin &&
|
|
unconnectedAccountAlertIsEnabled &&
|
|
!unconnectedAccountAlertShownOrigins[origin] &&
|
|
permittedAccountsForCurrentTab.length > 0 &&
|
|
!permittedAccountsForCurrentTab.includes(selectedAddress)
|
|
) {
|
|
draftInitialState[ALERT_TYPES.unconnectedAccount] = { state: ALERT_STATE.OPEN }
|
|
actions.setUnconnectedAccountAlertShown(origin)
|
|
}
|
|
}
|
|
|
|
const store = configureStore(draftInitialState)
|
|
|
|
// if unconfirmed txs, start on txConf page
|
|
const unapprovedTxsAll = txHelper(
|
|
metamaskState.unapprovedTxs,
|
|
metamaskState.unapprovedMsgs,
|
|
metamaskState.unapprovedPersonalMsgs,
|
|
metamaskState.unapprovedDecryptMsgs,
|
|
metamaskState.unapprovedEncryptionPublicKeyMsgs,
|
|
metamaskState.unapprovedTypedMessages,
|
|
metamaskState.network
|
|
)
|
|
const numberOfUnapprivedTx = unapprovedTxsAll.length
|
|
if (numberOfUnapprivedTx > 0) {
|
|
store.dispatch(actions.showConfTxPage({
|
|
id: unapprovedTxsAll[0].id,
|
|
}))
|
|
}
|
|
|
|
backgroundConnection.on('update', function (metamaskState) {
|
|
store.dispatch(actions.updateMetamaskState(metamaskState))
|
|
})
|
|
|
|
// global metamask api - used by tooling
|
|
global.metamask = {
|
|
updateCurrentLocale: (code) => {
|
|
store.dispatch(actions.updateCurrentLocale(code))
|
|
},
|
|
setProviderType: (type) => {
|
|
store.dispatch(actions.setProviderType(type))
|
|
},
|
|
setFeatureFlag: (key, value) => {
|
|
store.dispatch(actions.setFeatureFlag(key, value))
|
|
},
|
|
}
|
|
|
|
// start app
|
|
render(
|
|
<Root
|
|
store={store}
|
|
/>,
|
|
opts.container,
|
|
)
|
|
|
|
return store
|
|
}
|
|
|
|
function setupDebuggingHelpers (store) {
|
|
window.getCleanAppState = function () {
|
|
const state = clone(store.getState())
|
|
state.version = global.platform.getVersion()
|
|
state.browser = window.navigator.userAgent
|
|
return state
|
|
}
|
|
}
|
|
|
|
window.logStateString = function (cb) {
|
|
const state = window.getCleanAppState()
|
|
global.platform.getPlatformInfo((err, platform) => {
|
|
if (err) {
|
|
return cb(err)
|
|
}
|
|
state.platform = platform
|
|
const stateString = JSON.stringify(state, null, 2)
|
|
cb(null, stateString)
|
|
})
|
|
}
|
|
|
|
window.logState = function (toClipboard) {
|
|
return window.logStateString((err, result) => {
|
|
if (err) {
|
|
console.error(err.message)
|
|
} else if (toClipboard) {
|
|
copyToClipboard(result)
|
|
console.log('State log copied')
|
|
} else {
|
|
console.log(result)
|
|
}
|
|
})
|
|
}
|