${translate('settings.import')}
@@ -326,6 +213,7 @@ class SettingsPage extends connect(store)(LitElement) {
firstUpdated() {
const checkNode = localStorage.getItem('mySelectedNode')
+
if (checkNode === null || checkNode.length === 0) {
localStorage.setItem('mySelectedNode', 0)
} else {
@@ -364,13 +252,36 @@ class SettingsPage extends connect(store)(LitElement) {
this.dropdownOpen = false
this.requestUpdate()
this.nodeSelected(index)
+
localStorage.setItem('mySelectedNode', index)
const selectedNodeIndexOnNewStart = localStorage.getItem('mySelectedNode')
const catchSavedNodes = JSON.parse(localStorage.getItem('myQortalNodes'))
const selectedNodeOnNewStart = catchSavedNodes[selectedNodeIndexOnNewStart]
const selectedNameOnNewStart = `${selectedNodeOnNewStart.name}`
- const selectedNodeUrlOnNewStart = `${selectedNodeOnNewStart.protocol + '://' + selectedNodeOnNewStart.domain +':' + selectedNodeOnNewStart.port}`
+ const selectedNodeUrlOnNewStart = `${selectedNodeOnNewStart.protocol + '://' + selectedNodeOnNewStart.domain + ':' + selectedNodeOnNewStart.port}`
+
+ let snack2string = get('settings.snack2')
+
+ snackbar.add({
+ labelText: `${snack2string} : ${selectedNameOnNewStart} ${selectedNodeUrlOnNewStart}`,
+ dismiss: true
+ })
+ }
+
+ handleAddNodeSelection(node, index) {
+ this.selectedItem = node
+ this.dropdownOpen = false
+ this.requestUpdate()
+ this.nodeSelected(index)
+
+ localStorage.setItem('mySelectedNode', index)
+
+ const selectedNodeIndexOnNewStart = localStorage.getItem('mySelectedNode')
+ const catchSavedNodes = JSON.parse(localStorage.getItem('myQortalNodes'))
+ const selectedNodeOnNewStart = catchSavedNodes[selectedNodeIndexOnNewStart]
+ const selectedNameOnNewStart = `${selectedNodeOnNewStart.name}`
+ const selectedNodeUrlOnNewStart = `${selectedNodeOnNewStart.protocol + '://' + selectedNodeOnNewStart.domain + ':' + selectedNodeOnNewStart.port}`
let snack2string = get('settings.snack2')
@@ -408,10 +319,13 @@ class SettingsPage extends connect(store)(LitElement) {
}
var renewNodes = []
+
renewNodes.push(obj1, obj2)
+
localStorage.setItem('myQortalNodes', JSON.stringify(renewNodes))
let snack1string = get('settings.snack1')
+
snackbar.add({
labelText: `${snack1string}`,
dismiss: true
@@ -426,9 +340,9 @@ class SettingsPage extends connect(store)(LitElement) {
nodeSelected(selectedNodeIndex) {
const selectedNode = this.nodeConfig.knownNodes[selectedNodeIndex]
const selectedName = `${selectedNode.name}`
- const selectedNodeUrl = `${selectedNode.protocol + '://' + selectedNode.domain +':' + selectedNode.port}`
-
+ const selectedNodeUrl = `${selectedNode.protocol + '://' + selectedNode.domain + ':' + selectedNode.port}`
const index = parseInt(selectedNodeIndex)
+
if (isNaN(index)) return
store.dispatch(doSetNode(selectedNodeIndex))
@@ -462,13 +376,23 @@ class SettingsPage extends connect(store)(LitElement) {
store.dispatch(doAddNode(nodeObject))
const haveNodes = JSON.parse(localStorage.getItem('myQortalNodes'))
+ const indexLength = this.nodeConfig.knownNodes.length
+
+ let choosedIndex
+ let choosedNode
+
+ choosedIndex = indexLength -1
+ choosedNode = this.nodeConfig.knownNodes[this.nodeConfig.knownNodes.length - 1]
if (haveNodes === null || haveNodes.length === 0) {
var savedNodes = []
+
savedNodes.push(nodeObject)
+
localStorage.setItem('myQortalNodes', JSON.stringify(savedNodes))
let snack3string = get('settings.snack3')
+
snackbar.add({
labelText: `${snack3string}`,
dismiss: true
@@ -478,14 +402,16 @@ class SettingsPage extends connect(store)(LitElement) {
this.shadowRoot.getElementById('protocolList').value = ''
this.shadowRoot.getElementById('domainInput').value = ''
this.shadowRoot.getElementById('portInput').value = ''
-
this.shadowRoot.querySelector('#addNodeDialog').close()
} else {
var stored = JSON.parse(localStorage.getItem('myQortalNodes'))
+
stored.push(nodeObject)
+
localStorage.setItem('myQortalNodes', JSON.stringify(stored))
- let snack3string = get('settings.snack3');
+ let snack3string = get('settings.snack3')
+
snackbar.add({
labelText: `${snack3string}`,
dismiss: true
@@ -495,9 +421,10 @@ class SettingsPage extends connect(store)(LitElement) {
this.shadowRoot.getElementById('protocolList').value = ''
this.shadowRoot.getElementById('domainInput').value = ''
this.shadowRoot.getElementById('portInput').value = ''
-
this.shadowRoot.querySelector('#addNodeDialog').close()
}
+
+ this.handleAddNodeSelection(choosedNode, choosedIndex)
}
}
@@ -505,11 +432,15 @@ class SettingsPage extends connect(store)(LitElement) {
event.stopPropagation()
let stored = JSON.parse(localStorage.getItem('myQortalNodes'))
+
stored.splice(index, 1)
+
localStorage.setItem('myQortalNodes', JSON.stringify(stored))
+
store.dispatch(doRemoveNode(index))
let snack6string = get('settings.snack6')
+
snackbar.add({
labelText: `${snack6string}`,
dismiss: true
@@ -530,16 +461,21 @@ class SettingsPage extends connect(store)(LitElement) {
protocol: protocolList,
domain: domainInput,
port: portInput,
- enableManagement: true,
+ enableManagement: true
}
let stored = JSON.parse(localStorage.getItem('myQortalNodes'))
+
const copyStored = [...stored]
+
copyStored[index] = nodeObject
+
localStorage.setItem('myQortalNodes', JSON.stringify(copyStored))
+
store.dispatch(doEditNode(index, nodeObject))
let snack7string = get('settings.snack7')
+
snackbar.add({
labelText: `${snack7string}`,
dismiss: true
@@ -551,7 +487,6 @@ class SettingsPage extends connect(store)(LitElement) {
this.shadowRoot.getElementById('portInput').value = ''
this.isBeingEdited = false
this.isBeingEditedIndex = null
-
this.shadowRoot.querySelector('#addNodeDialog').close()
}
}
@@ -566,26 +501,25 @@ class SettingsPage extends connect(store)(LitElement) {
renderExportNodesListButton() {
return html`
-
this.exportQortalNodesList()}"
- >
-
+
this.exportQortalNodesList()}">
`
}
exportQortalNodesList() {
let nodelist = ''
+
const qortalNodesList = JSON.stringify(
localStorage.getItem('myQortalNodes')
- );
+ )
+
const qortalNodesListSave = JSON.parse(qortalNodesList || '[]')
+
const blob = new Blob([qortalNodesListSave], {
- type: 'text/plain;charset=utf-8',
+ type: 'text/plain;charset=utf-8'
})
+
nodelist = 'qortal.nodes'
+
this.saveFileToDisk(blob, nodelist)
}
@@ -595,16 +529,20 @@ class SettingsPage extends connect(store)(LitElement) {
suggestedName: fileName,
types: [{
description: 'File'
- }],
+ }]
})
+
const writeFile = async (fileHandle, contents) => {
const writable = await fileHandle.createWritable()
+
await writable.write(contents)
await writable.close()
}
+
writeFile(fileHandle, blob).then(() => console.log('FILE SAVED'))
let snack4string = get('settings.snack4')
+
snackbar.add({
labelText: `${snack4string} qortal.nodes`,
dismiss: true
@@ -613,29 +551,28 @@ class SettingsPage extends connect(store)(LitElement) {
if (error.name === 'AbortError') {
return
}
+
FileSaver.saveAs(blob, fileName)
}
}
renderImportNodesListButton() {
return html`
-
this.openImportNodesDialog()}"
- >
-
+
this.openImportNodesDialog()}">
`
}
async importQortalNodesList(file) {
localStorage.removeItem('myQortalNodes')
+
const newItems = JSON.parse(file || '[]')
+
localStorage.setItem('myQortalNodes', JSON.stringify(newItems))
+
this.shadowRoot.querySelector('#importQortalNodesListDialog').close()
let snack5string = get('settings.snack5')
+
snackbar.add({
labelText: `${snack5string}`,
dismiss: true,
@@ -657,5 +594,4 @@ window.customElements.define('settings-page', SettingsPage)
const settings = document.createElement('settings-page')
settingsDialog = document.body.appendChild(settings)
-
-export default settingsDialog
+export default settingsDialog
\ No newline at end of file
diff --git a/core/src/functional-components/side-menu-item-style.js b/core/src/functional-components/side-menu-item-style.js
deleted file mode 100644
index a9711b12..00000000
--- a/core/src/functional-components/side-menu-item-style.js
+++ /dev/null
@@ -1,157 +0,0 @@
-import {css} from 'lit'
-
-export const sideMenuItemStyle = css`
- :host {
- --font-family: "Roboto", sans-serif;
- --item-font-size: 0.9375rem;
- --sub-item-font-size: 0.75rem;
- --item-padding: 0.875rem;
- --item-content-padding: 0.875rem;
- --icon-height: 1.125rem;
- --icon-width: 1.125rem;
- --item-border-radius: 5px;
- --item-selected-color: #dddddd;
- --item-selected-color-text: #333333;
- --item-color-active: #d1d1d1;
- --item-color-hover: #eeeeee;
- --item-text-color: #080808;
- --item-icon-color: #080808;
- --item-border-color: #eeeeee;
- --item-border-selected-color: #333333;
-
- --overlay-box-shadow: 0 2px 4px -1px hsla(214, 53%, 23%, 0.16), 0 3px 12px -1px hsla(214, 50%, 22%, 0.26);
- --overlay-background-color: #ffffff;
-
- --spacing: 4px;
-
- font-family: var(--font-family);
- display: flex;
- overflow: hidden;
- flex-direction: column;
- border-radius: var(--item-border-radius);
- }
-
- #itemLink {
- align-items: center;
- font-size: var(--item-font-size);
- font-weight: 400;
- height: var(--icon-height);
- transition: background-color 200ms;
- padding: var(--item-padding);
- cursor: pointer;
- display: inline-flex;
- flex-grow: 1;
- align-items: center;
- overflow: hidden;
- text-decoration: none;
- border-bottom: 1px solid var(--item-border-color);
- text-transform: uppercase;
- }
- .hideItem {
- display: none !important;
- }
-
- #itemLink:hover {
- background-color: var(--item-color-hover);
- }
-
- #itemLink:active {
- background-color: var(--item-color-active);
- }
-
- #content {
- padding-left: var(--item-content-padding);
- flex: 1;
- }
-
- :host([compact]) #content {
- padding-left: 0;
- display: none;
- }
-
- :host([selected]) #itemLink {
- background-color: var(--item-selected-color);
- color: var(--item-selected-color-text);
- border-left: 3px solid var(--item-border-selected-color);
- }
-
- :host([selected]) slot[name="icon"]::slotted(*) {
- color: var(--item-selected-color-text);
- }
-
- :host(:not([selected])) #itemLink{
- color: var(--item-text-color);
- }
-
- :host([expanded]){
- background-color: var(--item-selected-color);
- }
-
- :host([hasSelectedChild]){
- background-color: var(--item-selected-color);
- }
-
- :host span {
- cursor: inherit;
- overflow: hidden;
- text-overflow: ellipsis;
- user-select: none;
- -webkit-user-select: none;
- white-space: nowrap;
- }
-
- slot[name="icon"]::slotted(*) {
- flex-shrink: 0;
- color: var(--item-icon-color);
- height: var(--icon-height);
- width: var(--icon-width);
- pointer-events: none;
- }
-
- #collapse-button {
- float: right;
- }
-
- :host([compact]) #itemLink[level]:not([level="0"]) {
- padding: calc( var(--item-padding) / 2);
- }
-
- :host(:not([compact])) #itemLink[level]:not([level="0"]) {
- padding-left: calc(var(--icon-width) + var(--item-content-padding));
- }
-
- #itemLink[level]:not([level="0"]) #content {
- display: block;
- visibility: visible;
- width: auto;
- font-weight: 400;
- font-size: var(--sub-item-font-size)
- }
-
- #overlay {
- display: block;
- left: 101%;
- min-width: 200px;
- padding: 4px 2px;
- background-color: var(--overlay-background-color);
- background-image: var(--overlay-background-image, none);
- box-shadow: var(--overlay-box-shadow);
- border: 1px solid var(--overlay-background-color);
- border-left: 0;
- border-radius: 0 3px 3px 0;
- position: absolute;
- z-index: 1;
- animation: pop 200ms forwards;
- }
-
- @keyframes pop{
- 0% {
- transform: translateX(-5px);
- opacity: 0.5;
- }
- 100% {
- transform: translateX(0);
- opacity: 1;
- }
- }
-`;
diff --git a/core/src/functional-components/side-menu-item.js b/core/src/functional-components/side-menu-item.js
index a24fffb6..93aecbb5 100644
--- a/core/src/functional-components/side-menu-item.js
+++ b/core/src/functional-components/side-menu-item.js
@@ -1,213 +1,221 @@
-import {css, html, LitElement} from 'lit'
-import {ifDefined} from 'lit/directives/if-defined.js'
-import {sideMenuItemStyle} from './side-menu-item-style.js'
+import { html, LitElement } from 'lit'
+import { ifDefined } from 'lit/directives/if-defined.js'
+import { sideMenuItemStyles } from '../styles/core-css'
import '@vaadin/icon'
import '@vaadin/icons'
import '@polymer/paper-tooltip'
export class SideMenuItem extends LitElement {
- static get properties() {
- return {
- selected: { type: Boolean, reflect: true },
- label: { type: String, reflect: true },
- expanded: { type: Boolean, reflect: true },
- compact: { type: Boolean, reflect: true },
- href: { type: String, reflect: true },
- target: { type: String, reflect: true },
- hide: { type: Boolean }
- }
- }
+ static get properties() {
+ return {
+ selected: { type: Boolean, reflect: true },
+ label: { type: String, reflect: true },
+ expanded: { type: Boolean, reflect: true },
+ compact: { type: Boolean, reflect: true },
+ href: { type: String, reflect: true },
+ target: { type: String, reflect: true },
+ hide: { type: Boolean }
+ }
+ }
- static get styles() {
- return css`
- ${sideMenuItemStyle}
- `
- }
+ static get styles() {
+ return [sideMenuItemStyles]
+ }
- constructor() {
- super()
- this.selected = false
- this.expanded = false
- this.hide = false
- }
+ constructor() {
+ super()
+ this.selected = false
+ this.expanded = false
+ this.hide = false
+ }
- render() {
- return html`
- ${this._itemLinkTemplate()} ${this._tooltipTemplate()}
- ${this._childrenTemplate()}
- `
- }
+ render() {
+ return html`
+ ${this._itemLinkTemplate()} ${this._tooltipTemplate()}
+ ${this._childrenTemplate()}
+ `
+ }
- firstUpdated(changedProperties) {
- if (!this.hasChildren()) {
- return
- }
- this.collapseExpandIcon = document.createElement("vaadin-icon")
- this.collapseExpandIcon.id = "collapse-button"
- this.shadowRoot.getElementById("content").appendChild(this.collapseExpandIcon)
- this._boundOutsideClickListener = this._outsideClickListener.bind(this)
- }
+ firstUpdated(changedProperties) {
+ if (!this.hasChildren()) {
+ return
+ }
- _itemLinkTemplate() {
- return html`
-
this._onClick(e)}"
- target=${ifDefined(this.target)}
- class=${this.hide ? 'hideItem' : ''}
- >
-
-
- ${this.label}
-
-
- `
- }
+ this.collapseExpandIcon = document.createElement("vaadin-icon")
+ this.collapseExpandIcon.id = "collapse-button"
+ this.shadowRoot.getElementById("content").appendChild(this.collapseExpandIcon)
+ this._boundOutsideClickListener = this._outsideClickListener.bind(this)
+ }
- _tooltipTemplate() {
- return html`
- ${this._getLevel === 0 && this.compact ? html`
-
- ${this.label}
-
- `
- : undefined}
- `
- }
+ _itemLinkTemplate() {
+ return html`
+
this._onClick(e)}"
+ target=${ifDefined(this.target)}
+ class=${this.hide ? 'hideItem' : ''}
+ >
+
+
+ ${this.label}
+
+
+ `
+ }
- _childrenTemplate() {
- return html`
- ${this.expanded ? html`
- ${this.compact ? html`
-
- `
- : html`
-
- `}
- `
- : undefined}
- `
- }
+ _tooltipTemplate() {
+ return html`
+ ${this._getLevel === 0 && this.compact ?
+ html`
+
+ ${this.label}
+
+ ` : undefined
+ }
+ `
+ }
- updated(changedProperties) {
- changedProperties.forEach((oldValue, propName) => {
- if (propName === "compact") {
- this._onCompactChanged()
- }
+ _childrenTemplate() {
+ return html`
+ ${this.expanded ?
+ html`
+ ${this.compact ?
+ html`
+
+ ` : html`
+
+ `
+ }
+ ` : undefined
+ }
+ `
+ }
- if (propName === "expanded") {
- this._onExpandedChanged()
- }
+ updated(changedProperties) {
+ changedProperties.forEach((oldValue, propName) => {
+ if (propName === "compact") {
+ this._onCompactChanged()
+ }
- if (propName === "selected"){
- if (oldValue === this.selected){
- return
- }
+ if (propName === "expanded") {
+ this._onExpandedChanged()
+ }
- if (this.selected) {
- this._changeSelectedState(true)
- this._markParentWithSelectedChild()
- }
- }
- });
- }
+ if (propName === "selected") {
+ if (oldValue === this.selected) {
+ return
+ }
- _onCompactChanged() {
- this.expanded = false;
+ if (this.selected) {
+ this._changeSelectedState(true)
+ this._markParentWithSelectedChild()
+ }
+ }
+ })
+ }
- if (this.collapseExpandIcon == null) {
- return;
- }
+ _onCompactChanged() {
+ this.expanded = false
- if (!this.compact) {
- this.collapseExpandIcon["icon"] = "vaadin:chevron-down-small"
- } else {
- this.collapseExpandIcon["icon"] = "vaadin:chevron-right-small"
- }
- }
+ if (this.collapseExpandIcon == null) {
+ return
+ }
- _onExpandedChanged() {
- if (this.collapseExpandIcon == null) {
- return;
- }
+ if (!this.compact) {
+ this.collapseExpandIcon["icon"] = "vaadin:chevron-down-small"
+ } else {
+ this.collapseExpandIcon["icon"] = "vaadin:chevron-right-small"
+ }
+ }
- if (this.expanded) {
- this._onHandleExpanded();
- } else {
- this._onHandleCollapsed();
- }
- }
+ _onExpandedChanged() {
+ if (this.collapseExpandIcon == null) {
+ return
+ }
- _onHandleExpanded() {
- if (!this.compact) {
- this.collapseExpandIcon["icon"] = "vaadin:chevron-up-small"
- } else {
- this.collapseExpandIcon["icon"] = "vaadin:chevron-left-small"
- document.addEventListener("click", this._boundOutsideClickListener, true)
- }
- }
+ if (this.expanded) {
+ this._onHandleExpanded()
+ } else {
+ this._onHandleCollapsed()
+ }
+ }
- _onHandleCollapsed() {
- if (!this.compact) {
- this.collapseExpandIcon["icon"] = "vaadin:chevron-down-small"
- } else {
- this.collapseExpandIcon["icon"] = "vaadin:chevron-right-small"
- document.removeEventListener(
- "click",
- this._boundOutsideClickListener,
- true
- )
- }
- }
+ _onHandleExpanded() {
+ if (!this.compact) {
+ this.collapseExpandIcon["icon"] = "vaadin:chevron-up-small"
+ } else {
+ this.collapseExpandIcon["icon"] = "vaadin:chevron-left-small"
+ document.addEventListener("click", this._boundOutsideClickListener, true)
+ }
+ }
- _onClick(e) {
- if (!this.hasChildren()) {
- this.selected = true
- } else {
- this.expanded = !this.expanded
- e.preventDefault()
- }
- }
+ _onHandleCollapsed() {
+ if (!this.compact) {
+ this.collapseExpandIcon["icon"] = "vaadin:chevron-down-small"
+ } else {
+ this.collapseExpandIcon["icon"] = "vaadin:chevron-right-small"
+ document.removeEventListener(
+ "click",
+ this._boundOutsideClickListener,
+ true
+ )
+ }
+ }
- _outsideClickListener(event) {
- const eventPath = event.composedPath()
- if (eventPath.indexOf(this) < 0) {
- this.expanded = false
- }
- }
+ _onClick(e) {
+ if (!this.hasChildren()) {
+ this.selected = true
+ } else {
+ this.expanded = !this.expanded
- _changeSelectedState(selected, sourceEvent) {
- this.selected = selected
- let evt = new CustomEvent("side-menu-item-select", {
- bubbles: true,
- cancelable: true,
- detail: { sourceEvent: sourceEvent }
- });
- this.dispatchEvent(evt)
- }
+ e.preventDefault()
+ }
+ }
- hasChildren() {
- return !!this.querySelector("side-menu-item")
- }
+ _outsideClickListener(event) {
+ const eventPath = event.composedPath()
- _markParentWithSelectedChild() {
- let element = this.parentElement;
- while (element instanceof SideMenuItem) {
- element.setAttribute('hasSelectedChild', true)
- element = element.parentElement;
- }
- }
+ if (eventPath.indexOf(this) < 0) {
+ this.expanded = false
+ }
+ }
- get _getLevel() {
- let level = 0
- let element = this.parentElement
- while (element instanceof SideMenuItem) {
- level++;
- element = element.parentElement
- }
- return level
- }
+ _changeSelectedState(selected, sourceEvent) {
+ this.selected = selected
+
+ let evt = new CustomEvent("side-menu-item-select", {
+ bubbles: true,
+ cancelable: true,
+ detail: { sourceEvent: sourceEvent }
+ })
+
+ this.dispatchEvent(evt)
+ }
+
+ hasChildren() {
+ return !!this.querySelector("side-menu-item")
+ }
+
+ _markParentWithSelectedChild() {
+ let element = this.parentElement;
+ while (element instanceof SideMenuItem) {
+ element.setAttribute('hasSelectedChild', true)
+ element = element.parentElement
+ }
+ }
+
+ get _getLevel() {
+ let level = 0
+ let element = this.parentElement
+
+ while (element instanceof SideMenuItem) {
+ level++
+ element = element.parentElement
+ }
+
+ return level
+ }
}
-window.customElements.define("side-menu-item", SideMenuItem);
+window.customElements.define("side-menu-item", SideMenuItem)
\ No newline at end of file
diff --git a/core/src/functional-components/side-menu.js b/core/src/functional-components/side-menu.js
index 9508c1b7..004b463e 100644
--- a/core/src/functional-components/side-menu.js
+++ b/core/src/functional-components/side-menu.js
@@ -1,78 +1,68 @@
-import {css, html, LitElement} from 'lit'
+import { html, LitElement } from 'lit'
+import { sideMenuStyles } from '../styles/core-css'
class SideMenu extends LitElement {
- static get properties() {
- return {
- items: {type: Array},
- selectedValue: {type: String, reflect: true},
- compact: {type: Boolean, reflect: true}
- }
- }
+ static get properties() {
+ return {
+ items: { type: Array },
+ selectedValue: { type: String, reflect: true },
+ compact: { type: Boolean, reflect: true }
+ }
+ }
- static get styles() {
- return css`
- nav {
- padding: 0;
- }
+ static get styles() {
+ return [sideMenuStyles]
+ }
- :host {
- list-style: none;
- width: 100%;
- position: relative;
- }
+ constructor() {
+ super()
+ this.compact = false
+ }
- :host([compact]) {
- width: auto;
- }
- `
- }
+ render() {
+ return html`
+
+
+
+ `
+ }
- constructor() {
- super()
- this.compact = false
- }
+ firstUpdated(_changedProperties) {
+ this.items = [...this.querySelectorAll("side-menu-item")]
+ }
- render() {
- return html`
-
-
-
- `
- }
+ _handleSelect(event) {
+ let targetItem = event.target
+ this._deselectAllItems()
+ targetItem.selected = true
+ this.selectedValue = targetItem.label
+ }
- firstUpdated(_changedProperties) {
- this.items = [...this.querySelectorAll("side-menu-item")]
- }
+ _deselectAllItems() {
+ this.items.forEach(element => {
+ if (this.compact) {
+ element.expanded = false
+ }
- _handleSelect(event) {
- let targetItem = event.target
- this._deselectAllItems()
- targetItem.selected = true
- this.selectedValue = targetItem.label
- }
+ element.selected = false
+ element.hasChildren() ? element.removeAttribute('hasSelectedChild') : undefined
+ })
+ }
- _deselectAllItems() {
- this.items.forEach(element => {
- if (this.compact) {
- element.expanded = false
- }
- element.selected = false
- element.hasChildren() ? element.removeAttribute('hasSelectedChild') : undefined
- });
- }
+ updated(changedProperties) {
+ changedProperties.forEach((oldValue, propName) => {
+ if (propName === "compact") {
+ this.items.forEach(item => (item.compact = this.compact))
- updated(changedProperties) {
- changedProperties.forEach((oldValue, propName) => {
- if (propName === "compact") {
- this.items.forEach(item => (item.compact = this.compact))
- let evt = new CustomEvent("side-menu-compact-change", {
- bubbles: true,
- cancelable: true
- })
- this.dispatchEvent(evt)
- }
- })
- }
+ let evt = new CustomEvent("side-menu-compact-change", {
+ bubbles: true,
+ cancelable: true
+ })
+
+ this.dispatchEvent(evt)
+ }
+ })
+ }
}
-window.customElements.define("side-menu", SideMenu);
+window.customElements.define("side-menu", SideMenu)
\ No newline at end of file
diff --git a/core/src/functional-components/snackbar.js b/core/src/functional-components/snackbar.js
index 763337db..428ba1c3 100644
--- a/core/src/functional-components/snackbar.js
+++ b/core/src/functional-components/snackbar.js
@@ -1,78 +1,66 @@
-import {css, html, LitElement} from 'lit'
+import { html, LitElement } from 'lit'
import '@material/mwc-snackbar'
let queueElement
class SnackQueue extends LitElement {
- static get properties() {
- return {
- busy: {
- type: Boolean,
- attribute: 'busy',
- reflectToAttribute: true
- },
- currentSnack: {
- type: Object,
- attribute: 'current-snack',
- reflectToAttribute: true
- },
- _queue: {
- type: Array
- },
- _labelText: { type: String },
- _stacked: { type: Boolean },
- _leading: { type: Boolean },
- _closeOnEscape: { type: Boolean },
- _timeoutMs: { type: Number },
- action: {},
- _dismiss: {},
- _dismissIcon: { type: String }
- }
- }
+ static get properties() {
+ return {
+ busy: { type: Boolean, attribute: 'busy', reflectToAttribute: true },
+ currentSnack: { type: Object, attribute: 'current-snack', reflectToAttribute: true },
+ _queue: { type: Array },
+ _labelText: { type: String },
+ _stacked: { type: Boolean },
+ _leading: { type: Boolean },
+ _closeOnEscape: { type: Boolean },
+ _timeoutMs: { type: Number },
+ _dismiss: {},
+ _dismissIcon: { type: String },
+ action: {}
+ }
+ }
- static get styles() {
- return css``
- }
+ constructor() {
+ super()
+ this._queue = []
+ this.busy = false
+ this._timeoutMs = 5000
+ }
- constructor() {
- super()
- this._queue = []
- this.busy = false
- this._timeoutMs = 5000
- }
+ render() {
+ return html`
+
+ ${this._action}
+ ${this._dismiss ?
+ html`
+
+ ` : ''
+ }
+
+ `
+ }
- render() {
- return html`
-
- ${this._action}
- ${this._dismiss ? html`
-
- ` : ''}
-
- `
- }
+ firstUpdated() {
+ this._snackbar = this.shadowRoot.getElementById('snack')
+ }
- firstUpdated() {
- this._snackbar = this.shadowRoot.getElementById('snack')
- }
+ _shift() {
+ if (this.busy || this._queue.length === 0) return
+ const item = this._queue.shift()
+ this._labelText = item.labelText || ''
+ this._action = item.action || ''
+ this._dismiss = item.dismiss || false
+ this._dismissIcon = item.dismissIcon || 'close'
+ this._leading = !!item.leading
+ this._closeOnEscape = (item.closeOnEscape && item.closeOnEscape !== false) // JSON.parse maybe needs to be compared to 'false'...in which case no need for complex expression
+ this._timeoutMs = (item.timeoutMs >= 4000 && item.timeoutMs <= 10000) ? item.timeoutMs : 5000
+ this._snackbar.show()
+ }
- _shift() {
- if (this.busy || this._queue.length === 0) return
- const item = this._queue.shift()
- this._labelText = item.labelText || ''
- this._action = item.action || ''
- this._dismiss = item.dismiss || false
- this._dismissIcon = item.dismissIcon || 'close'
- this._leading = !!item.leading
- this._closeOnEscape = (item.closeOnEscape && item.closeOnEscape !== false) // JSON.parse maybe needs to be compared to 'false'...in which case no need for complex expression
- this._timeoutMs = (item.timeoutMs >= 4000 && item.timeoutMs <= 10000) ? item.timeoutMs : 5000
- this._snackbar.show()
- }
-
- add(item) {
- this._queue.push(item)
- this._shift()
- }
+ add(item) {
+ this._queue.push(item)
+ this._shift()
+ }
}
window.customElements.define('snack-queue', SnackQueue)
@@ -82,9 +70,9 @@ queueNode.id = 'queue-node'
queueNode.loadingMessage = ''
queueElement = document.body.appendChild(queueNode)
setTimeout(() => {
- queueElement = document.getElementById('queue-node')
- const mainApp = document.getElementById('main-app')
- const shadow = mainApp.shadowRoot
- queueElement = shadow.appendChild(queueElement)
+ queueElement = document.getElementById('queue-node')
+ const mainApp = document.getElementById('main-app')
+ const shadow = mainApp.shadowRoot
+ queueElement = shadow.appendChild(queueElement)
}, 500)
export default queueElement
diff --git a/core/src/functional-components/verb-past-tense.js b/core/src/functional-components/verb-past-tense.js
index 198e80e9..c5b279fa 100644
--- a/core/src/functional-components/verb-past-tense.js
+++ b/core/src/functional-components/verb-past-tense.js
@@ -1,5 +1,3 @@
-// Sourced from https://gist.github.com/letsgetrandy/1e05a68ea74ba6736eb5
-
export const EXCEPTIONS = {
'are': 'were',
'eat': 'ate',
@@ -16,21 +14,27 @@ export const getPastTense = (verb, exceptions = EXCEPTIONS) => {
if (exceptions[verb]) {
return exceptions[verb]
}
+
if ((/e$/i).test(verb)) {
return verb + 'd'
}
+
if ((/[aeiou]c$/i).test(verb)) {
return verb + 'ked'
}
+
// for american english only
if ((/el$/i).test(verb)) {
return verb + 'ed'
}
+
if ((/[aeio][aeiou][dlmnprst]$/).test(verb)) {
return verb + 'ed'
}
+
if ((/[aeiou][bdglmnprst]$/i).test(verb)) {
return verb.replace(/(.+[aeiou])([bdglmnprst])/, '$1$2$2ed')
}
+
return verb + 'ed'
-}
+}
\ No newline at end of file
diff --git a/core/src/functional-components/wordlists.js b/core/src/functional-components/wordlists.js
index 9a058a21..9c42c3f2 100644
--- a/core/src/functional-components/wordlists.js
+++ b/core/src/functional-components/wordlists.js
@@ -1,20 +1,25 @@
-import {getPastTense} from './verb-past-tense.js'
+import { getPastTense } from './verb-past-tense'
export const verbs = [
- 'abase', 'abate', 'abduct', 'abet', 'abhor', 'abide', 'abjure', 'ablate', 'abort', 'abound', 'abseil', 'absorb', 'abuse', 'abut', 'accede', 'accent', 'accept', 'access', 'accord', 'accost', 'accrue', 'accuse', 'ache', 'acquit', 'act', 'adapt', 'add', 'addict', 'addle', 'adduce', 'adhere', 'adjoin', 'adjust', 'admire', 'admit', 'adopt', 'adore', 'adorn', 'advert', 'advise', 'aerate', 'affect', 'affirm', 'affix', 'afford', 'age', 'agree', 'aid', 'aim', 'alarm', 'alert', 'alight', 'align', 'allay', 'allege', 'allot', 'allow', 'alloy', 'allure', 'ally', 'alter', 'amass', 'amaze', 'amble', 'ambush', 'amend', 'amount', 'amuse', 'anger', 'angle', 'anneal', 'annex', 'annoy', 'annul', 'anoint', 'answer', 'ape', 'appeal', 'appear', 'append', 'apply', 'arc', 'arch', 'argue', 'arise', 'arm', 'array', 'arrest', 'arrive', 'arrow', 'ascend', 'ask', 'aspire', 'assail', 'assay', 'assent', 'assert', 'assess', 'assign', 'assist', 'assort', 'assume', 'assure', 'atone', 'attach', 'attack', 'attain', 'attend', 'attest', 'attire', 'attune', 'audit', 'augur', 'author', 'avail', 'avenge', 'aver', 'avert', 'avoid', 'await', 'awake', 'awaken', 'award', 'awe', 'babble', 'back', 'badge', 'badger', 'baffle', 'bag', 'bail', 'bait', 'bake', 'bald', 'bale', 'ball', 'ballot', 'ban', 'band', 'bandy', 'bang', 'banish', 'bank', 'banter', 'bar', 'barb', 'barber', 'bard', 'bare', 'barge', 'bark', 'barn', 'barrel', 'barter', 'base', 'bash', 'bask', 'baste', 'bat', 'batch', 'bathe', 'batten', 'batter', 'battle', 'bawl', 'bay', 'be', 'beach', 'beacon', 'bead', 'beam', 'bean', 'bear', 'beard', 'beat', 'become', 'bed', 'beef', 'beep', 'beetle', 'befall', 'befit', 'beg', 'beget', 'beggar', 'begin', 'behave', 'behead', 'behold', 'belay', 'belch', 'belie', 'bell', 'bellow', 'belly', 'belong', 'belt', 'bemoan', 'bench', 'bend', 'berate', 'berry', 'beset', 'best', 'bestir', 'bestow', 'bet', 'betide', 'betray', 'better', 'bevel', 'bewail', 'beware', 'bias', 'bib', 'bicker', 'bid', 'bide', 'bilge', 'bill', 'billet', 'billow', 'bin', 'bind', 'birdie', 'birth', 'bisect', 'bit', 'bite', 'bitter', 'black', 'blame', 'blanch', 'blank', 'blare', 'blast', 'blaze', 'bleach', 'bleat', 'bleed', 'bleep', 'blench', 'blend', 'bless', 'blight', 'blind', 'blink', 'blip', 'bliss', 'blitz', 'bloat', 'blob', 'blood', 'bloody', 'bloom', 'blot', 'blotch', 'blow', 'blue', 'bluff', 'blunt', 'blur', 'blurb', 'blurt', 'blush', 'board', 'boast', 'bob', 'bode', 'body', 'bog', 'bogey', 'boggle', 'boil', 'bolt', 'bomb', 'bond', 'bone', 'bonnet', 'boo', 'book', 'boom', 'boost', 'boot', 'booze', 'bop', 'bore', 'borrow', 'boss', 'botch', 'bother', 'bottle', 'bottom', 'bounce', 'bound', 'bout', 'bow', 'bowel', 'bowl', 'box', 'brace', 'brag', 'braid', 'braise', 'brake', 'branch', 'brand', 'brave', 'brawl', 'bray', 'breach', 'bread', 'break', 'breed', 'breeze', 'brew', 'bribe', 'brick', 'bridge', 'bridle', 'brief', 'brim', 'brine', 'bring', 'broach', 'broil', 'bronze', 'brook', 'brown', 'browse', 'bruise', 'brush', 'bubble', 'buck', 'bucket', 'buckle', 'bud', 'budge', 'budget', 'buffet', 'bug', 'bugle', 'build', 'bulge', 'bulk', 'bull', 'bully', 'bumble', 'bump', 'bunch', 'bundle', 'bung', 'bungle', 'bunk', 'bunker', 'buoy', 'burble', 'burden', 'burgle', 'burn', 'burp', 'burr', 'burrow', 'burst', 'bury', 'bus', 'bush', 'busk', 'bust', 'bustle', 'busy', 'butt', 'button', 'buy', 'buzz', 'bypass', 'cab', 'cabal', 'cabin', 'cable', 'cache', 'cackle', 'cadge', 'cage', 'cajole', 'cake', 'call', 'calm', 'calve', 'camber', 'camp', 'can', 'canal', 'cancel', 'candle', 'candy', 'cane', 'cannon', 'canoe', 'canopy', 'cant', 'canter', 'cap', 'caper', 'card', 'care', 'career', 'caress', 'carol', 'carp', 'carpet', 'carry', 'cart', 'carve', 'case', 'cash', 'cast', 'castle', 'cat', 'catch', 'cater', 'caucus', 'cause', 'cave', 'cavern', 'cease', 'cede', 'cellar', 'cement', 'censor', 'chafe', 'chain', 'chair', 'chalk', 'champ', 'chance', 'change', 'chant', 'chap', 'char', 'charge', 'charm', 'chart', 'chase', 'chat', 'cheat', 'check', 'cheep', 'cheer', 'chew', 'chide', 'chill', 'chime', 'chin', 'chink', 'chip', 'chirp', 'chisel', 'chock', 'choir', 'choke', 'choose', 'chop', 'chord', 'chorus', 'chrome', 'chuck', 'chuff', 'chug', 'chum', 'chunk', 'churn', 'chute', 'cinder', 'cipher', 'circle', 'cite', 'clad', 'claim', 'clam', 'clamp', 'clang', 'clank', 'clap', 'clash', 'clasp', 'class', 'claw', 'clean', 'clear', 'cleat', 'cleave', 'clench', 'clerk', 'click', 'climax', 'climb', 'clinch', 'cling', 'clink', 'clip', 'clique', 'cloak', 'clock', 'clog', 'clone', 'close', 'closet', 'clot', 'cloud', 'clout', 'clown', 'club', 'cluck', 'clue', 'clump', 'clutch', 'coach', 'coal', 'coast', 'coat', 'coax', 'cobble', 'cobweb', 'cockle', 'cocoon', 'coddle', 'code', 'codify', 'coerce', 'coffer', 'coffin', 'cog', 'cohere', 'coil', 'coin', 'coke', 'collar', 'comb', 'combat', 'come', 'commit', 'compel', 'comply', 'con', 'concur', 'cone', 'confer', 'convey', 'convoy', 'cook', 'cool', 'cope', 'copper', 'copy', 'cord', 'cordon', 'core', 'cork', 'corn', 'corner', 'corral', 'cosset', 'cost', 'cotton', 'couch', 'cough', 'count', 'couple', 'course', 'court', 'cover', 'covet', 'cowl', 'cox', 'crab', 'crack', 'cradle', 'craft', 'cram', 'cramp', 'crane', 'crank', 'crash', 'crate', 'crater', 'crave', 'crawl', 'crayon', 'craze', 'creak', 'cream', 'crease', 'create', 'credit', 'creed', 'creep', 'crest', 'crew', 'crib', 'crick', 'crimp', 'cringe', 'crisp', 'croak', 'crook', 'croon', 'crop', 'cross', 'crouch', 'crowd', 'crown', 'cruise', 'crunch', 'crush', 'crust', 'crutch', 'cry', 'cube', 'cuckoo', 'cuddle', 'cudgel', 'cue', 'cuff', 'cull', 'cup', 'curb', 'curd', 'curdle', 'cure', 'curl', 'curry', 'curse', 'curve', 'cuss', 'cut', 'cycle', 'dab', 'dabble', 'dagger', 'dally', 'dam', 'damage', 'damn', 'damp', 'dampen', 'dance', 'dangle', 'dapple', 'dare', 'darken', 'darn', 'dart', 'dash', 'date', 'daub', 'daunt', 'dawdle', 'daze', 'dazzle', 'deaden', 'deafen', 'deal', 'debar', 'debase', 'debate', 'debit', 'debug', 'debut', 'decamp', 'decant', 'decay', 'decide', 'deck', 'decode', 'decoy', 'decree', 'decry', 'deduce', 'deduct', 'deem', 'deepen', 'deface', 'defame', 'defeat', 'defect', 'defend', 'defer', 'defile', 'define', 'deform', 'defray', 'defuse', 'defy', 'deify', 'deign', 'delay', 'delete', 'delude', 'deluge', 'delve', 'demand', 'demean', 'demise', 'demote', 'demur', 'den', 'denote', 'dent', 'denude', 'deny', 'depart', 'depend', 'depict', 'deploy', 'deport', 'depose', 'depute', 'derail', 'deride', 'derive', 'desert', 'design', 'desire', 'desist', 'detach', 'detail', 'detain', 'detect', 'deter', 'detest', 'detour', 'devil', 'devise', 'devote', 'devour', 'dial', 'diaper', 'dice', 'die', 'diet', 'differ', 'dig', 'digest', 'dilate', 'dilute', 'dim', 'dimple', 'din', 'dine', 'dint', 'dip', 'direct', 'disarm', 'disc', 'disco', 'dish', 'dismay', 'disown', 'dispel', 'disuse', 'ditch', 'dither', 'dive', 'divert', 'divest', 'divide', 'divine', 'dizzy', 'do', 'dock', 'docket', 'doctor', 'dodge', 'dog', 'dole', 'doll', 'dolly', 'dome', 'donate', 'doodle', 'doom', 'dope', 'dose', 'dot', 'dote', 'double', 'doubt', 'douse', 'dowel', 'down', 'dowse', 'doze', 'drab', 'draft', 'drag', 'drain', 'drape', 'draw', 'drawl', 'dray', 'dread', 'dream', 'dredge', 'drench', 'dress', 'drift', 'drill', 'drink', 'drip', 'drive', 'drivel', 'drone', 'drool', 'droop', 'drop', 'drown', 'drowse', 'drudge', 'drug', 'drum', 'dry', 'dub', 'duck', 'duel', 'duet', 'dull', 'dumb', 'dummy', 'dump', 'dun', 'dupe', 'dust', 'dwarf', 'dwell', 'dye', 'ear', 'earn', 'ease', 'eat', 'ebb', 'echo', 'eddy', 'edge', 'edify', 'edit', 'efface', 'egg', 'egress', 'eject', 'elapse', 'elate', 'elbow', 'elect', 'elicit', 'elide', 'elope', 'elude', 'embalm', 'embark', 'embed', 'embody', 'emboss', 'emerge', 'emit', 'employ', 'empty', 'enable', 'enact', 'enamel', 'encamp', 'encase', 'encode', 'encore', 'end', 'endear', 'endow', 'endure', 'enfold', 'engage', 'engulf', 'enjoin', 'enjoy', 'enlist', 'enrage', 'enrich', 'ensue', 'ensure', 'entail', 'enter', 'entice', 'entomb', 'entrap', 'envy', 'equal', 'equate', 'equip', 'erase', 'erect', 'erode', 'err', 'erupt', 'escape', 'eschew', 'escort', 'escrow', 'essay', 'esteem', 'etch', 'evade', 'evict', 'evince', 'evoke', 'evolve', 'exact', 'exalt', 'exceed', 'excel', 'except', 'excess', 'excise', 'excite', 'excuse', 'exempt', 'exert', 'exeunt', 'exhale', 'exhort', 'exhume', 'exile', 'exist', 'expand', 'expect', 'expel', 'expend', 'expire', 'export', 'expose', 'extend', 'extol', 'extort', 'exude', 'exult', 'eye', 'fable', 'face', 'facet', 'factor', 'fade', 'fail', 'faint', 'fair', 'fake', 'fall', 'falter', 'fame', 'fan', 'fancy', 'farce', 'fare', 'farm', 'fast', 'fasten', 'fat', 'fate', 'father', 'fathom', 'fatten', 'fault', 'fawn', 'fear', 'feast', 'fee', 'feed', 'feel', 'feign', 'fell', 'fence', 'fend', 'ferret', 'ferry', 'fester', 'fetch', 'fettle', 'feud', 'fever', 'fib', 'fiddle', 'fidget', 'field', 'fife', 'fight', 'figure', 'file', 'fill', 'fillet', 'fillip', 'film', 'filter', 'fin', 'find', 'fine', 'finger', 'finish', 'fire', 'firm', 'fish', 'fit', 'fitter', 'fix', 'fizz', 'fizzle', 'flack', 'flag', 'flail', 'flake', 'flame', 'flank', 'flap', 'flare', 'flash', 'flat', 'flaunt', 'flaw', 'flay', 'flee', 'fleece', 'fleet', 'flesh', 'flex', 'flick', 'flight', 'flinch', 'fling', 'flint', 'flip', 'flit', 'float', 'flock', 'flog', 'flood', 'floor', 'flop', 'floss', 'flour', 'flout', 'flow', 'flower', 'fluff', 'flurry', 'flush', 'flute', 'flux', 'fly', 'foal', 'foam', 'fob', 'focus', 'fodder', 'fog', 'foil', 'foist', 'fold', 'folio', 'follow', 'foment', 'fondle', 'fool', 'foot', 'forage', 'foray', 'forbid', 'force', 'ford', 'forego', 'forest', 'forge', 'forget', 'fork', 'form', 'format', 'foster', 'foul', 'found', 'fowl', 'fox', 'frame', 'frank', 'fray', 'freak', 'free', 'freeze', 'frenzy', 'fresh', 'fret', 'friend', 'fright', 'frill', 'fringe', 'frisk', 'frock', 'frog', 'frolic', 'front', 'frost', 'froth', 'frown', 'fruit', 'fry', 'fudge', 'fuel', 'full', 'fumble', 'fume', 'fun', 'fund', 'funk', 'funnel', 'fur', 'furrow', 'fuse', 'fuss', 'fuzz', 'gabble', 'gad', 'gaff', 'gag', 'gaggle', 'gain', 'gait', 'gall', 'gallop', 'gamble', 'gambol', 'game', 'gang', 'gap', 'gape', 'garage', 'garble', 'garden', 'gargle', 'garner', 'garter', 'gas', 'gash', 'gasp', 'gate', 'gather', 'gauge', 'gavel', 'gaze', 'gear', 'gel', 'gem', 'gender', 'gentle', 'get', 'ghost', 'gibber', 'gibbet', 'giddy', 'gift', 'gig', 'giggle', 'gimlet', 'gin', 'ginger', 'gird', 'girdle', 'girth', 'give', 'glad', 'glance', 'glare', 'glass', 'glaze', 'gleam', 'glean', 'glide', 'glint', 'gloat', 'globe', 'gloom', 'glory', 'gloss', 'glove', 'glow', 'glower', 'glue', 'glut', 'gnarl', 'gnash', 'gnaw', 'go', 'goad', 'gobble', 'golf', 'gong', 'goose', 'gore', 'gorge', 'gossip', 'gouge', 'govern', 'gown', 'grab', 'grace', 'grade', 'graft', 'grain', 'grant', 'graph', 'grasp', 'grass', 'grate', 'grave', 'gravel', 'graze', 'grease', 'green', 'greet', 'grey', 'grieve', 'grill', 'grin', 'grind', 'grip', 'gripe', 'grit', 'groan', 'groin', 'groom', 'groove', 'grope', 'gross', 'grouch', 'ground', 'group', 'grouse', 'grout', 'grovel', 'grow', 'growl', 'grub', 'grudge', 'grunt', 'guard', 'guess', 'guest', 'guffaw', 'guide', 'guilt', 'guise', 'gulf', 'gull', 'gully', 'gulp', 'gum', 'gun', 'gurgle', 'gush', 'gust', 'gut', 'gutter', 'guy', 'guzzle', 'gyrate', 'habit', 'hack', 'haft', 'haggle', 'hail', 'hale', 'hallo', 'halo', 'halt', 'halter', 'halve', 'ham', 'hammer', 'hamper', 'hand', 'handle', 'hang', 'hanker', 'happen', 'harass', 'harden', 'hark', 'harm', 'harp', 'harrow', 'harry', 'hash', 'hasp', 'hassle', 'haste', 'hasten', 'hat', 'hatch', 'hate', 'haul', 'haunt', 'have', 'haven', 'havoc', 'hawk', 'hay', 'hazard', 'haze', 'head', 'heal', 'heap', 'hear', 'heart', 'heat', 'heave', 'heckle', 'hector', 'hedge', 'heed', 'heel', 'heft', 'hell', 'hello', 'helm', 'help', 'hem', 'herald', 'herd', 'hew', 'hex', 'hiccup', 'hide', 'hijack', 'hike', 'hill', 'hilt', 'hinder', 'hinge', 'hint', 'hip', 'hiss', 'hit', 'hitch', 'hive', 'hoard', 'hoax', 'hob', 'hobble', 'hock', 'hoe', 'hog', 'hoist', 'hold', 'hole', 'hollow', 'home', 'hone', 'honey', 'honk', 'hood', 'hoof', 'hook', 'hoop', 'hoot', 'hop', 'hope', 'horde', 'horn', 'hose', 'host', 'hostel', 'hound', 'house', 'hovel', 'hover', 'howl', 'huddle', 'huff', 'hug', 'hulk', 'hull', 'hum', 'humble', 'humbug', 'hump', 'hunch', 'hunger', 'hunt', 'hurdle', 'hurl', 'hurrah', 'hurry', 'hurt', 'hurtle', 'hush', 'husk', 'hustle', 'hymn', 'hyphen', 'ice', 'id', 'idle', 'ignite', 'ignore', 'image', 'imbibe', 'imbue', 'imp', 'impact', 'impair', 'impale', 'impart', 'impede', 'impel', 'imply', 'import', 'impose', 'impugn', 'impute', 'inch', 'incite', 'incur', 'indent', 'index', 'indict', 'induce', 'induct', 'infect', 'infer', 'infest', 'infix', 'inform', 'infuse', 'ingest', 'inhale', 'inject', 'injure', 'ink', 'inlay', 'inlet', 'input', 'insert', 'inset', 'insist', 'insult', 'insure', 'intend', 'inter', 'intern', 'intone', 'inure', 'invade', 'invent', 'invert', 'invest', 'invite', 'invoke', 'ionize', 'iris', 'iron', 'island', 'isle', 'issue', 'itch', 'item', 'jab', 'jabber', 'jack', 'jade', 'jag', 'jail', 'jam', 'jangle', 'jape', 'jar', 'jargon', 'jaunt', 'jaw', 'jazz', 'jeer', 'jelly', 'jerk', 'jest', 'jet', 'jetty', 'jewel', 'jib', 'jibe', 'jig', 'jigsaw', 'jilt', 'jingle', 'jinx', 'jitter', 'jive', 'job', 'jockey', 'jog', 'join', 'joint', 'joke', 'jolly', 'jolt', 'jostle', 'jot', 'joust', 'joy', 'judge', 'jug', 'juggle', 'juice', 'jumble', 'jump', 'junk', 'junket', 'just', 'jut', 'kayak', 'keel', 'keen', 'keep', 'ken', 'kennel', 'kernel', 'key', 'kick', 'kid', 'kidnap', 'kill', 'kiln', 'kilt', 'kindle', 'king', 'kink', 'kipper', 'kiss', 'kit', 'kite', 'kitten', 'knead', 'knee', 'kneel', 'knell', 'knife', 'knight', 'knit', 'knock', 'knoll', 'knot', 'know', 'kosher', 'kowtow', 'laager', 'label', 'lace', 'lack', 'lackey', 'ladle', 'lag', 'lame', 'lament', 'lance', 'land', 'lap', 'lapse', 'lard', 'lark', 'lash', 'lasso', 'last', 'latch', 'lathe', 'lather', 'laud', 'laugh', 'launch', 'laurel', 'lavish', 'law', 'lay', 'layer', 'laze', 'lazy', 'leach', 'lead', 'leaf', 'league', 'leak', 'lean', 'leap', 'learn', 'lease', 'leash', 'leave', 'leaven', 'lecher', 'leech', 'leer', 'leg', 'lend', 'lesion', 'lessen', 'lesson', 'let', 'letter', 'level', 'lever', 'levy', 'libel', 'lichen', 'lick', 'lid', 'lie', 'lift', 'light', 'like', 'liken', 'lilt', 'limb', 'limber', 'lime', 'limit', 'limp', 'line', 'linger', 'link', 'lip', 'liquor', 'lisp', 'list', 'listen', 'litter', 'live', 'liven', 'load', 'loaf', 'loam', 'loan', 'loathe', 'lob', 'lobby', 'local', 'locate', 'lock', 'lodge', 'loft', 'log', 'loiter', 'loll', 'long', 'look', 'loom', 'loop', 'loose', 'loosen', 'loot', 'lop', 'lope', 'lord', 'lose', 'lot', 'loth', 'lounge', 'louse', 'lout', 'love', 'lower', 'luck', 'lug', 'lull', 'lumber', 'lump', 'lunch', 'lunge', 'lurch', 'lure', 'lurk', 'lust', 'lute', 'lynch', 'mace', 'mad', 'madden', 'mail', 'maim', 'major', 'make', 'malign', 'malt', 'man', 'manage', 'mangle', 'mantle', 'manure', 'map', 'mar', 'marble', 'march', 'margin', 'mark', 'market', 'marl', 'maroon', 'marry', 'martyr', 'marvel', 'mash', 'mask', 'mason', 'mass', 'mast', 'master', 'mat', 'match', 'mate', 'matte', 'matter', 'mature', 'maul', 'maze', 'mean', 'medal', 'meddle', 'meet', 'meld', 'mellow', 'melt', 'menace', 'mend', 'mentor', 'merge', 'merit', 'mesh', 'mess', 'metal', 'meter', 'mew', 'mildew', 'milk', 'mill', 'mimic', 'mince', 'mind', 'mine', 'mingle', 'minor', 'mint', 'minute', 'mire', 'mirror', 'miscue', 'misfit', 'mislay', 'miss', 'mist', 'misuse', 'mitre', 'mix', 'moan', 'mob', 'mock', 'model', 'modem', 'modify', 'molest', 'molten', 'monger', 'monkey', 'moon', 'moor', 'moot', 'mop', 'mope', 'morph', 'morsel', 'mortar', 'mosaic', 'moss', 'mother', 'motion', 'motive', 'motor', 'mould', 'mound', 'mount', 'mourn', 'mouse', 'mousse', 'mouth', 'move', 'mow', 'muck', 'mud', 'muddle', 'muddy', 'muff', 'muffle', 'mug', 'mulch', 'mull', 'mumble', 'mummy', 'munch', 'murder', 'murmur', 'muscle', 'muse', 'mush', 'must', 'muster', 'mutate', 'mute', 'mutiny', 'mutter', 'muzzle', 'nag', 'nail', 'name', 'nap', 'narrow', 'near', 'neaten', 'neck', 'need', 'needle', 'negate', 'neigh', 'nerve', 'nest', 'nestle', 'net', 'nettle', 'neuter', 'nibble', 'niche', 'nick', 'nickel', 'niggle', 'nigh', 'nip', 'nod', 'noise', 'noodle', 'noose', 'nose', 'notch', 'note', 'notice', 'notify', 'nudge', 'null', 'numb', 'number', 'nurse', 'nut', 'nuzzle', 'oar', 'obey', 'object', 'oblige', 'obtain', 'occult', 'occupy', 'occur', 'off', 'offend', 'offer', 'ogle', 'oh', 'oil', 'omen', 'omit', 'ooze', 'open', 'opiate', 'oppose', 'opt', 'option', 'orb', 'orbit', 'ordain', 'order', 'orient', 'orphan', 'oust', 'out', 'outbid', 'outdo', 'outfit', 'outlaw', 'outlay', 'output', 'outrun', 'outwit', 'over', 'overdo', 'owe', 'own', 'oyster', 'pace', 'pacify', 'pack', 'packet', 'pad', 'paddle', 'page', 'pain', 'paint', 'pair', 'pal', 'pale', 'pall', 'pallet', 'palm', 'palsy', 'pamper', 'pan', 'pander', 'panel', 'panic', 'pant', 'paper', 'par', 'parade', 'parcel', 'parch', 'pardon', 'pare', 'parent', 'park', 'parley', 'parody', 'parole', 'parrot', 'parry', 'parse', 'part', 'party', 'pass', 'paste', 'pastor', 'pat', 'patch', 'patent', 'patrol', 'patter', 'pause', 'pave', 'paw', 'pawn', 'pay', 'peace', 'peach', 'peak', 'peal', 'pearl', 'pebble', 'peck', 'pedal', 'peddle', 'peek', 'peel', 'peep', 'peer', 'peg', 'pellet', 'pelt', 'pen', 'pencil', 'people', 'pepper', 'perch', 'peril', 'perish', 'perk', 'perm', 'permit', 'peruse', 'pester', 'pestle', 'pet', 'phase', 'phone', 'phrase', 'pi', 'pick', 'picket', 'pickle', 'picnic', 'pie', 'piece', 'pierce', 'piffle', 'pig', 'pike', 'pile', 'pilfer', 'pill', 'pillar', 'pillow', 'pilot', 'pimp', 'pin', 'pinch', 'pine', 'ping', 'pinion', 'pink', 'pip', 'pipe', 'pique', 'pirate', 'pistol', 'pit', 'pitch', 'pith', 'pity', 'pivot', 'place', 'plague', 'plait', 'plan', 'plane', 'plank', 'plant', 'plat', 'plate', 'play', 'plead', 'please', 'pleat', 'pledge', 'plight', 'plod', 'plop', 'plot', 'plough', 'pluck', 'plug', 'plumb', 'plume', 'plump', 'plunge', 'ply', 'poach', 'pocket', 'pod', 'point', 'poise', 'poison', 'poke', 'pole', 'police', 'polish', 'polka', 'poll', 'pollen', 'pomade', 'pond', 'ponder', 'pony', 'pool', 'pop', 'pore', 'port', 'pose', 'posit', 'post', 'pot', 'potter', 'pouch', 'pounce', 'pound', 'pour', 'pout', 'powder', 'power', 'praise', 'prance', 'prank', 'prawn', 'pray', 'preach', 'preen', 'prefab', 'prefix', 'preset', 'press', 'pretty', 'prey', 'price', 'prick', 'pride', 'priest', 'prim', 'prime', 'print', 'prize', 'probe', 'prod', 'profit', 'prompt', 'prong', 'proof', 'prop', 'propel', 'prose', 'prove', 'prowl', 'prune', 'pry', 'pucker', 'puddle', 'puff', 'pug', 'puke', 'pull', 'pulp', 'pulse', 'pumice', 'pummel', 'pump', 'pun', 'punch', 'punish', 'punt', 'pup', 'purge', 'purify', 'purl', 'purple', 'purr', 'purse', 'pursue', 'push', 'put', 'putt', 'putter', 'putty', 'puzzle', 'quack', 'quaff', 'quake', 'quarry', 'quash', 'quaver', 'queen', 'queer', 'quell', 'quench', 'query', 'quest', 'queue', 'quiet', 'quill', 'quilt', 'quip', 'quit', 'quiver', 'quiz', 'quote', 'rabble', 'race', 'rack', 'racket', 'radio', 'raffle', 'raft', 'rag', 'rage', 'raid', 'rail', 'rain', 'raise', 'rake', 'rally', 'ram', 'ramble', 'ramify', 'ramp', 'ramrod', 'ranch', 'range', 'rank', 'rankle', 'ransom', 'rant', 'rap', 'rasp', 'rat', 'rate', 'ratify', 'ration', 'rattle', 'ravage', 'rave', 'ravel', 'raven', 'ravish', 'ray', 'raze', 'reach', 'react', 'read', 'ready', 'really', 'ream', 'reap', 'rear', 'reason', 'rebate', 'rebel', 'rebind', 'rebook', 'rebuff', 'rebuke', 'rebut', 'recall', 'recant', 'recap', 'recast', 'recede', 'recess', 'recite', 'reckon', 'recode', 'recoil', 'record', 'recur', 'redden', 'redeem', 'redial', 'redo', 'redraw', 'reduce', 'reed', 'reef', 'reek', 'reel', 'reeve', 'refer', 'refile', 'refill', 'refine', 'refit', 'reflex', 'reform', 'refuel', 'refuge', 'refund', 'refuse', 'refute', 'regain', 'regale', 'regard', 'regret', 'rehash', 'reheat', 'reify', 'reign', 'reject', 'rejoin', 'relate', 'relax', 'relay', 'relent', 'relink', 'relish', 'relive', 'rely', 'remain', 'remake', 'remand', 'remap', 'remark', 'remedy', 'remind', 'remit', 'remove', 'rename', 'rend', 'render', 'renege', 'renew', 'rent', 'reopen', 'repack', 'repair', 'repast', 'repay', 'repeal', 'repeat', 'repel', 'repent', 'repine', 'replay', 'reply', 'report', 'repose', 'repute', 'reread', 'rerun', 'rescue', 'resell', 'resend', 'resent', 'reset', 'reshow', 'reside', 'resign', 'resin', 'resist', 'resit', 'resort', 'rest', 'result', 'resume', 'retail', 'retain', 'retake', 'retard', 'retch', 'retell', 'retest', 'retire', 'retort', 'retry', 'retune', 'return', 'retype', 'reuse', 'revamp', 'reveal', 'revel', 'revere', 'revert', 'review', 'revile', 'revive', 'revoke', 'revolt', 'reward', 'rewind', 'reword', 'rework', 'rhyme', 'rib', 'ribbon', 'rice', 'rid', 'riddle', 'ride', 'ridge', 'riff', 'rifle', 'rift', 'rig', 'right', 'rim', 'rime', 'ring', 'rinse', 'riot', 'rip', 'ripen', 'ripple', 'rise', 'risk', 'rival', 'rivet', 'roach', 'roam', 'roar', 'roast', 'rob', 'robe', 'rock', 'rocket', 'rogue', 'roll', 'romp', 'roof', 'rook', 'room', 'roost', 'root', 'rope', 'rosin', 'rot', 'rotate', 'rouge', 'rough', 'round', 'rouse', 'rout', 'route', 'rove', 'row', 'rub', 'ruck', 'rue', 'ruff', 'ruffle', 'ruin', 'rule', 'rumble', 'rumple', 'run', 'rush', 'rust', 'rustle', 'rut', 'sack', 'sadden', 'saddle', 'safari', 'sag', 'sail', 'saint', 'sallow', 'salt', 'salute', 'sample', 'sand', 'sandal', 'sap', 'sash', 'sauce', 'sauna', 'savage', 'save', 'saw', 'say', 'scab', 'scald', 'scale', 'scalp', 'scan', 'scant', 'scape', 'scar', 'scare', 'scarf', 'scathe', 'scent', 'scheme', 'school', 'scoff', 'scold', 'scoop', 'scoot', 'scope', 'scorch', 'score', 'scorn', 'scotch', 'scour', 'scout', 'scowl', 'scrap', 'scrape', 'scrawl', 'scream', 'screen', 'screw', 'scribe', 'script', 'scroll', 'scrub', 'scrum', 'scuba', 'scud', 'scuff', 'scull', 'sculpt', 'scum', 'scurry', 'scythe', 'seal', 'seam', 'sear', 'search', 'season', 'seat', 'secede', 'second', 'sector', 'secure', 'sedate', 'seduce', 'see', 'seed', 'seek', 'seem', 'seep', 'seethe', 'seize', 'select', 'sell', 'send', 'sense', 'serge', 'serve', 'set', 'settle', 'sever', 'sew', 'shack', 'shade', 'shadow', 'shaft', 'shag', 'shake', 'sham', 'shame', 'shank', 'shape', 'share', 'shark', 'sharp', 'shave', 'shear', 'shed', 'sheer', 'shell', 'shelve', 'shield', 'shift', 'shin', 'shine', 'ship', 'shirk', 'shiver', 'shoal', 'shock', 'shoe', 'shoo', 'shoot', 'shop', 'short', 'shot', 'shout', 'shove', 'shovel', 'show', 'shower', 'shred', 'shriek', 'shrill', 'shrimp', 'shrine', 'shrink', 'shroud', 'shrug', 'shun', 'shunt', 'shut', 'shy', 'sicken', 'sickly', 'side', 'sidle', 'siege', 'sieve', 'sift', 'sigh', 'sight', 'sign', 'signal', 'signet', 'silk', 'silo', 'silt', 'silver', 'simmer', 'simper', 'simple', 'sin', 'sinew', 'sing', 'single', 'sink', 'sip', 'siphon', 'sire', 'sit', 'site', 'size', 'sizzle', 'skate', 'sketch', 'skew', 'skewer', 'ski', 'skid', 'skim', 'skimp', 'skin', 'skip', 'skirl', 'skirt', 'skulk', 'skunk', 'sky', 'slab', 'slack', 'slag', 'slake', 'slam', 'slang', 'slant', 'slap', 'slash', 'slat', 'slate', 'slave', 'slaver', 'slay', 'sleaze', 'sled', 'sledge', 'sleek', 'sleep', 'sleet', 'sleeve', 'sleigh', 'sleuth', 'slice', 'slick', 'slide', 'slight', 'slim', 'slime', 'sling', 'slink', 'slip', 'slit', 'sliver', 'slog', 'slop', 'slope', 'slosh', 'slot', 'slouch', 'slough', 'slow', 'slug', 'sluice', 'slum', 'slump', 'slur', 'slurp', 'slurry', 'slush', 'smack', 'smart', 'smash', 'smear', 'smell', 'smelt', 'smile', 'smirk', 'smite', 'smock', 'smoke', 'smooth', 'smudge', 'smut', 'snack', 'snag', 'snake', 'snap', 'snare', 'snarl', 'snatch', 'sneak', 'sneer', 'sneeze', 'snick', 'sniff', 'snip', 'snipe', 'snivel', 'snoop', 'snooze', 'snore', 'snort', 'snow', 'snub', 'snuff', 'snug', 'soak', 'soap', 'soar', 'sob', 'sober', 'sock', 'socket', 'sodden', 'soften', 'soil', 'solace', 'solder', 'sole', 'solo', 'solve', 'soot', 'soothe', 'sop', 'sorrow', 'sort', 'sortie', 'sound', 'soup', 'sour', 'source', 'south', 'sow', 'space', 'spade', 'span', 'spank', 'spar', 'spare', 'spark', 'spat', 'spawn', 'speak', 'spear', 'speck', 'speed', 'spell', 'spend', 'spew', 'sphere', 'spice', 'spike', 'spill', 'spin', 'spiral', 'spire', 'spirit', 'spit', 'spite', 'splash', 'splice', 'splint', 'split', 'spoil', 'spoke', 'sponge', 'spoof', 'spool', 'spoon', 'spoor', 'spore', 'sport', 'spot', 'spout', 'sprain', 'sprawl', 'spray', 'spread', 'sprig', 'spring', 'sprint', 'sprout', 'spruce', 'spud', 'spume', 'spur', 'spurn', 'spurt', 'spy', 'squad', 'squall', 'square', 'squash', 'squat', 'squawk', 'squeak', 'squeal', 'squib', 'squint', 'squire', 'squirm', 'squirt', 'stab', 'stable', 'stack', 'staff', 'stag', 'stage', 'stain', 'stake', 'stale', 'stalk', 'stall', 'stamp', 'stand', 'staple', 'star', 'starch', 'stare', 'start', 'starve', 'state', 'stave', 'stay', 'stead', 'steal', 'steam', 'steel', 'steep', 'steer', 'stem', 'step', 'stet', 'stew', 'stick', 'stiff', 'stifle', 'still', 'stilt', 'sting', 'stink', 'stint', 'stir', 'stitch', 'stock', 'stomp', 'stone', 'stooge', 'stool', 'stoop', 'stop', 'store', 'storm', 'story', 'stow', 'strafe', 'strain', 'strand', 'strap', 'stray', 'streak', 'stream', 'stress', 'strew', 'stride', 'strike', 'string', 'strip', 'stripe', 'strive', 'stroke', 'stroll', 'strop', 'strum', 'strut', 'stub', 'stucco', 'stud', 'study', 'stuff', 'stump', 'stun', 'stunt', 'sturdy', 'sty', 'style', 'stymie', 'subdue', 'submit', 'suck', 'sucker', 'suckle', 'suds', 'sue', 'suede', 'suffer', 'suffix', 'sugar', 'suit', 'sulk', 'sully', 'sum', 'summer', 'summit', 'summon', 'sun', 'suntan', 'sup', 'supple', 'supply', 'surf', 'surge', 'survey', 'suture', 'swab', 'swamp', 'swap', 'swarm', 'swat', 'swathe', 'sway', 'swear', 'sweat', 'sweep', 'swell', 'swerve', 'swill', 'swim', 'swing', 'swipe', 'swirl', 'swish', 'switch', 'swivel', 'swoon', 'swoop', 'swop', 'symbol', 'syrup', 'tab', 'tabby', 'table', 'taboo', 'tack', 'tackle', 'tag', 'tail', 'tailor', 'taint', 'take', 'talk', 'tallow', 'tally', 'tame', 'tamp', 'tamper', 'tan', 'tangle', 'tango', 'tank', 'tap', 'tape', 'taper', 'tar', 'target', 'tariff', 'tarry', 'tart', 'task', 'tassel', 'taste', 'tattle', 'tattoo', 'taunt', 'tax', 'taxi', 'teach', 'team', 'tear', 'tease', 'tee', 'teem', 'teeter', 'teethe', 'telex', 'tell', 'temper', 'tempt', 'tenant', 'tend', 'tender', 'tenon', 'tense', 'tent', 'tenure', 'term', 'test', 'tether', 'thank', 'thatch', 'thaw', 'thieve', 'thin', 'think', 'thirst', 'thorn', 'thou', 'thrall', 'thrash', 'thread', 'threat', 'thresh', 'thrill', 'thrive', 'throat', 'throb', 'throne', 'throng', 'throw', 'thrum', 'thrust', 'thud', 'thumb', 'thump', 'thwack', 'thwart', 'tick', 'ticket', 'tickle', 'tide', 'tidy', 'tie', 'tier', 'tile', 'till', 'tiller', 'tilt', 'timber', 'time', 'tin', 'tinge', 'tingle', 'tinker', 'tinkle', 'tinsel', 'tint', 'tip', 'tipple', 'tiptoe', 'tire', 'tissue', 'tithe', 'title', 'titter', 'toady', 'toast', 'toddle', 'toe', 'toggle', 'toil', 'token', 'toll', 'tomb', 'tomcat', 'tone', 'tongue', 'tool', 'toot', 'tooth', 'tootle', 'top', 'topple', 'torch', 'torque', 'toss', 'tot', 'total', 'totter', 'touch', 'tough', 'tour', 'tout', 'tow', 'towel', 'tower', 'toy', 'trace', 'track', 'trade', 'trail', 'train', 'tram', 'tramp', 'trance', 'trap', 'trash', 'travel', 'trawl', 'tread', 'treat', 'treble', 'tree', 'trek', 'trench', 'trend', 'triage', 'trice', 'trick', 'trill', 'trim', 'trip', 'triple', 'troll', 'troop', 'trot', 'troupe', 'trowel', 'truant', 'truck', 'trudge', 'true', 'truss', 'trust', 'try', 'tub', 'tube', 'tuck', 'tucker', 'tuft', 'tug', 'tumble', 'tun', 'tune', 'tunnel', 'turf', 'turn', 'turtle', 'tusk', 'tussle', 'tutor', 'twang', 'tweak', 'tweet', 'twig', 'twill', 'twin', 'twine', 'twinge', 'twirl', 'twist', 'twitch', 'type', 'typify', 'umpire', 'unable', 'unbend', 'unbolt', 'unclog', 'uncoil', 'undo', 'unfit', 'unfold', 'unfurl', 'unhand', 'unify', 'unite', 'unjam', 'unlace', 'unlink', 'unload', 'unlock', 'unmask', 'unpack', 'unpick', 'unplug', 'unroll', 'unseal', 'unseat', 'untie', 'unveil', 'unwind', 'unwrap', 'unzip', 'up', 'update', 'uphold', 'uplift', 'upload', 'uproot', 'upset', 'upturn', 'urge', 'use', 'usher', 'usurp', 'utter', 'vacate', 'vacuum', 'valet', 'value', 'valve', 'vamp', 'vanish', 'vary', 'vat', 'vault', 'vector', 'veer', 'veil', 'vein', 'vend', 'veneer', 'vent', 'verge', 'verify', 'verse', 'vest', 'vet', 'veto', 'vex', 'vial', 'vice', 'video', 'vie', 'view', 'vilify', 'visa', 'vision', 'visit', 'visor', 'voice', 'void', 'volley', 'vomit', 'voodoo', 'vote', 'vouch', 'vow', 'voyage', 'wad', 'waddle', 'wade', 'wafer', 'waffle', 'waft', 'wag', 'wager', 'waggle', 'wagon', 'wail', 'wait', 'waive', 'wake', 'waken', 'walk', 'wall', 'wallow', 'waltz', 'wan', 'wander', 'wane', 'want', 'wanton', 'war', 'warble', 'ward', 'warm', 'warn', 'warp', 'wash', 'waste', 'watch', 'water', 'wattle', 'wave', 'waver', 'wax', 'waylay', 'weaken', 'wean', 'weapon', 'wear', 'weary', 'weasel', 'weave', 'web', 'wed', 'wedge', 'weed', 'weep', 'weigh', 'weight', 'weld', 'well', 'welt', 'welter', 'wench', 'wend', 'wet', 'whack', 'whale', 'wharf', 'wheel', 'wheeze', 'whelp', 'whet', 'whiff', 'while', 'whine', 'whinny', 'whip', 'whir', 'whirl', 'whirr', 'whisk', 'white', 'whiten', 'whizz', 'whoop', 'whoosh', 'wick', 'widen', 'widow', 'wield', 'wig', 'wiggle', 'wild', 'wile', 'will', 'wilt', 'wimple', 'win', 'wince', 'winch', 'wind', 'window', 'wine', 'wing', 'wink', 'winnow', 'winter', 'wipe', 'wire', 'wish', 'wisp', 'wit', 'witch', 'wither', 'wobble', 'wolf', 'wonder', 'wont', 'woo', 'wood', 'word', 'work', 'worm', 'worry', 'worsen', 'worst', 'wound', 'wow', 'wrack', 'wrap', 'wreak', 'wreath', 'wreck', 'wrench', 'wrest', 'wring', 'write', 'writhe', 'wrong', 'x-ray', 'xerox', 'yacht', 'yak', 'yap', 'yard', 'yaw', 'yawn', 'yearn', 'yeast', 'yell', 'yellow', 'yelp', 'yen', 'yes', 'yield', 'yo-yo', 'yodel', 'yoke', 'zero', 'zigzag', 'zinc', 'zip', 'zipper', 'zone', 'zoom'
+'abase', 'abate', 'abduct', 'abet', 'abhor', 'abide', 'abjure', 'ablate', 'abort', 'abound', 'abseil', 'absorb', 'abuse', 'abut', 'accede', 'accent', 'accept', 'access', 'accord', 'accost', 'accrue', 'accuse', 'ache', 'acquit', 'act', 'adapt', 'add', 'addict', 'addle', 'adduce', 'adhere', 'adjoin', 'adjust', 'admire', 'admit', 'adopt', 'adore', 'adorn', 'advert', 'advise', 'aerate', 'affect', 'affirm', 'affix', 'afford', 'age', 'agree', 'aid', 'aim', 'alarm', 'alert', 'alight', 'align', 'allay', 'allege', 'allot', 'allow', 'alloy', 'allure', 'ally', 'alter', 'amass', 'amaze', 'amble', 'ambush', 'amend', 'amount', 'amuse', 'anger', 'angle', 'anneal', 'annex', 'annoy', 'annul', 'anoint', 'answer', 'ape', 'appeal', 'appear', 'append', 'apply', 'arc', 'arch', 'argue', 'arise', 'arm', 'array', 'arrest', 'arrive', 'arrow', 'ascend', 'ask', 'aspire', 'assail', 'assay', 'assent', 'assert', 'assess', 'assign', 'assist', 'assort', 'assume', 'assure', 'atone', 'attach', 'attack', 'attain', 'attend', 'attest', 'attire', 'attune', 'audit', 'augur', 'author', 'avail', 'avenge', 'aver', 'avert', 'avoid', 'await', 'awake', 'awaken', 'award', 'awe', 'babble', 'back', 'badge', 'badger', 'baffle', 'bag', 'bail', 'bait', 'bake', 'bald', 'bale', 'ball', 'ballot', 'ban', 'band', 'bandy', 'bang', 'banish', 'bank', 'banter', 'bar', 'barb', 'barber', 'bard', 'bare', 'barge', 'bark', 'barn', 'barrel', 'barter', 'base', 'bash', 'bask', 'baste', 'bat', 'batch', 'bathe', 'batten', 'batter', 'battle', 'bawl', 'bay', 'be', 'beach', 'beacon', 'bead', 'beam', 'bean', 'bear', 'beard', 'beat', 'become', 'bed', 'beef', 'beep', 'beetle', 'befall', 'befit', 'beg', 'beget', 'beggar', 'begin', 'behave', 'behead', 'behold', 'belay', 'belch', 'belie', 'bell', 'bellow', 'belly', 'belong', 'belt', 'bemoan', 'bench', 'bend', 'berate', 'berry', 'beset', 'best', 'bestir', 'bestow', 'bet', 'betide', 'betray', 'better', 'bevel', 'bewail', 'beware', 'bias', 'bib', 'bicker', 'bid', 'bide', 'bilge', 'bill', 'billet', 'billow', 'bin', 'bind', 'birdie', 'birth', 'bisect', 'bit', 'bite', 'bitter', 'black', 'blame', 'blanch', 'blank', 'blare', 'blast', 'blaze', 'bleach', 'bleat', 'bleed', 'bleep', 'blench', 'blend', 'bless', 'blight', 'blind', 'blink', 'blip', 'bliss', 'blitz', 'bloat', 'blob', 'blood', 'bloody', 'bloom', 'blot', 'blotch', 'blow', 'blue', 'bluff', 'blunt', 'blur', 'blurb', 'blurt', 'blush', 'board', 'boast', 'bob', 'bode', 'body', 'bog', 'bogey', 'boggle', 'boil', 'bolt', 'bomb', 'bond', 'bone', 'bonnet', 'boo', 'book', 'boom', 'boost', 'boot', 'booze', 'bop', 'bore', 'borrow', 'boss', 'botch', 'bother', 'bottle', 'bottom', 'bounce', 'bound', 'bout', 'bow', 'bowel', 'bowl', 'box', 'brace', 'brag', 'braid', 'braise', 'brake', 'branch', 'brand', 'brave', 'brawl', 'bray', 'breach', 'bread', 'break', 'breed', 'breeze', 'brew', 'bribe', 'brick', 'bridge', 'bridle', 'brief', 'brim', 'brine', 'bring', 'broach', 'broil', 'bronze', 'brook', 'brown', 'browse', 'bruise', 'brush', 'bubble', 'buck', 'bucket', 'buckle', 'bud', 'budge', 'budget', 'buffet', 'bug', 'bugle', 'build', 'bulge', 'bulk', 'bull', 'bully', 'bumble', 'bump', 'bunch', 'bundle', 'bung', 'bungle', 'bunk', 'bunker', 'buoy', 'burble', 'burden', 'burgle', 'burn', 'burp', 'burr', 'burrow', 'burst', 'bury', 'bus', 'bush', 'busk', 'bust', 'bustle', 'busy', 'butt', 'button', 'buy', 'buzz', 'bypass', 'cab', 'cabal', 'cabin', 'cable', 'cache', 'cackle', 'cadge', 'cage', 'cajole', 'cake', 'call', 'calm', 'calve', 'camber', 'camp', 'can', 'canal', 'cancel', 'candle', 'candy', 'cane', 'cannon', 'canoe', 'canopy', 'cant', 'canter', 'cap', 'caper', 'card', 'care', 'career', 'caress', 'carol', 'carp', 'carpet', 'carry', 'cart', 'carve', 'case', 'cash', 'cast', 'castle', 'cat', 'catch', 'cater', 'caucus', 'cause', 'cave', 'cavern', 'cease', 'cede', 'cellar', 'cement', 'censor', 'chafe', 'chain', 'chair', 'chalk', 'champ', 'chance', 'change', 'chant', 'chap', 'char', 'charge', 'charm', 'chart', 'chase', 'chat', 'cheat', 'check', 'cheep', 'cheer', 'chew', 'chide', 'chill', 'chime', 'chin', 'chink', 'chip', 'chirp', 'chisel', 'chock', 'choir', 'choke', 'choose', 'chop', 'chord', 'chorus', 'chrome', 'chuck', 'chuff', 'chug', 'chum', 'chunk', 'churn', 'chute', 'cinder', 'cipher', 'circle', 'cite', 'clad', 'claim', 'clam', 'clamp', 'clang', 'clank', 'clap', 'clash', 'clasp', 'class', 'claw', 'clean', 'clear', 'cleat', 'cleave', 'clench', 'clerk', 'click', 'climax', 'climb', 'clinch', 'cling', 'clink', 'clip', 'clique', 'cloak', 'clock', 'clog', 'clone', 'close', 'closet', 'clot', 'cloud', 'clout', 'clown', 'club', 'cluck', 'clue', 'clump', 'clutch', 'coach', 'coal', 'coast', 'coat', 'coax', 'cobble', 'cobweb', 'cockle', 'cocoon', 'coddle', 'code', 'codify', 'coerce', 'coffer', 'coffin', 'cog', 'cohere', 'coil', 'coin', 'coke', 'collar', 'comb', 'combat', 'come', 'commit', 'compel', 'comply', 'con', 'concur', 'cone', 'confer', 'convey', 'convoy', 'cook', 'cool', 'cope', 'copper', 'copy', 'cord', 'cordon', 'core', 'cork', 'corn', 'corner', 'corral', 'cosset', 'cost', 'cotton', 'couch', 'cough', 'count', 'couple', 'course', 'court', 'cover', 'covet', 'cowl', 'cox', 'crab', 'crack', 'cradle', 'craft', 'cram', 'cramp', 'crane', 'crank', 'crash', 'crate', 'crater', 'crave', 'crawl', 'crayon', 'craze', 'creak', 'cream', 'crease', 'create', 'credit', 'creed', 'creep', 'crest', 'crew', 'crib', 'crick', 'crimp', 'cringe', 'crisp', 'croak', 'crook', 'croon', 'crop', 'cross', 'crouch', 'crowd', 'crown', 'cruise', 'crunch', 'crush', 'crust', 'crutch', 'cry', 'cube', 'cuckoo', 'cuddle', 'cudgel', 'cue', 'cuff', 'cull', 'cup', 'curb', 'curd', 'curdle', 'cure', 'curl', 'curry', 'curse', 'curve', 'cuss', 'cut', 'cycle', 'dab', 'dabble', 'dagger', 'dally', 'dam', 'damage', 'damn', 'damp', 'dampen', 'dance', 'dangle', 'dapple', 'dare', 'darken', 'darn', 'dart', 'dash', 'date', 'daub', 'daunt', 'dawdle', 'daze', 'dazzle', 'deaden', 'deafen', 'deal', 'debar', 'debase', 'debate', 'debit', 'debug', 'debut', 'decamp', 'decant', 'decay', 'decide', 'deck', 'decode', 'decoy', 'decree', 'decry', 'deduce', 'deduct', 'deem', 'deepen', 'deface', 'defame', 'defeat', 'defect', 'defend', 'defer', 'defile', 'define', 'deform', 'defray', 'defuse', 'defy', 'deify', 'deign', 'delay', 'delete', 'delude', 'deluge', 'delve', 'demand', 'demean', 'demise', 'demote', 'demur', 'den', 'denote', 'dent', 'denude', 'deny', 'depart', 'depend', 'depict', 'deploy', 'deport', 'depose', 'depute', 'derail', 'deride', 'derive', 'desert', 'design', 'desire', 'desist', 'detach', 'detail', 'detain', 'detect', 'deter', 'detest', 'detour', 'devil', 'devise', 'devote', 'devour', 'dial', 'diaper', 'dice', 'die', 'diet', 'differ', 'dig', 'digest', 'dilate', 'dilute', 'dim', 'dimple', 'din', 'dine', 'dint', 'dip', 'direct', 'disarm', 'disc', 'disco', 'dish', 'dismay', 'disown', 'dispel', 'disuse', 'ditch', 'dither', 'dive', 'divert', 'divest', 'divide', 'divine', 'dizzy', 'do', 'dock', 'docket', 'doctor', 'dodge', 'dog', 'dole', 'doll', 'dolly', 'dome', 'donate', 'doodle', 'doom', 'dope', 'dose', 'dot', 'dote', 'double', 'doubt', 'douse', 'dowel', 'down', 'dowse', 'doze', 'drab', 'draft', 'drag', 'drain', 'drape', 'draw', 'drawl', 'dray', 'dread', 'dream', 'dredge', 'drench', 'dress', 'drift', 'drill', 'drink', 'drip', 'drive', 'drivel', 'drone', 'drool', 'droop', 'drop', 'drown', 'drowse', 'drudge', 'drug', 'drum', 'dry', 'dub', 'duck', 'duel', 'duet', 'dull', 'dumb', 'dummy', 'dump', 'dun', 'dupe', 'dust', 'dwarf', 'dwell', 'dye', 'ear', 'earn', 'ease', 'eat', 'ebb', 'echo', 'eddy', 'edge', 'edify', 'edit', 'efface', 'egg', 'egress', 'eject', 'elapse', 'elate', 'elbow', 'elect', 'elicit', 'elide', 'elope', 'elude', 'embalm', 'embark', 'embed', 'embody', 'emboss', 'emerge', 'emit', 'employ', 'empty', 'enable', 'enact', 'enamel', 'encamp', 'encase', 'encode', 'encore', 'end', 'endear', 'endow', 'endure', 'enfold', 'engage', 'engulf', 'enjoin', 'enjoy', 'enlist', 'enrage', 'enrich', 'ensue', 'ensure', 'entail', 'enter', 'entice', 'entomb', 'entrap', 'envy', 'equal', 'equate', 'equip', 'erase', 'erect', 'erode', 'err', 'erupt', 'escape', 'eschew', 'escort', 'escrow', 'essay', 'esteem', 'etch', 'evade', 'evict', 'evince', 'evoke', 'evolve', 'exact', 'exalt', 'exceed', 'excel', 'except', 'excess', 'excise', 'excite', 'excuse', 'exempt', 'exert', 'exeunt', 'exhale', 'exhort', 'exhume', 'exile', 'exist', 'expand', 'expect', 'expel', 'expend', 'expire', 'export', 'expose', 'extend', 'extol', 'extort', 'exude', 'exult', 'eye', 'fable', 'face', 'facet', 'factor', 'fade', 'fail', 'faint', 'fair', 'fake', 'fall', 'falter', 'fame', 'fan', 'fancy', 'farce', 'fare', 'farm', 'fast', 'fasten', 'fat', 'fate', 'father', 'fathom', 'fatten', 'fault', 'fawn', 'fear', 'feast', 'fee', 'feed', 'feel', 'feign', 'fell', 'fence', 'fend', 'ferret', 'ferry', 'fester', 'fetch', 'fettle', 'feud', 'fever', 'fib', 'fiddle', 'fidget', 'field', 'fife', 'fight', 'figure', 'file', 'fill', 'fillet', 'fillip', 'film', 'filter', 'fin', 'find', 'fine', 'finger', 'finish', 'fire', 'firm', 'fish', 'fit', 'fitter', 'fix', 'fizz', 'fizzle', 'flack', 'flag', 'flail', 'flake', 'flame', 'flank', 'flap', 'flare', 'flash', 'flat', 'flaunt', 'flaw', 'flay', 'flee', 'fleece', 'fleet', 'flesh', 'flex', 'flick', 'flight', 'flinch', 'fling', 'flint', 'flip', 'flit', 'float', 'flock', 'flog', 'flood', 'floor', 'flop', 'floss', 'flour', 'flout', 'flow', 'flower', 'fluff', 'flurry', 'flush', 'flute', 'flux', 'fly', 'foal', 'foam', 'fob', 'focus', 'fodder', 'fog', 'foil', 'foist', 'fold', 'folio', 'follow', 'foment', 'fondle', 'fool', 'foot', 'forage', 'foray', 'forbid', 'force', 'ford', 'forego', 'forest', 'forge', 'forget', 'fork', 'form', 'format', 'foster', 'foul', 'found', 'fowl', 'fox', 'frame', 'frank', 'fray', 'freak', 'free', 'freeze', 'frenzy', 'fresh', 'fret', 'friend', 'fright', 'frill', 'fringe', 'frisk', 'frock', 'frog', 'frolic', 'front', 'frost', 'froth', 'frown', 'fruit', 'fry', 'fudge', 'fuel', 'full', 'fumble', 'fume', 'fun', 'fund', 'funk', 'funnel', 'fur', 'furrow', 'fuse', 'fuss', 'fuzz', 'gabble', 'gad', 'gaff', 'gag', 'gaggle', 'gain', 'gait', 'gall', 'gallop', 'gamble', 'gambol', 'game', 'gang', 'gap', 'gape', 'garage', 'garble', 'garden', 'gargle', 'garner', 'garter', 'gas', 'gash', 'gasp', 'gate', 'gather', 'gauge', 'gavel', 'gaze', 'gear', 'gel', 'gem', 'gender', 'gentle', 'get', 'ghost', 'gibber', 'gibbet', 'giddy', 'gift', 'gig', 'giggle', 'gimlet', 'gin', 'ginger', 'gird', 'girdle', 'girth', 'give', 'glad', 'glance', 'glare', 'glass', 'glaze', 'gleam', 'glean', 'glide', 'glint', 'gloat', 'globe', 'gloom', 'glory', 'gloss', 'glove', 'glow', 'glower', 'glue', 'glut', 'gnarl', 'gnash', 'gnaw', 'go', 'goad', 'gobble', 'golf', 'gong', 'goose', 'gore', 'gorge', 'gossip', 'gouge', 'govern', 'gown', 'grab', 'grace', 'grade', 'graft', 'grain', 'grant', 'graph', 'grasp', 'grass', 'grate', 'grave', 'gravel', 'graze', 'grease', 'green', 'greet', 'grey', 'grieve', 'grill', 'grin', 'grind', 'grip', 'gripe', 'grit', 'groan', 'groin', 'groom', 'groove', 'grope', 'gross', 'grouch', 'ground', 'group', 'grouse', 'grout', 'grovel', 'grow', 'growl', 'grub', 'grudge', 'grunt', 'guard', 'guess', 'guest', 'guffaw', 'guide', 'guilt', 'guise', 'gulf', 'gull', 'gully', 'gulp', 'gum', 'gun', 'gurgle', 'gush', 'gust', 'gut', 'gutter', 'guy', 'guzzle', 'gyrate', 'habit', 'hack', 'haft', 'haggle', 'hail', 'hale', 'hallo', 'halo', 'halt', 'halter', 'halve', 'ham', 'hammer', 'hamper', 'hand', 'handle', 'hang', 'hanker', 'happen', 'harass', 'harden', 'hark', 'harm', 'harp', 'harrow', 'harry', 'hash', 'hasp', 'hassle', 'haste', 'hasten', 'hat', 'hatch', 'hate', 'haul', 'haunt', 'have', 'haven', 'havoc', 'hawk', 'hay', 'hazard', 'haze', 'head', 'heal', 'heap', 'hear', 'heart', 'heat', 'heave', 'heckle', 'hector', 'hedge', 'heed', 'heel', 'heft', 'hell', 'hello', 'helm', 'help', 'hem', 'herald', 'herd', 'hew', 'hex', 'hiccup', 'hide', 'hijack', 'hike', 'hill', 'hilt', 'hinder', 'hinge', 'hint', 'hip', 'hiss', 'hit', 'hitch', 'hive', 'hoard', 'hoax', 'hob', 'hobble', 'hock', 'hoe', 'hog', 'hoist', 'hold', 'hole', 'hollow', 'home', 'hone', 'honey', 'honk', 'hood', 'hoof', 'hook', 'hoop', 'hoot', 'hop', 'hope', 'horde', 'horn', 'hose', 'host', 'hostel', 'hound', 'house', 'hovel', 'hover', 'howl', 'huddle', 'huff', 'hug', 'hulk', 'hull', 'hum', 'humble', 'humbug', 'hump', 'hunch', 'hunger', 'hunt', 'hurdle', 'hurl', 'hurrah', 'hurry', 'hurt', 'hurtle', 'hush', 'husk', 'hustle', 'hymn', 'hyphen', 'ice', 'id', 'idle', 'ignite', 'ignore', 'image', 'imbibe', 'imbue', 'imp', 'impact', 'impair', 'impale', 'impart', 'impede', 'impel', 'imply', 'import', 'impose', 'impugn', 'impute', 'inch', 'incite', 'incur', 'indent', 'index', 'indict', 'induce', 'induct', 'infect', 'infer', 'infest', 'infix', 'inform', 'infuse', 'ingest', 'inhale', 'inject', 'injure', 'ink', 'inlay', 'inlet', 'input', 'insert', 'inset', 'insist', 'insult', 'insure', 'intend', 'inter', 'intern', 'intone', 'inure', 'invade', 'invent', 'invert', 'invest', 'invite', 'invoke', 'ionize', 'iris', 'iron', 'island', 'isle', 'issue', 'itch', 'item', 'jab', 'jabber', 'jack', 'jade', 'jag', 'jail', 'jam', 'jangle', 'jape', 'jar', 'jargon', 'jaunt', 'jaw', 'jazz', 'jeer', 'jelly', 'jerk', 'jest', 'jet', 'jetty', 'jewel', 'jib', 'jibe', 'jig', 'jigsaw', 'jilt', 'jingle', 'jinx', 'jitter', 'jive', 'job', 'jockey', 'jog', 'join', 'joint', 'joke', 'jolly', 'jolt', 'jostle', 'jot', 'joust', 'joy', 'judge', 'jug', 'juggle', 'juice', 'jumble', 'jump', 'junk', 'junket', 'just', 'jut', 'kayak', 'keel', 'keen', 'keep', 'ken', 'kennel', 'kernel', 'key', 'kick', 'kid', 'kidnap', 'kill', 'kiln', 'kilt', 'kindle', 'king', 'kink', 'kipper', 'kiss', 'kit', 'kite', 'kitten', 'knead', 'knee', 'kneel', 'knell', 'knife', 'knight', 'knit', 'knock', 'knoll', 'knot', 'know', 'kosher', 'kowtow', 'laager', 'label', 'lace', 'lack', 'lackey', 'ladle', 'lag', 'lame', 'lament', 'lance', 'land', 'lap', 'lapse', 'lard', 'lark', 'lash', 'lasso', 'last', 'latch', 'lathe', 'lather', 'laud', 'laugh', 'launch', 'laurel', 'lavish', 'law', 'lay', 'layer', 'laze', 'lazy', 'leach', 'lead', 'leaf', 'league', 'leak', 'lean', 'leap', 'learn', 'lease', 'leash', 'leave', 'leaven', 'lecher', 'leech', 'leer', 'leg', 'lend', 'lesion', 'lessen', 'lesson', 'let', 'letter', 'level', 'lever', 'levy', 'libel', 'lichen', 'lick', 'lid', 'lie', 'lift', 'light', 'like', 'liken', 'lilt', 'limb', 'limber', 'lime', 'limit', 'limp', 'line', 'linger', 'link', 'lip', 'liquor', 'lisp', 'list', 'listen', 'litter', 'live', 'liven', 'load', 'loaf', 'loam', 'loan', 'loathe', 'lob', 'lobby', 'local', 'locate', 'lock', 'lodge', 'loft', 'log', 'loiter', 'loll', 'long', 'look', 'loom', 'loop', 'loose', 'loosen', 'loot', 'lop', 'lope', 'lord', 'lose', 'lot', 'loth', 'lounge', 'louse', 'lout', 'love', 'lower', 'luck', 'lug', 'lull', 'lumber', 'lump', 'lunch', 'lunge', 'lurch', 'lure', 'lurk', 'lust', 'lute', 'lynch', 'mace', 'mad', 'madden', 'mail', 'maim', 'major', 'make', 'malign', 'malt', 'man', 'manage', 'mangle', 'mantle', 'manure', 'map', 'mar', 'marble', 'march', 'margin', 'mark', 'market', 'marl', 'maroon', 'marry', 'martyr', 'marvel', 'mash', 'mask', 'mason', 'mass', 'mast', 'master', 'mat', 'match', 'mate', 'matte', 'matter', 'mature', 'maul', 'maze', 'mean', 'medal', 'meddle', 'meet', 'meld', 'mellow', 'melt', 'menace', 'mend', 'mentor', 'merge', 'merit', 'mesh', 'mess', 'metal', 'meter', 'mew', 'mildew', 'milk', 'mill', 'mimic', 'mince', 'mind', 'mine', 'mingle', 'minor', 'mint', 'minute', 'mire', 'mirror', 'miscue', 'misfit', 'mislay', 'miss', 'mist', 'misuse', 'mitre', 'mix', 'moan', 'mob', 'mock', 'model', 'modem', 'modify', 'molest', 'molten', 'monger', 'monkey', 'moon', 'moor', 'moot', 'mop', 'mope', 'morph', 'morsel', 'mortar', 'mosaic', 'moss', 'mother', 'motion', 'motive', 'motor', 'mould', 'mound', 'mount', 'mourn', 'mouse', 'mousse', 'mouth', 'move', 'mow', 'muck', 'mud', 'muddle', 'muddy', 'muff', 'muffle', 'mug', 'mulch', 'mull', 'mumble', 'mummy', 'munch', 'murder', 'murmur', 'muscle', 'muse', 'mush', 'must', 'muster', 'mutate', 'mute', 'mutiny', 'mutter', 'muzzle', 'nag', 'nail', 'name', 'nap', 'narrow', 'near', 'neaten', 'neck', 'need', 'needle', 'negate', 'neigh', 'nerve', 'nest', 'nestle', 'net', 'nettle', 'neuter', 'nibble', 'niche', 'nick', 'nickel', 'niggle', 'nigh', 'nip', 'nod', 'noise', 'noodle', 'noose', 'nose', 'notch', 'note', 'notice', 'notify', 'nudge', 'null', 'numb', 'number', 'nurse', 'nut', 'nuzzle', 'oar', 'obey', 'object', 'oblige', 'obtain', 'occult', 'occupy', 'occur', 'off', 'offend', 'offer', 'ogle', 'oh', 'oil', 'omen', 'omit', 'ooze', 'open', 'opiate', 'oppose', 'opt', 'option', 'orb', 'orbit', 'ordain', 'order', 'orient', 'orphan', 'oust', 'out', 'outbid', 'outdo', 'outfit', 'outlaw', 'outlay', 'output', 'outrun', 'outwit', 'over', 'overdo', 'owe', 'own', 'oyster', 'pace', 'pacify', 'pack', 'packet', 'pad', 'paddle', 'page', 'pain', 'paint', 'pair', 'pal', 'pale', 'pall', 'pallet', 'palm', 'palsy', 'pamper', 'pan', 'pander', 'panel', 'panic', 'pant', 'paper', 'par', 'parade', 'parcel', 'parch', 'pardon', 'pare', 'parent', 'park', 'parley', 'parody', 'parole', 'parrot', 'parry', 'parse', 'part', 'party', 'pass', 'paste', 'pastor', 'pat', 'patch', 'patent', 'patrol', 'patter', 'pause', 'pave', 'paw', 'pawn', 'pay', 'peace', 'peach', 'peak', 'peal', 'pearl', 'pebble', 'peck', 'pedal', 'peddle', 'peek', 'peel', 'peep', 'peer', 'peg', 'pellet', 'pelt', 'pen', 'pencil', 'people', 'pepper', 'perch', 'peril', 'perish', 'perk', 'perm', 'permit', 'peruse', 'pester', 'pestle', 'pet', 'phase', 'phone', 'phrase', 'pi', 'pick', 'picket', 'pickle', 'picnic', 'pie', 'piece', 'pierce', 'piffle', 'pig', 'pike', 'pile', 'pilfer', 'pill', 'pillar', 'pillow', 'pilot', 'pimp', 'pin', 'pinch', 'pine', 'ping', 'pinion', 'pink', 'pip', 'pipe', 'pique', 'pirate', 'pistol', 'pit', 'pitch', 'pith', 'pity', 'pivot', 'place', 'plague', 'plait', 'plan', 'plane', 'plank', 'plant', 'plat', 'plate', 'play', 'plead', 'please', 'pleat', 'pledge', 'plight', 'plod', 'plop', 'plot', 'plough', 'pluck', 'plug', 'plumb', 'plume', 'plump', 'plunge', 'ply', 'poach', 'pocket', 'pod', 'point', 'poise', 'poison', 'poke', 'pole', 'police', 'polish', 'polka', 'poll', 'pollen', 'pomade', 'pond', 'ponder', 'pony', 'pool', 'pop', 'pore', 'port', 'pose', 'posit', 'post', 'pot', 'potter', 'pouch', 'pounce', 'pound', 'pour', 'pout', 'powder', 'power', 'praise', 'prance', 'prank', 'prawn', 'pray', 'preach', 'preen', 'prefab', 'prefix', 'preset', 'press', 'pretty', 'prey', 'price', 'prick', 'pride', 'priest', 'prim', 'prime', 'print', 'prize', 'probe', 'prod', 'profit', 'prompt', 'prong', 'proof', 'prop', 'propel', 'prose', 'prove', 'prowl', 'prune', 'pry', 'pucker', 'puddle', 'puff', 'pug', 'puke', 'pull', 'pulp', 'pulse', 'pumice', 'pummel', 'pump', 'pun', 'punch', 'punish', 'punt', 'pup', 'purge', 'purify', 'purl', 'purple', 'purr', 'purse', 'pursue', 'push', 'put', 'putt', 'putter', 'putty', 'puzzle', 'quack', 'quaff', 'quake', 'quarry', 'quash', 'quaver', 'queen', 'queer', 'quell', 'quench', 'query', 'quest', 'queue', 'quiet', 'quill', 'quilt', 'quip', 'quit', 'quiver', 'quiz', 'quote', 'rabble', 'race', 'rack', 'racket', 'radio', 'raffle', 'raft', 'rag', 'rage', 'raid', 'rail', 'rain', 'raise', 'rake', 'rally', 'ram', 'ramble', 'ramify', 'ramp', 'ramrod', 'ranch', 'range', 'rank', 'rankle', 'ransom', 'rant', 'rap', 'rasp', 'rat', 'rate', 'ratify', 'ration', 'rattle', 'ravage', 'rave', 'ravel', 'raven', 'ravish', 'ray', 'raze', 'reach', 'react', 'read', 'ready', 'really', 'ream', 'reap', 'rear', 'reason', 'rebate', 'rebel', 'rebind', 'rebook', 'rebuff', 'rebuke', 'rebut', 'recall', 'recant', 'recap', 'recast', 'recede', 'recess', 'recite', 'reckon', 'recode', 'recoil', 'record', 'recur', 'redden', 'redeem', 'redial', 'redo', 'redraw', 'reduce', 'reed', 'reef', 'reek', 'reel', 'reeve', 'refer', 'refile', 'refill', 'refine', 'refit', 'reflex', 'reform', 'refuel', 'refuge', 'refund', 'refuse', 'refute', 'regain', 'regale', 'regard', 'regret', 'rehash', 'reheat', 'reify', 'reign', 'reject', 'rejoin', 'relate', 'relax', 'relay', 'relent', 'relink', 'relish', 'relive', 'rely', 'remain', 'remake', 'remand', 'remap', 'remark', 'remedy', 'remind', 'remit', 'remove', 'rename', 'rend', 'render', 'renege', 'renew', 'rent', 'reopen', 'repack', 'repair', 'repast', 'repay', 'repeal', 'repeat', 'repel', 'repent', 'repine', 'replay', 'reply', 'report', 'repose', 'repute', 'reread', 'rerun', 'rescue', 'resell', 'resend', 'resent', 'reset', 'reshow', 'reside', 'resign', 'resin', 'resist', 'resit', 'resort', 'rest', 'result', 'resume', 'retail', 'retain', 'retake', 'retard', 'retch', 'retell', 'retest', 'retire', 'retort', 'retry', 'retune', 'return', 'retype', 'reuse', 'revamp', 'reveal', 'revel', 'revere', 'revert', 'review', 'revile', 'revive', 'revoke', 'revolt', 'reward', 'rewind', 'reword', 'rework', 'rhyme', 'rib', 'ribbon', 'rice', 'rid', 'riddle', 'ride', 'ridge', 'riff', 'rifle', 'rift', 'rig', 'right', 'rim', 'rime', 'ring', 'rinse', 'riot', 'rip', 'ripen', 'ripple', 'rise', 'risk', 'rival', 'rivet', 'roach', 'roam', 'roar', 'roast', 'rob', 'robe', 'rock', 'rocket', 'rogue', 'roll', 'romp', 'roof', 'rook', 'room', 'roost', 'root', 'rope', 'rosin', 'rot', 'rotate', 'rouge', 'rough', 'round', 'rouse', 'rout', 'route', 'rove', 'row', 'rub', 'ruck', 'rue', 'ruff', 'ruffle', 'ruin', 'rule', 'rumble', 'rumple', 'run', 'rush', 'rust', 'rustle', 'rut', 'sack', 'sadden', 'saddle', 'safari', 'sag', 'sail', 'saint', 'sallow', 'salt', 'salute', 'sample', 'sand', 'sandal', 'sap', 'sash', 'sauce', 'sauna', 'savage', 'save', 'saw', 'say', 'scab', 'scald', 'scale', 'scalp', 'scan', 'scant', 'scape', 'scar', 'scare', 'scarf', 'scathe', 'scent', 'scheme', 'school', 'scoff', 'scold', 'scoop', 'scoot', 'scope', 'scorch', 'score', 'scorn', 'scotch', 'scour', 'scout', 'scowl', 'scrap', 'scrape', 'scrawl', 'scream', 'screen', 'screw', 'scribe', 'script', 'scroll', 'scrub', 'scrum', 'scuba', 'scud', 'scuff', 'scull', 'sculpt', 'scum', 'scurry', 'scythe', 'seal', 'seam', 'sear', 'search', 'season', 'seat', 'secede', 'second', 'sector', 'secure', 'sedate', 'seduce', 'see', 'seed', 'seek', 'seem', 'seep', 'seethe', 'seize', 'select', 'sell', 'send', 'sense', 'serge', 'serve', 'set', 'settle', 'sever', 'sew', 'shack', 'shade', 'shadow', 'shaft', 'shag', 'shake', 'sham', 'shame', 'shank', 'shape', 'share', 'shark', 'sharp', 'shave', 'shear', 'shed', 'sheer', 'shell', 'shelve', 'shield', 'shift', 'shin', 'shine', 'ship', 'shirk', 'shiver', 'shoal', 'shock', 'shoe', 'shoo', 'shoot', 'shop', 'short', 'shot', 'shout', 'shove', 'shovel', 'show', 'shower', 'shred', 'shriek', 'shrill', 'shrimp', 'shrine', 'shrink', 'shroud', 'shrug', 'shun', 'shunt', 'shut', 'shy', 'sicken', 'sickly', 'side', 'sidle', 'siege', 'sieve', 'sift', 'sigh', 'sight', 'sign', 'signal', 'signet', 'silk', 'silo', 'silt', 'silver', 'simmer', 'simper', 'simple', 'sin', 'sinew', 'sing', 'single', 'sink', 'sip', 'siphon', 'sire', 'sit', 'site', 'size', 'sizzle', 'skate', 'sketch', 'skew', 'skewer', 'ski', 'skid', 'skim', 'skimp', 'skin', 'skip', 'skirl', 'skirt', 'skulk', 'skunk', 'sky', 'slab', 'slack', 'slag', 'slake', 'slam', 'slang', 'slant', 'slap', 'slash', 'slat', 'slate', 'slave', 'slaver', 'slay', 'sleaze', 'sled', 'sledge', 'sleek', 'sleep', 'sleet', 'sleeve', 'sleigh', 'sleuth', 'slice', 'slick', 'slide', 'slight', 'slim', 'slime', 'sling', 'slink', 'slip', 'slit', 'sliver', 'slog', 'slop', 'slope', 'slosh', 'slot', 'slouch', 'slough', 'slow', 'slug', 'sluice', 'slum', 'slump', 'slur', 'slurp', 'slurry', 'slush', 'smack', 'smart', 'smash', 'smear', 'smell', 'smelt', 'smile', 'smirk', 'smite', 'smock', 'smoke', 'smooth', 'smudge', 'smut', 'snack', 'snag', 'snake', 'snap', 'snare', 'snarl', 'snatch', 'sneak', 'sneer', 'sneeze', 'snick', 'sniff', 'snip', 'snipe', 'snivel', 'snoop', 'snooze', 'snore', 'snort', 'snow', 'snub', 'snuff', 'snug', 'soak', 'soap', 'soar', 'sob', 'sober', 'sock', 'socket', 'sodden', 'soften', 'soil', 'solace', 'solder', 'sole', 'solo', 'solve', 'soot', 'soothe', 'sop', 'sorrow', 'sort', 'sortie', 'sound', 'soup', 'sour', 'source', 'south', 'sow', 'space', 'spade', 'span', 'spank', 'spar', 'spare', 'spark', 'spat', 'spawn', 'speak', 'spear', 'speck', 'speed', 'spell', 'spend', 'spew', 'sphere', 'spice', 'spike', 'spill', 'spin', 'spiral', 'spire', 'spirit', 'spit', 'spite', 'splash', 'splice', 'splint', 'split', 'spoil', 'spoke', 'sponge', 'spoof', 'spool', 'spoon', 'spoor', 'spore', 'sport', 'spot', 'spout', 'sprain', 'sprawl', 'spray', 'spread', 'sprig', 'spring', 'sprint', 'sprout', 'spruce', 'spud', 'spume', 'spur', 'spurn', 'spurt', 'spy', 'squad', 'squall', 'square', 'squash', 'squat', 'squawk', 'squeak', 'squeal', 'squib', 'squint', 'squire', 'squirm', 'squirt', 'stab', 'stable', 'stack', 'staff', 'stag', 'stage', 'stain', 'stake', 'stale', 'stalk', 'stall', 'stamp', 'stand', 'staple', 'star', 'starch', 'stare', 'start', 'starve', 'state', 'stave', 'stay', 'stead', 'steal', 'steam', 'steel', 'steep', 'steer', 'stem', 'step', 'stet', 'stew', 'stick', 'stiff', 'stifle', 'still', 'stilt', 'sting', 'stink', 'stint', 'stir', 'stitch', 'stock', 'stomp', 'stone', 'stooge', 'stool', 'stoop', 'stop', 'store', 'storm', 'story', 'stow', 'strafe', 'strain', 'strand', 'strap', 'stray', 'streak', 'stream', 'stress', 'strew', 'stride', 'strike', 'string', 'strip', 'stripe', 'strive', 'stroke', 'stroll', 'strop', 'strum', 'strut', 'stub', 'stucco', 'stud', 'study', 'stuff', 'stump', 'stun', 'stunt', 'sturdy', 'sty', 'style', 'stymie', 'subdue', 'submit', 'suck', 'sucker', 'suckle', 'suds', 'sue', 'suede', 'suffer', 'suffix', 'sugar', 'suit', 'sulk', 'sully', 'sum', 'summer', 'summit', 'summon', 'sun', 'suntan', 'sup', 'supple', 'supply', 'surf', 'surge', 'survey', 'suture', 'swab', 'swamp', 'swap', 'swarm', 'swat', 'swathe', 'sway', 'swear', 'sweat', 'sweep', 'swell', 'swerve', 'swill', 'swim', 'swing', 'swipe', 'swirl', 'swish', 'switch', 'swivel', 'swoon', 'swoop', 'swop', 'symbol', 'syrup', 'tab', 'tabby', 'table', 'taboo', 'tack', 'tackle', 'tag', 'tail', 'tailor', 'taint', 'take', 'talk', 'tallow', 'tally', 'tame', 'tamp', 'tamper', 'tan', 'tangle', 'tango', 'tank', 'tap', 'tape', 'taper', 'tar', 'target', 'tariff', 'tarry', 'tart', 'task', 'tassel', 'taste', 'tattle', 'tattoo', 'taunt', 'tax', 'taxi', 'teach', 'team', 'tear', 'tease', 'tee', 'teem', 'teeter', 'teethe', 'telex', 'tell', 'temper', 'tempt', 'tenant', 'tend', 'tender', 'tenon', 'tense', 'tent', 'tenure', 'term', 'test', 'tether', 'thank', 'thatch', 'thaw', 'thieve', 'thin', 'think', 'thirst', 'thorn', 'thou', 'thrall', 'thrash', 'thread', 'threat', 'thresh', 'thrill', 'thrive', 'throat', 'throb', 'throne', 'throng', 'throw', 'thrum', 'thrust', 'thud', 'thumb', 'thump', 'thwack', 'thwart', 'tick', 'ticket', 'tickle', 'tide', 'tidy', 'tie', 'tier', 'tile', 'till', 'tiller', 'tilt', 'timber', 'time', 'tin', 'tinge', 'tingle', 'tinker', 'tinkle', 'tinsel', 'tint', 'tip', 'tipple', 'tiptoe', 'tire', 'tissue', 'tithe', 'title', 'titter', 'toady', 'toast', 'toddle', 'toe', 'toggle', 'toil', 'token', 'toll', 'tomb', 'tomcat', 'tone', 'tongue', 'tool', 'toot', 'tooth', 'tootle', 'top', 'topple', 'torch', 'torque', 'toss', 'tot', 'total', 'totter', 'touch', 'tough', 'tour', 'tout', 'tow', 'towel', 'tower', 'toy', 'trace', 'track', 'trade', 'trail', 'train', 'tram', 'tramp', 'trance', 'trap', 'trash', 'travel', 'trawl', 'tread', 'treat', 'treble', 'tree', 'trek', 'trench', 'trend', 'triage', 'trice', 'trick', 'trill', 'trim', 'trip', 'triple', 'troll', 'troop', 'trot', 'troupe', 'trowel', 'truant', 'truck', 'trudge', 'true', 'truss', 'trust', 'try', 'tub', 'tube', 'tuck', 'tucker', 'tuft', 'tug', 'tumble', 'tun', 'tune', 'tunnel', 'turf', 'turn', 'turtle', 'tusk', 'tussle', 'tutor', 'twang', 'tweak', 'tweet', 'twig', 'twill', 'twin', 'twine', 'twinge', 'twirl', 'twist', 'twitch', 'type', 'typify', 'umpire', 'unable', 'unbend', 'unbolt', 'unclog', 'uncoil', 'undo', 'unfit', 'unfold', 'unfurl', 'unhand', 'unify', 'unite', 'unjam', 'unlace', 'unlink', 'unload', 'unlock', 'unmask', 'unpack', 'unpick', 'unplug', 'unroll', 'unseal', 'unseat', 'untie', 'unveil', 'unwind', 'unwrap', 'unzip', 'up', 'update', 'uphold', 'uplift', 'upload', 'uproot', 'upset', 'upturn', 'urge', 'use', 'usher', 'usurp', 'utter', 'vacate', 'vacuum', 'valet', 'value', 'valve', 'vamp', 'vanish', 'vary', 'vat', 'vault', 'vector', 'veer', 'veil', 'vein', 'vend', 'veneer', 'vent', 'verge', 'verify', 'verse', 'vest', 'vet', 'veto', 'vex', 'vial', 'vice', 'video', 'vie', 'view', 'vilify', 'visa', 'vision', 'visit', 'visor', 'voice', 'void', 'volley', 'vomit', 'voodoo', 'vote', 'vouch', 'vow', 'voyage', 'wad', 'waddle', 'wade', 'wafer', 'waffle', 'waft', 'wag', 'wager', 'waggle', 'wagon', 'wail', 'wait', 'waive', 'wake', 'waken', 'walk', 'wall', 'wallow', 'waltz', 'wan', 'wander', 'wane', 'want', 'wanton', 'war', 'warble', 'ward', 'warm', 'warn', 'warp', 'wash', 'waste', 'watch', 'water', 'wattle', 'wave', 'waver', 'wax', 'waylay', 'weaken', 'wean', 'weapon', 'wear', 'weary', 'weasel', 'weave', 'web', 'wed', 'wedge', 'weed', 'weep', 'weigh', 'weight', 'weld', 'well', 'welt', 'welter', 'wench', 'wend', 'wet', 'whack', 'whale', 'wharf', 'wheel', 'wheeze', 'whelp', 'whet', 'whiff', 'while', 'whine', 'whinny', 'whip', 'whir', 'whirl', 'whirr', 'whisk', 'white', 'whiten', 'whizz', 'whoop', 'whoosh', 'wick', 'widen', 'widow', 'wield', 'wig', 'wiggle', 'wild', 'wile', 'will', 'wilt', 'wimple', 'win', 'wince', 'winch', 'wind', 'window', 'wine', 'wing', 'wink', 'winnow', 'winter', 'wipe', 'wire', 'wish', 'wisp', 'wit', 'witch', 'wither', 'wobble', 'wolf', 'wonder', 'wont', 'woo', 'wood', 'word', 'work', 'worm', 'worry', 'worsen', 'worst', 'wound', 'wow', 'wrack', 'wrap', 'wreak', 'wreath', 'wreck', 'wrench', 'wrest', 'wring', 'write', 'writhe', 'wrong', 'x-ray', 'xerox', 'yacht', 'yak', 'yap', 'yard', 'yaw', 'yawn', 'yearn', 'yeast', 'yell', 'yellow', 'yelp', 'yen', 'yes', 'yield', 'yo-yo', 'yodel', 'yoke', 'zero', 'zigzag', 'zinc', 'zip', 'zipper', 'zone', 'zoom'
]
+
export const nouns = [
- 'abacus', 'abbey', 'abroad', 'abuse', 'access', 'acid', 'act', 'action', 'actor', 'ad', 'adult', 'advice', 'affair', 'affect', 'age', 'agency', 'agenda', 'agent', 'aglet', 'aid', 'air', 'airbag', 'airbus', 'alarm', 'alb', 'alcove', 'alder', 'alibi', 'alley', 'alloy', 'almond', 'alpaca', 'alpha', 'alto', 'amount', 'analog', 'anger', 'angle', 'angora', 'animal', 'anime', 'ankle', 'anklet', 'annual', 'anorak', 'answer', 'ant', 'antler', 'ape', 'appeal', 'apple', 'apron', 'apse', 'arch', 'archer', 'area', 'arm', 'armor', 'army', 'arrow', 'art', 'ascot', 'ash', 'ashram', 'aside', 'ask', 'aspect', 'assist', 'atom', 'atrium', 'attack', 'attic', 'aunt', 'author', 'avenue', 'award', 'babe', 'baboon', 'baby', 'back', 'bacon', 'bad', 'badge', 'badger', 'bag', 'bagel', 'bail', 'bait', 'bake', 'baker', 'bakery', 'ball', 'ballet', 'bamboo', 'banana', 'band', 'bangle', 'banjo', 'bank', 'banker', 'baobab', 'bar', 'barber', 'barge', 'barium', 'barn', 'base', 'basin', 'basis', 'basket', 'bass', 'bat', 'bath', 'bather', 'batter', 'battle', 'bay', 'bayou', 'beach', 'bead', 'beak', 'beam', 'bean', 'beanie', 'bear', 'beard', 'beast', 'beat', 'beauty', 'beaver', 'bed', 'bee', 'beech', 'beef', 'beer', 'beet', 'beetle', 'beggar', 'behest', 'being', 'belfry', 'belief', 'bell', 'belly', 'belt', 'bench', 'bend', 'bengal', 'beret', 'berry', 'bet', 'beyond', 'bid', 'bidet', 'big', 'bijou', 'bike', 'bikini', 'bill', 'bin', 'birch', 'bird', 'birth', 'bit', 'bite', 'bitter', 'black', 'blade', 'blame', 'blank', 'blazer', 'blight', 'blind', 'block', 'blood', 'bloom', 'blouse', 'blow', 'blue', 'boar', 'board', 'boat', 'bobcat', 'body', 'bog', 'bolero', 'bolt', 'bomb', 'bomber', 'bone', 'bongo', 'bonnet', 'bonsai', 'bonus', 'book', 'boot', 'bootee', 'bootie', 'boots', 'booty', 'border', 'bore', 'bosom', 'boss', 'botany', 'bother', 'bottle', 'bottom', 'bough', 'bow', 'bower', 'bowl', 'bowler', 'bowtie', 'box', 'boxer', 'boy', 'bra', 'brace', 'brain', 'brake', 'branch', 'brand', 'brandy', 'brass', 'brave', 'bread', 'break', 'breast', 'breath', 'breeze', 'brick', 'bridge', 'brief', 'briefs', 'broad', 'broker', 'brome', 'bronco', 'bronze', 'brooch', 'brood', 'brook', 'broom', 'brow', 'brown', 'brush', 'bubble', 'bucket', 'buckle', 'bud', 'buddy', 'budget', 'buffer', 'buffet', 'bug', 'buggy', 'bugle', 'bulb', 'bull', 'bullet', 'bumper', 'bun', 'bunch', 'burn', 'burst', 'bus', 'bush', 'bust', 'bustle', 'butane', 'butter', 'button', 'buy', 'buyer', 'cabana', 'cabin', 'cable', 'cacao', 'cactus', 'caddy', 'cadet', 'cafe', 'caftan', 'cake', 'calf', 'calico', 'call', 'calm', 'camel', 'cameo', 'camera', 'camp', 'can', 'canal', 'cancel', 'cancer', 'candle', 'candy', 'cane', 'cannon', 'canoe', 'canon', 'canopy', 'canvas', 'cap', 'cape', 'capon', 'car', 'carbon', 'card', 'care', 'career', 'cargo', 'carol', 'carp', 'carpet', 'carrot', 'carry', 'cart', 'case', 'cash', 'casino', 'cast', 'castle', 'cat', 'catch', 'catsup', 'cattle', 'cause', 'cave', 'cd', 'celery', 'cell', 'cellar', 'cello', 'cement', 'census', 'cent', 'center', 'cereal', 'chafe', 'chain', 'chair', 'chaise', 'chalet', 'chalk', 'chance', 'change', 'chaos', 'chap', 'chapel', 'chard', 'charge', 'charm', 'chart', 'check', 'cheek', 'chef', 'cheque', 'cherry', 'chess', 'chest', 'chick', 'chief', 'child', 'chill', 'chime', 'chin', 'chino', 'chip', 'chive', 'choice', 'choker', 'chop', 'chord', 'chrome', 'chub', 'chug', 'church', 'churn', 'cicada', 'cinema', 'circle', 'cirrus', 'city', 'claim', 'clam', 'clank', 'clasp', 'class', 'clause', 'clave', 'cleat', 'clef', 'cleric', 'clerk', 'click', 'client', 'cliff', 'climb', 'clip', 'cloak', 'clock', 'clogs', 'close', 'closet', 'cloth', 'cloud', 'cloudy', 'clove', 'clover', 'club', 'clue', 'clutch', 'coach', 'coal', 'coast', 'coat', 'cob', 'cobweb', 'cocoa', 'cod', 'code', 'codon', 'coffee', 'coffin', 'coil', 'coin', 'coke', 'cold', 'collar', 'colon', 'colony', 'color', 'colt', 'column', 'comb', 'combat', 'comic', 'comma', 'common', 'condor', 'cone', 'conga', 'congo', 'consul', 'cook', 'cookie', 'cope', 'copper', 'copy', 'cord', 'cork', 'corn', 'corner', 'cornet', 'corral', 'cost', 'cot', 'cotton', 'couch', 'cougar', 'cough', 'count', 'county', 'couple', 'course', 'court', 'cousin', 'cover', 'cow', 'cowboy', 'crab', 'crack', 'cradle', 'craft', 'crash', 'crate', 'cravat', 'craw', 'crayon', 'crazy', 'cream', 'creche', 'credit', 'creek', 'crest', 'crew', 'crib', 'crime', 'crocus', 'crook', 'crop', 'cross', 'crotch', 'croup', 'crow', 'crowd', 'crown', 'crude', 'crush', 'cry', 'cub', 'cuckoo', 'cup', 'cupola', 'curio', 'curl', 'curler', 'cursor', 'curve', 'cut', 'cutlet', 'cycle', 'cymbal', 'cynic', 'cyst', 'dad', 'dagger', 'dahlia', 'daisy', 'damage', 'dame', 'dance', 'dancer', 'danger', 'daniel', 'dare', 'dark', 'dart', 'dash', 'data', 'date', 'david', 'day', 'daybed', 'dead', 'deal', 'dealer', 'dear', 'death', 'debate', 'debt', 'debtor', 'decade', 'deck', 'deep', 'deer', 'degree', 'delay', 'delete', 'demand', 'demur', 'den', 'denim', 'depth', 'deputy', 'derby', 'desert', 'design', 'desire', 'desk', 'detail', 'device', 'devil', 'dew', 'dhow', 'diadem', 'dibble', 'dickey', 'diet', 'dig', 'digger', 'dill', 'dime', 'dimple', 'diner', 'dinghy', 'dinner', 'dirndl', 'dirt', 'disco', 'dish', 'dishes', 'disk', 'divan', 'diver', 'divide', 'diving', 'dock', 'doctor', 'doe', 'dog', 'doll', 'dollar', 'dolman', 'domain', 'donkey', 'door', 'dory', 'dot', 'double', 'doubt', 'draft', 'drag', 'dragon', 'drain', 'drake', 'drama', 'draw', 'drawer', 'dream', 'dress', 'drill', 'drink', 'drive', 'driver', 'drop', 'drug', 'drum', 'drunk', 'dry', 'dryer', 'duck', 'dud', 'due', 'duffel', 'dugout', 'dump', 'dust', 'duster', 'duty', 'dwarf', 'dynamo', 'eagle', 'ear', 'earth', 'ease', 'easel', 'east', 'eat', 'eave', 'e-book', 'eddy', 'edge', 'edger', 'editor', 'edward', 'eel', 'effect', 'effort', 'egg', 'eggnog', 'eight', 'elbow', 'elixir', 'elk', 'elm', 'emery', 'employ', 'emu', 'end', 'enemy', 'energy', 'engine', 'enigma', 'entry', 'envy', 'epee', 'epoch', 'eponym', 'epoxy', 'equal', 'era', 'error', 'escape', 'ese', 'essay', 'estate', 'ethics', 'europe', 'event', 'exam', 'excuse', 'exile', 'exit', 'expert', 'extent', 'eye', 'eyelid', 'face', 'facet', 'fact', 'factor', 'fail', 'fairy', 'faith', 'fall', 'fame', 'family', 'fan', 'fang', 'fanny', 'farm', 'farmer', 'fascia', 'fat', 'father', 'faucet', 'fault', 'fawn', 'fax', 'fear', 'feast', 'fedora', 'fee', 'feed', 'feel', 'feet', 'felony', 'female', 'fen', 'fence', 'fender', 'ferry', 'few', 'fiber', 'fibre', 'fiddle', 'field', 'fifth', 'fight', 'figure', 'file', 'fill', 'filly', 'film', 'filth', 'final', 'find', 'fine', 'finger', 'finish', 'fir', 'fire', 'fish', 'fix', 'flag', 'flame', 'flare', 'flash', 'flat', 'flavor', 'flax', 'fleck', 'fleece', 'flesh', 'flight', 'flock', 'flood', 'floor', 'flour', 'flow', 'flower', 'flu', 'fluke', 'flute', 'fly', 'foam', 'fob', 'focus', 'fog', 'fold', 'folder', 'fondue', 'font', 'food', 'foot', 'foray', 'force', 'forest', 'fork', 'form', 'formal', 'format', 'former', 'fort', 'forum', 'fowl', 'fox', 'frame', 'freeze', 'freon', 'fresco', 'fridge', 'friend', 'fringe', 'frock', 'frog', 'front', 'frost', 'frown', 'fruit', 'fuel', 'full', 'fun', 'funny', 'fur', 'futon', 'future', 'gaffer', 'gain', 'gale', 'galley', 'gallon', 'galn', 'game', 'gander', 'gap', 'garage', 'garb', 'garden', 'garlic', 'garter', 'gas', 'gate', 'gather', 'gauge', 'gazebo', 'gear', 'geese', 'gem', 'gender', 'gene', 'george', 'gerbil', 'geyser', 'ghost', 'giant', 'gift', 'girdle', 'girl', 'git', 'give', 'glad', 'gland', 'glass', 'glen', 'glider', 'glove', 'gloves', 'glue', 'glut', 'go', 'goal', 'goat', 'god', 'gold', 'golf', 'gong', 'good', 'goodie', 'goose', 'gopher', 'gossip', 'gown', 'grab', 'grade', 'grain', 'gram', 'grand', 'granny', 'grape', 'graph', 'grass', 'gray', 'grease', 'great', 'greek', 'green', 'grey', 'grief', 'grill', 'grip', 'grit', 'ground', 'group', 'grouse', 'growth', 'guard', 'guess', 'guest', 'guide', 'guilt', 'guilty', 'guitar', 'gum', 'gun', 'gutter', 'guy', 'gym', 'gyro', 'habit', 'hail', 'hair', 'half', 'hall', 'hamaki', 'hammer', 'hand', 'handle', 'hang', 'harbor', 'harm', 'harp', 'hat', 'hatbox', 'hate', 'hatred', 'haunt', 'hawk', 'hay', 'head', 'health', 'heart', 'hearth', 'heat', 'heater', 'heaven', 'heavy', 'hedge', 'heel', 'height', 'helen', 'helium', 'hell', 'hello', 'helmet', 'helo', 'help', 'hemp', 'hen', 'herb', 'heron', 'heyday', 'hide', 'high', 'hill', 'hip', 'hire', 'hit', 'hive', 'hobbit', 'hobby', 'hockey', 'hoe', 'hog', 'hold', 'hole', 'home', 'honey', 'hood', 'hoof', 'hook', 'hope', 'hops', 'horn', 'hornet', 'horror', 'horse', 'hose', 'host', 'hostel', 'hot', 'hotel', 'hour', 'house', 'hovel', 'hub', 'hubcap', 'hugger', 'human', 'humor', 'humour', 'hunger', 'hunt', 'hurry', 'hurt', 'hut', 'hutch', 'hyena', 'ice', 'icicle', 'icon', 'idea', 'ideal', 'if', 'igloo', 'image', 'impact', 'inbox', 'inch', 'income', 'index', 'injury', 'ink', 'inlay', 'inn', 'input', 'insect', 'inside', 'invite', 'iris', 'iron', 'irony', 'island', 'issue', 'it', 'item', 'jackal', 'jacket', 'jaguar', 'jail', 'jam', 'james', 'jar', 'jaw', 'jeans', 'jeep', 'jeff', 'jelly', 'jet', 'jewel', 'jiffy', 'job', 'jockey', 'joey', 'join', 'joint', 'joke', 'jot', 'joy', 'judge', 'judo', 'juice', 'jumbo', 'jump', 'jumper', 'junior', 'junk', 'junker', 'junket', 'jury', 'jute', 'kale', 'karate', 'karen', 'kayak', 'kazoo', 'keep', 'kendo', 'ketch', 'kettle', 'key', 'kick', 'kid', 'kidney', 'kill', 'kilt', 'kimono', 'kind', 'king', 'kiosk', 'kiss', 'kite', 'kitten', 'kitty', 'klomps', 'knee', 'knife', 'knight', 'knot', 'koala', 'lab', 'labour', 'lace', 'lack', 'ladder', 'lady', 'lake', 'lamb', 'lamp', 'lan', 'lanai', 'land', 'lap', 'lapdog', 'laptop', 'larch', 'larder', 'lark', 'latex', 'lathe', 'latte', 'laugh', 'lava', 'law', 'lawn', 'lawyer', 'lay', 'layer', 'lead', 'leader', 'leaf', 'league', 'leaker', 'leash', 'leave', 'leaver', 'leek', 'leg', 'legal', 'legume', 'lei', 'lemon', 'lemur', 'length', 'lentil', 'lesson', 'let', 'letter', 'level', 'lever', 'lie', 'lier', 'life', 'lift', 'light', 'lilac', 'lily', 'limit', 'limo', 'line', 'linen', 'liner', 'link', 'lion', 'lip', 'liquid', 'liquor', 'lisa', 'list', 'listen', 'litter', 'liver', 'living', 'lizard', 'llama', 'load', 'loaf', 'loafer', 'loan', 'local', 'lock', 'locker', 'locket', 'locust', 'loft', 'log', 'loggia', 'logic', 'long', 'look', 'loss', 'lot', 'lotion', 'lounge', 'lout', 'love', 'low', 'luck', 'lumber', 'lunch', 'lung', 'lunge', 'lute', 'lycra', 'lye', 'lynx', 'lyre', 'lyric', 'magic', 'maid', 'maiden', 'mail', 'main', 'major', 'make', 'makeup', 'male', 'mall', 'mallet', 'mambo', 'man', 'maniac', 'manner', 'manor', 'mantel', 'mantle', 'mantua', 'manx', 'many', 'map', 'maple', 'maraca', 'marble', 'mare', 'margin', 'mark', 'market', 'marsh', 'mask', 'mass', 'master', 'mat', 'match', 'mate', 'math', 'matter', 'maybe', 'mayor', 'meal', 'meat', 'media', 'medium', 'meet', 'melody', 'member', 'memory', 'men', 'menu', 'mess', 'metal', 'meteor', 'meter', 'method', 'metro', 'mice', 'middle', 'midi', 'might', 'mile', 'milk', 'mime', 'mimosa', 'mind', 'mine', 'mini', 'minion', 'minor', 'mint', 'minute', 'mirror', 'misfit', 'miss', 'mist', 'mister', 'miter', 'mitten', 'mix', 'mixer', 'moat', 'mobile', 'mocha', 'mode', 'model', 'modem', 'mole', 'mom', 'moment', 'money', 'monger', 'monkey', 'month', 'mood', 'moon', 'mop', 'morsel', 'mosque', 'most', 'motel', 'moth', 'mother', 'motion', 'motor', 'mound', 'mouse', 'mouser', 'mousse', 'mouth', 'mouton', 'move', 'mover', 'movie', 'mower', 'mud', 'mug', 'mukluk', 'mule', 'muscle', 'museum', 'music', 'mutt', 'n', 'nail', 'name', 'naming', 'napkin', 'nasty', 'nation', 'native', 'nature', 'neat', 'neck', 'need', 'needle', 'neon', 'nephew', 'nerve', 'nest', 'net', 'news', 'nexus', 'nicety', 'niche', 'nickel', 'niece', 'night', 'nobody', 'node', 'noise', 'noodle', 'normal', 'norse', 'north', 'nose', 'note', 'notice', 'notify', 'nougat', 'novel', 'nudge', 'number', 'nurse', 'nut', 'nylon', 'oak', 'oar', 'oasis', 'obi', 'object', 'oboe', 'ocean', 'ocelot', 'octave', 'octavo', 'octet', 'oeuvre', 'offer', 'office', 'oil', 'okra', 'oldie', 'olive', 'omega', 'omelet', 'one', 'onion', 'open', 'opera', 'opium', 'option', 'orange', 'orator', 'orchid', 'order', 'organ', 'osprey', 'other', 'others', 'ott', 'otter', 'ounce', 'outfit', 'outlay', 'output', 'outset', 'oval', 'ovary', 'oven', 'owl', 'owner', 'ox', 'oxen', 'oxford', 'oxygen', 'oyster', 'pace', 'pack', 'packet', 'pad', 'paddle', 'page', 'pagoda', 'pail', 'pain', 'paint', 'pair', 'pajama', 'palm', 'pan', 'panda', 'panic', 'pansy', 'pantry', 'pants', 'panty', 'paper', 'parade', 'parcel', 'pard', 'parent', 'park', 'parka', 'parrot', 'part', 'party', 'pass', 'past', 'pasta', 'paste', 'pastor', 'pastry', 'patch', 'path', 'patina', 'patio', 'patrol', 'pause', 'paw', 'pay', 'payee', 'pea', 'peace', 'peach', 'peak', 'peanut', 'pear', 'pearl', 'pedal', 'peen', 'peer', 'pelt', 'pen', 'pencil', 'peony', 'people', 'pepper', 'perch', 'period', 'permit', 'perp', 'person', 'pest', 'pet', 'petal', 'pew', 'pha', 'phase', 'phone', 'photo', 'phrase', 'piano', 'pick', 'pickax', 'picket', 'pickle', 'pie', 'piece', 'pier', 'piety', 'pig', 'pigeon', 'pike', 'pile', 'pillow', 'pilot', 'pimp', 'pimple', 'pin', 'pine', 'ping', 'pink', 'pinkie', 'pint', 'pinto', 'pipe', 'piracy', 'piss', 'pitch', 'pith', 'pizza', 'place', 'plain', 'plan', 'plane', 'planet', 'plant', 'plate', 'play', 'player', 'plenty', 'plier', 'plot', 'plough', 'plover', 'plow', 'plume', 'pocket', 'poem', 'poet', 'poetry', 'point', 'poison', 'pole', 'police', 'policy', 'polish', 'polo', 'pompom', 'poncho', 'pond', 'pony', 'poof', 'pool', 'pop', 'poppy', 'porch', 'port', 'porter', 'post', 'poster', 'pot', 'potato', 'potty', 'pouch', 'pound', 'powder', 'power', 'press', 'price', 'pride', 'priest', 'prince', 'print', 'prior', 'prison', 'prize', 'profit', 'prompt', 'proof', 'prose', 'prow', 'pruner', 'public', 'puddle', 'puffin', 'pull', 'pulley', 'puma', 'pump', 'punch', 'pupa', 'pupil', 'puppy', 'purple', 'purse', 'push', 'pusher', 'put', 'pvc', 'pyjama', 'quail', 'quart', 'quartz', 'queen', 'quiet', 'quill', 'quilt', 'quince', 'quit', 'quiver', 'quote', 'rabbi', 'rabbit', 'race', 'racer', 'racing', 'racism', 'racist', 'rack', 'radar', 'radio', 'radish', 'raffle', 'raft', 'rag', 'rage', 'rail', 'rain', 'raise', 'rake', 'ram', 'ramie', 'ranch', 'random', 'range', 'rank', 'rat', 'rate', 'ratio', 'raven', 'raw', 'ray', 'rayon', 'reach', 'read', 'reamer', 'rear', 'reason', 'recess', 'recipe', 'record', 'red', 'reef', 'refund', 'refuse', 'region', 'regret', 'reject', 'relief', 'relish', 'remote', 'remove', 'rent', 'repair', 'repeat', 'reply', 'report', 'resale', 'resist', 'resort', 'rest', 'result', 'retina', 'return', 'reveal', 'review', 'reward', 'rhyme', 'rhythm', 'rice', 'rich', 'riddle', 'ride', 'rider', 'ridge', 'rifle', 'right', 'rim', 'ring', 'rip', 'ripple', 'rise', 'riser', 'risk', 'river', 'road', 'roast', 'robe', 'robin', 'rock', 'rocker', 'rocket', 'rod', 'role', 'roll', 'roller', 'roof', 'room', 'root', 'rope', 'rose', 'rotate', 'rough', 'round', 'route', 'router', 'row', 'royal', 'rub', 'rubber', 'rubric', 'ruckus', 'ruffle', 'rugby', 'ruin', 'rule', 'rum', 'run', 'runner', 'rush', 'ruth', 'ry', 'sabre', 'sack', 'sad', 'saddle', 'safe', 'safety', 'sage', 'sail', 'sailor', 'salad', 'salary', 'sale', 'salmon', 'salon', 'saloon', 'salt', 'sampan', 'sample', 'sand', 'sari', 'sarong', 'sash', 'satin', 'satire', 'sauce', 'save', 'saving', 'savior', 'saw', 'scale', 'scarf', 'scene', 'scent', 'scheme', 'school', 'score', 'scorn', 'scow', 'screen', 'screw', 'scrim', 'scrip', 'script', 'sea', 'seal', 'search', 'season', 'seat', 'second', 'secret', 'sector', 'secure', 'seed', 'seeder', 'select', 'self', 'sell', 'senior', 'sense', 'sepal', 'series', 'serve', 'server', 'set', 'sewer', 'sex', 'shack', 'shade', 'shadow', 'shake', 'shaker', 'shame', 'shanty', 'shape', 'share', 'shark', 'sharon', 'shawl', 'she', 'shears', 'sheath', 'shed', 'sheep', 'sheet', 'shelf', 'shell', 'sherry', 'shield', 'shift', 'shin', 'shine', 'ship', 'shirt', 'shoat', 'shock', 'shoe', 'shoes', 'shofar', 'shoot', 'shop', 'shore', 'shorts', 'shot', 'shovel', 'show', 'shower', 'shred', 'shrimp', 'shrine', 'sick', 'side', 'siding', 'sign', 'signal', 'signet', 'signup', 'silica', 'silk', 'sill', 'silly', 'silo', 'silver', 'simple', 'sing', 'singer', 'single', 'sink', 'sir', 'sister', 'sitar', 'site', 'size', 'skate', 'skiing', 'skill', 'skin', 'skirt', 'skull', 'skunk', 'sky', 'slash', 'slave', 'sled', 'sledge', 'sleep', 'sleet', 'sleuth', 'slice', 'slide', 'slider', 'slime', 'slip', 'slope', 'sloth', 'smash', 'smell', 'smile', 'smock', 'smog', 'smoke', 'snail', 'snake', 'sneeze', 'snob', 'snorer', 'snow', 'soap', 'soccer', 'sock', 'socks', 'soda', 'sofa', 'soft', 'soil', 'solid', 'son', 'song', 'sonnet', 'soot', 'sorbet', 'sorrow', 'sort', 'sound', 'soup', 'source', 'south', 'sow', 'soy', 'space', 'spade', 'spank', 'spare', 'spark', 'spasm', 'spear', 'speech', 'speed', 'spell', 'spend', 'sphere', 'sphynx', 'spider', 'spike', 'spine', 'spiral', 'spirit', 'spite', 'spleen', 'split', 'sponge', 'spoon', 'sport', 'spot', 'spray', 'spread', 'spring', 'sprout', 'spruce', 'spume', 'spur', 'spy', 'square', 'squash', 'squid', 'stable', 'stack', 'staff', 'stag', 'stage', 'stain', 'stair', 'stamen', 'stamp', 'stance', 'stand', 'star', 'start', 'state', 'status', 'stay', 'steak', 'steal', 'steam', 'steel', 'stem', 'step', 'steps', 'stew', 'stick', 'still', 'stitch', 'stock', 'stole', 'stone', 'stool', 'stop', 'store', 'storey', 'storm', 'story', 'stove', 'strain', 'strait', 'strap', 'straw', 'stream', 'street', 'stress', 'strike', 'string', 'strip', 'stroke', 'stud', 'studio', 'study', 'stuff', 'stupid', 'style', 'stylus', 'suburb', 'subway', 'suck', 'suede', 'sugar', 'suit', 'sultan', 'summer', 'sun', 'sunday', 'supply', 'survey', 'sushi', 'SUV', 'swamp', 'swan', 'swath', 'sweat', 'sweats', 'sweet', 'sweets', 'swell', 'swim', 'swing', 'swiss', 'switch', 'swivel', 'sword', 'synod', 'syrup', 'system', 'tabby', 'table', 'tackle', 'tail', 'tailor', 'tale', 'talk', 'tam', 'tandem', 'tank', 'tanker', 'tap', 'tard', 'target', 'task', 'tassel', 'taste', 'tatami', 'tattoo', 'tavern', 'tax', 'taxi', 'tea', 'teach', 'team', 'tear', 'teen', 'teeth', 'tell', 'teller', 'temp', 'temper', 'temple', 'tempo', 'tennis', 'tenor', 'tent', 'tepee', 'term', 'test', 'text', 'thanks', 'thaw', 'theism', 'theme', 'theory', 'thigh', 'thing', 'thirst', 'thomas', 'thong', 'thongs', 'thorn', 'thread', 'thrill', 'throat', 'throne', 'thrush', 'thumb', 'tiara', 'tic', 'ticket', 'tie', 'tiger', 'tight', 'tights', 'tile', 'till', 'timber', 'time', 'timer', 'tin', 'tinkle', 'tip', 'tire', 'tissue', 'title', 'toad', 'toast', 'today', 'toe', 'toga', 'togs', 'toilet', 'tom', 'tomato', 'ton', 'tone', 'tongue', 'tool', 'toot', 'tooth', 'top', 'topic', 'toque', 'torso', 'tosser', 'total', 'tote', 'touch', 'tough', 'tour', 'towel', 'tower', 'town', 'toy', 'track', 'trade', 'trail', 'train', 'tram', 'tramp', 'trash', 'travel', 'tray', 'treat', 'tree', 'tremor', 'trench', 'trial', 'tribe', 'trick', 'trim', 'trip', 'tripod', 'trout', 'trove', 'trowel', 'truck', 'trunk', 'trust', 'truth', 'try', 'tub', 'tuba', 'tube', 'tulip', 'tummy', 'tuna', 'tune', 'tunic', 'tunnel', 'turban', 'turn', 'turnip', 'turret', 'turtle', 'tussle', 'tutu', 'tuxedo', 'tv', 'twig', 'twine', 'twist', 'two', 'type', 'tyvek', 'uncle', 'union', 'unique', 'unit', 'unity', 'upper', 'urn', 'usage', 'use', 'user', 'usher', 'usual', 'vacuum', 'valley', 'value', 'van', 'vane', 'vanity', 'vase', 'vast', 'vault', 'veal', 'veil', 'vein', 'veldt', 'vellum', 'velvet', 'venom', 'verse', 'verve', 'vessel', 'vest', 'vibe', 'video', 'view', 'villa', 'vinyl', 'viola', 'violet', 'violin', 'virtue', 'virus', 'vise', 'vision', 'visit', 'visor', 'visual', 'vixen', 'voice', 'volume', 'voyage', 'wad', 'wafer', 'waffle', 'waist', 'wait', 'waiter', 'wake', 'walk', 'walker', 'wall', 'wallet', 'walnut', 'walrus', 'wampum', 'war', 'warden', 'warmth', 'wash', 'washer', 'wasp', 'waste', 'watch', 'water', 'wave', 'wax', 'way', 'wealth', 'weapon', 'wear', 'weasel', 'web', 'wedge', 'weed', 'weeder', 'week', 'weight', 'weird', 'well', 'west', 'whale', 'wharf', 'wheat', 'wheel', 'while', 'whip', 'white', 'whole', 'whorl', 'width', 'wife', 'will', 'willow', 'win', 'wind', 'window', 'wine', 'wing', 'winner', 'winter', 'wire', 'wisdom', 'wish', 'witch', 'wolf', 'wombat', 'women', 'wonder', 'wood', 'wool', 'woolen', 'word', 'work', 'worker', 'world', 'worm', 'worry', 'worth', 'worthy', 'wound', 'wrap', 'wren', 'wrench', 'wrist', 'writer', 'wrong', 'yacht', 'yak', 'yam', 'yard', 'yarn', 'yawl', 'year', 'yeast', 'yellow', 'yew', 'yin', 'yoga', 'yogurt', 'yoke', 'you', 'young', 'youth', 'yurt', 'zebra', 'zephyr', 'zinc', 'zipper', 'zither', 'zone', 'zoo'
+'abacus', 'abbey', 'abroad', 'abuse', 'access', 'acid', 'act', 'action', 'actor', 'ad', 'adult', 'advice', 'affair', 'affect', 'age', 'agency', 'agenda', 'agent', 'aglet', 'aid', 'air', 'airbag', 'airbus', 'alarm', 'alb', 'alcove', 'alder', 'alibi', 'alley', 'alloy', 'almond', 'alpaca', 'alpha', 'alto', 'amount', 'analog', 'anger', 'angle', 'angora', 'animal', 'anime', 'ankle', 'anklet', 'annual', 'anorak', 'answer', 'ant', 'antler', 'ape', 'appeal', 'apple', 'apron', 'apse', 'arch', 'archer', 'area', 'arm', 'armor', 'army', 'arrow', 'art', 'ascot', 'ash', 'ashram', 'aside', 'ask', 'aspect', 'assist', 'atom', 'atrium', 'attack', 'attic', 'aunt', 'author', 'avenue', 'award', 'babe', 'baboon', 'baby', 'back', 'bacon', 'bad', 'badge', 'badger', 'bag', 'bagel', 'bail', 'bait', 'bake', 'baker', 'bakery', 'ball', 'ballet', 'bamboo', 'banana', 'band', 'bangle', 'banjo', 'bank', 'banker', 'baobab', 'bar', 'barber', 'barge', 'barium', 'barn', 'base', 'basin', 'basis', 'basket', 'bass', 'bat', 'bath', 'bather', 'batter', 'battle', 'bay', 'bayou', 'beach', 'bead', 'beak', 'beam', 'bean', 'beanie', 'bear', 'beard', 'beast', 'beat', 'beauty', 'beaver', 'bed', 'bee', 'beech', 'beef', 'beer', 'beet', 'beetle', 'beggar', 'behest', 'being', 'belfry', 'belief', 'bell', 'belly', 'belt', 'bench', 'bend', 'bengal', 'beret', 'berry', 'bet', 'beyond', 'bid', 'bidet', 'big', 'bijou', 'bike', 'bikini', 'bill', 'bin', 'birch', 'bird', 'birth', 'bit', 'bite', 'bitter', 'black', 'blade', 'blame', 'blank', 'blazer', 'blight', 'blind', 'block', 'blood', 'bloom', 'blouse', 'blow', 'blue', 'boar', 'board', 'boat', 'bobcat', 'body', 'bog', 'bolero', 'bolt', 'bomb', 'bomber', 'bone', 'bongo', 'bonnet', 'bonsai', 'bonus', 'book', 'boot', 'bootee', 'bootie', 'boots', 'booty', 'border', 'bore', 'bosom', 'boss', 'botany', 'bother', 'bottle', 'bottom', 'bough', 'bow', 'bower', 'bowl', 'bowler', 'bowtie', 'box', 'boxer', 'boy', 'bra', 'brace', 'brain', 'brake', 'branch', 'brand', 'brandy', 'brass', 'brave', 'bread', 'break', 'breast', 'breath', 'breeze', 'brick', 'bridge', 'brief', 'briefs', 'broad', 'broker', 'brome', 'bronco', 'bronze', 'brooch', 'brood', 'brook', 'broom', 'brow', 'brown', 'brush', 'bubble', 'bucket', 'buckle', 'bud', 'buddy', 'budget', 'buffer', 'buffet', 'bug', 'buggy', 'bugle', 'bulb', 'bull', 'bullet', 'bumper', 'bun', 'bunch', 'burn', 'burst', 'bus', 'bush', 'bust', 'bustle', 'butane', 'butter', 'button', 'buy', 'buyer', 'cabana', 'cabin', 'cable', 'cacao', 'cactus', 'caddy', 'cadet', 'cafe', 'caftan', 'cake', 'calf', 'calico', 'call', 'calm', 'camel', 'cameo', 'camera', 'camp', 'can', 'canal', 'cancel', 'cancer', 'candle', 'candy', 'cane', 'cannon', 'canoe', 'canon', 'canopy', 'canvas', 'cap', 'cape', 'capon', 'car', 'carbon', 'card', 'care', 'career', 'cargo', 'carol', 'carp', 'carpet', 'carrot', 'carry', 'cart', 'case', 'cash', 'casino', 'cast', 'castle', 'cat', 'catch', 'catsup', 'cattle', 'cause', 'cave', 'cd', 'celery', 'cell', 'cellar', 'cello', 'cement', 'census', 'cent', 'center', 'cereal', 'chafe', 'chain', 'chair', 'chaise', 'chalet', 'chalk', 'chance', 'change', 'chaos', 'chap', 'chapel', 'chard', 'charge', 'charm', 'chart', 'check', 'cheek', 'chef', 'cheque', 'cherry', 'chess', 'chest', 'chick', 'chief', 'child', 'chill', 'chime', 'chin', 'chino', 'chip', 'chive', 'choice', 'choker', 'chop', 'chord', 'chrome', 'chub', 'chug', 'church', 'churn', 'cicada', 'cinema', 'circle', 'cirrus', 'city', 'claim', 'clam', 'clank', 'clasp', 'class', 'clause', 'clave', 'cleat', 'clef', 'cleric', 'clerk', 'click', 'client', 'cliff', 'climb', 'clip', 'cloak', 'clock', 'clogs', 'close', 'closet', 'cloth', 'cloud', 'cloudy', 'clove', 'clover', 'club', 'clue', 'clutch', 'coach', 'coal', 'coast', 'coat', 'cob', 'cobweb', 'cocoa', 'cod', 'code', 'codon', 'coffee', 'coffin', 'coil', 'coin', 'coke', 'cold', 'collar', 'colon', 'colony', 'color', 'colt', 'column', 'comb', 'combat', 'comic', 'comma', 'common', 'condor', 'cone', 'conga', 'congo', 'consul', 'cook', 'cookie', 'cope', 'copper', 'copy', 'cord', 'cork', 'corn', 'corner', 'cornet', 'corral', 'cost', 'cot', 'cotton', 'couch', 'cougar', 'cough', 'count', 'county', 'couple', 'course', 'court', 'cousin', 'cover', 'cow', 'cowboy', 'crab', 'crack', 'cradle', 'craft', 'crash', 'crate', 'cravat', 'craw', 'crayon', 'crazy', 'cream', 'creche', 'credit', 'creek', 'crest', 'crew', 'crib', 'crime', 'crocus', 'crook', 'crop', 'cross', 'crotch', 'croup', 'crow', 'crowd', 'crown', 'crude', 'crush', 'cry', 'cub', 'cuckoo', 'cup', 'cupola', 'curio', 'curl', 'curler', 'cursor', 'curve', 'cut', 'cutlet', 'cycle', 'cymbal', 'cynic', 'cyst', 'dad', 'dagger', 'dahlia', 'daisy', 'damage', 'dame', 'dance', 'dancer', 'danger', 'daniel', 'dare', 'dark', 'dart', 'dash', 'data', 'date', 'david', 'day', 'daybed', 'dead', 'deal', 'dealer', 'dear', 'death', 'debate', 'debt', 'debtor', 'decade', 'deck', 'deep', 'deer', 'degree', 'delay', 'delete', 'demand', 'demur', 'den', 'denim', 'depth', 'deputy', 'derby', 'desert', 'design', 'desire', 'desk', 'detail', 'device', 'devil', 'dew', 'dhow', 'diadem', 'dibble', 'dickey', 'diet', 'dig', 'digger', 'dill', 'dime', 'dimple', 'diner', 'dinghy', 'dinner', 'dirndl', 'dirt', 'disco', 'dish', 'dishes', 'disk', 'divan', 'diver', 'divide', 'diving', 'dock', 'doctor', 'doe', 'dog', 'doll', 'dollar', 'dolman', 'domain', 'donkey', 'door', 'dory', 'dot', 'double', 'doubt', 'draft', 'drag', 'dragon', 'drain', 'drake', 'drama', 'draw', 'drawer', 'dream', 'dress', 'drill', 'drink', 'drive', 'driver', 'drop', 'drug', 'drum', 'drunk', 'dry', 'dryer', 'duck', 'dud', 'due', 'duffel', 'dugout', 'dump', 'dust', 'duster', 'duty', 'dwarf', 'dynamo', 'eagle', 'ear', 'earth', 'ease', 'easel', 'east', 'eat', 'eave', 'e-book', 'eddy', 'edge', 'edger', 'editor', 'edward', 'eel', 'effect', 'effort', 'egg', 'eggnog', 'eight', 'elbow', 'elixir', 'elk', 'elm', 'emery', 'employ', 'emu', 'end', 'enemy', 'energy', 'engine', 'enigma', 'entry', 'envy', 'epee', 'epoch', 'eponym', 'epoxy', 'equal', 'era', 'error', 'escape', 'ese', 'essay', 'estate', 'ethics', 'europe', 'event', 'exam', 'excuse', 'exile', 'exit', 'expert', 'extent', 'eye', 'eyelid', 'face', 'facet', 'fact', 'factor', 'fail', 'fairy', 'faith', 'fall', 'fame', 'family', 'fan', 'fang', 'fanny', 'farm', 'farmer', 'fascia', 'fat', 'father', 'faucet', 'fault', 'fawn', 'fax', 'fear', 'feast', 'fedora', 'fee', 'feed', 'feel', 'feet', 'felony', 'female', 'fen', 'fence', 'fender', 'ferry', 'few', 'fiber', 'fibre', 'fiddle', 'field', 'fifth', 'fight', 'figure', 'file', 'fill', 'filly', 'film', 'filth', 'final', 'find', 'fine', 'finger', 'finish', 'fir', 'fire', 'fish', 'fix', 'flag', 'flame', 'flare', 'flash', 'flat', 'flavor', 'flax', 'fleck', 'fleece', 'flesh', 'flight', 'flock', 'flood', 'floor', 'flour', 'flow', 'flower', 'flu', 'fluke', 'flute', 'fly', 'foam', 'fob', 'focus', 'fog', 'fold', 'folder', 'fondue', 'font', 'food', 'foot', 'foray', 'force', 'forest', 'fork', 'form', 'formal', 'format', 'former', 'fort', 'forum', 'fowl', 'fox', 'frame', 'freeze', 'freon', 'fresco', 'fridge', 'friend', 'fringe', 'frock', 'frog', 'front', 'frost', 'frown', 'fruit', 'fuel', 'full', 'fun', 'funny', 'fur', 'futon', 'future', 'gaffer', 'gain', 'gale', 'galley', 'gallon', 'galn', 'game', 'gander', 'gap', 'garage', 'garb', 'garden', 'garlic', 'garter', 'gas', 'gate', 'gather', 'gauge', 'gazebo', 'gear', 'geese', 'gem', 'gender', 'gene', 'george', 'gerbil', 'geyser', 'ghost', 'giant', 'gift', 'girdle', 'girl', 'git', 'give', 'glad', 'gland', 'glass', 'glen', 'glider', 'glove', 'gloves', 'glue', 'glut', 'go', 'goal', 'goat', 'god', 'gold', 'golf', 'gong', 'good', 'goodie', 'goose', 'gopher', 'gossip', 'gown', 'grab', 'grade', 'grain', 'gram', 'grand', 'granny', 'grape', 'graph', 'grass', 'gray', 'grease', 'great', 'greek', 'green', 'grey', 'grief', 'grill', 'grip', 'grit', 'ground', 'group', 'grouse', 'growth', 'guard', 'guess', 'guest', 'guide', 'guilt', 'guilty', 'guitar', 'gum', 'gun', 'gutter', 'guy', 'gym', 'gyro', 'habit', 'hail', 'hair', 'half', 'hall', 'hamaki', 'hammer', 'hand', 'handle', 'hang', 'harbor', 'harm', 'harp', 'hat', 'hatbox', 'hate', 'hatred', 'haunt', 'hawk', 'hay', 'head', 'health', 'heart', 'hearth', 'heat', 'heater', 'heaven', 'heavy', 'hedge', 'heel', 'height', 'helen', 'helium', 'hell', 'hello', 'helmet', 'helo', 'help', 'hemp', 'hen', 'herb', 'heron', 'heyday', 'hide', 'high', 'hill', 'hip', 'hire', 'hit', 'hive', 'hobbit', 'hobby', 'hockey', 'hoe', 'hog', 'hold', 'hole', 'home', 'honey', 'hood', 'hoof', 'hook', 'hope', 'hops', 'horn', 'hornet', 'horror', 'horse', 'hose', 'host', 'hostel', 'hot', 'hotel', 'hour', 'house', 'hovel', 'hub', 'hubcap', 'hugger', 'human', 'humor', 'humour', 'hunger', 'hunt', 'hurry', 'hurt', 'hut', 'hutch', 'hyena', 'ice', 'icicle', 'icon', 'idea', 'ideal', 'if', 'igloo', 'image', 'impact', 'inbox', 'inch', 'income', 'index', 'injury', 'ink', 'inlay', 'inn', 'input', 'insect', 'inside', 'invite', 'iris', 'iron', 'irony', 'island', 'issue', 'it', 'item', 'jackal', 'jacket', 'jaguar', 'jail', 'jam', 'james', 'jar', 'jaw', 'jeans', 'jeep', 'jeff', 'jelly', 'jet', 'jewel', 'jiffy', 'job', 'jockey', 'joey', 'join', 'joint', 'joke', 'jot', 'joy', 'judge', 'judo', 'juice', 'jumbo', 'jump', 'jumper', 'junior', 'junk', 'junker', 'junket', 'jury', 'jute', 'kale', 'karate', 'karen', 'kayak', 'kazoo', 'keep', 'kendo', 'ketch', 'kettle', 'key', 'kick', 'kid', 'kidney', 'kill', 'kilt', 'kimono', 'kind', 'king', 'kiosk', 'kiss', 'kite', 'kitten', 'kitty', 'klomps', 'knee', 'knife', 'knight', 'knot', 'koala', 'lab', 'labour', 'lace', 'lack', 'ladder', 'lady', 'lake', 'lamb', 'lamp', 'lan', 'lanai', 'land', 'lap', 'lapdog', 'laptop', 'larch', 'larder', 'lark', 'latex', 'lathe', 'latte', 'laugh', 'lava', 'law', 'lawn', 'lawyer', 'lay', 'layer', 'lead', 'leader', 'leaf', 'league', 'leaker', 'leash', 'leave', 'leaver', 'leek', 'leg', 'legal', 'legume', 'lei', 'lemon', 'lemur', 'length', 'lentil', 'lesson', 'let', 'letter', 'level', 'lever', 'lie', 'lier', 'life', 'lift', 'light', 'lilac', 'lily', 'limit', 'limo', 'line', 'linen', 'liner', 'link', 'lion', 'lip', 'liquid', 'liquor', 'lisa', 'list', 'listen', 'litter', 'liver', 'living', 'lizard', 'llama', 'load', 'loaf', 'loafer', 'loan', 'local', 'lock', 'locker', 'locket', 'locust', 'loft', 'log', 'loggia', 'logic', 'long', 'look', 'loss', 'lot', 'lotion', 'lounge', 'lout', 'love', 'low', 'luck', 'lumber', 'lunch', 'lung', 'lunge', 'lute', 'lycra', 'lye', 'lynx', 'lyre', 'lyric', 'magic', 'maid', 'maiden', 'mail', 'main', 'major', 'make', 'makeup', 'male', 'mall', 'mallet', 'mambo', 'man', 'maniac', 'manner', 'manor', 'mantel', 'mantle', 'mantua', 'manx', 'many', 'map', 'maple', 'maraca', 'marble', 'mare', 'margin', 'mark', 'market', 'marsh', 'mask', 'mass', 'master', 'mat', 'match', 'mate', 'math', 'matter', 'maybe', 'mayor', 'meal', 'meat', 'media', 'medium', 'meet', 'melody', 'member', 'memory', 'men', 'menu', 'mess', 'metal', 'meteor', 'meter', 'method', 'metro', 'mice', 'middle', 'midi', 'might', 'mile', 'milk', 'mime', 'mimosa', 'mind', 'mine', 'mini', 'minion', 'minor', 'mint', 'minute', 'mirror', 'misfit', 'miss', 'mist', 'mister', 'miter', 'mitten', 'mix', 'mixer', 'moat', 'mobile', 'mocha', 'mode', 'model', 'modem', 'mole', 'mom', 'moment', 'money', 'monger', 'monkey', 'month', 'mood', 'moon', 'mop', 'morsel', 'mosque', 'most', 'motel', 'moth', 'mother', 'motion', 'motor', 'mound', 'mouse', 'mouser', 'mousse', 'mouth', 'mouton', 'move', 'mover', 'movie', 'mower', 'mud', 'mug', 'mukluk', 'mule', 'muscle', 'museum', 'music', 'mutt', 'n', 'nail', 'name', 'naming', 'napkin', 'nasty', 'nation', 'native', 'nature', 'neat', 'neck', 'need', 'needle', 'neon', 'nephew', 'nerve', 'nest', 'net', 'news', 'nexus', 'nicety', 'niche', 'nickel', 'niece', 'night', 'nobody', 'node', 'noise', 'noodle', 'normal', 'norse', 'north', 'nose', 'note', 'notice', 'notify', 'nougat', 'novel', 'nudge', 'number', 'nurse', 'nut', 'nylon', 'oak', 'oar', 'oasis', 'obi', 'object', 'oboe', 'ocean', 'ocelot', 'octave', 'octavo', 'octet', 'oeuvre', 'offer', 'office', 'oil', 'okra', 'oldie', 'olive', 'omega', 'omelet', 'one', 'onion', 'open', 'opera', 'opium', 'option', 'orange', 'orator', 'orchid', 'order', 'organ', 'osprey', 'other', 'others', 'ott', 'otter', 'ounce', 'outfit', 'outlay', 'output', 'outset', 'oval', 'ovary', 'oven', 'owl', 'owner', 'ox', 'oxen', 'oxford', 'oxygen', 'oyster', 'pace', 'pack', 'packet', 'pad', 'paddle', 'page', 'pagoda', 'pail', 'pain', 'paint', 'pair', 'pajama', 'palm', 'pan', 'panda', 'panic', 'pansy', 'pantry', 'pants', 'panty', 'paper', 'parade', 'parcel', 'pard', 'parent', 'park', 'parka', 'parrot', 'part', 'party', 'pass', 'past', 'pasta', 'paste', 'pastor', 'pastry', 'patch', 'path', 'patina', 'patio', 'patrol', 'pause', 'paw', 'pay', 'payee', 'pea', 'peace', 'peach', 'peak', 'peanut', 'pear', 'pearl', 'pedal', 'peen', 'peer', 'pelt', 'pen', 'pencil', 'peony', 'people', 'pepper', 'perch', 'period', 'permit', 'perp', 'person', 'pest', 'pet', 'petal', 'pew', 'pha', 'phase', 'phone', 'photo', 'phrase', 'piano', 'pick', 'pickax', 'picket', 'pickle', 'pie', 'piece', 'pier', 'piety', 'pig', 'pigeon', 'pike', 'pile', 'pillow', 'pilot', 'pimp', 'pimple', 'pin', 'pine', 'ping', 'pink', 'pinkie', 'pint', 'pinto', 'pipe', 'piracy', 'piss', 'pitch', 'pith', 'pizza', 'place', 'plain', 'plan', 'plane', 'planet', 'plant', 'plate', 'play', 'player', 'plenty', 'plier', 'plot', 'plough', 'plover', 'plow', 'plume', 'pocket', 'poem', 'poet', 'poetry', 'point', 'poison', 'pole', 'police', 'policy', 'polish', 'polo', 'pompom', 'poncho', 'pond', 'pony', 'poof', 'pool', 'pop', 'poppy', 'porch', 'port', 'porter', 'post', 'poster', 'pot', 'potato', 'potty', 'pouch', 'pound', 'powder', 'power', 'press', 'price', 'pride', 'priest', 'prince', 'print', 'prior', 'prison', 'prize', 'profit', 'prompt', 'proof', 'prose', 'prow', 'pruner', 'public', 'puddle', 'puffin', 'pull', 'pulley', 'puma', 'pump', 'punch', 'pupa', 'pupil', 'puppy', 'purple', 'purse', 'push', 'pusher', 'put', 'pvc', 'pyjama', 'quail', 'quart', 'quartz', 'queen', 'quiet', 'quill', 'quilt', 'quince', 'quit', 'quiver', 'quote', 'rabbi', 'rabbit', 'race', 'racer', 'racing', 'racism', 'racist', 'rack', 'radar', 'radio', 'radish', 'raffle', 'raft', 'rag', 'rage', 'rail', 'rain', 'raise', 'rake', 'ram', 'ramie', 'ranch', 'random', 'range', 'rank', 'rat', 'rate', 'ratio', 'raven', 'raw', 'ray', 'rayon', 'reach', 'read', 'reamer', 'rear', 'reason', 'recess', 'recipe', 'record', 'red', 'reef', 'refund', 'refuse', 'region', 'regret', 'reject', 'relief', 'relish', 'remote', 'remove', 'rent', 'repair', 'repeat', 'reply', 'report', 'resale', 'resist', 'resort', 'rest', 'result', 'retina', 'return', 'reveal', 'review', 'reward', 'rhyme', 'rhythm', 'rice', 'rich', 'riddle', 'ride', 'rider', 'ridge', 'rifle', 'right', 'rim', 'ring', 'rip', 'ripple', 'rise', 'riser', 'risk', 'river', 'road', 'roast', 'robe', 'robin', 'rock', 'rocker', 'rocket', 'rod', 'role', 'roll', 'roller', 'roof', 'room', 'root', 'rope', 'rose', 'rotate', 'rough', 'round', 'route', 'router', 'row', 'royal', 'rub', 'rubber', 'rubric', 'ruckus', 'ruffle', 'rugby', 'ruin', 'rule', 'rum', 'run', 'runner', 'rush', 'ruth', 'ry', 'sabre', 'sack', 'sad', 'saddle', 'safe', 'safety', 'sage', 'sail', 'sailor', 'salad', 'salary', 'sale', 'salmon', 'salon', 'saloon', 'salt', 'sampan', 'sample', 'sand', 'sari', 'sarong', 'sash', 'satin', 'satire', 'sauce', 'save', 'saving', 'savior', 'saw', 'scale', 'scarf', 'scene', 'scent', 'scheme', 'school', 'score', 'scorn', 'scow', 'screen', 'screw', 'scrim', 'scrip', 'script', 'sea', 'seal', 'search', 'season', 'seat', 'second', 'secret', 'sector', 'secure', 'seed', 'seeder', 'select', 'self', 'sell', 'senior', 'sense', 'sepal', 'series', 'serve', 'server', 'set', 'sewer', 'sex', 'shack', 'shade', 'shadow', 'shake', 'shaker', 'shame', 'shanty', 'shape', 'share', 'shark', 'sharon', 'shawl', 'she', 'shears', 'sheath', 'shed', 'sheep', 'sheet', 'shelf', 'shell', 'sherry', 'shield', 'shift', 'shin', 'shine', 'ship', 'shirt', 'shoat', 'shock', 'shoe', 'shoes', 'shofar', 'shoot', 'shop', 'shore', 'shorts', 'shot', 'shovel', 'show', 'shower', 'shred', 'shrimp', 'shrine', 'sick', 'side', 'siding', 'sign', 'signal', 'signet', 'signup', 'silica', 'silk', 'sill', 'silly', 'silo', 'silver', 'simple', 'sing', 'singer', 'single', 'sink', 'sir', 'sister', 'sitar', 'site', 'size', 'skate', 'skiing', 'skill', 'skin', 'skirt', 'skull', 'skunk', 'sky', 'slash', 'slave', 'sled', 'sledge', 'sleep', 'sleet', 'sleuth', 'slice', 'slide', 'slider', 'slime', 'slip', 'slope', 'sloth', 'smash', 'smell', 'smile', 'smock', 'smog', 'smoke', 'snail', 'snake', 'sneeze', 'snob', 'snorer', 'snow', 'soap', 'soccer', 'sock', 'socks', 'soda', 'sofa', 'soft', 'soil', 'solid', 'son', 'song', 'sonnet', 'soot', 'sorbet', 'sorrow', 'sort', 'sound', 'soup', 'source', 'south', 'sow', 'soy', 'space', 'spade', 'spank', 'spare', 'spark', 'spasm', 'spear', 'speech', 'speed', 'spell', 'spend', 'sphere', 'sphynx', 'spider', 'spike', 'spine', 'spiral', 'spirit', 'spite', 'spleen', 'split', 'sponge', 'spoon', 'sport', 'spot', 'spray', 'spread', 'spring', 'sprout', 'spruce', 'spume', 'spur', 'spy', 'square', 'squash', 'squid', 'stable', 'stack', 'staff', 'stag', 'stage', 'stain', 'stair', 'stamen', 'stamp', 'stance', 'stand', 'star', 'start', 'state', 'status', 'stay', 'steak', 'steal', 'steam', 'steel', 'stem', 'step', 'steps', 'stew', 'stick', 'still', 'stitch', 'stock', 'stole', 'stone', 'stool', 'stop', 'store', 'storey', 'storm', 'story', 'stove', 'strain', 'strait', 'strap', 'straw', 'stream', 'street', 'stress', 'strike', 'string', 'strip', 'stroke', 'stud', 'studio', 'study', 'stuff', 'stupid', 'style', 'stylus', 'suburb', 'subway', 'suck', 'suede', 'sugar', 'suit', 'sultan', 'summer', 'sun', 'sunday', 'supply', 'survey', 'sushi', 'SUV', 'swamp', 'swan', 'swath', 'sweat', 'sweats', 'sweet', 'sweets', 'swell', 'swim', 'swing', 'swiss', 'switch', 'swivel', 'sword', 'synod', 'syrup', 'system', 'tabby', 'table', 'tackle', 'tail', 'tailor', 'tale', 'talk', 'tam', 'tandem', 'tank', 'tanker', 'tap', 'tard', 'target', 'task', 'tassel', 'taste', 'tatami', 'tattoo', 'tavern', 'tax', 'taxi', 'tea', 'teach', 'team', 'tear', 'teen', 'teeth', 'tell', 'teller', 'temp', 'temper', 'temple', 'tempo', 'tennis', 'tenor', 'tent', 'tepee', 'term', 'test', 'text', 'thanks', 'thaw', 'theism', 'theme', 'theory', 'thigh', 'thing', 'thirst', 'thomas', 'thong', 'thongs', 'thorn', 'thread', 'thrill', 'throat', 'throne', 'thrush', 'thumb', 'tiara', 'tic', 'ticket', 'tie', 'tiger', 'tight', 'tights', 'tile', 'till', 'timber', 'time', 'timer', 'tin', 'tinkle', 'tip', 'tire', 'tissue', 'title', 'toad', 'toast', 'today', 'toe', 'toga', 'togs', 'toilet', 'tom', 'tomato', 'ton', 'tone', 'tongue', 'tool', 'toot', 'tooth', 'top', 'topic', 'toque', 'torso', 'tosser', 'total', 'tote', 'touch', 'tough', 'tour', 'towel', 'tower', 'town', 'toy', 'track', 'trade', 'trail', 'train', 'tram', 'tramp', 'trash', 'travel', 'tray', 'treat', 'tree', 'tremor', 'trench', 'trial', 'tribe', 'trick', 'trim', 'trip', 'tripod', 'trout', 'trove', 'trowel', 'truck', 'trunk', 'trust', 'truth', 'try', 'tub', 'tuba', 'tube', 'tulip', 'tummy', 'tuna', 'tune', 'tunic', 'tunnel', 'turban', 'turn', 'turnip', 'turret', 'turtle', 'tussle', 'tutu', 'tuxedo', 'tv', 'twig', 'twine', 'twist', 'two', 'type', 'tyvek', 'uncle', 'union', 'unique', 'unit', 'unity', 'upper', 'urn', 'usage', 'use', 'user', 'usher', 'usual', 'vacuum', 'valley', 'value', 'van', 'vane', 'vanity', 'vase', 'vast', 'vault', 'veal', 'veil', 'vein', 'veldt', 'vellum', 'velvet', 'venom', 'verse', 'verve', 'vessel', 'vest', 'vibe', 'video', 'view', 'villa', 'vinyl', 'viola', 'violet', 'violin', 'virtue', 'virus', 'vise', 'vision', 'visit', 'visor', 'visual', 'vixen', 'voice', 'volume', 'voyage', 'wad', 'wafer', 'waffle', 'waist', 'wait', 'waiter', 'wake', 'walk', 'walker', 'wall', 'wallet', 'walnut', 'walrus', 'wampum', 'war', 'warden', 'warmth', 'wash', 'washer', 'wasp', 'waste', 'watch', 'water', 'wave', 'wax', 'way', 'wealth', 'weapon', 'wear', 'weasel', 'web', 'wedge', 'weed', 'weeder', 'week', 'weight', 'weird', 'well', 'west', 'whale', 'wharf', 'wheat', 'wheel', 'while', 'whip', 'white', 'whole', 'whorl', 'width', 'wife', 'will', 'willow', 'win', 'wind', 'window', 'wine', 'wing', 'winner', 'winter', 'wire', 'wisdom', 'wish', 'witch', 'wolf', 'wombat', 'women', 'wonder', 'wood', 'wool', 'woolen', 'word', 'work', 'worker', 'world', 'worm', 'worry', 'worth', 'worthy', 'wound', 'wrap', 'wren', 'wrench', 'wrist', 'writer', 'wrong', 'yacht', 'yak', 'yam', 'yard', 'yarn', 'yawl', 'year', 'yeast', 'yellow', 'yew', 'yin', 'yoga', 'yogurt', 'yoke', 'you', 'young', 'youth', 'yurt', 'zebra', 'zephyr', 'zinc', 'zipper', 'zither', 'zone', 'zoo'
]
+
export const adverbs = [
- 'ably', 'acidly', 'airily', 'ally', 'amply', 'apply', 'aptly', 'archly', 'avidly', 'badly', 'baldly', 'barely', 'basely', 'belly', 'bodily', 'boldly', 'bubbly', 'bully', 'burly', 'busily', 'calmly', 'chilly', 'coldly', 'comely', 'comply', 'coolly', 'cosily', 'costly', 'coyly', 'cuddly', 'curly', 'curtly', 'daily', 'dally', 'damply', 'darkly', 'deadly', 'dearly', 'deeply', 'deftly', 'dimly', 'direly', 'doily', 'dolly', 'doubly', 'dourly', 'drily', 'dryly', 'dually', 'dully', 'duly', 'dumbly', 'early', 'easily', 'edgily', 'eerily', 'evenly', 'evilly', 'fairly', 'family', 'feebly', 'fiddly', 'filly', 'finely', 'firmly', 'fitly', 'flatly', 'fly', 'folly', 'fondly', 'foully', 'freely', 'frilly', 'fully', 'gadfly', 'gaily', 'gamely', 'gangly', 'gently', 'giggly', 'gladly', 'glibly', 'glumly', 'godly', 'golly', 'goodly', 'googly', 'grimly', 'grisly', 'gully', 'hardly', 'hazily', 'highly', 'hilly', 'holly', 'holy', 'homely', 'homily', 'hotly', 'hourly', 'hugely', 'humbly', 'icily', 'idly', 'imply', 'jangly', 'jelly', 'jokily', 'jolly', 'justly', 'keenly', 'kindly', 'kingly', 'lamely', 'lastly', 'lately', 'lazily', 'likely', 'lily', 'limply', 'lively', 'lolly', 'lonely', 'lordly', 'loudly', 'lovely', 'lowly', 'madly', 'mainly', 'manly', 'mayfly', 'mealy', 'meanly', 'measly', 'meekly', 'merely', 'mildly', 'mostly', 'mutely', 'namely', 'nearly', 'neatly', 'newly', 'nicely', 'nimbly', 'nobly', 'nosily', 'numbly', 'oddly', 'oily', 'only', 'openly', 'orally', 'overly', 'palely', 'partly', 'pearly', 'pebbly', 'pertly', 'pimply', 'ply', 'poorly', 'portly', 'primly', 'purely', 'rally', 'rarely', 'rashly', 'really', 'rely', 'reply', 'richly', 'ripely', 'rosily', 'rudely', 'sadly', 'safely', 'sagely', 'sally', 'sanely', 'scaly', 'seemly', 'shyly', 'sickly', 'silly', 'simply', 'singly', 'slily', 'slowly', 'sly', 'slyly', 'smelly', 'smugly', 'snugly', 'softly', 'solely', 'sorely', 'sourly', 'stably', 'steely', 'subtly', 'sully', 'supply', 'surely', 'surly', 'tally', 'tamely', 'tartly', 'tautly', 'termly', 'thinly', 'tidily', 'timely', 'tingly', 'tinkly', 'triply', 'truly', 'ugly', 'unduly', 'unholy', 'unruly', 'vainly', 'vastly', 'viably', 'vilely', 'waggly', 'wanly', 'warily', 'warmly', 'wavily', 'weakly', 'weekly', 'wetly', 'wholly', 'widely', 'wifely', 'wildly', 'wily', 'wisely', 'wobbly', 'woolly', 'wryly', 'yearly'
+'ably', 'acidly', 'airily', 'ally', 'amply', 'apply', 'aptly', 'archly', 'avidly', 'badly', 'baldly', 'barely', 'basely', 'belly', 'bodily', 'boldly', 'bubbly', 'bully', 'burly', 'busily', 'calmly', 'chilly', 'coldly', 'comely', 'comply', 'coolly', 'cosily', 'costly', 'coyly', 'cuddly', 'curly', 'curtly', 'daily', 'dally', 'damply', 'darkly', 'deadly', 'dearly', 'deeply', 'deftly', 'dimly', 'direly', 'doily', 'dolly', 'doubly', 'dourly', 'drily', 'dryly', 'dually', 'dully', 'duly', 'dumbly', 'early', 'easily', 'edgily', 'eerily', 'evenly', 'evilly', 'fairly', 'family', 'feebly', 'fiddly', 'filly', 'finely', 'firmly', 'fitly', 'flatly', 'fly', 'folly', 'fondly', 'foully', 'freely', 'frilly', 'fully', 'gadfly', 'gaily', 'gamely', 'gangly', 'gently', 'giggly', 'gladly', 'glibly', 'glumly', 'godly', 'golly', 'goodly', 'googly', 'grimly', 'grisly', 'gully', 'hardly', 'hazily', 'highly', 'hilly', 'holly', 'holy', 'homely', 'homily', 'hotly', 'hourly', 'hugely', 'humbly', 'icily', 'idly', 'imply', 'jangly', 'jelly', 'jokily', 'jolly', 'justly', 'keenly', 'kindly', 'kingly', 'lamely', 'lastly', 'lately', 'lazily', 'likely', 'lily', 'limply', 'lively', 'lolly', 'lonely', 'lordly', 'loudly', 'lovely', 'lowly', 'madly', 'mainly', 'manly', 'mayfly', 'mealy', 'meanly', 'measly', 'meekly', 'merely', 'mildly', 'mostly', 'mutely', 'namely', 'nearly', 'neatly', 'newly', 'nicely', 'nimbly', 'nobly', 'nosily', 'numbly', 'oddly', 'oily', 'only', 'openly', 'orally', 'overly', 'palely', 'partly', 'pearly', 'pebbly', 'pertly', 'pimply', 'ply', 'poorly', 'portly', 'primly', 'purely', 'rally', 'rarely', 'rashly', 'really', 'rely', 'reply', 'richly', 'ripely', 'rosily', 'rudely', 'sadly', 'safely', 'sagely', 'sally', 'sanely', 'scaly', 'seemly', 'shyly', 'sickly', 'silly', 'simply', 'singly', 'slily', 'slowly', 'sly', 'slyly', 'smelly', 'smugly', 'snugly', 'softly', 'solely', 'sorely', 'sourly', 'stably', 'steely', 'subtly', 'sully', 'supply', 'surely', 'surly', 'tally', 'tamely', 'tartly', 'tautly', 'termly', 'thinly', 'tidily', 'timely', 'tingly', 'tinkly', 'triply', 'truly', 'ugly', 'unduly', 'unholy', 'unruly', 'vainly', 'vastly', 'viably', 'vilely', 'waggly', 'wanly', 'warily', 'warmly', 'wavily', 'weakly', 'weekly', 'wetly', 'wholly', 'widely', 'wifely', 'wildly', 'wily', 'wisely', 'wobbly', 'woolly', 'wryly', 'yearly'
]
+
export const interjections = [
- 'aha', 'ahem', 'ahh', 'ahoy', 'alas', 'arg', 'aw', 'bam', 'bingo', 'blah', 'boo', 'bravo', 'brrr', 'cheers', 'dang', 'drat', 'darn', 'duh', 'eek', 'eh', 'encore', 'eureka', 'gee', 'golly', 'gosh', 'haha', 'hello', 'hey', 'hmm', 'huh', 'humph', 'hurray', 'oh', 'oh my', 'oops', 'ouch', 'ow', 'phew', 'phooey', 'pooh', 'pow', 'rats', 'shh', 'shoo', 'thanks', 'there', 'uh-huh', 'uh-oh', 'ugh', 'wahoo', 'well', 'whoa', 'whoops', 'wow', 'yeah', 'yes', 'yikes', 'yippee', 'yo', 'yuck'
+'aha', 'ahem', 'ahh', 'ahoy', 'alas', 'arg', 'aw', 'bam', 'bingo', 'blah', 'boo', 'bravo', 'brrr', 'cheers', 'dang', 'drat', 'darn', 'duh', 'eek', 'eh', 'encore', 'eureka', 'gee', 'golly', 'gosh', 'haha', 'hello', 'hey', 'hmm', 'huh', 'humph', 'hurray', 'oh', 'oh my', 'oops', 'ouch', 'ow', 'phew', 'phooey', 'pooh', 'pow', 'rats', 'shh', 'shoo', 'thanks', 'there', 'uh-huh', 'uh-oh', 'ugh', 'wahoo', 'well', 'whoa', 'whoops', 'wow', 'yeah', 'yes', 'yikes', 'yippee', 'yo', 'yuck'
]
+
export const adjectives = [
- 'abject', 'abrupt', 'absent', 'absurd', 'active', 'acute', 'adept', 'adroit', 'aerial', 'agile', 'airy', 'alert', 'aloof', 'amoral', 'amused', 'angry', 'apt', 'arch', 'ardent', 'artful', 'august', 'aural', 'avowed', 'awful', 'bad', 'banal', 'basic', 'bawdy', 'benign', 'bitter', 'bland', 'blank', 'bleak', 'blind', 'blithe', 'blunt', 'boyish', 'brave', 'breezy', 'brief', 'bright', 'broad', 'broken', 'busy', 'cagy', 'cm', 'candid', 'canny', 'carnal', 'casual', 'catty', 'caudal', 'chaste', 'cheeky', 'clear', 'clever', 'clinic', 'clumsy', 'coarse', 'cocky', 'cogent', 'cold', 'conic', 'coward', 'coy', 'cozy', 'crass', 'craven', 'crazy', 'creepy', 'crude', 'curt', 'cute', 'cynic', 'dainty', 'dark', 'dazed', 'dear', 'decent', 'deep', 'deft', 'demure', 'dense', 'dim', 'dire', 'dismal', 'dizzy', 'dogged', 'droll', 'dry', 'dull', 'eager', 'easy', 'eerie', 'equal', 'erect', 'erotic', 'ethic', 'even', 'evil', 'exact', 'exotic', 'faint', 'false', 'famous', 'fatal', 'faulty', 'feeble', 'firm', 'fishy', 'fixed', 'flabby', 'flashy', 'flat', 'fleet', 'flimsy', 'floppy', 'fluent', 'fluid', 'fond', 'foul', 'frail', 'frank', 'free', 'fresh', 'frisky', 'frugal', 'funny', 'fussy', 'futile', 'fuzzy', 'game', 'garish', 'gauche', 'gaudy', 'gawky', 'genial', 'gent', 'glad', 'glib', 'glum', 'grand', 'grave', 'great', 'greedy', 'grimy', 'groggy', 'gross', 'guilty', 'happy', 'hardy', 'harsh', 'hasty', 'hazy', 'heated', 'hectic', 'heroic', 'hoarse', 'honest', 'hot', 'huge', 'humane', 'humble', 'hungry', 'husky', 'icy', 'inept', 'insane', 'ireful', 'ironic', 'jaded', 'jaunty', 'jerky', 'jocose', 'joking', 'jolly', 'jovial', 'joyful', 'juicy', 'just', 'keen', 'lame', 'lavish', 'lax', 'lazy', 'lewd', 'light', 'limp', 'livid', 'logic', 'loose', 'loud', 'loving', 'loyal', 'lubber', 'lucid', 'lucky', 'lurid', 'lusty', 'mad', 'magic', 'manful', 'marked', 'mature', 'meager', 'mean', 'meek', 'menial', 'merry', 'messy', 'metric', 'mighty', 'mild', 'minute', 'miser', 'modest', 'moist', 'moody', 'moral', 'morbid', 'murky', 'music', 'mute', 'naive', 'naked', 'narrow', 'nasty', 'neat', 'nice', 'nimble', 'noble', 'noisy', 'normal', 'nosy', 'numb', 'oafish', 'opaque', 'pert', 'pesky', 'physic', 'pious', 'pithy', 'placid', 'plain', 'poetic', 'polite', 'poor', 'prim', 'prissy', 'proper', 'proud', 'public', 'pure', 'quaint', 'queer', 'quick', 'quiet', 'rabid', 'racy', 'raging', 'rakish', 'random', 'rank', 'rapid', 'rapt', 'rare', 'rash', 'raving', 'ready', 'regal', 'remote', 'rich', 'right', 'rigid', 'ripe', 'ritual', 'robust', 'rosy', 'rough', 'royal', 'rude', 'rueful', 'rugged', 'sad', 'safe', 'sane', 'saucy', 'savage', 'scant', 'secret', 'secure', 'sedate', 'serene', 'severe', 'sexy', 'sexual', 'shaky', 'sharp', 'shoddy', 'showy', 'shrewd', 'shy', 'silent', 'simple', 'skimpy', 'slack', 'sleazy', 'sleek', 'slick', 'slight', 'slow', 'smart', 'smooth', 'smug', 'snooty', 'snug', 'sober', 'soft', 'soggy', 'solemn', 'somber', 'sordid', 'sore', 'sound', 'sour', 'spry', 'square', 'staid', 'stark', 'static', 'steady', 'stern', 'stiff', 'stingy', 'stoic', 'stolid', 'stormy', 'stout', 'strict', 'strong', 'stuffy', 'stupid', 'suave', 'subtle', 'sudden', 'sudden', 'sulky', 'sullen', 'superb', 'supp', 'sure', 'swanky', 'swift', 'tacit', 'tacky', 'tame', 'tardy', 'tart', 'taut', 'tense', 'tepid', 'terse', 'testy', 'thick', 'thin', 'tidy', 'tight', 'timid', 'tonal', 'tough', 'tragic', 'trim', 'trite', 'true', 'trying', 'turgid', 'uneasy', 'unique', 'unkind', 'unsafe', 'urgent', 'useful', 'vague', 'vain', 'vexed', 'visual', 'vital', 'vivid', 'vocal', 'vulgar', 'wan', 'wanton', 'warm', 'weak', 'weird', 'wicked', 'wide', 'wild', 'wise', 'witty', 'woeful', 'wrong', 'wry'
+'abject', 'abrupt', 'absent', 'absurd', 'active', 'acute', 'adept', 'adroit', 'aerial', 'agile', 'airy', 'alert', 'aloof', 'amoral', 'amused', 'angry', 'apt', 'arch', 'ardent', 'artful', 'august', 'aural', 'avowed', 'awful', 'bad', 'banal', 'basic', 'bawdy', 'benign', 'bitter', 'bland', 'blank', 'bleak', 'blind', 'blithe', 'blunt', 'boyish', 'brave', 'breezy', 'brief', 'bright', 'broad', 'broken', 'busy', 'cagy', 'cm', 'candid', 'canny', 'carnal', 'casual', 'catty', 'caudal', 'chaste', 'cheeky', 'clear', 'clever', 'clinic', 'clumsy', 'coarse', 'cocky', 'cogent', 'cold', 'conic', 'coward', 'coy', 'cozy', 'crass', 'craven', 'crazy', 'creepy', 'crude', 'curt', 'cute', 'cynic', 'dainty', 'dark', 'dazed', 'dear', 'decent', 'deep', 'deft', 'demure', 'dense', 'dim', 'dire', 'dismal', 'dizzy', 'dogged', 'droll', 'dry', 'dull', 'eager', 'easy', 'eerie', 'equal', 'erect', 'erotic', 'ethic', 'even', 'evil', 'exact', 'exotic', 'faint', 'false', 'famous', 'fatal', 'faulty', 'feeble', 'firm', 'fishy', 'fixed', 'flabby', 'flashy', 'flat', 'fleet', 'flimsy', 'floppy', 'fluent', 'fluid', 'fond', 'foul', 'frail', 'frank', 'free', 'fresh', 'frisky', 'frugal', 'funny', 'fussy', 'futile', 'fuzzy', 'game', 'garish', 'gauche', 'gaudy', 'gawky', 'genial', 'gent', 'glad', 'glib', 'glum', 'grand', 'grave', 'great', 'greedy', 'grimy', 'groggy', 'gross', 'guilty', 'happy', 'hardy', 'harsh', 'hasty', 'hazy', 'heated', 'hectic', 'heroic', 'hoarse', 'honest', 'hot', 'huge', 'humane', 'humble', 'hungry', 'husky', 'icy', 'inept', 'insane', 'ireful', 'ironic', 'jaded', 'jaunty', 'jerky', 'jocose', 'joking', 'jolly', 'jovial', 'joyful', 'juicy', 'just', 'keen', 'lame', 'lavish', 'lax', 'lazy', 'lewd', 'light', 'limp', 'livid', 'logic', 'loose', 'loud', 'loving', 'loyal', 'lubber', 'lucid', 'lucky', 'lurid', 'lusty', 'mad', 'magic', 'manful', 'marked', 'mature', 'meager', 'mean', 'meek', 'menial', 'merry', 'messy', 'metric', 'mighty', 'mild', 'minute', 'miser', 'modest', 'moist', 'moody', 'moral', 'morbid', 'murky', 'music', 'mute', 'naive', 'naked', 'narrow', 'nasty', 'neat', 'nice', 'nimble', 'noble', 'noisy', 'normal', 'nosy', 'numb', 'oafish', 'opaque', 'pert', 'pesky', 'physic', 'pious', 'pithy', 'placid', 'plain', 'poetic', 'polite', 'poor', 'prim', 'prissy', 'proper', 'proud', 'public', 'pure', 'quaint', 'queer', 'quick', 'quiet', 'rabid', 'racy', 'raging', 'rakish', 'random', 'rank', 'rapid', 'rapt', 'rare', 'rash', 'raving', 'ready', 'regal', 'remote', 'rich', 'right', 'rigid', 'ripe', 'ritual', 'robust', 'rosy', 'rough', 'royal', 'rude', 'rueful', 'rugged', 'sad', 'safe', 'sane', 'saucy', 'savage', 'scant', 'secret', 'secure', 'sedate', 'serene', 'severe', 'sexy', 'sexual', 'shaky', 'sharp', 'shoddy', 'showy', 'shrewd', 'shy', 'silent', 'simple', 'skimpy', 'slack', 'sleazy', 'sleek', 'slick', 'slight', 'slow', 'smart', 'smooth', 'smug', 'snooty', 'snug', 'sober', 'soft', 'soggy', 'solemn', 'somber', 'sordid', 'sore', 'sound', 'sour', 'spry', 'square', 'staid', 'stark', 'static', 'steady', 'stern', 'stiff', 'stingy', 'stoic', 'stolid', 'stormy', 'stout', 'strict', 'strong', 'stuffy', 'stupid', 'suave', 'subtle', 'sudden', 'sudden', 'sulky', 'sullen', 'superb', 'supp', 'sure', 'swanky', 'swift', 'tacit', 'tacky', 'tame', 'tardy', 'tart', 'taut', 'tense', 'tepid', 'terse', 'testy', 'thick', 'thin', 'tidy', 'tight', 'timid', 'tonal', 'tough', 'tragic', 'trim', 'trite', 'true', 'trying', 'turgid', 'uneasy', 'unique', 'unkind', 'unsafe', 'urgent', 'useful', 'vague', 'vain', 'vexed', 'visual', 'vital', 'vivid', 'vocal', 'vulgar', 'wan', 'wanton', 'warm', 'weak', 'weird', 'wicked', 'wide', 'wild', 'wise', 'witty', 'woeful', 'wrong', 'wry'
]
+
export const verbed = new Proxy(verbs, {
get: (arr, prop) => {
// Check it's not a property
@@ -24,4 +29,4 @@ export const verbed = new Proxy(verbs, {
return arr[prop]
}
}
-})
+})
\ No newline at end of file
diff --git a/core/src/initStore.js b/core/src/initStore.js
index 038c39e9..a996b8ea 100644
--- a/core/src/initStore.js
+++ b/core/src/initStore.js
@@ -1,41 +1,39 @@
-import {store} from './store.js'
-import {doLoadConfigFromAPI} from './redux/config/config-actions.js'
-import {doInitWorkers, doLoadNodeConfig} from './redux/app/app-actions.js'
-import {doLoadNotificationConfig} from './redux/user/user-actions.js'
-
-import './persistState.js'
-
-import {initApi} from 'qortal-ui-crypto'
+import { store } from './store'
+import { doLoadConfigFromAPI } from './redux/config/config-actions'
+import { doInitWorkers, doLoadNodeConfig } from './redux/app/app-actions'
+import { doLoadNotificationConfig } from './redux/user/user-actions'
+import { initApi } from 'qortal-ui-crypto'
+import './persistState'
initApi(store)
const workerInitChecker = () => {
- const state = store.getState()
+ const state = store.getState()
- if (store.getState().app.nodeConfig.knownNodes.length === 0) {
- store.dispatch(doLoadNodeConfig())
- }
+ if (store.getState().app.nodeConfig.knownNodes.length === 0) {
+ store.dispatch(doLoadNodeConfig())
+ }
- if (state.config.loaded) {
- store.dispatch(doLoadNodeConfig())
+ if (state.config.loaded) {
+ store.dispatch(doLoadNodeConfig())
- if (state.app.workers.ready) {
-
- workerInitSubscription()
- } else {
-
- if (!state.app.workers.loading) store.dispatch(doInitWorkers(state.config.crypto.kdfThreads, state.config.user.constants.workerURL))
- }
- }
+ if (state.app.workers.ready) {
+ workerInitSubscription()
+ } else {
+ if (!state.app.workers.loading) store.dispatch(doInitWorkers(state.config.crypto.kdfThreads, state.config.user.constants.workerURL))
+ }
+ }
}
+
workerInitChecker()
+
const workerInitSubscription = store.subscribe(workerInitChecker)
if (!store.getState().config.loaded) {
- store.dispatch(doLoadConfigFromAPI())
- store.dispatch(doLoadNodeConfig())
+ store.dispatch(doLoadConfigFromAPI())
+ store.dispatch(doLoadNodeConfig())
}
if (!store.getState().user.loaded) {
- store.dispatch(doLoadNotificationConfig())
-}
+ store.dispatch(doLoadNotificationConfig())
+}
\ No newline at end of file
diff --git a/core/src/localStorageHelpers.js b/core/src/localStorageHelpers.js
index 464927d1..9e3eb8f6 100644
--- a/core/src/localStorageHelpers.js
+++ b/core/src/localStorageHelpers.js
@@ -1,19 +1,19 @@
export const loadStateFromLocalStorage = (key) => {
- try {
- const config = localStorage.getItem(key)
- if (config === null) return void 0
- return JSON.parse(config)
- } catch (e) {
- // Could add error handling in case there's a weird one...don't want to overwrite config if it's malfunctioned
- return void 0
- }
+ try {
+ const config = localStorage.getItem(key)
+ if (config === null) return void 0
+ return JSON.parse(config)
+ } catch (e) {
+ // Could add error handling in case there's a weird one...don't want to overwrite config if it's malfunctioned
+ return void 0
+ }
}
export const saveStateToLocalStorage = (key, state) => {
- try {
- const stateJSON = JSON.stringify(state)
- localStorage.setItem(key, stateJSON)
- } catch (e) {
- console.error(e, 'e')
- }
-}
+ try {
+ const stateJSON = JSON.stringify(state)
+ localStorage.setItem(key, stateJSON)
+ } catch (e) {
+ console.error(e, 'e')
+ }
+}
\ No newline at end of file
diff --git a/core/src/lockScreen.js b/core/src/lockScreen.js
index 7dfde20a..fff46475 100644
--- a/core/src/lockScreen.js
+++ b/core/src/lockScreen.js
@@ -1,11 +1,13 @@
import CryptoJS from 'crypto-js'
export const encryptData = (data, salt) => CryptoJS.AES.encrypt(JSON.stringify(data), salt).toString()
+
export const decryptData = (ciphertext, salt) => {
- const bytes = CryptoJS.AES.decrypt(ciphertext, salt)
- try {
- return JSON.parse(bytes.toString(CryptoJS.enc.Utf8))
- } catch(err) {
- return null
- }
-}
+ const bytes = CryptoJS.AES.decrypt(ciphertext, salt)
+
+ try {
+ return JSON.parse(bytes.toString(CryptoJS.enc.Utf8))
+ } catch (err) {
+ return null
+ }
+}
\ No newline at end of file
diff --git a/core/src/main.js b/core/src/main.js
index 9beedda9..7f25c381 100644
--- a/core/src/main.js
+++ b/core/src/main.js
@@ -1,2 +1,2 @@
-import './initStore.js'
-import './components/main-app.js'
+import './initStore'
+import './components/main-app'
\ No newline at end of file
diff --git a/core/src/notifications/config.js b/core/src/notifications/config.js
index 200a4cdf..bd3054f7 100644
--- a/core/src/notifications/config.js
+++ b/core/src/notifications/config.js
@@ -1,12 +1,12 @@
const config = {
- default: {
- title: 'Qortal',
- body: 'Qortal Notifications',
- icon: '/img/favicon/favicon-96x96.png'
- },
- newMessageAudio: '/sound/newmessage.ogg',
- messageAlert: '/sound/messageAlert.ogg',
- blockAlert: '/sound/blockAlert.ogg'
+ default: {
+ title: 'Qortal',
+ body: 'Qortal Notifications',
+ icon: '/img/favicon/favicon-96x96.png'
+ },
+ newMessageAudio: '/sound/newmessage.ogg',
+ messageAlert: '/sound/messageAlert.ogg',
+ blockAlert: '/sound/blockAlert.ogg'
}
-export default config
+export default config
\ No newline at end of file
diff --git a/core/src/notifications/controller.js b/core/src/notifications/controller.js
index 1934fb42..8eb56857 100644
--- a/core/src/notifications/controller.js
+++ b/core/src/notifications/controller.js
@@ -1,39 +1,40 @@
+import { dispatcher } from './dispatcher'
+import { NEW_MESSAGE, NEW_MESSAGE_NOTIFICATION_QAPP, NEW_MESSAGE_NOTIFICATION_QAPP_LOCAL } from './types'
import config from './config'
-import {dispatcher} from './dispatcher'
-import snackbar from '../functional-components/snackbar.js'
-import {NEW_MESSAGE, NEW_MESSAGE_NOTIFICATION_QAPP, NEW_MESSAGE_NOTIFICATION_QAPP_LOCAL} from './types'
+import snackbar from '../functional-components/snackbar'
let initial = 0
let _state
const notificationCheck = function () {
- if (window.Notification && Notification.permission === 'granted') {
- // ...
- return true
- } else if (window.Notification && Notification.permission !== 'denied') {
- Notification.requestPermission().then(permission => {
- if (permission === 'granted') {
- dispatcher(_state)
- _state = ''
- return true
- } else {
- initial = initial + 1
- snackbar.add({
- labelText: 'Notification is disabled, Enable it to recieve notifications.',
- dismiss: true
- })
- }
- })
- } else {
- if ([1, 3, 5, 7, 9, 11, 13, 15].includes(initial)) {
- snackbar.add({
- labelText: 'Notification is disabled in this browser, Enable it to recieve notifications.',
- dismiss: true
- })
- }
+ if (window.Notification && Notification.permission === 'granted') {
+ return true
+ } else if (window.Notification && Notification.permission !== 'denied') {
+ Notification.requestPermission().then(permission => {
+ if (permission === 'granted') {
+ dispatcher(_state)
+ _state = ''
- initial = initial + 1
- }
+ return true
+ } else {
+ initial = initial + 1
+
+ snackbar.add({
+ labelText: 'Notification is disabled, Enable it to recieve notifications.',
+ dismiss: true
+ })
+ }
+ })
+ } else {
+ if ([1, 3, 5, 7, 9, 11, 13, 15].includes(initial)) {
+ snackbar.add({
+ labelText: 'Notification is disabled in this browser, Enable it to recieve notifications.',
+ dismiss: true
+ })
+ }
+
+ initial = initial + 1
+ }
}
/**
@@ -41,52 +42,53 @@ const notificationCheck = function () {
* @property notificationState = { type: NEW_MESSAGE, data }
* @property data = { title: 'Qortal Chat', sound: config.messageAlert, options: { body: 'New Message', icon: config.default.icon, badge: config.default.icon }, req }
*/
-
export const doNewMessage = function (req) {
- const newMessage = () => {
+ const newMessage = () => {
+ let data
- let data
- if (req.type && req.type === 'qapp') {
- data = req
+ if (req.type && req.type === 'qapp') {
+ data = req
+ } else if (req.groupId) {
+ const title = `${req.groupName}`
+ const body = `New Message from ${req.senderName === undefined ? req.sender : req.senderName}`
- } else if (req.groupId) {
- const title = `${req.groupName}`
- const body = `New Message from ${req.senderName === undefined ? req.sender : req.senderName}`
- data = { title, sound: config.messageAlert, options: { body, icon: config.default.icon, badge: config.default.icon }, req }
- } else {
- const title = `${req.senderName === undefined ? req.sender : req.senderName}`
- const body = 'New Message'
- data = { title, sound: config.messageAlert, options: { body, icon: config.default.icon, badge: config.default.icon }, req }
- }
+ data = { title, sound: config.messageAlert, options: { body, icon: config.default.icon, badge: config.default.icon }, req }
+ } else {
+ const title = `${req.senderName === undefined ? req.sender : req.senderName}`
+ const body = 'New Message'
- const notificationState = { type: NEW_MESSAGE, data: data }
- const notificationStateQapp = { type: NEW_MESSAGE_NOTIFICATION_QAPP, data: data }
- const canI = notificationCheck()
+ data = { title, sound: config.messageAlert, options: { body, icon: config.default.icon, badge: config.default.icon }, req }
+ }
- if (canI === true) {
- if (req.type && req.type === 'qapp') {
- dispatcher(notificationStateQapp)
- } else {
- dispatcher(notificationState)
- }
+ const notificationState = { type: NEW_MESSAGE, data: data }
+ const notificationStateQapp = { type: NEW_MESSAGE_NOTIFICATION_QAPP, data: data }
+ const canI = notificationCheck()
- } else {
- _state = notificationState
- }
- }
- const page = window.top.location.href
- if(req.type && req.type === 'qapp-local-notification'){
- try {
- dispatcher({ type: NEW_MESSAGE_NOTIFICATION_QAPP_LOCAL, data: req })
+ if (canI === true) {
+ if (req.type && req.type === 'qapp') {
+ dispatcher(notificationStateQapp)
+ } else {
+ dispatcher(notificationState)
+ }
+ } else {
+ _state = notificationState
+ }
+ }
- } catch (error) {
- console.log('error', error)
- }
- }else if (!document.hasFocus()) {
- newMessage()
- } else {
- if (page.includes(req.url) === false) {
- newMessage()
- }
- }
-}
+ const page = window.top.location.href
+
+ if (req.type && req.type === 'qapp-local-notification') {
+ try {
+ dispatcher({ type: NEW_MESSAGE_NOTIFICATION_QAPP_LOCAL, data: req })
+
+ } catch (error) {
+ console.log('error', error)
+ }
+ } else if (!document.hasFocus()) {
+ newMessage()
+ } else {
+ if (page.includes(req.url) === false) {
+ newMessage()
+ }
+ }
+}
\ No newline at end of file
diff --git a/core/src/notifications/dispatcher.js b/core/src/notifications/dispatcher.js
index e31e6d84..e66fa964 100644
--- a/core/src/notifications/dispatcher.js
+++ b/core/src/notifications/dispatcher.js
@@ -2,14 +2,16 @@ import {NEW_MESSAGE, NEW_MESSAGE_NOTIFICATION_QAPP, NEW_MESSAGE_NOTIFICATION_QAP
import {newMessage, newMessageNotificationQapp, newMessageNotificationQappLocal} from './notification-actions'
export const dispatcher = function (notificationState) {
+ switch (notificationState.type) {
+ case NEW_MESSAGE:
+ return newMessage(notificationState.data)
- switch (notificationState.type) {
- case NEW_MESSAGE:
- return newMessage(notificationState.data)
- case NEW_MESSAGE_NOTIFICATION_QAPP:
- return newMessageNotificationQapp(notificationState.data)
- case NEW_MESSAGE_NOTIFICATION_QAPP_LOCAL:
- return newMessageNotificationQappLocal(notificationState.data)
- default:
- }
-}
+ case NEW_MESSAGE_NOTIFICATION_QAPP:
+ return newMessageNotificationQapp(notificationState.data)
+
+ case NEW_MESSAGE_NOTIFICATION_QAPP_LOCAL:
+ return newMessageNotificationQappLocal(notificationState.data)
+
+ default:
+ }
+}
\ No newline at end of file
diff --git a/core/src/notifications/notification-actions/index.js b/core/src/notifications/notification-actions/index.js
index cc2f8937..90f883ff 100644
--- a/core/src/notifications/notification-actions/index.js
+++ b/core/src/notifications/notification-actions/index.js
@@ -1 +1 @@
-export { newMessage, newMessageNotificationQapp, newMessageNotificationQappLocal } from './new-message'
+export { newMessage, newMessageNotificationQapp, newMessageNotificationQappLocal } from './new-message'
\ No newline at end of file
diff --git a/core/src/notifications/notification-actions/new-message.js b/core/src/notifications/notification-actions/new-message.js
index b9ab7ff0..43f02712 100644
--- a/core/src/notifications/notification-actions/new-message.js
+++ b/core/src/notifications/notification-actions/new-message.js
@@ -1,267 +1,284 @@
-import {store} from '../../store.js'
-import {doPageUrl, setNewTab} from '../../redux/app/app-actions.js'
+import { store } from '../../store'
+import { doPageUrl, setNewTab } from '../../redux/app/app-actions'
import isElectron from 'is-electron'
-import ShortUniqueId from 'short-unique-id';
+import ShortUniqueId from 'short-unique-id'
const uid = new ShortUniqueId()
export const newMessage = (data) => {
- const alert = playSound(data.sound)
+ const alert = playSound(data.sound)
- // Should I show notification ?
- if (store.getState().user.notifications.q_chat.showNotification) {
+ // Should I show notification ?
+ if (store.getState().user.notifications.q_chat.showNotification) {
+ // Yes, I can but should I play sound ?
+ if (store.getState().user.notifications.q_chat.playSound) {
+ const notify = new Notification(data.title, data.options)
- // Yes, I can but should I play sound ?
- if (store.getState().user.notifications.q_chat.playSound) {
+ notify.onshow = (e) => {
+ alert.play()
+ }
- const notify = new Notification(data.title, data.options)
-
- notify.onshow = (e) => {
- alert.play()
- }
-
- notify.onclick = (e) => {
- const pageUrl = `/app/q-chat/?chat=${data.req.url}`
- store.dispatch(doPageUrl(pageUrl))
- }
- } else {
-
- const notify = new Notification(data.title, data.options)
-
- notify.onclick = (e) => {
- const pageUrl = `/app/q-chat/?chat=${data.req.url}`
- store.dispatch(doPageUrl(pageUrl))
- }
- }
- // If sounds are enabled, but notifications are not
- } else if (store.getState().user.notifications.q_chat.playSound) {
- alert.play()
- }
+ notify.onclick = (e) => {
+ const pageUrl = `/app/q-chat/?chat=${data.req.url}`
+ store.dispatch(doPageUrl(pageUrl))
+ }
+ } else {
+ const notify = new Notification(data.title, data.options)
+ notify.onclick = (e) => {
+ const pageUrl = `/app/q-chat/?chat=${data.req.url}`
+ store.dispatch(doPageUrl(pageUrl))
+ }
+ }
+ // If sounds are enabled, but notifications are not
+ } else if (store.getState().user.notifications.q_chat.playSound) {
+ alert.play()
+ }
}
+
export const newMessageNotificationQapp = (data) => {
+ const alert = playSound(data.sound)
- const alert = playSound(data.sound)
+ // Should I show notification ?
+ if (store.getState().user.notifications.q_chat.showNotification) {
+ // Yes, I can but should I play sound ?
+ if (store.getState().user.notifications.q_chat.playSound) {
+ const notify = new Notification(data.title, data.options)
- // Should I show notification ?
- if (store.getState().user.notifications.q_chat.showNotification) {
+ notify.onshow = (e) => {
+ alert.play()
+ }
- // Yes, I can but should I play sound ?
- if (store.getState().user.notifications.q_chat.playSound) {
+ notify.onclick = (e) => {
+ const query = `?service=APP&name=Q-Mail`
- const notify = new Notification(data.title, data.options)
+ store.dispatch(setNewTab({
+ url: `qdn/browser/index.html${query}`,
+ id: 'q-mail-notification',
+ myPlugObj: {
+ "url": "qapps",
+ "domain": "core",
+ "page": `qdn/browser/index.html${query}`,
+ "title": "Q-Mail",
+ "icon": "vaadin:desktop",
+ "menus": [],
+ "parent": false
+ }
+ }))
- notify.onshow = (e) => {
- alert.play()
- }
+ if (!isElectron()) {
+ window.focus();
+ } else {
+ window.electronAPI.focusApp()
+ }
+ }
+ } else {
+ const notify = new Notification(data.title, data.options)
- notify.onclick = (e) => {
- const query = `?service=APP&name=Q-Mail`
+ notify.onclick = (e) => {
+ const query = `?service=APP&name=Q-Mail`
- store.dispatch(setNewTab({
- url: `qdn/browser/index.html${query}`,
- id: 'q-mail-notification',
- myPlugObj: {
- "url": "qapps",
- "domain": "core",
- "page": `qdn/browser/index.html${query}`,
- "title": "Q-Mail",
- "icon": "vaadin:desktop",
- "menus": [],
- "parent": false
- }
- }))
- if (!isElectron()) {
- window.focus();
- } else {
- window.electronAPI.focusApp()
- }
-
- }
- } else {
-
- const notify = new Notification(data.title, data.options)
-
- notify.onclick = (e) => {
- const query = `?service=APP&name=Q-Mail`
-
- store.dispatch(setNewTab({
- url: `qdn/browser/index.html${query}`,
- id: 'q-mail-notification',
- myPlugObj: {
- "url": "qapps",
- "domain": "core",
- "page": `qdn/browser/index.html${query}`,
- "title": "Q-Mail",
- "icon": "vaadin:desktop",
- "menus": [],
- "parent": false
- }
- }))
- if (!isElectron()) {
- window.focus();
- } else {
- window.electronAPI.focusApp()
- }
- }
- }
- // If sounds are enabled, but notifications are not
- } else if (store.getState().user.notifications.q_chat.playSound) {
- alert.play()
- }
+ store.dispatch(setNewTab({
+ url: `qdn/browser/index.html${query}`,
+ id: 'q-mail-notification',
+ myPlugObj: {
+ "url": "qapps",
+ "domain": "core",
+ "page": `qdn/browser/index.html${query}`,
+ "title": "Q-Mail",
+ "icon": "vaadin:desktop",
+ "menus": [],
+ "parent": false
+ }
+ }))
+ if (!isElectron()) {
+ window.focus();
+ } else {
+ window.electronAPI.focusApp()
+ }
+ }
+ }
+ // If sounds are enabled, but notifications are not
+ } else if (store.getState().user.notifications.q_chat.playSound) {
+ alert.play()
+ }
}
- const extractComponents= async (url)=> {
- if (!url.startsWith("qortal://")) {
- return null;
- }
+const extractComponents = async (url) => {
+ if (!url.startsWith("qortal://")) {
+ return null
+ }
- url = url.replace(/^(qortal\:\/\/)/, "");
- if (url.includes("/")) {
- let parts = url.split("/");
- const service = parts[0].toUpperCase();
- parts.shift();
- const name = parts[0];
- parts.shift();
- let identifier;
+ url = url.replace(/^(qortal\:\/\/)/, "")
- if (parts.length > 0) {
- identifier = parts[0]; // Do not shift yet
- // Check if a resource exists with this service, name and identifier combination
- let responseObj = await parentEpml.request('apiCall', {
- url: `/arbitrary/resource/status/${service}/${name}/${identifier}?apiKey=${this.getApiKey()}`
- })
+ if (url.includes("/")) {
+ let parts = url.split("/")
- if (responseObj.totalChunkCount > 0) {
- // Identifier exists, so don't include it in the path
- parts.shift();
- }
- else {
- identifier = null;
- }
- }
+ const service = parts[0].toUpperCase()
- const path = parts.join("/");
+ parts.shift()
- const components = {};
- components["service"] = service;
- components["name"] = name;
- components["identifier"] = identifier;
- components["path"] = path;
- return components;
- }
+ const name = parts[0]
- return null;
+ parts.shift()
+
+ let identifier
+
+ if (parts.length > 0) {
+ // Do not shift yet
+ identifier = parts[0]
+
+ // Check if a resource exists with this service, name and identifier combination
+ let responseObj = await parentEpml.request('apiCall', {
+ url: `/arbitrary/resource/status/${service}/${name}/${identifier}?apiKey=${this.getApiKey()}`
+ })
+
+ if (responseObj.totalChunkCount > 0) {
+ // Identifier exists, so don't include it in the path
+ parts.shift()
+ } else {
+ identifier = null
+ }
+ }
+
+ const path = parts.join("/")
+ const components = {}
+
+ components["service"] = service
+ components["name"] = name
+ components["identifier"] = identifier
+ components["path"] = path
+
+ return components
+ }
+
+ return null
}
-export const newMessageNotificationQappLocal = (data) => {
- const alert = playSound(data.sound)
+export const newMessageNotificationQappLocal = (data) => {
+ const alert = playSound(data.sound)
- // Should I show notification ?
- if (store.getState().user.notifications.q_chat.showNotification) {
+ // Should I show notification ?
+ if (store.getState().user.notifications.q_chat.showNotification) {
+ // Yes, I can but should I play sound ?
+ if (store.getState().user.notifications.q_chat.playSound) {
+ const notify = new Notification(data.title, data.options)
- // Yes, I can but should I play sound ?
- if (store.getState().user.notifications.q_chat.playSound) {
-
- const notify = new Notification(data.title, data.options)
-
- notify.onshow = (e) => {
- alert.play()
- }
-
- notify.onclick = async(e) => {
- let newQuery = data?.url;
- if (newQuery.endsWith('/')) {
- newQuery = newQuery.slice(0, -1);
+ notify.onshow = (e) => {
+ alert.play()
}
- const res = await extractComponents(newQuery)
- if (!res) return
- const { service, name, identifier, path } = res
- let query = `?service=${service}`
- if (name) {
- query = query + `&name=${name}`
- }
- if (identifier) {
- query = query + `&identifier=${identifier}`
- }
- if (path) {
- query = query + `&path=${path}`
- }
- const tab = {
- url: `qdn/browser/index.html${query}`,
- id: uid.rnd(),
- myPlugObj: {
- "url": service === 'WEBSITE' ? "websites" : "qapps",
- "domain": "core",
- "page": `qdn/browser/index.html${query}`,
- "title": name,
- "icon": service === 'WEBSITE' ? 'vaadin:desktop' : 'vaadin:external-browser',
- "mwcicon": service === 'WEBSITE' ? 'desktop_mac' : 'open_in_browser',
- "menus": [],
- "parent": false
+
+ notify.onclick = async (e) => {
+ let newQuery = data?.url
+
+ if (newQuery.endsWith('/')) {
+ newQuery = newQuery.slice(0, -1)
}
- }
- store.dispatch(setNewTab(tab))
- if (!isElectron()) {
- window.focus();
- } else {
- window.electronAPI.focusApp()
- }
- }
- } else {
+ const res = await extractComponents(newQuery)
- const notify = new Notification(data.title, data.options)
+ if (!res) return
- notify.onclick = async(e) => {
- let newQuery = data?.url;
- if (newQuery.endsWith('/')) {
- newQuery = newQuery.slice(0, -1);
- }
- const res = await extractComponents(newQuery)
- if (!res) return
- const { service, name, identifier, path } = res
- let query = `?service=${service}`
- if (name) {
- query = query + `&name=${name}`
- }
- if (identifier) {
- query = query + `&identifier=${identifier}`
- }
- if (path) {
- query = query + `&path=${path}`
- }
- const tab = {
- url: `qdn/browser/index.html${query}`,
- id: uid.rnd(),
- myPlugObj: {
- "url": service === 'WEBSITE' ? "websites" : "qapps",
- "domain": "core",
- "page": `qdn/browser/index.html${query}`,
- "title": name,
- "icon": service === 'WEBSITE' ? 'vaadin:desktop' : 'vaadin:external-browser',
- "mwcicon": service === 'WEBSITE' ? 'desktop_mac' : 'open_in_browser',
- "menus": [],
- "parent": false
+ const { service, name, identifier, path } = res
+
+ let query = `?service=${service}`
+
+ if (name) {
+ query = query + `&name=${name}`
}
- }
- store.dispatch(setNewTab(tab))
- if (!isElectron()) {
- window.focus();
- } else {
- window.electronAPI.focusApp()
- }
- }
- }
- // If sounds are enabled, but notifications are not
- } else if (store.getState().user.notifications.q_chat.playSound) {
- alert.play()
- }
+ if (identifier) {
+ query = query + `&identifier=${identifier}`
+ }
+ if (path) {
+ query = query + `&path=${path}`
+ }
+
+ const tab = {
+ url: `qdn/browser/index.html${query}`,
+ id: uid.rnd(),
+ myPlugObj: {
+ "url": service === 'WEBSITE' ? "websites" : "qapps",
+ "domain": "core",
+ "page": `qdn/browser/index.html${query}`,
+ "title": name,
+ "icon": service === 'WEBSITE' ? 'vaadin:desktop' : 'vaadin:external-browser',
+ "mwcicon": service === 'WEBSITE' ? 'desktop_mac' : 'open_in_browser',
+ "menus": [],
+ "parent": false
+ }
+ }
+
+ store.dispatch(setNewTab(tab))
+
+ if (!isElectron()) {
+ window.focus()
+ } else {
+ window.electronAPI.focusApp()
+ }
+ }
+ } else {
+ const notify = new Notification(data.title, data.options)
+
+ notify.onclick = async (e) => {
+ let newQuery = data?.url
+
+ if (newQuery.endsWith('/')) {
+ newQuery = newQuery.slice(0, -1)
+ }
+
+ const res = await extractComponents(newQuery)
+
+ if (!res) return
+
+ const { service, name, identifier, path } = res
+
+ let query = `?service=${service}`
+
+ if (name) {
+ query = query + `&name=${name}`
+ }
+
+ if (identifier) {
+ query = query + `&identifier=${identifier}`
+ }
+
+ if (path) {
+ query = query + `&path=${path}`
+ }
+
+ const tab = {
+ url: `qdn/browser/index.html${query}`,
+ id: uid.rnd(),
+ myPlugObj: {
+ "url": service === 'WEBSITE' ? "websites" : "qapps",
+ "domain": "core",
+ "page": `qdn/browser/index.html${query}`,
+ "title": name,
+ "icon": service === 'WEBSITE' ? 'vaadin:desktop' : 'vaadin:external-browser',
+ "mwcicon": service === 'WEBSITE' ? 'desktop_mac' : 'open_in_browser',
+ "menus": [],
+ "parent": false
+ }
+ }
+
+ store.dispatch(setNewTab(tab))
+
+ if (!isElectron()) {
+ window.focus()
+ } else {
+ window.electronAPI.focusApp()
+ }
+ }
+ }
+ // If sounds are enabled, but notifications are not
+ } else if (store.getState().user.notifications.q_chat.playSound) {
+ alert.play()
+ }
}
const playSound = (soundUrl) => {
- return new Audio(soundUrl)
-}
+ return new Audio(soundUrl)
+}
\ No newline at end of file
diff --git a/core/src/notifications/types.js b/core/src/notifications/types.js
index f50b3ec7..e26c8366 100644
--- a/core/src/notifications/types.js
+++ b/core/src/notifications/types.js
@@ -1,3 +1,3 @@
export const NEW_MESSAGE = 'NEW_MESSAGE'
export const NEW_MESSAGE_NOTIFICATION_QAPP = 'NEW_MESSAGE_NOTIFICATION_QAPP'
-export const NEW_MESSAGE_NOTIFICATION_QAPP_LOCAL = 'NEW_MESSAGE_NOTIFICATION_QAPP_LOCAL'
+export const NEW_MESSAGE_NOTIFICATION_QAPP_LOCAL = 'NEW_MESSAGE_NOTIFICATION_QAPP_LOCAL'
\ No newline at end of file
diff --git a/core/src/persistState.js b/core/src/persistState.js
index 277634a0..fba35e6a 100644
--- a/core/src/persistState.js
+++ b/core/src/persistState.js
@@ -1,23 +1,20 @@
-import {store} from './store.js'
-import {saveStateToLocalStorage} from './localStorageHelpers.js'
-
-const keys = [
- 'config',
- 'user'
-]
+import { store } from './store'
+import { saveStateToLocalStorage } from './localStorageHelpers'
+const keys = ['config', 'user']
const oldReducers = {}
-
const oldState = store.getState()
+
for (const key of keys) {
- oldReducers[key] = oldState[key]
+ oldReducers[key] = oldState[key]
}
store.subscribe(() => {
- const newState = store.getState()
- keys.forEach(key => {
- if (newState[key] !== oldState[key]) {
- saveStateToLocalStorage(key, store.getState()[key])
- }
- })
-})
+ const newState = store.getState()
+
+ keys.forEach(key => {
+ if (newState[key] !== oldState[key]) {
+ saveStateToLocalStorage(key, store.getState()[key])
+ }
+ })
+})
\ No newline at end of file
diff --git a/core/src/plugins/addPluginRoutes.js b/core/src/plugins/addPluginRoutes.js
index e840dd74..5736f4d5 100644
--- a/core/src/plugins/addPluginRoutes.js
+++ b/core/src/plugins/addPluginRoutes.js
@@ -1,7 +1,7 @@
-import {routes} from './routes.js'
+import { routes } from './routes'
export const addPluginRoutes = epmlInstance => {
- Object.entries(routes).forEach(([route, handler]) => {
- epmlInstance.route(route, handler)
- })
-}
+ Object.entries(routes).forEach(([route, handler]) => {
+ epmlInstance.route(route, handler)
+ })
+}
\ No newline at end of file
diff --git a/core/src/plugins/load-plugins.js b/core/src/plugins/load-plugins.js
index 63b72729..64438499 100644
--- a/core/src/plugins/load-plugins.js
+++ b/core/src/plugins/load-plugins.js
@@ -1,46 +1,47 @@
-import {store} from '../store.js'
-import {Epml} from '../epml.js'
-import {addPluginRoutes} from './addPluginRoutes'
-import {doAddPlugin} from '../redux/app/app-actions.js'
+import { store } from '../store'
+import { Epml } from '../epml'
+import { addPluginRoutes } from './addPluginRoutes'
+import { doAddPlugin } from '../redux/app/app-actions'
let retryLoadPluginsInterval = 0
+
export const loadPlugins = () => fetch('/getPlugins')
- .then(response => response.json())
- .then(response => {
- const plugins = response.plugins
- const config = store.getState().config
- pluginLoader(plugins, config)
- })
- .catch(err => {
- retryLoadPluginsInterval += 1000
- console.error(err)
- console.error(`Could not load plugins. Retrying in ${retryLoadPluginsInterval / 1000} second(s)`)
- setTimeout(loadPlugins, retryLoadPluginsInterval)
- })
+ .then(response => response.json()).then(response => {
+ const plugins = response.plugins
+ const config = store.getState().config
+ pluginLoader(plugins, config)
+ }).catch(err => {
+ retryLoadPluginsInterval += 1000
+ console.error(err)
+ console.error(`Could not load plugins. Retrying in ${retryLoadPluginsInterval / 1000} second(s)`)
+ setTimeout(loadPlugins, retryLoadPluginsInterval)
+ })
export const pluginLoader = (plugins, config) => {
- const pluginContentWindows = []
- plugins.forEach(plugin => {
- const frame = document.createElement('iframe')
- frame.className += 'pluginJSFrame'
- frame.sandbox = 'allow-scripts allow-same-origin'
+ const pluginContentWindows = []
- frame.src = window.location.origin + '/qortal-components/plugin-mainjs-loader.html#' + plugin + '/main.js'
+ plugins.forEach(plugin => {
+ const frame = document.createElement('iframe')
- const insertedFrame = window.document.body.appendChild(frame)
+ frame.className += 'pluginJSFrame'
+ frame.sandbox = 'allow-scripts allow-same-origin'
+ frame.src = window.location.origin + '/qortal-components/plugin-mainjs-loader.html#' + plugin + '/main.js'
- pluginContentWindows.push(insertedFrame.contentWindow)
+ const insertedFrame = window.document.body.appendChild(frame)
- const epmlInstance = new Epml({
- type: 'WINDOW',
- source: insertedFrame.contentWindow
- })
+ pluginContentWindows.push(insertedFrame.contentWindow)
- addPluginRoutes(epmlInstance)
- epmlInstance.imReady()
+ const epmlInstance = new Epml({
+ type: 'WINDOW',
+ source: insertedFrame.contentWindow
+ })
- Epml.registerProxyInstance(`${plugin}-plugin`, epmlInstance)
+ addPluginRoutes(epmlInstance)
- store.dispatch(doAddPlugin(epmlInstance))
- })
-}
+ epmlInstance.imReady()
+
+ Epml.registerProxyInstance(`${plugin}-plugin`, epmlInstance)
+
+ store.dispatch(doAddPlugin(epmlInstance))
+ })
+}
\ No newline at end of file
diff --git a/core/src/plugins/plugin-mainjs-loader.html b/core/src/plugins/plugin-mainjs-loader.html
index c424fdd5..3110129a 100644
--- a/core/src/plugins/plugin-mainjs-loader.html
+++ b/core/src/plugins/plugin-mainjs-loader.html
@@ -1,9 +1,6 @@
-
-
-
-
-
-
-
+
+
+
+
\ No newline at end of file
diff --git a/core/src/plugins/plugin-mainjs-loader.js b/core/src/plugins/plugin-mainjs-loader.js
index 86ec8917..3114bd0b 100644
--- a/core/src/plugins/plugin-mainjs-loader.js
+++ b/core/src/plugins/plugin-mainjs-loader.js
@@ -1,12 +1,15 @@
-'use strict'
-import {Epml, EpmlStream} from '../epml.js'
+import { Epml, EpmlStream } from '../epml'
window.Epml = Epml
window.EpmlStream = EpmlStream
const pluginScript = document.createElement('script')
+
pluginScript.async = false
pluginScript.type = 'module'
+
const hash = window.location.hash
+
pluginScript.src = '/plugin/' + hash.slice(1)
-document.body.appendChild(pluginScript)
+
+document.body.appendChild(pluginScript)
\ No newline at end of file
diff --git a/core/src/plugins/routes.js b/core/src/plugins/routes.js
index dd213a31..af92345a 100644
--- a/core/src/plugins/routes.js
+++ b/core/src/plugins/routes.js
@@ -1,4 +1,4 @@
-import {store} from '../store.js'
+import { store } from '../store'
import {
doAddPluginUrl,
doPageUrl,
@@ -7,13 +7,14 @@ import {
doUpdateAccountInfo,
doUpdateBlockInfo,
doUpdateNodeInfo,
- doUpdateNodeStatus,
-} from '../redux/app/app-actions.js'
+ doUpdateNodeStatus
+} from '../redux/app/app-actions'
+import { loadStateFromLocalStorage, saveStateToLocalStorage, } from '../localStorageHelpers'
+import { requestTransactionDialog } from '../functional-components/confirm-transaction-dialog'
+import { doNewMessage } from '../notifications/controller'
import * as api from 'qortal-ui-crypto'
-import {requestTransactionDialog} from '../functional-components/confirm-transaction-dialog.js'
-import {doNewMessage} from '../notifications/controller.js'
-import snackbar from '../functional-components/snackbar.js'
-import {loadStateFromLocalStorage, saveStateToLocalStorage,} from '../localStorageHelpers.js'
+import snackbar from '../functional-components/snackbar'
+
const createTransaction = api.createTransaction
const processTransaction = api.processTransaction
@@ -119,19 +120,20 @@ export const routes = {
let res
- if(req.data.apiVersion && req.data.apiVersion === 2){
+ if (req.data.apiVersion && req.data.apiVersion === 2) {
res = await processTransactionVersion2(tx.signedBytes)
}
- if(!req.data.apiVersion){
+
+ if (!req.data.apiVersion) {
res = await processTransaction(tx.signedBytes)
}
let extraData = {}
- if(req.data.type === 38 && tx && tx._rewardShareKeyPair && tx._rewardShareKeyPair.secretKey){
+
+ if (req.data.type === 38 && tx && tx._rewardShareKeyPair && tx._rewardShareKeyPair.secretKey) {
extraData.rewardSharePrivateKey = Base58.encode(tx._rewardShareKeyPair.secretKey)
}
-
response = {
success: true,
data: res,
@@ -140,70 +142,80 @@ export const routes = {
} catch (e) {
console.error(e)
console.error(e.message)
+
response = {
success: false,
- message: e.message,
+ message: e.message
}
}
+
return response
},
standaloneTransaction: async (req) => {
const rebuildUint8Array = (obj) => {
let _array = new Uint8Array(Object.keys(obj).length)
+
for (let i = 0; i < _array.byteLength; ++i) {
_array.set([obj[i]], i)
}
+
return _array
}
let response
+
try {
// req.data.keyPair unfortunately "prepared" into horrible object so we need to convert back
let _keyPair = {}
+
for (let _keyName in req.data.keyPair) {
_keyPair[_keyName] = rebuildUint8Array(
req.data.keyPair[_keyName]
)
}
+
const tx = createTransaction(
req.data.type,
_keyPair,
req.data.params
)
+
let res
- if(req.data.apiVersion && req.data.apiVersion === 2){
+ if (req.data.apiVersion && req.data.apiVersion === 2) {
res = await processTransactionVersion2(tx.signedBytes)
}
- if(!req.data.apiVersion){
+
+ if (!req.data.apiVersion) {
res = await processTransaction(tx.signedBytes)
}
-
response = {
success: true,
- data: res,
+ data: res
}
} catch (e) {
console.error(e)
console.error(e.message)
+
response = {
success: false,
- message: e.message,
+ message: e.message
}
}
+
return response
},
username: async (req) => {
const state = store.getState()
- return state.user.storedWallets[state.app.wallet.addresses[0].address]
- .name
+ return state.user.storedWallets[state.app.wallet.addresses[0].address].name
},
chat: async (req) => {
let response
+
try {
const tx = createTransaction(
req.data.type,
@@ -215,13 +227,16 @@ export const routes = {
} catch (e) {
console.error(e)
console.error(e.message)
+
response = false
}
+
return response
},
sign_chat: async (req) => {
let response
+
try {
const signedChatBytes = await signChatTransaction(
req.data.chatBytesArray,
@@ -231,10 +246,11 @@ export const routes = {
let res
- if(req.data.apiVersion && req.data.apiVersion === 2){
+ if (req.data.apiVersion && req.data.apiVersion === 2) {
res = await processTransactionVersion2(signedChatBytes)
}
- if(!req.data.apiVersion){
+
+ if (!req.data.apiVersion) {
res = await processTransaction(signedChatBytes)
}
@@ -242,13 +258,16 @@ export const routes = {
} catch (e) {
console.error(e)
console.error(e.message)
+
response = false
}
+
return response
},
sign_arbitrary: async (req) => {
let response
+
try {
const signedArbitraryBytes = await signArbitraryTransaction(
req.data.arbitraryBytesBase58,
@@ -256,12 +275,14 @@ export const routes = {
req.data.arbitraryNonce,
store.getState().app.wallet._addresses[req.data.nonce].keyPair
)
+
let res
- if(req.data.apiVersion && req.data.apiVersion === 2){
+ if (req.data.apiVersion && req.data.apiVersion === 2) {
res = await processTransactionVersion2(signedArbitraryBytes)
}
- if(!req.data.apiVersion){
+
+ if (!req.data.apiVersion) {
res = await processTransaction(signedArbitraryBytes)
}
@@ -269,25 +290,30 @@ export const routes = {
} catch (e) {
console.error(e)
console.error(e.message)
+
response = false
}
+
return response
},
sign_arbitrary_with_fee: async (req) => {
let response
+
try {
const signedArbitraryBytes = await signArbitraryWithFeeTransaction(
req.data.arbitraryBytesBase58,
req.data.arbitraryBytesForSigningBase58,
store.getState().app.wallet._addresses[req.data.nonce].keyPair
)
+
let res
- if(req.data.apiVersion && req.data.apiVersion === 2){
+ if (req.data.apiVersion && req.data.apiVersion === 2) {
res = await processTransactionVersion2(signedArbitraryBytes)
}
- if(!req.data.apiVersion){
+
+ if (!req.data.apiVersion) {
res = await processTransaction(signedArbitraryBytes)
}
@@ -295,8 +321,10 @@ export const routes = {
} catch (e) {
console.error(e)
console.error(e.message)
+
response = false
}
+
return response
},
@@ -307,12 +335,13 @@ export const routes = {
showSnackBar: async (req) => {
snackbar.add({
labelText: req.data,
- dismiss: true,
+ dismiss: true
})
},
tradeBotCreateRequest: async (req) => {
let response
+
try {
const unsignedTxn = await tradeBotCreateRequest(req.data)
@@ -320,37 +349,46 @@ export const routes = {
unsignedTxn,
store.getState().app.selectedAddress.keyPair
)
+
let res
- if(req.data.apiVersion && req.data.apiVersion === 2){
+ if (req.data.apiVersion && req.data.apiVersion === 2) {
res = await processTransactionVersion2(signedTxnBytes)
}
- if(!req.data.apiVersion){
+
+ if (!req.data.apiVersion) {
res = await processTransaction(signedTxnBytes)
}
+
response = res
} catch (e) {
console.error(e)
console.error(e.message)
+
response = e.message
}
+
return response
},
tradeBotRespondRequest: async (req) => {
let response
+
try {
response = await tradeBotRespondRequest(req.data)
} catch (e) {
console.error(e)
console.error(e.message)
+
response = e.message
}
+
return response
},
deleteTradeOffer: async (req) => {
let response
+
try {
const unsignedTxn = await deleteTradeOffer(req.data)
@@ -361,10 +399,11 @@ export const routes = {
let res
- if(req.data.apiVersion && req.data.apiVersion === 2){
+ if (req.data.apiVersion && req.data.apiVersion === 2) {
res = await processTransactionVersion2(signedTxnBytes)
}
- if(!req.data.apiVersion){
+
+ if (!req.data.apiVersion) {
res = await processTransaction(signedTxnBytes)
}
@@ -372,94 +411,115 @@ export const routes = {
} catch (e) {
console.error(e)
console.error(e.message)
+
response = e.message
}
+
return response
},
cancelAllOffers: async (req) => {
let response
+
try {
- response = await cancelAllOffers(
- store.getState().app.selectedAddress
- )
+ response = await cancelAllOffers(store.getState().app.selectedAddress)
} catch (e) {
console.error(e)
console.error(e.message)
+
response = e.message
}
+
return response
},
sendBtc: async (req) => {
let response
+
try {
response = await sendBtc(req.data)
} catch (e) {
console.error(e)
console.error(e.message)
+
response = e.message
}
+
return response
},
sendLtc: async (req) => {
let response
+
try {
response = await sendLtc(req.data)
} catch (e) {
console.error(e)
console.error(e.message)
+
response = e.message
}
+
return response
},
sendDoge: async (req) => {
let response
+
try {
response = await sendDoge(req.data)
} catch (e) {
console.error(e)
console.error(e.message)
+
response = e.message
}
+
return response
},
sendDgb: async (req) => {
let response
+
try {
response = await sendDgb(req.data)
} catch (e) {
console.error(e)
console.error(e.message)
+
response = e.message
}
+
return response
},
sendRvn: async (req) => {
let response
+
try {
response = await sendRvn(req.data)
} catch (e) {
console.error(e)
console.error(e.message)
+
response = e.message
}
+
return response
},
sendArrr: async (req) => {
let response
+
try {
response = await sendArrr(req.data)
} catch (e) {
console.error(e)
console.error(e.message)
+
response = e.message
}
+
return response
- },
-}
+ }
+}
\ No newline at end of file
diff --git a/core/src/plugins/streams.js b/core/src/plugins/streams.js
index c33047ee..1a88aebc 100644
--- a/core/src/plugins/streams.js
+++ b/core/src/plugins/streams.js
@@ -1,5 +1,5 @@
-import {store} from '../store.js'
-import {EpmlStream} from 'epml'
+import { store } from '../store'
+import { EpmlStream } from 'epml'
const LOGIN_STREAM_NAME = 'logged_in'
const CONFIG_STREAM_NAME = 'config'
@@ -23,57 +23,54 @@ export const sideEffectActionStream = new EpmlStream(SIDE_EFFECT_ACTION, () => s
export const profileDataActionStream = new EpmlStream(SIDE_EFFECT_ACTION, () => store.getState().app.profileData)
export const coinBalancesActionStream = new EpmlStream(COIN_BALANCES_ACTION, () => store.getState().app.coinBalances)
-
-
-
let oldState = {
- app: {}
+ app: {}
}
store.subscribe(() => {
- const state = store.getState()
+ const state = store.getState()
- if (oldState.app.loggedIn !== state.app.loggedIn) {
- loggedInStream.emit(state.app.loggedIn)
- }
+ if (oldState.app.loggedIn !== state.app.loggedIn) {
+ loggedInStream.emit(state.app.loggedIn)
+ }
- if (oldState.config !== state.config) {
- configStream.emit(state.config)
- }
+ if (oldState.config !== state.config) {
+ configStream.emit(state.config)
+ }
- if (oldState.app.nodeConfig !== state.app.nodeConfig) {
- nodeConfigStream.emit(state.app.nodeConfig)
- }
+ if (oldState.app.nodeConfig !== state.app.nodeConfig) {
+ nodeConfigStream.emit(state.app.nodeConfig)
+ }
- if (oldState.app.chatLastSeen !== state.app.chatLastSeen) {
- chatLastSeenStream.emit(state.app.chatLastSeen)
- }
+ if (oldState.app.chatLastSeen !== state.app.chatLastSeen) {
+ chatLastSeenStream.emit(state.app.chatLastSeen)
+ }
- if (oldState.app.selectedAddress !== state.app.selectedAddress) {
- selectedAddressStream.emit({
- address: state.app.selectedAddress.address,
- color: state.app.selectedAddress.color,
- nonce: state.app.selectedAddress.nonce,
- textColor: state.app.selectedAddress.textColor
- })
- }
- if (oldState.app.chatHeads !== state.app.chatHeads) {
- chatHeadsStateStream.emit(state.app.chatHeads)
- }
+ if (oldState.app.selectedAddress !== state.app.selectedAddress) {
+ selectedAddressStream.emit({
+ address: state.app.selectedAddress.address,
+ color: state.app.selectedAddress.color,
+ nonce: state.app.selectedAddress.nonce,
+ textColor: state.app.selectedAddress.textColor
+ })
+ }
- if (oldState.app.appInfo !== state.app.appInfo) {
- appInfoStateStream.emit(state.app.appInfo)
- }
- if (oldState.app.sideEffectAction !== state.app.sideEffectAction) {
- sideEffectActionStream.emit(state.app.sideEffectAction)
- }
- if(oldState.app.profileDataActionStream !== state.app.profileDataActionStream){
- profileDataActionStream.emit(state.app.profileData)
- }
- if (oldState.app.coinBalances !== state.app.coinBalances) {
- coinBalancesActionStream.emit(state.app.coinBalances)
- }
+ if (oldState.app.chatHeads !== state.app.chatHeads) {
+ chatHeadsStateStream.emit(state.app.chatHeads)
+ }
+ if (oldState.app.appInfo !== state.app.appInfo) {
+ appInfoStateStream.emit(state.app.appInfo)
+ }
+ if (oldState.app.sideEffectAction !== state.app.sideEffectAction) {
+ sideEffectActionStream.emit(state.app.sideEffectAction)
+ }
+ if (oldState.app.profileDataActionStream !== state.app.profileDataActionStream) {
+ profileDataActionStream.emit(state.app.profileData)
+ }
+ if (oldState.app.coinBalances !== state.app.coinBalances) {
+ coinBalancesActionStream.emit(state.app.coinBalances)
+ }
- oldState = state
-})
+ oldState = state
+})
\ No newline at end of file
diff --git a/core/src/redux/app/actions/app-core.js b/core/src/redux/app/actions/app-core.js
index 63f60ec8..20603501 100644
--- a/core/src/redux/app/actions/app-core.js
+++ b/core/src/redux/app/actions/app-core.js
@@ -25,207 +25,209 @@ import {
REMOVE_QAPP_FRIENDS_LIST,
ALLOW_SHOW_SYNC_INDICATOR,
REMOVE_SHOW_SYNC_INDICATOR
-} from '../app-action-types.js'
+} from '../app-action-types'
export const doUpdateBlockInfo = (blockObj) => {
- return (dispatch, getState) => {
- dispatch(updateBlock(blockObj))
- }
+ return (dispatch, getState) => {
+ dispatch(updateBlock(blockObj))
+ }
}
const updateBlock = (payload) => {
- return {
- type: UPDATE_BLOCK_INFO,
- payload
- }
+ return {
+ type: UPDATE_BLOCK_INFO,
+ payload
+ }
}
export const doUpdateNodeStatus = (nodeStatusObj) => {
- return (dispatch, getState) => {
- dispatch(updateNodeStatus(nodeStatusObj))
- }
+ return (dispatch, getState) => {
+ dispatch(updateNodeStatus(nodeStatusObj))
+ }
}
const updateNodeStatus = (payload) => {
- return {
- type: UPDATE_NODE_STATUS,
- payload
- }
+ return {
+ type: UPDATE_NODE_STATUS,
+ payload
+ }
}
export const doUpdateNodeInfo = (nodeInfoObj) => {
- return (dispatch, getState) => {
- dispatch(updateNodeInfo(nodeInfoObj))
- }
+ return (dispatch, getState) => {
+ dispatch(updateNodeInfo(nodeInfoObj))
+ }
}
const updateNodeInfo = (payload) => {
- return {
- type: UPDATE_NODE_INFO,
- payload
- }
+ return {
+ type: UPDATE_NODE_INFO,
+ payload
+ }
}
export const doSetChatHeads = (chatHeadsObj) => {
- return (dispatch, getState) => {
- dispatch(setChatHeads(chatHeadsObj))
- }
+ return (dispatch, getState) => {
+ dispatch(setChatHeads(chatHeadsObj))
+ }
}
const setChatHeads = (payload) => {
- return {
- type: CHAT_HEADS,
- payload
- }
+ return {
+ type: CHAT_HEADS,
+ payload
+ }
}
export const doUpdateAccountInfo = (appInfoObj) => {
- return (dispatch, getState) => {
- dispatch(updateAccountInfo(appInfoObj))
- }
+ return (dispatch, getState) => {
+ dispatch(updateAccountInfo(appInfoObj))
+ }
}
const updateAccountInfo = (payload) => {
- return {
- type: ACCOUNT_INFO,
- payload
- }
+ return {
+ type: ACCOUNT_INFO,
+ payload
+ }
}
export const addAutoLoadImageChat = (payload) => {
- return {
- type: ADD_AUTO_LOAD_IMAGES_CHAT,
- payload
- }
+ return {
+ type: ADD_AUTO_LOAD_IMAGES_CHAT,
+ payload
+ }
}
export const removeAutoLoadImageChat = (payload) => {
- return {
- type: REMOVE_AUTO_LOAD_IMAGES_CHAT,
- payload
- }
+ return {
+ type: REMOVE_AUTO_LOAD_IMAGES_CHAT,
+ payload
+ }
}
export const allowQAPPAutoAuth = (payload) => {
- return {
- type: ALLOW_QAPP_AUTO_AUTH,
- payload
- }
+ return {
+ type: ALLOW_QAPP_AUTO_AUTH,
+ payload
+ }
}
export const removeQAPPAutoAuth = (payload) => {
- return {
- type: REMOVE_QAPP_AUTO_AUTH,
- payload
- }
+ return {
+ type: REMOVE_QAPP_AUTO_AUTH,
+ payload
+ }
}
+
export const allowQAPPAutoLists = (payload) => {
- return {
- type: ALLOW_QAPP_AUTO_LISTS,
- payload
- }
+ return {
+ type: ALLOW_QAPP_AUTO_LISTS,
+ payload
+ }
}
export const removeQAPPAutoLists = (payload) => {
- return {
- type: REMOVE_QAPP_AUTO_LISTS,
- payload
- }
+ return {
+ type: REMOVE_QAPP_AUTO_LISTS,
+ payload
+ }
}
export const allowQAPPAutoFriendsList = (payload) => {
- return {
- type: ALLOW_QAPP_FRIENDS_LIST,
- payload
- }
+ return {
+ type: ALLOW_QAPP_FRIENDS_LIST,
+ payload
+ }
}
export const removeQAPPAutoFriendsList = (payload) => {
- return {
- type: REMOVE_QAPP_FRIENDS_LIST,
- payload
- }
+ return {
+ type: REMOVE_QAPP_FRIENDS_LIST,
+ payload
+ }
}
export const setChatLastSeen = (payload) => {
- return {
- type: SET_CHAT_LAST_SEEN,
- payload
- }
+ return {
+ type: SET_CHAT_LAST_SEEN,
+ payload
+ }
}
+
export const addChatLastSeen = (payload) => {
- return {
- type: ADD_CHAT_LAST_SEEN,
- payload
- }
+ return {
+ type: ADD_CHAT_LAST_SEEN,
+ payload
+ }
}
export const setNewTab = (payload) => {
- return {
- type: SET_NEW_TAB,
- payload
- }
+ return {
+ type: SET_NEW_TAB,
+ payload
+ }
}
export const setNewNotification = (payload) => {
- return {
- type: SET_NEW_NOTIFICATION,
- payload
- }
+ return {
+ type: SET_NEW_NOTIFICATION,
+ payload
+ }
}
export const setIsOpenDevDialog = (payload) => {
- return {
- type: IS_OPEN_DEV_DIALOG,
- payload
- }
+ return {
+ type: IS_OPEN_DEV_DIALOG,
+ payload
+ }
}
export const addTabInfo = (payload) => {
- return {
- type: ADD_TAB_INFO,
- payload
- }
+ return {
+ type: ADD_TAB_INFO,
+ payload
+ }
}
export const setTabNotifications = (payload) => {
- return {
- type: SET_TAB_NOTIFICATIONS,
- payload
- }
+ return {
+ type: SET_TAB_NOTIFICATIONS,
+ payload
+ }
}
-export const setSideEffectAction = (payload)=> {
- return {
- type: SET_SIDE_EFFECT,
- payload
- }
+export const setSideEffectAction = (payload) => {
+ return {
+ type: SET_SIDE_EFFECT,
+ payload
+ }
}
export const setProfileData = (payload) => {
- return {
- type: SET_PROFILE_DATA,
- payload
- }
+ return {
+ type: SET_PROFILE_DATA,
+ payload
+ }
}
export const setCoinBalances = (payload) => {
- return {
- type: SET_COIN_BALANCES,
- payload
- }
+ return {
+ type: SET_COIN_BALANCES,
+ payload
+ }
}
export const allowShowSyncIndicator = (payload) => {
- return {
- type: ALLOW_SHOW_SYNC_INDICATOR,
- payload
- }
+ return {
+ type: ALLOW_SHOW_SYNC_INDICATOR,
+ payload
+ }
}
export const removeShowSyncIndicator = (payload) => {
- return {
- type: REMOVE_SHOW_SYNC_INDICATOR,
- payload
- }
-}
+ return {
+ type: REMOVE_SHOW_SYNC_INDICATOR,
+ payload
+ }
+}
\ No newline at end of file
diff --git a/core/src/redux/app/actions/init-worker.js b/core/src/redux/app/actions/init-worker.js
index 3bdff3ee..3c880f36 100644
--- a/core/src/redux/app/actions/init-worker.js
+++ b/core/src/redux/app/actions/init-worker.js
@@ -1,31 +1,33 @@
-import {Epml} from '../../../epml.js'
-import {EpmlWorkerPlugin} from 'epml'
-
-import {INIT_WORKERS} from '../app-action-types.js'
+import { Epml } from '../../../epml'
+import { EpmlWorkerPlugin } from 'epml'
+import { INIT_WORKERS } from '../app-action-types'
Epml.registerPlugin(EpmlWorkerPlugin)
export const doInitWorkers = (numberOfWorkers, workerURL) => {
- const workers = []
- return (dispatch, getState) => {
- dispatch(initWorkers())
- try {
- for (let i = 0; i < numberOfWorkers; i++) {
- workers.push(new Epml({ type: 'WORKER', source: new Worker(workerURL) }))
- }
- Promise.all(workers.map(workerEpml => workerEpml.ready()))
- .then(() => {
- dispatch(initWorkers('success', workers))
- })
- } catch (e) {
- dispatch(initWorkers('error', e))
- }
- }
+ const workers = []
+
+ return (dispatch, getState) => {
+ dispatch(initWorkers())
+
+ try {
+ for (let i = 0; i < numberOfWorkers; i++) {
+ workers.push(new Epml({ type: 'WORKER', source: new Worker(workerURL) }))
+ }
+
+ Promise.all(workers.map(workerEpml => workerEpml.ready())).then(() => {
+ dispatch(initWorkers('success', workers))
+ })
+ } catch (e) {
+ dispatch(initWorkers('error', e))
+ }
+ }
}
+
const initWorkers = (status, payload) => {
- return {
- type: INIT_WORKERS,
- status,
- payload
- }
-}
+ return {
+ type: INIT_WORKERS,
+ status,
+ payload
+ }
+}
\ No newline at end of file
diff --git a/core/src/redux/app/actions/login.js b/core/src/redux/app/actions/login.js
index 0bb8b092..368d9dc8 100644
--- a/core/src/redux/app/actions/login.js
+++ b/core/src/redux/app/actions/login.js
@@ -1,43 +1,43 @@
-import {LOG_IN, LOG_OUT, SELECT_ADDRESS} from '../app-action-types.js'
+import { LOG_IN, LOG_OUT, SELECT_ADDRESS } from '../app-action-types'
export const doSelectAddress = address => {
- return (dispatch, getState) => {
- dispatch(selectAddress(address))
- }
+ return (dispatch, getState) => {
+ dispatch(selectAddress(address))
+ }
}
const selectAddress = address => {
- return {
- type: SELECT_ADDRESS,
- address
- }
+ return {
+ type: SELECT_ADDRESS,
+ address
+ }
}
export const doLogin = wallet => {
- return (dispatch, getState) => {
- dispatch(login('success', {
- wallet
- }))
- }
+ return (dispatch, getState) => {
+ dispatch(login('success', {
+ wallet
+ }))
+ }
}
const login = (status, payload) => {
- return {
- type: LOG_IN,
- status,
- payload
- }
+ return {
+ type: LOG_IN,
+ status,
+ payload
+ }
}
export const doLogout = () => {
- // THOUGHTS: Maybe add some checks for ongoing stuff...
- return (dispatch, getState) => {
- dispatch(logout())
- }
+ // THOUGHTS: Maybe add some checks for ongoing stuff...
+ return (dispatch, getState) => {
+ dispatch(logout())
+ }
}
const logout = () => {
- return {
- type: LOG_OUT
- }
-}
+ return {
+ type: LOG_OUT
+ }
+}
\ No newline at end of file
diff --git a/core/src/redux/app/actions/node-config.js b/core/src/redux/app/actions/node-config.js
index 1761239f..8eea91ce 100644
--- a/core/src/redux/app/actions/node-config.js
+++ b/core/src/redux/app/actions/node-config.js
@@ -1,120 +1,118 @@
// Node Config Actions here...
-import {ADD_NODE, EDIT_NODE, LOAD_NODE_CONFIG, REMOVE_NODE, SET_NODE} from '../app-action-types.js'
-import {UI_VERSION} from '../version.js'
+import { ADD_NODE, EDIT_NODE, LOAD_NODE_CONFIG, REMOVE_NODE, SET_NODE } from '../app-action-types'
+import { UI_VERSION } from '../version'
const nodeConfigUrl = '/getConfig'
-
const checkNodes = JSON.parse(localStorage.getItem('myQortalNodes'))
-
const checkMyNode = localStorage.getItem('mySelectedNode')
export const doLoadNodeConfig = () => {
+ return (dispatch, getState) => {
+ fetch(nodeConfigUrl).then(res => {
+ return res.json()
+ }).then(data => {
+ const nodeConfig = {
+ node: 0,
+ knownNodes: [{}],
+ version: ''
+ }
- return (dispatch, getState) => {
- fetch(nodeConfigUrl)
- .then(res => {
- return res.json()
- })
- .then(data => {
- const nodeConfig = {
- node: 0,
- knownNodes: [{}],
- version: ''
- }
+ if (checkMyNode === null || checkMyNode.length === 0) {
+ localStorage.setItem('mySelectedNode', 0)
+ nodeConfig.node = localStorage.getItem('mySelectedNode')
+ } else {
+ nodeConfig.node = localStorage.getItem('mySelectedNode')
+ }
- if (checkMyNode === null || checkMyNode.length === 0) {
- localStorage.setItem('mySelectedNode', 0)
- nodeConfig.node = localStorage.getItem('mySelectedNode')
- } else {
- nodeConfig.node = localStorage.getItem('mySelectedNode')
- }
+ if (checkNodes === null || checkNodes.length === 0) {
+ var saveNode = []
+ saveNode.push(obj1, obj2)
+ localStorage.setItem('myQortalNodes', JSON.stringify(saveNode))
+ nodeConfig.knownNodes = JSON.parse(localStorage.getItem('myQortalNodes'))
+ } else {
+ nodeConfig.knownNodes = JSON.parse(localStorage.getItem('myQortalNodes'))
+ }
- if (checkNodes === null || checkNodes.length === 0) {
- var saveNode = [];
- saveNode.push(obj1,obj2);
- localStorage.setItem('myQortalNodes', JSON.stringify(saveNode));
- nodeConfig.knownNodes = JSON.parse(localStorage.getItem('myQortalNodes'));
- } else{
- nodeConfig.knownNodes = JSON.parse(localStorage.getItem('myQortalNodes'));
- }
+ nodeConfig.version = UI_VERSION
- nodeConfig.version = UI_VERSION;
- return dispatch(loadNodeConfig(nodeConfig))
- })
- .catch(err => {
- console.error(err)
- })
- }
+ return dispatch(loadNodeConfig(nodeConfig))
+ }).catch(err => {
+ console.error(err)
+ })
+ }
}
const loadNodeConfig = (payload) => {
- return {
- type: LOAD_NODE_CONFIG,
- payload
- }
+ return {
+ type: LOAD_NODE_CONFIG,
+ payload
+ }
}
export const doSetNode = (nodeIndex) => {
- return (dispatch, getState) => {
- return dispatch(setNode(nodeIndex))
- }
+ return (dispatch, getState) => {
+ return dispatch(setNode(nodeIndex))
+ }
}
const setNode = (payload) => {
- return {
- type: SET_NODE,
- payload
- }
+ return {
+ type: SET_NODE,
+ payload
+ }
}
export const doAddNode = (nodeObject) => {
- return (dispatch, getState) => {
- return dispatch(addNode(nodeObject))
- }
+ return (dispatch, getState) => {
+ return dispatch(addNode(nodeObject))
+ }
}
+
export const doRemoveNode = (index) => {
- return (dispatch, getState) => {
- return dispatch(removeNode(index))
- }
+ return (dispatch, getState) => {
+ return dispatch(removeNode(index))
+ }
}
+
export const doEditNode = (index, nodeObject) => {
- return (dispatch, getState) => {
- return dispatch(editNode({index, nodeObject}))
- }
+ return (dispatch, getState) => {
+ return dispatch(editNode({ index, nodeObject }))
+ }
}
const addNode = (payload) => {
- return {
- type: ADD_NODE,
- payload
- }
+ return {
+ type: ADD_NODE,
+ payload
+ }
}
const editNode = (payload) => {
- return {
- type: EDIT_NODE,
- payload
- }
+ return {
+ type: EDIT_NODE,
+ payload
+ }
}
+
const removeNode = (payload) => {
- return {
- type: REMOVE_NODE,
- payload
- }
+ return {
+ type: REMOVE_NODE,
+ payload
+ }
}
+
const obj1 = {
- name: 'Local Node',
- protocol: 'http',
- domain: '127.0.0.1',
- port: 12391,
- enableManagement: true
+ name: 'Local Node',
+ protocol: 'http',
+ domain: '127.0.0.1',
+ port: 12391,
+ enableManagement: true
}
const obj2 = {
- name: 'Local Testnet',
- protocol: 'http',
- domain: '127.0.0.1',
- port: 62391,
- enableManagement: true
+ name: 'Local Testnet',
+ protocol: 'http',
+ domain: '127.0.0.1',
+ port: 62391,
+ enableManagement: true
}
-
diff --git a/core/src/redux/app/actions/plugins.js b/core/src/redux/app/actions/plugins.js
index e376befe..0386c2a6 100644
--- a/core/src/redux/app/actions/plugins.js
+++ b/core/src/redux/app/actions/plugins.js
@@ -1,40 +1,40 @@
-import {ADD_PLUGIN, ADD_PLUGIN_URL, PAGE_URL} from '../app-action-types.js'
+import { ADD_PLUGIN, ADD_PLUGIN_URL, PAGE_URL } from '../app-action-types'
export const doAddPluginUrl = (pluginUrlsConf) => {
- return (dispatch, getState) => {
- dispatch(addPluginUrl(pluginUrlsConf))
- }
+ return (dispatch, getState) => {
+ dispatch(addPluginUrl(pluginUrlsConf))
+ }
}
const addPluginUrl = (payload) => {
- return {
- type: ADD_PLUGIN_URL,
- payload
- }
+ return {
+ type: ADD_PLUGIN_URL,
+ payload
+ }
}
export const doAddPlugin = (epmlInstance) => {
- return (dispatch, getState) => {
- dispatch(addPlugin(epmlInstance))
- }
+ return (dispatch, getState) => {
+ dispatch(addPlugin(epmlInstance))
+ }
}
const addPlugin = (payload) => {
- return {
- type: ADD_PLUGIN,
- payload
- }
+ return {
+ type: ADD_PLUGIN,
+ payload
+ }
}
export const doPageUrl = (pageUrl) => {
- return (dispatch, getState) => {
- dispatch(myPageUrl(pageUrl))
- }
+ return (dispatch, getState) => {
+ dispatch(myPageUrl(pageUrl))
+ }
}
const myPageUrl = (payload) => {
- return {
- type: PAGE_URL,
- payload
- }
-}
+ return {
+ type: PAGE_URL,
+ payload
+ }
+}
\ No newline at end of file
diff --git a/core/src/redux/app/app-action-types.js b/core/src/redux/app/app-action-types.js
index 212d9148..9f03cc71 100644
--- a/core/src/redux/app/app-action-types.js
+++ b/core/src/redux/app/app-action-types.js
@@ -38,4 +38,4 @@ export const SET_COIN_BALANCES = 'SET_COIN_BALANCES'
export const ALLOW_QAPP_FRIENDS_LIST = 'ALLOW_QAPP_FRIENDS_LIST'
export const REMOVE_QAPP_FRIENDS_LIST = 'REMOVE_QAPP_FRIENDS_LIST'
export const ALLOW_SHOW_SYNC_INDICATOR = 'ALLOW_SHOW_SYNC_INDICATOR'
-export const REMOVE_SHOW_SYNC_INDICATOR = 'REMOVE_SHOW_SYNC_INDICATOR'
+export const REMOVE_SHOW_SYNC_INDICATOR = 'REMOVE_SHOW_SYNC_INDICATOR'
\ No newline at end of file
diff --git a/core/src/redux/app/app-actions.js b/core/src/redux/app/app-actions.js
index 3dea965a..be3713ed 100644
--- a/core/src/redux/app/app-actions.js
+++ b/core/src/redux/app/app-actions.js
@@ -1,29 +1,27 @@
-import {NAVIGATE, NETWORK_CONNECTION_STATUS} from './app-action-types.js'
+import { NAVIGATE, NETWORK_CONNECTION_STATUS } from './app-action-types'
-export * from './actions/login.js'
-export * from './actions/init-worker.js'
-export * from './actions/plugins.js'
-export * from './actions/app-core.js'
-export * from './actions/node-config.js'
+export * from './actions/login'
+export * from './actions/init-worker'
+export * from './actions/plugins'
+export * from './actions/app-core'
+export * from './actions/node-config'
export const doNavigate = loca => {
- return (dispatch, getState) => {
- dispatch(navigate(loca))
- }
+ return (dispatch, getState) => {
+ dispatch(navigate(loca))
+ }
}
const navigate = loca => {
-
- return {
- type: NAVIGATE,
- url: loca.pathname
- }
+ return {
+ type: NAVIGATE,
+ url: loca.pathname
+ }
}
export const updateNetworkConnectionStatus = status => {
-
- return {
- type: NETWORK_CONNECTION_STATUS,
- payload: status
- }
-}
+ return {
+ type: NETWORK_CONNECTION_STATUS,
+ payload: status
+ }
+}
\ No newline at end of file
diff --git a/core/src/redux/app/app-reducer.js b/core/src/redux/app/app-reducer.js
index f4d96981..ff108675 100644
--- a/core/src/redux/app/app-reducer.js
+++ b/core/src/redux/app/app-reducer.js
@@ -1,5 +1,5 @@
// Loading state, login state, isNavDrawOpen state etc. None of this needs to be saved to localstorage.
-import {loadStateFromLocalStorage, saveStateToLocalStorage} from '../../localStorageHelpers.js'
+import { loadStateFromLocalStorage, saveStateToLocalStorage } from '../../localStorageHelpers'
import {
ACCOUNT_INFO,
ADD_AUTO_LOAD_IMAGES_CHAT,
@@ -41,361 +41,396 @@ import {
REMOVE_QAPP_FRIENDS_LIST,
ALLOW_SHOW_SYNC_INDICATOR,
REMOVE_SHOW_SYNC_INDICATOR
-} from './app-action-types.js'
-import {initWorkersReducer} from './reducers/init-workers.js'
-import {loginReducer} from './reducers/login-reducer.js'
-import {addNode, editNode, removeNode, setNode} from './reducers/manage-node.js'
-import localForage from "localforage";
+} from './app-action-types'
+import { initWorkersReducer } from './reducers/init-workers'
+import { loginReducer } from './reducers/login-reducer'
+import { addNode, editNode, removeNode, setNode } from './reducers/manage-node'
+import localForage from "localforage"
const chatLastSeen = localForage.createInstance({
- name: "chat-last-seen",
-});
+ name: 'chat-last-seen'
+})
const INITIAL_STATE = {
- loggedIn: false,
- drawerOpen: false,
- workers: {
- workers: [],
- ready: false,
- loading: false
- },
- wallet: {
- addresses: [
- {
- address: ''
- }
- ]
- },
- nodeConfig: {
- node: 0,
- knownNodes: [{}],
- version: ''
- },
- plugins: [],
- registeredUrls: [],
- accountInfo: {
- names: [],
- addressInfo: {}
- },
- url: '',
- selectedAddress: {},
- chatHeads: {},
- blockInfo: {},
- nodeInfo: {},
- nodeStatus: {},
- pageUrl: '',
- autoLoadImageChats: loadStateFromLocalStorage('autoLoadImageChats') || [],
- qAPPAutoAuth: loadStateFromLocalStorage('qAPPAutoAuth') || false,
- qAPPAutoLists: loadStateFromLocalStorage('qAPPAutoLists') || false,
- qAPPFriendsList: loadStateFromLocalStorage('qAPPFriendsList') || false,
- showSyncIndicator: loadStateFromLocalStorage('showSyncIndicator') || false,
- chatLastSeen: [],
- newTab: null,
- tabInfo: {},
- isOpenDevDialog: false,
- newNotification: null,
- sideEffectAction: null,
- profileData: null,
- coinBalances: {}
+ loggedIn: false,
+ drawerOpen: false,
+ workers: {
+ workers: [],
+ ready: false,
+ loading: false
+ },
+ wallet: {
+ addresses: [
+ {
+ address: ''
+ }
+ ]
+ },
+ nodeConfig: {
+ node: 0,
+ knownNodes: [{}],
+ version: ''
+ },
+ plugins: [],
+ registeredUrls: [],
+ accountInfo: {
+ names: [],
+ addressInfo: {}
+ },
+ url: '',
+ selectedAddress: {},
+ chatHeads: {},
+ blockInfo: {},
+ nodeInfo: {},
+ nodeStatus: {},
+ pageUrl: '',
+ autoLoadImageChats: loadStateFromLocalStorage('autoLoadImageChats') || [],
+ qAPPAutoAuth: loadStateFromLocalStorage('qAPPAutoAuth') || false,
+ qAPPAutoLists: loadStateFromLocalStorage('qAPPAutoLists') || false,
+ qAPPFriendsList: loadStateFromLocalStorage('qAPPFriendsList') || false,
+ showSyncIndicator: loadStateFromLocalStorage('showSyncIndicator') || false,
+ chatLastSeen: [],
+ newTab: null,
+ tabInfo: {},
+ isOpenDevDialog: false,
+ newNotification: null,
+ sideEffectAction: null,
+ profileData: null,
+ coinBalances: {}
}
export default (state = INITIAL_STATE, action) => {
- switch (action.type) {
- case INIT_WORKERS:
- return initWorkersReducer(state, action)
- case LOG_IN:
- return loginReducer(state, action)
- case LOG_OUT:
- return {
- ...state,
- pin: '',
- loggedIn: false,
- loggingIn: false,
- wallet: INITIAL_STATE.wallet,
- selectedAddress: INITIAL_STATE.selectedAddress,
- accountInfo: INITIAL_STATE.accountInfo
+ switch (action.type) {
+ case INIT_WORKERS:
+ return initWorkersReducer(state, action)
- }
- case ADD_PLUGIN:
- return {
- ...state,
- plugins: [
- ...state.plugins,
- action.payload
- ]
- }
- case ADD_PLUGIN_URL:
- return {
- ...state,
- registeredUrls: action.payload
- }
- case ADD_NEW_PLUGIN_URL: // TODO: Will be used in to add new plugins in future...
- return {
- ...state,
- registeredUrls: state.registeredUrls.concat(action.payload)
- }
- case CHAT_HEADS:
- return {
- ...state,
- chatHeads: action.payload
- }
- case UPDATE_BLOCK_INFO:
- return {
- ...state,
- blockInfo: action.payload
- }
- case UPDATE_NODE_STATUS:
- return {
- ...state,
- nodeStatus: action.payload
- }
- case UPDATE_NODE_INFO:
- return {
- ...state,
- nodeInfo: action.payload
- }
- case ACCOUNT_INFO:
- return {
- ...state,
- accountInfo: action.payload
- }
- case LOAD_NODE_CONFIG:
- return {
- ...state,
- nodeConfig: action.payload
- }
- case SET_NODE:
- return setNode(state, action)
- case ADD_NODE:
- return addNode(state, action)
- case EDIT_NODE:
- return editNode(state, action)
- case REMOVE_NODE:
- return removeNode(state, action)
- case PAGE_URL:
- return {
- ...state,
- pageUrl: action.payload
- }
- case NAVIGATE:
- return {
- ...state,
- url: action.url
- }
- case SELECT_ADDRESS:
- return {
- ...state,
- selectedAddress: action.address
- }
- case NETWORK_CONNECTION_STATUS:
- return {
- ...state,
- networkIsConnected: action.payload
- }
- case ADD_AUTO_LOAD_IMAGES_CHAT: {
- const findChat = state.autoLoadImageChats.findIndex((chat) => chat === action.payload)
+ case LOG_IN:
+ return loginReducer(state, action)
- if (findChat !== -1) return state
- const updatedState = [...state.autoLoadImageChats, action.payload]
+ case LOG_OUT:
+ return {
+ ...state,
+ pin: '',
+ loggedIn: false,
+ loggingIn: false,
+ wallet: INITIAL_STATE.wallet,
+ selectedAddress: INITIAL_STATE.selectedAddress,
+ accountInfo: INITIAL_STATE.accountInfo
- saveStateToLocalStorage('autoLoadImageChats', updatedState)
- return {
- ...state,
- autoLoadImageChats: updatedState
- }
- }
+ }
- case REMOVE_AUTO_LOAD_IMAGES_CHAT: {
- const updatedState = state.autoLoadImageChats.filter((chat) => chat !== action.payload)
- saveStateToLocalStorage('autoLoadImageChats', updatedState)
- return {
- ...state,
- autoLoadImageChats: updatedState
- }
- }
+ case ADD_PLUGIN:
+ return {
+ ...state,
+ plugins: [
+ ...state.plugins,
+ action.payload
+ ]
+ }
- case ALLOW_QAPP_AUTO_AUTH: {
- saveStateToLocalStorage("qAPPAutoAuth", true)
- return {
- ...state,
- qAPPAutoAuth: action.payload
- }
- }
+ case ADD_PLUGIN_URL:
+ return {
+ ...state,
+ registeredUrls: action.payload
+ }
- case REMOVE_QAPP_AUTO_AUTH: {
- saveStateToLocalStorage("qAPPAutoAuth", false)
- return {
- ...state,
- qAPPAutoAuth: action.payload
- }
- }
+ case ADD_NEW_PLUGIN_URL: // TODO: Will be used in to add new plugins in future...
+ return {
+ ...state,
+ registeredUrls: state.registeredUrls.concat(action.payload)
+ }
- case ALLOW_QAPP_AUTO_LISTS: {
- saveStateToLocalStorage("qAPPAutoLists", true)
- return {
- ...state,
- qAPPAutoLists: action.payload
- }
- }
+ case CHAT_HEADS:
+ return {
+ ...state,
+ chatHeads: action.payload
+ }
- case REMOVE_QAPP_AUTO_LISTS: {
- saveStateToLocalStorage("qAPPAutoLists", false)
- return {
- ...state,
- qAPPAutoLists: action.payload
- }
- }
+ case UPDATE_BLOCK_INFO:
+ return {
+ ...state,
+ blockInfo: action.payload
+ }
- case ALLOW_QAPP_FRIENDS_LIST: {
- saveStateToLocalStorage("qAPPFriendsList", true)
- return {
- ...state,
- qAPPFriendsList: action.payload
- }
- }
+ case UPDATE_NODE_STATUS:
+ return {
+ ...state,
+ nodeStatus: action.payload
+ }
- case REMOVE_QAPP_FRIENDS_LIST: {
- saveStateToLocalStorage("qAPPFriendsList", false)
- return {
- ...state,
- qAPPFriendsList: action.payload
- }
- }
+ case UPDATE_NODE_INFO:
+ return {
+ ...state,
+ nodeInfo: action.payload
+ }
- case SET_CHAT_LAST_SEEN: {
- return {
- ...state,
- chatLastSeen: action.payload
- }
- }
+ case ACCOUNT_INFO:
+ return {
+ ...state,
+ accountInfo: action.payload
+ }
- case ADD_CHAT_LAST_SEEN: {
- const chatId = action.payload.key
- const timestamp = action.payload.timestamp
- if (!chatId || !timestamp) return state
- let newChatLastSeen = [...state.chatLastSeen]
- const findChatIndex = state.chatLastSeen.findIndex((chat) => chat.key === chatId)
- if (findChatIndex !== -1) {
+ case LOAD_NODE_CONFIG:
+ return {
+ ...state,
+ nodeConfig: action.payload
+ }
- newChatLastSeen[findChatIndex] = {
- key: chatId,
- timestamp,
- }
- }
- if (findChatIndex === -1) {
+ case SET_NODE:
+ return setNode(state, action)
- newChatLastSeen = [...newChatLastSeen, {
- key: chatId,
- timestamp,
- }]
- }
- chatLastSeen.setItem(chatId, timestamp)
- return {
- ...state,
- chatLastSeen: newChatLastSeen
- }
- }
+ case ADD_NODE:
+ return addNode(state, action)
- case SET_NEW_TAB: {
- return {
- ...state,
- newTab: action.payload
- }
- }
+ case EDIT_NODE:
+ return editNode(state, action)
- case IS_OPEN_DEV_DIALOG: {
- return {
- ...state,
- isOpenDevDialog: action.payload
- }
- }
+ case REMOVE_NODE:
+ return removeNode(state, action)
- case ADD_TAB_INFO: {
- const newTabInfo = action.payload
- if (state.tabInfo[newTabInfo.id] && state.tabInfo[newTabInfo.id].name && newTabInfo.name === state.tabInfo[newTabInfo.id].name) break
- return {
- ...state,
- tabInfo: {
- ...state.tabInfo,
- [newTabInfo.id]: {
- ...newTabInfo,
- count: 0
- }
- }
- }
- }
+ case PAGE_URL:
+ return {
+ ...state,
+ pageUrl: action.payload
+ }
- case SET_TAB_NOTIFICATIONS: {
- const count = action.payload.count
- const name = action.payload.name
- const newTabInfo = {}
- Object.keys(state.tabInfo).forEach((key) => {
- const tab = state.tabInfo[key]
- if (tab.name == name) {
- newTabInfo[key] = {
- ...tab,
- count
- }
- } else {
- newTabInfo[key] = tab
- }
- })
- return {
- ...state,
- tabInfo: newTabInfo
- }
- }
+ case NAVIGATE:
+ return {
+ ...state,
+ url: action.url
+ }
- case SET_NEW_NOTIFICATION: {
- return {
- ...state,
- newNotification: action.payload
- }
- }
+ case SELECT_ADDRESS:
+ return {
+ ...state,
+ selectedAddress: action.address
+ }
- case SET_SIDE_EFFECT: {
- return {
- ...state,
- sideEffectAction: action.payload
- }
- }
+ case NETWORK_CONNECTION_STATUS:
+ return {
+ ...state,
+ networkIsConnected: action.payload
+ }
- case SET_PROFILE_DATA: {
- return {
- ...state,
- profileData: action.payload
- }
- }
+ case ADD_AUTO_LOAD_IMAGES_CHAT: {
+ const findChat = state.autoLoadImageChats.findIndex((chat) => chat === action.payload)
- case SET_COIN_BALANCES: {
- const copyBalances = {...state.coinBalances}
- copyBalances[action.payload.type] = {
- value: action.payload.value,
- fullValue: action.payload.fullValue
- }
- return {
- ...state,
- coinBalances: copyBalances
- }
- }
+ if (findChat !== -1) return state
- case ALLOW_SHOW_SYNC_INDICATOR: {
- saveStateToLocalStorage("showSyncIndicator", true)
- return {
- ...state,
- showSyncIndicator: action.payload
- }
- }
+ const updatedState = [...state.autoLoadImageChats, action.payload]
- case REMOVE_SHOW_SYNC_INDICATOR: {
- saveStateToLocalStorage("showSyncIndicator", false)
- return {
- ...state,
- showSyncIndicator: action.payload
- }
- }
+ saveStateToLocalStorage('autoLoadImageChats', updatedState)
+ return {
+ ...state,
+ autoLoadImageChats: updatedState
+ }
+ }
- default:
- return state
- }
-}
+ case REMOVE_AUTO_LOAD_IMAGES_CHAT: {
+ const updatedState = state.autoLoadImageChats.filter((chat) => chat !== action.payload)
+ saveStateToLocalStorage('autoLoadImageChats', updatedState)
+ return {
+ ...state,
+ autoLoadImageChats: updatedState
+ }
+ }
+
+ case ALLOW_QAPP_AUTO_AUTH: {
+ saveStateToLocalStorage("qAPPAutoAuth", true)
+ return {
+ ...state,
+ qAPPAutoAuth: action.payload
+ }
+ }
+
+ case REMOVE_QAPP_AUTO_AUTH: {
+ saveStateToLocalStorage("qAPPAutoAuth", false)
+ return {
+ ...state,
+ qAPPAutoAuth: action.payload
+ }
+ }
+
+ case ALLOW_QAPP_AUTO_LISTS: {
+ saveStateToLocalStorage("qAPPAutoLists", true)
+ return {
+ ...state,
+ qAPPAutoLists: action.payload
+ }
+ }
+
+ case REMOVE_QAPP_AUTO_LISTS: {
+ saveStateToLocalStorage("qAPPAutoLists", false)
+ return {
+ ...state,
+ qAPPAutoLists: action.payload
+ }
+ }
+
+ case ALLOW_QAPP_FRIENDS_LIST: {
+ saveStateToLocalStorage("qAPPFriendsList", true)
+ return {
+ ...state,
+ qAPPFriendsList: action.payload
+ }
+ }
+
+ case REMOVE_QAPP_FRIENDS_LIST: {
+ saveStateToLocalStorage("qAPPFriendsList", false)
+ return {
+ ...state,
+ qAPPFriendsList: action.payload
+ }
+ }
+
+ case SET_CHAT_LAST_SEEN: {
+ return {
+ ...state,
+ chatLastSeen: action.payload
+ }
+ }
+
+ case ADD_CHAT_LAST_SEEN: {
+ const chatId = action.payload.key
+ const timestamp = action.payload.timestamp
+
+ if (!chatId || !timestamp) return state
+
+ let newChatLastSeen = [...state.chatLastSeen]
+
+ const findChatIndex = state.chatLastSeen.findIndex((chat) => chat.key === chatId)
+
+ if (findChatIndex !== -1) {
+ newChatLastSeen[findChatIndex] = {
+ key: chatId,
+ timestamp
+ }
+ }
+
+ if (findChatIndex === -1) {
+ newChatLastSeen = [...newChatLastSeen, {
+ key: chatId,
+ timestamp
+ }]
+ }
+
+ chatLastSeen.setItem(chatId, timestamp)
+
+ return {
+ ...state,
+ chatLastSeen: newChatLastSeen
+ }
+ }
+
+ case SET_NEW_TAB: {
+ return {
+ ...state,
+ newTab: action.payload
+ }
+ }
+
+ case IS_OPEN_DEV_DIALOG: {
+ return {
+ ...state,
+ isOpenDevDialog: action.payload
+ }
+ }
+
+ case ADD_TAB_INFO: {
+ const newTabInfo = action.payload
+
+ if (state.tabInfo[newTabInfo.id] && state.tabInfo[newTabInfo.id].name && newTabInfo.name === state.tabInfo[newTabInfo.id].name) break
+
+ return {
+ ...state,
+ tabInfo: {
+ ...state.tabInfo,
+ [newTabInfo.id]: {
+ ...newTabInfo,
+ count: 0
+ }
+ }
+ }
+ }
+
+ case SET_TAB_NOTIFICATIONS: {
+ const count = action.payload.count
+ const name = action.payload.name
+ const newTabInfo = {}
+
+ Object.keys(state.tabInfo).forEach((key) => {
+ const tab = state.tabInfo[key]
+
+ if (tab.name == name) {
+ newTabInfo[key] = {
+ ...tab,
+ count
+ }
+ } else {
+ newTabInfo[key] = tab
+ }
+ })
+
+ return {
+ ...state,
+ tabInfo: newTabInfo
+ }
+ }
+
+ case SET_NEW_NOTIFICATION: {
+ return {
+ ...state,
+ newNotification: action.payload
+ }
+ }
+
+ case SET_SIDE_EFFECT: {
+ return {
+ ...state,
+ sideEffectAction: action.payload
+ }
+ }
+
+ case SET_PROFILE_DATA: {
+ return {
+ ...state,
+ profileData: action.payload
+ }
+ }
+
+ case SET_COIN_BALANCES: {
+ const copyBalances = { ...state.coinBalances }
+
+ copyBalances[action.payload.type] = {
+ value: action.payload.value,
+ fullValue: action.payload.fullValue
+ }
+
+ return {
+ ...state,
+ coinBalances: copyBalances
+ }
+ }
+
+ case ALLOW_SHOW_SYNC_INDICATOR: {
+ saveStateToLocalStorage("showSyncIndicator", true)
+
+ return {
+ ...state,
+ showSyncIndicator: action.payload
+ }
+ }
+
+ case REMOVE_SHOW_SYNC_INDICATOR: {
+ saveStateToLocalStorage("showSyncIndicator", false)
+
+ return {
+ ...state,
+ showSyncIndicator: action.payload
+ }
+ }
+
+ default:
+ return state
+ }
+}
\ No newline at end of file
diff --git a/core/src/redux/app/reducers/init-workers.js b/core/src/redux/app/reducers/init-workers.js
index 993cd261..88f73f02 100644
--- a/core/src/redux/app/reducers/init-workers.js
+++ b/core/src/redux/app/reducers/init-workers.js
@@ -1,32 +1,34 @@
export const initWorkersReducer = (state, action) => {
- switch (action.status) {
- case 'success':
- return {
- ...state,
- workers: {
- workers: action.payload,
- ready: true,
- loading: false
- }
- }
- case 'error':
- return {
- ...state,
- workers: {
- ...state.workers,
- ready: false,
- loading: false,
- lastError: action.payload
- }
- }
- default:
- return {
- ...state,
- workers: {
- ...state.workers,
- // ready: true,
- loading: true
- }
- }
- }
-}
+ switch (action.status) {
+ case 'success':
+ return {
+ ...state,
+ workers: {
+ workers: action.payload,
+ ready: true,
+ loading: false
+ }
+ }
+
+ case 'error':
+ return {
+ ...state,
+ workers: {
+ ...state.workers,
+ ready: false,
+ loading: false,
+ lastError: action.payload
+ }
+ }
+
+ default:
+ return {
+ ...state,
+ workers: {
+ ...state.workers,
+ // ready: true,
+ loading: true
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/core/src/redux/app/reducers/login-reducer.js b/core/src/redux/app/reducers/login-reducer.js
index 2a50f20a..e5694857 100644
--- a/core/src/redux/app/reducers/login-reducer.js
+++ b/core/src/redux/app/reducers/login-reducer.js
@@ -1,22 +1,24 @@
export const loginReducer = (state, action) => {
- switch (action.status) {
- case 'success':
- return {
- ...state,
- wallet: action.payload.wallet,
- loggedIn: true,
- loggingIn: false
- }
- case 'error':
- return {
- ...state,
- loggedIn: false,
- loggingIn: false
- }
- default:
- return {
- ...state,
- loggingIn: true
- }
- }
-}
+ switch (action.status) {
+ case 'success':
+ return {
+ ...state,
+ wallet: action.payload.wallet,
+ loggedIn: true,
+ loggingIn: false
+ }
+
+ case 'error':
+ return {
+ ...state,
+ loggedIn: false,
+ loggingIn: false
+ }
+
+ default:
+ return {
+ ...state,
+ loggingIn: true
+ }
+ }
+}
\ No newline at end of file
diff --git a/core/src/redux/app/reducers/manage-node.js b/core/src/redux/app/reducers/manage-node.js
index 4e42f01f..38bb6373 100644
--- a/core/src/redux/app/reducers/manage-node.js
+++ b/core/src/redux/app/reducers/manage-node.js
@@ -1,45 +1,48 @@
export const setNode = (state, action) => {
- return {
- ...state,
- nodeConfig: {
- ...state.nodeConfig,
- node: action.payload
- }
- }
+ return {
+ ...state,
+ nodeConfig: {
+ ...state.nodeConfig,
+ node: action.payload
+ }
+ }
}
export const addNode = (state, action) => {
- return {
- ...state,
- nodeConfig: {
- ...state.nodeConfig,
- knownNodes: [
- ...state.nodeConfig.knownNodes,
- action.payload
- ]
- }
- }
+ return {
+ ...state,
+ nodeConfig: {
+ ...state.nodeConfig,
+ knownNodes: [
+ ...state.nodeConfig.knownNodes,
+ action.payload
+ ]
+ }
+ }
}
export const editNode = (state, action) => {
- const copyKnownNodes = [...state.nodeConfig.knownNodes]
- copyKnownNodes[action.payload.index] = action.payload.nodeObject
- return {
- ...state,
- nodeConfig: {
- ...state.nodeConfig,
- knownNodes: copyKnownNodes
- }
- }
+ const copyKnownNodes = [...state.nodeConfig.knownNodes]
+ copyKnownNodes[action.payload.index] = action.payload.nodeObject
+
+ return {
+ ...state,
+ nodeConfig: {
+ ...state.nodeConfig,
+ knownNodes: copyKnownNodes
+ }
+ }
}
+
export const removeNode = (state, action) => {
- const copyKnownNodes = [...state.nodeConfig.knownNodes]
- copyKnownNodes.splice(action.payload, 1);
- return {
- ...state,
- nodeConfig: {
- ...state.nodeConfig,
- knownNodes: copyKnownNodes
- }
- }
-}
+ const copyKnownNodes = [...state.nodeConfig.knownNodes]
+ copyKnownNodes.splice(action.payload, 1)
+
+ return {
+ ...state,
+ nodeConfig: {
+ ...state.nodeConfig,
+ knownNodes: copyKnownNodes
+ }
+ }
+}
\ No newline at end of file
diff --git a/core/src/redux/config/config-actions.js b/core/src/redux/config/config-actions.js
index c8a0a2de..11fb5f3d 100644
--- a/core/src/redux/config/config-actions.js
+++ b/core/src/redux/config/config-actions.js
@@ -3,23 +3,25 @@ export const LOAD_CONFIG_FROM_API = 'LOAD_CONFIG_FROM_API'
const configUrl = '/getConfig'
export const doLoadConfigFromAPI = () => {
- return (dispatch, getState) => {
- if (getState().config.loaded) return dispatch(loadConfigFromAPI('success'))
- dispatch(loadConfigFromAPI())
- fetch(configUrl)
- .then(res => res.json())
- .then(data => dispatch(loadConfigFromAPI('success', data.config)))
- .catch(err => {
- console.error(err)
- dispatch(loadConfigFromAPI('error', err))
- })
- }
+ return (dispatch, getState) => {
+ if (getState().config.loaded) return dispatch(loadConfigFromAPI('success'))
+
+ dispatch(loadConfigFromAPI())
+
+ fetch(configUrl)
+ .then(res => res.json())
+ .then(data => dispatch(loadConfigFromAPI('success', data.config)))
+ .catch(err => {
+ console.error(err)
+ dispatch(loadConfigFromAPI('error', err))
+ })
+ }
}
const loadConfigFromAPI = (status, payload) => {
- return {
- type: LOAD_CONFIG_FROM_API,
- status,
- payload
- }
-}
+ return {
+ type: LOAD_CONFIG_FROM_API,
+ status,
+ payload
+ }
+}
\ No newline at end of file
diff --git a/core/src/redux/config/config-reducer.js b/core/src/redux/config/config-reducer.js
index 81900681..290888f5 100644
--- a/core/src/redux/config/config-reducer.js
+++ b/core/src/redux/config/config-reducer.js
@@ -1,35 +1,35 @@
// Must be saved to localstorage. Will storage things such as saved addresses and themes (day/night mode) etc.
// Initial state needs to be loaded from either the getConfig url or localstorage...NOT set via this
-import {loadStateFromLocalStorage} from '../../localStorageHelpers'
-import {LOAD_CONFIG_FROM_API} from './config-actions.js'
-import {loadConfigFromAPI} from './reducers/load-config-from-api.js'
+import { loadStateFromLocalStorage } from '../../localStorageHelpers'
+import { LOAD_CONFIG_FROM_API } from './config-actions'
+import { loadConfigFromAPI } from './reducers/load-config-from-api'
const DEFAULT_INITIAL_STATE = {
- styles: {
- breakpoints: {},
- theme: {
- color: 'green',
- colors: {}
- }
- },
- coin: {
- name: ''
- },
- user: {
- language: 'english',
- server: {},
- node: 0,
- knownNodes: [{}]
- },
- savedWallets: {},
- loaded: false
+ styles: {
+ breakpoints: {},
+ theme: {
+ color: 'green',
+ colors: {}
+ }
+ },
+ coin: {
+ name: ''
+ },
+ user: {
+ language: 'english',
+ server: {},
+ node: 0,
+ knownNodes: [{}]
+ },
+ savedWallets: {},
+ loaded: false
}
export default (state = loadStateFromLocalStorage('config') || DEFAULT_INITIAL_STATE, action) => {
- switch (action.type) {
- case LOAD_CONFIG_FROM_API:
- return loadConfigFromAPI(state, action)
- default:
- return state
- }
-}
+ switch (action.type) {
+ case LOAD_CONFIG_FROM_API:
+ return loadConfigFromAPI(state, action)
+ default:
+ return state
+ }
+}
\ No newline at end of file
diff --git a/core/src/redux/config/reducers/load-config-from-api.js b/core/src/redux/config/reducers/load-config-from-api.js
index 10add38b..b76d4f99 100644
--- a/core/src/redux/config/reducers/load-config-from-api.js
+++ b/core/src/redux/config/reducers/load-config-from-api.js
@@ -1,22 +1,22 @@
export const loadConfigFromAPI = (state, action) => {
- switch (action.status) {
- case 'success':
- return {
- ...action.payload,
- loaded: true,
- loading: false
- }
- case 'error':
- return {
- ...state,
- loaded: false,
- loading: false,
- loadingError: action.payload
- }
- default:
- return {
- ...state,
- loading: true
- }
- }
-}
+ switch (action.status) {
+ case 'success':
+ return {
+ ...action.payload,
+ loaded: true,
+ loading: false
+ }
+ case 'error':
+ return {
+ ...state,
+ loaded: false,
+ loading: false,
+ loadingError: action.payload
+ }
+ default:
+ return {
+ ...state,
+ loading: true
+ }
+ }
+}
\ No newline at end of file
diff --git a/core/src/redux/reducers.js b/core/src/redux/reducers.js
index 8e444b29..3e6beca4 100644
--- a/core/src/redux/reducers.js
+++ b/core/src/redux/reducers.js
@@ -1,11 +1,10 @@
import { combineReducers } from 'redux'
-
-import app from './app/app-reducer.js'
-import config from './config/config-reducer.js'
-import user from './user/user-reducer.js'
+import app from './app/app-reducer'
+import config from './config/config-reducer'
+import user from './user/user-reducer'
export default combineReducers({
- user,
- app,
- config
+ user,
+ app,
+ config
})
\ No newline at end of file
diff --git a/core/src/redux/user/actions/claim-airdrop.js b/core/src/redux/user/actions/claim-airdrop.js
index d94b5fe1..4ba16ac6 100644
--- a/core/src/redux/user/actions/claim-airdrop.js
+++ b/core/src/redux/user/actions/claim-airdrop.js
@@ -1,14 +1,14 @@
-import {CLAIM_AIRDROP} from '../user-action-types.js'
+import { CLAIM_AIRDROP } from '../user-action-types'
export const doClaimAirdrop = (address) => {
- return (dispatch, getState) => {
- dispatch(claimAidrop())
- }
+ return (dispatch, getState) => {
+ dispatch(claimAidrop())
+ }
}
const claimAidrop = (payload) => {
- return {
- type: CLAIM_AIRDROP,
- payload
- }
-}
+ return {
+ type: CLAIM_AIRDROP,
+ payload
+ }
+}
\ No newline at end of file
diff --git a/core/src/redux/user/actions/notification-config.js b/core/src/redux/user/actions/notification-config.js
index 71a62b2b..fb8097f6 100644
--- a/core/src/redux/user/actions/notification-config.js
+++ b/core/src/redux/user/actions/notification-config.js
@@ -1,54 +1,43 @@
-import {LOAD_NOTIFICATION_CONFIG, SET_QCHAT_NOTIFICATION_CONFIG} from '../user-action-types.js'
+import { LOAD_NOTIFICATION_CONFIG, SET_QCHAT_NOTIFICATION_CONFIG } from '../user-action-types'
const configUrl = '/getConfig'
export const doLoadNotificationConfig = () => {
-
- return (dispatch, getState) => {
-
- fetch(configUrl)
- .then(res => {
- return res.json()
- })
- .then(data => {
-
- const notifications = {
- q_chat: {}
- }
- notifications.q_chat = data.config.user.notifications.q_chat
- return dispatch(loadNotificationConfig(notifications))
- })
- .catch(err => {
- console.error(err)
- })
- }
+ return (dispatch, getState) => {
+ fetch(configUrl).then(res => {
+ return res.json()
+ }).then(data => {
+ const notifications = {
+ q_chat: {}
+ }
+ notifications.q_chat = data.config.user.notifications.q_chat
+ return dispatch(loadNotificationConfig(notifications))
+ }).catch(err => {
+ console.error(err)
+ })
+ }
}
const loadNotificationConfig = (payload) => {
-
- return {
- type: LOAD_NOTIFICATION_CONFIG,
- payload
- }
+ return {
+ type: LOAD_NOTIFICATION_CONFIG,
+ payload
+ }
}
/**
* doSetQChatNotificationConfig action to set QChat Notification
* @param { Object } qChatNotificationObject - { playSound: boolean, showNotification: boolean }
*/
-
export const doSetQChatNotificationConfig = (qChatNotificationObject) => {
-
- return (dispatch, getState) => {
-
- return dispatch(setQChatNotificationConfig(qChatNotificationObject))
- }
+ return (dispatch, getState) => {
+ return dispatch(setQChatNotificationConfig(qChatNotificationObject))
+ }
}
const setQChatNotificationConfig = (payload) => {
-
- return {
- type: SET_QCHAT_NOTIFICATION_CONFIG,
- payload
- }
-}
+ return {
+ type: SET_QCHAT_NOTIFICATION_CONFIG,
+ payload
+ }
+}
\ No newline at end of file
diff --git a/core/src/redux/user/actions/store-wallet.js b/core/src/redux/user/actions/store-wallet.js
index 07b5f872..f42ab42d 100644
--- a/core/src/redux/user/actions/store-wallet.js
+++ b/core/src/redux/user/actions/store-wallet.js
@@ -1,50 +1,48 @@
-import {REMOVE_WALLET, STORE_WALLET, UPDATE_STORED_WALLET_NAME} from '../user-action-types.js'
+import { REMOVE_WALLET, STORE_WALLET, UPDATE_STORED_WALLET_NAME } from '../user-action-types'
export const doStoreWallet = (wallet, password, name, statusUpdateFn = () => { }) => {
- return (dispatch, getState) => {
-
- return wallet.generateSaveWalletData(password, getState().config.crypto.kdfThreads, statusUpdateFn).then(data => {
-
- dispatch(storeWallet({
- ...data,
- name
- }))
- })
- }
+ return (dispatch, getState) => {
+ return wallet.generateSaveWalletData(password, getState().config.crypto.kdfThreads, statusUpdateFn).then(data => {
+ dispatch(storeWallet({
+ ...data,
+ name
+ }))
+ })
+ }
}
const storeWallet = payload => {
- return {
- type: STORE_WALLET,
- payload
- }
+ return {
+ type: STORE_WALLET,
+ payload
+ }
}
export const doRemoveWallet = (address) => {
- return (dispatch, getState) => {
- return dispatch(removeWallet({
- address
- }))
- }
+ return (dispatch, getState) => {
+ return dispatch(removeWallet({
+ address
+ }))
+ }
}
const removeWallet = payload => {
- return {
- type: REMOVE_WALLET,
- payload
- }
+ return {
+ type: REMOVE_WALLET,
+ payload
+ }
}
export const doUpdateStoredWalletName = (address, name) => {
- return (dispatch, getState) => {
- return updateStoredWalletName({
- address, name
- })
- }
+ return (dispatch, getState) => {
+ return updateStoredWalletName({
+ address, name
+ })
+ }
}
const updateStoredWalletName = payload => {
- return {
- type: UPDATE_STORED_WALLET_NAME,
- payload
- }
-}
+ return {
+ type: UPDATE_STORED_WALLET_NAME,
+ payload
+ }
+}
\ No newline at end of file
diff --git a/core/src/redux/user/actions/update-account-info.js b/core/src/redux/user/actions/update-account-info.js
index 7b80ab82..bc6e1705 100644
--- a/core/src/redux/user/actions/update-account-info.js
+++ b/core/src/redux/user/actions/update-account-info.js
@@ -1,14 +1,14 @@
-import {UPDATE_ACCOUNT_INFO} from '../user-action-types'
+import { UPDATE_ACCOUNT_INFO } from '../user-action-types'
export const doUpdateAccountInfo = (accInfo) => {
- return (dispatch, getState) => {
- return dispatch(updateAccountInfo(accInfo))
- }
+ return (dispatch, getState) => {
+ return dispatch(updateAccountInfo(accInfo))
+ }
}
export const updateAccountInfo = (payload) => {
- return {
- type: UPDATE_ACCOUNT_INFO,
- payload
- }
-}
+ return {
+ type: UPDATE_ACCOUNT_INFO,
+ payload
+ }
+}
\ No newline at end of file
diff --git a/core/src/redux/user/actions/update-name.js b/core/src/redux/user/actions/update-name.js
index ae46cee0..206fc607 100644
--- a/core/src/redux/user/actions/update-name.js
+++ b/core/src/redux/user/actions/update-name.js
@@ -1,43 +1,47 @@
-import {updateAccountInfo} from './update-account-info.js'
-import {doUpdateStoredWalletName} from './store-wallet.js'
+import { updateAccountInfo } from './update-account-info'
+import { doUpdateStoredWalletName } from './store-wallet'
const GET_NAME_URL = 'names/address/'
const CHECK_NAME_INTERVAL = 1000 * 10 // Every 10 seconds
export const UPDATE_NAME_STATUSES = {
- LOADING: 'LOADING',
- LOADED: 'LOADED',
- DOES_NOT_EXIST: 'DOES_NOT_EXIST',
- WAITING_FOR_CONFIRM: 'WAITING_FOR_CONFIRM'
+ LOADING: 'LOADING',
+ LOADED: 'LOADED',
+ DOES_NOT_EXIST: 'DOES_NOT_EXIST',
+ WAITING_FOR_CONFIRM: 'WAITING_FOR_CONFIRM'
}
export const doUpdateAccountName = (address, expectedName, awaitingConfirm) => {
- return (dispatch, getState) => {
- dispatch(updateAccountInfo({
- nameStatus: UPDATE_NAME_STATUSES.LOADING,
- name: expectedName
- }))
- const state = getState()
- const config = state.config
- const node = config.coin.node.api
- const url = node.url + node.tail + GET_NAME_URL + address
- return fetch(url)
- .then(res => res.json())
- .then(names => {
- if (names.length > 0) {
- const name = names[0]
- dispatch(updateAccountInfo({
- nameStatus: UPDATE_NAME_STATUSES.LOADED,
- name
- }))
- // ...
- if (state.user.storedWallets[address]) dispatch(doUpdateStoredWalletName(address, name))
- } else {
- dispatch(updateAccountInfo({
- nameStatus: awaitingConfirm ? UPDATE_NAME_STATUSES.DOES_NOT_EXIST : UPDATE_NAME_STATUSES.WAITING_FOR_CONFIRM
- }))
- if (awaitingConfirm) setTimeout(() => dispatch(doUpdateAccountName(address, expectedName, awaitingConfirm)), CHECK_NAME_INTERVAL)
- }
- })
- }
-}
+ return (dispatch, getState) => {
+ dispatch(updateAccountInfo({
+ nameStatus: UPDATE_NAME_STATUSES.LOADING,
+ name: expectedName
+ }))
+
+ const state = getState()
+ const config = state.config
+ const node = config.coin.node.api
+ const url = node.url + node.tail + GET_NAME_URL + address
+
+ return fetch(url)
+ .then(res => res.json())
+ .then(names => {
+ if (names.length > 0) {
+ const name = names[0]
+
+ dispatch(updateAccountInfo({
+ nameStatus: UPDATE_NAME_STATUSES.LOADED,
+ name
+ }))
+ // ...
+ if (state.user.storedWallets[address]) dispatch(doUpdateStoredWalletName(address, name))
+ } else {
+ dispatch(updateAccountInfo({
+ nameStatus: awaitingConfirm ? UPDATE_NAME_STATUSES.DOES_NOT_EXIST : UPDATE_NAME_STATUSES.WAITING_FOR_CONFIRM
+ }))
+
+ if (awaitingConfirm) setTimeout(() => dispatch(doUpdateAccountName(address, expectedName, awaitingConfirm)), CHECK_NAME_INTERVAL)
+ }
+ })
+ }
+}
\ No newline at end of file
diff --git a/core/src/redux/user/user-actions.js b/core/src/redux/user/user-actions.js
index 88a264ec..1e9c62a7 100644
--- a/core/src/redux/user/user-actions.js
+++ b/core/src/redux/user/user-actions.js
@@ -1,4 +1,4 @@
-export * from './actions/store-wallet.js'
-export * from './actions/claim-airdrop.js'
-export * from './actions/update-name.js'
-export * from './actions/notification-config.js'
+export * from './actions/store-wallet'
+export * from './actions/claim-airdrop'
+export * from './actions/update-name'
+export * from './actions/notification-config'
\ No newline at end of file
diff --git a/core/src/redux/user/user-reducer.js b/core/src/redux/user/user-reducer.js
index 672e6f36..a51083d2 100644
--- a/core/src/redux/user/user-reducer.js
+++ b/core/src/redux/user/user-reducer.js
@@ -1,4 +1,4 @@
-import {loadStateFromLocalStorage} from '../../localStorageHelpers'
+import { loadStateFromLocalStorage } from '../../localStorageHelpers'
import {
CLAIM_AIRDROP,
LOAD_NOTIFICATION_CONFIG,
@@ -6,65 +6,71 @@ import {
SET_QCHAT_NOTIFICATION_CONFIG,
STORE_WALLET,
UPDATE_ACCOUNT_INFO
-} from './user-action-types.js'
+} from './user-action-types'
const DEFAULT_INITIAL_STATE = {
- storedWallets: {},
- hasClaimedAirdrop: false,
- accountInfo: {
- // nameStatus: ''
- },
- notifications: {
- q_chat: {}
- },
- loaded: false
+ storedWallets: {},
+ hasClaimedAirdrop: false,
+ accountInfo: {
+ // nameStatus: ''
+ },
+ notifications: {
+ q_chat: {}
+ },
+ loaded: false
}
export default (state = loadStateFromLocalStorage('user') || DEFAULT_INITIAL_STATE, action) => {
- switch (action.type) {
- case STORE_WALLET:
- return {
- ...state,
- storedWallets: {
- ...(state.storedWallets || {}),
- [action.payload.address0]: action.payload
- }
- }
- case REMOVE_WALLET:
- delete state.storedWallets[action.payload.address]
- return {
- ...state,
- storedWallets:state.storedWallets
- }
- case CLAIM_AIRDROP:
- return {
- ...state,
- hasClaimedAirdrop: true
- }
- case UPDATE_ACCOUNT_INFO: {
- return {
- ...state,
- accountInfo: {
- ...state.accountInfo,
- ...action.payload
- }
- }
- }
- case LOAD_NOTIFICATION_CONFIG:
- return {
- ...state,
- notifications: action.payload,
- loaded: true
- }
- case SET_QCHAT_NOTIFICATION_CONFIG:
- return {
- ...state,
- notifications: {
- ...state.notifications,
- q_chat: action.payload
- }
- }
- default:
- return state
- }
-}
+ switch (action.type) {
+ case STORE_WALLET:
+ return {
+ ...state,
+ storedWallets: {
+ ...(state.storedWallets || {}),
+ [action.payload.address0]: action.payload
+ }
+ }
+
+ case REMOVE_WALLET:
+ delete state.storedWallets[action.payload.address]
+ return {
+ ...state,
+ storedWallets: state.storedWallets
+ }
+
+ case CLAIM_AIRDROP:
+ return {
+ ...state,
+ hasClaimedAirdrop: true
+ }
+
+ case UPDATE_ACCOUNT_INFO: {
+ return {
+ ...state,
+ accountInfo: {
+ ...state.accountInfo,
+ ...action.payload
+ }
+ }
+ }
+
+ case LOAD_NOTIFICATION_CONFIG:
+ return {
+ ...state,
+ notifications: action.payload,
+ loaded: true
+ }
+
+ case SET_QCHAT_NOTIFICATION_CONFIG:
+ return {
+ ...state,
+ notifications: {
+ ...state.notifications,
+ q_chat: action.payload
+ }
+ }
+
+ default:
+ return state
+ }
+}
\ No newline at end of file
diff --git a/core/src/stateAwait.js b/core/src/stateAwait.js
index 7736b769..5ad29aa6 100644
--- a/core/src/stateAwait.js
+++ b/core/src/stateAwait.js
@@ -1,23 +1,27 @@
/**
* Simple helper function so that I can do `await stateAwait(state => state.something === true)` or `await stateAwait(state => state.name === 'myName')`
*/
-import {store} from './store.js'
+import { store } from './store'
let subscriptions = []
+
store.subscribe(() => {
- const state = store.getState()
- subscriptions = subscriptions.filter(fn => fn(state))
+ const state = store.getState()
+ subscriptions = subscriptions.filter(fn => fn(state))
})
+
export const stateAwait = fn => {
- return new Promise((resolve, reject) => {
- // Check immediately...then if not true store it
- if (fn(store.getState())) resolve()
- subscriptions.push(state => {
- if (fn(state)) {
- resolve()
- return true
- }
- return false
- })
- })
-}
+ return new Promise((resolve, reject) => {
+ // Check immediately...then if not true store it
+ if (fn(store.getState())) resolve()
+
+ subscriptions.push(state => {
+ if (fn(state)) {
+ resolve()
+ return true
+ }
+
+ return false
+ })
+ })
+}
\ No newline at end of file
diff --git a/core/src/store.js b/core/src/store.js
index e6a1ca3a..78749e9e 100644
--- a/core/src/store.js
+++ b/core/src/store.js
@@ -1,13 +1,12 @@
-import {applyMiddleware, compose, createStore} from 'redux'
+import { applyMiddleware, compose, createStore } from 'redux'
import { thunk } from 'redux-thunk'
-
-import rootReducer from './redux/reducers.js'
+import rootReducer from './redux/reducers'
const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose
export const store = createStore(
- rootReducer,
- composeEnhancers(
- applyMiddleware(thunk)
- )
+ rootReducer,
+ composeEnhancers(
+ applyMiddleware(thunk)
+ )
)
\ No newline at end of file
diff --git a/core/src/styles/app-styles.js b/core/src/styles/app-styles.js
index 2fac5ce4..e3a5833b 100644
--- a/core/src/styles/app-styles.js
+++ b/core/src/styles/app-styles.js
@@ -1,64 +1,67 @@
-import {html, LitElement} from 'lit'
-
+import { html, LitElement } from 'lit'
+import './app-theme'
import './styles.scss'
-import './app-theme.js'
class AppStyles extends LitElement {
+ static get properties() {
+ return {
+ }
+ }
- /* Disable shadow DOM, so that the styles DO bleed */
- createRenderRoot () {
- return this
- }
+ constructor() {
+ super()
+ this.windowHeight = html`100vh`
+ window.addEventListener('resize', () => this._windowResized())
+ this._windowResized()
+ }
- render () {
- return html`
-
+
+ `
+ }
- }
+ firstUpdated() {
+ // ...
+ }
- hr {
- border-color: var(--theme-on-surface);
- }
+ /* Disable shadow DOM, so that the styles DO bleed */
+ createRenderRoot() {
+ return this
+ }
-
-
- `
- }
+ // For mobile chrome's address bar
+ _windowResized() {
+ const ua = navigator.userAgent
+ const isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini|Mobile|mobile|CriOS/i.test(ua)
+ const isChrome = /Chrome/i.test(ua)
+ const isSafari = /Version\/[\d\.]+.*Safari/.test(ua)
- constructor () {
- super()
- this.windowHeight = html`100vh`
- window.addEventListener('resize', () => this._windowResized())
- this._windowResized()
- }
-
- // For mobile chrome's address bar
- _windowResized () {
- const ua = navigator.userAgent
- const isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini|Mobile|mobile|CriOS/i.test(ua)
- const isChrome = /Chrome/i.test(ua)
- const isSafari = /Version\/[\d\.]+.*Safari/.test(ua)
-
- if (isMobile && isChrome) {
- this.windowHeight = html`calc(100vh - 56px)`
- } else if (isMobile && isSafari) {
- this.windowHeight = html`calc(100vh - 72px)`
- } else {
- this.windowHeight = html`100vh`
- }
- }
+ if (isMobile && isChrome) {
+ this.windowHeight = html`calc(100vh - 56px)`
+ } else if (isMobile && isSafari) {
+ this.windowHeight = html`calc(100vh - 72px)`
+ } else {
+ this.windowHeight = html`100vh`
+ }
+ }
}
-window.customElements.define('app-styles', AppStyles)
+window.customElements.define('app-styles', AppStyles)
\ No newline at end of file
diff --git a/core/src/styles/app-theme.js b/core/src/styles/app-theme.js
index f2e9f93b..4d9358f7 100644
--- a/core/src/styles/app-theme.js
+++ b/core/src/styles/app-theme.js
@@ -1,57 +1,61 @@
-import {html, LitElement} from 'lit'
-import {connect} from 'pwa-helpers'
-import {store} from '../store.js'
+import { html, LitElement } from 'lit'
+import { connect } from 'pwa-helpers'
+import { store } from '../store'
class AppTheme extends connect(store)(LitElement) {
+ static get properties() {
+ return {
+ styles: { type: Object },
+ theme: { type: Object }
+ }
+ }
- static get properties () {
- return {
- styles: { type: Object },
- theme: { type: Object }
- }
- }
+ constructor() {
+ super()
+ }
- /* Disable shady css, so that the styles DO bleed */
- createRenderRoot () {
- return this
- }
+ render() {
+ return html`
+
+ `
+ }
- --mdc-theme-secondary: ${this.theme.colors.secondary}; /* Sets the text color to the theme secondary color. */
- --mdc-theme-secondary-bg: ${this.theme.colors.secondaryBg};/* Sets the background color to the theme secondary color. */
- --mdc-theme-on-secondary: ${this.theme.colors.onSecondary}; /* Sets the text color to the color configured for text on the secondary color. */
+ firstUpdated() {
+ // ...
+ }
- --mdc-theme-surface: ${this.theme.colors.surface}; /* Sets the background color to the surface background color. */
- --mdc-theme-on-surface: ${this.theme.colors.onSurface};/* Sets the text color to the color configured for text on the surface color. */
- --mdc-theme-background: ${this.theme.colors.background};/* Sets the background color to the theme background color. */
+ /* Disable shady css, so that the styles DO bleed */
+ createRenderRoot() {
+ return this
+ }
- --layout-breakpoint-tablet: ${this.styles.breakpoints.tablet};
- --layout-breakpoint-desktop: ${this.styles.breakpoints.desktop};
- --layout-breakpoint-mobile: ${this.styles.breakpoints.mobile};
-
- --mdc-theme-error: ${this.theme.colors.error};
- --mdc-theme-warning: ${this.theme.colors.warning};
- }
-
- paper-spinner-lite, paper-spinner {
- --paper-spinner-color: var(--mdc-theme-secondary)
- }
-
-
- `
- }
-
- stateChanged (state) {
- this.styles = state.config.styles
- this.theme = this.styles.theme
- }
+ stateChanged(state) {
+ this.styles = state.config.styles
+ this.theme = this.styles.theme
+ }
}
-window.customElements.define('app-theme', AppTheme)
+window.customElements.define('app-theme', AppTheme)
\ No newline at end of file
diff --git a/core/src/styles/core-css.js b/core/src/styles/core-css.js
new file mode 100644
index 00000000..400cc10e
--- /dev/null
+++ b/core/src/styles/core-css.js
@@ -0,0 +1,4753 @@
+import {css} from 'lit'
+
+export const friendsViewStyles = css`
+ * {
+ box-sizing: border-box;
+ }
+
+ .top-bar-icon {
+ cursor: pointer;
+ height: 18px;
+ width: 18px;
+ transition: 0.2s all;
+ }
+
+ .top-bar-icon:hover {
+ color: var(--black);
+ }
+
+ .modal-button {
+ font-family: Roboto, sans-serif;
+ font-size: 16px;
+ color: var(--mdc-theme-primary);
+ background-color: transparent;
+ padding: 8px 10px;
+ border-radius: 5px;
+ border: none;
+ transition: all 0.3s ease-in-out;
+ }
+
+ .close-row {
+ width: 100%;
+ display: flex;
+ justify-content: flex-end;
+ height: 50px;
+ flex: 0
+ }
+
+ .container-body {
+ width: 100%;
+ display: flex;
+ flex-direction: column;
+ flex-grow: 1;
+ margin-top: 5px;
+ padding: 0px 6px;
+ box-sizing: border-box;
+ align-items: center;
+ gap: 10px;
+ }
+
+ .container-body::-webkit-scrollbar-track {
+ background-color: whitesmoke;
+ border-radius: 7px;
+ }
+
+ .container-body::-webkit-scrollbar {
+ width: 6px;
+ border-radius: 7px;
+ background-color: whitesmoke;
+ }
+
+ .container-body::-webkit-scrollbar-thumb {
+ background-color: rgb(180, 176, 176);
+ border-radius: 7px;
+ transition: all 0.3s ease-in-out;
+ }
+
+ .container-body::-webkit-scrollbar-thumb:hover {
+ background-color: rgb(148, 146, 146);
+ cursor: pointer;
+ }
+
+ p {
+ color: var(--black);
+ margin: 0px;
+ padding: 0px;
+ word-break: break-all;
+ }
+
+ .container {
+ display: flex;
+ width: 100%;
+ flex-direction: column;
+ height: 100%;
+ }
+
+ .chat-right-panel-label {
+ font-family: Montserrat, sans-serif;
+ color: var(--group-header);
+ padding: 5px;
+ font-size: 13px;
+ user-select: none;
+ }
+
+ .group-info {
+ display: flex;
+ flex-direction: column;
+ justify-content: flex-start;
+ gap: 10px;
+ }
+
+ .group-name {
+ font-family: Raleway, sans-serif;
+ font-size: 20px;
+ color: var(--chat-bubble-msg-color);
+ text-align: center;
+ user-select: none;
+ }
+
+ .group-description {
+ font-family: Roboto, sans-serif;
+ color: var(--chat-bubble-msg-color);
+ letter-spacing: 0.3px;
+ font-weight: 300;
+ font-size: 14px;
+ margin-top: 15px;
+ word-break: break-word;
+ user-select: none;
+ }
+
+ .group-subheader {
+ font-family: Montserrat, sans-serif;
+ font-size: 14px;
+ color: var(--chat-bubble-msg-color);
+ }
+
+ .group-data {
+ font-family: Roboto, sans-serif;
+ letter-spacing: 0.3px;
+ font-weight: 300;
+ font-size: 14px;
+ color: var(--chat-bubble-msg-color);
+ }
+
+ .search-results-div {
+ position: absolute;
+ top: 25px;
+ right: 25px;
+ }
+
+ .name-input {
+ width: 100%;
+ outline: 0;
+ border-width: 0 0 2px;
+ border-color: var(--mdc-theme-primary);
+ background-color: transparent;
+ padding: 10px;
+ font-family: Roboto, sans-serif;
+ font-size: 15px;
+ color: var(--chat-bubble-msg-color);
+ box-sizing: border-box;
+ }
+
+ .name-input::selection {
+ background-color: var(--mdc-theme-primary);
+ color: white;
+ }
+
+ .name-input::placeholder {
+ opacity: 0.9;
+ color: var(--black);
+ }
+
+ .search-field {
+ width: 100%;
+ position: relative;
+ }
+
+ .search-icon {
+ position: absolute;
+ right: 3px;
+ color: var(--chat-bubble-msg-color);
+ transition: hover 0.3s ease-in-out;
+ background: none;
+ border-radius: 50%;
+ padding: 6px 3px;
+ font-size: 21px;
+ }
+
+ .search-icon:hover {
+ cursor: pointer;
+ background: #d7d7d75c;
+ }
+`
+
+export const feedItemStyles = css`
+ * {
+ --mdc-theme-text-primary-on-background: var(--black);
+ box-sizing: border-box;
+ }
+
+ :host {
+ width: 100%;
+ box-sizing: border-box;
+ }
+
+ img {
+ width: 100%;
+ max-height: 30vh;
+ border-radius: 5px;
+ cursor: pointer;
+ position: relative;
+ }
+
+ .smallLoading,
+ .smallLoading:after {
+ border-radius: 50%;
+ width: 2px;
+ height: 2px;
+ }
+
+ .smallLoading {
+ border-width: 0.8em;
+ border-style: solid;
+ border-color: rgba(3, 169, 244, 0.2) rgba(3, 169, 244, 0.2) rgba(3, 169, 244, 0.2) rgb(3, 169, 244);
+ font-size: 30px;
+ position: relative;
+ text-indent: -9999em;
+ transform: translateZ(0px);
+ animation: 1.1s linear 0s infinite normal none running loadingAnimation;
+ }
+
+ .defaultSize {
+ width: 100%;
+ height: 160px;
+ }
+
+ .parent-feed-item {
+ position: relative;
+ display: flex;
+ background-color: var(--chat-bubble-bg);
+ flex-grow: 0;
+ flex-direction: column;
+ align-items: flex-start;
+ justify-content: center;
+ border-radius: 5px;
+ padding: 12px 15px 4px 15px;
+ min-width: 150px;
+ width: 100%;
+ box-sizing: border-box;
+ cursor: pointer;
+ font-size: 16px;
+ }
+
+ .avatar {
+ width: 36px;
+ height: 36px;
+ border-radius: 50%;
+ overflow: hidden;
+ display: flex;
+ align-items: center;
+ }
+
+ .avatarApp {
+ width: 30px;
+ height: 30px;
+ border-radius: 50%;
+ overflow: hidden;
+ display: flex;
+ align-items: center;
+ }
+
+ .feed-item-name {
+ user-select: none;
+ color: #03a9f4;
+ margin-bottom: 5px;
+ }
+
+ .app-name {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ width: 100%;
+ }
+
+ mwc-menu {
+ position: absolute;
+ }
+
+ @-webkit-keyframes loadingAnimation {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg);
+ }
+
+ 100% {
+ -webkit-transform: rotate(360deg);
+ transform: rotate(360deg);
+ }
+ }
+
+ @keyframes loadingAnimation {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg);
+ }
+
+ 100% {
+ -webkit-transform: rotate(360deg);
+ transform: rotate(360deg);
+ }
+ }
+`
+
+export const profileModalUpdateStyles = css`
+ * {
+ --mdc-theme-primary: rgb(3, 169, 244);
+ --mdc-theme-secondary: var(--mdc-theme-primary);
+ --mdc-theme-surface: var(--white);
+ --mdc-dialog-content-ink-color: var(--black);
+ --mdc-dialog-min-width: 400px;
+ --mdc-dialog-max-width: 1024px;
+ box-sizing: border-box;
+ }
+
+ .input {
+ width: 90%;
+ outline: 0;
+ border-width: 0 0 2px;
+ border-color: var(--mdc-theme-primary);
+ background-color: transparent;
+ padding: 10px;
+ font-family: Roboto, sans-serif;
+ font-size: 15px;
+ color: var(--chat-bubble-msg-color);
+ box-sizing: border-box;
+ }
+
+ .input::selection {
+ background-color: var(--mdc-theme-primary);
+ color: white;
+ }
+
+ .input::placeholder {
+ opacity: 0.6;
+ color: var(--black);
+ }
+
+ .modal-button {
+ font-family: Roboto, sans-serif;
+ font-size: 16px;
+ color: var(--mdc-theme-primary);
+ background-color: transparent;
+ padding: 8px 10px;
+ border-radius: 5px;
+ border: none;
+ transition: all 0.3s ease-in-out;
+ }
+
+ .modal-button-red {
+ font-family: Roboto, sans-serif;
+ font-size: 16px;
+ color: #f44336;
+ background-color: transparent;
+ padding: 8px 10px;
+ border-radius: 5px;
+ border: none;
+ transition: all 0.3s ease-in-out;
+ }
+
+ .modal-button-red:hover {
+ cursor: pointer;
+ background-color: #f4433663;
+ }
+
+ .modal-button:hover {
+ cursor: pointer;
+ background-color: #03a8f475;
+ }
+
+ .checkbox-row {
+ position: relative;
+ display: flex;
+ align-items: center;
+ align-content: center;
+ font-family: Montserrat, sans-serif;
+ font-weight: 600;
+ color: var(--black);
+ }
+
+ .modal-overlay {
+ display: block;
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100vw;
+ height: 100vh;
+ background-color: rgba(0, 0, 0, 0.5);
+ /* Semi-transparent backdrop */
+ z-index: 1000;
+ }
+
+ .modal-content {
+ position: fixed;
+ top: 50vh;
+ left: 50vw;
+ transform: translate(-50%, -50%);
+ background-color: var(--mdc-theme-surface);
+ width: 80vw;
+ padding: 20px;
+ box-shadow: rgba(0, 0, 0, 0.1) 0px 4px 6px;
+ z-index: 1001;
+ border-radius: 5px;
+ display: flex;
+ flex-direction: column;
+ }
+
+ .modal-overlay.hidden {
+ display: none;
+ }
+
+ .avatar {
+ width: 36px;
+ height: 36px;
+ display: flex;
+ align-items: center;
+ }
+
+ .app-name {
+ display: flex;
+ gap: 20px;
+ align-items: center;
+ width: 100%;
+ cursor: pointer;
+ padding: 5px;
+ border-radius: 5px;
+ margin-bottom: 10px;
+ }
+
+ .inner-content {
+ display: flex;
+ flex-direction: column;
+ max-height: 75vh;
+ flex-grow: 1;
+ overflow: auto;
+ }
+
+ .inner-content::-webkit-scrollbar-track {
+ background-color: whitesmoke;
+ border-radius: 7px;
+ }
+
+ .inner-content::-webkit-scrollbar {
+ width: 12px;
+ border-radius: 7px;
+ background-color: whitesmoke;
+ }
+
+ .inner-content::-webkit-scrollbar-thumb {
+ background-color: rgb(180, 176, 176);
+ border-radius: 7px;
+ transition: all 0.3s ease-in-out;
+ }
+
+ .checkbox-row {
+ position: relative;
+ display: flex;
+ align-items: center;
+ align-content: center;
+ font-family: Montserrat, sans-serif;
+ font-weight: 600;
+ color: var(--black);
+ }
+`
+
+export const friendsSidePanelParentStyles = css`
+ .header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 16px;
+ border-bottom: 1px solid #e0e0e0;
+ }
+
+ .content {
+ padding: 16px;
+ }
+
+ .close {
+ visibility: hidden;
+ position: fixed;
+ z-index: -100;
+ right: -1000px;
+ }
+
+ .parent-side-panel {
+ transform: translateX(100%);
+ /* start from outside the right edge */
+ transition: transform 0.3s ease-in-out;
+ }
+
+ .parent-side-panel.open {
+ transform: translateX(0);
+ /* slide in to its original position */
+
+ }
+`
+
+export const friendsSidePanelStyles = css`
+ :host {
+ display: block;
+ position: fixed;
+ top: 55px;
+ right: 0px;
+ width: 420px;
+ max-width: 95%;
+ height: calc(100vh - 55px);
+ background-color: var(--white);
+ border-left: 1px solid rgb(224, 224, 224);
+ z-index: 1;
+ transform: translateX(100%);
+ /* start from outside the right edge */
+ transition: transform 0.3s ease-in-out;
+ }
+
+ :host([isOpen]) {
+ transform: unset;
+ /* slide in to its original position */
+ }
+
+ .header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 16px;
+ border-bottom: 1px solid #e0e0e0;
+ }
+
+ .content {
+ padding: 16px;
+ display: flex;
+ flex-direction: column;
+ flex-grow: 1;
+ overflow: auto;
+ }
+
+ .content::-webkit-scrollbar-track {
+ background-color: whitesmoke;
+ border-radius: 7px;
+ }
+
+ .content::-webkit-scrollbar {
+ width: 12px;
+ border-radius: 7px;
+ background-color: whitesmoke;
+ }
+
+ .content::-webkit-scrollbar-thumb {
+ background-color: rgb(180, 176, 176);
+ border-radius: 7px;
+ transition: all 0.3s ease-in-out;
+ }
+
+ .parent {
+ display: flex;
+ flex-direction: column;
+ height: 100%;
+ }
+
+ .active {
+ font-size: 16px;
+ background: var(--black);
+ color: var(--white);
+ padding: 5px;
+ border-radius: 2px;
+ cursor: pointer;
+ }
+
+ .default {
+ font-size: 16px;
+ color: var(--black);
+ padding: 5px;
+ border-radius: 2px;
+ cursor: pointer;
+ }
+
+ .default-content {
+ visibility: hidden;
+ position: absolute;
+ z-index: -50;
+ }
+`
+
+export const friendItemActionsStyles = css`
+ :host {
+ display: none;
+ position: absolute;
+ background-color: var(--white);
+ border: 1px solid #ddd;
+ padding: 8px;
+ z-index: 10;
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
+ color: var(--black);
+ max-width: 250px;
+ }
+
+ .close-icon {
+ cursor: pointer;
+ float: right;
+ margin-left: 10px;
+ color: var(--black);
+ }
+
+ .send-message-button {
+ font-family: Roboto, sans-serif;
+ letter-spacing: 0.3px;
+ font-weight: 300;
+ padding: 8px 5px;
+ border-radius: 3px;
+ text-align: center;
+ color: var(--mdc-theme-primary);
+ transition: all 0.3s ease-in-out;
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ }
+
+ .send-message-button:hover {
+ cursor: pointer;
+ background-color: #03a8f485;
+ }
+
+ .action-parent {
+ display: flex;
+ flex-direction: column;
+ width: 100%;
+ }
+
+ div[tabindex='0']:focus {
+ outline: none;
+ }
+`
+
+export const coreSyncStatusStyles = css`
+ .lineHeight {
+ line-height: 33%;
+ }
+
+ .tooltip {
+ display: inline-block;
+ position: relative;
+ text-align: left;
+ }
+
+ .tooltip .bottom {
+ min-width: 200px;
+ max-width: 250px;
+ top: 35px;
+ left: 50%;
+ transform: translate(-50%, 0);
+ padding: 10px 10px;
+ color: var(--black);
+ background-color: var(--white);
+ font-weight: normal;
+ font-size: 13px;
+ border-radius: 8px;
+ position: absolute;
+ z-index: 99999999;
+ box-sizing: border-box;
+ box-shadow: 0 1px 8px rgba(0, 0, 0, 0.5);
+ border: 1px solid var(--black);
+ visibility: hidden;
+ opacity: 0;
+ transition: opacity 0.8s;
+ }
+
+ .tooltip:hover .bottom {
+ visibility: visible;
+ opacity: 1;
+ }
+
+ .tooltip .bottom i {
+ position: absolute;
+ bottom: 100%;
+ left: 50%;
+ margin-left: -12px;
+ width: 24px;
+ height: 12px;
+ overflow: hidden;
+ }
+
+ .tooltip .bottom i::after {
+ content: '';
+ position: absolute;
+ width: 12px;
+ height: 12px;
+ left: 50%;
+ transform: translate(-50%, 50%) rotate(45deg);
+ background-color: var(--white);
+ border: 1px solid var(--black);
+ box-shadow: 0 1px 8px rgba(0, 0, 0, 0.5);
+ }
+`
+
+export const chatSideNavHeadsStyles = css`
+ :host {
+ width: 100%;
+ }
+
+ ul {
+ list-style-type: none;
+ }
+
+ li {
+ padding: 10px 2px 10px 5px;
+ cursor: pointer;
+ width: 100%;
+ display: flex;
+ box-sizing: border-box;
+ font-size: 14px;
+ transition: 0.2s background-color;
+ }
+
+ li:hover {
+ background-color: var(--lightChatHeadHover);
+ }
+
+ .active {
+ background: var(--menuactive);
+ border-left: 4px solid #3498db;
+ }
+
+ .img-icon {
+ font-size: 40px;
+ color: var(--chat-group);
+ }
+
+ .status {
+ color: #92959e;
+ }
+
+ .clearfix {
+ display: flex;
+ align-items: center;
+ }
+
+ .clearfix:after {
+ visibility: hidden;
+ display: block;
+ font-size: 0;
+ content: " ";
+ clear: both;
+ height: 0;
+ }
+`
+
+export const beginnerChecklistStyles = css`
+ .layout {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ position: relative;
+ }
+
+ .count {
+ position: absolute;
+ top: -5px;
+ right: -5px;
+ font-size: 12px;
+ background-color: red;
+ color: white;
+ border-radius: 50%;
+ width: 16px;
+ height: 16px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ }
+
+ .nocount {
+ display: none;
+ }
+
+ .popover-panel {
+ position: absolute;
+ width: 200px;
+ padding: 10px;
+ background-color: var(--white);
+ border: 1px solid var(--black);
+ border-radius: 4px;
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
+ top: 40px;
+ max-height: 350px;
+ overflow: auto;
+ scrollbar-width: thin;
+ scrollbar-color: #6a6c75 #a1a1a1;
+ }
+
+ .popover-panel::-webkit-scrollbar {
+ width: 11px;
+ }
+
+ .popover-panel::-webkit-scrollbar-track {
+ background: #a1a1a1;
+ }
+
+ .popover-panel::-webkit-scrollbar-thumb {
+ background-color: #6a6c75;
+ border-radius: 6px;
+ border: 3px solid #a1a1a1;
+ }
+
+ .list {
+ display: flex;
+ flex-direction: column;
+ gap: 15px;
+ }
+
+ .task-list-item {
+ display: flex;
+ gap: 15px;
+ justify-content: space-between;
+ align-items: center;
+ }
+
+ .checklist-item {
+ padding: 5px;
+ border-bottom: 1px solid;
+ display: flex;
+ justify-content: space-between;
+ cursor: pointer;
+ transition: 0.2s all;
+ }
+
+ .checklist-item:hover {
+ background: var(--nav-color-hover);
+ }
+
+ p {
+ font-size: 16px;
+ color: var(--black);
+ margin: 0px;
+ padding: 0px;
+ }
+`
+
+export const addFriendsModalStyles = css`
+ * {
+ --mdc-theme-primary: rgb(3, 169, 244);
+ --mdc-theme-secondary: var(--mdc-theme-primary);
+ --mdc-theme-surface: var(--white);
+ --mdc-dialog-content-ink-color: var(--black);
+ --mdc-dialog-min-width: 400px;
+ --mdc-dialog-max-width: 1024px;
+ box-sizing: border-box;
+ }
+
+ .input {
+ width: 90%;
+ outline: 0;
+ border-width: 0 0 2px;
+ border-color: var(--mdc-theme-primary);
+ background-color: transparent;
+ padding: 10px;
+ font-family: Roboto, sans-serif;
+ font-size: 15px;
+ color: var(--chat-bubble-msg-color);
+ box-sizing: border-box;
+ }
+
+ .input::selection {
+ background-color: var(--mdc-theme-primary);
+ color: white;
+ }
+
+ .input::placeholder {
+ opacity: 0.6;
+ color: var(--black);
+ }
+
+ .modal-button {
+ font-family: Roboto, sans-serif;
+ font-size: 16px;
+ color: var(--mdc-theme-primary);
+ background-color: transparent;
+ padding: 8px 10px;
+ border-radius: 5px;
+ border: none;
+ transition: all 0.3s ease-in-out;
+ }
+
+ .modal-button-red {
+ font-family: Roboto, sans-serif;
+ font-size: 16px;
+ color: #f44336;
+ background-color: transparent;
+ padding: 8px 10px;
+ border-radius: 5px;
+ border: none;
+ transition: all 0.3s ease-in-out;
+ }
+
+ .modal-button-red:hover {
+ cursor: pointer;
+ background-color: #f4433663;
+ }
+
+ .modal-button:hover {
+ cursor: pointer;
+ background-color: #03a8f475;
+ }
+
+ .checkbox-row {
+ position: relative;
+ display: flex;
+ align-items: center;
+ align-content: center;
+ font-family: Montserrat, sans-serif;
+ font-weight: 600;
+ color: var(--black);
+ }
+
+ .modal-overlay {
+ display: block;
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100vw;
+ height: 100vh;
+ background-color: rgba(0, 0, 0, 0.5);
+ /* Semi-transparent backdrop */
+ z-index: 1000;
+ }
+
+ .modal-content {
+ position: fixed;
+ top: 50vh;
+ left: 50vw;
+ transform: translate(-50%, -50%);
+ background-color: var(--mdc-theme-surface);
+ width: 80vw;
+ max-width: 600px;
+ padding: 20px;
+ box-shadow: rgba(0, 0, 0, 0.1) 0px 4px 6px;
+ z-index: 1001;
+ border-radius: 5px;
+ display: flex;
+ flex-direction: column;
+ }
+
+ .modal-overlay.hidden {
+ display: none;
+ }
+
+ .avatar {
+ width: 36px;
+ height: 36px;
+ display: flex;
+ align-items: center;
+ }
+
+ .app-name {
+ display: flex;
+ gap: 20px;
+ align-items: center;
+ width: 100%;
+ cursor: pointer;
+ padding: 5px;
+ border-radius: 5px;
+ margin-bottom: 10px;
+ }
+
+ .inner-content {
+ display: flex;
+ flex-direction: column;
+ max-height: 75vh;
+ flex-grow: 1;
+ overflow: auto;
+ }
+
+ .inner-content::-webkit-scrollbar-track {
+ background-color: whitesmoke;
+ border-radius: 7px;
+ }
+
+ .inner-content::-webkit-scrollbar {
+ width: 12px;
+ border-radius: 7px;
+ background-color: whitesmoke;
+ }
+
+ .inner-content::-webkit-scrollbar-thumb {
+ background-color: rgb(180, 176, 176);
+ border-radius: 7px;
+ transition: all 0.3s ease-in-out;
+ }
+`
+
+export const saveSettingsQdnStyles = css`
+ :host {
+ margin-right: 20px;
+ }
+
+ .header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 16px;
+ border-bottom: 1px solid #e0e0e0;
+ }
+
+ .content {
+ padding: 16px;
+ }
+
+ .close {
+ visibility: hidden;
+ position: fixed;
+ z-index: -100;
+ right: -1000px;
+ }
+
+ .parent-side-panel {
+ transform: translateX(100%);
+ /* start from outside the right edge */
+ transition: transform 0.3s ease-in-out;
+ }
+
+ .parent-side-panel.open {
+ transform: translateX(0);
+ /* slide in to its original position */
+ }
+
+ .notActive {
+ opacity: 0.5;
+ cursor: default;
+ color: var(--black);
+ }
+
+ .active {
+ opacity: 1;
+ cursor: pointer;
+ color: green;
+ }
+
+ .accept-button {
+ font-family: Roboto, sans-serif;
+ letter-spacing: 0.3px;
+ font-weight: 300;
+ padding: 8px 5px;
+ border-radius: 3px;
+ text-align: center;
+ color: var(--mdc-theme-primary);
+ transition: all 0.3s ease-in-out;
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ font-size: 18px;
+ }
+
+ .accept-button:hover {
+ cursor: pointer;
+ background-color: #03a8f485;
+ }
+
+ .undo-button {
+ font-family: Roboto, sans-serif;
+ letter-spacing: 0.3px;
+ font-weight: 300;
+ padding: 8px 5px;
+ border-radius: 3px;
+ text-align: center;
+ color: #f44336;
+ transition: all 0.3s ease-in-out;
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ font-size: 18px;
+ }
+
+ .undo-button:hover {
+ cursor: pointer;
+ background-color: #f4433663;
+ }
+`
+
+export const profileQdnStyles = css`
+ * {
+ --mdc-theme-primary: rgb(3, 169, 244);
+ --mdc-theme-secondary: var(--mdc-theme-primary);
+ --mdc-theme-surface: var(--white);
+ --mdc-dialog-content-ink-color: var(--black);
+ box-sizing: border-box;
+ }
+
+ .header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 16px;
+ border-bottom: 1px solid #e0e0e0;
+ }
+
+ .content {
+ padding: 16px;
+ }
+
+ .close {
+ visibility: hidden;
+ position: fixed;
+ z-index: -100;
+ right: -1000px;
+ }
+
+ .parent-side-panel {
+ transform: translateX(100%);
+ /* start from outside the right edge */
+ transition: transform 0.3s ease-in-out;
+ }
+
+ .parent-side-panel.open {
+ transform: translateX(0);
+ /* slide in to its original position */
+ }
+
+ .notActive {
+ opacity: 0.5;
+ cursor: default;
+ color: var(--black);
+ }
+
+ .active {
+ opacity: 1;
+ cursor: pointer;
+ color: green;
+ }
+
+ .accept-button {
+ font-family: Roboto, sans-serif;
+ letter-spacing: 0.3px;
+ font-weight: 300;
+ padding: 8px 5px;
+ border-radius: 3px;
+ text-align: center;
+ color: var(--mdc-theme-primary);
+ transition: all 0.3s ease-in-out;
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ font-size: 18px;
+ }
+
+ .accept-button:hover {
+ cursor: pointer;
+ background-color: #03a8f485;
+ }
+
+ .undo-button {
+ font-family: Roboto, sans-serif;
+ letter-spacing: 0.3px;
+ font-weight: 300;
+ padding: 8px 5px;
+ border-radius: 3px;
+ text-align: center;
+ color: #f44336;
+ transition: all 0.3s ease-in-out;
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ font-size: 18px;
+ }
+
+ .undo-button:hover {
+ cursor: pointer;
+ background-color: #f4433663;
+ }
+
+ .full-info-wrapper {
+ width: 100%;
+ min-width: 600px;
+ max-width: 600px;
+ text-align: center;
+ background: var(--white);
+ border: 1px solid var(--black);
+ border-radius: 15px;
+ padding: 25px;
+ box-shadow: 0px 10px 15px rgba(0, 0, 0, 0.1);
+ display: block !important;
+ }
+
+ .full-info-logo {
+ width: 120px;
+ height: 120px;
+ background: var(--white);
+ border: 1px solid var(--black);
+ border-radius: 50%;
+ position: relative;
+ top: -110px;
+ left: 210px;
+ }
+
+ .data-info {
+ margin-top: 10px;
+ margin-right: 25px;
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+ min-height: 55vh;
+ max-height: 55vh;
+ overflow: auto;
+ }
+
+ .data-info::-webkit-scrollbar-track {
+ background: #a1a1a1;
+ }
+
+ .data-info::-webkit-scrollbar-thumb {
+ background-color: #6a6c75;
+ border-radius: 6px;
+ border: 3px solid #a1a1a1;
+ }
+
+ .data-info>* {
+ flex-shrink: 0;
+ }
+
+ .decline {
+ --mdc-theme-primary: var(--mdc-theme-error);
+ }
+
+ .warning {
+ --mdc-theme-primary: #f0ad4e;
+ }
+
+ .green {
+ --mdc-theme-primary: #198754;
+ }
+
+ .buttons {
+ display: inline;
+ float: right;
+ margin-bottom: 5px;
+ }
+
+ .paybutton {
+ display: inline;
+ float: left;
+ margin-bottom: 5px;
+ }
+
+ .round-fullinfo {
+ position: relative;
+ width: 120px;
+ height: 120px;
+ border-radius: 50%;
+ right: 25px;
+ top: -1px;
+ }
+
+ h2 {
+ margin: 10px 0;
+ }
+
+ h3 {
+ margin-top: -80px;
+ color: #03a9f4;
+ font-size: 18px;
+ }
+
+ h4 {
+ margin: 5px 0;
+ }
+
+ p {
+ margin-top: 5px;
+ line-height: 1.2;
+ font-size: 16px;
+ color: var(--black);
+ text-align: start;
+ overflow: hidden;
+ word-break: break-word;
+ }
+
+ .send-message-button {
+ cursor: pointer;
+ transition: all 0.2s;
+ }
+
+ .send-message-button:hover {
+ transform: scale(1.1);
+ }
+`
+
+export const avatarComponentStyles = css`
+ * {
+ --mdc-theme-text-primary-on-background: var(--black);
+ box-sizing: border-box;
+ }
+
+ :host {
+ width: 100%;
+ box-sizing: border-box;
+ }
+
+ img {
+ width: 100%;
+ max-height: 30vh;
+ border-radius: 5px;
+ cursor: pointer;
+ position: relative;
+ }
+
+ .smallLoading,
+ .smallLoading:after {
+ border-radius: 50%;
+ width: 2px;
+ height: 2px;
+ }
+
+ .defaultSize {
+ width: 100%;
+ height: 160px;
+ }
+
+ .parent-feed-item {
+ position: relative;
+ display: flex;
+ background-color: var(--chat-bubble-bg);
+ flex-grow: 0;
+ flex-direction: column;
+ align-items: flex-start;
+ justify-content: center;
+ border-radius: 5px;
+ padding: 12px 15px 4px 15px;
+ min-width: 150px;
+ width: 100%;
+ box-sizing: border-box;
+ cursor: pointer;
+ font-size: 16px;
+ }
+
+ .avatar {
+ width: 36px;
+ height: 36px;
+ border-radius: 50%;
+ overflow: hidden;
+ display: flex;
+ align-items: center;
+ }
+
+ .avatarApp {
+ width: 30px;
+ height: 30px;
+ border-radius: 50%;
+ overflow: hidden;
+ display: flex;
+ align-items: center;
+ }
+
+ .feed-item-name {
+ user-select: none;
+ color: #03a9f4;
+ margin-bottom: 5px;
+ }
+
+ .app-name {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ width: 100%;
+ }
+
+ mwc-menu {
+ position: absolute;
+ }
+`
+
+export const fragFileInputStyles = css`
+ #drop-area {
+ border: 2px dashed #ccc;
+ font-family: "Roboto", sans-serif;
+ padding: 20px;
+ }
+
+ #trigger:hover {
+ cursor: pointer;
+ }
+
+ #drop-area.highlight {
+ border-color: var(--mdc-theme-primary, #000);
+ }
+
+ p {
+ margin-top: 0;
+ }
+
+ form {
+ margin-bottom: 10px;
+ }
+
+ #fileInput {
+ display: none;
+ }
+`
+
+export const confirmTransactionDialogStyles = css`
+ * {
+ --mdc-theme-primary: rgb(3, 169, 244);
+ --mdc-theme-secondary: var(--mdc-theme-primary);
+ --mdc-theme-surface: var(--white);
+ --mdc-dialog-content-ink-color: var(--black);
+ }
+
+ .decline {
+ --mdc-theme-primary: var(--mdc-theme-error)
+ }
+
+ #txInfo {
+ text-align: left;
+ max-width: 520px;
+ color: var(--black);
+ }
+
+ .buttons {
+ text-align: right;
+ }
+
+ table td,
+ th {
+ padding: 4px;
+ text-align: left;
+ font-size: 14px;
+ color: var(--black);
+ }
+`
+
+export const loadingRippleStyles = css`
+ * {
+ --mdc-theme-primary: rgb(3, 169, 244);
+ --mdc-theme-secondary: var(--mdc-theme-primary);
+ --paper-spinner-color: var(--mdc-theme-secondary);
+ }
+
+ #rippleWrapper {
+ position: fixed;
+ top: 0;
+ left: 0;
+ bottom: 0;
+ right: 0;
+ height: 0;
+ width: 0;
+ z-index: 999;
+ overflow: visible;
+ --ripple-activating-transition: transform 0.3s cubic-bezier(0.6, 0.0, 1, 1), opacity 0.3s cubic-bezier(0.6, 0.0, 1, 1);
+ --ripple-disable-transition: opacity 0.5s ease;
+ }
+
+ #ripple {
+ border-radius: 50%;
+ border-width: 0;
+ margin-left: -100vmax;
+ margin-top: -100vmax;
+ height: 200vmax;
+ width: 200vmax;
+ overflow: hidden;
+ background: var(--black);
+ transform: scale(0);
+ overflow: hidden;
+ }
+
+ #ripple.error {
+ transition: var(--ripple-activating-transition);
+ background: var(--mdc-theme-error)
+ }
+
+ #rippleShader {
+ background: var(--white);
+ opacity: 0;
+ height: 100%;
+ width: 100%;
+ }
+
+ #ripple.activating {
+ transition: var(--ripple-activating-transition);
+ transform: scale(1)
+ }
+
+ .activating #rippleShader {
+ transition: var(--ripple-activating-transition);
+ opacity: 1;
+ }
+
+ #ripple.disabling {
+ transition: var(--ripple-disable-transition);
+ opacity: 0;
+ }
+
+ #rippleContentWrapper {
+ position: absolute;
+ top: 100vmax;
+ left: 100vmax;
+ height: var(--window-height);
+ width: 100vw;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ }
+
+ #rippleContent {
+ opacity: 0;
+ text-align: center;
+ }
+
+ .activating-done #rippleContent {
+ opacity: 1;
+ transition: var(--ripple-activating-transition);
+ }
+`
+
+export const myButtonStyle = css`
+ vaadin-button {
+ height: 100%;
+ margin: 0;
+ cursor: pointer;
+ min-width: 80px;
+ background-color: #03a9f4;
+ color: white;
+ }
+
+ vaadin-button:hover {
+ opacity: 0.8;
+ }
+`
+
+export const mykeyPageStyles = css`
+ * {
+ --mdc-theme-primary: rgb(3, 169, 244);
+ --mdc-theme-secondary: var(--mdc-theme-primary);
+ --paper-input-container-focus-color: var(--mdc-theme-primary);
+ --mdc-theme-surface: var(--white);
+ --mdc-dialog-heading-ink-color: var(--black);
+ --mdc-dialog-content-ink-color: var(--black);
+ --lumo-primary-text-color: rgb(0, 167, 245);
+ --lumo-primary-color-50pct: rgba(0, 167, 245, 0.5);
+ --lumo-primary-color-10pct: rgba(0, 167, 245, 0.1);
+ --lumo-primary-color: hsl(199, 100%, 48%);
+ --lumo-base-color: var(--white);
+ --lumo-body-text-color: var(--black);
+ --_lumo-grid-border-color: var(--border);
+ --_lumo-grid-secondary-border-color: var(--border2);
+ }
+
+ .red {
+ --mdc-theme-primary: red;
+ }
+`
+
+export const settingsPageStyles = css`
+ * {
+ --mdc-theme-primary: var(--login-button);
+ --mdc-theme-secondary: var(--mdc-theme-primary);
+ --mdc-dialog-content-ink-color: var(--black);
+ --mdc-theme-surface: var(--white);
+ --mdc-theme-text-primary-on-background: var(--black);
+ --mdc-dialog-min-width: 300px;
+ --mdc-dialog-max-width: 650px;
+ --mdc-dialog-max-height: 700px;
+ --mdc-list-item-text-width: 100%;
+ }
+
+ #main {
+ width: 210px;
+ display: flex;
+ align-items: center;
+ }
+
+ .globe {
+ color: var(--black);
+ --mdc-icon-size: 36px;
+ }
+
+ span.name {
+ display: inline-block;
+ width: 150px;
+ font-weight: 600;
+ color: var(--general-color-blue);
+ border: 1px solid transparent;
+ }
+
+ .red {
+ --mdc-theme-primary: red;
+ }
+
+ .buttonred {
+ color: #f44336;
+ }
+
+ .buttongreen {
+ color: #03c851;
+ }
+
+ .buttonBlue {
+ color: var(--general-color-blue);
+ }
+
+ .floatleft {
+ float: left;
+ }
+
+ .floatright {
+ float: right;
+ }
+
+ .list-parent {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ width: 100%;
+ }
+
+ #customSelect {
+ position: relative;
+ border: 1px solid #ccc;
+ cursor: pointer;
+ background: var(--plugback);
+ }
+
+ #customSelect .selected {
+ padding: 10px;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ }
+
+ #customSelect ul {
+ position: absolute;
+ top: 100%;
+ left: 0;
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ border: 1px solid #ccc;
+ display: none;
+ background: var(--plugback);
+ width: 100%;
+ box-sizing: border-box;
+ z-index: 10;
+ }
+
+ #customSelect ul.open {
+ display: block;
+ }
+
+ #customSelect ul li {
+ padding: 10px;
+ transition: 0.2s all;
+ }
+
+ #customSelect ul li:hover {
+ background-color: var(--graylight);
+ }
+
+ .selected-left-side {
+ display: flex;
+ align-items: center;
+ }
+`
+
+export const sideMenuStyles = css`
+ nav {
+ padding: 0;
+ }
+
+ :host {
+ list-style: none;
+ width: 100%;
+ position: relative;
+ }
+
+ :host([compact]) {
+ width: auto;
+ }
+`
+
+export const sideMenuItemStyles = css`
+ :host {
+ --font-family: "Roboto", sans-serif;
+ --item-font-size: 0.9375rem;
+ --sub-item-font-size: 0.75rem;
+ --item-padding: 0.875rem;
+ --item-content-padding: 0.875rem;
+ --icon-height: 1.125rem;
+ --icon-width: 1.125rem;
+ --item-border-radius: 5px;
+ --item-selected-color: #dddddd;
+ --item-selected-color-text: #333333;
+ --item-color-active: #d1d1d1;
+ --item-color-hover: #eeeeee;
+ --item-text-color: #080808;
+ --item-icon-color: #080808;
+ --item-border-color: #eeeeee;
+ --item-border-selected-color: #333333;
+
+ --overlay-box-shadow: 0 2px 4px -1px hsla(214, 53%, 23%, 0.16), 0 3px 12px -1px hsla(214, 50%, 22%, 0.26);
+ --overlay-background-color: #ffffff;
+
+ --spacing: 4px;
+
+ font-family: var(--font-family);
+ display: flex;
+ overflow: hidden;
+ flex-direction: column;
+ border-radius: var(--item-border-radius);
+ }
+
+ #itemLink {
+ align-items: center;
+ font-size: var(--item-font-size);
+ font-weight: 400;
+ height: var(--icon-height);
+ transition: background-color 200ms;
+ padding: var(--item-padding);
+ cursor: pointer;
+ display: inline-flex;
+ flex-grow: 1;
+ align-items: center;
+ overflow: hidden;
+ text-decoration: none;
+ border-bottom: 1px solid var(--item-border-color);
+ text-transform: uppercase;
+ }
+
+ .hideItem {
+ display: none !important;
+ }
+
+ #itemLink:hover {
+ background-color: var(--item-color-hover);
+ }
+
+ #itemLink:active {
+ background-color: var(--item-color-active);
+ }
+
+ #content {
+ padding-left: var(--item-content-padding);
+ flex: 1;
+ }
+
+ :host([compact]) #content {
+ padding-left: 0;
+ display: none;
+ }
+
+ :host([selected]) #itemLink {
+ background-color: var(--item-selected-color);
+ color: var(--item-selected-color-text);
+ border-left: 3px solid var(--item-border-selected-color);
+ }
+
+ :host([selected]) slot[name="icon"]::slotted(*) {
+ color: var(--item-selected-color-text);
+ }
+
+ :host(:not([selected])) #itemLink {
+ color: var(--item-text-color);
+ }
+
+ :host([expanded]) {
+ background-color: var(--item-selected-color);
+ }
+
+ :host([hasSelectedChild]) {
+ background-color: var(--item-selected-color);
+ }
+
+ :host span {
+ cursor: inherit;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ user-select: none;
+ -webkit-user-select: none;
+ white-space: nowrap;
+ }
+
+ slot[name="icon"]::slotted(*) {
+ flex-shrink: 0;
+ color: var(--item-icon-color);
+ height: var(--icon-height);
+ width: var(--icon-width);
+ pointer-events: none;
+ }
+
+ #collapse-button {
+ float: right;
+ }
+
+ :host([compact]) #itemLink[level]:not([level="0"]) {
+ padding: calc(var(--item-padding) / 2);
+ }
+
+ :host(:not([compact])) #itemLink[level]:not([level="0"]) {
+ padding-left: calc(var(--icon-width) + var(--item-content-padding));
+ }
+
+ #itemLink[level]:not([level="0"]) #content {
+ display: block;
+ visibility: visible;
+ width: auto;
+ font-weight: 400;
+ font-size: var(--sub-item-font-size)
+ }
+
+ #overlay {
+ display: block;
+ left: 101%;
+ min-width: 200px;
+ padding: 4px 2px;
+ background-color: var(--overlay-background-color);
+ background-image: var(--overlay-background-image, none);
+ box-shadow: var(--overlay-box-shadow);
+ border: 1px solid var(--overlay-background-color);
+ border-left: 0;
+ border-radius: 0 3px 3px 0;
+ position: absolute;
+ z-index: 1;
+ animation: pop 200ms forwards;
+ }
+
+ @keyframes pop {
+ 0% {
+ transform: translateX(-5px);
+ opacity: 0.5;
+ }
+
+ 100% {
+ transform: translateX(0);
+ opacity: 1;
+ }
+ }
+`
+
+export const appInfoStyles = css`
+ * {
+ --mdc-theme-primary: rgb(3, 169, 244);
+ --paper-input-container-focus-color: var(--mdc-theme-primary);
+ }
+
+ .normal {
+ --mdc-theme-primary: rgb(3, 169, 244);
+ }
+
+ #profileInMenu {
+ flex: 0 0 100px;
+ padding: 12px;
+ border-top: 1px solid var(--border);
+ background: var(--sidetopbar);
+ }
+
+ .info {
+ margin: 0;
+ font-size: 14px;
+ font-weight: 100;
+ display: inline-block;
+ width: 100%;
+ padding-bottom: 8px;
+ color: var(--black);
+ }
+
+ .blue {
+ color: #03a9f4;
+ margin: 0;
+ font-size: 14px;
+ font-weight: 200;
+ display: inline;
+ }
+
+ .black {
+ color: var(--black);
+ margin: 0;
+ font-size: 14px;
+ font-weight: 200;
+ display: inline;
+ }
+`
+
+export const languageSelectorStyles = css`
+ select {
+ width: 175px;
+ height: 34px;
+ padding: 5px 0px 5px 5px;
+ font-size: 16px;
+ border: 1px solid var(--black);
+ border-radius: 3px;
+ color: var(--black);
+ background:
+ linear-gradient(45deg, transparent 50%, white 50%),
+ linear-gradient(135deg, white 50%, transparent 50%),
+ linear-gradient(to right, #03a9f4, #03a9f4);
+ background-position:
+ calc(100% - 17px) calc(0.5em + 4px),
+ calc(100% - 7px) calc(0.5em + 4px),
+ 100% 0;
+ background-size:
+ 10px 10px,
+ 10px 10px,
+ 2.2em 2.2em;
+ background-repeat: no-repeat;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ }
+
+ *:focus {
+ outline: none;
+ }
+
+ select option {
+ color: var(--black);
+ background: var(--white);
+ line-height: 34px;
+ }
+
+`
+
+export const newSelectorStyles = css`
+ select {
+ width: auto;
+ height: auto;
+ position: absolute;
+ top: 50px;
+ padding: 5px 5px 5px 5px;
+ font-size: 16px;
+ border: 1px solid var(--black);
+ border-radius: 3px;
+ color: var(--black);
+ background: var(--white);
+ overflow: auto;
+ }
+
+ *:focus {
+ outline: none;
+ }
+
+ select option {
+ color: var(--black);
+ background: var(--white);
+ line-height: 34px;
+ }
+
+ select option:hover {
+ color: var(--white);
+ background: var(--black);
+ line-height: 34px;
+ cursor: pointer;
+ }
+`
+
+export const qortThemeToggleStyles = css`
+ :host {
+ display: inline-block;
+ position: relative;
+ width: 54px;
+ height: 32px;
+ transform: translateY(-2px);
+ }
+
+ svg {
+ width: 32px;
+ height: 32px;
+ }
+
+ input {
+ cursor: pointer;
+ position: absolute;
+ z-index: 1;
+ opacity: 0;
+ width: 100%;
+ height: 100%;
+ }
+
+ .slider {
+ position: absolute;
+ cursor: pointer;
+ width: 100%;
+ height: 16px;
+ top: 50%;
+ transform: translateY(-50%);
+ background-color: var(--switchbackground);
+ border: 2px solid var(--switchborder);
+ border-radius: 1rem;
+ transition: all .4s ease;
+ }
+
+ .icon {
+ width: 32px;
+ height: 32px;
+ display: inline-block;
+ position: absolute;
+ top: 50%;
+ background: var(--switchbackground);
+ border: 2px solid var(--switchborder);
+ border-radius: 50%;
+ transition: transform 300ms ease;
+ }
+
+ :host([theme="light"]) .icon {
+ transform: translate(0, -50%);
+ }
+
+ input:checked~.icon,
+ :host([theme="dark"]) .icon {
+ transform: translate(calc(100% - 12px), -50%);
+ }
+
+ .moon {
+ display: none;
+ }
+
+ .moon svg {
+ transform: scale(0.6);
+ }
+
+ :host([theme="dark"]) .sun {
+ display: none;
+ }
+
+ :host([theme="dark"]) .moon {
+ display: inline-block;
+ }
+`
+
+export const searchModalStyles = css`
+ * {
+ --lumo-primary-text-color: rgb(0, 167, 245);
+ --lumo-primary-color-50pct: rgba(0, 167, 245, 0.5);
+ --lumo-primary-color-10pct: rgba(0, 167, 245, 0.1);
+ --lumo-primary-color: hsl(199, 100%, 48%);
+ --lumo-base-color: var(--white);
+ --lumo-body-text-color: var(--black);
+ --lumo-secondary-text-color: var(--sectxt);
+ --lumo-contrast-60pct: var(--vdicon);
+ --item-selected-color: var(--nav-selected-color);
+ --item-selected-color-text: var(--nav-selected-color-text);
+ --item-color-active: var(--nav-color-active);
+ --item-color-hover: var(--nav-color-hover);
+ --item-text-color: var(--nav-text-color);
+ --item-icon-color: var(--nav-icon-color);
+ --item-border-color: var(--nav-border-color);
+ --item-border-selected-color: var(--nav-border-selected-color);
+ }
+
+ paper-dialog.searchSettings {
+ min-width: 525px;
+ max-width: 525px;
+ min-height: auto;
+ max-height: 150px;
+ background-color: var(--white);
+ color: var(--black);
+ line-height: 1.6;
+ overflow: hidden;
+ border: 1px solid var(--black);
+ border-radius: 10px;
+ padding: 15px;
+ box-shadow: 0px 10px 15px rgba(0, 0, 0, 0.1);
+ }
+
+ .search {
+ display: inline;
+ width: 50%;
+ align-items: center;
+ }
+`
+
+export const startMintingStyles = css`
+ p,
+ h1 {
+ color: var(--black)
+ }
+
+ .dialogCustom {
+ position: fixed;
+ z-index: 10000;
+ display: flex;
+ justify-content: center;
+ flex-direction: column;
+ align-items: center;
+ top: 0px;
+ bottom: 0px;
+ left: 0px;
+ width: 100vw;
+ }
+
+ .dialogCustomInner {
+ width: 300px;
+ min-height: 400px;
+ background-color: var(--white);
+ box-shadow: var(--mdc-dialog-box-shadow, 0px 11px 15px -7px rgba(0, 0, 0, 0.2), 0px 24px 38px 3px rgba(0, 0, 0, 0.14), 0px 9px 46px 8px rgba(0, 0, 0, 0.12));
+ padding: 20px 24px;
+ border-radius: 4px;
+ }
+
+ .dialogCustomInner ul {
+ padding-left: 0px
+ }
+
+ .dialogCustomInner li {
+ margin-bottom: 10px;
+ }
+
+ .start-minting-wrapper {
+ position: absolute;
+ transform: translate(50%, 20px);
+ z-index: 10;
+ }
+
+ .dialog-header h1 {
+ font-size: 18px;
+ }
+
+ .row {
+ display: flex;
+ width: 100%;
+ align-items: center;
+ }
+
+ .modalFooter {
+ width: 100%;
+ display: flex;
+ justify-content: flex-end;
+ }
+
+ .hide {
+ visibility: hidden
+ }
+
+ .inactiveText {
+ opacity: .60
+ }
+
+ .column {
+ display: flex;
+ flex-direction: column;
+ width: 100%;
+ }
+
+ .smallLoading,
+ .smallLoading:after {
+ border-radius: 50%;
+ width: 2px;
+ height: 2px;
+ }
+
+ .smallLoading {
+ border-width: 0.6em;
+ border-style: solid;
+ border-color: rgba(3, 169, 244, 0.2) rgba(3, 169, 244, 0.2) rgba(3, 169, 244, 0.2) rgb(3, 169, 244);
+ font-size: 10px;
+ position: relative;
+ text-indent: -9999em;
+ transform: translateZ(0px);
+ animation: 1.1s linear 0s infinite normal none running loadingAnimation;
+ }
+
+ @-webkit-keyframes loadingAnimation {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg);
+ }
+
+ 100% {
+ -webkit-transform: rotate(360deg);
+ transform: rotate(360deg);
+ }
+ }
+
+ @keyframes loadingAnimation {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg);
+ }
+
+ 100% {
+ -webkit-transform: rotate(360deg);
+ transform: rotate(360deg);
+ }
+ }
+
+ .word-break {
+ word-break: break-all;
+ }
+
+ .dialog-container {
+ width: 300px;
+ min-height: 300px;
+ max-height: 75vh;
+ padding: 5px;
+ display: flex;
+ align-items: flex-start;
+ flex-direction: column;
+ }
+
+ .between {
+ justify-content: space-between;
+ }
+
+ .no-width {
+ width: auto
+ }
+
+ .between p {
+ margin: 0;
+ padding: 0;
+ color: var(--black);
+ }
+
+ .marginLoader {
+ margin-left: 10px;
+ }
+
+ .marginRight {
+ margin-right: 10px;
+ }
+
+ .warning {
+ display: flex;
+ flex-grow: 1
+ }
+
+ .message-error {
+ color: var(--error);
+ }
+`
+
+export const themeToggleStyles = css`
+ * {
+ --mdc-theme-primary: rgb(3, 169, 244);
+ --mdc-theme-secondary: var(--mdc-theme-primary);
+ --mdc-theme-error: rgb(255, 89, 89);
+ --lumo-primary-text-color: rgb(0, 167, 245);
+ --lumo-primary-color-50pct: rgba(0, 167, 245, 0.5);
+ --lumo-primary-color-10pct: rgba(0, 167, 245, 0.1);
+ --lumo-primary-color: hsl(199, 100%, 48%);
+ --lumo-base-color: var(--white);
+ --lumo-body-text-color: var(--black);
+ --lumo-secondary-text-color: var(--sectxt);
+ --lumo-contrast-60pct: var(--vdicon);
+ --item-selected-color: var(--nav-selected-color);
+ --item-selected-color-text: var(--nav-selected-color-text);
+ --item-color-active: var(--nav-color-active);
+ --item-color-hover: var(--nav-color-hover);
+ --item-text-color: var(--nav-text-color);
+ --item-icon-color: var(--nav-icon-color);
+ --item-border-color: var(--nav-border-color);
+ --item-border-selected-color: var(--nav-border-selected-color);
+ }
+
+ paper-icon-button {
+ -ms-transform: rotate(120deg);
+ transform: rotate(120deg);
+ }
+
+ :host([theme="light"]) .light-mode {
+ display: inline-block;
+ }
+
+ :host([theme="light"]) .dark-mode {
+ display: none;
+ }
+
+ :host([theme="dark"]) .light-mode {
+ display: none;
+ }
+
+ :host([theme="dark"]) .dark-mode {
+ display: inline-block;
+ }
+`
+
+export const walletProfileStyles = css`
+ #profileInMenu {
+ padding: 12px;
+ border-top: var(--border);
+ background: var(--sidetopbar);
+ color: var(--black);
+ }
+
+ #accountName {
+ margin: 0;
+ font-size: 18px;
+ font-weight: 500;
+ width: 100%;
+ padding-bottom: 8px;
+ display: flex;
+ }
+
+ #blocksMinted {
+ margin: 0;
+ margin-top: 0;
+ font-size: 12px;
+ color: #03a9f4;
+ }
+
+ #address {
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ margin: 0;
+ margin-top: 8px;
+ font-size: 11px;
+ }
+
+ .round-fullinfo {
+ position: relative;
+ width: 68px;
+ height: 68px;
+ border-radius: 50%;
+ }
+
+ .full-info-logo {
+ width: 68px;
+ height: 68px;
+ border-radius: 50%;
+ }
+
+ .inline-block-child {
+ flex: 1;
+ }
+`
+
+export const appViewStyles = css`
+ * {
+ --mdc-theme-primary: rgb(3, 169, 244);
+ --mdc-theme-secondary: var(--mdc-theme-primary);
+ --mdc-theme-error: rgb(255, 89, 89);
+ --lumo-primary-text-color: rgb(0, 167, 245);
+ --lumo-primary-color-50pct: rgba(0, 167, 245, 0.5);
+ --lumo-primary-color-10pct: rgba(0, 167, 245, 0.1);
+ --lumo-primary-color: hsl(199, 100%, 48%);
+ --lumo-base-color: var(--white);
+ --lumo-body-text-color: var(--black);
+ --lumo-secondary-text-color: var(--sectxt);
+ --lumo-contrast-60pct: var(--vdicon);
+ --item-selected-color: var(--nav-selected-color);
+ --item-selected-color-text: var(--nav-selected-color-text);
+ --item-color-active: var(--nav-color-active);
+ --item-color-hover: var(--nav-color-hover);
+ --item-text-color: var(--nav-text-color);
+ --item-icon-color: var(--nav-icon-color);
+ --item-border-color: var(--nav-border-color);
+ --item-border-selected-color: var(--nav-border-selected-color);
+ }
+
+ :host {
+ --app-drawer-width: 260px;
+ }
+
+ app-drawer-layout:not([narrow]) [drawer-toggle]:not(side-menu-item) {
+ display: none;
+ }
+
+ app-drawer {
+ box-shadow: var(--shadow-2);
+ }
+
+ app-header {
+ box-shadow: var(--shadow-2);
+ }
+
+ app-toolbar {
+ background: var(--sidetopbar);
+ color: var(--black);
+ border-top: var(--border);
+ height: 48px;
+ padding: 3px;
+ }
+
+ paper-progress {
+ --paper-progress-active-color: var(--mdc-theme-primary);
+ }
+
+ .s-menu {
+ list-style: none;
+ padding: 0px 0px;
+ background: var(--sidetopbar);
+ border-radius: 2px;
+ width: 100%;
+ border-top: 1px solid var(--border);
+ outline: none;
+ }
+
+ .search {
+ display: inline;
+ width: 50%;
+ align-items: center;
+ }
+
+ #sideBar {
+ height: 100vh;
+ display: flex;
+ flex-direction: column;
+ background: var(--sidetopbar);
+ }
+
+ .sideBarMenu {
+ overflow-y: auto;
+ flex: 1 1;
+ }
+
+ .sideBarMenu::-webkit-scrollbar-track {
+ background-color: whitesmoke;
+ border-radius: 7px;
+ }
+
+ .sideBarMenu::-webkit-scrollbar {
+ width: 6px;
+ border-radius: 7px;
+ background-color: whitesmoke;
+ }
+
+ .sideBarMenu::-webkit-scrollbar-thumb {
+ background-color: rgb(180, 176, 176);
+ border-radius: 7px;
+ transition: all 0.3s ease-in-out;
+ }
+
+ .sideBarMenu::-webkit-scrollbar-thumb:hover {
+ background-color: rgb(148, 146, 146);
+ cursor: pointer;
+ }
+
+ .red {
+ --mdc-theme-primary: #C6011F;
+ }
+
+ .setpass-wrapper {
+ width: 100%;
+ min-width: 400px;
+ max-width: 450px;
+ text-align: center;
+ background: var(--white);
+ border: 1px solid var(--black);
+ border-radius: 15px;
+ padding: 10px 10px 0px;
+ box-shadow: 0px 10px 15px rgba(0, 0, 0, 0.1);
+ }
+
+ .lock-wrapper {
+ width: 100%;
+ height: 100%;
+ min-width: 600px;
+ max-width: 600px;
+ min-height: 400px;
+ max-height: 400px;
+ text-align: center;
+ background: url("/img/qortal-lock.jpg");
+ border: 1px solid var(--black);
+ border-radius: 25px;
+ padding: 10px 10px 0px;
+ }
+
+ .text-wrapper {
+ width: 100%;
+ height: 100%;
+ min-width: 280px;
+ max-width: 280px;
+ min-height: 64px;
+ max-height: 64px;
+ text-align: center;
+ margin-left: 35px;
+ margin-top: 125px;
+ overflow: hidden;
+ }
+
+ .lock-title-white {
+ font-family: 'magistralbold';
+ font-weight: 700;
+ font-size: 26px;
+ line-height: 32px;
+ color: #ffffff;
+ }
+
+ .lock-title-red {
+ font-family: 'magistralbold';
+ font-weight: 700;
+ font-size: 26px;
+ line-height: 32px;
+ color: #df3636;
+ }
+`
+
+export const showPluginStyles = css`
+ html {
+ --scrollbarBG: #a1a1a1;
+ --thumbBG: #6a6c75;
+ }
+
+ *::-webkit-scrollbar {
+ width: 11px;
+ }
+
+ * {
+ scrollbar-width: thin;
+ scrollbar-color: var(--thumbBG) var(--scrollbarBG);
+ --mdc-theme-primary: rgb(3, 169, 244);
+ --mdc-theme-surface: var(--white);
+ --mdc-text-field-outlined-idle-border-color: var(--txtfieldborder);
+ --mdc-text-field-outlined-hover-border-color: var(--txtfieldhoverborder);
+ --mdc-text-field-label-ink-color: var(--black);
+ --mdc-text-field-ink-color: var(--black);
+ --mdc-select-ink-color: var(--black);
+ --mdc-select-fill-color: var(--black);
+ --mdc-select-label-ink-color: var(--black);
+ --mdc-select-idle-line-color: var(--black);
+ --mdc-select-hover-line-color: var(--black);
+ --mdc-select-outlined-idle-border-color: var(--txtfieldborder);
+ --mdc-select-outlined-hover-border-color: var(--txtfieldhoverborder);
+ --mdc-dialog-content-ink-color: var(--black);
+ --mdc-dialog-shape-radius: 25px;
+ --mdc-dialog-min-width: 400px;
+ --mdc-dialog-max-width: 700px;
+ }
+
+ *::-webkit-scrollbar-track {
+ background: var(--scrollbarBG);
+ }
+
+ *::-webkit-scrollbar-thumb {
+ background-color: var(--thumbBG);
+ border-radius: 6px;
+ border: 3px solid var(--scrollbarBG);
+ }
+
+ .hideIframe {
+ display: none;
+ position: absolute;
+ z-Index: -10;
+ }
+
+ .showIframe {
+ display: flex;
+ position: relative;
+ z-Index: 1;
+ }
+
+ .tabs {
+ display: flex;
+ width: 100%;
+ max-width: 100%;
+ justify-content: flex-start;
+ padding-top: 0.5em;
+ padding-left: 0.5em;
+ background: var(--sidetopbar);
+ border-bottom: 1px solid var(--black);
+ height: 48px;
+ box-sizing: border-box;
+ }
+
+ .tab {
+ padding: 0.5em;
+ background: var(--white);
+ border-top-right-radius: 10px;
+ border-top-left-radius: 10px;
+ border-top: 1px solid grey;
+ border-left: 1px solid grey;
+ border-right: 1px solid grey;
+ color: grey;
+ cursor: pointer;
+ transition: background 0.3s;
+ position: relative;
+ width: auto;
+ min-width: 110px;
+ max-width: 220px;
+ overflow: hidden;
+ z-index: 2;
+ }
+
+ .tabCard {
+ display: inline-block;
+ }
+
+ .tabTitle {
+ display: inline-block;
+ position: relative;
+ width: auto;
+ min-width: 1px;
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ }
+
+ .tab:hover {
+ background: var(--nav-color-hover);
+ color: var(--black);
+ min-width: fit-content;
+ }
+
+ .tab.active {
+ display: inline-block;
+ min-width: fit-content;
+ max-width: 200px;
+ margin-bottom: -1px;
+ background: var(--white);
+ color: var(--black);
+ border-top-right-radius: 10px;
+ border-top-left-radius: 10px;
+ border-top: 1px solid var(--black);
+ border-left: 1px solid var(--black);
+ border-right: 1px solid var(--black);
+ border-bottom: 1px solid var(--white);
+ z-index: 1;
+ }
+
+ .close {
+ position: absolute;
+ top: 8px;
+ right: 5px;
+ color: var(--black);
+ --mdc-icon-size: 20px;
+ }
+
+ .close:hover {
+ color: #C6011F;
+ font-weight: bold;
+ }
+
+ .tab .close,
+ .tab .show {
+ display: none;
+ }
+
+ .tab.active .close,
+ .tab.active .show {
+ display: inline-block;
+ color: var(--black);
+ }
+
+ .tab:hover .close,
+ .tab:hover .show {
+ display: inline-block;
+ color: var(--black);
+ }
+
+ .tab .close:hover,
+ .tab.active .close:hover {
+ color: #C6011F;
+ font-weight: bold;
+ }
+
+ .add-tab-button {
+ margin-left: 10px;
+ font-weight: bold;
+ background: none;
+ border: none;
+ color: var(--general-color-blue);
+ font-size: 2em;
+ cursor: pointer;
+ transition: color 0.3s;
+ }
+
+ .add-tab-button:hover {
+ color: var(--black);
+ }
+
+ .add-dev-button {
+ position: fixed;
+ right: 20px;
+ margin-left: 10px;
+ margin-top: 4px;
+ max-height: 28px;
+ padding: 5px 5px;
+ font-size: 14px;
+ background-color: var(--general-color-blue);
+ color: white;
+ border: 1px solid transparent;
+ border-radius: 3px;
+ cursor: pointer;
+ }
+
+ .add-dev-button:hover {
+ opacity: 0.8;
+ cursor: pointer;
+ }
+
+ .red {
+ --mdc-theme-primary: #F44336;
+ }
+
+ .iconActive {
+ position: absolute;
+ top: 5px;
+ color: var(--general-color-blue);
+ --mdc-icon-size: 24px;
+ }
+
+ .iconInactive {
+ position: absolute;
+ top: 5px;
+ color: #999;
+ --mdc-icon-size: 24px;
+ }
+
+ .tab:hover .iconInactive {
+ color: var(--general-color-blue);
+ }
+
+ .count {
+ position: relative;
+ top: -5px;
+ font-weight: bold;
+ background-color: #C6011F;
+ color: white;
+ font-size: 12px;
+ padding: 2px 6px;
+ text-align: center;
+ border-radius: 5px;
+ animation: pulse 1500ms infinite;
+ animation-duration: 6s;
+ }
+
+ .ml-5 {
+ margin-left: 5px;
+ }
+
+ .ml-10 {
+ margin-left: 10px;
+ }
+
+ .ml-15 {
+ margin-left: 15px;
+ }
+
+ .ml-20 {
+ margin-left: 20px;
+ }
+
+ .ml-25 {
+ margin-left: 25px;
+ }
+
+ .ml-30 {
+ margin-left: 30px;
+ }
+
+ .ml-35 {
+ margin-left: 35px;
+ }
+
+ .ml-40 {
+ margin-left: 40px;
+ }
+
+ @keyframes pulse {
+ 0% {
+ box-shadow: #C6011F 0 0 0 0;
+ }
+
+ 75% {
+ box-shadow: #ff69b400 0 0 0 16px;
+ }
+ }
+`
+
+export const navBarStyles = css`
+ * {
+ --mdc-theme-primary: rgb(3, 169, 244);
+ --mdc-theme-surface: var(--white);
+ --mdc-text-field-outlined-idle-border-color: var(--txtfieldborder);
+ --mdc-text-field-outlined-hover-border-color: var(--txtfieldhoverborder);
+ --mdc-text-field-label-ink-color: var(--black);
+ --mdc-text-field-ink-color: var(--black);
+ --mdc-dialog-content-ink-color: var(--black);
+ --mdc-dialog-shape-radius: 25px;
+ --mdc-dialog-min-width: 300px;
+ --mdc-dialog-max-width: 700px;
+ }
+
+ .parent {
+ display: flex;
+ flex-direction: column;
+ flex-flow: column;
+ align-items: center;
+ padding: 20px;
+ height: calc(100vh - 120px);
+ overflow-y: auto;
+ }
+
+ .navbar {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ background-color: var(--white);
+ padding: 10px 20px;
+ max-width: 750px;
+ width: 80%;
+ }
+
+ .navbar input {
+ font-size: 16px;
+ color: #000;
+ padding: 5px;
+ flex-grow: 1;
+ margin-right: 10px;
+ border: 1px solid var(--black);
+ }
+
+ .navbar button {
+ padding: 5px 10px;
+ font-size: 18px;
+ background-color: var(--app-background-1);
+ background-image: linear-gradient(315deg, var(--app-background-1) 0%, var(--app-background-2) 74%);
+ color: var(--app-icon);
+ border: 1px solid transparent;
+ border-radius: 3px;
+ cursor: pointer;
+ }
+
+ .navbar button:hover {
+ background-color: #45a049;
+ }
+
+ .app-list {
+ display: flex;
+ justify-content: space-between;
+ padding: 10px 0;
+ gap: 10px;
+ flex-wrap: wrap;
+ }
+
+ .app-list .app-icon {
+ position: relative;
+ text-align: center;
+ font-size: 15px;
+ font-weight: bold;
+ color: var(--black);
+ width: 175px;
+ height: 110px;
+ background: transparent;
+ padding: 5px;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ gap: 10px;
+ }
+
+ .text {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ display: block;
+ width: 100%;
+ min-width: 1px;
+ }
+
+ .app-list .app-icon span {
+ display: block;
+ }
+
+ .app-icon-box {
+ display: flex;
+ align-items: center;
+ padding-left: 14px;
+ width: 80px;
+ min-width: 80px;
+ height: 80px;
+ min-height: 80px;
+ background-color: var(--app-background-1);
+ background-image: linear-gradient(315deg, var(--app-background-1) 0%, var(--app-background-2) 74%);
+ border-top-left-radius: 10px;
+ border-top-right-radius: 20px;
+ border-bottom-left-radius: 20px;
+ border-bottom-right-radius: 10px;
+ position: relative;
+ }
+
+ .app-list .app-icon:hover .removeIcon {
+ display: inline;
+ }
+
+ .menuIcon {
+ color: var(--app-icon);
+ --mdc-icon-size: 64px;
+ cursor: pointer;
+ }
+
+ .menuIconPos {
+ right: -2px;
+ }
+
+ .removeIconPos {
+ position: absolute;
+ top: -10px;
+ right: -10px;
+ z-index: 1;
+ }
+
+ .menuIconPos:hover .removeIcon {
+ display: inline;
+ }
+
+ .removeIcon {
+ display: none;
+ color: var(--black);
+ --mdc-icon-size: 28px;
+ cursor: pointer;
+ position: relative;
+ z-index: 1;
+ }
+
+ .removeIcon:hover {
+ color: #C6011F;
+ font-weight: bold;
+ }
+
+ .red {
+ --mdc-theme-primary: #F44336;
+ }
+
+ select {
+ padding: 10px 10px 10px 10px;
+ width: 100%;
+ font-size: 16px;
+ font-weight: 500;
+ background: var(--white);
+ color: var(--black);
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+ background-image: url('/img/arrow.png');
+ background-repeat: no-repeat;
+ background-position: right 10px center;
+ background-size: 20px;
+ }
+
+ .resetIcon {
+ position: fixed;
+ right: 20px;
+ top: 116px;
+ color: #666;
+ --mdc-icon-size: 32px;
+ cursor: pointer;
+ }
+
+ .resetIcon:hover {
+ color: var(--general-color-blue);
+ font-weight: bold;
+ }
+
+ .searchIcon {
+ position: fixed;
+ left: 20px;
+ top: 116px;
+ color: #666;
+ --mdc-icon-size: 32px;
+ cursor: pointer;
+ }
+
+ .searchIcon:hover {
+ color: var(--general-color-blue);
+ font-weight: bold;
+ }
+
+ .importIcon {
+ position: fixed;
+ left: 20px;
+ bottom: 16px;
+ color: #666;
+ --mdc-icon-size: 32px;
+ cursor: pointer;
+ }
+
+ .importIcon:hover {
+ color: var(--general-color-blue);
+ font-weight: bold;
+ }
+
+ .exportIcon {
+ position: fixed;
+ right: 20px;
+ bottom: 16px;
+ color: #666;
+ --mdc-icon-size: 32px;
+ cursor: pointer;
+ }
+
+ .exportIcon:hover {
+ color: var(--general-color-blue);
+ font-weight: bold;
+ }
+
+ paper-dialog.searchSettings {
+ width: 100%;
+ max-width: 550px;
+ height: auto;
+ max-height: 600px;
+ background-color: var(--white);
+ color: var(--black);
+ line-height: 1.6;
+ overflow: hidden;
+ border: 1px solid var(--black);
+ border-radius: 10px;
+ padding: 15px;
+ }
+
+ paper-dialog button {
+ padding: 5px 10px;
+ font-size: 18px;
+ background-color: var(--general-color-blue);
+ color: white;
+ border: 1px solid transparent;
+ border-radius: 5px;
+ cursor: pointer;
+ }
+
+ paper-dialog button:hover {
+ opacity: 0.8;
+ cursor: pointer;
+ }
+
+ .search {
+ display: inline;
+ width: 50%;
+ align-items: center;
+ }
+
+ .divCard {
+ height: auto;
+ max-height: 500px;
+ border: 1px solid var(--border);
+ padding: 1em;
+ margin-bottom: 1em;
+ }
+
+ img {
+ border-radius: 25%;
+ max-width: 32px;
+ height: 100%;
+ max-height: 32px;
+ }
+
+ vaadin-text-field[focused]::part(input-field) {
+ border-color: var(--general-color-blue);
+ }
+`
+
+export const appAvatarStyles = css`
+ :host {
+ position: absolute;
+ left: 50%;
+ top: 50%;
+ transform: translate(-50%, -50%);
+ cursor: pointer;
+ }
+
+ .menuIcon {
+ color: var(--app-icon);
+ --mdc-icon-size: 64px;
+ cursor: pointer;
+ }
+`
+
+export const syncIndicator2Styles = css`
+ * {
+ --mdc-theme-text-primary-on-background: var(--black);
+ box-sizing: border-box;
+ }
+
+ :host {
+ box-sizing: border-box;
+ position: fixed;
+ bottom: 50px;
+ right: 25px;
+ z-index: 50000;
+ }
+
+ .parent {
+ width: 360px;
+ padding: 10px;
+ border-radius: 8px;
+ border: 1px solid var(--black);
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ user-select: none;
+ background: var(--white);
+ }
+
+ .row {
+ display: flex;
+ gap: 10px;
+ width: 100%;
+ }
+
+ .column {
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+ width: 100%;
+ }
+
+ .bootstrap-button {
+ font-family: Roboto, sans-serif;
+ font-size: 16px;
+ color: var(--mdc-theme-primary);
+ background-color: transparent;
+ padding: 8px 10px;
+ border-radius: 5px;
+ border: none;
+ transition: all 0.3s ease-in-out;
+ }
+
+ .bootstrap-button:hover {
+ cursor: pointer;
+ background-color: #03a8f475;
+ }
+`
+
+export const tourComponentStyles = css`
+ * {
+ --mdc-theme-primary: rgb(3, 169, 244);
+ --mdc-theme-secondary: var(--mdc-theme-primary);
+ --mdc-theme-surface: var(--white);
+ --mdc-dialog-content-ink-color: var(--black);
+ box-sizing: border-box;
+ color: var(--black);
+ background: var(--white);
+ }
+
+ :host {
+ box-sizing: border-box;
+ position: fixed;
+ bottom: 25px;
+ right: 25px;
+ z-index: 50000;
+ }
+
+ .full-info-wrapper {
+ width: 100%;
+ min-width: 600px;
+ max-width: 600px;
+ text-align: center;
+ background: var(--white);
+ border: 1px solid var(--black);
+ border-radius: 15px;
+ padding: 25px;
+ box-shadow: 0px 10px 15px rgba(0, 0, 0, 0.1);
+ display: block !important;
+ }
+
+ .buttons {
+ display: inline;
+ }
+
+ .accept-button {
+ font-family: Roboto, sans-serif;
+ letter-spacing: 0.3px;
+ font-weight: 300;
+ padding: 8px 5px;
+ border-radius: 3px;
+ text-align: center;
+ color: var(--black);
+ transition: all 0.3s ease-in-out;
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ font-size: 18px;
+ justify-content: center;
+ outline: 1px solid var(--black);
+ }
+
+ .accept-button:hover {
+ cursor: pointer;
+ background-color: #03a8f485;
+ }
+
+ .close-button {
+ font-family: Roboto, sans-serif;
+ letter-spacing: 0.3px;
+ font-weight: 300;
+ padding: 8px 5px;
+ border-radius: 3px;
+ text-align: center;
+ color: #f44336;
+ transition: all 0.3s ease-in-out;
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ font-size: 18px;
+ width: auto;
+ }
+
+ .close-button:hover {
+ cursor: pointer;
+ background-color: #f4433663;
+ }
+
+ .driver-popover.driverjs-theme {
+ background-color: var(--white);
+ color: var(--black);
+ max-width: 500px;
+ width: auto;
+ }
+
+ .driver-popover.driverjs-theme .driver-popover-title {
+ font-size: 20px;
+ text-align: center;
+ }
+
+ .driver-popover.driverjs-theme .driver-popover-title,
+ .driver-popover.driverjs-theme .driver-popover-description,
+ .driver-popover.driverjs-theme .driver-popover-progress-text {
+ color: var(--black);
+ font-family: Roboto, sans-serif;
+ }
+
+ .driver-popover.driverjs-theme .driver-popover-description {
+ font-size: 16px;
+ }
+
+ .driver-popover.driverjs-theme button {
+ flex: 1;
+ text-align: center;
+ background-color: #000;
+ color: #ffffff;
+ border: 2px solid #000;
+ text-shadow: none;
+ font-size: 14px;
+ padding: 5px 8px;
+ border-radius: 6px;
+ }
+
+ .driver-popover.driverjs-theme .test-span {
+ color: green;
+ }
+
+ .driver-popover.driverjs-theme button:hover {
+ background-color: #000;
+ color: #ffffff;
+ }
+
+ .driver-popover.driverjs-theme .driver-popover-navigation-btns {
+ justify-content: space-between;
+ gap: 3px;
+ }
+
+ .driver-popover.driverjs-theme .driver-popover-close-btn {
+ color: #9b9b9b;
+ }
+
+ .driver-popover.driverjs-theme .driver-popover-close-btn:hover {
+ color: #000;
+ }
+
+ .driver-popover.driverjs-theme .driver-popover-footer {
+ gap: 20px;
+ }
+
+ .driver-popover.driverjs-theme .driver-popover-footer button {
+ background-color: #000 !important;
+ }
+
+ .driver-popover.driverjs-theme .driver-popover-arrow-side-left.driver-popover-arrow {
+ border-left-color: #fde047;
+ }
+
+ .driver-popover.driverjs-theme .driver-popover-arrow-side-right.driver-popover-arrow {
+ border-right-color: #fde047;
+ }
+
+ .driver-popover.driverjs-theme .driver-popover-arrow-side-top.driver-popover-arrow {
+ border-top-color: #fde047;
+ }
+
+ .driver-popover.driverjs-theme .driver-popover-arrow-side-bottom.driver-popover-arrow {
+ border-bottom-color: #fde047;
+ }
+`
+
+export const createAccountSectionStyles = css`
+ * {
+ --mdc-theme-primary: var(--login-button);
+ --mdc-theme-secondary: var(--mdc-theme-primary);
+ --paper-input-container-focus-color: var(--mdc-theme-primary);
+ --mdc-theme-surface: var(--white);
+ --mdc-dialog-content-ink-color: var(--black);
+ --mdc-checkbox-unchecked-color: var(--black);
+ --lumo-primary-text-color: var(--login-border);
+ --lumo-primary-color-50pct: var(--login-border-50pct);
+ --lumo-primary-color-10pct: var(--login-border-10pct);
+ --lumo-primary-color: hsl(199, 100%, 48%);
+ --lumo-base-color: var(--white);
+ --lumo-body-text-color: var(--black);
+ --lumo-secondary-text-color: var(--sectxt);
+ --lumo-contrast-60pct: var(--vdicon);
+ --_lumo-grid-border-color: var(--border);
+ --_lumo-grid-secondary-border-color: var(--border2);
+ }
+
+ .red {
+ --mdc-theme-primary: red;
+ }
+
+ mwc-formfield {
+ color: var(--black);
+ }
+`
+
+export const welcomePageStyles = css`
+ * {
+ --mdc-theme-primary: var(--login-button);
+ --mdc-theme-secondary: var(--mdc-theme-primary);
+ --mdc-button-outline-color: var(--general-color-blue);
+ }
+
+ .button-outline {
+ margin: 6px;
+ width: 90%;
+ max-width:90vw;
+ border-top: 0;
+ border-bottom: 0;
+ }
+
+ .welcome-page {
+ padding: 12px 0;
+ overflow: hidden;
+ }
+`
+
+export const logoutViewStyles = css`
+ * {
+ --mdc-theme-primary: rgb(3, 169, 244);
+ --mdc-theme-secondary: var(--mdc-theme-primary);
+ --mdc-theme-surface: var(--white);
+ --mdc-dialog-content-ink-color: var(--black);
+ }
+
+ .decline {
+ --mdc-theme-primary: var(--mdc-theme-error)
+ }
+
+ .buttons {
+ text-align:right;
+ }
+`
+
+export const notificationBellStyles = css`
+ .layout {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ position: relative;
+ }
+
+ .count {
+ position: absolute;
+ top: -5px;
+ right: -5px;
+ font-size: 12px;
+ background-color: red;
+ color: white;
+ border-radius: 50%;
+ width: 16px;
+ height: 16px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ user-select: none;
+ }
+
+ .nocount {
+ display: none;
+ }
+
+ .popover-panel {
+ position: absolute;
+ width: 200px;
+ padding: 10px;
+ background-color: var(--white);
+ border: 1px solid var(--black);
+ border-radius: 4px;
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
+ top: 40px;
+ max-height: 350px;
+ overflow: auto;
+ scrollbar-width: thin;
+ scrollbar-color: #6a6c75 #a1a1a1;
+ }
+
+ .popover-panel::-webkit-scrollbar {
+ width: 11px;
+ }
+
+ .popover-panel::-webkit-scrollbar-track {
+ background: #a1a1a1;
+ }
+
+ .popover-panel::-webkit-scrollbar-thumb {
+ background-color: #6a6c75;
+ border-radius: 6px;
+ border: 3px solid #a1a1a1;
+ }
+
+ .notifications-list {
+ display: flex;
+ flex-direction: column;
+ }
+
+ .notification-item {
+ padding: 5px;
+ border-bottom: 1px solid;
+ display: flex;
+ justify-content: space-between;
+ cursor: pointer;
+ transition: 0.2s all;
+ }
+
+ .notification-item:hover {
+ background: var(--nav-color-hover);
+ }
+
+ p {
+ font-size: 14px;
+ color: var(--black);
+ margin: 0px;
+ padding: 0px;
+ }
+`
+
+export const notificationBellGeneralStyles = css`
+ .layout {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ position: relative;
+ }
+
+ .count {
+ position: absolute;
+ top: -5px;
+ right: -5px;
+ font-size: 12px;
+ background-color: red;
+ color: white;
+ border-radius: 50%;
+ width: 16px;
+ height: 16px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ }
+
+ .nocount {
+ display: none;
+ }
+
+ .popover-panel {
+ position: absolute;
+ width: 200px;
+ padding: 10px;
+ background-color: var(--white);
+ border: 1px solid var(--black);
+ border-radius: 4px;
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
+ top: 40px;
+ max-height: 350px;
+ overflow: auto;
+ scrollbar-width: thin;
+ scrollbar-color: #6a6c75 #a1a1a1;
+ }
+
+ .popover-panel::-webkit-scrollbar {
+ width: 11px;
+ }
+
+ .popover-panel::-webkit-scrollbar-track {
+ background: #a1a1a1;
+ }
+
+ .popover-panel::-webkit-scrollbar-thumb {
+ background-color: #6a6c75;
+ border-radius: 6px;
+ border: 3px solid #a1a1a1;
+ }
+
+ .notifications-list {
+ display: flex;
+ flex-direction: column;
+ }
+
+ .notification-item {
+ padding: 5px;
+ border-bottom: 1px solid;
+ display: flex;
+ justify-content: space-between;
+ cursor: pointer;
+ transition: 0.2s all;
+ }
+
+ .notification-item:hover {
+ background: var(--nav-color-hover);
+ }
+
+ p {
+ font-size: 14px;
+ color: var(--black);
+ margin: 0px;
+ padding: 0px;
+ }
+`
+
+export const notificationItemTxStyles = css`
+ .centered {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ }
+
+ .layout {
+ width: 100px;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ position: relative;
+ }
+
+ .count {
+ position: absolute;
+ top: -5px;
+ right: -5px;
+ font-size: 12px;
+ background-color: red;
+ color: white;
+ border-radius: 50%;
+ width: 16px;
+ height: 16px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ }
+
+ .nocount {
+ display: none;
+ }
+
+ .popover-panel {
+ position: absolute;
+ width: 200px;
+ padding: 10px;
+ background-color: var(--white);
+ border: 1px solid var(--black);
+ border-radius: 4px;
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
+ top: 40px;
+ max-height: 350px;
+ overflow: auto;
+ scrollbar-width: thin;
+ scrollbar-color: #6a6c75 #a1a1a1;
+ }
+
+ .popover-panel::-webkit-scrollbar {
+ width: 11px;
+ }
+
+ .popover-panel::-webkit-scrollbar-track {
+ background: #a1a1a1;
+ }
+
+ .popover-panel::-webkit-scrollbar-thumb {
+ background-color: #6a6c75;
+ border-radius: 6px;
+ border: 3px solid #a1a1a1;
+ }
+
+ .notifications-list {
+ display: flex;
+ flex-direction: column;
+ }
+
+ .notification-item {
+ padding: 5px;
+ border-bottom: 1px solid;
+ display: flex;
+ flex-direction: column;
+ cursor: default;
+ }
+
+ .notification-item:hover {
+ background: var(--nav-color-hover);
+ }
+
+ p {
+ font-size: 14px;
+ color: var(--black);
+ margin: 0px;
+ padding: 0px;
+ }
+
+ .loader,
+ .loader:before,
+ .loader:after {
+ border-radius: 50%;
+ width: 10px;
+ height: 10px;
+ -webkit-animation-fill-mode: both;
+ animation-fill-mode: both;
+ -webkit-animation: load7 1.8s infinite ease-in-out;
+ animation: load7 1.8s infinite ease-in-out;
+ }
+
+ .loader {
+ color: var(--black);
+ font-size: 5px;
+ margin-bottom: 20px;
+ position: relative;
+ text-indent: -9999em;
+ -webkit-transform: translateZ(0);
+ -ms-transform: translateZ(0);
+ transform: translateZ(0);
+ -webkit-animation-delay: -0.16s;
+ animation-delay: -0.16s;
+ }
+
+ .loader:before,
+ .loader:after {
+ content: '';
+ position: absolute;
+ top: 0;
+ }
+
+ .loader:before {
+ left: -3.5em;
+ -webkit-animation-delay: -0.32s;
+ animation-delay: -0.32s;
+ }
+
+ .loader:after {
+ left: 3.5em;
+ }
+
+ @-webkit-keyframes load7 {
+
+ 0%,
+ 80%,
+ 100% {
+ box-shadow: 0 2.5em 0 -1.3em;
+ }
+
+ 40% {
+ box-shadow: 0 2.5em 0 0;
+ }
+ }
+
+ @keyframes load7 {
+
+ 0%,
+ 80%,
+ 100% {
+ box-shadow: 0 2.5em 0 -1.3em;
+ }
+
+ 40% {
+ box-shadow: 0 2.5em 0 0;
+ }
+ }
+`
+
+export const popoverComponentStyles = css`
+ :host {
+ display: none;
+ position: absolute;
+ background-color: var(--white);
+ border: 1px solid #ddd;
+ padding: 8px;
+ z-index: 10;
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
+ color: var(--black);
+ max-width: 250px;
+ }
+
+ .close-icon {
+ cursor: pointer;
+ float: right;
+ margin-left: 10px;
+ color: var(--black)
+ }
+`
+
+export const accountViewStyles = css`
+ .sub-main {
+ position: relative;
+ text-align: center;
+ }
+
+ .center-box {
+ position: relative;
+ top: 45%;
+ left: 50%;
+ transform: translate(-50%, 0%);
+ text-align: center;
+ }
+
+ .img-icon {
+ display: block;
+ margin-top: 10px;
+ }
+
+ .content-box {
+ border: 1px solid #a1a1a1;
+ padding: 10px 25px;
+ text-align: left;
+ display: inline-block;
+ }
+
+ .title {
+ font-weight: 600;
+ font-size: 15px;
+ display: block;
+ line-height: 32px;
+ opacity: 0.66;
+ }
+
+ .value {
+ font-size: 16px;
+ display: inline-block;
+ }
+
+ #accountName {
+ margin: 0;
+ font-size: 24px;
+ font-weight: 500;
+ display: inline-block;
+ width: 100%;
+ }
+`
+
+export const exportKeysStyles = css`
+ * {
+ --mdc-theme-primary: rgb(3, 169, 244);
+ --mdc-theme-surface: var(--white);
+ --mdc-dialog-content-ink-color: var(--black);
+ --mdc-dialog-min-width: 500px;
+ --mdc-dialog-max-width: 750px;
+ --lumo-primary-text-color: rgb(0, 167, 245);
+ --lumo-primary-color-50pct: rgba(0, 167, 245, 0.5);
+ --lumo-primary-color-10pct: rgba(0, 167, 245, 0.1);
+ --lumo-primary-color: hsl(199, 100%, 48%);
+ --lumo-base-color: var(--white);
+ --lumo-body-text-color: var(--black);
+ --lumo-secondary-text-color: var(--sectxt);
+ --lumo-contrast-60pct: var(--vdicon);
+ }
+
+ .center-box {
+ position: relative;
+ top: 45%;
+ left: 50%;
+ transform: translate(-50%, 0%);
+ text-align: center;
+ }
+
+ .sub-main {
+ position: relative;
+ text-align: center;
+ height: auto;
+ width: 100%;
+ }
+
+ .content-box {
+ text-align: center;
+ display: inline-block;
+ min-width: 400px;
+ margin-bottom: 10px;
+ margin-left: 10px;
+ margin-top: 20px;
+ }
+
+ .export-button {
+ display: inline-flex;
+ flex-direction: column;
+ justify-content: center;
+ align-content: center;
+ border: none;
+ border-radius: 20px;
+ padding-left: 10px;
+ padding-right: 10px;
+ color: white;
+ background: #03a9f4;
+ width: 75%;
+ font-size: 16px;
+ cursor: pointer;
+ height: 40px;
+ margin-top: 1rem;
+ text-transform: uppercase;
+ text-decoration: none;
+ transition: all .2s;
+ position: relative;
+ }
+
+ .red {
+ --mdc-theme-primary: #F44336;
+ }
+
+ .green {
+ --mdc-theme-primary: #198754;
+ }
+
+ .button-row {
+ position: relative;
+ display: flex;
+ align-items: center;
+ align-content: center;
+ font-family: Montserrat, sans-serif;
+ font-weight: 600;
+ color: var(--black);
+ margin-top: 20px;
+ }
+
+ .repair-button {
+ height: 40px;
+ padding: 10px 10px;
+ font-size: 16px;
+ font-weight: 500;
+ background-color: #03a9f4;
+ color: white;
+ border: 1px solid transparent;
+ border-radius: 20px;
+ text-decoration: none;
+ text-transform: uppercase;
+ cursor: pointer;
+ }
+
+ .repair-button:hover {
+ opacity: 0.8;
+ cursor: pointer;
+ }
+
+ .lds-roller {
+ display: inline-block;
+ position: relative;
+ width: 80px;
+ height: 80px;
+ }
+
+ .lds-roller div {
+ animation: lds-roller 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite;
+ transform-origin: 40px 40px;
+ }
+
+ .lds-roller div:after {
+ content: " ";
+ display: block;
+ position: absolute;
+ width: 7px;
+ height: 7px;
+ border-radius: 50%;
+ background: var(--black);
+ margin: -4px 0 0 -4px;
+ }
+
+ .lds-roller div:nth-child(1) {
+ animation-delay: -0.036s;
+ }
+
+ .lds-roller div:nth-child(1):after {
+ top: 63px;
+ left: 63px;
+ }
+
+ .lds-roller div:nth-child(2) {
+ animation-delay: -0.072s;
+ }
+
+ .lds-roller div:nth-child(2):after {
+ top: 68px;
+ left: 56px;
+ }
+
+ .lds-roller div:nth-child(3) {
+ animation-delay: -0.108s;
+ }
+
+ .lds-roller div:nth-child(3):after {
+ top: 71px;
+ left: 48px;
+ }
+
+ .lds-roller div:nth-child(4) {
+ animation-delay: -0.144s;
+ }
+
+ .lds-roller div:nth-child(4):after {
+ top: 72px;
+ left: 40px;
+ }
+
+ .lds-roller div:nth-child(5) {
+ animation-delay: -0.18s;
+ }
+
+ .lds-roller div:nth-child(5):after {
+ top: 71px;
+ left: 32px;
+ }
+
+ .lds-roller div:nth-child(6) {
+ animation-delay: -0.216s;
+ }
+
+ .lds-roller div:nth-child(6):after {
+ top: 68px;
+ left: 24px;
+ }
+
+ .lds-roller div:nth-child(7) {
+ animation-delay: -0.252s;
+ }
+
+ .lds-roller div:nth-child(7):after {
+ top: 63px;
+ left: 17px;
+ }
+
+ .lds-roller div:nth-child(8) {
+ animation-delay: -0.288s;
+ }
+
+ .lds-roller div:nth-child(8):after {
+ top: 56px;
+ left: 12px;
+ }
+
+ @keyframes lds-roller {
+ 0% {
+ transform: rotate(0deg);
+ }
+
+ 100% {
+ transform: rotate(360deg);
+ }
+ }
+`
+
+export const notificationsViewStyles = css`
+ .sub-main {
+ position: relative;
+ text-align: center;
+ }
+
+ .notification-box {
+ display: block;
+ position: relative;
+ top: 45%;
+ left: 50%;
+ transform: translate(-50%, 0%);
+ text-align: center;
+ }
+
+ @media(min-width: 1400px) {
+ .notification-box {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ grid-gap: 30px;
+ }
+ }
+
+ .checkbox-row {
+ position: relative;
+ display: flex;
+ align-items: center;
+ align-content: center;
+ font-family: Montserrat, sans-serif;
+ font-weight: 600;
+ color: var(--black);
+ }
+
+ .content-box {
+ border: 1px solid #a1a1a1;
+ padding: 10px 25px;
+ text-align: left;
+ display: inline-block;
+ min-width: 350px;
+ min-height: 150px;
+ margin: 20px 0;
+ }
+
+ h4 {
+ margin-bottom: 0;
+ }
+
+ mwc-checkbox::shadow .mdc-checkbox::after,
+ mwc-checkbox::shadow .mdc-checkbox::before {
+ background-color: var(--mdc-theme-primary)
+ }
+
+ label:hover {
+ cursor: pointer;
+ }
+
+ .title {
+ font-weight: 600;
+ font-size: 15px;
+ display: block;
+ line-height: 32px;
+ opacity: 0.66;
+ }
+
+ .value {
+ font-size: 16px;
+ display: inline-block;
+ }
+
+ .q-button {
+ display: inline-flex;
+ flex-direction: column;
+ justify-content: center;
+ align-content: center;
+ border: none;
+ border-radius: 20px;
+ padding-left: 25px;
+ padding-right: 25px;
+ color: white;
+ background: #03a9f4;
+ width: 50%;
+ font-size: 17px;
+ cursor: pointer;
+ height: 50px;
+ margin-top: 1rem;
+ text-transform: uppercase;
+ text-decoration: none;
+ transition: all .2s;
+ position: relative;
+ }
+
+ .remove-button {
+ font-family: Roboto, sans-serif;
+ font-size: 16px;
+ color: var(--mdc-theme-primary);
+ background-color: transparent;
+ padding: 8px 10px;
+ border-radius: 5px;
+ border: none;
+ transition: all 0.3s ease-in-out;
+ cursor: pointer;
+ }
+`
+
+export const qrLoginViewStyles = css`
+ * {
+ --lumo-primary-text-color: rgb(0, 167, 245);
+ --lumo-primary-color-50pct: rgba(0, 167, 245, 0.5);
+ --lumo-primary-color-10pct: rgba(0, 167, 245, 0.1);
+ --lumo-primary-color: hsl(199, 100%, 48%);
+ --lumo-base-color: var(--white);
+ --lumo-body-text-color: var(--black);
+ --lumo-secondary-text-color: var(--sectxt);
+ --lumo-contrast-60pct: var(--vdicon);
+ }
+
+ .center-box {
+ position: relative;
+ top: 45%;
+ left: 50%;
+ transform: translate(-50%, 0%);
+ text-align: center;
+ }
+
+ .q-button {
+ display: inline-flex;
+ flex-direction: column;
+ justify-content: center;
+ align-content: center;
+ border: none;
+ border-radius: 20px;
+ padding-left: 25px;
+ padding-right: 25px;
+ color: white;
+ background: #03a9f4;
+ width: 50%;
+ font-size: 17px;
+ cursor: pointer;
+ height: 50px;
+ margin-top: 1rem;
+ text-transform: uppercase;
+ text-decoration: none;
+ transition: all .2s;
+ position: relative;
+ }
+
+ .q-button.outlined {
+ background: unset;
+ border: 1px solid #03a9f4;
+ }
+
+ :host([theme="light"]) .q-button.outlined {
+ color: #03a9f4;
+ }
+
+ #qr-toggle-button {
+ margin-left: 12px;
+ }
+
+ #login-qr-code {
+ margin: auto;
+ }
+`
+
+export const securityViewStyles = css`
+ * {
+ --lumo-primary-text-color: rgb(0, 167, 245);
+ --lumo-primary-color-50pct: rgba(0, 167, 245, 0.5);
+ --lumo-primary-color-10pct: rgba(0, 167, 245, 0.1);
+ --lumo-primary-color: hsl(199, 100%, 48%);
+ --lumo-base-color: var(--white);
+ --lumo-body-text-color: var(--black);
+ --lumo-secondary-text-color: var(--sectxt);
+ --lumo-contrast-60pct: var(--vdicon);
+ --mdc-checkbox-unchecked-color: var(--black);
+ --mdc-theme-on-surface: var(--black);
+ --mdc-checkbox-disabled-color: var(--black);
+ --mdc-checkbox-ink-color: var(--black);
+ }
+
+ .center-box {
+ position: relative;
+ top: 45%;
+ left: 50%;
+ transform: translate(-50%, 0%);
+ text-align: center;
+ }
+
+ .checkbox-row {
+ position: relative;
+ display: flex;
+ align-items: center;
+ align-content: center;
+ font-family: Montserrat, sans-serif;
+ font-weight: 600;
+ color: var(--black);
+ }
+
+ .q-button {
+ display: inline-flex;
+ flex-direction: column;
+ justify-content: center;
+ align-content: center;
+ border: none;
+ border-radius: 20px;
+ padding-left: 25px;
+ padding-right: 25px;
+ color: white;
+ background: #03a9f4;
+ width: 50%;
+ font-size: 17px;
+ cursor: pointer;
+ height: 50px;
+ margin-top: 1rem;
+ text-transform: uppercase;
+ text-decoration: none;
+ transition: all .2s;
+ position: relative;
+ }
+
+ .add-dev-button {
+ margin-top: 4px;
+ max-height: 28px;
+ padding: 5px 5px;
+ font-size: 14px;
+ background-color: #03a9f4;
+ color: white;
+ border: 1px solid transparent;
+ border-radius: 3px;
+ cursor: pointer;
+ }
+
+ .add-dev-button:hover {
+ opacity: 0.8;
+ cursor: pointer;
+ }
+`
+
+export const userSettingsStyles = css`
+ :host {
+ margin: 0;
+ width: 100%;
+ max-width: 100vw;
+ height: 100%;
+ max-height: 100vh;
+ background-color: var(--white);
+ color: var(--black);
+ line-height: 1.6;
+ }
+
+ .decline {
+ --mdc-theme-primary: var(--mdc-theme-error)
+ }
+
+ paper-dialog.userSettings {
+ width: 100%;
+ max-width: 100vw;
+ height: 100%;
+ max-height: 100vh;
+ background-color: var(--white);
+ color: var(--black);
+ line-height: 1.6;
+ overflow-y: auto;
+ }
+
+ .actions {
+ display: flex;
+ justify-content: space-between;
+ padding: 0 4em;
+ margin: 15px 0 -2px 0;
+ }
+
+ .close-icon {
+ font-size: 36px;
+ }
+
+ .close-icon:hover {
+ cursor: pointer;
+ opacity: .6;
+ }
+
+ .buttons {
+ text-align: right;
+ }
+
+ .container {
+ max-width: 90vw;
+ margin-left: auto;
+ margin-right: auto;
+ margin-top: 20px;
+ padding: .6em;
+ }
+
+ ul {
+ list-style: none;
+ padding: 0;
+ margin-bottom: 0;
+ }
+
+ .leftBar {
+ background-color: var(--white);
+ color: var(--black);
+ border: 1px solid var(--border);
+ padding: 20px 0 0 0;
+ border-radius: 5px;
+ }
+
+ .leftBar img {
+ margin: 0 auto;
+ width: 75%;
+ height: 75%;
+ text-align: center;
+ }
+
+ .leftBar .slug {
+ text-align: center;
+ margin-top: 20px;
+ color: var(--black);
+ font-size: 16px;
+ font-weight: 600;
+ margin-bottom: 7px;
+ }
+
+ .leftBar ul li {
+ border-bottom: 1px solid var(--border);
+ }
+
+ .leftBar ul li:last-child {
+ border-bottom: none;
+ }
+
+ .leftBar ul li a {
+ color: var(--black);
+ font-size: 16px;
+ font-weight: 400;
+ text-decoration: none;
+ padding: .9em;
+ display: block;
+ }
+
+ .leftBar ul li a i {
+ margin-right: 8px;
+ font-size: 16px;
+ }
+
+ .leftBar ul li a:hover {
+ background-color: var(--menuhover);
+ color: #515151;
+ }
+
+ .leftBar ul li:active {
+ border-bottom: none;
+ }
+
+ .leftBar ul li a.active {
+ color: #515151;
+ background-color: var(--menuactive);
+ border-left: 2px solid #515151;
+ margin-left: -2px;
+ }
+
+ .mainPage {
+ background-color: var(--white);
+ color: var(--black);
+ border: 1px solid var(--border);
+ padding: 20px 0 10px 0;
+ border-radius: 5px;
+ font-size: 16px;
+ text-align: center;
+ min-height: 460px;
+ height: auto;
+ overflow: auto;
+
+ }
+
+ @media(max-width:700px) {
+ .mainPage {
+ margin-top: 30px;
+ }
+ }
+
+ @media(min-width:765px) {
+ * {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+ }
+
+ .actions {
+ display: flex;
+ justify-content: space-between;
+ padding: 0 4em;
+ margin: 15px 0 -25px 0;
+ }
+
+ .container {
+ padding: 2em;
+ }
+
+ .wrapper {
+ display: grid;
+ grid-template-columns: 1fr 3fr;
+ grid-gap: 30px;
+ }
+
+ .wrapper>.mainPage {
+ padding: 2em;
+ }
+
+ .leftBar {
+ text-align: left;
+ max-height: 403px;
+ max-width: 400px;
+ font-size: 16px;
+ }
+
+ .mainPage {
+ font-size: 16px;
+ }
+ }
+`
+
+export const userInfoViewStyles = css`
+ * {
+ --mdc-theme-primary: rgb(3, 169, 244);
+ --mdc-theme-secondary: var(--mdc-theme-primary);
+ --mdc-theme-surface: var(--white);
+ --mdc-dialog-content-ink-color: var(--black);
+ box-sizing: border-box;
+ }
+
+ h2 {
+ margin: 10px 0;
+ }
+
+ h3 {
+ margin-top: -80px;
+ color: #03a9f4;
+ font-size: 18px;
+ }
+
+ h4 {
+ margin: 5px 0;
+ }
+
+ p {
+ margin-top: 5px;
+ font-size: 14px;
+ line-height: 16px;
+ }
+
+ ul {
+ list-style: none;
+ display: flex;
+ }
+
+ ul li {
+ margin: 15px auto;
+ font-size: 15px;
+ font-weight: 600;
+ color: #03a9f4;
+ }
+
+ .btn-info {
+ color: #03a9f4;
+ --mdc-icon-size: 16px;
+ padding-top: 3px;
+ }
+
+ .data-info {
+ margin-top: 10px;
+ margin-right: 25px;
+ }
+
+ .data-items {
+ font-weight: 600;
+ color: var(--black);
+ display: block;
+ text-align: center;
+ }
+
+ .title {
+ font-weight: 600;
+ font-size: 12px;
+ line-height: 32px;
+ opacity: 0.66;
+ }
+
+ #transactionList {
+ color: var(--black);
+ padding: 15px;
+ }
+
+ .color-in {
+ color: #02977e;
+ background-color: rgba(0, 201, 167, 0.2);
+ font-weight: 700;
+ font-size: 0.60938rem;
+ border-radius: 0.25rem !important;
+ padding: 0.2rem 0.5rem;
+ margin-left: 4px;
+ }
+
+ .color-out {
+ color: #b47d00;
+ background-color: rgba(219, 154, 4, 0.2);
+ font-weight: 700;
+ font-size: 0.60938rem;
+ border-radius: 0.25rem !important;
+ padding: 0.2rem 0.5rem;
+ margin-left: 4px;
+ }
+
+ .card-body {
+ background-color: var(--white);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-direction: column;
+ min-height: 100vh;
+ margin: 0;
+ }
+
+ .card-container {
+ background-color: var(--white);
+ border-radius: 5px;
+ color: var(--black);
+ padding-top: 30px;
+ position: relative;
+ width: 350px;
+ max-width: 100%;
+ text-align: center;
+ }
+
+ .card-container-button {
+ background-color: var(--white);
+ border-radius: 5px;
+ color: var(--black);
+ padding-top: 30px;
+ position: relative;
+ width: 500px;
+ max-width: 100%;
+ text-align: center;
+ }
+
+ .card-explorer-container {
+ background-color: var(--white);
+ border-radius: 5px;
+ color: var(--black);
+ padding-top: 10px;
+ position: relative;
+ width: 900px;
+ max-width: 100%;
+ text-align: center;
+ }
+
+ .card-container .level {
+ color: #ffffff;
+ background-color: #03a9f4;
+ border-radius: 3px;
+ font-size: 14px;
+ font-weight: bold;
+ padding: 3px 7px;
+ position: absolute;
+ top: 30px;
+ left: 30px;
+ }
+
+ .card-container .founder {
+ color: #ffffff;
+ background-color: #03a9f4;
+ border-radius: 3px;
+ font-size: 14px;
+ font-weight: bold;
+ padding: 3px 7px;
+ position: absolute;
+ top: 30px;
+ right: 30px;
+ }
+
+ .card-container .round {
+ width: 96px;
+ height: 96px;
+ border: 1px solid #03a9f4;
+ border-radius: 50%;
+ padding: 2px;
+ }
+
+ .card-container .badge {
+ width: 200px;
+ height: 135px;
+ border: 1px solid transparent;
+ border-radius: 10%;
+ padding: 2px;
+ }
+
+ .userdata {
+ background-color: #1F1A36;
+ text-align: left;
+ padding: 15px;
+ margin-top: 30px;
+ }
+
+ .userdata ul {
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+ }
+
+ .userdata ul li {
+ border: 1px solid #2D2747;
+ border-radius: 2px;
+ display: inline-block;
+ font-size: 12px;
+ margin: 0 7px 7px 0;
+ padding: 7px;
+ }
+
+ .decline {
+ --mdc-theme-primary: var(--mdc-theme-error)
+ }
+
+ .warning {
+ --mdc-theme-primary: #f0ad4e;
+ }
+
+ .green {
+ --mdc-theme-primary: #198754;
+ }
+
+ .buttons {
+ display: inline;
+ float: right;
+ margin-bottom: 5px;
+ }
+
+ .paybutton {
+ display: inline;
+ float: left;
+ margin-bottom: 5px;
+ }
+
+ .loadingContainer {
+ height: 100%;
+ width: 100%;
+ }
+
+ .loading,
+ .loading:after {
+ border-radius: 50%;
+ width: 5em;
+ height: 5em;
+ }
+
+ .loading {
+ margin: 10px auto;
+ border-width: .6em;
+ border-style: solid;
+ border-color: rgba(3, 169, 244, 0.2) rgba(3, 169, 244, 0.2) rgba(3, 169, 244, 0.2) rgb(3, 169, 244);
+ font-size: 10px;
+ position: relative;
+ text-indent: -9999em;
+ transform: translateZ(0px);
+ animation: 1.1s linear 0s infinite normal none running loadingAnimation;
+ }
+
+ .explorer-trades {
+ text-align: center;
+ }
+
+ .box {
+ margin: 0;
+ padding: 0;
+ display: flex;
+ flex-flow: column;
+ height: 100%;
+ }
+
+ .box-info {
+ margin: 0;
+ padding: 0;
+ display: flex;
+ flex-flow: column;
+ height: 250px;
+ }
+
+ .box-info-full {
+ margin: 0;
+ padding: 0;
+ display: flex;
+ flex-flow: column;
+ height: 450px;
+ width: 450px;
+ }
+
+ header {
+ display: flex;
+ flex: 0 1 auto;
+ align-items: center;
+ justify-content: center;
+ padding: 0px 10px;
+ font-size: 16px;
+ color: var(--black);
+ background-color: var(--tradehead);
+ border-left: 1px solid var(--tradeborder);
+ border-top: 1px solid var(--tradeborder);
+ border-right: 1px solid var(--tradeborder);
+ min-height: 40px;
+ }
+
+ .border-wrapper {
+ border: 1px var(--tradeborder) solid;
+ overflow: hidden;
+ }
+
+
+ #first-explorer-section {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ grid-auto-rows: max(250px);
+ column-gap: 0.5em;
+ row-gap: 0.4em;
+ justify-items: stretch;
+ align-items: stretch;
+ margin-bottom: 10px;
+ }
+
+ #second-explorer-section {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ grid-auto-rows: max(250px);
+ column-gap: 0.5em;
+ row-gap: 0.4em;
+ justify-items: stretch;
+ align-items: stretch;
+ margin-bottom: 10px;
+ }
+
+ #third-explorer-section {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ grid-auto-rows: max(250px);
+ column-gap: 0.5em;
+ row-gap: 0.4em;
+ justify-items: stretch;
+ align-items: stretch;
+ margin-bottom: 10px;
+ }
+
+ #first-explorer-section>div {}
+
+ #second-explorer-section>div {}
+
+ #third-explorer-section>div {}
+
+ @-webkit-keyframes loadingAnimation {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg);
+ }
+
+ 100% {
+ -webkit-transform: rotate(360deg);
+ transform: rotate(360deg);
+ }
+ }
+
+ @keyframes loadingAnimation {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg);
+ }
+
+ 100% {
+ -webkit-transform: rotate(360deg);
+ transform: rotate(360deg);
+ }
+ }
+
+ .full-info {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ min-height: 100vh;
+ background: #1da1f2;
+ }
+
+ .full-info-wrapper {
+ width: 100%;
+ min-width: 600px;
+ max-width: 600px;
+ text-align: center;
+ background: var(--white);
+ border: 1px solid var(--black);
+ border-radius: 15px;
+ padding: 25px;
+ box-shadow: 0px 10px 15px rgba(0, 0, 0, 0.1);
+ }
+
+ .full-info-logo {
+ width: 120px;
+ height: 120px;
+ background: var(--white);
+ border: 1px solid var(--black);
+ border-radius: 50%;
+ position: relative;
+ top: -110px;
+ left: 210px;
+ }
+
+ .round-fullinfo {
+ position: relative;
+ width: 120px;
+ height: 120px;
+ border-radius: 50%;
+ right: 25px;
+ top: -1px;
+ }
+`
\ No newline at end of file
diff --git a/core/src/styles/styles.scss b/core/src/styles/styles.scss
index 98e54de2..655b1231 100644
--- a/core/src/styles/styles.scss
+++ b/core/src/styles/styles.scss
@@ -5,7 +5,7 @@ $mdc-layout-grid-breakpoints: (
phone: 0px
);
-:root, html, body{
+:root, html, body {
--layout-breakpoint-desktop: #{map-get($mdc-layout-grid-breakpoints, desktop)};
--layout-breakpoint-laptop: #{map-get($mdc-layout-grid-breakpoints, laptop)};
--layout-breakpoint-tablet: #{map-get($mdc-layout-grid-breakpoints, tablet)};
@@ -14,4 +14,4 @@ $mdc-layout-grid-breakpoints: (
iframe.pluginJSFrame {
display:none;
-}
+}
\ No newline at end of file
diff --git a/core/src/styles/switch-theme.css b/core/src/styles/switch-theme.css
index cd195572..4c56f166 100644
--- a/core/src/styles/switch-theme.css
+++ b/core/src/styles/switch-theme.css
@@ -6,6 +6,7 @@ html {
--plugback: #ffffff;
--border: #d0d6de;
--border2: #dde2e8;
+ --border3: #080808;
--copybutton: #707584;
--chat-group: #080808;
--chat-bubble: #9f9f9f0a;
@@ -66,6 +67,13 @@ html {
--app-hr: rgba(0, 0, 0, .3);
--code-block-text-color: #008fd5;
--noavatar: url("/img/noavatar_light.png");
+ --login-border: rgba(0, 167, 245);
+ --login-border-50pct: rgba(0, 167, 245, 0.5);
+ --login-border-10pct: rgba(0, 167, 245, 0.1);
+ --login-button: rgb(3, 169, 244);
+ --general-color-blue: #03a9f4;
+ --qchat-name: #03a9f4;
+ --qchat-my-name: #05be0e;
}
html[theme="dark"] {
@@ -76,6 +84,7 @@ html[theme="dark"] {
--plugback: #0f1a2e;
--border: #0b305e;
--border2: #0b305e;
+ --border3: #767676;
--copybutton: #d0d6de;
--chat-group: #ffffff;
--chat-bubble: #9694941a;
@@ -136,5 +145,11 @@ html[theme="dark"] {
--app-hr: rgba(255, 255, 255, .3);
--code-block-text-color: #008fd5;
--noavatar: url("/img/noavatar_dark.png");
-}
-
+ --login-border: rgba(0, 167, 245);
+ --login-border-50pct: rgba(0, 167, 245, 0.5);
+ --login-border-10pct: rgba(0, 167, 245, 0.1);
+ --login-button: rgb(3, 169, 244);
+ --general-color-blue: #03a9f4;
+ --qchat-name: #03a9f4;
+ --qchat-my-name: #05be0e;
+}
\ No newline at end of file
diff --git a/core/src/tradebot/addTradeBotRoutes.js b/core/src/tradebot/addTradeBotRoutes.js
index 50da648e..6e03c77f 100644
--- a/core/src/tradebot/addTradeBotRoutes.js
+++ b/core/src/tradebot/addTradeBotRoutes.js
@@ -1,7 +1,7 @@
-import {routes} from './trade-bot-routes.js'
+import { routes } from './trade-bot-routes'
export const addTradeBotRoutes = epmlInstance => {
- Object.entries(routes).forEach(([route, handler]) => {
- epmlInstance.route(route, handler)
- })
-}
+ Object.entries(routes).forEach(([route, handler]) => {
+ epmlInstance.route(route, handler)
+ })
+}
\ No newline at end of file
diff --git a/core/src/tradebot/trade-bot-routes.js b/core/src/tradebot/trade-bot-routes.js
index f20a5f36..8d0f085c 100644
--- a/core/src/tradebot/trade-bot-routes.js
+++ b/core/src/tradebot/trade-bot-routes.js
@@ -1,6 +1,6 @@
-import {store} from '../store.js'
+import { store } from '../store'
import * as api from 'qortal-ui-crypto'
-import snackbar from '../functional-components/snackbar.js'
+import snackbar from '../functional-components/snackbar'
const createTransaction = api.createTransaction
const processTransaction = api.processTransaction
@@ -37,12 +37,13 @@ export const routes = {
}
const res = await processTransaction(tx.signedBytes)
+
let extraData = {}
- if(req.data.type === 38 && tx && tx._rewardShareKeyPair && tx._rewardShareKeyPair.secretKey){
+
+ if (req.data.type === 38 && tx && tx._rewardShareKeyPair && tx._rewardShareKeyPair.secretKey) {
extraData.rewardSharePrivateKey = Base58.encode(tx._rewardShareKeyPair.secretKey)
}
-
response = {
success: true,
data: res,
@@ -51,61 +52,73 @@ export const routes = {
} catch (e) {
console.error(e)
console.error(e.message)
+
response = {
success: false,
- message: e.message,
+ message: e.message
}
}
+
return response
},
standaloneTransaction: async (req) => {
const rebuildUint8Array = (obj) => {
let _array = new Uint8Array(Object.keys(obj).length)
+
for (let i = 0; i < _array.byteLength; ++i) {
_array.set([obj[i]], i)
}
+
return _array
}
let response
+
try {
let _keyPair = {}
+
for (let _keyName in req.data.keyPair) {
_keyPair[_keyName] = rebuildUint8Array(
req.data.keyPair[_keyName]
)
}
+
const tx = createTransaction(
req.data.type,
_keyPair,
req.data.params
)
+
const res = await processTransaction(tx.signedBytes)
+
response = {
success: true,
- data: res,
+ data: res
}
} catch (e) {
console.error(e)
console.error(e.message)
+
response = {
success: false,
- message: e.message,
+ message: e.message
}
}
+
return response
},
showSnackBar: async (req) => {
snackbar.add({
labelText: req.data,
- dismiss: true,
+ dismiss: true
})
},
tradeBotCreateRequest: async (req) => {
let response
+
try {
const unsignedTxn = await tradeBotCreateRequest(req.data)
@@ -118,25 +131,31 @@ export const routes = {
} catch (e) {
console.error(e)
console.error(e.message)
+
response = e.message
}
+
return response
},
tradeBotRespondRequest: async (req) => {
let response
+
try {
response = await tradeBotRespondRequest(req.data)
} catch (e) {
console.error(e)
console.error(e.message)
+
response = e.message
}
+
return response
},
deleteTradeOffer: async (req) => {
let response
+
try {
const unsignedTxn = await deleteTradeOffer(req.data)
@@ -149,13 +168,16 @@ export const routes = {
} catch (e) {
console.error(e)
console.error(e.message)
+
response = e.message
}
+
return response
},
cancelAllOffers: async (req) => {
let response
+
try {
response = await cancelAllOffers(
store.getState().app.selectedAddress
@@ -163,80 +185,100 @@ export const routes = {
} catch (e) {
console.error(e)
console.error(e.message)
+
response = e.message
}
+
return response
},
sendBtc: async (req) => {
let response
+
try {
response = await sendBtc(req.data)
} catch (e) {
console.error(e)
console.error(e.message)
+
response = e.message
}
+
return response
},
sendLtc: async (req) => {
let response
+
try {
response = await sendLtc(req.data)
} catch (e) {
console.error(e)
console.error(e.message)
+
response = e.message
}
+
return response
},
sendDoge: async (req) => {
let response
+
try {
response = await sendDoge(req.data)
} catch (e) {
console.error(e)
console.error(e.message)
+
response = e.message
}
+
return response
},
sendDgb: async (req) => {
let response
+
try {
response = await sendDgb(req.data)
} catch (e) {
console.error(e)
console.error(e.message)
+
response = e.message
}
+
return response
},
sendRvn: async (req) => {
let response
+
try {
response = await sendRvn(req.data)
} catch (e) {
console.error(e)
console.error(e.message)
+
response = e.message
}
+
return response
},
sendArrr: async (req) => {
let response
+
try {
response = await sendArrr(req.data)
} catch (e) {
console.error(e)
console.error(e.message)
+
response = e.message
}
+
return response
- },
-}
+ }
+}
\ No newline at end of file
diff --git a/core/src/transactionRequest.js b/core/src/transactionRequest.js
index ee080ca6..54d87b73 100644
--- a/core/src/transactionRequest.js
+++ b/core/src/transactionRequest.js
@@ -1,12 +1,12 @@
let transactionRequestListener = async () => {
- return {
- confirmed: false,
- reason: 'Dialoag not registered'
- }
+ return {
+ confirmed: false,
+ reason: 'Dialoag not registered'
+ }
}
export const requestTransaction = async (...args) => transactionRequestListener(...args)
export const listenForRequest = listener => {
- transactionRequestListener = listener
-}
+ transactionRequestListener = listener
+}
\ No newline at end of file
diff --git a/core/src/worker.js b/core/src/worker.js
index a1188062..d5e81df8 100644
--- a/core/src/worker.js
+++ b/core/src/worker.js
@@ -1,8 +1,7 @@
-import {Epml, EpmlReadyPlugin, EpmlWorkerPlugin, RequestPlugin} from 'epml'
-
-import utils from './cryptoUtils.js'
-import {bytes_to_base64 as bytesToBase64, Sha512} from 'asmcrypto.js'
+import { Epml, EpmlReadyPlugin, EpmlWorkerPlugin, RequestPlugin } from 'epml'
+import { bytes_to_base64 as bytesToBase64, Sha512 } from 'asmcrypto.js'
import bcrypt from 'bcryptjs'
+import utils from './cryptoUtils'
Epml.registerPlugin(RequestPlugin)
Epml.registerPlugin(EpmlReadyPlugin)
@@ -11,12 +10,13 @@ Epml.registerPlugin(EpmlWorkerPlugin)
const parentEpml = new Epml({ type: 'WORKER', source: self })
parentEpml.route('kdf', async req => {
- const { salt, key, nonce, staticSalt, staticBcryptSalt } = req.data
- const combinedBytes = utils.appendBuffer(salt, utils.stringtoUTF8Array(staticSalt + key + nonce))
- const sha512Hash = new Sha512().process(combinedBytes).finish().result
- const sha512HashBase64 = bytesToBase64(sha512Hash)
- const result = bcrypt.hashSync(sha512HashBase64.substring(0, 72), staticBcryptSalt)
- return { key, nonce, result }
+ const { salt, key, nonce, staticSalt, staticBcryptSalt } = req.data
+ const combinedBytes = utils.appendBuffer(salt, utils.stringtoUTF8Array(staticSalt + key + nonce))
+ const sha512Hash = new Sha512().process(combinedBytes).finish().result
+ const sha512HashBase64 = bytesToBase64(sha512Hash)
+ const result = bcrypt.hashSync(sha512HashBase64.substring(0, 72), staticBcryptSalt)
+
+ return { key, nonce, result }
})
-parentEpml.imReady()
+parentEpml.imReady()
\ No newline at end of file
diff --git a/core/tooling/build.js b/core/tooling/build.js
index 4b50d746..74e03a2f 100644
--- a/core/tooling/build.js
+++ b/core/tooling/build.js
@@ -1,38 +1,35 @@
const rollup = require('rollup')
async function writeBundle(bundle, outputOptions) {
-
- await bundle.generate(outputOptions)
-
- await bundle.write(outputOptions)
+ await bundle.generate(outputOptions)
+ await bundle.write(outputOptions)
}
async function buildInline(conf) {
+ const bundle = await rollup.rollup(conf.inputOptions).catch(err => {
+ throw err
+ })
- const bundle = await rollup.rollup(conf.inputOptions).catch(err => {
- throw err
- })
+ await writeBundle(bundle, conf.outputOptions)
- await writeBundle(bundle, conf.outputOptions)
- console.log('BUILD CORE ==> Bundling Done 🎉');
+ console.log('BUILD CORE ==> Bundling Done 🎉')
}
async function build(options, outputs, outputOptions, inputOptions, inlineConfigs) {
+ const bundle = await rollup.rollup(inputOptions).catch(err => {
+ throw err
+ })
- const bundle = await rollup.rollup(inputOptions).catch(err => {
- throw err
- })
+ for (const option of outputs) {
+ await writeBundle(bundle, {
+ ...outputOptions,
+ ...option
+ })
+ }
- for (const option of outputs) {
- await writeBundle(bundle, {
- ...outputOptions,
- ...option
- })
- }
-
- for (const conf of inlineConfigs) {
- await buildInline(conf)
- }
+ for (const conf of inlineConfigs) {
+ await buildInline(conf)
+ }
}
-module.exports = build
+module.exports = build
\ No newline at end of file
diff --git a/core/tooling/generateBuildConfig.js b/core/tooling/generateBuildConfig.js
index 83efcba4..f09d05a5 100644
--- a/core/tooling/generateBuildConfig.js
+++ b/core/tooling/generateBuildConfig.js
@@ -7,95 +7,92 @@ const commonjs = require('@rollup/plugin-commonjs')
const alias = require('@rollup/plugin-alias')
const terser = require('@rollup/plugin-terser');
const scss = require('rollup-plugin-scss')
-const webWorkerLoader = require('@qortal/rollup-plugin-web-worker-loader');
-
+const webWorkerLoader = require('@qortal/rollup-plugin-web-worker-loader')
const generateES5BuildConfig = require('./generateES5BuildConfig')
-
const generateInputs = (tree, inputs = {}) => {
+ for (const file of Object.values(tree)) {
+ inputs[file.file.split('.')[0]] = file.source
+ if (file.children) generateInputs(file.children, inputs)
+ }
- for (const file of Object.values(tree)) {
-
- inputs[file.file.split('.')[0]] = file.source
- if (file.children) generateInputs(file.children, inputs)
- }
- return inputs
+ return inputs
}
const generateBuildConfig = ({ elementComponents, functionalComponents, otherOutputs, apiComponents, aliases, options, inlineComponents }) => {
- const buildConfig = {
- outputs: [
- {
- dir: 'es6',
- format: 'esm'
- }
- ],
- outputOptions: {
- sourcemap: false
- },
- inputOptions: {
- onwarn: (warning, rollupWarn) => {
- if (warning.code !== 'CIRCULAR_DEPENDENCY') {
- rollupWarn(warning)
- }
- },
- input: {
- main: options.inputFile,
- ...generateInputs(elementComponents)
- },
- plugins: [
- alias({
- entries: Object.keys(aliases).map(find => {
- return {
- find,
- replacement: aliases[find]
- }
- })
- }),
- nodeResolve({
- preferBuiltins: false,
- mainFields: ['module', 'browser']
- }),
- replace({
- preventAssignment: true,
- "process.env.NODE_ENV": JSON.stringify("production"),
- }),
- commonjs(),
- globals(),
- progress(),
- webWorkerLoader(),
- scss({
- output: options.sassOutputDir
- }),
- terser({
- compress: true,
- output: {
- comments: false
- }
- })
- ],
- preserveEntrySignatures: false,
- external: ['crypto'],
- context: 'window'
- },
- options: {
- outputDir: options.outputDir
- }
- }
+ const buildConfig = {
+ outputs: [
+ {
+ dir: 'es6',
+ format: 'esm'
+ }
+ ],
+ outputOptions: {
+ sourcemap: false
+ },
+ inputOptions: {
+ onwarn: (warning, rollupWarn) => {
+ if (warning.code !== 'CIRCULAR_DEPENDENCY') {
+ rollupWarn(warning)
+ }
+ },
+ input: {
+ main: options.inputFile,
+ ...generateInputs(elementComponents)
+ },
+ plugins: [
+ alias({
+ entries: Object.keys(aliases).map(find => {
+ return {
+ find,
+ replacement: aliases[find]
+ }
+ })
+ }),
+ nodeResolve({
+ preferBuiltins: false,
+ mainFields: ['module', 'browser']
+ }),
+ replace({
+ preventAssignment: true,
+ "process.env.NODE_ENV": JSON.stringify("production"),
+ }),
+ commonjs(),
+ globals(),
+ progress(),
+ webWorkerLoader(),
+ scss({
+ output: options.sassOutputDir
+ }),
+ terser({
+ compress: true,
+ output: {
+ comments: false
+ }
+ })
+ ],
+ preserveEntrySignatures: false,
+ external: ['crypto'],
+ context: 'window'
+ },
+ options: {
+ outputDir: options.outputDir
+ }
+ }
- for (const output of buildConfig.outputs) {
- output.dir = path.join(options.outputDir, output.dir)
- }
+ for (const output of buildConfig.outputs) {
+ output.dir = path.join(options.outputDir, output.dir)
+ }
- const inlineConfigs = generateES5BuildConfig(inlineComponents, {
- outputDir: options.outputDir,
- aliases
- })
+ const inlineConfigs = generateES5BuildConfig(inlineComponents, {
+ outputDir: options.outputDir,
+ aliases
+ })
- return {
- buildConfig,
- inlineConfigs
- }
+ return {
+ buildConfig,
+ inlineConfigs
+ }
}
-module.exports = generateBuildConfig
+module.exports = generateBuildConfig
\ No newline at end of file
diff --git a/core/tooling/generateES5BuildConfig.js b/core/tooling/generateES5BuildConfig.js
index a7cc10d8..ea671767 100644
--- a/core/tooling/generateES5BuildConfig.js
+++ b/core/tooling/generateES5BuildConfig.js
@@ -1,69 +1,67 @@
-const babel = require('@rollup/plugin-babel');
-const { nodeResolve } = require('@rollup/plugin-node-resolve');
-const replace = require('@rollup/plugin-replace');
-const commonjs = require('@rollup/plugin-commonjs');
-const progress = require('rollup-plugin-progress');
-const terser = require('@rollup/plugin-terser');
-const alias = require('@rollup/plugin-alias');
-const webWorkerLoader = require('@qortal/rollup-plugin-web-worker-loader');
-const path = require('path');
-
+const path = require('path')
+const babel = require('@rollup/plugin-babel')
+const replace = require('@rollup/plugin-replace')
+const commonjs = require('@rollup/plugin-commonjs')
+const progress = require('rollup-plugin-progress')
+const terser = require('@rollup/plugin-terser')
+const alias = require('@rollup/plugin-alias')
+const webWorkerLoader = require('@qortal/rollup-plugin-web-worker-loader')
+const { nodeResolve } = require('@rollup/plugin-node-resolve')
const generateRollupConfig = (file, { outputDir, aliases }) => {
-
- return {
- inputOptions: {
- input: file.input,
- onwarn: (warning, rollupWarn) => {
- if (warning.code !== 'CIRCULAR_DEPENDENCY') {
- rollupWarn(warning)
- }
- },
- plugins: [
- nodeResolve({
- preferBuiltins: false,
- mainFields: ['module', 'browser']
- }),
- replace({
- preventAssignment: true,
- "process.env.NODE_ENV": JSON.stringify("production"),
- }),
- alias({
- entries: Object.keys(aliases).map(find => {
- return {
- find,
- replacement: aliases[find]
- }
- })
- }),
- commonjs(),
- progress(),
- webWorkerLoader(),
- babel.babel({
- babelHelpers: 'bundled',
- exclude: 'node_modules/**'
- }),
- terser({
- compress: true,
- output: {
- comments: false,
- },
- })
- ],
- preserveEntrySignatures: false,
- external: ['crypto']
- },
- outputOptions: {
- file: path.join(outputDir, file.output),
- format: 'umd',
- name: 'worker',
- sourcemap: false
- }
- }
+ return {
+ inputOptions: {
+ input: file.input,
+ onwarn: (warning, rollupWarn) => {
+ if (warning.code !== 'CIRCULAR_DEPENDENCY') {
+ rollupWarn(warning)
+ }
+ },
+ plugins: [
+ nodeResolve({
+ preferBuiltins: false,
+ mainFields: ['module', 'browser']
+ }),
+ replace({
+ preventAssignment: true,
+ "process.env.NODE_ENV": JSON.stringify("production"),
+ }),
+ alias({
+ entries: Object.keys(aliases).map(find => {
+ return {
+ find,
+ replacement: aliases[find]
+ }
+ })
+ }),
+ commonjs(),
+ progress(),
+ webWorkerLoader(),
+ babel.babel({
+ babelHelpers: 'bundled',
+ exclude: 'node_modules/**'
+ }),
+ terser({
+ compress: true,
+ output: {
+ comments: false,
+ },
+ })
+ ],
+ preserveEntrySignatures: false,
+ external: ['crypto']
+ },
+ outputOptions: {
+ file: path.join(outputDir, file.output),
+ format: 'umd',
+ name: 'worker',
+ sourcemap: false
+ }
+ }
}
const generateES5BuildConfig = (files, options) => {
- return files.map(file => generateRollupConfig(file, options))
+ return files.map(file => generateRollupConfig(file, options))
}
-module.exports = generateES5BuildConfig
+module.exports = generateES5BuildConfig
\ No newline at end of file
diff --git a/core/tooling/utils.js b/core/tooling/utils.js
index ad7b0ac0..7372f169 100644
--- a/core/tooling/utils.js
+++ b/core/tooling/utils.js
@@ -1,15 +1,16 @@
const path = require('path')
const makeSourceAbsolute = (dir, tree) => {
- for (const component of Object.values(tree)) {
- component.source = path.join(dir, component.file)
- if (component.children) {
- makeSourceAbsolute(dir, component.children)
- }
- }
- return tree
+ for (const component of Object.values(tree)) {
+ component.source = path.join(dir, component.file)
+ if (component.children) {
+ makeSourceAbsolute(dir, component.children)
+ }
+ }
+
+ return tree
}
module.exports = {
- makeSourceAbsolute
-}
+ makeSourceAbsolute
+}
\ No newline at end of file
diff --git a/core/tooling/watch-inlines.js b/core/tooling/watch-inlines.js
index 71d15adb..e880f24c 100644
--- a/core/tooling/watch-inlines.js
+++ b/core/tooling/watch-inlines.js
@@ -1,17 +1,17 @@
const rollup = require('rollup')
-async function watchInlines (inlineConfigs) {
- for (const conf of inlineConfigs) {
- const watchOptions = {
- ...conf.inputOptions,
- output: [conf.outputOptions],
- watch: {
- }
- }
- const watcher = rollup.watch(watchOptions)
- watcher.on('event', event => {
- })
- }
+async function watchInlines(inlineConfigs) {
+ for (const conf of inlineConfigs) {
+ const watchOptions = {
+ ...conf.inputOptions,
+ output: [conf.outputOptions],
+ watch: {
+ }
+ }
+ const watcher = rollup.watch(watchOptions)
+ watcher.on('event', event => {
+ })
+ }
}
-module.exports = watchInlines
+module.exports = watchInlines
\ No newline at end of file
diff --git a/core/tooling/watch.js b/core/tooling/watch.js
index 5f2829cd..b6c1bdbf 100644
--- a/core/tooling/watch.js
+++ b/core/tooling/watch.js
@@ -1,34 +1,35 @@
const rollup = require('rollup')
async function watch(options, outputs, outputOptions, inputOptions) {
-
- const watchOptions = {
- ...inputOptions,
- output: outputs.map(option => {
- return {
- ...outputOptions,
- ...option
- }
- }),
- watch: {
- }
- }
- const watcher = rollup.watch(watchOptions)
- watcher.on('event', event => {
- })
+ const watchOptions = {
+ ...inputOptions,
+ output: outputs.map(option => {
+ return {
+ ...outputOptions,
+ ...option
+ }
+ }),
+ watch: {
+ }
+ }
+ const watcher = rollup.watch(watchOptions)
+ watcher.on('event', event => {
+ })
}
async function writeBundle(bundle, outputOptions) {
- await bundle.generate(outputOptions)
- await bundle.write(outputOptions)
- console.log('WATCH CORE ==> Write Bundle : Done 🎉');
+ await bundle.generate(outputOptions)
+ await bundle.write(outputOptions)
+
+ console.log('WATCH CORE ==> Write Bundle : Done 🎉')
}
async function buildInline(conf) {
- const bundle = await rollup.rollup(conf.inputOptions).catch(err => {
- throw err
- })
- await writeBundle(bundle, conf.outputOptions)
+ const bundle = await rollup.rollup(conf.inputOptions).catch(err => {
+ throw err
+ })
+
+ await writeBundle(bundle, conf.outputOptions)
}
-module.exports = watch
+module.exports = watch
\ No newline at end of file
diff --git a/core/translate/directives/lang-changed-base.js b/core/translate/directives/lang-changed-base.js
index 0a894f33..2d2049bb 100644
--- a/core/translate/directives/lang-changed-base.js
+++ b/core/translate/directives/lang-changed-base.js
@@ -2,39 +2,39 @@ import { AsyncDirective } from 'lit/async-directive.js'
import { listenForLangChanged } from '../util.js'
export class LangChangedDirectiveBase extends AsyncDirective {
- constructor() {
- super(...arguments)
- this.langChangedSubscription = null
- this.getValue = (() => "")
- }
+ constructor() {
+ super(...arguments)
+ this.langChangedSubscription = null
+ this.getValue = (() => '')
+ }
- renderValue(getValue) {
- this.getValue = getValue
- this.subscribe()
- return this.getValue()
- }
+ renderValue(getValue) {
+ this.getValue = getValue
+ this.subscribe()
+ return this.getValue()
+ }
- langChanged(e) {
- this.setValue(this.getValue(e))
- }
+ langChanged(e) {
+ this.setValue(this.getValue(e))
+ }
- subscribe() {
- if (this.langChangedSubscription == null) {
- this.langChangedSubscription = listenForLangChanged(this.langChanged.bind(this))
- }
- }
+ subscribe() {
+ if (this.langChangedSubscription == null) {
+ this.langChangedSubscription = listenForLangChanged(this.langChanged.bind(this))
+ }
+ }
- unsubscribe() {
- if (this.langChangedSubscription != null) {
- this.langChangedSubscription()
- }
- }
+ unsubscribe() {
+ if (this.langChangedSubscription != null) {
+ this.langChangedSubscription()
+ }
+ }
- disconnected() {
- this.unsubscribe()
- }
+ disconnected() {
+ this.unsubscribe()
+ }
- reconnected() {
- this.subscribe()
- }
+ reconnected() {
+ this.subscribe()
+ }
}
\ No newline at end of file
diff --git a/core/translate/directives/lang-changed.js b/core/translate/directives/lang-changed.js
index 5fcd9521..7ab735af 100644
--- a/core/translate/directives/lang-changed.js
+++ b/core/translate/directives/lang-changed.js
@@ -2,8 +2,9 @@ import { directive } from 'lit/directive.js'
import { LangChangedDirectiveBase } from './lang-changed-base.js'
export class LangChangedDirective extends LangChangedDirectiveBase {
- render(getValue) {
- return this.renderValue(getValue)
- }
+ render(getValue) {
+ return this.renderValue(getValue)
+ }
}
+
export const langChanged = directive(LangChangedDirective)
\ No newline at end of file
diff --git a/core/translate/directives/translate-unsafe-html.js b/core/translate/directives/translate-unsafe-html.js
index 0d47066f..4111da75 100644
--- a/core/translate/directives/translate-unsafe-html.js
+++ b/core/translate/directives/translate-unsafe-html.js
@@ -4,9 +4,9 @@ import { TranslateDirective } from './translate.js'
import { get } from '../util.js'
export class TranslateUnsafeHTMLDirective extends TranslateDirective {
- render(key, values, config) {
- return this.renderValue(() => unsafeHTML(get(key, values, config)))
- }
+ render(key, values, config) {
+ return this.renderValue(() => unsafeHTML(get(key, values, config)))
+ }
}
export const translateUnsafeHTML = directive(TranslateUnsafeHTMLDirective)
\ No newline at end of file
diff --git a/core/translate/directives/translate.js b/core/translate/directives/translate.js
index 88395896..2ef51fd8 100644
--- a/core/translate/directives/translate.js
+++ b/core/translate/directives/translate.js
@@ -3,9 +3,9 @@ import { get } from '../util.js'
import { LangChangedDirectiveBase } from './lang-changed-base.js'
export class TranslateDirective extends LangChangedDirectiveBase {
- render(key, values, config) {
- return this.renderValue(() => get(key, values, config))
- }
+ render(key, values, config) {
+ return this.renderValue(() => get(key, values, config))
+ }
}
export const translate = directive(TranslateDirective)
\ No newline at end of file
diff --git a/core/translate/helpers.js b/core/translate/helpers.js
index 0e33c77e..59f2bc9d 100644
--- a/core/translate/helpers.js
+++ b/core/translate/helpers.js
@@ -1,16 +1,18 @@
export function interpolate(text, values, config) {
- return Object.entries(extract(values || {})).reduce((text, [key, value]) => text.replace(new RegExp(`{{[ Â ]*${key}[ Â ]*}}`, `gm`), String(extract(value))), text)
+ return Object.entries(extract(values || {})).reduce((text, [key, value]) => text.replace(new RegExp(`{{[ Â ]*${key}[ Â ]*}}`, `gm`), String(extract(value))), text)
}
export function lookup(key, config) {
- const parts = key.split(".")
- let string = config.strings
- while (string != null && parts.length > 0) {
- string = string[parts.shift()]
- }
- return string != null ? string.toString() : null
+ const parts = key.split(".")
+ let string = config.strings
+
+ while (string != null && parts.length > 0) {
+ string = string[parts.shift()]
+ }
+
+ return string != null ? string.toString() : null
}
export function extract(obj) {
- return (typeof obj === "function") ? obj() : obj
+ return (typeof obj === "function") ? obj() : obj
}
\ No newline at end of file
diff --git a/core/translate/util.js b/core/translate/util.js
index 113e4c85..3c7d9786 100644
--- a/core/translate/util.js
+++ b/core/translate/util.js
@@ -2,48 +2,48 @@ import { LANG_CHANGED_EVENT } from './config.js'
import { extract, interpolate, lookup } from './helpers.js'
export const defaultTranslateConfig = () => {
- return {
- loader: () => Promise.resolve({}),
- empty: key => `[${key}]`,
- lookup: lookup,
- interpolate: interpolate,
- translationCache: {}
- }
+ return {
+ loader: () => Promise.resolve({}),
+ empty: key => `[${key}]`,
+ lookup: lookup,
+ interpolate: interpolate,
+ translationCache: {}
+ }
}
export let translateConfig = defaultTranslateConfig()
export function registerTranslateConfig(config) {
- return (translateConfig = Object.assign(Object.assign({}, translateConfig), config))
+ return (translateConfig = Object.assign(Object.assign({}, translateConfig), config))
}
export function dispatchLangChanged(detail) {
- window.dispatchEvent(new CustomEvent(LANG_CHANGED_EVENT, { detail }))
+ window.dispatchEvent(new CustomEvent(LANG_CHANGED_EVENT, { detail }))
}
export function updateLang(newLang, newStrings, config = translateConfig) {
- dispatchLangChanged({
- previousStrings: config.strings,
- previousLang: config.lang,
- lang: (config.lang = newLang),
- strings: (config.strings = newStrings)
- })
+ dispatchLangChanged({
+ previousStrings: config.strings,
+ previousLang: config.lang,
+ lang: (config.lang = newLang),
+ strings: (config.strings = newStrings)
+ })
}
export function listenForLangChanged(callback, options) {
- const handler = (e) => callback(e.detail)
- window.addEventListener(LANG_CHANGED_EVENT, handler, options)
- return () => window.removeEventListener(LANG_CHANGED_EVENT, handler)
+ const handler = (e) => callback(e.detail)
+ window.addEventListener(LANG_CHANGED_EVENT, handler, options)
+ return () => window.removeEventListener(LANG_CHANGED_EVENT, handler)
}
export async function use(lang, config = translateConfig) {
- const strings = await config.loader(lang, config)
- config.translationCache = {}
- updateLang(lang, strings, config)
+ const strings = await config.loader(lang, config)
+ config.translationCache = {}
+ updateLang(lang, strings, config)
}
export function get(key, values, config = translateConfig) {
- let translation = config.translationCache[key] || (config.translationCache[key] = config.lookup(key, config) || config.empty(key, config))
- values = values != null ? extract(values) : null
- return values != null ? config.interpolate(translation, values, config) : translation
+ let translation = config.translationCache[key] || (config.translationCache[key] = config.lookup(key, config) || config.empty(key, config))
+ values = values != null ? extract(values) : null
+ return values != null ? config.interpolate(translation, values, config) : translation
}
\ No newline at end of file
diff --git a/core/ui-core.js b/core/ui-core.js
index 3cbfaf4b..7ae9a654 100644
--- a/core/ui-core.js
+++ b/core/ui-core.js
@@ -29,16 +29,6 @@ const uiCoreController = (type) => {
default:
return
}
-
}
-module.exports = uiCoreController
-
-/**
- * Performance update
- * Write a CSS ripple effect and replace all paper-ripple and mwc-ripple
- * Do something about the particles...
- */
-
-// TODO: notifications settings, do not show notification in an active chat, Fix double message rendering, right custom menu in chat
-
+module.exports = uiCoreController
\ No newline at end of file
diff --git a/crypto/api/createTransaction.js b/crypto/api/createTransaction.js
index faf24803..3d9c19d9 100644
--- a/crypto/api/createTransaction.js
+++ b/crypto/api/createTransaction.js
@@ -5,7 +5,6 @@ import signChat from './transactions/chat/signChat.js'
import signArbitrary from './transactions/arbitrary/signArbitrary.js'
import signArbitraryWithFee from './transactions/arbitrary/signArbitraryWithFee.js'
-
export const createTransaction = (type, keyPair, params) => {
const tx = new transactions[type]()
tx.keyPair = keyPair
@@ -36,8 +35,6 @@ export const signArbitraryWithFeeTransaction = (arbitraryBytesBase58, arbitraryB
return signArbitraryWithFee(arbitraryBytesBase58, arbitraryBytesForSigningBase58, keyPair)
}
-
-
// Process Transactions
export const processTransaction = bytes => request('/transactions/process', {
method: 'POST',
diff --git a/crypto/api/fetch-request.js b/crypto/api/fetch-request.js
index 3aab5658..6adab74c 100644
--- a/crypto/api/fetch-request.js
+++ b/crypto/api/fetch-request.js
@@ -1,6 +1,7 @@
import {waitForConfig, watchConfig} from '../config.js'
let config = {}
+
watchConfig((c) => {
config = c
})
@@ -15,6 +16,7 @@ export async function request(url, options) {
const n = config.nodeConfig.knownNodes[config.nodeConfig.node]
const node = n.protocol + '://' + n.domain + ':' + n.port
+
return fetch(node + url, {
method,
headers,
diff --git a/crypto/api/transactions/AirdropTransaction.js b/crypto/api/transactions/AirdropTransaction.js
index 0d366ab5..04aa8acf 100644
--- a/crypto/api/transactions/AirdropTransaction.js
+++ b/crypto/api/transactions/AirdropTransaction.js
@@ -1,6 +1,5 @@
-'use strict'
-import TransactionBase from './TransactionBase.js'
-import {QORT_DECIMALS} from '../constants.js'
+import TransactionBase from './TransactionBase'
+import {QORT_DECIMALS} from '../constants'
export default class PaymentTransaction extends TransactionBase {
constructor() {
diff --git a/crypto/api/transactions/DelegationTransaction.js b/crypto/api/transactions/DelegationTransaction.js
index d2b670b8..72883c9a 100644
--- a/crypto/api/transactions/DelegationTransaction.js
+++ b/crypto/api/transactions/DelegationTransaction.js
@@ -1,5 +1,4 @@
-'use strict'
-import TransactionBase from './TransactionBase.js'
+import TransactionBase from './TransactionBase'
export default class DelegationTransaction extends TransactionBase {
constructor() {
diff --git a/crypto/api/transactions/DeployAtTransaction.js b/crypto/api/transactions/DeployAtTransaction.js
index 3e4edbc3..4b77f21e 100644
--- a/crypto/api/transactions/DeployAtTransaction.js
+++ b/crypto/api/transactions/DeployAtTransaction.js
@@ -1,7 +1,6 @@
-'use strict'
-import TransactionBase from './TransactionBase.js'
-import {store} from '../../api.js'
-import {QORT_DECIMALS} from '../constants.js'
+import TransactionBase from './TransactionBase'
+import {store} from '../../api'
+import {QORT_DECIMALS} from '../constants'
export default class DeployAtTransaction extends TransactionBase {
constructor() {
@@ -9,7 +8,6 @@ export default class DeployAtTransaction extends TransactionBase {
this.type = 16
}
-
render(html) {
return html`
${this._atDeployDialog1}:
@@ -31,12 +29,15 @@ export default class DeployAtTransaction extends TransactionBase {
set atDeployDialog1(atDeployDialog1) {
this._atDeployDialog1 = atDeployDialog1
}
+
set atDeployDialog2(atDeployDialog2) {
this._atDeployDialog2 = atDeployDialog2
}
+
set atDeployDialog3(atDeployDialog3) {
this._atDeployDialog3 = atDeployDialog3
}
+
set atDeployDialog4(atDeployDialog4) {
this._atDeployDialog4 = atDeployDialog4
}
@@ -46,6 +47,7 @@ export default class DeployAtTransaction extends TransactionBase {
this._fee = fee * QORT_DECIMALS
this._feeBytes = this.constructor.utils.int64ToBytes(this._fee)
}
+
set rAmount(rAmount) {
this._amountToShow = rAmount
this._rAmount = Math.round(rAmount * store.getState().config.coin.decimals)
@@ -63,26 +65,29 @@ export default class DeployAtTransaction extends TransactionBase {
this._rDescriptionBytes = this.constructor.utils.stringtoUTF8Array(this._rDescription.toLocaleLowerCase())
this._rDescriptionLength = this.constructor.utils.int32ToBytes(this._rDescriptionBytes.length)
}
+
set atType(atType) {
this._atType = atType
this._atTypeBytes = this.constructor.utils.stringtoUTF8Array(this._atType)
this._atTypeLength = this.constructor.utils.int32ToBytes(this._atTypeBytes.length)
}
+
set rTags(rTags) {
this._rTags = rTags
this._rTagsBytes = this.constructor.utils.stringtoUTF8Array(this._rTags.toLocaleLowerCase())
this._rTagsLength = this.constructor.utils.int32ToBytes(this._rTagsBytes.length)
}
+
set rCreationBytes(rCreationBytes) {
const decode = this.constructor.Base58.decode(rCreationBytes)
this._rCreationBytes = this.constructor.utils.stringtoUTF8Array(decode)
this._rCreationBytesLength = this.constructor.utils.int32ToBytes(this._rCreationBytes.length)
}
+
set rAssetId(rAssetId) {
this._rAssetId = this.constructor.utils.int64ToBytes(rAssetId)
}
-
get params() {
const params = super.params
params.push(
diff --git a/crypto/api/transactions/MessageTransaction.js b/crypto/api/transactions/MessageTransaction.js
index 5e34c0fa..e534284f 100644
--- a/crypto/api/transactions/MessageTransaction.js
+++ b/crypto/api/transactions/MessageTransaction.js
@@ -1,13 +1,12 @@
-'use strict'
-import PaymentTransaction from './PaymentTransaction.js'
+import PaymentTransaction from './PaymentTransaction'
export default class MessageTransaction extends PaymentTransaction {
constructor() {
super()
this.type = 17
- this._key = this.constructor.utils.int64ToBytes(0);
- this._isEncrypted = new Uint8Array(1); // Defaults to false
- this._isText = new Uint8Array(1); // Defaults to false
+ this._key = this.constructor.utils.int64ToBytes(0)
+ this._isEncrypted = new Uint8Array(1) // Defaults to false
+ this._isText = new Uint8Array(1) // Defaults to false
}
set message(message /* UTF8 String */) {
diff --git a/crypto/api/transactions/PaymentTransaction.js b/crypto/api/transactions/PaymentTransaction.js
index 7e86b211..ad3c023b 100644
--- a/crypto/api/transactions/PaymentTransaction.js
+++ b/crypto/api/transactions/PaymentTransaction.js
@@ -1,7 +1,6 @@
-'use strict'
-import TransactionBase from './TransactionBase.js'
-import Base58 from '../deps/Base58.js'
-import {store} from '../../api.js'
+import TransactionBase from './TransactionBase'
+import Base58 from '../deps/Base58'
+import {store} from '../../api'
export default class PaymentTransaction extends TransactionBase {
constructor() {
diff --git a/crypto/api/transactions/PublicizeTransaction.js b/crypto/api/transactions/PublicizeTransaction.js
index 2e1afda4..42e5ba50 100644
--- a/crypto/api/transactions/PublicizeTransaction.js
+++ b/crypto/api/transactions/PublicizeTransaction.js
@@ -1,6 +1,5 @@
-"use strict";
-import ChatBase from "./chat/ChatBase.js"
-import {QORT_DECIMALS} from "../constants.js"
+import ChatBase from './chat/ChatBase'
+import {QORT_DECIMALS} from '../constants'
export default class PublicizeTransaction extends ChatBase {
constructor() {
@@ -12,16 +11,18 @@ export default class PublicizeTransaction extends ChatBase {
set proofOfWorkNonce(proofOfWorkNonce) {
this._proofOfWorkNonce = this.constructor.utils.int32ToBytes(proofOfWorkNonce)
}
+
set fee(fee) {
this._fee = fee * QORT_DECIMALS
this._feeBytes = this.constructor.utils.int64ToBytes(this._fee)
}
+
get params() {
- const params = super.params;
+ const params = super.params
params.push(
this._proofOfWorkNonce,
this._feeBytes
)
- return params;
+ return params
}
}
diff --git a/crypto/api/transactions/TransactionBase.js b/crypto/api/transactions/TransactionBase.js
index e29f00b4..c5a96068 100644
--- a/crypto/api/transactions/TransactionBase.js
+++ b/crypto/api/transactions/TransactionBase.js
@@ -1,16 +1,17 @@
-'use strict'
-import {QORT_DECIMALS, TX_TYPES} from '../constants.js'
-import nacl from '../deps/nacl-fast.js'
-import Base58 from '../deps/Base58.js'
-import utils from '../deps/utils.js'
+import {QORT_DECIMALS, TX_TYPES} from '../constants'
+import nacl from '../deps/nacl-fast'
+import Base58 from '../deps/Base58'
+import utils from '../deps/utils'
export default class TransactionBase {
static get utils() {
return utils
}
+
static get nacl() {
return nacl
}
+
static get Base58() {
return Base58
}
diff --git a/crypto/api/transactions/TransferPrivsTransaction.js b/crypto/api/transactions/TransferPrivsTransaction.js
index 61029703..b9eaf809 100644
--- a/crypto/api/transactions/TransferPrivsTransaction.js
+++ b/crypto/api/transactions/TransferPrivsTransaction.js
@@ -1,7 +1,6 @@
-'use strict'
-import TransactionBase from './TransactionBase.js'
-import {store} from '../../api.js'
-import {QORT_DECIMALS} from '../constants.js'
+import TransactionBase from './TransactionBase'
+import {store} from '../../api'
+import {QORT_DECIMALS} from '../constants'
export default class TransferPrivsTransaction extends TransactionBase {
constructor() {
@@ -12,12 +11,12 @@ export default class TransferPrivsTransaction extends TransactionBase {
render(html) {
const conf = store.getState().config
return html`
- Are you sure to transfer privileges to this account ?
-
- ${this.theRecipient}
-
- On pressing confirm, the transfer privileges request will be sent!
- `
+ Are you sure to transfer privileges to this account ?
+
+ ${this.theRecipient}
+
+ On pressing confirm, the transfer privileges request will be sent!
+ `
}
set recipient(recipient) {
diff --git a/crypto/api/transactions/arbitrary/signArbitrary.js b/crypto/api/transactions/arbitrary/signArbitrary.js
index bad7ccae..6118a99b 100644
--- a/crypto/api/transactions/arbitrary/signArbitrary.js
+++ b/crypto/api/transactions/arbitrary/signArbitrary.js
@@ -1,9 +1,8 @@
-import nacl from '../../deps/nacl-fast.js'
-import utils from '../../deps/utils.js'
-import Base58 from '../../deps/Base58.js'
+import nacl from '../../deps/nacl-fast'
+import utils from '../../deps/utils'
+import Base58 from '../../deps/Base58'
const signArbitrary = (arbitraryBytesBase58, arbitraryBytesForSigningBase58, nonce, keyPair) => {
-
if (!arbitraryBytesBase58) {
throw new Error('ArbitraryBytesBase58 not defined')
}
@@ -19,12 +18,11 @@ const signArbitrary = (arbitraryBytesBase58, arbitraryBytesForSigningBase58, non
const arbitraryBytes = Base58.decode(arbitraryBytesBase58)
const _arbitraryBytesBuffer = Object.keys(arbitraryBytes).map(function (key) { return arbitraryBytes[key]; })
const arbitraryBytesBuffer = new Uint8Array(_arbitraryBytesBuffer)
-
const arbitraryBytesForSigning = Base58.decode(arbitraryBytesForSigningBase58)
const _arbitraryBytesForSigningBuffer = Object.keys(arbitraryBytesForSigning).map(function (key) { return arbitraryBytesForSigning[key]; })
const arbitraryBytesForSigningBuffer = new Uint8Array(_arbitraryBytesForSigningBuffer)
-
const _nonce = utils.int32ToBytes(nonce)
+
arbitraryBytesBuffer.set(_nonce, 112)
arbitraryBytesForSigningBuffer.set(_nonce, 112)
diff --git a/crypto/api/transactions/arbitrary/signArbitraryWithFee.js b/crypto/api/transactions/arbitrary/signArbitraryWithFee.js
index fdab1200..700990c4 100644
--- a/crypto/api/transactions/arbitrary/signArbitraryWithFee.js
+++ b/crypto/api/transactions/arbitrary/signArbitraryWithFee.js
@@ -1,14 +1,12 @@
-import nacl from '../../deps/nacl-fast.js'
-import utils from '../../deps/utils.js'
-import Base58 from '../../deps/Base58.js'
+import nacl from '../../deps/nacl-fast'
+import utils from '../../deps/utils'
+import Base58 from '../../deps/Base58'
const signArbitraryWithFee = (arbitraryBytesBase58, arbitraryBytesForSigningBase58, keyPair) => {
-
if (!arbitraryBytesBase58) {
throw new Error('ArbitraryBytesBase58 not defined')
}
-
if (!keyPair) {
throw new Error('keyPair not defined')
}
@@ -16,13 +14,9 @@ const signArbitraryWithFee = (arbitraryBytesBase58, arbitraryBytesForSigningBase
const arbitraryBytes = Base58.decode(arbitraryBytesBase58)
const _arbitraryBytesBuffer = Object.keys(arbitraryBytes).map(function (key) { return arbitraryBytes[key]; })
const arbitraryBytesBuffer = new Uint8Array(_arbitraryBytesBuffer)
-
const arbitraryBytesForSigning = Base58.decode(arbitraryBytesForSigningBase58)
const _arbitraryBytesForSigningBuffer = Object.keys(arbitraryBytesForSigning).map(function (key) { return arbitraryBytesForSigning[key]; })
const arbitraryBytesForSigningBuffer = new Uint8Array(_arbitraryBytesForSigningBuffer)
-
-
-
const signature = nacl.sign.detached(arbitraryBytesForSigningBuffer, keyPair.privateKey)
return utils.appendBuffer(arbitraryBytesBuffer, signature)
diff --git a/crypto/api/transactions/arbitraryV3.js b/crypto/api/transactions/arbitraryV3.js
index 2c2536af..dd871aac 100644
--- a/crypto/api/transactions/arbitraryV3.js
+++ b/crypto/api/transactions/arbitraryV3.js
@@ -26,6 +26,7 @@
data = appendBuffer(data, lastReference)
data = appendBuffer(data, publicKey)
data = appendBuffer(data, paymentsLengthBytes)
+
// Here it is necessary to insert the payments, if there are
data = appendBuffer(data, serviceBytes)
data = appendBuffer(data, dataSizeBytes)
diff --git a/crypto/api/transactions/chat/ChatBase.js b/crypto/api/transactions/chat/ChatBase.js
index ce9fe8dc..fe1b26f5 100644
--- a/crypto/api/transactions/chat/ChatBase.js
+++ b/crypto/api/transactions/chat/ChatBase.js
@@ -1,16 +1,17 @@
-'use strict'
-import {QORT_DECIMALS, TX_TYPES} from '../../constants.js'
-import nacl from '../../deps/nacl-fast.js'
-import Base58 from '../../deps/Base58.js'
-import utils from '../../deps/utils.js'
+import {QORT_DECIMALS, TX_TYPES} from '../../constants'
+import nacl from '../../deps/nacl-fast'
+import Base58 from '../../deps/Base58'
+import utils from '../../deps/utils'
export default class ChatBase {
static get utils() {
return utils
}
+
static get nacl() {
return nacl
}
+
static get Base58() {
return Base58
}
@@ -135,6 +136,7 @@ export default class ChatBase {
return true
}
})
+
return finalResult
}
diff --git a/crypto/api/transactions/chat/ChatTransaction.js b/crypto/api/transactions/chat/ChatTransaction.js
index b79aa415..1b048aa3 100644
--- a/crypto/api/transactions/chat/ChatTransaction.js
+++ b/crypto/api/transactions/chat/ChatTransaction.js
@@ -1,10 +1,8 @@
-'use strict'
-import ChatBase from "./ChatBase.js"
-import nacl from '../../deps/nacl-fast.js'
-import ed2curve from '../../deps/ed2curve.js'
+import ChatBase from './ChatBase'
+import nacl from '../../deps/nacl-fast'
+import ed2curve from '../../deps/ed2curve'
import {Sha256} from 'asmcrypto.js'
-import {CHAT_REFERENCE_FEATURE_TRIGGER_TIMESTAMP} from '../../constants.js'
-
+import {CHAT_REFERENCE_FEATURE_TRIGGER_TIMESTAMP} from '../../constants'
export default class ChatTransaction extends ChatBase {
constructor() {
diff --git a/crypto/api/transactions/chat/GroupChatTransaction.js b/crypto/api/transactions/chat/GroupChatTransaction.js
index a7dd51c3..bb69f442 100644
--- a/crypto/api/transactions/chat/GroupChatTransaction.js
+++ b/crypto/api/transactions/chat/GroupChatTransaction.js
@@ -1,6 +1,5 @@
-'use strict'
-import ChatBase from "./ChatBase.js"
-import {CHAT_REFERENCE_FEATURE_TRIGGER_TIMESTAMP} from '../../constants.js'
+import ChatBase from './ChatBase'
+import {CHAT_REFERENCE_FEATURE_TRIGGER_TIMESTAMP} from '../../constants'
export default class GroupChatTransaction extends ChatBase {
constructor() {
@@ -34,7 +33,7 @@ export default class GroupChatTransaction extends ChatBase {
}
set isEncrypted(isEncrypted) {
- this._isEncrypted = new Uint8Array(1);
+ this._isEncrypted = new Uint8Array(1)
this._isEncrypted[0] = isEncrypted
}
@@ -63,6 +62,7 @@ export default class GroupChatTransaction extends ChatBase {
params.push(this._chatReference)
}
}
+
return params
}
}
diff --git a/crypto/api/transactions/chat/decryptChatMessage.js b/crypto/api/transactions/chat/decryptChatMessage.js
index 38ecea4e..8f4b05df 100644
--- a/crypto/api/transactions/chat/decryptChatMessage.js
+++ b/crypto/api/transactions/chat/decryptChatMessage.js
@@ -1,6 +1,6 @@
-import nacl from '../../deps/nacl-fast.js'
-import Base58 from '../../deps/Base58.js'
-import ed2curve from '../../deps/ed2curve.js'
+import nacl from '../../deps/nacl-fast'
+import Base58 from '../../deps/Base58'
+import ed2curve from '../../deps/ed2curve'
import {Sha256} from 'asmcrypto.js'
export const decryptChatMessage = (encryptedMessage, privateKey, recipientPublicKey, lastReference) => {
@@ -8,12 +8,11 @@ export const decryptChatMessage = (encryptedMessage, privateKey, recipientPublic
const _base58RecipientPublicKey = recipientPublicKey instanceof Uint8Array ? Base58.encode(recipientPublicKey) : recipientPublicKey
const _recipientPublicKey = Base58.decode(_base58RecipientPublicKey)
-
const _lastReference = lastReference instanceof Uint8Array ? lastReference : Base58.decode(lastReference)
-
const convertedPrivateKey = ed2curve.convertSecretKey(privateKey)
const convertedPublicKey = ed2curve.convertPublicKey(_recipientPublicKey)
- const sharedSecret = new Uint8Array(32);
+ const sharedSecret = new Uint8Array(32)
+
nacl.lowlevel.crypto_scalarmult(sharedSecret, convertedPrivateKey, convertedPublicKey)
const _chatEncryptionSeed = new Sha256().process(sharedSecret).finish().result
@@ -26,32 +25,30 @@ export const decryptChatMessage = (encryptedMessage, privateKey, recipientPublic
}
export const decryptChatMessageBase64 = (encryptedMessage, privateKey, recipientPublicKey, lastReference) => {
- let _encryptedMessage = atob(encryptedMessage);
- const binaryLength = _encryptedMessage.length;
- const bytes = new Uint8Array(binaryLength);
+ let _encryptedMessage = atob(encryptedMessage)
+
+ const binaryLength = _encryptedMessage.length
+ const bytes = new Uint8Array(binaryLength)
for (let i = 0; i < binaryLength; i++) {
- bytes[i] = _encryptedMessage.charCodeAt(i);
+ bytes[i] = _encryptedMessage.charCodeAt(i)
}
const _base58RecipientPublicKey = recipientPublicKey instanceof Uint8Array ? Base58.encode(recipientPublicKey) : recipientPublicKey
const _recipientPublicKey = Base58.decode(_base58RecipientPublicKey)
-
const _lastReference = lastReference instanceof Uint8Array ? lastReference : Base58.decode(lastReference)
-
const convertedPrivateKey = ed2curve.convertSecretKey(privateKey)
const convertedPublicKey = ed2curve.convertPublicKey(_recipientPublicKey)
- const sharedSecret = new Uint8Array(32);
+ const sharedSecret = new Uint8Array(32)
+
nacl.lowlevel.crypto_scalarmult(sharedSecret, convertedPrivateKey, convertedPublicKey)
const _chatEncryptionSeed = new Sha256().process(sharedSecret).finish().result
const _decryptedMessage = nacl.secretbox.open(bytes, _lastReference.slice(0, 24), _chatEncryptionSeed)
-
if (_decryptedMessage === false) {
return _decryptedMessage
}
+
return new TextDecoder('utf-8').decode(_decryptedMessage)
-
-
}
diff --git a/crypto/api/transactions/chat/signChat.js b/crypto/api/transactions/chat/signChat.js
index da2597d0..2b80e8a9 100644
--- a/crypto/api/transactions/chat/signChat.js
+++ b/crypto/api/transactions/chat/signChat.js
@@ -1,5 +1,5 @@
-import nacl from '../../deps/nacl-fast.js'
-import utils from '../../deps/utils.js'
+import nacl from '../../deps/nacl-fast'
+import utils from '../../deps/utils'
const signChat = (chatBytes, nonce, keyPair) => {
diff --git a/crypto/api/transactions/groups/AddGroupAdminTransaction.js b/crypto/api/transactions/groups/AddGroupAdminTransaction.js
index 4719320c..761e0029 100644
--- a/crypto/api/transactions/groups/AddGroupAdminTransaction.js
+++ b/crypto/api/transactions/groups/AddGroupAdminTransaction.js
@@ -1,6 +1,5 @@
-'use strict'
-import TransactionBase from '../TransactionBase.js'
-import {QORT_DECIMALS} from '../../constants.js'
+import TransactionBase from '../TransactionBase'
+import {QORT_DECIMALS} from '../../constants'
export default class AddGroupAdminTransaction extends TransactionBase {
constructor() {
diff --git a/crypto/api/transactions/groups/CancelGroupBanTransaction.js b/crypto/api/transactions/groups/CancelGroupBanTransaction.js
index 78d58c85..f0b11fa1 100644
--- a/crypto/api/transactions/groups/CancelGroupBanTransaction.js
+++ b/crypto/api/transactions/groups/CancelGroupBanTransaction.js
@@ -1,6 +1,5 @@
-'use strict'
-import TransactionBase from '../TransactionBase.js'
-import {QORT_DECIMALS} from '../../constants.js'
+import TransactionBase from '../TransactionBase'
+import {QORT_DECIMALS} from '../../constants'
export default class CancelGroupBanTransaction extends TransactionBase {
constructor() {
diff --git a/crypto/api/transactions/groups/CancelGroupInviteTransaction.js b/crypto/api/transactions/groups/CancelGroupInviteTransaction.js
index 6bf09844..8dccb6fa 100644
--- a/crypto/api/transactions/groups/CancelGroupInviteTransaction.js
+++ b/crypto/api/transactions/groups/CancelGroupInviteTransaction.js
@@ -1,6 +1,5 @@
-'use strict'
-import TransactionBase from '../TransactionBase.js'
-import {QORT_DECIMALS} from '../../constants.js'
+import TransactionBase from '../TransactionBase'
+import {QORT_DECIMALS} from '../../constants'
export default class CancelGroupInviteTransaction extends TransactionBase {
constructor() {
diff --git a/crypto/api/transactions/groups/CreateGroupTransaction.js b/crypto/api/transactions/groups/CreateGroupTransaction.js
index 1a6b38c9..b81e47ee 100644
--- a/crypto/api/transactions/groups/CreateGroupTransaction.js
+++ b/crypto/api/transactions/groups/CreateGroupTransaction.js
@@ -1,6 +1,5 @@
-'use strict'
-import TransactionBase from '../TransactionBase.js'
-import {QORT_DECIMALS} from '../../constants.js'
+import TransactionBase from '../TransactionBase'
+import {QORT_DECIMALS} from '../../constants'
export default class CreateGroupTransaction extends TransactionBase {
constructor() {
@@ -12,11 +11,11 @@ export default class CreateGroupTransaction extends TransactionBase {
return html`
${this._groupdialog5}
-
${this._groupdialog7}: ${this._rGroupName}
-
-
${this._groupdialog8}: ${this._rGroupDesc}
-
-
${this._groupdialog9}: ${this.myGroupType === 1 ? "Public" : "Private"}
+
${this._groupdialog7}: ${this._rGroupName}
+
+
${this._groupdialog8}: ${this._rGroupDesc}
+
+
${this._groupdialog9}: ${this._rGroupTypeDesc}
${this._groupdialog6}
`
@@ -42,6 +41,10 @@ export default class CreateGroupTransaction extends TransactionBase {
this._groupdialog9 = groupdialog9
}
+ set groupTypeDesc(groupTypeDesc) {
+ this._rGroupTypeDesc = groupTypeDesc
+ }
+
set fee(fee) {
this._fee = fee * QORT_DECIMALS
this._feeBytes = this.constructor.utils.int64ToBytes(this._fee)
@@ -49,18 +52,17 @@ export default class CreateGroupTransaction extends TransactionBase {
set rGroupName(rGroupName) {
this._rGroupName = rGroupName
- this._rGroupNameBytes = this.constructor.utils.stringtoUTF8Array(this._rGroupName.toLocaleLowerCase())
+ this._rGroupNameBytes = this.constructor.utils.stringtoUTF8Array(this._rGroupName)
this._rGroupNameLength = this.constructor.utils.int32ToBytes(this._rGroupNameBytes.length)
}
set rGroupDesc(rGroupDesc) {
this._rGroupDesc = rGroupDesc
- this._rGroupDescBytes = this.constructor.utils.stringtoUTF8Array(this._rGroupDesc.toLocaleLowerCase())
+ this._rGroupDescBytes = this.constructor.utils.stringtoUTF8Array(this._rGroupDesc)
this._rGroupDescLength = this.constructor.utils.int32ToBytes(this._rGroupDescBytes.length)
}
set rGroupType(rGroupType) {
- this.myGroupType = rGroupType
this._rGroupType = new Uint8Array(1)
this._rGroupType[0] = rGroupType
}
@@ -71,13 +73,11 @@ export default class CreateGroupTransaction extends TransactionBase {
}
set rGroupMinimumBlockDelay(rGroupMinimumBlockDelay) {
- this._rGroupMinimumBlockDelay = rGroupMinimumBlockDelay
- this._rGroupMinimumBlockDelayBytes = this.constructor.utils.int32ToBytes(this._rGroupMinimumBlockDelay)
+ this._rGroupMinimumBlockDelayBytes = this.constructor.utils.int32ToBytes(rGroupMinimumBlockDelay)
}
set rGroupMaximumBlockDelay(rGroupMaximumBlockDelay) {
- this._rGroupMaximumBlockDelay = rGroupMaximumBlockDelay
- this._rGroupMaximumBlockDelayBytes = this.constructor.utils.int32ToBytes(this._rGroupMaximumBlockDelay)
+ this._rGroupMaximumBlockDelayBytes = this.constructor.utils.int32ToBytes(rGroupMaximumBlockDelay)
}
get params() {
diff --git a/crypto/api/transactions/groups/GroupBanTransaction.js b/crypto/api/transactions/groups/GroupBanTransaction.js
index 23aeb769..ab679f7a 100644
--- a/crypto/api/transactions/groups/GroupBanTransaction.js
+++ b/crypto/api/transactions/groups/GroupBanTransaction.js
@@ -1,6 +1,5 @@
-'use strict'
-import TransactionBase from '../TransactionBase.js'
-import {QORT_DECIMALS} from '../../constants.js'
+import TransactionBase from '../TransactionBase'
+import {QORT_DECIMALS} from '../../constants'
export default class GroupBanTransaction extends TransactionBase {
constructor() {
@@ -33,7 +32,7 @@ export default class GroupBanTransaction extends TransactionBase {
set rBanReason(rBanReason) {
this._rBanReason = rBanReason
- this._rBanReasonBytes = this.constructor.utils.stringtoUTF8Array(this._rBanReason.toLocaleLowerCase())
+ this._rBanReasonBytes = this.constructor.utils.stringtoUTF8Array(this._rBanReason)
this._rBanReasonLength = this.constructor.utils.int32ToBytes(this._rBanReasonBytes.length)
}
diff --git a/crypto/api/transactions/groups/GroupInviteTransaction.js b/crypto/api/transactions/groups/GroupInviteTransaction.js
index 0e7397e3..20ce9bed 100644
--- a/crypto/api/transactions/groups/GroupInviteTransaction.js
+++ b/crypto/api/transactions/groups/GroupInviteTransaction.js
@@ -1,6 +1,5 @@
-'use strict'
-import TransactionBase from '../TransactionBase.js'
-import {QORT_DECIMALS} from '../../constants.js'
+import TransactionBase from '../TransactionBase'
+import {QORT_DECIMALS} from '../../constants'
export default class GroupInviteTransaction extends TransactionBase {
constructor() {
diff --git a/crypto/api/transactions/groups/GroupKickTransaction.js b/crypto/api/transactions/groups/GroupKickTransaction.js
index 22712da4..77391943 100644
--- a/crypto/api/transactions/groups/GroupKickTransaction.js
+++ b/crypto/api/transactions/groups/GroupKickTransaction.js
@@ -1,6 +1,5 @@
-'use strict'
-import TransactionBase from '../TransactionBase.js'
-import {QORT_DECIMALS} from '../../constants.js'
+import TransactionBase from '../TransactionBase'
+import {QORT_DECIMALS} from '../../constants'
export default class GroupKickTransaction extends TransactionBase {
constructor() {
@@ -33,7 +32,7 @@ export default class GroupKickTransaction extends TransactionBase {
set rBanReason(rBanReason) {
this._rBanReason = rBanReason
- this._rBanReasonBytes = this.constructor.utils.stringtoUTF8Array(this._rBanReason.toLocaleLowerCase())
+ this._rBanReasonBytes = this.constructor.utils.stringtoUTF8Array(this._rBanReason)
this._rBanReasonLength = this.constructor.utils.int32ToBytes(this._rBanReasonBytes.length)
}
diff --git a/crypto/api/transactions/groups/JoinGroupTransaction.js b/crypto/api/transactions/groups/JoinGroupTransaction.js
index b42e17d2..4db9cb73 100644
--- a/crypto/api/transactions/groups/JoinGroupTransaction.js
+++ b/crypto/api/transactions/groups/JoinGroupTransaction.js
@@ -1,6 +1,5 @@
-'use strict'
-import TransactionBase from '../TransactionBase.js'
-import {QORT_DECIMALS} from '../../constants.js'
+import TransactionBase from '../TransactionBase'
+import {QORT_DECIMALS} from '../../constants'
export default class JoinGroupTransaction extends TransactionBase {
constructor() {
diff --git a/crypto/api/transactions/groups/LeaveGroupTransaction.js b/crypto/api/transactions/groups/LeaveGroupTransaction.js
index fd57381f..104cb9fe 100644
--- a/crypto/api/transactions/groups/LeaveGroupTransaction.js
+++ b/crypto/api/transactions/groups/LeaveGroupTransaction.js
@@ -1,6 +1,5 @@
-'use strict'
-import TransactionBase from '../TransactionBase.js'
-import {QORT_DECIMALS} from '../../constants.js'
+import TransactionBase from '../TransactionBase'
+import {QORT_DECIMALS} from '../../constants'
export default class LeaveGroupTransaction extends TransactionBase {
constructor() {
diff --git a/crypto/api/transactions/groups/RemoveGroupAdminTransaction.js b/crypto/api/transactions/groups/RemoveGroupAdminTransaction.js
index abd8c084..d0aff6a3 100644
--- a/crypto/api/transactions/groups/RemoveGroupAdminTransaction.js
+++ b/crypto/api/transactions/groups/RemoveGroupAdminTransaction.js
@@ -1,6 +1,5 @@
-'use strict'
-import TransactionBase from '../TransactionBase.js'
-import {QORT_DECIMALS} from '../../constants.js'
+import TransactionBase from '../TransactionBase'
+import {QORT_DECIMALS} from '../../constants'
export default class RemoveGroupAdminTransaction extends TransactionBase {
constructor() {
diff --git a/crypto/api/transactions/groups/UpdateGroupTransaction.js b/crypto/api/transactions/groups/UpdateGroupTransaction.js
index 1c01bff6..d080c24f 100644
--- a/crypto/api/transactions/groups/UpdateGroupTransaction.js
+++ b/crypto/api/transactions/groups/UpdateGroupTransaction.js
@@ -1,74 +1,109 @@
-'use strict';
-import TransactionBase from '../TransactionBase.js'
-import {store} from '../../../api.js'
-import {QORT_DECIMALS} from "../../constants.js"
+import TransactionBase from '../TransactionBase'
+import {QORT_DECIMALS} from '../../constants'
export default class UpdateGroupTransaction extends TransactionBase {
- constructor() {
- super()
- this.type = 23
- }
+ constructor() {
+ super()
+ this.type = 23
+ }
- render(html) {
- const conf = store.getState().config
- return html`
- Are you sure to update this group ?
-
+ render(html) {
+ return html`
+ ${this._updategroupdialog1}
+
+
${this._updategroupdialog3}: ${this._rGroupNewOwnerDesc}
+
+
${this._updategroupdialog4}: ${this._rGroupNewName}
+
+
${this._updategroupdialog5}: ${this._rGroupNewDesc}
+
+
${this._updategroupdialog6}: ${this._rGroupTypeDesc}
+
+ ${this._updategroupdialog2}
+ `
+ }
-
- On pressing confirm, the group details will be updated!
- `
- }
+ set updategroupdialog1(updategroupdialog1) {
+ this._updategroupdialog1 = updategroupdialog1
+ }
- set fee(fee) {
- this._fee = fee * QORT_DECIMALS
- this._feeBytes = this.constructor.utils.int64ToBytes(this._fee)
- }
+ set updategroupdialog2(updategroupdialog2) {
+ this._updategroupdialog2 = updategroupdialog2
+ }
- set newOwner(newOwner) {
- this._newOwner = newOwner instanceof Uint8Array ? newOwner : this.constructor.Base58.decode(newOwner)
- }
+ set updategroupdialog3(updategroupdialog3) {
+ this._updategroupdialog3 = updategroupdialog3
+ }
- set newIsOpen(newIsOpen) {
- this._rGroupType = new Uint8Array(1)
- this._rGroupType[0] = newIsOpen
- }
+ set updategroupdialog4(updategroupdialog4) {
+ this._updategroupdialog4 = updategroupdialog4
+ }
- set newDescription(newDescription) {
- this._rGroupDescBytes = this.constructor.utils.stringtoUTF8Array(newDescription.toLocaleLowerCase())
- this._rGroupDescLength = this.constructor.utils.int32ToBytes(this._rGroupDescBytes.length)
- }
+ set updategroupdialog5(updategroupdialog5) {
+ this._updategroupdialog5 = updategroupdialog5
+ }
- set newApprovalThreshold(newApprovalThreshold) {
- this._rGroupApprovalThreshold = new Uint8Array(1)
- this._rGroupApprovalThreshold[0] = newApprovalThreshold;
- }
+ set groupTypeDesc(groupTypeDesc) {
+ this._rGroupTypeDesc = groupTypeDesc
+ }
- set newMinimumBlockDelay(newMinimumBlockDelay) {
- this._rGroupMinimumBlockDelayBytes = this.constructor.utils.int32ToBytes(newMinimumBlockDelay)
- }
+ set fee(fee) {
+ this._fee = fee * QORT_DECIMALS
+ this._feeBytes = this.constructor.utils.int64ToBytes(this._fee)
+ }
- set newMaximumBlockDelay(newMaximumBlockDelay) {
- this._rGroupMaximumBlockDelayBytes = this.constructor.utils.int32ToBytes(newMaximumBlockDelay)
- }
+ set newGroupId(newGroupId) {
+ this._rGroupNewBytes = this.constructor.utils.int32ToBytes(newGroupId)
+ }
- set _groupId(_groupId){
- this._groupBytes = this.constructor.utils.int32ToBytes(_groupId)
- }
+ set newOwner(newOwner) {
+ this._rGroupNewOwnerDesc = newOwner
+ this._rGroupNewOwner = newOwner instanceof Uint8Array ? newOwner : this.constructor.Base58.decode(newOwner)
+ }
- get params() {
- const params = super.params
- params.push(
- this._groupBytes,
- this._newOwner,
- this._rGroupDescLength,
- this._rGroupDescBytes,
- this._rGroupType,
- this._rGroupApprovalThreshold,
- this._rGroupMinimumBlockDelayBytes,
- this._rGroupMaximumBlockDelayBytes,
- this._feeBytes
- )
- return params
- }
+ set newName(newName) {
+ this._rGroupNewName = newName
+ this._rGroupNewNameBytes = this.constructor.utils.stringtoUTF8Array(this._rGroupNewName)
+ this._rGroupNewNameLength = this.constructor.utils.int32ToBytes(this._rGroupNewNameBytes.length)
+ }
+
+ set newDescription(newDescription) {
+ this._rGroupNewDesc = newDescription
+ this._rGroupNewDescBytes = this.constructor.utils.stringtoUTF8Array(this._rGroupNewDesc)
+ this._rGroupNewDescLength = this.constructor.utils.int32ToBytes(this._rGroupNewDescBytes.length)
+ }
+
+ set newIsOpen(newIsOpen) {
+ this._rGroupNewType = new Uint8Array(1)
+ this._rGroupNewType[0] = newIsOpen
+ }
+
+ set newApprovalThreshold(newApprovalThreshold) {
+ this._rGroupNewApprovalThreshold = new Uint8Array(1)
+ this._rGroupNewApprovalThreshold[0] = newApprovalThreshold
+ }
+
+ set newMinimumBlockDelay(newMinimumBlockDelay) {
+ this._rGroupNewMinimumBlockDelayBytes = this.constructor.utils.int32ToBytes(newMinimumBlockDelay)
+ }
+
+ set newMaximumBlockDelay(newMaximumBlockDelay) {
+ this._rGroupNewMaximumBlockDelayBytes = this.constructor.utils.int32ToBytes(newMaximumBlockDelay)
+ }
+
+ get params() {
+ const params = super.params
+ params.push(
+ this._rGroupNewBytes,
+ this._rGroupNewOwner,
+ this._rGroupNewDescLength,
+ this._rGroupNewDescBytes,
+ this._rGroupNewType,
+ this._rGroupNewApprovalThreshold,
+ this._rGroupNewMinimumBlockDelayBytes,
+ this._rGroupNewMaximumBlockDelayBytes,
+ this._feeBytes
+ )
+ return params
+ }
}
diff --git a/crypto/api/transactions/names/BuyNameTransacion.js b/crypto/api/transactions/names/BuyNameTransacion.js
index c03f7b85..d41a7ab8 100644
--- a/crypto/api/transactions/names/BuyNameTransacion.js
+++ b/crypto/api/transactions/names/BuyNameTransacion.js
@@ -1,6 +1,5 @@
-'use strict'
-import TransactionBase from '../TransactionBase.js'
-import {QORT_DECIMALS} from '../../constants.js'
+import TransactionBase from '../TransactionBase'
+import {QORT_DECIMALS} from '../../constants'
export default class BuyNameTransacion extends TransactionBase {
constructor() {
diff --git a/crypto/api/transactions/names/CancelSellNameTransacion.js b/crypto/api/transactions/names/CancelSellNameTransacion.js
index cfd59b8d..5d53b3a7 100644
--- a/crypto/api/transactions/names/CancelSellNameTransacion.js
+++ b/crypto/api/transactions/names/CancelSellNameTransacion.js
@@ -1,6 +1,5 @@
-'use strict'
-import TransactionBase from '../TransactionBase.js'
-import {QORT_DECIMALS} from '../../constants.js'
+import TransactionBase from '../TransactionBase'
+import {QORT_DECIMALS} from '../../constants'
export default class CancelSellNameTransacion extends TransactionBase {
constructor() {
diff --git a/crypto/api/transactions/names/RegisterNameTransaction.js b/crypto/api/transactions/names/RegisterNameTransaction.js
index 06dde2ea..7240e281 100644
--- a/crypto/api/transactions/names/RegisterNameTransaction.js
+++ b/crypto/api/transactions/names/RegisterNameTransaction.js
@@ -1,6 +1,5 @@
-'use strict'
-import TransactionBase from '../TransactionBase.js'
-import {QORT_DECIMALS} from '../../constants.js'
+import TransactionBase from '../TransactionBase'
+import {QORT_DECIMALS} from '../../constants'
export default class RegisterNameTransaction extends TransactionBase {
constructor() {
diff --git a/crypto/api/transactions/names/SellNameTransacion.js b/crypto/api/transactions/names/SellNameTransacion.js
index 1ce67835..f93ea901 100644
--- a/crypto/api/transactions/names/SellNameTransacion.js
+++ b/crypto/api/transactions/names/SellNameTransacion.js
@@ -1,6 +1,5 @@
-'use strict'
-import TransactionBase from '../TransactionBase.js'
-import {QORT_DECIMALS} from '../../constants.js'
+import TransactionBase from '../TransactionBase'
+import {QORT_DECIMALS} from '../../constants'
export default class SellNameTransacion extends TransactionBase {
constructor() {
diff --git a/crypto/api/transactions/names/UpdateNameTransaction.js b/crypto/api/transactions/names/UpdateNameTransaction.js
index f7ccf613..c9f5aebe 100644
--- a/crypto/api/transactions/names/UpdateNameTransaction.js
+++ b/crypto/api/transactions/names/UpdateNameTransaction.js
@@ -1,6 +1,5 @@
-'use strict'
-import TransactionBase from '../TransactionBase.js'
-import {QORT_DECIMALS} from '../../constants.js'
+import TransactionBase from '../TransactionBase'
+import {QORT_DECIMALS} from '../../constants'
export default class UpdateNameTransaction extends TransactionBase {
constructor() {
diff --git a/crypto/api/transactions/polls/CreatePollTransaction.js b/crypto/api/transactions/polls/CreatePollTransaction.js
index bb578126..fa01e9b1 100644
--- a/crypto/api/transactions/polls/CreatePollTransaction.js
+++ b/crypto/api/transactions/polls/CreatePollTransaction.js
@@ -1,6 +1,5 @@
-'use strict'
-import TransactionBase from '../TransactionBase.js'
-import {QORT_DECIMALS} from '../../constants.js'
+import TransactionBase from '../TransactionBase'
+import {QORT_DECIMALS} from '../../constants'
export default class CreatePollTransaction extends TransactionBase {
constructor() {
@@ -25,15 +24,15 @@ export default class CreatePollTransaction extends TransactionBase {
${this._votedialog6}
- ${this._feeDialog}: ${this._feeDisplay}
+ ${this._feeDialog}: ${this._feeDisplay}
`
}
addOption(option) {
- const optionBytes = this.constructor.utils.stringtoUTF8Array(option);
- const optionLength = this.constructor.utils.int32ToBytes(optionBytes.length);
- this._options.push({ length: optionLength, bytes: optionBytes });
+ const optionBytes = this.constructor.utils.stringtoUTF8Array(option)
+ const optionLength = this.constructor.utils.int32ToBytes(optionBytes.length)
+ this._options.push({ length: optionLength, bytes: optionBytes })
}
set feeDialog(feeDialog){
@@ -69,7 +68,7 @@ export default class CreatePollTransaction extends TransactionBase {
set rPollName(rPollName) {
this._rPollName = rPollName
this._rPollNameBytes = this.constructor.utils.stringtoUTF8Array(this._rPollName)
- this._rPollNameLength = this.constructor.utils.int32ToBytes(this._rPollNameBytes.length);
+ this._rPollNameLength = this.constructor.utils.int32ToBytes(this._rPollNameBytes.length)
}
@@ -80,13 +79,14 @@ export default class CreatePollTransaction extends TransactionBase {
}
set rOptions(rOptions) {
- const optionsArray = rOptions[0].split(', ').map(opt => opt.trim());
+ const optionsArray = rOptions[0].split(', ').map(opt => opt.trim())
this._pollOptions = optionsArray
+
for (let i = 0; i < optionsArray.length; i++) {
- this.addOption(optionsArray[i]);
+ this.addOption(optionsArray[i])
}
- this._rNumberOfOptionsBytes = this.constructor.utils.int32ToBytes(optionsArray.length);
+ this._rNumberOfOptionsBytes = this.constructor.utils.int32ToBytes(optionsArray.length)
}
@@ -100,9 +100,10 @@ export default class CreatePollTransaction extends TransactionBase {
this._rPollDescBytes,
this._rNumberOfOptionsBytes
)
+
// Push the dynamic options
for (let i = 0; i < this._options.length; i++) {
- params.push(this._options[i].length, this._options[i].bytes);
+ params.push(this._options[i].length, this._options[i].bytes)
}
params.push(this._feeBytes);
diff --git a/crypto/api/transactions/polls/VoteOnPollTransaction.js b/crypto/api/transactions/polls/VoteOnPollTransaction.js
index 16c51140..83a7eda9 100644
--- a/crypto/api/transactions/polls/VoteOnPollTransaction.js
+++ b/crypto/api/transactions/polls/VoteOnPollTransaction.js
@@ -1,6 +1,5 @@
-'use strict'
-import TransactionBase from '../TransactionBase.js'
-import {QORT_DECIMALS} from '../../constants.js'
+import TransactionBase from '../TransactionBase'
+import {QORT_DECIMALS} from '../../constants'
export default class VoteOnPollTransaction extends TransactionBase {
constructor() {
@@ -16,7 +15,7 @@ export default class VoteOnPollTransaction extends TransactionBase {