@creit.tech/stellar-wallets-kit
Version:
A kit to handle all Stellar Wallets at once
1 lines • 16.3 kB
Source Map (JSON)
{"version":3,"file":"stellar-wallets-modal.mjs","sources":["../../../src/components/modal/stellar-wallets-modal.ts"],"sourcesContent":["import { LitElement, html, css } from 'lit';\nimport { styleMap } from 'lit/directives/style-map.js';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { ReactiveState } from '../../state/reactive-state';\nimport { allowedWallets$, modalTheme$ } from '../../state/store';\n\nimport { ISupportedWallet, IModalTheme } from '../../types';\nimport {\n backdropStyles,\n modalWalletsSection,\n modalDialogBodyStyles,\n modalDialogStyles,\n modalHelpSection,\n modalAnimations,\n} from './styles';\n\nexport enum ModalThemeType {\n DARK = 'DARK',\n LIGHT = 'LIGHT',\n}\n\nexport const ModalThemes: { [key in ModalThemeType]: IModalTheme } = {\n DARK: {\n bgColor: '#161616',\n textColor: '#a0a0a0',\n solidTextColor: '#ededed',\n headerButtonColor: '#707070',\n dividerColor: 'rgba(255, 255, 255, 0.15)',\n helpBgColor: '#1c1c1c',\n notAvailableTextColor: '#a0a0a0',\n notAvailableBgColor: '#232323',\n notAvailableBorderColor: '#343434',\n },\n LIGHT: {\n bgColor: '#fcfcfc',\n textColor: '#181818',\n solidTextColor: '#000000',\n headerButtonColor: '#8f8f8f',\n dividerColor: 'rgba(0, 0, 0, 0.15)',\n helpBgColor: '#f8f8f8',\n notAvailableTextColor: '#6f6f6f',\n notAvailableBgColor: '#f3f3f3',\n notAvailableBorderColor: '#e2e2e2',\n },\n};\n\n@customElement('stellar-wallets-modal')\nexport class StellarWalletsModal extends LitElement {\n static override styles = [\n css`\n :host * {\n box-sizing: border-box;\n }\n\n .mb-0 {\n margin-bottom: 0 !important;\n }\n `,\n modalDialogStyles,\n modalDialogBodyStyles,\n modalHelpSection,\n backdropStyles,\n modalAnimations,\n modalWalletsSection,\n ];\n\n /**\n * This value is used to tell the modal that it should not update the value\n * `showModal` at any moment, this comes handy when the state wants to be handled by another source\n */\n @property({ type: Boolean, reflect: true })\n ignoreShowStatus: boolean = false;\n\n @property({ type: Boolean, reflect: true })\n showModal: boolean = false;\n\n @state()\n closingModal: boolean = false;\n\n @property({ type: String, reflect: true })\n modalTitle: string = 'Connect a Wallet';\n\n @property({ type: String, reflect: true })\n notAvailableText: string = 'Not available';\n\n allowedWallets: ReactiveState<ISupportedWallet[]> = new ReactiveState(this, allowedWallets$);\n\n theme: ReactiveState<IModalTheme | undefined> = new ReactiveState(this, modalTheme$);\n\n override connectedCallback() {\n super.connectedCallback();\n }\n\n async closeModal(): Promise<void> {\n this.closingModal = true;\n\n await new Promise(r => setTimeout(r, 280));\n\n if (!this.ignoreShowStatus) {\n this.showModal = false;\n }\n\n this.dispatchEvent(\n new CustomEvent('modal-closed', {\n detail: new Error('Modal closed'),\n bubbles: true,\n composed: true,\n })\n );\n\n this.closingModal = false;\n }\n\n async pickWalletOption(option: ISupportedWallet): Promise<void> {\n if (!option.isAvailable) {\n window.open(option.url, '_blank');\n return;\n }\n\n this.closingModal = true;\n\n await new Promise(r => setTimeout(r, 280));\n\n try {\n const record: string | null = window.localStorage.getItem('@StellarWalletsKit/usedWalletsIds');\n let usedWalletsIds: Array<ISupportedWallet['id']> = record ? JSON.parse(record) : [];\n usedWalletsIds = [option.id, ...usedWalletsIds.filter((id: string): boolean => id !== option.id)];\n window.localStorage.setItem('@StellarWalletsKit/usedWalletsIds', JSON.stringify(usedWalletsIds));\n } catch (e) {\n console.error(e);\n }\n\n this.dispatchEvent(\n new CustomEvent('wallet-selected', {\n detail: option,\n bubbles: true,\n composed: true,\n })\n );\n\n this.closingModal = false;\n }\n\n /**\n * This function gets the list of the wallets following the logic from this task https://github.com/Creit-Tech/Stellar-Wallets-Kit/issues/28\n * It follows this order:\n * 1- Wallet last used by wallet selector\n * 2- If not wallet last use, wallets detected in the browser\n * 3- Wallet ordering as defined by the developer\n *\n */\n private getSortedList(): ISupportedWallet[] {\n const sortedWallets: { available: ISupportedWallet[]; unavailable: ISupportedWallet[] } =\n this.allowedWallets.value!.reduce(\n (all: { available: ISupportedWallet[]; unavailable: ISupportedWallet[] }, current: ISupportedWallet) => {\n return {\n available: current.isAvailable ? [...all.available, current] : all.available,\n unavailable: !current.isAvailable ? [...all.unavailable, current] : all.unavailable,\n };\n },\n { available: [], unavailable: [] }\n );\n\n let usedWalletsIds: Array<ISupportedWallet['id']>;\n try {\n const record: string | null = window.localStorage.getItem('@StellarWalletsKit/usedWalletsIds');\n usedWalletsIds = record ? JSON.parse(record) : [];\n } catch (e) {\n console.error(e);\n usedWalletsIds = [];\n }\n\n if (usedWalletsIds.length === 0) {\n return [...sortedWallets.available, ...sortedWallets.unavailable];\n }\n\n const usedWallets: ISupportedWallet[] = [];\n const nonUsedWallets: ISupportedWallet[] = [];\n for (const availableWallet of sortedWallets.available) {\n if (usedWalletsIds.find((id: string): boolean => id === availableWallet.id)) {\n usedWallets.push(availableWallet);\n } else {\n nonUsedWallets.push(availableWallet);\n }\n }\n\n return [\n ...usedWallets.sort((a: ISupportedWallet, b: ISupportedWallet) => {\n return usedWalletsIds.indexOf(a.id) - usedWalletsIds.indexOf(b.id);\n }),\n ...nonUsedWallets,\n ...sortedWallets.unavailable,\n ];\n }\n\n private getThemeStyles() {\n if (!this.theme.value) return {};\n\n return {\n '--modal-bg-color': this.theme.value.bgColor,\n '--modal-text-color': this.theme.value.textColor,\n '--modal-solid-text-color': this.theme.value.solidTextColor,\n '--modal-header-button-color': this.theme.value.headerButtonColor,\n '--modal-divider-color': this.theme.value.dividerColor,\n '--modal-help-bg-color': this.theme.value.helpBgColor,\n '--modal-not-available-text-color': this.theme.value.notAvailableTextColor,\n '--modal-not-available-bg-color': this.theme.value.notAvailableBgColor,\n '--modal-not-available-border-color': this.theme.value.notAvailableBorderColor,\n };\n }\n\n override render() {\n const helpSection = html`\n <section class=\"help-container\">\n <header class=\"help-header\">\n <h2 class=\"help-header__modal-title dialog-text-solid\">Learn more</h2>\n </header>\n\n <div class=\"help__whats_a_wallet\">\n <h2 class=\"dialog-text-solid help__title\">What is a wallet?</h2>\n <p class=\"dialog-text help__text\">\n Wallets are used to send, receive, and store the keys you use to sign blockchain transactions.\n </p>\n </div>\n\n <div class=\"help__whats_stellar\">\n <h2 class=\"dialog-text-solid help__title\">What is Stellar?</h2>\n <p class=\"dialog-text help__text\">\n Stellar is a decentralized, public blockchain that gives developers the tools to create experiences that are\n more like cash than crypto\n </p>\n </div>\n </section>\n `;\n\n const walletsSection = html`\n <section class=\"wallets-container\">\n <header class=\"wallets-header\">\n <h2 class=\"wallets-header__modal-title dialog-text-solid\">${this.modalTitle}</h2>\n\n <button @click=${() => this.closeModal()} class=\"wallets-header__button\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"#000000\" height=\"20px\" width=\"20px\" viewBox=\"0 0 490 490\">\n <polygon\n points=\"456.851,0 245,212.564 33.149,0 0.708,32.337 212.669,245.004 0.708,457.678 33.149,490 245,277.443 456.851,490 489.292,457.678 277.331,245.004 489.292,32.337 \" />\n </svg>\n </button>\n </header>\n\n <ul class=\"wallets-body\">\n ${this.getSortedList().map(\n (item: ISupportedWallet, i: number) =>\n html`\n <li\n @click=${() => this.pickWalletOption(item)}\n class=\" wallets-body__item ${!item.isAvailable ? 'not-available' : ''} ${i ===\n this.allowedWallets.value!.length - 1\n ? 'mb-0'\n : ''}\">\n <img src=${item.icon} alt=${item.name} />\n <span class=\"dialog-text-solid\">${item.name}</span>\n ${!item.isAvailable ? html`<small class=\"not-available\">${this.notAvailableText}</small>` : ''}\n </li>\n `\n )}\n </ul>\n </section>\n `;\n\n return html`\n <dialog\n style=${styleMap(this.getThemeStyles())}\n class=\"dialog-modal ${this.closingModal ? 'closing' : ''}\"\n .open=${this.showModal}>\n <section class=\"dialog-modal-body\">\n <div class=\"dialog-modal-body__help\">${helpSection}</div>\n <div class=\"dialog-modal-body__wallets\">${walletsSection}</div>\n </section>\n </dialog>\n\n <div\n style=\"position: fixed; z-index: 950\"\n class=\"backdrop ${this.closingModal ? 'closing' : ''}\"\n @click=${() => this.closeModal()}></div>\n `;\n }\n}\n"],"names":[],"mappings":"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"}