web3-onboard-monorepo
Version:
Web3-Onboard makes it simple to connect Ethereum hardware and software wallets to your dapp. Features standardised spec compliant web3 providers for all supported wallets, framework agnostic modern javascript UI with code splitting, CSS customization, mul
107 lines (86 loc) • 2.58 kB
text/typescript
import { firstValueFrom, Subject, take } from 'rxjs'
import LoginModal from './view/LoginModal.svelte'
import { loggedIn$ } from './streams.js'
import { SofiaProRegular, SofiaProLight } from '@web3-onboard/common'
import type { LoginOptions } from './types.js'
// eslint-disable-next-line max-len
const loginModal = async (options: LoginOptions): Promise<boolean> => {
if (options) {
const error = !options
if (error) {
throw error
}
}
const app = mountLoginModal(options, loggedIn$)
loggedIn$.pipe(take(1)).subscribe(() => {
app.$destroy()
const modalEl = document.body.querySelector('onboard-magic-login-modal')
modalEl && document.body.removeChild(modalEl)
})
return firstValueFrom(loggedIn$)
}
// eslint-disable-next-line max-len
const mountLoginModal = (
loginOptions: LoginOptions,
loggedIn$: Subject<boolean>
) => {
class loginModalEl extends HTMLElement {
constructor() {
super()
}
}
if (!customElements.get('onboard-magic-login-modal')) {
customElements.define('onboard-magic-login-modal', loginModalEl)
}
// Add Fonts to main page
const styleEl = document.createElement('style')
styleEl.innerHTML = `
${SofiaProRegular}
${SofiaProLight}
`
document.body.appendChild(styleEl)
// add to DOM
const loginModalDomElement = document.createElement(
'onboard-magic-login-modal'
)
const target = loginModalDomElement.attachShadow({ mode: 'open' })
loginModalDomElement.style.all = 'initial'
target.innerHTML = `
<style>
:host {
/* COLORS */
--white: white;
--black: black;
--primary-300: #b1b8f2;
--primary-500: #6370e5;
--gray-200: #c2c4c9;
--gray-500: #33394b;
--danger-500: #ff4f4f;
/* FONTS */
--font-family-normal: Sofia Pro;
--font-family-light: Sofia Pro Light;
--font-size-5: 1rem;
--font-line-height-1: 24px;
/* SPACING */
--margin-4: 1rem;
--margin-5: 0.5rem;
/* MODAL POSITION */
--login-modal-z-index: 25;
--login-modal-top: unset;
--login-modal-right: unset;
--login-modal-bottom: unset;
--login-modal-left: unset;
}
</style>
`
document.body.appendChild(loginModalDomElement)
const app = new LoginModal({
target: target,
props: {
loginOptions,
loggedIn$
}
})
return app
}
export default loginModal