Oxen rebrand (#239)

Oxen rebranding
This commit is contained in:
kylezs 2021-01-05 21:26:42 -08:00 committed by GitHub
parent 6e2f9b282b
commit 1e5cfb2ecc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
80 changed files with 7120 additions and 851 deletions

View File

@ -1,4 +1,4 @@
name: Loki Electron Wallet Build
name: Oxen Electron Wallet Build
on:
push:
@ -30,7 +30,7 @@ jobs:
- name: Install dependencies
run: npm install
- name: Download lokid binaries
- name: Download oxend binaries
run: ./download-asset.sh
env:
OS: ${{ runner.os }}
@ -50,10 +50,10 @@ jobs:
shell: bash
working-directory: ./downloads
- name: Move lokid binaries
- name: Move oxend binaries
run: |
find ./downloads -type f -name "lokid*" -exec cp '{}' ./bin \;
find ./downloads -type f -name "loki-wallet-rpc*" -exec cp '{}' ./bin \;
find ./downloads -type f -name "oxend*" -exec cp '{}' ./bin \;
find ./downloads -type f -name "oxen-wallet-rpc*" -exec cp '{}' ./bin \;
shell: bash
- name: Verify binaries

View File

@ -1,4 +1,4 @@
name: Loki Electron Wallet With Dev Binaries
name: Oxen Electron Wallet With Dev Binaries
on:
push:
@ -29,7 +29,7 @@ jobs:
- name: Install dependencies
run: npm install
- name: Download lokid binaries
- name: Download oxend binaries
run: ./download-dev-bins.sh
env:
OS: ${{ runner.os }}
@ -48,10 +48,10 @@ jobs:
shell: bash
working-directory: ./downloads
- name: Move lokid binaries
- name: Move oxend binaries
run: |
find ./downloads -type f -name "lokid*" -exec cp '{}' ./bin \;
find ./downloads -type f -name "loki-wallet-rpc*" -exec cp '{}' ./bin \;
find ./downloads -type f -name "oxend*" -exec cp '{}' ./bin \;
find ./downloads -type f -name "oxen-wallet-rpc*" -exec cp '{}' ./bin \;
shell: bash
- name: Verify binaries

View File

@ -1,4 +1,4 @@
name: Loki Electron Wallet Release
name: Oxen Electron Wallet Release
on:
push:
@ -29,7 +29,7 @@ jobs:
- name: Install dependencies
run: npm install
- name: Download lokid binaries
- name: Download oxend binaries
run: ./download-asset.sh
env:
OS: ${{ runner.os }}
@ -49,10 +49,10 @@ jobs:
shell: bash
working-directory: ./downloads
- name: Move lokid binaries
- name: Move oxend binaries
run: |
find ./downloads -type f -name "lokid*" -exec cp '{}' ./bin \;
find ./downloads -type f -name "loki-wallet-rpc*" -exec cp '{}' ./bin \;
find ./downloads -type f -name "oxend*" -exec cp '{}' ./bin \;
find ./downloads -type f -name "oxen-wallet-rpc*" -exec cp '{}' ./bin \;
shell: bash
- name: Verify binaries

View File

@ -1,6 +1,6 @@
# Building
Building loki electron wallet binaries is done using github actions. Windows and linux binaries will build right out of the box but there are some extra steps needed for Mac OS
Building oxen electron wallet binaries is done using github actions. Windows and linux binaries will build right out of the box but there are some extra steps needed for Mac OS
## Mac OS

View File

@ -1,34 +1,34 @@
# Loki Electron GUI Wallet
# Oxen Electron GUI Wallet
### Introduction
Loki is a private cryptocurrency based on Monero. Loki aims to provide a private data transmission layer using a second layer of Service Nodes.
More information on the project can be found on the [website](https://loki.network) and in the [whitepaper](https://loki.network/whitepaper). Loki is an open source project, and we encourage contributions from anyone with something to offer.
Oxen (formerly Loki) is a private cryptocurrency based on Monero. Oxen aims to provide a private data transmission layer using a second layer of Service Nodes.
More information on the project can be found on the [website](https://oxen.io) and in the [whitepaper](https://oxen.io/whitepaper). Oxen is an open source project, and we encourage contributions from anyone with something to offer.
<p align="center">
<img src="https://raw.githubusercontent.com/KeeJef/loki-electron-gui-wallet/master/src-electron/icons/mrcuug.PNG" width="600">
<img src="https://raw.githubusercontent.com/KeeJef/oxen-electron-gui-wallet/master/src-electron/icons/mrcuug.PNG" width="600">
</p>
### About this project
This is the new electron GUI for Loki. It is open source and completely free to use without restrictions, anyone may create an alternative implementation of the Loki Electron GUI that uses the protocol and network in a compatible manner.
This is the new electron GUI for Oxen. It is open source and completely free to use without restrictions, anyone may create an alternative implementation of the Oxen Electron GUI that uses the protocol and network in a compatible manner.
Please submit any changes as pull requests to the development branch, all changes are assessed in the development branch before being merged to master, release tags are considered stable builds for the GUI.
#### Pre-requisites
- Download latest [Lokid](https://github.com/loki-project/loki/releases/latest)
- Extract the lokid binaries to a folder
- Download latest [oxend](https://github.com/oxen-project/oxen/releases/latest)
- Extract the oxend binaries to a folder
#### Commands
```
nvm use 14.11.0
npm install -g @quasar/cli
git clone https://github.com/loki-project/loki-electron-gui-wallet
cd loki-electron-gui-wallet
cp path_to_lokid_binaries/lokid bin/
cp path_to_lokid_binaries/loki-wallet-rpc bin/
git clone https://github.com/oxen-project/oxen-electron-gui-wallet
cd oxen-electron-gui-wallet
cp path_to_oxend_binaries/oxend bin/
cp path_to_oxend_binaries/oxen-wallet-rpc bin/
npm install
```

View File

@ -22,15 +22,21 @@ exports.default = async function notarizing(context) {
log("Notarizing mac application");
const appName = context.packager.appInfo.productFilename;
const { SIGNING_APPLE_ID, SIGNING_APP_PASSWORD, SIGNING_TEAM_ID } = process.env;
const {
SIGNING_APPLE_ID,
SIGNING_APP_PASSWORD,
SIGNING_TEAM_ID
} = process.env;
if (isEmpty(SIGNING_APPLE_ID) || isEmpty(SIGNING_APP_PASSWORD)) {
log("SIGNING_APPLE_ID or SIGNING_APP_PASSWORD not set.\nTerminating noratization.");
log(
"SIGNING_APPLE_ID or SIGNING_APP_PASSWORD not set.\nTerminating noratization."
);
return;
}
const options = {
appBundleId: "com.loki-project.electron-wallet",
appBundleId: "com.oxen.electron-wallet",
appPath: `${appOutDir}/${appName}.app`,
appleId: SIGNING_APPLE_ID,
appleIdPassword: SIGNING_APP_PASSWORD

View File

@ -29,4 +29,4 @@ curl -sL --fail \
-o "${RENAME}" \
"$ASSET_URL"
echo "Loki binaries downloaded"
echo "Oxen binaries downloaded"

2
package-lock.json generated
View File

@ -1,6 +1,6 @@
{
"name": "loki-electron-wallet",
"version": "1.5.0",
"version": "1.5.4",
"lockfileVersion": 1,
"requires": true,
"dependencies": {

View File

@ -1,16 +1,16 @@
{
"name": "loki-electron-wallet",
"version": "1.5.4",
"description": "Modern GUI interface for Loki Currency",
"productName": "Loki Electron Wallet",
"name": "oxen-electron-wallet",
"version": "1.5.5",
"description": "Modern GUI interface for Oxen Currency",
"productName": "Oxen Electron Wallet",
"repository": {
"type": "git",
"url": "https://github.com/loki-project/loki-electron-gui-wallet.git"
},
"cordovaId": "com.lokinetwork.wallet",
"cordovaId": "com.oxen.wallet",
"author": {
"name": "Loki Project",
"email": "team@loki.network"
"name": "Oxen",
"email": "oxen@oxen.io"
},
"private": true,
"scripts": {

BIN
public/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

View File

@ -1,66 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 22.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 1000 368" style="enable-background:new 0 0 1000 368;" xml:space="preserve">
<style type="text/css">
.st0{fill:#FFFFFF;}
.st1{fill:url(#SVGID_1_);}
.st2{fill:#333333;}
.st3{fill:url(#SVGID_2_);}
.st4{fill:url(#SVGID_3_);}
.st5{fill:#00263A;}
.st6{fill:url(#SVGID_4_);}
.st7{fill:url(#SVGID_5_);}
.st8{fill:url(#SVGID_6_);}
.st9{fill:url(#SVGID_7_);}
.st10{fill:url(#SVGID_8_);}
.st11{fill:url(#SVGID_9_);}
.st12{fill:url(#SVGID_10_);}
.st13{fill:url(#SVGID_11_);}
.st14{fill:url(#SVGID_12_);}
.st15{fill:url(#SVGID_13_);}
.st16{fill:url(#SVGID_14_);}
.st17{fill:url(#SVGID_15_);}
.st18{fill:url(#SVGID_16_);}
.st19{fill:url(#SVGID_17_);}
.st20{opacity:6.000000e-02;}
.st21{opacity:4.000000e-02;fill:#FFFFFF;}
.st22{opacity:7.000000e-02;fill:#FFFFFF;}
.st23{fill:#008522;}
.st24{fill:#78BE20;}
.st25{fill:#005F61;}
.st26{fill:url(#SVGID_18_);}
</style>
<g>
<path class="st0" d="M366.6,78h37.1v178.9H497v32.7H366.6V78z"/>
<path class="st0" d="M619.8,74.5C683.3,74.5,728,120.8,728,184c0,63.1-44.7,109.5-108.2,109.5c-63.5,0-108.2-46.3-108.2-109.5
C511.6,120.8,556.3,74.5,619.8,74.5z M619.8,107.5c-42.8,0-70.1,32.7-70.1,76.5c0,43.5,27.3,76.5,70.1,76.5
c42.5,0,70.1-33,70.1-76.5C689.9,140.2,662.3,107.5,619.8,107.5z"/>
<path class="st0" d="M819.4,200.5L801,222v67.6h-37.1V78H801v100.9L883.8,78h46l-86,99.9l92.3,111.7h-45.7L819.4,200.5z"/>
<path class="st0" d="M960.9,78H998v211.6h-37.1V78z"/>
</g>
<g>
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="86.8402" y1="268.7968" x2="86.8402" y2="0.426">
<stop offset="0" style="stop-color:#78BE20"/>
<stop offset="0.1197" style="stop-color:#58AF21"/>
<stop offset="0.3682" style="stop-color:#199122"/>
<stop offset="0.486" style="stop-color:#008522"/>
<stop offset="0.6925" style="stop-color:#007242"/>
<stop offset="0.8806" style="stop-color:#006459"/>
<stop offset="1" style="stop-color:#005F61"/>
</linearGradient>
<polygon class="st1" points="132.1,268.8 0.3,137 136.9,0.4 173.3,36.8 73.1,137 168.5,232.4 "/>
</g>
<g>
<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="212.9564" y1="367.5197" x2="212.9564" y2="99.1484">
<stop offset="0" style="stop-color:#78BE20"/>
<stop offset="0.1197" style="stop-color:#58AF21"/>
<stop offset="0.3682" style="stop-color:#199122"/>
<stop offset="0.486" style="stop-color:#008522"/>
<stop offset="0.6925" style="stop-color:#007242"/>
<stop offset="0.8806" style="stop-color:#006459"/>
<stop offset="1" style="stop-color:#005F61"/>
</linearGradient>
<polygon class="st3" points="162.9,367.5 126.5,331.1 226.7,230.9 131.3,135.6 167.7,99.1 299.5,230.9 "/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.9 KiB

2885
public/oxen-logo.svg Normal file

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 210 KiB

30
public/oxen-white.svg Normal file
View File

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 25.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 1501.3 321.3" style="enable-background:new 0 0 1501.3 321.3;" xml:space="preserve">
<style type="text/css">
.st0{fill:#FFFFFF;}
.st1{fill:#12C7BA;}
</style>
<g>
<g>
<path class="st0" d="M886.1,75.7l-65,56l-65-56c-5.2-4.5-11.9-7-18.8-7l-56.5,0l106.7,91.9l-106.7,91.9l56.5,0
c6.9,0,13.6-2.5,18.8-7l65-56l65,56c5.2,4.5,11.9,7,18.8,7l56.5,0l-106.7-91.9l106.7-91.9h-56.5C898,68.7,891.3,71.2,886.1,75.7z"
/>
<path class="st0" d="M1501.3,68.7h-43v128.4L1299.2,74.7c-5-3.9-11.2-6-17.6-6h-30.9v183.9h43V124.2l159.1,122.4
c5,3.9,11.2,6,17.6,6h30.9V68.7z"/>
<path class="st0" d="M1212,107.9V68.7l-205.7,0c-22.5,25.9-34.5,58-34.5,91.9c0,33.9,12,66.1,34.5,91.9H1212v-39.1h-184.4
c-5.1-9.6-8.8-20.3-10.7-33.2h180.3v-41.1h-180c2-12,5.6-22.2,10.4-31.3H1212z"/>
<path class="st0" d="M674.4,160.7c0-55.4-34-91.9-34-91.9l-193.1,0c0,0-34,36.6-34,91.9s34,91.9,34,91.9h193.1
C640.4,252.6,674.4,216,674.4,160.7z M469.6,213.2c-8.7-15.8-13.3-33.9-13.3-52.5c0-18.6,4.6-36.7,13.3-52.5h148.6
c8.7,15.8,13.3,33.9,13.3,52.5c0,18.6-4.6,36.7-13.3,52.5H469.6z"/>
</g>
<g>
<circle class="st0" cx="160.6" cy="160.6" r="160.6"/>
<g>
<polygon class="st1" points="67.6,80.5 160.6,160.6 253.7,80.5 "/>
<polygon class="st1" points="253.7,240.8 160.6,160.6 67.6,240.8 "/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

2928
public/oxen.svg Normal file

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 214 KiB

View File

@ -156,17 +156,16 @@ module.exports = function() {
builder: {
// https://www.electron.build/configuration/configuration
appId: "com.loki-project.electron-wallet",
productName: "Loki Electron Wallet",
copyright:
"Copyright © 2018-2020 Loki Project, 2018 Ryo Currency Project",
appId: "com.oxen.electron-wallet",
productName: "Oxen Electron Wallet",
copyright: "Copyright © 2018-2021 Oxen, 2018 Ryo Currency Project",
afterSign: "build/notarize.js",
artifactName: "loki-electron-wallet-${version}-${os}.${ext}",
artifactName: "oxen-electron-wallet-${version}-${os}.${ext}",
publish: "github",
linux: {
target: ["AppImage", "deb"],
icon: "src-electron/icons/icon_512x512.png",
icon: "src-electron/icon.png",
category: "Finance"
},
@ -184,7 +183,7 @@ module.exports = function() {
},
dmg: {
background: "src-electron/build/loki-dmg.tiff",
background: "src-electron/build/oxen-dmg.tiff",
sign: false
},

View File

@ -21,7 +21,10 @@ async function canAutoUpdate() {
// Taken from: https://github.com/electron-userland/electron-builder/blob/d4feb6d3c8b008f8b455c761d654c8088f90d8fa/packages/electron-updater/src/ElectronAppAdapter.ts#L25
const updateFile = isPackaged ? "app-update.yml" : "dev-app-update.yml";
const basePath = isPackaged && process.resourcesPath ? process.resourcesPath : app.getAppPath();
const basePath =
isPackaged && process.resourcesPath
? process.resourcesPath
: app.getAppPath();
const appUpdateConfigPath = path.join(basePath, updateFile);
return new Promise(resolve => {
@ -96,8 +99,8 @@ async function showUpdateDialog(mainWindow) {
const options = {
type: "info",
buttons: ["Restart Wallet", "Later"],
title: "Loki Electron Wallet update available",
message: "There is a new version of Loki Electron Wallet available.",
title: "Oxen Electron Wallet update available",
message: "There is a new version of Oxen Electron Wallet available.",
detail: "Press Restart Wallet to apply the update",
defaultId: LATER_BUTTON,
cancelId: RESTART_BUTTON
@ -115,7 +118,7 @@ async function showCannotUpdateDialog(mainWindow) {
buttons: ["Ok"],
title: "Cannot update",
message:
"Loki Electron Wallet failed to update but there is a new version available. Please go to https://loki.network/ and install the new version manually."
"Oxen Electron Wallet failed to update but there is a new version available. Please go to https://oxen.io/ and install the new version manually."
};
return new Promise(resolve => {

View File

@ -57,7 +57,7 @@ function createWindow() {
height: mainWindowState.height,
minWidth: 640,
minHeight: 480,
icon: require("path").join(__statics, "icon_512x512.png"),
icon: require("path").join(__statics, "icon.png"),
title,
webPreferences: {
nodeIntegration: true,
@ -137,7 +137,7 @@ function createWindow() {
mainWindow,
{
title: "Startup error",
message: `Loki Wallet is already open, or port ${config.port} is in use`,
message: `Oxen Wallet is already open, or port ${config.port} is in use`,
type: "error",
buttons: ["ok"]
},

View File

@ -33,7 +33,7 @@ let template = [
{
label: "Learn More",
click() {
require("electron").shell.openExternal("https://loki.network/");
require("electron").shell.openExternal("https://oxen.io/");
}
}
]
@ -42,7 +42,7 @@ let template = [
if (process.platform === "darwin") {
template.unshift({
label: "Loki Electron Wallet",
label: "Oxen Electron Wallet",
submenu: [
{ role: "about" },
{ type: "separator" },

View File

@ -34,16 +34,27 @@ export class Backend {
}
init(config) {
let configDir;
let legacyLokiConfigDir;
if (os.platform() === "win32") {
this.config_dir = "C:\\ProgramData\\loki";
this.wallet_dir = `${os.homedir()}\\Documents\\Loki`;
configDir = "C:\\ProgramData\\oxen";
legacyLokiConfigDir = "C:\\ProgramData\\loki\\";
this.wallet_dir = `${os.homedir()}\\Documents\\Oxen`;
} else {
this.config_dir = path.join(os.homedir(), ".loki");
this.wallet_dir = path.join(os.homedir(), "Loki");
configDir = path.join(os.homedir(), ".oxen");
legacyLokiConfigDir = path.join(os.homedir(), ".loki/");
this.wallet_dir = path.join(os.homedir(), "Oxen");
}
if (!fs.existsSync(this.config_dir)) {
fs.mkdirpSync(this.config_dir);
// if the user has used loki before, just keep the same stuff
if (fs.existsSync(legacyLokiConfigDir)) {
this.config_dir = legacyLokiConfigDir;
} else {
// create the new, Oxen location
this.config_dir = configDir;
if (!fs.existsSync(configDir)) {
fs.mkdirpSync(configDir);
}
}
if (!fs.existsSync(path.join(this.config_dir, "gui"))) {

View File

@ -29,25 +29,25 @@ export class Daemon {
checkVersion() {
return new Promise(resolve => {
if (process.platform === "win32") {
let lokid_path = path.join(__ryo_bin, "lokid.exe");
let lokid_version_cmd = `"${lokid_path}" --version`;
if (!fs.existsSync(lokid_path)) {
let oxend_path = path.join(__ryo_bin, "oxend.exe");
let oxend_version_cmd = `"${oxend_path}" --version`;
if (!fs.existsSync(oxend_path)) {
resolve(false);
}
child_process.exec(lokid_version_cmd, (error, stdout) => {
child_process.exec(oxend_version_cmd, (error, stdout) => {
if (error) {
resolve(false);
}
resolve(stdout);
});
} else {
let lokid_path = path.join(__ryo_bin, "lokid");
let lokid_version_cmd = `"${lokid_path}" --version`;
if (!fs.existsSync(lokid_path)) {
let oxend_path = path.join(__ryo_bin, "oxend");
let oxend_version_cmd = `"${oxend_path}" --version`;
if (!fs.existsSync(oxend_path)) {
resolve(false);
}
child_process.exec(
lokid_version_cmd,
oxend_version_cmd,
{ detached: true },
(error, stdout) => {
if (error) {
@ -148,7 +148,7 @@ export class Daemon {
args.push("--stagenet");
}
args.push("--log-file", path.join(dirs[net_type], "logs", "lokid.log"));
args.push("--log-file", path.join(dirs[net_type], "logs", "oxend.log"));
if (daemon.rpc_bind_ip !== "127.0.0.1") {
args.push("--confirm-external-bind");
}
@ -173,12 +173,12 @@ export class Daemon {
if (status === "closed") {
if (process.platform === "win32") {
this.daemonProcess = child_process.spawn(
path.join(__ryo_bin, "lokid.exe"),
path.join(__ryo_bin, "oxend.exe"),
args
);
} else {
this.daemonProcess = child_process.spawn(
path.join(__ryo_bin, "lokid"),
path.join(__ryo_bin, "oxend"),
args,
{
detached: true

View File

@ -137,8 +137,8 @@ export class WalletRPC {
const rpcExecutable =
process.platform === "win32"
? "loki-wallet-rpc.exe"
: "loki-wallet-rpc";
? "oxen-wallet-rpc.exe"
: "oxen-wallet-rpc";
// eslint-disable-next-line no-undef
const rpcPath = path.join(__ryo_bin, rpcExecutable);
@ -146,7 +146,7 @@ export class WalletRPC {
if (!fs.existsSync(rpcPath)) {
reject(
new Error(
"Failed to find Loki Wallet RPC. Please make sure you anti-virus has not removed it."
"Failed to find Oxen Wallet RPC. Please make sure you anti-virus has not removed it."
)
);
return;
@ -286,7 +286,7 @@ export class WalletRPC {
break;
case "restore_view_wallet":
// TODO: Decide if we want this for loki
// TODO: Decide if we want this for Oxen
this.restoreViewWallet(
params.name,
params.password,

View File

@ -2,7 +2,7 @@
<q-dialog v-model="isVisible" maximized class="address-book-details">
<q-layout v-if="mode == 'edit' || mode == 'new'">
<q-header>
<q-toolbar color="dark" inverted>
<q-toolbar inverted>
<q-btn flat round dense icon="reply" @click="close()" />
<q-toolbar-title v-if="mode == 'new'">
{{ $t("strings.addAddressBookEntry") }}
@ -26,16 +26,15 @@
/>
</q-toolbar>
</q-header>
<q-page-container>
<q-page-container class="detail-page">
<div class="address-book-modal q-mx-md">
<LokiField
<OxenField
:label="$t('fieldLabels.address')"
:error="$v.newEntry.address.$error"
>
<q-input
v-model.trim="newEntry.address"
:placeholder="address_placeholder"
:dark="theme == 'dark'"
borderless
dense
@blur="$v.newEntry.address.$touch"
@ -47,26 +46,20 @@
:icon="newEntry.starred ? 'star' : 'star_border'"
@click="updateStarred"
/>
</LokiField>
<LokiField :label="$t('fieldLabels.name')">
<q-input
v-model.trim="newEntry.name"
:dark="theme == 'dark'"
borderless
dense
/>
</LokiField>
<LokiField :label="$t('fieldLabels.notes')" optional>
</OxenField>
<OxenField :label="$t('fieldLabels.name')">
<q-input v-model.trim="newEntry.name" borderless dense />
</OxenField>
<OxenField :label="$t('fieldLabels.notes')" optional>
<q-input
v-model="newEntry.description"
:placeholder="$t('placeholders.additionalNotes')"
type="textarea"
class="full-width text-area-loki"
:dark="theme == 'dark'"
class="full-width text-area-oxen"
borderless
dense
/>
</LokiField>
</OxenField>
<q-btn
v-if="mode == 'edit'"
@ -81,7 +74,7 @@
<q-layout v-else>
<q-header>
<q-toolbar color="dark" inverted>
<q-toolbar inverted>
<q-btn flat round dense icon="reply" @click="close()" />
<q-toolbar-title>
{{ $t("strings.addressBookDetails") }}
@ -106,6 +99,7 @@
<div class="layout-padding">
<template v-if="entry != null">
<AddressHeader
class="address-details"
:address="entry.address"
:title="entry.name"
:extra="
@ -140,7 +134,7 @@
import { mapState } from "vuex";
import AddressHeader from "components/address_header";
import TxList from "components/tx_list";
import LokiField from "components/loki_field";
import OxenField from "components/oxen_field";
import { address } from "src/validators/common";
import { required } from "vuelidate/lib/validators";
export default {
@ -148,7 +142,7 @@ export default {
components: {
AddressHeader,
TxList,
LokiField
OxenField
},
data() {
return {
@ -256,9 +250,12 @@ export default {
</script>
<style lang="scss">
.address-details {
color: #1f1c47;
}
.address-book-details {
.address-book-modal {
> .loki-field {
> .oxen-field {
margin-top: 16px;
}

View File

@ -7,11 +7,20 @@
<q-toolbar-title>
{{ $t("titles.addressDetails") }}
</q-toolbar-title>
<q-btn flat :label="$t('buttons.showQRCode')" @click="isQRCodeVisible = true" />
<q-btn class="q-ml-sm" color="primary" :label="$t('buttons.copyAddress')" @click="copyAddress()" />
<q-btn
flat
:label="$t('buttons.showQRCode')"
@click="isQRCodeVisible = true"
/>
<q-btn
class="q-ml-sm"
color="primary"
:label="$t('buttons.copyAddress')"
@click="copyAddress()"
/>
</q-toolbar>
</q-header>
<q-page-container>
<q-page-container class="detail-page">
<div class="layout-padding">
<template v-if="address != null">
<AddressHeader
@ -26,10 +35,10 @@
<div class="infoBox">
<div class="infoBoxContent">
<div class="text">
<span>{{ $t("strings.lokiBalance") }}</span>
<span>{{ $t("strings.oxenBalance") }}</span>
</div>
<div class="value">
<span><FormatLoki :amount="address.balance"/></span>
<span><FormatOxen :amount="address.balance"/></span>
</div>
</div>
</div>
@ -37,10 +46,12 @@
<div class="infoBox">
<div class="infoBoxContent">
<div class="text">
<span>{{ $t("strings.lokiUnlockedBalance") }}</span>
<span>{{ $t("strings.oxenUnlockedBalance") }}</span>
</div>
<div class="value">
<span><FormatLoki :amount="address.unlocked_balance"/></span>
<span
><FormatOxen :amount="address.unlocked_balance"
/></span>
</div>
</div>
</div>
@ -62,7 +73,7 @@
<div class="infoBox">
<div class="infoBoxContent">
<div class="text">
<span>{{ $t("strings.lokiBalance") }}</span>
<span>{{ $t("strings.oxenBalance") }}</span>
</div>
<div class="value"><span>N/A</span></div>
</div>
@ -71,7 +82,7 @@
<div class="infoBox">
<div class="infoBoxContent">
<div class="text">
<span>{{ $t("strings.lokiUnlockedBalance") }}</span>
<span>{{ $t("strings.oxenUnlockedBalance") }}</span>
</div>
<div class="value"><span>N/A</span></div>
</div>
@ -91,7 +102,9 @@
<div class="q-mt-sm">
<div class="non-selectable recent-transactions-wrapper">
<q-icon name="history" size="24px" />
<span class="vertical-middle q-ml-xs">{{ $t("strings.recentIncomingTransactionsToAddress") }}</span>
<span class="vertical-middle q-ml-xs">{{
$t("strings.recentIncomingTransactionsToAddress")
}}</span>
</div>
<div style="margin: 12px -16px;">
@ -108,12 +121,21 @@
</q-page-container>
</q-layout>
<template v-if="address != null">
<q-dialog v-model="isQRCodeVisible" minimized :content-class="'qr-code-modal'">
<q-dialog
v-model="isQRCodeVisible"
minimized
:content-class="'qr-code-modal'"
>
<q-card class="qr-code-card">
<div class="text-center q-mb-sm q-pa-md" style="background: white;">
<QrcodeVue ref="qr" :value="address.address" size="240"> </QrcodeVue>
<QrcodeVue ref="qr" :value="address.address" size="240">
</QrcodeVue>
<q-menu content-menu>
<q-list link separator style="min-width: 150px; max-height: 300px;">
<q-list
link
separator
style="min-width: 150px; max-height: 300px;"
>
<q-item v-close-popup @click.native="copyQR()">
<q-item-label :label="$t('menuItems.copyQR')" />
</q-item>
@ -124,7 +146,11 @@
</q-menu>
</div>
<q-card-actions>
<q-btn color="primary" :label="$t('buttons.close')" @click="isQRCodeVisible = false" />
<q-btn
color="primary"
:label="$t('buttons.close')"
@click="isQRCodeVisible = false"
/>
</q-card-actions>
</q-card>
</q-dialog>
@ -136,7 +162,7 @@
import { mapState } from "vuex";
const { clipboard, nativeImage } = require("electron");
import AddressHeader from "components/address_header";
import FormatLoki from "components/format_loki";
import FormatOxen from "components/format_oxen";
import QrcodeVue from "qrcode.vue";
import TxList from "components/tx_list";
export default {
@ -144,7 +170,7 @@ export default {
components: {
AddressHeader,
TxList,
FormatLoki,
FormatOxen,
QrcodeVue
},
data() {
@ -169,7 +195,9 @@ export default {
")";
}
const extra = this.address.used ? this.$t("strings.userUsedAddress") : this.$t("strings.userNotUsedAddress");
const extra = this.address.used
? this.$t("strings.userUsedAddress")
: this.$t("strings.userNotUsedAddress");
return {
title,

View File

@ -1,5 +1,5 @@
<template>
<div>
<div class="address-header-div">
<q-item-section class="self-start">
<q-item-label class="title non-selectable">{{ title }}</q-item-label>
<q-item-label class="row">
@ -87,17 +87,18 @@ export default {
</script>
<style lang="scss">
.title {
font-size: 18px;
margin-bottom: 4px;
color: white;
}
.extra {
margin-top: 8px;
color: white;
.address-header-div {
.title {
font-size: 20px;
color: #1f1c47;
}
.extra {
color: #1f1c47;
}
}
// is this even used?
.address-header {
padding: 0;
img {

View File

@ -1,11 +1,11 @@
<template>
<div class="check-transaction">
<div class="q-pa-md">
<div class="q-mb-lg description">
<div class="q-mb-lg tab-desc">
{{ $t("strings.checkTransaction.description") }}
</div>
<div>
<LokiField
<OxenField
:label="$t('fieldLabels.transactionId')"
:error="$v.txid.$error"
>
@ -17,8 +17,8 @@
dense
@blur="$v.txid.$touch"
/>
</LokiField>
<LokiField
</OxenField>
<OxenField
class="q-mt-md"
:label="$t('fieldLabels.address')"
:error="$v.address.$error"
@ -32,8 +32,8 @@
dense
@blur="$v.address.$touch"
/>
</LokiField>
<LokiField class="q-mt-md" :label="$t('fieldLabels.message')" optional>
</OxenField>
<OxenField class="q-mt-md" :label="$t('fieldLabels.message')" optional>
<q-input
v-model.trim="message"
:dark="theme == 'dark'"
@ -41,8 +41,8 @@
borderless
dense
/>
</LokiField>
<LokiField
</OxenField>
<OxenField
class="q-mt-md"
:label="$t('fieldLabels.signature')"
:error="$v.signature.$error"
@ -54,12 +54,12 @@
borderless
dense
/>
</LokiField>
</OxenField>
<div class="submit-button">
<q-btn color="primary" :label="$t('buttons.check')" @click="check" />
<q-btn
v-if="canClear"
color="secondary"
color="secondsary="
:label="$t('buttons.clear')"
@click="clear"
/>
@ -83,7 +83,7 @@
{{ $t("strings.checkTransaction.infoTitles.received") }}
</div>
<div>
<FormatLoki :amount="status.state.received" raw-value />
<FormatOxen :amount="status.state.received" raw-value />
</div>
</div>
<div v-if="status.state.in_pool != null" class="q-mb-sm">
@ -108,14 +108,14 @@ import { mapState } from "vuex";
import { required } from "vuelidate/lib/validators";
import { address } from "src/validators/common";
import { i18n } from "boot/i18n";
import LokiField from "components/loki_field";
import FormatLoki from "components/format_loki";
import OxenField from "components/oxen_field";
import FormatOxen from "components/format_oxen";
export default {
name: "CheckTransaction",
components: {
LokiField,
FormatLoki
OxenField,
FormatOxen
},
data() {
return {

View File

@ -1,11 +1,11 @@
<template>
<div class="prove-transaction">
<div class="q-pa-md">
<div class="q-mb-lg description">
<div class="q-mb-lg tab-desc">
{{ $t("strings.proveTransactionDescription") }}
</div>
<div>
<LokiField
<OxenField
:label="$t('fieldLabels.transactionId')"
:error="$v.txid.$error"
>
@ -17,8 +17,8 @@
dense
@blur="$v.txid.$touch"
/>
</LokiField>
<LokiField
</OxenField>
<OxenField
class="q-mt-md"
:label="$t('fieldLabels.address')"
:error="$v.address.$error"
@ -32,8 +32,8 @@
dense
@blur="$v.address.$touch"
/>
</LokiField>
<LokiField class="q-mt-md" :label="$t('fieldLabels.message')" optional>
</OxenField>
<OxenField class="q-mt-md" :label="$t('fieldLabels.message')" optional>
<q-input
v-model.trim="message"
:dark="theme == 'dark'"
@ -41,7 +41,7 @@
borderless
dense
/>
</LokiField>
</OxenField>
<div class="buttons submit-button">
<q-btn
color="primary"
@ -50,7 +50,7 @@
/>
<q-btn
v-if="canClear"
color="secondary"
color="accent"
:label="$t('buttons.clear')"
@click="clear"
/>
@ -79,13 +79,13 @@
import { mapState } from "vuex";
import { required } from "vuelidate/lib/validators";
import { address } from "src/validators/common";
import LokiField from "components/loki_field";
import OxenField from "components/oxen_field";
import { clipboard } from "electron";
export default {
name: "ProveTransaction",
components: {
LokiField
OxenField
},
data() {
return {

View File

@ -1,16 +1,16 @@
<template>
<div class="sign-and-verify">
<div class="q-pa-md">
<div class="q-mb-lg description">
<div class="q-mb-lg tab-desc">
{{ $t("strings.signAndVerifyDescription") }}
</div>
<div v-if="is_view_only">
{{ $t("strings.cannotSign") }}
</div>
<div v-else>
<div class="text-h6">{{ $t("titles.advanced.sign") }}</div>
<div class="text-h6 header">{{ $t("titles.advanced.sign") }}</div>
<div class="row justify-between items-end">
<LokiField :label="$t('fieldLabels.data')">
<OxenField :label="$t('fieldLabels.data')">
<q-input
v-model.trim="toSign"
:dark="theme == 'dark'"
@ -18,7 +18,7 @@
dense
:placeholder="$t('placeholders.dataToSign')"
/>
</LokiField>
</OxenField>
<div class="btn-wrapper q-ml-md q-py-sm">
<q-btn
color="primary"
@ -30,11 +30,11 @@
</div>
</div>
</div>
<div class="verify-heading text-h6">
<div class="verify-heading text-h6 header">
{{ $t("titles.advanced.verify") }}
</div>
<div class="justify-between items-end">
<LokiField class="q-mt-md" :label="$t('fieldLabels.signature')">
<OxenField class="q-mt-md" :label="$t('fieldLabels.signature')">
<q-input
v-model.trim="signatureToVerify"
:dark="theme == 'dark'"
@ -42,8 +42,8 @@
dense
:placeholder="$t('placeholders.signature')"
/>
</LokiField>
<LokiField class="q-mt-md" :label="$t('fieldLabels.data')">
</OxenField>
<OxenField class="q-mt-md" :label="$t('fieldLabels.data')">
<q-input
v-model.trim="unsignedData"
:dark="theme == 'dark'"
@ -51,8 +51,8 @@
dense
:placeholder="$t('placeholders.unsignedData')"
/>
</LokiField>
<LokiField class="q-mt-md" :label="$t('fieldLabels.address')">
</OxenField>
<OxenField class="q-mt-md" :label="$t('fieldLabels.address')">
<q-input
v-model.trim="address"
:dark="theme == 'dark'"
@ -60,7 +60,7 @@
dense
:placeholder="$t('placeholders.addressOfSigner')"
/>
</LokiField>
</OxenField>
<div class="submit-button">
<q-btn
color="primary"
@ -71,7 +71,7 @@
<q-btn
v-if="canClear"
:label="$t('buttons.clear')"
color="secondary"
color="accent"
@click="clear"
/>
</div>
@ -92,13 +92,13 @@
<script>
const { clipboard } = require("electron");
import LokiField from "components/loki_field";
import OxenField from "components/oxen_field";
import SignatureDialog from "./signature_dialog";
import { mapState } from "vuex";
export default {
name: "SignAndVerify",
components: {
LokiField,
OxenField,
SignatureDialog
},
data() {
@ -228,7 +228,7 @@ export default {
cursor: default;
}
.loki-field {
.oxen-field {
flex: 1;
}
}

View File

@ -1,6 +1,6 @@
<template>
<q-dialog v-model="show" persistent>
<q-card dark>
<q-card class="signature-dialog">
<q-card-section>
<div class="text-h6">{{ $t("dialog.signature.title") }}</div>
<div>

View File

@ -1,6 +1,6 @@
<template>
<q-dialog v-model="show" persistent>
<q-card class="confirm-tx-card" dark>
<q-card class="confirm-tx-card">
<q-card-section>
<div class="text-h6">{{ $t("dialog.confirmTransaction.title") }}</div>
</q-card-section>
@ -15,10 +15,10 @@
</div>
<br />
<span class="label">{{ $t("strings.transactions.amount") }}: </span>
{{ amount }} Loki
{{ amount }} OXEN
<br />
<span class="label">{{ $t("strings.transactions.fee") }}: </span>
{{ fee }} Loki
{{ fee }} OXEN
<br />
<span class="label"
>{{ $t("dialog.confirmTransaction.priority") }}:

View File

@ -1,10 +1,10 @@
<template>
<span> {{ value }} LOKI </span>
<span> {{ value }} OXEN </span>
</template>
<script>
export default {
name: "FormatLoki",
name: "FormatOxen",
props: {
amount: {
type: Number,

View File

@ -8,7 +8,7 @@
v-for="option in options"
:key="option.value"
class="row justify-center items-center"
:color="lang === option.value ? 'primary' : 'secondary'"
:color="lang === option.value ? 'primary' : 'accent'"
size="md"
@click="setLanguage(option.value)"
>

View File

@ -125,8 +125,7 @@ export default {
label: this.$t("dialog.lnsUpdate.ok"),
color: "primary"
},
dark: this.theme == "dark",
color: this.theme == "dark" ? "white" : "dark"
color: "#1F1C47"
});
passwordDialog
.onOk(password => {
@ -152,9 +151,7 @@ export default {
ok: {
label: this.$t("dialog.purchase.ok"),
color: "primary"
},
dark: this.theme == "dark",
color: this.theme == "dark" ? "white" : "dark"
}
});
passwordDialog
.onOk(password => {

View File

@ -2,22 +2,21 @@
<div class="lns-input-form">
<!-- Type -->
<div class="col q-mt-sm">
<LokiField :label="$t('fieldLabels.lnsType')" :disable="updating">
<OxenField :label="$t('fieldLabels.lnsType')" :disable="updating">
<q-select
v-model.trim="record.type"
emit-value
map-options
:options="renewing ? lokinetOptions : typeOptions"
:dark="theme == 'dark'"
:disable="updating"
borderless
dense
/>
</LokiField>
</OxenField>
</div>
<!-- Name -->
<div class="col q-mt-sm">
<LokiField
<OxenField
:label="$t('fieldLabels.name')"
:disable="disableName"
:error="$v.record.name.$error"
@ -32,12 +31,12 @@
:suffix="record.type === 'session' ? '' : '.loki'"
@blur="$v.record.name.$touch"
/>
</LokiField>
</OxenField>
</div>
<!-- Value (Session ID, Wallet Address or .loki address) -->
<div class="col q-mt-sm">
<LokiField
<OxenField
class="q-mt-md"
:label="value_field_label"
:error="$v.record.value.$error"
@ -52,12 +51,12 @@
:suffix="record.type === 'session' ? '' : '.loki'"
@blur="$v.record.value.$touch"
/>
</LokiField>
</OxenField>
</div>
<!-- Owner -->
<div class="col q-mt-sm">
<LokiField
<OxenField
class="q-mt-md"
:label="$t('fieldLabels.owner')"
:error="$v.record.owner.$error"
@ -72,12 +71,12 @@
:disable="renewing"
@blur="$v.record.owner.$touch"
/>
</LokiField>
</OxenField>
</div>
<!-- Backup owner -->
<div class="col q-mt-sm">
<LokiField
<OxenField
class="q-mt-md"
:label="$t('fieldLabels.backupOwner')"
:error="$v.record.backup_owner.$error"
@ -92,7 +91,7 @@
dense
@blur="$v.record.backup_owner.$touch"
/>
</LokiField>
</OxenField>
</div>
<div class="buttons">
<q-btn
@ -103,7 +102,7 @@
/>
<q-btn
v-if="showClearButton"
color="secondary"
color="accent"
:label="$t('buttons.clear')"
@click="clear()"
/>
@ -120,13 +119,13 @@ import {
lokinet_name,
session_name
} from "src/validators/common";
import LokiField from "components/loki_field";
import OxenField from "components/oxen_field";
import WalletPassword from "src/mixins/wallet_password";
export default {
name: "LNSInputForm",
components: {
LokiField
OxenField
},
mixins: [WalletPassword],
props: {

View File

@ -1,7 +1,7 @@
<template>
<div class="my-lns">
<div class="q-px-md q-pt-md">
<div class="description">
<div class="tab-desc">
{{ $t("strings.lnsDescription") }}
</div>
<LNSRecords @onUpdate="onUpdate" @onRenew="onRenew" />

View File

@ -1,7 +1,7 @@
<template>
<div class="lns-purchase">
<div class="q-mb-lg q-px-md q-pt-md">
<div class="description">
<div class="tab-desc">
{{ $t("strings.lnsPurchaseDescription") }}
</div>
<div class="prices">
@ -9,23 +9,23 @@
<table>
<tr>
<td>{{ $t("strings.lns.sessionID") }}:</td>
<td>15 LOKI</td>
<td>15 OXEN</td>
</tr>
<tr>
<td>{{ $t("strings.lns.lokinetName1Year") }}:</td>
<td>15 LOKI</td>
<td>15 OXEN</td>
</tr>
<tr>
<td>{{ $t("strings.lns.lokinetNameXYears", { years: 2 }) }}:</td>
<td>30 LOKI</td>
<td>30 OXEN</td>
</tr>
<tr>
<td>{{ $t("strings.lns.lokinetNameXYears", { years: 5 }) }}:</td>
<td>60 LOKI</td>
<td>60 OXEN</td>
</tr>
<tr>
<td>{{ $t("strings.lns.lokinetNameXYears", { years: 10 }) }}:</td>
<td>90 LOKI</td>
<td>90 OXEN</td>
</tr>
</table>
</div>
@ -55,12 +55,14 @@ export default {
.lns-purchase {
.description {
white-space: pre-line;
color: #cecece;
margin-bottom: 20px;
// oxen-navy
color: #1f1c47;
}
.prices {
color: #cecece;
// oxen-navy
margin-top: 20px;
color: #1f1c47;
}
}
</style>

View File

@ -1,9 +1,9 @@
<template>
<q-list link no-border :dark="theme == 'dark'" class="lns-record-list">
<q-list link no-border class="lns-record-list">
<q-item
v-for="record in recordList"
:key="record.name_hash"
class="loki-list-item"
class="oxen-list-item"
>
<q-item-section class="type" avatar>
<q-icon :name="isLocked(record) ? 'lock' : 'lock_open'" size="24px" />
@ -22,13 +22,13 @@
<q-item-section>
<div class="row update-renew-buttons">
<q-btn
color="secondary"
color="primary"
:label="$t('buttons.update')"
@click="onUpdate(record)"
/>
<q-btn
v-if="isLokinet"
color="secondary"
color="primary"
:label="$t('buttons.renew')"
@click="onRenew(record)"
/>
@ -169,26 +169,36 @@ export default {
.lns-record-list {
.q-item {
cursor: pointer;
background: #313131;
color: #1f1c47;
background: white;
-webkit-transition: background-color 0.2s ease-in;
transition: background-color 0.2s ease-in;
border-radius: 3px;
.height {
color: #1f1c47;
}
// we don't want to select button text (also a span) as well
// this is the height text
div > span {
color: #1f1c47;
}
+ .q-item {
margin-top: 10px;
}
}
.q-item-sublabel {
color: #313131;
}
.q-item:hover {
background: rgba(117, 117, 117, 0.3);
background: #12c7ba;
}
}
.update-renew-buttons {
.q-btn {
color: red;
}
.q-btn:not(:first-child) {
margin-left: 8px;
}

View File

@ -1,7 +1,7 @@
<template>
<div class="lns-record-list">
<div v-if="needsDecryption" class="decrypt row justify-between items-end">
<LokiField
<OxenField
:label="$t('fieldLabels.decryptRecord')"
:disable="decrypting"
:error="$v.name.$error"
@ -15,7 +15,7 @@
:disable="decrypting"
@blur="$v.name.$touch"
/>
</LokiField>
</OxenField>
<div class="btn-wrapper q-ml-md row items-center">
<q-btn
color="primary"
@ -51,14 +51,14 @@
<script>
import { mapState } from "vuex";
import LokiField from "components/loki_field";
import OxenField from "components/oxen_field";
import { session_name_or_lokinet_name } from "src/validators/common";
import LNSRecordList from "./lns_record_list";
export default {
name: "LNSRecords",
components: {
LokiField,
OxenField,
LNSRecordList
},
data() {
@ -197,7 +197,7 @@ export default {
cursor: default;
}
.loki-field {
.oxen-field {
flex: 1;
}
@ -209,14 +209,4 @@ export default {
}
}
}
.record-type-title {
font-weight: bold;
margin-bottom: 40px;
padding-bottom: 40px;
}
.records-group {
padding-bottom: 40px;
}
</style>

View File

@ -2,7 +2,11 @@
<q-menu context-menu>
<q-list separator class="context-menu-list">
<div v-for="(item, index) in menuItems" :key="index">
<ContextMenuItem :action="item.action" :i18n="item.i18n" @clicked="clickedMenu(item, $event)" />
<ContextMenuItem
:action="item.action"
:i18n="item.i18n"
@clicked="clickedMenu(item, $event)"
/>
</div>
</q-list>
</q-menu>
@ -30,10 +34,4 @@ export default {
};
</script>
<style>
.context-menu-list {
min-width: 150px;
max-height: 300px;
color: white;
}
</style>
<style></style>

View File

@ -3,8 +3,15 @@
<q-btn class="menu" icon="menu" size="md" flat>
<q-menu>
<q-list separator class="menu-list">
<q-item v-if="!disableSwitchWallet" v-close-popup clickable @click.native="switchWallet">
<q-item-label header>{{ $t("menuItems.switchWallet") }}</q-item-label>
<q-item
v-if="!disableSwitchWallet"
v-close-popup
clickable
@click.native="switchWallet"
>
<q-item-label header>{{
$t("menuItems.switchWallet")
}}</q-item-label>
</q-item>
<q-item v-close-popup clickable @click.native="openSettings">
<q-item-label header>{{ $t("menuItems.settings") }}</q-item-label>
@ -22,26 +29,50 @@
<!-- TODO: Move this to it's own component -->
<q-dialog ref="aboutModal" minimized>
<div class="about-modal">
<img class="q-mb-md" src="loki.svg" height="42" />
<img class="q-mb-md" src="oxen.svg" height="42" />
<p class="q-my-sm">Wallet Version: v{{ version }}</p>
<p class="q-my-sm">Deaemon Version: v{{ daemonVersion }}</p>
<p class="q-my-sm">Copyright (c) 2018-2020, Loki Project</p>
<p class="q-my-sm">Copyright (c) 2018-2021, Oxen</p>
<p class="q-my-sm">Copyright (c) 2018, Ryo Currency Project</p>
<p class="q-my-sm">All rights reserved.</p>
<div class="q-mt-md q-mb-lg external-links">
<p>
<a href="#" @click="openExternal('https://loki.network/')">https://loki.network/</a>
<a href="#" @click="openExternal('https://oxen.io/')"
>https://oxen.io/</a
>
</p>
<p>
<a href="#" @click="openExternal('https://t.me/joinchat/DeNvR0JJ4JPn6TVSQjCsZQ')">Telegram</a>
<a
href="#"
@click="
openExternal('https://t.me/joinchat/DeNvR0JJ4JPn6TVSQjCsZQ')
"
>Telegram</a
>
-
<a href="#" @click="openExternal('https://discordapp.com/invite/67GXfD6')">Discord</a>
<a
href="#"
@click="openExternal('https://discordapp.com/invite/67GXfD6')"
>Discord</a
>
-
<a href="#" @click="openExternal('https://www.reddit.com/r/LokiProject/')">Reddit</a>
<a
href="#"
@click="openExternal('https://www.reddit.com/r/LokiProject/')"
>Reddit</a
>
-
<a href="#" @click="openExternal('https://github.com/loki-project/loki-electron-gui-wallet')">Github</a>
<a
href="#"
@click="
openExternal(
'https://github.com/loki-project/loki-electron-gui-wallet'
)
"
>Github</a
>
</p>
</div>
<q-btn color="primary" label="Close" @click="showAbout(false)" />
@ -96,13 +127,19 @@ export default {
switchWallet() {
// If the rpc is syncing then we want to tell the user to restart
if (this.isRPCSyncing) {
this.$gateway.confirmClose(this.$t("dialog.switchWallet.restartMessage"), true);
this.$gateway.confirmClose(
this.$t("dialog.switchWallet.restartMessage"),
true
);
return;
}
// TODO: Remove this in hardfork 16
// This is a temporary work around for the issue where wallet rpc hangs after closing a wallet due to long polling still being active
this.$gateway.confirmClose(this.$t("dialog.switchWallet.restartWalletMessage"), true);
this.$gateway.confirmClose(
this.$t("dialog.switchWallet.restartWalletMessage"),
true
);
// Allow switching normally because rpc won't be blocked
// NB: If this is added back, must use the quasar v1 APIs
@ -142,8 +179,8 @@ export default {
<style lang="scss">
.about-modal {
padding: 25px;
background-color: $dark;
color: white;
background-color: white;
color: #1f1c47;
.external-links {
a {

View File

@ -1,22 +1,62 @@
<template>
<div class="wallet-settings">
<q-btn icon-right="more_vert" :label="$t('buttons.settings')" size="md" flat>
<q-btn
icon-right="more_vert"
:label="$t('buttons.settings')"
size="md"
flat
>
<q-menu anchor="bottom right" self="top right">
<q-list separator class="menu-list">
<q-item v-close-popup clickable :disabled="!is_ready" @click.native="getPrivateKeys()">
<q-item-label header>{{ $t("menuItems.showPrivateKeys") }}</q-item-label>
<q-item
v-close-popup
clickable
:disabled="!is_ready"
@click.native="getPrivateKeys()"
>
<q-item-label header>{{
$t("menuItems.showPrivateKeys")
}}</q-item-label>
</q-item>
<q-item v-close-popup clickable :disabled="!is_ready" @click.native="showModal('change_password')">
<q-item-label header>{{ $t("menuItems.changePassword") }}</q-item-label>
<q-item
v-close-popup
clickable
:disabled="!is_ready"
@click.native="showModal('change_password')"
>
<q-item-label header>{{
$t("menuItems.changePassword")
}}</q-item-label>
</q-item>
<q-item v-close-popup clickable :disabled="!is_ready" @click.native="showModal('rescan')">
<q-item-label header>{{ $t("menuItems.rescanWallet") }}</q-item-label>
<q-item
v-close-popup
clickable
:disabled="!is_ready"
@click.native="showModal('rescan')"
>
<q-item-label header>{{
$t("menuItems.rescanWallet")
}}</q-item-label>
</q-item>
<q-item v-close-popup clickable :disabled="!is_ready" @click.native="showModal('key_image')">
<q-item-label header>{{ $t("menuItems.manageKeyImages") }}</q-item-label>
<q-item
v-close-popup
clickable
:disabled="!is_ready"
@click.native="showModal('key_image')"
>
<q-item-label header>{{
$t("menuItems.manageKeyImages")
}}</q-item-label>
</q-item>
<q-item v-close-popup clickable :disabled="!is_ready" @click.native="deleteWallet()">
<q-item-label header>{{ $t("menuItems.deleteWallet") }}</q-item-label>
<q-item
v-close-popup
clickable
:disabled="!is_ready"
@click.native="deleteWallet()"
>
<q-item-label header>{{
$t("menuItems.deleteWallet")
}}</q-item-label>
</q-item>
</q-list>
</q-menu>
@ -24,10 +64,14 @@
<!-- Modals -->
<!-- PRIVATE KEY MODAL -->
<q-dialog v-model="modals.private_keys.visible" minimized class="private-key-modal" @hide="closePrivateKeys()">
<div class="modal">
<q-dialog
v-model="modals.private_keys.visible"
minimized
@hide="closePrivateKeys()"
>
<div class="modal private-key-modal">
<div class="modal-header">{{ $t("titles.privateKeys") }}</div>
<div class="q-ma-lg">
<div class="q-ma-md">
<template v-if="secret.mnemonic">
<h6 class="q-mb-xs q-mt-lg">
{{ $t("strings.seedWords") }}
@ -45,7 +89,11 @@
icon="file_copy"
@click="copyPrivateKey('mnemonic', $event)"
>
<q-tooltip anchor="center left" self="center right" :offset="[5, 10]">
<q-tooltip
anchor="center left"
self="center right"
:offset="[5, 10]"
>
{{ $t("menuItems.copySeedWords") }}
</q-tooltip>
</q-btn>
@ -68,7 +116,11 @@
icon="file_copy"
@click="copyPrivateKey('view_key', $event)"
>
<q-tooltip anchor="center left" self="center right" :offset="[5, 10]">
<q-tooltip
anchor="center left"
self="center right"
:offset="[5, 10]"
>
{{ $t("menuItems.copyViewKey") }}
</q-tooltip>
</q-btn>
@ -91,7 +143,11 @@
icon="file_copy"
@click="copyPrivateKey('spend_key', $event)"
>
<q-tooltip anchor="center left" self="center right" :offset="[5, 10]">
<q-tooltip
anchor="center left"
self="center right"
:offset="[5, 10]"
>
{{ $t("menuItems.copySpendKey") }}
</q-tooltip>
</q-btn>
@ -100,7 +156,11 @@
</template>
<div class="q-mt-lg">
<q-btn color="primary" :label="$t('buttons.close')" @click="hideModal('private_keys')" />
<q-btn
color="primary"
:label="$t('buttons.close')"
@click="hideModal('private_keys')"
/>
</div>
</div>
</div>
@ -108,50 +168,89 @@
<!-- RESCAN MODAL -->
<q-dialog v-model="modals.rescan.visible" minimized>
<div class="modal">
<div class="modal rescan-modal">
<div class="a-ma-lg modal-header">{{ $t("titles.rescanWallet") }}</div>
<div class="q-ma-lg">
<div class="q-ma-md">
<p>{{ $t("strings.rescanModalDescription") }}</p>
<div class="q-mt-lg">
<q-radio v-model="modals.rescan.type" val="full" :label="$t('fieldLabels.rescanFullBlockchain')" />
<q-radio
v-model="modals.rescan.type"
val="full"
:label="$t('fieldLabels.rescanFullBlockchain')"
/>
</div>
<div class="q-mt-sm">
<q-radio v-model="modals.rescan.type" val="spent" :label="$t('fieldLabels.rescanSpentOutputs')" />
<q-radio
v-model="modals.rescan.type"
val="spent"
:label="$t('fieldLabels.rescanSpentOutputs')"
/>
</div>
<div class="q-mt-xl text-right">
<q-btn flat class="q-mr-sm" :label="$t('buttons.close')" @click="hideModal('rescan')" />
<q-btn color="primary" :label="$t('buttons.rescan')" @click="rescanWallet()" />
<q-btn
flat
class="q-mr-sm"
:label="$t('buttons.close')"
@click="hideModal('rescan')"
/>
<q-btn
color="primary"
:label="$t('buttons.rescan')"
@click="rescanWallet()"
/>
</div>
</div>
</div>
</q-dialog>
<!-- KEY IMAGE MODAL -->
<q-dialog v-model="modals.key_image.visible" class="key-image-modal" minimized>
<q-dialog
v-model="modals.key_image.visible"
class="key-image-modal"
minimized
>
<div class="modal key-image-modal">
<div class="modal-header">
<!-- Export/Import key images -->
{{
$t("dialog.keyImages.title", {
type: $t(`dialog.keyImages.${modals.key_image.type.toLowerCase()}`)
type: $t(
`dialog.keyImages.${modals.key_image.type.toLowerCase()}`
)
})
}}
</div>
<div class="q-ma-lg">
<div class="q-ma-md">
<div class="row q-mb-md">
<div class="q-mr-xl">
<q-radio v-model="modals.key_image.type" val="Export" :label="$t('dialog.keyImages.export')" />
<q-radio
v-model="modals.key_image.type"
val="Export"
:label="$t('dialog.keyImages.export')"
/>
</div>
<div>
<q-radio v-model="modals.key_image.type" val="Import" :label="$t('dialog.keyImages.import')" />
<q-radio
v-model="modals.key_image.type"
val="Import"
:label="$t('dialog.keyImages.import')"
/>
</div>
</div>
<template v-if="modals.key_image.type == 'Export'">
<LokiField class="q-mt-lg" :label="$t('fieldLabels.keyImages.exportDirectory')" disable-hover>
<q-input v-model="modals.key_image.export_path" disable borderless />
<OxenField
class="q-mt-lg"
:label="$t('fieldLabels.keyImages.exportDirectory')"
disable-hover
>
<q-input
v-model="modals.key_image.export_path"
disable
borderless
/>
<input
id="keyImageExportPath"
ref="keyImageExportSelect"
@ -162,12 +261,22 @@
hidden
@change="setKeyImageExportPath"
/>
<q-btn color="secondary" @click="selectKeyImageExportPath">{{ $t("buttons.browse") }}</q-btn>
</LokiField>
<q-btn color="primary" @click="selectKeyImageExportPath">{{
$t("buttons.browse")
}}</q-btn>
</OxenField>
</template>
<template v-if="modals.key_image.type == 'Import'">
<LokiField class="q-mt-lg" :label="$t('fieldLabels.keyImages.importFile')" disable-hover>
<q-input v-model="modals.key_image.import_path" disable borderless />
<OxenField
class="q-mt-lg"
:label="$t('fieldLabels.keyImages.importFile')"
disable-hover
>
<q-input
v-model="modals.key_image.import_path"
disable
borderless
/>
<input
id="keyImageImportPath"
ref="keyImageImportSelect"
@ -176,12 +285,19 @@
hidden
@change="setKeyImageImportPath"
/>
<q-btn color="secondary" @click="selectKeyImageImportPath">{{ $t("buttons.browse") }}</q-btn>
</LokiField>
<q-btn color="primary" @click="selectKeyImageImportPath">{{
$t("buttons.browse")
}}</q-btn>
</OxenField>
</template>
<div class="q-mt-lg text-right">
<q-btn flat class="q-mr-sm" :label="$t('buttons.close')" @click="hideModal('key_image')" />
<q-btn
flat
class="q-mr-sm"
:label="$t('buttons.close')"
@click="hideModal('key_image')"
/>
<q-btn
color="primary"
:label="$t('buttons.' + modals.key_image.type.toLowerCase())"
@ -193,33 +309,43 @@
</q-dialog>
<!-- CHANGE PASSWORD MODAL -->
<q-dialog v-model="modals.change_password.visible" minimized @hide="clearChangePassword()">
<q-dialog
v-model="modals.change_password.visible"
minimized
@hide="clearChangePassword()"
>
<div class="modal password-modal">
<div class="modal-header">{{ $t("titles.changePassword") }}</div>
<div class="q-ma-lg">
<div class="q-ma-md">
<q-input
v-model="modals.change_password.old_password"
type="password"
:label="$t('fieldLabels.oldPassword')"
:dark="theme == 'dark'"
/>
<q-input
v-model="modals.change_password.new_password"
type="password"
:label="$t('fieldLabels.newPassword')"
:dark="theme == 'dark'"
/>
<q-input
v-model="modals.change_password.new_password_confirm"
type="password"
:label="$t('fieldLabels.confirmNewPassword')"
:dark="theme == 'dark'"
/>
<div class="q-mt-xl text-right">
<q-btn flat class="q-mr-sm" :label="$t('buttons.close')" @click="hideModal('change_password')" />
<q-btn color="primary" :label="$t('buttons.change')" @click="doChangePassword()" />
<q-btn
flat
class="q-mr-sm"
:label="$t('buttons.close')"
@click="hideModal('change_password')"
/>
<q-btn
color="primary"
:label="$t('buttons.change')"
@click="doChangePassword()"
/>
</div>
</div>
</div>
@ -231,12 +357,12 @@
const { clipboard } = require("electron");
import { mapState } from "vuex";
import WalletPassword from "src/mixins/wallet_password";
import LokiField from "components/loki_field";
import OxenField from "components/oxen_field";
export default {
name: "WalletSettings",
components: {
LokiField
OxenField
},
mixins: [WalletPassword],
data() {
@ -307,8 +433,17 @@ export default {
},
created() {
const path = require("upath");
this.modals.key_image.export_path = path.join(this.wallet_data_dir, "images", this.info.name);
this.modals.key_image.import_path = path.join(this.wallet_data_dir, "images", this.info.name, "key_image_export");
this.modals.key_image.export_path = path.join(
this.wallet_data_dir,
"images",
this.info.name
);
this.modals.key_image.import_path = path.join(
this.wallet_data_dir,
"images",
this.info.name,
"key_image_export"
);
},
methods: {
showModal(which) {
@ -355,8 +490,7 @@ export default {
ok: {
label: this.$t("dialog.buttons.ok"),
color: "primary"
},
dark: this.theme === "dark"
}
})
.onDismiss(() => null)
.onCancel(() => null)
@ -379,8 +513,11 @@ export default {
label: this.$t("dialog.showPrivateKeys.ok"),
color: "primary"
},
dark: this.theme == "dark",
color: this.theme == "dark" ? "white" : "dark"
cancel: {
color: "tertiary",
flat: true
},
color: "white"
});
passwordDialog
.onOk(password => {
@ -418,10 +555,8 @@ export default {
},
cancel: {
flat: true,
label: this.$t("dialog.buttons.cancel"),
color: this.theme == "dark" ? "white" : "dark"
},
dark: this.theme == "dark"
label: this.$t("dialog.buttons.cancel")
}
})
.onOk(() => {
this.$gateway.send("wallet", "rescan_blockchain");
@ -447,7 +582,9 @@ export default {
async doKeyImages() {
this.hideModal("key_image");
const type = this.$t(`dialog.keyImages.${this.modals.key_image.type.toLowerCase()}`);
const type = this.$t(
`dialog.keyImages.${this.modals.key_image.type.toLowerCase()}`
);
let passwordDialog = await this.showPasswordConfirmation({
title: this.$t("dialog.keyImages.title", { type }),
@ -482,7 +619,8 @@ export default {
doChangePassword() {
let old_password = this.modals.change_password.old_password;
let new_password = this.modals.change_password.new_password;
let new_password_confirm = this.modals.change_password.new_password_confirm;
let new_password_confirm = this.modals.change_password
.new_password_confirm;
if (new_password == old_password) {
this.$q.notify({
@ -524,7 +662,7 @@ export default {
label: this.$t("dialog.buttons.cancel"),
color: this.theme == "dark" ? "white" : "dark"
},
dark: this.theme == "dark"
color: "#1F1C47"
})
.onOk(async () => {
const hasPassword = await this.hasPassword();
@ -569,8 +707,6 @@ export default {
};
</script>
.menu-list { }
<style lang="scss">
.wallet-settings {
.q-btn {
@ -580,6 +716,17 @@ export default {
.password-modal {
min-width: 400px;
background: white;
color: #1f1c47;
> * {
color: #1f1c47;
}
}
.rescan-modal {
background: white;
color: #1f1c47;
}
.image-path {
@ -588,8 +735,11 @@ export default {
}
.key-image-modal {
color: #1f1c47;
background: white;
label * {
color: #cecece !important;
color: #1f1c47 !important;
text-overflow: ellipsis;
overflow: hidden;
}
@ -599,6 +749,9 @@ export default {
}
.private-key-modal {
background: white;
color: #1f1c47;
.copy-btn {
margin-left: 8px;
}
@ -608,7 +761,7 @@ export default {
min-width: 400px;
width: 45vw;
.loki-field {
.oxen-field {
flex: 1;
}
}

View File

@ -1,8 +1,10 @@
<template>
<div class="loki-field" :class="{ disable, 'disable-hover': disableHover }">
<div class="oxen-field" :class="{ disable, 'disable-hover': disableHover }">
<div v-if="label" class="label row items-center" :disabled="disable">
{{ label }}
<span v-if="optional" class="optional">({{ $t("fieldLabels.optional") }})</span>
<span v-if="optional" class="optional"
>({{ $t("fieldLabels.optional") }})</span
>
</div>
<div class="content row items-center" :class="{ error }">
<slot></slot>
@ -15,7 +17,7 @@
<script>
export default {
name: "LokiField",
name: "OxenField",
props: {
label: {
type: String,
@ -55,7 +57,7 @@ export default {
</script>
<style lang="scss">
.loki-field {
.oxen-field {
.label {
margin: 6px 0;
font-weight: bold;
@ -90,7 +92,14 @@ export default {
margin: 0;
* {
color: white;
// Oxen navy, can't use vars here :(
color: #1f1c47;
}
}
.q-select {
.row {
color: red;
}
}

View File

@ -1,20 +1,34 @@
<template>
<q-list class="loki-list-item" no-border @click.native="details(address)">
<q-list class="oxen-list-item" no-border @click.native="details(address)">
<q-item>
<q-item-section class="flex">
<q-item-label class="ellipsis">{{ address.address }}</q-item-label>
<q-item-label v-if="sublabel" caption class="non-selectable">{{ sublabel }}</q-item-label>
<q-item-label v-if="sublabel" caption class="non-selectable">{{
sublabel
}}</q-item-label>
</q-item-section>
<q-item-section side>
<div class="row">
<q-btn style="margin-right: 4px;" flat padding="xs" size="md" @click="showQR(address.address, $event)">
<q-btn
style="margin-right: 4px;"
flat
padding="xs"
size="md"
@click="showQR(address.address, $event)"
>
<!-- height of 24 makes it equal size as copy -->
<img :src="qrImage" height="24" />
<q-tooltip anchor="bottom right" self="top right" :offset="[0, 5]">
{{ $t("menuItems.showQRCode") }}
</q-tooltip>
</q-btn>
<q-btn flat padding="xs" size="md" icon="file_copy" @click="copyAddress(address.address, $event)">
<q-btn
flat
padding="xs"
size="md"
icon="file_copy"
@click="copyAddress(address.address, $event)"
>
<q-tooltip anchor="bottom right" self="top right" :offset="[0, 5]">
{{ $t("menuItems.copyAddress") }}
</q-tooltip>
@ -28,19 +42,23 @@
<q-item-section>
<div class="row info-section">
<span class="col-sm-4">
<span>{{ $t("strings.lokiBalance") }}</span>
<span>{{ $t("strings.oxenBalance") }}</span>
<br />
<span class="value">{{ address.balance | currency }}</span>
</span>
<span class="col-sm-4">
<span>{{ $t("strings.lokiUnlockedBalance") }}</span>
<span>{{ $t("strings.oxenUnlockedBalance") }}</span>
<br />
<span class="value">{{ address.unlocked_balance | currency }}</span>
<span class="value">{{
address.unlocked_balance | currency
}}</span>
</span>
<span class="col-sm-4">
<span>{{ $t("strings.unspentOutputs") }}</span>
<br />
<span class="value">{{ address.num_unspent_outputs | toString }}</span>
<span class="value">{{
address.num_unspent_outputs | toString
}}</span>
</span>
</div>
</q-item-section>

View File

@ -23,7 +23,7 @@
/>
</q-toolbar>
</q-header>
<q-page-container>
<q-page-container class="detail-page">
<div class="layout-padding">
<h6 class="q-mt-xs q-mb-none text-weight-light">
{{ $t("strings.serviceNodeDetails.serviceNodeKey") }}
@ -40,7 +40,7 @@
</div>
<div class="value">
<span
><FormatLoki :amount="node.staking_requirement" raw-value
><FormatOxen :amount="node.staking_requirement" raw-value
/></span>
</div>
</div>
@ -54,7 +54,7 @@
</div>
<div class="value">
<span
><FormatLoki :amount="node.total_contributed" raw-value
><FormatOxen :amount="node.total_contributed" raw-value
/></span>
</div>
</div>
@ -120,7 +120,7 @@
</div>
</div>
</div>
<q-list no-border :dark="theme == 'dark'" class="loki-list">
<q-list no-border :dark="theme == 'dark'" class="oxen-list">
<q-item-label class="contributors-title"
>{{
$t("strings.serviceNodeDetails.contributors")
@ -129,7 +129,7 @@
<q-item
v-for="contributor in contributors"
:key="contributor.address"
class="loki-list-item"
class="oxen-list-item"
clickable
@click="openUserWalletInfo(contributor.address)"
>
@ -150,7 +150,7 @@
>{{ $t("strings.operator") }}
</span>
{{ $t("strings.contribution") }}:
<FormatLoki :amount="contributor.amount" raw-value />
<FormatOxen :amount="contributor.amount" raw-value />
</q-item-label>
</q-item-label>
<ContextMenu
@ -175,12 +175,12 @@
const { clipboard } = require("electron");
import { mapState } from "vuex";
import { date } from "quasar";
import FormatLoki from "components/format_loki";
import FormatOxen from "components/format_oxen";
import ContextMenu from "components/menus/contextmenu";
export default {
name: "ServiceNodeDetails",
components: {
FormatLoki,
FormatOxen,
ContextMenu
},
props: {
@ -280,6 +280,7 @@ export default {
<style lang="scss">
.contributors-title {
margin-bottom: 12px;
color: #1f1c47;
}
.serviceNodeDetails {

View File

@ -16,7 +16,7 @@
<span v-if="getRole(node)">{{ getRole(node) }} </span>
<span>
{{ $t("strings.contribution") }}:
<FormatLoki :amount="node.ourContributionAmount" />
<FormatOxen :amount="node.ourContributionAmount" />
</span>
</span>
<!-- you only have a contribution amount of 0 if you are a "contributor"
@ -28,18 +28,16 @@
>
{{ $t("strings.serviceNodeDetails.reserved") }}
</span>
<span v-if="node.awaitingContribution">
<span v-if="node.awaitingContribution" class="contrib-amounts">
{{ $t("strings.serviceNodeDetails.minContribution") }}:
{{ getMinContribution(node) }} LOKI
{{ getMinContribution(node) }} OXEN
{{ $t("strings.serviceNodeDetails.maxContribution") }}:
{{ openForContributionLoki(node) }} LOKI
{{ openForContriubtionOxen(node) }} OXEN
</span>
</q-item-label>
</q-item-section>
<q-item-section side>
<span style="font-size: 16px; color: #cecece">{{
getFee(node)
}}</span>
<span class="fee">{{ getFee(node) }}</span>
</q-item-section>
<q-item-section side>
<q-btn
@ -72,7 +70,7 @@
<script>
import { clipboard } from "electron";
import ContextMenu from "components/menus/contextmenu";
import FormatLoki from "components/format_loki";
import FormatOxen from "components/format_oxen";
import ServiceNodeMixin from "src/mixins/service_node_mixin";
import { mapState } from "vuex";
@ -80,7 +78,7 @@ export default {
name: "ServiceNodeList",
components: {
ContextMenu,
FormatLoki
FormatOxen
},
mixins: [ServiceNodeMixin],
props: {
@ -168,4 +166,16 @@ export default {
};
</script>
<style></style>
<style lang="scss">
.fee {
color: #1f1c47;
}
.service-node-list {
.q-item:hover {
.fee {
color: white;
}
}
}
</style>

View File

@ -1,11 +1,15 @@
<template>
<div class="service-node-registration">
<div class="q-pa-md">
<i18n path="strings.serviceNodeRegistrationDescription" tag="div" class="description q-mb-lg">
<i18n
path="strings.serviceNodeRegistrationDescription"
tag="div"
class="tab-desc q-mb-lg"
>
<b place="registerCommand">register_service_node</b>
<b place="prepareCommand">prepare_registration</b>
</i18n>
<LokiField
<OxenField
:label="$t('fieldLabels.serviceNodeCommand')"
:error="$v.registration_string.$error"
:disabled="registration_status.sending"
@ -13,8 +17,7 @@
<q-input
v-model.trim="registration_string"
type="textarea"
:dark="theme == 'dark'"
class="full-width text-area-loki"
class="full-width text-area-oxen"
placeholder="register_service_node ..."
:disabled="registration_status.sending"
borderless
@ -22,7 +25,7 @@
@blur="$v.registration_string.$touch"
@paste="onPaste"
/>
</LokiField>
</OxenField>
<q-btn
class="register-button"
color="primary"
@ -32,7 +35,7 @@
/>
</div>
<q-inner-loading :showing="registration_status.sending" :dark="theme == 'dark'">
<q-inner-loading :showing="registration_status.sending">
<q-spinner color="primary" size="30" />
</q-inner-loading>
</div>
@ -41,13 +44,13 @@
<script>
import { mapState } from "vuex";
import { required } from "vuelidate/lib/validators";
import LokiField from "components/loki_field";
import OxenField from "components/oxen_field";
import WalletPassword from "src/mixins/wallet_password";
export default {
name: "ServiceNodeRegistration",
components: {
LokiField
OxenField
},
mixins: [WalletPassword],
data() {

View File

@ -1,15 +1,15 @@
<template>
<div class="service-node-staking">
<div class="q-px-md q-pt-md">
<p style="color: #cecece">
<p class="tab-desc">
{{ $t("strings.serviceNodeContributionDescription") }}
<span
style="cursor: pointer; text-decoration: underline;"
@click="lokiWebsite"
@click="oxenWebsite"
>Loki {{ $t("strings.website") }}.</span
>
</p>
<LokiField
<OxenField
:label="$t('fieldLabels.serviceNodeKey')"
:error="$v.service_node.key.$error"
>
@ -21,8 +21,8 @@
dense
@blur="$v.service_node.key.$touch"
/>
</LokiField>
<LokiField
</OxenField>
<OxenField
:label="$t('fieldLabels.amount')"
class="q-mt-md"
:error="$v.service_node.amount.$error"
@ -39,20 +39,20 @@
@blur="$v.service_node.amount.$touch"
/>
<q-btn
color="secondary"
color="primary"
:text-color="theme == 'dark' ? 'white' : 'dark'"
:label="$t('buttons.min')"
:disable="!areButtonsEnabled()"
@click="service_node.amount = minStake(service_node.key)"
/>
<q-btn
color="secondary"
color="primary"
:text-color="theme == 'dark' ? 'white' : 'dark'"
:label="$t('buttons.max')"
:disable="!areButtonsEnabled()"
@click="service_node.amount = maxStake(service_node.key)"
/>
</LokiField>
</OxenField>
<div class="submit-button">
<q-btn
:disable="!is_able_to_send"
@ -62,7 +62,7 @@
/>
<q-btn
:disable="!is_able_to_send"
color="secondary"
color="accent"
:label="$t('buttons.sweepAll')"
@click="sweepAllWarning()"
/>
@ -84,7 +84,6 @@
/>
<q-inner-loading
:showing="stake_status.sending || sweep_all_status.sending"
:dark="theme == 'dark'"
>
<q-spinner color="primary" size="30" />
</q-inner-loading>
@ -96,7 +95,7 @@ const objectAssignDeep = require("object-assign-deep");
import { mapState } from "vuex";
import { required, decimal } from "vuelidate/lib/validators";
import { service_node_key, greater_than_zero } from "src/validators/common";
import LokiField from "components/loki_field";
import OxenField from "components/oxen_field";
import WalletPassword from "src/mixins/wallet_password";
import ConfirmDialogMixin from "src/mixins/confirm_dialog_mixin";
import ServiceNodeContribute from "./service_node_contribute";
@ -108,7 +107,7 @@ const DO_NOTHING = 10;
export default {
name: "ServiceNodeStaking",
components: {
LokiField,
OxenField,
ServiceNodeContribute,
ConfirmTransactionDialog
},
@ -278,7 +277,7 @@ export default {
}
},
methods: {
lokiWebsite() {
oxenWebsite() {
const url = "https://loki.network/service-nodes/";
this.$gateway.send("core", "open_url", {
url
@ -294,7 +293,7 @@ export default {
},
maxStake() {
const node = this.getNodeWithPubKey();
return this.openForContributionLoki(node);
return this.openForContriubtionOxen(node);
},
getFeeDecimal(node) {
const operatorPortion = node.portions_for_operator;
@ -353,9 +352,8 @@ export default {
cancel: {
flat: true,
label: this.$t("dialog.buttons.cancel"),
color: this.theme === "dark" ? "white" : "dark"
},
dark: this.theme === "dark"
color: "negative"
}
})
.onOk(() => {
this.sweepAll();
@ -387,10 +385,8 @@ export default {
noPasswordMessage: this.$t("dialog.sweepAll.message"),
ok: {
label: this.$t("dialog.sweepAll.ok"),
color: "primary"
},
dark: this.theme == "dark",
color: this.theme == "dark" ? "white" : "dark"
color: "#12C7BA"
}
});
passwordDialog
.onOk(password => {

View File

@ -12,7 +12,7 @@
<q-btn-toggle
v-model="page"
toggle-color="primary"
color="tertiary"
color="accent"
size="md"
:options="tabs"
/>

View File

@ -24,19 +24,19 @@
</div>
</div>
<p v-if="config_daemon.type == 'local_remote'">
<p v-if="config_daemon.type == 'local_remote'" class="tab-desc">
{{ $t("strings.daemon.localRemote.description") }}
</p>
<p v-if="config_daemon.type == 'local'">
<p v-if="config_daemon.type == 'local'" class="tab-desc">
{{ $t("strings.daemon.local.description") }}
</p>
<p v-if="is_remote">
<p v-if="is_remote" class="tab-desc">
{{ $t("strings.daemon.remote.description") }}
</p>
<template v-if="config_daemon.type != 'remote'">
<div class="row pl-sm">
<LokiField
<OxenField
class="col-8"
:label="$t('fieldLabels.localDaemonIP')"
disable
@ -44,13 +44,12 @@
<q-input
v-model="config_daemon.rpc_bind_ip"
:placeholder="daemon_defaults.rpc_bind_ip"
:dark="theme == 'dark'"
disable
borderless
dense
/>
</LokiField>
<LokiField
</OxenField>
<OxenField
class="col-4"
:label="$t('fieldLabels.localDaemonPort') + '(RPC)'"
>
@ -62,21 +61,19 @@
:step="1"
min="1024"
max="65535"
:dark="theme == 'dark'"
borderless
dense
/>
</LokiField>
</OxenField>
</div>
</template>
<template v-if="config_daemon.type != 'local'">
<div class="row q-mt-md pl-sm">
<LokiField class="col-8" :label="$t('fieldLabels.remoteNodeHost')">
<OxenField class="col-8" :label="$t('fieldLabels.remoteNodeHost')">
<q-input
v-model="config_daemon.remote_host"
:placeholder="daemon_defaults.remote_host"
:dark="theme == 'dark'"
borderless
dense
/>
@ -86,7 +83,7 @@
class="remote-dropdown"
flat
>
<q-list link dark no-border>
<q-list link no-border>
<q-item
v-for="option in remotes"
:key="option.host"
@ -101,8 +98,8 @@
</q-item>
</q-list>
</q-btn-dropdown>
</LokiField>
<LokiField class="col-4" :label="$t('fieldLabels.remoteNodePort')">
</OxenField>
<OxenField class="col-4" :label="$t('fieldLabels.remoteNodePort')">
<q-input
v-model="config_daemon.remote_port"
:placeholder="toString(daemon_defaults.remote_port)"
@ -115,12 +112,12 @@
borderless
dense
/>
</LokiField>
</OxenField>
</div>
</template>
<div class="col q-mt-md pt-sm">
<LokiField :label="$t('fieldLabels.dataStoragePath')" disable-hover>
<OxenField :label="$t('fieldLabels.dataStoragePath')" disable-hover>
<q-input
v-model="config.app.data_dir"
disable
@ -138,13 +135,13 @@
@change="setDataPath"
/>
<q-btn
color="secondary"
color="primary"
:text-color="theme == 'dark' ? 'white' : 'dark'"
@click="selectPath('data')"
>{{ $t("buttons.selectLocation") }}</q-btn
>
</LokiField>
<LokiField :label="$t('fieldLabels.walletStoragePath')" disable-hover>
</OxenField>
<OxenField :label="$t('fieldLabels.walletStoragePath')" disable-hover>
<q-input
v-model="config.app.wallet_data_dir"
disable
@ -162,12 +159,12 @@
@change="setWalletDataPath"
/>
<q-btn
color="secondary"
color="primary"
:text-color="theme == 'dark' ? 'white' : 'dark'"
@click="selectPath('wallet')"
>{{ $t("buttons.selectLocation") }}</q-btn
>
</LokiField>
</OxenField>
</div>
<q-expansion-item
@ -175,7 +172,7 @@
header-class="q-mt-sm non-selectable row reverse advanced-options-label"
>
<div class="row pl-sm q-mt-sm">
<LokiField
<OxenField
class="col-6"
:label="$t('fieldLabels.daemonLogLevel')"
:disable="is_remote"
@ -193,8 +190,8 @@
borderless
dense
/>
</LokiField>
<LokiField class="col-6" :label="$t('fieldLabels.walletLogLevel')">
</OxenField>
<OxenField class="col-6" :label="$t('fieldLabels.walletLogLevel')">
<q-input
v-model="config.wallet.log_level"
:placeholder="toString(defaults.wallet.log_level)"
@ -207,12 +204,12 @@
borderless
dense
/>
</LokiField>
</OxenField>
</div>
<div class="row pl-sm q-mt-md">
<!-- TODO: Can be generalised to a "port" (or similar) field -->
<LokiField
<OxenField
class="col-3"
:label="$t('fieldLabels.maxIncomingPeers')"
:disable="is_remote"
@ -230,8 +227,8 @@
borderless
dense
/>
</LokiField>
<LokiField
</OxenField>
<OxenField
class="col-3"
:label="$t('fieldLabels.maxOutgoingPeers')"
:disable="is_remote"
@ -249,8 +246,8 @@
borderless
dense
/>
</LokiField>
<LokiField
</OxenField>
<OxenField
class="col-3"
:label="$t('fieldLabels.limitUploadRate')"
:disable="is_remote"
@ -269,8 +266,8 @@
borderless
dense
/>
</LokiField>
<LokiField
</OxenField>
<OxenField
class="col-3"
:label="$t('fieldLabels.limitDownloadRate')"
:disable="is_remote"
@ -289,10 +286,10 @@
borderless
dense
/>
</LokiField>
</OxenField>
</div>
<div class="row pl-sm q-mt-md">
<LokiField
<OxenField
class="col-3"
:label="$t('fieldLabels.daemonP2pPort')"
:disable="is_remote"
@ -311,8 +308,8 @@
borderless
dense
/>
</LokiField>
<LokiField class="col-3" :label="$t('fieldLabels.internalWalletPort')">
</OxenField>
<OxenField class="col-3" :label="$t('fieldLabels.internalWalletPort')">
<q-input
v-model="config.app.ws_bind_port"
:placeholder="toString(defaults.app.ws_bind_port)"
@ -326,8 +323,8 @@
borderless
dense
/>
</LokiField>
<LokiField
</OxenField>
<OxenField
class="col-3"
:label="$t('fieldLabels.walletRPCPort')"
:disable="is_remote"
@ -346,9 +343,9 @@
borderless
dense
/>
</LokiField>
</OxenField>
</div>
<LokiField
<OxenField
:helper="$t('fieldLabels.chooseNetwork')"
:label="$t('fieldLabels.network')"
class="network-group-field"
@ -362,18 +359,18 @@
{ label: 'Test Net', value: 'testnet' }
]"
/>
</LokiField>
</OxenField>
</q-expansion-item>
</div>
</template>
<script>
import { mapState } from "vuex";
import LokiField from "components/loki_field";
import OxenField from "components/oxen_field";
export default {
name: "SettingsGeneral",
components: {
LokiField
OxenField
},
props: {
randomiseRemote: {

View File

@ -21,7 +21,7 @@
/>
</q-toolbar>
</q-header>
<q-page-container>
<q-page-container class="detail-page">
<div class="layout-padding">
<div class="row items-center non-selectable">
<div class="q-mr-sm">
@ -72,7 +72,7 @@
<span>{{ $t("strings.transactions.amount") }}</span>
</div>
<div class="value">
<span><FormatLoki :amount="tx.amount" raw-value/></span>
<span><FormatOxen :amount="tx.amount" raw-value/></span>
</div>
</div>
</div>
@ -88,7 +88,7 @@
</span>
</div>
<div class="value">
<span><FormatLoki :amount="tx.fee" raw-value/></span>
<span><FormatOxen :amount="tx.fee" raw-value/></span>
</div>
</div>
</div>
@ -176,7 +176,7 @@
destination.address
}}</q-item-label>
<q-item-label
><FormatLoki :amount="destination.amount"
><FormatOxen :amount="destination.amount"
/></q-item-label>
</q-item-label>
<ContextMenu
@ -200,8 +200,6 @@
<q-input
v-model="txNotes"
:label="$t('fieldLabels.transactionNotes')"
:dark="theme == 'dark'"
:text-color="theme == 'dark' ? 'white' : 'dark'"
type="textarea"
rows="2"
dense
@ -225,13 +223,13 @@ const { clipboard } = require("electron");
import { mapState } from "vuex";
import { date } from "quasar";
import TxTypeIcon from "components/tx_type_icon";
import FormatLoki from "components/format_loki";
import FormatOxen from "components/format_oxen";
import ContextMenu from "components/menus/contextmenu";
export default {
name: "TxDetails",
components: {
TxTypeIcon,
FormatLoki,
FormatOxen,
ContextMenu
},
data() {
@ -327,8 +325,8 @@ export default {
label: this.$t("dialog.transactionDetails.ok"),
color: "primary"
},
dark: this.theme == "dark",
style: "min-width: 500px; overflow-wrap: break-word;"
style: "min-width: 500px; overflow-wrap: break-word;",
color: "#1F1C47"
})
.onOk(() => {})
.onCancel(() => {})

View File

@ -1,7 +1,7 @@
<template>
<div class="tx-list">
<template v-if="tx_list_paged.length === 0">
<p class="q-pa-md q-mb-none">
<p class="q-pa-md q-mb-none tab-desc">
{{ $t("strings.noTransactionsFound") }}
</p>
</template>
@ -12,12 +12,12 @@
link
no-border
:dark="theme == 'dark'"
class="loki-list tx-list"
class="oxen-list tx-list"
>
<q-item
v-for="(tx, i) in tx_list_paged"
:key="`${tx.txid}-${tx.type}-${i}`"
class="loki-list-item transaction"
class="oxen-list-item transaction"
:class="'tx-' + tx.type"
@click.native="details(tx)"
>
@ -26,7 +26,7 @@
</q-item-section>
<q-item-label class="main">
<q-item-label class="amount">
<FormatLoki :amount="tx.amount || 0" />
<FormatOxen :amount="tx.amount || 0" />
</q-item-label>
<q-item-label caption>{{ tx.txid }}</q-item-label>
</q-item-label>
@ -61,7 +61,7 @@ const { clipboard } = require("electron");
import { mapState } from "vuex";
import { QSpinnerDots } from "quasar";
import TxDetails from "components/tx_details";
import FormatLoki from "components/format_loki";
import FormatOxen from "components/format_oxen";
import { i18n } from "boot/i18n";
import ContextMenu from "components/menus/contextmenu";
@ -95,7 +95,7 @@ export default {
components: {
QSpinnerDots,
TxDetails,
FormatLoki,
FormatOxen,
ContextMenu
},
props: {
@ -328,7 +328,7 @@ export default {
<style lang="scss">
.tx-list {
.loki-list-item {
.oxen-list-item {
padding-top: 0;
padding-bottom: 0;
}

View File

@ -1,22 +1,25 @@
<template>
<div class="column wallet-info">
<div class="row justify-between items-center wallet-header loki-green">
<div class="row justify-between items-center wallet-header oxen-teal">
<div class="title">{{ info.name }}</div>
<WalletSettings />
</div>
<div class="wallet-content">
<div class="wallet-content oxen-navy">
<div class="row justify-center">
<div class="funds column items-center">
<div class="balance">
<div class="text">
<span>{{ $t("strings.lokiBalance") }}</span>
<span>{{ $t("strings.oxenBalance") }}</span>
</div>
<div class="value">
<span><FormatLoki :amount="info.balance"/></span>
<span><FormatOxen :amount="info.balance"/></span>
</div>
</div>
<div class="row unlocked">
<span>{{ $t("strings.lokiUnlockedShort") }}: <FormatLoki :amount="info.unlocked_balance"/></span>
<span
>{{ $t("strings.oxenUnlockedShort") }}:
<FormatOxen :amount="info.unlocked_balance"
/></span>
</div>
</div>
</div>
@ -30,13 +33,13 @@
<script>
import { mapState } from "vuex";
import FormatLoki from "components/format_loki";
import FormatOxen from "components/format_oxen";
import WalletSettings from "components/menus/wallet_settings";
import CopyIcon from "components/icons/copy_icon";
export default {
name: "WalletDetails",
components: {
FormatLoki,
FormatOxen,
WalletSettings,
CopyIcon
},
@ -58,7 +61,6 @@ export default {
.wallet-content {
text-align: center;
background-color: #0a0a0a;
padding: 2em;
.balance {

View File

@ -55,6 +55,7 @@ footer,
font-family: 'RobotoMono-Light', monospace
}
.break-all {
word-break: break-all
}
@ -72,7 +73,7 @@ footer,
}
}
.text-area-loki {
.text-area-oxen {
margin-top: 0px;
margin-bottom: 0px;
}
@ -100,7 +101,7 @@ footer,
}
.q-layout, .app-content {
background: $loki-black-80;
background: $oxen-light-teal;
color:white;
}
@ -138,7 +139,7 @@ footer,
}
.q-toolbar-inverted {
background: none;
background: $oxen-navy;
padding-top: 0;
}
@ -153,9 +154,9 @@ footer,
.q-tab {
text-transform: none;
&:hover {
background-color: rgba(12,12,12,0.15)
}
// &:hover {
// background-color: rgba(12,12,12,0.15)
// }
.q-icon {
font-size: 22px;
@ -196,19 +197,22 @@ footer,
.text {
font-size: 14px;
margin-top: 8px;
color: #cecece;
color: $oxen-navy;
}
.value {
font-size: 24px;
margin-top: 4px;
font-weight: 800;
color: #cecece;
font-weight:300;
font-weight: 300;
color: $oxen-navy;
}
}
}
.q-checkbox {
color: $oxen-navy
}
.q-loading + .modal {
z-index: 9999 !important;
}
@ -220,7 +224,7 @@ footer,
}
.q-footer.status-footer {
background: #000000;
background: $oxen-navy;
color: rgba(255, 255, 255, 0.51);
border-top: 1px solid #333;
padding-top: 2px;
@ -242,7 +246,7 @@ footer,
}
.ready {
color: $loki-green-solid;
color: $positive;
}
.scanning, .syncing {
@ -271,11 +275,12 @@ footer,
}
div:first-child {
background-color: $loki-green-dark-solid;
// TODO: should first and last child be different, where even is this?
background-color: $positive;
}
div:last-child {
background-color: $loki-green-solid;
background-color: $positive;
}
}
@ -315,10 +320,10 @@ footer,
.q-item.tx-snode,
.q-item.tx-gov {
.amount span {
color: #43bd43;
color: $oxen-navy;
&:before {
content: "+";
color: #43bd43;
color: $oxen-navy;
}
}
}
@ -332,11 +337,11 @@ footer,
.q-item.tx-out,
.q-item.tx-pending {
.amount span {
color: white;
// color: white;
&:before {
content: "-";
font-weight: bold;
color: white;
// color: white;
}
}
}
@ -360,24 +365,39 @@ footer,
}
.q-menu {
background: #222;
color:#cecece;
background: white;
color: $oxen-navy !important;
.q-list-separator > .q-item-division + .q-item-division, .q-item-division + .q-separator {
border-top: 1px solid #333;
}
// .q-item:hover {
// background: $oxen-teal;
// color: white;
// }
}
.menu-list {
.q-item * {
color: white;
}
background: white;
.q-item * {
color: $oxen-navy;
}
}
.context-menu-list {
min-width: 150px;
max-height: 300px;
}
.confirm-tx-card {
color: "primary";
width: 450px;
max-width: 450x;
color: $oxen-navy !important;
.confirm-list {
.q-item {
max-height: 100%;
@ -389,7 +409,7 @@ footer,
}
.label {
color: #cecece;
color: $oxen-purple;
padding-right: 6px;
}
.address-value {
@ -398,7 +418,7 @@ footer,
.confirm-send-btn {
color: white;
background: $positive;
background: $primary;
}
}
@ -407,11 +427,6 @@ footer,
background: $primary;
color: white;
max-width: 250px !important;
// padding-top: 4px;
// .q-list-separator > .q-item-division + .q-item-division, .q-item-division + .q-separator {
// border-top: 1px solid $loki-green-dark-solid;
// }
}
.modal.minimized {
@ -427,7 +442,6 @@ footer,
.modal {
color: #cecece;
background-color: $dark;
.modal-header {
margin-top: 6px;
@ -436,10 +450,6 @@ footer,
font-size: 24px;
font-weight: bold;
}
.modal-content,
.modal-body {
background: $loki-black-80;
}
.q-header {
@ -452,9 +462,22 @@ footer,
}
.q-toolbar {
background-color: $oxen-navy;
}
.header {
color: $oxen-navy;
}
.detail-page {
color: $oxen-navy;
}
.q-radio {
color: $oxen-navy;
svg {
color: #cecece;
color: $oxen-navy;
}
}
@ -463,20 +486,30 @@ footer,
color: white;
.qr-code-card {
background-color: $dark;
background-color: white;
}
}
.loki-green {
background: $loki-green;
.oxen-light-teal {
background: $oxen-light-teal;
color: white;
}
.oxen-navy {
background: $oxen-navy;
color: white;
}
.oxen-teal {
background: $oxen-teal;
color: white;
}
.startup-icons {
.solid {
color:$loki-green-solid;
color:$oxen-teal;
g,path {
fill: $loki-green-solid;
fill: $oxen-teal;
}
}
}
@ -489,12 +522,21 @@ footer,
.navigation {
.q-btn {
background: $oxen-navy;
color: white;
background: $loki-black-90;
.q-icon {
color: $oxen-teal;
}
}
.router-link-exact-active > .q-btn {
background: $loki-green;
color: $oxen-navy
background: $oxen-teal;
.q-icon {
color: $oxen-navy;
}
}
}
@ -504,22 +546,22 @@ footer,
}
.q-item {
background: $secondary;
background: $oxen-navy;
.wallet-icon {
color: $tertiary;
color: $oxen-teal;
g,path {
fill: $tertiary;
fill: $oxen-teal;
}
}
}
.q-item:hover, .q-item.selected {
background: $primary !important;
background: $oxen-purple !important;
.wallet-icon {
color:$loki-green-solid;
color: $oxen-teal;
g,path {
fill: $loki-green-solid;
fill: $oxen-teal;
}
}
@ -530,20 +572,25 @@ footer,
}
.receive {
.q-list-header {
color: #FFFFFF;
.list-header {
color: $oxen-navy;
}
.q-separator-component {
background-color: $secondary;
background-color: white;
opacity: 0.4;
}
.primary-address {
background: #3eb13e !important;
background: $oxen-teal !important;
.q-item, .q-item-side {
color: white;
.text-caption {
color: white;
}
}
.q-btn {
@ -552,46 +599,58 @@ footer,
}
.primary-address:hover {
background: $loki-green-solid !important;
background: $oxen-navy !important;
}
}
.loki-list {
.loki-list-item {
background: #313131;
.oxen-list {
.oxen-list-item {
background: white;
-webkit-transition: background-color 0.2s ease-in;
transition: background-color 0.2s ease-in;
font-size: 16px;
color: #cecece;
color: $oxen-navy;
padding-top: 6px;
padding-bottom: 6px;
margin: 0 16px;
border-radius: 3px;
+ .loki-list-item {
+ .oxen-list-item {
margin-top: 10px;
}
}
.loki-list-item:hover {
background: rgba(117,117,117,0.3);
.text-caption {
color: $oxen-navy;
}
.oxen-list-item:hover {
background: $oxen-teal;
}
}
.lns-record-list {
.q-item-label.unlocked {
color: white;
}
.record-type-title {
font-weight: bold;
margin-bottom: 40px;
padding-bottom: 40px;
color: $oxen-navy;
}
.records-group {
padding-bottom: 40px;
}
.service-node-list {
.q-item {
cursor: pointer;
background: #313131;
color: $oxen-navy;
background: white;
-webkit-transition: background-color 0.2s ease-in;
transition: background-color 0.2s ease-in;
@ -600,14 +659,25 @@ footer,
+ .q-item {
margin-top: 10px;
}
}
.q-item-sublabel {
color: $loki-black-50;
.contrib-amounts {
color: $oxen-navy;
}
}
.q-item-label {
color: $oxen-navy;
}
.q-item:hover {
background: rgba(117,117,117,0.3);
background: $oxen-navy;
color: white;
.contrib-amounts {
color: white;
}
}
}
@ -618,17 +688,26 @@ footer,
}
}
.loki-field {
.tab-desc {
color: $oxen-navy;
font-style: normal;
b {
color: $oxen-teal;
font-style: italic;
}
}
.oxen-field {
.content {
border: 1px solid #484848;
background: white;
-webkit-transition: background-color 0.2s ease-in, border-color 0.2s ease-in;
transition: background-color 0.2s ease-in, border-color 0.2s ease-in;
}
&:not(.disable):not(.disable-hover) {
.content:hover {
background: #2e2e2e;
background: white;
}
}
@ -643,7 +722,7 @@ footer,
}
.label {
color: white;
color: $oxen-navy;
.optional {
color: #7C7C7C;
@ -651,23 +730,16 @@ footer,
}
}
.service-node-registration, .prove-transaction, .check-transaction, .sign-and-verify {
.description{
color: #b7b7b7;
font-style: normal;
b {
color: white;
font-style: italic;
}
}
}
.welcome {
.q-footer {
background: $secondary
}
}
.welcome-container {
color: $oxen-navy;
}
.address-book, .address-header {
.q-item-label, .header {
color: white;
@ -683,6 +755,10 @@ footer,
}
}
.signature-dialog {
color: $oxen-navy;
}
.check-transaction {
.good {
color: #43bd43;
@ -712,3 +788,46 @@ footer,
.non-selectable {
color: #979797;
}
.created {
color: $oxen-navy;
.wallet h6 {
text-align: center;
}
.address {
text-align: center;
word-break: break-all;
}
.seed-box {
border: 1px solid white;
border-radius: 3px;
margin: 16px;
padding: 16px;
div,
h6 {
text-align: center;
}
.seed {
font-size: 24px;
font-weight: 600;
}
.warning {
color: goldenrod;
}
}
h6 {
font-size: 18px;
margin: 8px 0;
font-weight: 450;
}
.advanced-options-label {
padding-left: 0;
padding-right: 0;
}
}

View File

@ -15,9 +15,9 @@
// It"s highly recommended to change the default colors
// to match your app"s branding.
$primary = $loki-green
$secondary = $loki-black-90
$tertiary = $loki-black-80
$primary = $oxen-teal
$secondary = $oxen-light-teal
$accent = $oxen-navy
$neutral = #E0E1E2
$positive = #21BA45
@ -26,10 +26,10 @@ $info = #31CCEC
$warning = #F2C037
$loki-green = linear-gradient(180deg, #419B41 0%, #43BD43 100%)
$loki-green-solid = #5BCA5B;
$loki-green-dark-solid = #419B41;
$loki-black-90 = #0A0A0A
$loki-black-80 = #252525
$loki-black-60 = #313131
$loki-black-50 = #7E7E7E;
$oxen-navy = #1F1C47;
$oxen-teal = #12C7BA;
$oxen-light-teal = #DBF7F5;
$oxen-purple = #654192;
$loki-black-60 = #313131;

View File

@ -14,21 +14,23 @@
// It"s highly recommended to change the default colors
// to match your app"s branding.
$primary = $loki-green
$secondary = $loki-black-90
$tertiary = $loki-black-80
// $primary = $loki-green
// $secondary = $loki-black-90
// $tertiary = $loki-black-80
$neutral = #E0E1E2
$positive = #21BA45
$negative = #DB2828
$info = #31CCEC
$warning = #F2C037
// $neutral = #E0E1E2
// $positive = #21BA45
// $negative = #DB2828
// $info = #31CCEC
// $warning = #F2C037
$loki-green = linear-gradient(180deg, #419B41 0%, #43BD43 100%)
$loki-green-solid = #5BCA5B;
$loki-green-dark-solid = #419B41;
// $loki-green = linear-gradient(180deg, #419B41 0%, #43BD43 100%)
$loki-black-90 = #0A0A0A
$loki-black-80 = #252525
$loki-black-60 = #313131
$loki-black-50 = #7E7E7E;
// $oxen-navy = #1F1C47;
// $oxen-teal = #12C7BA;
// $oxen-light-teal = #DBF7F5;
// $loki-black-90 = #0A0A0A
// $loki-black-80 = #252525
// $loki-black-60 = #313131
// $loki-black-50 = #7E7E7E;

View File

@ -89,7 +89,7 @@ export class Gateway extends EventEmitter {
message: msg,
ok: {
label: i18n.t(`dialog.${key}.ok`),
color: "positive"
color: "primary"
},
cancel: {
flat: true,
@ -98,8 +98,7 @@ export class Gateway extends EventEmitter {
this.app.store.state.gateway.app.config.appearance.theme === "dark"
? "white"
: "dark"
},
dark: this.app.store.state.gateway.app.config.appearance.theme === "dark"
}
})
.onOk(() => {
this.closeDialog = false;

View File

@ -243,7 +243,7 @@ export default {
copyViewKey: "View Key kopieren",
createNewWallet: "Neue Wallet erstellen",
deleteWallet: "Wallet löschen",
exit: "Loki GUI Wallet schliessen",
exit: "Oxen GUI Wallet schliessen",
importOldGUIWallet: "Wallets von alter GUI importieren",
manageKeyImages: "Key Images verwalten",
openWallet: "Wallet öffnen",
@ -332,7 +332,7 @@ export default {
noKeyImageExport: "Keine Key Images zum Exportieren gefunden",
usingLocalNode:
"Zugang zur Remote Node nicht möglich, wechsle zur lokalen Node",
usingRemoteNode: "llokid nicht gefunden, benutze eine Remote Node"
usingRemoteNode: "loxend nicht gefunden, benutze eine Remote Node"
}
},
placeholders: {
@ -408,9 +408,9 @@ export default {
destinationUnknown: "Ziel unbekannt",
editAddressBookEntry: "Adressbucheintrag bearbeiten",
loadingSettings: "Einstellungen werden geladen",
lokiBalance: "Guthaben",
lokiUnlockedBalance: "frei verfügbares Guthaben",
lokiUnlockedShort: "frei verfügbar",
oxenBalance: "Guthaben",
oxenUnlockedBalance: "frei verfügbares Guthaben",
oxenUnlockedShort: "frei verfügbar",
noTransactionsFound: "Keine Transaktionen gefunden",
notes: "Notizen",
numberOfUnspentOutputs: "Anzahl der unspent outputs",

View File

@ -291,7 +291,7 @@ export default {
copyViewKey: "Copy view key",
createNewWallet: "Create new wallet",
deleteWallet: "Delete Wallet",
exit: "Exit Loki GUI Wallet",
exit: "Exit Oxen GUI Wallet",
importOldGUIWallet: "Import wallets from old GUI",
manageKeyImages: "Manage Key Images",
openWallet: "Open wallet",
@ -402,7 +402,7 @@ export default {
warnings: {
noKeyImageExport: "No key images found to export",
usingLocalNode: "Could not access remote node, switching to local only",
usingRemoteNode: "lokid not found, using remote node"
usingRemoteNode: "oxend not found, using remote node"
}
},
placeholders: {
@ -500,11 +500,11 @@ export default {
lnsDescription:
"Here you can find all the LNS names owned by this wallet. Decrypting a record you own will return the name and value of that LNS record.",
loadingSettings: "Loading settings",
lokiBalance: "Balance",
oxenBalance: "Balance",
lokinetNameDescription:
"Purchase or update a name on Lokinet. If you purchase a name it may take a minute or two for it to show up in the list. To learn more about lokinet visit: ",
lokiUnlockedBalance: "Unlocked balance",
lokiUnlockedShort: "Unlocked",
oxenUnlockedBalance: "Unlocked balance",
oxenUnlockedShort: "Unlocked",
me: "Me",
noTransactionsFound: "No transactions found",
notes: "Notes",

View File

@ -242,7 +242,7 @@ export default {
copyViewKey: "Copiar clave de visualización",
createNewWallet: "Crear nuevo monedero",
deleteWallet: "Eliminar monedero",
exit: "Cerrar la interfaz del monedero Loki",
exit: "Cerrar la interfaz del monedero Oxen",
importOldGUIWallet: "Importar monedero de una interfaz gráfica antigua",
manageKeyImages: "Administrar Imágenes de Clave",
openWallet: "Abrir monedero",
@ -330,7 +330,7 @@ export default {
noKeyImageExport: "No se han encontrado claves para exportar",
usingLocalNode:
"No se ha podido acceder al nodo remoto, volviendo al modo local",
usingRemoteNode: "lokid no encontrado, utilizando nodo remoto"
usingRemoteNode: "oxend no encontrado, utilizando nodo remoto"
}
},
placeholders: {
@ -403,9 +403,9 @@ export default {
destinationUnknown: "Destino Desconocido",
editAddressBookEntry: "Modificar un registro de la libreta de direcciones",
loadingSettings: "Cargando configuración",
lokiBalance: "Saldo",
lokiUnlockedBalance: "Saldo libre",
lokiUnlockedShort: "Libre",
oxenBalance: "Saldo",
oxenUnlockedBalance: "Saldo libre",
oxenUnlockedShort: "Libre",
noTransactionsFound: "No se han encontrado transacciones",
notes: "Notas",
numberOfUnspentOutputs: "Número de salidas no gastadas",
@ -431,7 +431,7 @@ export default {
seedWords: "Palabras semilla",
selectLanguage: "Escoja un idioma",
serviceNodeRegistrationDescription:
'Introduzca la orden {registerCommand} generada por el servicio (lokid) que se está intentado registrar como Nodo de Servicio usando la instrucción "{prepareCommand}"',
'Introduzca la orden {registerCommand} generada por el servicio (oxend) que se está intentado registrar como Nodo de Servicio usando la instrucción "{prepareCommand}"',
spendKey: "Clave de gasto",
startingDaemon: "Iniciando servicio",
startingWallet: "Iniciando monedero",

View File

@ -244,7 +244,7 @@ export default {
copyViewKey: "Copier la clé de visibilité",
createNewWallet: "Créer un nouveau portefeuille",
deleteWallet: "Supprimer le portefeuille",
exit: "Quitter le portefeuille Loki GUI",
exit: "Quitter le portefeuille Oxen GUI",
importOldGUIWallet: "Importer le portefeuille depuis lancien GUI",
manageKeyImages: "Gérer les images clés",
openWallet: "Ouvrir le portefeuille",
@ -334,7 +334,7 @@ export default {
noKeyImageExport: "Aucune clé image n'a été trouvé pour l'export",
usingLocalNode:
"Impossible d'accéder au nœud distant, basculement en local uniquement",
usingRemoteNode: "lokid introuvable, utilisation du nœud distant"
usingRemoteNode: "oxend introuvable, utilisation du nœud distant"
}
},
placeholders: {
@ -410,9 +410,9 @@ export default {
destinationUnknown: "Destination inconnue",
editAddressBookEntry: "Modifiez l'entrée du carnet d'adresses",
loadingSettings: "Chargement des réglages",
lokiBalance: "Solde",
lokiUnlockedBalance: "Solde débloqué",
lokiUnlockedShort: "Débloqué",
oxenBalance: "Solde",
oxenUnlockedBalance: "Solde débloqué",
oxenUnlockedShort: "Débloqué",
noTransactionsFound: "Aucune transaction trouvée",
notes: "Notes",
numberOfUnspentOutputs: "Nombre de sorties non dépensées",

View File

@ -330,7 +330,7 @@ export default {
noKeyImageExport: "Nenhuma chave de imagem encontrada para exportar",
usingLocalNode:
"Não foi possível aceder ao nódulo remoto, mudando para nódulo local apenas",
usingRemoteNode: "lokid não encontrado, utilizando nódulo remoto"
usingRemoteNode: "oxend não encontrado, utilizando nódulo remoto"
}
},
placeholders: {
@ -404,9 +404,9 @@ export default {
destinationUnknown: "Destino Desconhecido",
editAddressBookEntry: "Editar registo do livro de endereços",
loadingSettings: "Carregando configurações",
lokiBalance: "Saldo",
lokiUnlockedBalance: "Saldo desbloqueado",
lokiUnlockedShort: "Desbloqueado",
oxenBalance: "Saldo",
oxenUnlockedBalance: "Saldo desbloqueado",
oxenUnlockedShort: "Desbloqueado",
noTransactionsFound: "Nenhuma transação encontrada",
notes: "Notas",
numberOfUnspentOutputs: "Número de outputs não gastos",

View File

@ -241,7 +241,7 @@ export default {
copyViewKey: "Копировать Ключ Просмотра",
createNewWallet: "Создать новый кошелек",
deleteWallet: "Удалить Кошелек",
exit: "Закрыть Кошелек Loki",
exit: "Закрыть Кошелек Oxen",
importOldGUIWallet: "Импортировать кошельки из старого GUI",
manageKeyImages: "Управлять Ключевыми Образами",
openWallet: "Открыть кошелек",
@ -329,7 +329,7 @@ export default {
noKeyImageExport: "Не найдено ключевых образов для экспорта",
usingLocalNode:
"Не удалось подключиться к удаленной ноде, переключаемся на локальную ноду",
usingRemoteNode: "Не найден файл lokid, используется удаленная нода"
usingRemoteNode: "Не найден файл oxend, используется удаленная нода"
}
},
placeholders: {
@ -403,9 +403,9 @@ export default {
destinationUnknown: "Назначение Неизвестно",
editAddressBookEntry: "Редактировать запись адресной книги",
loadingSettings: "Загрузка настроек",
lokiBalance: "Баланс",
lokiUnlockedBalance: "Разблокированый баланс",
lokiUnlockedShort: "Разблокировано",
oxenBalance: "Баланс",
oxenUnlockedBalance: "Разблокированый баланс",
oxenUnlockedShort: "Разблокировано",
noTransactionsFound: "Транзакции не найдены",
notes: "Заметки",
numberOfUnspentOutputs: "Количество непотраченных выходов",

View File

@ -6,12 +6,24 @@
<MainMenu :disable-switch-wallet="true" />
</template>
<template v-else>
<q-btn class="cancel" icon="reply" flat round dense @click="cancel()" />
<q-btn
class="cancel"
icon="reply"
flat
round
dense
@click="cancel()"
/>
</template>
<q-toolbar-title v-if="page_title == 'Loki'" class="flex items-center justify-center">
<img src="loki.svg" height="32" />
<q-toolbar-title
v-if="page_title == 'Oxen'"
class="flex items-center justify-center"
>
<img src="oxen-white.svg" height="32" />
</q-toolbar-title>
<q-toolbar-title v-else class="flex items-center justify-center">{{ page_title }}</q-toolbar-title>
<q-toolbar-title v-else class="flex items-center justify-center">{{
page_title
}}</q-toolbar-title>
</q-toolbar>
</q-header>
@ -58,7 +70,7 @@ export default {
default:
case "wallet-select":
return "Loki";
return "Oxen";
}
}
},

View File

@ -2,9 +2,9 @@
<q-layout view="hHh Lpr lFf">
<q-header class="shift-title">
<MainMenu />
<q-toolbar-title>
<div class="flex items-center justify-center" style="margin-top:7px">
<img src="loki.svg" height="32" />
<q-toolbar-title class="oxen-light-teal">
<div class="flex items-center justify-center" style="margin:8px">
<img src="oxen.svg" height="32" />
</div>
</q-toolbar-title>
</q-header>
@ -27,16 +27,40 @@
/>
</router-link>
<router-link to="/wallet/receive">
<q-btn class="large-btn" :label="$t('buttons.receive')" size="md" icon-right="save_alt" align="between" />
<q-btn
class="large-btn"
:label="$t('buttons.receive')"
size="md"
icon-right="save_alt"
align="between"
/>
</router-link>
<router-link to="/wallet/servicenode">
<q-btn class="large-btn" :label="$t('buttons.serviceNode')" size="md" icon-right="router" align="between" />
<q-btn
class="large-btn"
:label="$t('buttons.serviceNode')"
size="md"
icon-right="router"
align="between"
/>
</router-link>
<router-link to="/wallet/lns">
<q-btn class="large-btn" :label="$t('buttons.lns')" size="md" icon-right="text_fields" align="between" />
<q-btn
class="large-btn"
:label="$t('buttons.lns')"
size="md"
icon-right="text_fields"
align="between"
/>
</router-link>
<router-link to="/wallet/advanced">
<q-btn class="large-btn" :label="$t('buttons.advanced')" size="md" icon-right="tune" align="between" />
<q-btn
class="large-btn"
:label="$t('buttons.advanced')"
size="md"
icon-right="tune"
align="between"
/>
</router-link>
<router-link to="/wallet/addressbook" class="address">
<q-btn class="single-icon" size="md" icon="person" />

View File

@ -9,9 +9,9 @@ export default {
? openContributionRemaining /
(MAX_NUMBER_OF_CONTRIBUTORS - node.contributors.length)
: 0;
const minContributionLoki = minContributionAtomicUnits / 1e9;
const minContributionOxen = minContributionAtomicUnits / 1e9;
// ceiling to 4 decimal places
return minContributionLoki.toFixed(4);
return minContributionOxen.toFixed(4);
},
openForContribution(node) {
const openContributionRemaining =
@ -20,7 +20,7 @@ export default {
: 0;
return openContributionRemaining;
},
openForContributionLoki(node) {
openForContriubtionOxen(node) {
return (this.openForContribution(node) / 1e9).toFixed(4);
}
}

View File

@ -2,7 +2,7 @@
<q-page>
<div class="init-screen-page text-center">
<div class="absolute-center">
<img src="loki.svg" width="400" class="q-mb-md" />
<img src="oxen.svg" width="400" class="q-mb-md" />
<div class="startup-icons q-mt-xl q-mb-lg">
<div ref="backend">
@ -62,10 +62,34 @@
d="M7.494,14.958 C3.361,14.958 0,11.622 0,7.52 C0,3.418 3.361,0.082 7.494,0.082 C11.627,0.082 14.989,3.418 14.989,7.52 C14.989,11.622 11.627,14.958 7.494,14.958 L7.494,14.958 Z M7.51,0.938 C3.887,0.938 0.938,3.886 0.938,7.51 C0.938,11.135 3.887,14.083 7.51,14.083 C11.135,14.083 14.083,11.135 14.083,7.51 C14.083,3.886 11.135,0.938 7.51,0.938 L7.51,0.938 Z"
class="si-glyph-fill"
></path>
<rect x="7" y="1" width="0.922" height="14.084" class="si-glyph-fill"></rect>
<rect x="0" y="7" width="13.96" height="0.922" class="si-glyph-fill"></rect>
<rect x="1" y="4" width="12.406" height="0.906" class="si-glyph-fill"></rect>
<rect x="1" y="10" width="12.406" height="0.922" class="si-glyph-fill"></rect>
<rect
x="7"
y="1"
width="0.922"
height="14.084"
class="si-glyph-fill"
></rect>
<rect
x="0"
y="7"
width="13.96"
height="0.922"
class="si-glyph-fill"
></rect>
<rect
x="1"
y="4"
width="12.406"
height="0.906"
class="si-glyph-fill"
></rect>
<rect
x="1"
y="10"
width="12.406"
height="0.922"
class="si-glyph-fill"
></rect>
<path
d="M7.317,14.854 C4.72,13.581 3.043,10.662 3.043,7.417 C3.043,4.247 4.666,1.355 7.181,0.05 L7.642,0.937 C5.455,2.074 4.043,4.617 4.043,7.417 C4.043,10.282 5.502,12.849 7.757,13.955 L7.317,14.854 L7.317,14.854 Z"
class="si-glyph-fill"
@ -112,7 +136,9 @@
{{ message }}
</div>
<div v-if="daemonStatus" class="q-mt-xs">{{ $t("strings.syncingDaemon") }}: {{ daemonStatus }}</div>
<div v-if="daemonStatus" class="q-mt-xs">
{{ $t("strings.syncingDaemon") }}: {{ daemonStatus }}
</div>
</div>
<div class="absolute-bottom">
@ -144,7 +170,10 @@ export default {
if (this.status.code < 3 || !this.isLocalDaemon) return null;
const currentHeight = this.daemon.info.height_without_bootstrap;
const targetHeight = Math.max(this.daemon.info.height, this.daemon.info.target_height);
const targetHeight = Math.max(
this.daemon.info.height,
this.daemon.info.target_height
);
const percentage = ((100 * currentHeight) / targetHeight).toFixed(1);
if (targetHeight === 0 || currentHeight >= targetHeight) return null;
@ -200,7 +229,8 @@ export default {
this.$q.notify({
type: "warning",
timeout: 2000,
message: "Warning: " + this.$t("notification.warnings.usingRemoteNode")
message:
"Warning: " + this.$t("notification.warnings.usingRemoteNode")
});
break;
case 6:
@ -224,6 +254,9 @@ export default {
</script>
<style lang="scss">
.message {
color: #1f1c47;
}
.init-screen-page {
height: 100vh;
position: relative;

View File

@ -2,7 +2,7 @@
<q-page>
<div class="init-screen-page text-center">
<div class="absolute-center">
<img src="loki.svg" width="400" class="q-mb-md" />
<img src="oxen.svg" width="400" class="q-mb-md" />
<div class="q-mt-xl q-mb-lg">
<q-spinner color="primary" :size="30" />

View File

@ -8,7 +8,7 @@
class="first-step"
>
<div class="welcome-container">
<img src="loki.svg" height="100" class="q-mb-md" />
<img src="oxen.svg" height="100" class="q-mb-md" />
<div>Wallet Version: v{{ version }}</div>
<div>Daemon Version: {{ daemonVersion }}</div>
<LanguageSelect class="q-mt-lg" @select="onLanguageSelected" />
@ -105,7 +105,6 @@ export default {
.welcome-stepper {
height: 100%;
// the Loki lighter grey is behind it
background: transparent;
}

View File

@ -1,7 +1,7 @@
<template>
<q-page class="create-wallet">
<div class="fields q-mx-md q-mt-md">
<LokiField
<OxenField
:label="$t('fieldLabels.walletName')"
:error="$v.wallet.name.$error"
>
@ -14,21 +14,20 @@
@keyup.enter="create"
@blur="$v.wallet.name.$touch"
/>
</LokiField>
</OxenField>
<LokiField :label="$t('fieldLabels.seedLanguage')">
<OxenField :label="$t('fieldLabels.seedLanguage')">
<q-select
v-model="wallet.language"
:options="languageOptions"
:dark="theme == 'dark'"
borderless
dense
emit-value
map-options
/>
</LokiField>
</OxenField>
<LokiField :label="$t('fieldLabels.password')" optional>
<OxenField :label="$t('fieldLabels.password')" optional>
<q-input
v-model="wallet.password"
type="password"
@ -38,9 +37,9 @@
dense
@keyup.enter="create"
/>
</LokiField>
</OxenField>
<LokiField :label="$t('fieldLabels.confirmPassword')">
<OxenField :label="$t('fieldLabels.confirmPassword')">
<q-input
v-model="wallet.password_confirm"
type="password"
@ -49,7 +48,7 @@
dense
@keyup.enter="create"
/>
</LokiField>
</OxenField>
<q-btn
class="submit-button"
@ -64,10 +63,10 @@
<script>
import { required } from "vuelidate/lib/validators";
import { mapState } from "vuex";
import LokiField from "components/loki_field";
import OxenField from "components/oxen_field";
export default {
components: {
LokiField
OxenField
},
data() {
const languageOptions = [

View File

@ -7,8 +7,18 @@
{{ info.address }}
</div>
<div class="q-item-side">
<q-btn color="primary" padding="xs" size="sm" icon="file_copy" @click="copyAddress">
<q-tooltip anchor="center left" self="center right" :offset="[5, 10]">
<q-btn
color="primary"
padding="xs"
size="sm"
icon="file_copy"
@click="copyAddress"
>
<q-tooltip
anchor="center left"
self="center right"
:offset="[5, 10]"
>
{{ $t("menuItems.copyAddress") }}
</q-tooltip>
</q-btn>
@ -37,7 +47,10 @@
</div>
</template>
<q-expansion-item label="Advanced" header-class="q-mt-sm non-selectable row reverse advanced-options-label">
<q-expansion-item
label="Advanced"
header-class="q-mt-sm non-selectable row reverse advanced-options-label"
>
<template v-if="secret.view_key != secret.spend_key">
<h6 class="q-mb-xs title">{{ $t("strings.viewKey") }}</h6>
<div class="row">
@ -45,8 +58,18 @@
{{ secret.view_key }}
</div>
<div class="q-item-side">
<q-btn color="primary" padding="xs" size="sm" icon="file_copy" @click="copyPrivateKey('view_key', $event)">
<q-tooltip anchor="center left" self="center right" :offset="[5, 10]">
<q-btn
color="primary"
padding="xs"
size="sm"
icon="file_copy"
@click="copyPrivateKey('view_key', $event)"
>
<q-tooltip
anchor="center left"
self="center right"
:offset="[5, 10]"
>
{{ $t("menuItems.copyViewKey") }}
</q-tooltip>
</q-btn>
@ -61,8 +84,18 @@
{{ secret.spend_key }}
</div>
<div class="q-item-side">
<q-btn color="primary" padding="xs" size="sm" icon="file_copy" @click="copyPrivateKey('spend_key', $event)">
<q-tooltip anchor="center left" self="center right" :offset="[5, 10]">
<q-btn
color="primary"
padding="xs"
size="sm"
icon="file_copy"
@click="copyPrivateKey('spend_key', $event)"
>
<q-tooltip
anchor="center left"
self="center right"
:offset="[5, 10]"
>
{{ $t("menuItems.copySpendKey") }}
</q-tooltip>
</q-btn>
@ -71,7 +104,12 @@
</template>
</q-expansion-item>
<q-btn class="q-mt-lg" color="primary" :label="$t('buttons.openWallet')" @click="open" />
<q-btn
class="q-mt-lg"
color="primary"
:label="$t('buttons.openWallet')"
@click="open"
/>
</q-page>
</template>
@ -137,9 +175,7 @@ export default {
ok: {
label: this.$t("dialog.buttons.ok"),
color: "primary"
},
color: this.theme === "dark" ? "white" : "dark",
dark: this.theme === "dark"
}
})
.onDismiss(() => null)
.onCancel(() => null)
@ -166,45 +202,4 @@ export default {
};
</script>
<style lang="scss">
.created {
.wallet h6 {
text-align: center;
}
.address {
text-align: center;
word-break: break-all;
}
.seed-box {
border: 1px solid white;
border-radius: 3px;
margin: 16px;
padding: 16px;
div,
h6 {
text-align: center;
}
.seed {
font-size: 24px;
font-weight: 600;
}
.warning {
color: goldenrod;
}
}
h6 {
font-size: 18px;
margin: 8px 0;
font-weight: 450;
}
.advanced-options-label {
padding-left: 0;
padding-right: 0;
}
}
</style>
<style lang="scss"></style>

View File

@ -1,7 +1,10 @@
<template>
<q-page>
<div class="q-mx-md import-wallet">
<LokiField :label="$t('fieldLabels.newWalletName')" :error="$v.wallet.name.$error">
<OxenField
:label="$t('fieldLabels.newWalletName')"
:error="$v.wallet.name.$error"
>
<q-input
v-model="wallet.name"
:placeholder="$t('placeholders.walletName')"
@ -11,9 +14,13 @@
@keyup.enter="import_wallet"
@blur="$v.wallet.name.$touch"
/>
</LokiField>
</OxenField>
<LokiField :label="$t('fieldLabels.walletFile')" disable-hover :error="$v.wallet.path.$error">
<OxenField
:label="$t('fieldLabels.walletFile')"
disable-hover
:error="$v.wallet.path.$error"
>
<q-input
v-model="wallet.path"
:placeholder="$t('placeholders.selectAFile')"
@ -22,16 +29,22 @@
borderless
dense
/>
<input id="walletPath" ref="fileInput" type="file" hidden @change="setWalletPath" />
<input
id="walletPath"
ref="fileInput"
type="file"
hidden
@change="setWalletPath"
/>
<q-btn
color="secondary"
:label="$t('buttons.selectWalletFile')"
:text-color="theme == 'dark' ? 'white' : 'dark'"
@click="selectFile"
/>
</LokiField>
</OxenField>
<LokiField :label="$t('fieldLabels.password')">
<OxenField :label="$t('fieldLabels.password')">
<q-input
v-model="wallet.password"
:placeholder="$t('placeholders.walletPassword')"
@ -41,9 +54,9 @@
dense
@keyup.enter="import_wallet"
/>
</LokiField>
</OxenField>
<LokiField :label="$t('fieldLabels.confirmPassword')">
<OxenField :label="$t('fieldLabels.confirmPassword')">
<q-input
v-model="wallet.password_confirm"
type="password"
@ -52,8 +65,13 @@
dense
@keyup.enter="import_wallet"
/>
</LokiField>
<q-btn class="submit-button" color="primary" :label="$tc('buttons.importWallet', 1)" @click="import_wallet" />
</OxenField>
<q-btn
class="submit-button"
color="primary"
:label="$tc('buttons.importWallet', 1)"
@click="import_wallet"
/>
</div>
</q-page>
</template>
@ -61,10 +79,10 @@
<script>
import { required } from "vuelidate/lib/validators";
import { mapState } from "vuex";
import LokiField from "components/loki_field";
import OxenField from "components/oxen_field";
export default {
components: {
LokiField
OxenField
},
data() {
return {
@ -172,7 +190,7 @@ export default {
}
}
.loki-field {
.oxen-field {
margin-top: 16px;
}
}

View File

@ -1,15 +1,30 @@
<template>
<q-page>
<q-list class="wallet-list" no-border :dark="theme == 'dark'">
<q-list
class="wallet-list oxen-light-teal"
no-border
:dark="theme == 'dark'"
>
<template v-if="wallets.list.length">
<div class="header row justify-between items-center">
<div class="header-title">
{{ $t("titles.yourWallets") }}
</div>
<q-btn v-if="wallets.list.length" class="add" icon="add" size="md" color="primary">
<q-btn
v-if="wallets.list.length"
class="add"
icon="add"
size="md"
color="primary"
>
<q-menu class="header-popover" :content-class="'header-popover'">
<q-list separator>
<q-item v-for="action in actions" :key="action.name" clickable @click.native="action.handler">
<q-item
v-for="action in actions"
:key="action.name"
clickable
@click.native="action.handler"
>
<q-item-section>
{{ action.name }}
</q-item-section>
@ -35,7 +50,12 @@
class="si-glyph si-glyph-wallet"
>
<defs class="si-glyph-fill"></defs>
<g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g
stroke="none"
stroke-width="1"
fill="none"
fill-rule="evenodd"
>
<g transform="translate(1.000000, 0.000000)" fill="#434343">
<path
d="M7.988,10.635 L7.988,8.327 C7.988,7.578 8.561,6.969 9.267,6.969 L13.964,6.969 L13.964,5.531 C13.964,4.849 13.56,4.279 13.007,4.093 L13.007,4.094 L11.356,4.08 L11.336,4.022 L3.925,4.022 L3.784,4.07 L1.17,4.068 L1.165,4.047 C0.529,4.167 0.017,4.743 0.017,5.484 L0.017,13.437 C0.017,14.269 0.665,14.992 1.408,14.992 L12.622,14.992 C13.365,14.992 13.965,14.316 13.965,13.484 L13.965,12.031 L9.268,12.031 C8.562,12.031 7.988,11.384 7.988,10.635 L7.988,10.635 Z"
@ -55,8 +75,12 @@
</q-icon>
</q-item-section>
<q-item-section>
<q-item-label class="wallet-name" caption>{{ wallet.name }}</q-item-label>
<q-item-label class="monospace ellipsis" caption>{{ wallet.address }}</q-item-label>
<q-item-label class="wallet-name" caption>{{
wallet.name
}}</q-item-label>
<q-item-label class="monospace ellipsis" caption>{{
wallet.address
}}</q-item-label>
</q-item-section>
<ContextMenu
:menu-items="menuItems"
@ -67,7 +91,11 @@
<q-separator />
</template>
<template v-else>
<q-item v-for="action in actions" :key="action.name" @click.native="action.handler">
<q-item
v-for="action in actions"
:key="action.name"
@click.native="action.handler"
>
<q-item-section>
{{ action.name }}
</q-item-section>
@ -173,15 +201,14 @@ export default {
type: "password"
},
ok: {
label: this.$t("dialog.buttons.open")
label: this.$t("dialog.buttons.open"),
color: "primary"
},
cancel: {
flat: true,
label: this.$t("dialog.buttons.cancel"),
color: this.theme == "dark" ? "white" : "dark"
label: this.$t("dialog.buttons.cancel")
},
dark: this.theme == "dark",
color: "positive"
color: "#1F1C47"
})
.onOk(password => {
this.$q.loading.show({

View File

@ -1,7 +1,7 @@
<template>
<q-page>
<div class="q-mx-md">
<LokiField
<OxenField
class="q-mt-md"
:label="$t('fieldLabels.walletName')"
:error="$v.wallet.name.$error"
@ -9,34 +9,32 @@
<q-input
v-model="wallet.name"
:placeholder="$t('placeholders.walletName')"
:dark="theme == 'dark'"
borderless
dense
@keyup.enter="restore_wallet"
@blur="$v.wallet.name.$touch"
/>
</LokiField>
</OxenField>
<LokiField
<OxenField
class="q-mt-md"
:label="$t('fieldLabels.mnemonicSeed')"
:error="$v.wallet.seed.$error"
>
<q-input
v-model="wallet.seed"
class="full-width text-area-loki"
class="full-width text-area-oxen"
:placeholder="$t('placeholders.mnemonicSeed')"
type="textarea"
:dark="theme == 'dark'"
borderless
dense
@blur="$v.wallet.seed.$touch"
/>
</LokiField>
</OxenField>
<div class="row items-end q-mt-md">
<div class="col-md-9 col-sm-8">
<LokiField
<OxenField
v-if="wallet.refresh_type == 'date'"
:label="$t('fieldLabels.restoreFromDate')"
>
@ -75,8 +73,8 @@
</q-icon>
</template>
</q-input>
</LokiField>
<LokiField
</OxenField>
<OxenField
v-else-if="wallet.refresh_type == 'height'"
:label="$t('fieldLabels.restoreFromBlockHeight')"
:error="$v.wallet.refresh_start_height.$error"
@ -90,13 +88,12 @@
dense
@blur="$v.wallet.refresh_start_height.$touch"
/>
</LokiField>
</OxenField>
</div>
<div class="col-sm-4 col-md-3">
<template v-if="wallet.refresh_type == 'date'">
<q-btn
class="restore-from-button"
:text-color="theme == 'dark' ? 'white' : 'dark'"
flat
@click="wallet.refresh_type = 'height'"
>
@ -109,7 +106,6 @@
<template v-else-if="wallet.refresh_type == 'height'">
<q-btn
class="restore-from-button"
:text-color="theme == 'dark' ? 'white' : 'dark'"
flat
@click="wallet.refresh_type = 'date'"
>
@ -122,7 +118,7 @@
</div>
</div>
<LokiField class="q-mt-md" :label="$t('fieldLabels.password')">
<OxenField class="q-mt-md" :label="$t('fieldLabels.password')">
<q-input
v-model="wallet.password"
:placeholder="$t('placeholders.walletPassword')"
@ -132,9 +128,9 @@
dense
@keyup.enter="restore_wallet"
/>
</LokiField>
</OxenField>
<LokiField class="q-mt-md" :label="$t('fieldLabels.confirmPassword')">
<OxenField class="q-mt-md" :label="$t('fieldLabels.confirmPassword')">
<q-input
v-model="wallet.password_confirm"
type="password"
@ -143,7 +139,7 @@
dense
@keyup.enter="restore_wallet"
/>
</LokiField>
</OxenField>
<q-btn
class="submit-button"
color="primary"
@ -157,7 +153,7 @@
<script>
import { required, numeric } from "vuelidate/lib/validators";
import { mapState } from "vuex";
import LokiField from "components/loki_field";
import OxenField from "components/oxen_field";
import { date } from "quasar";
import _ from "lodash";
@ -167,7 +163,7 @@ let dateFirstBlock = date.formatDate(timeStampFirstBlock, qDateFormat);
export default {
components: {
LokiField
OxenField
},
data() {
return {

View File

@ -7,11 +7,11 @@
</div>
<template v-if="address_book_combined.length">
<q-list link no-border :dark="theme == 'dark'" class="loki-list">
<q-list link no-border :dark="theme == 'dark'" class="oxen-list">
<q-item
v-for="(entry, index) in address_book_combined"
:key="`${entry.address}-${entry.name}-${index}`"
class="loki-list-item"
class="oxen-list-item"
@click.native="details(entry)"
>
<q-item-section>
@ -27,7 +27,7 @@
:name="entry.starred ? 'star' : 'star_border'"
/>
<q-btn
color="secondary"
color="primary"
style="margin-left: 10px;"
:label="$t('buttons.send')"
:disabled="view_only"
@ -45,7 +45,7 @@
</q-list>
</template>
<template v-else>
<p class="q-ma-md">{{ $t("strings.addressBookIsEmpty") }}</p>
<p class="q-ma-md tab-desc">{{ $t("strings.addressBookIsEmpty") }}</p>
</template>
<q-page-sticky position="bottom-right" :offset="[18, 18]">
@ -126,9 +126,10 @@ export default {
.header {
font-size: 14px;
font-weight: 500;
color: #1f1c47;
}
.loki-list-item {
.oxen-list-item {
cursor: pointer;
padding-top: 12px;
padding-bottom: 12px;

View File

@ -4,7 +4,7 @@
<q-btn-toggle
v-model="screen"
toggle-color="primary"
color="secondary"
color="accent"
:options="[
{ label: $t('titles.advanced.prove'), value: 'prove' },
{

View File

@ -4,7 +4,7 @@
<q-btn-toggle
v-model="screen"
toggle-color="primary"
color="secondary"
color="accent"
:options="[
{
label: $t('titles.lns.purchase'),

View File

@ -1,7 +1,9 @@
<template>
<q-page class="receive">
<q-list link no-border :dark="theme == 'dark'" class="loki-list">
<q-item-label header>{{ $t("strings.addresses.myPrimaryAddress") }}</q-item-label>
<q-list link no-border :dark="theme == 'dark'" class="oxen-list">
<q-item-label header class="list-header">{{
$t("strings.addresses.myPrimaryAddress")
}}</q-item-label>
<ReceiveItem
v-for="address in address_list.primary"
:key="address.address"
@ -15,15 +17,20 @@
/>
<template v-if="address_list.used.length">
<q-item-label header>{{ $t("strings.addresses.myUsedAddresses") }}</q-item-label>
<q-item-label header class="list-header">{{
$t("strings.addresses.myUsedAddresses")
}}</q-item-label>
<ReceiveItem
v-for="address in address_list.used"
:key="address.address"
:address="address"
:sublabel="
`${$t('strings.addresses.subAddress')} (${$t('strings.addresses.subAddressIndex', {
index: address.address_index
})})`
`${$t('strings.addresses.subAddress')} (${$t(
'strings.addresses.subAddressIndex',
{
index: address.address_index
}
)})`
"
:show-q-r="showQR"
:copy-address="copyAddress"
@ -32,15 +39,20 @@
</template>
<template v-if="address_list.unused.length">
<q-item-label header>{{ $t("strings.addresses.myUnusedAddresses") }}</q-item-label>
<q-item-label header class="list-header">{{
$t("strings.addresses.myUnusedAddresses")
}}</q-item-label>
<ReceiveItem
v-for="address in address_list.unused"
:key="address.address"
:address="address"
:sublabel="
`${$t('strings.addresses.subAddress')} (${$t('strings.addresses.subAddressIndex', {
index: address.address_index
})})`
`${$t('strings.addresses.subAddress')} (${$t(
'strings.addresses.subAddressIndex',
{
index: address.address_index
}
)})`
"
:show-q-r="showQR"
:copy-address="copyAddress"
@ -57,10 +69,18 @@
<q-card class="qr-code-card">
<div class="text-center q-mb-sm q-pa-md" style="background: white;">
<QrcodeVue ref="qr" :value="QR.address" size="240"> </QrcodeVue>
<ContextMenu :menu-items="menuItems" @copyQR="copyQR()" @saveQR="saveQR()" />
<ContextMenu
:menu-items="menuItems"
@copyQR="copyQR()"
@saveQR="saveQR()"
/>
</div>
<q-card-actions>
<q-btn color="primary" :label="$t('buttons.close')" @click="QR.visible = false" />
<q-btn
color="primary"
:label="$t('buttons.close')"
@click="QR.visible = false"
/>
</q-card-actions>
</q-card>
</q-dialog>
@ -161,7 +181,7 @@ export default {
font-weight: 400;
}
.loki-list-item {
.oxen-list-item {
cursor: pointer;
.q-item-section {

View File

@ -10,13 +10,12 @@
<div class="row gutter-md">
<!-- Amount -->
<div class="col-6 amount">
<LokiField
<OxenField
:label="$t('fieldLabels.amount')"
:error="$v.newTx.amount.$error"
>
<q-input
v-model="newTx.amount"
:dark="theme == 'dark'"
type="number"
min="0"
:max="unlocked_balance / 1e9"
@ -26,100 +25,88 @@
@blur="$v.newTx.amount.$touch"
/>
<q-btn
color="secondary"
:text-color="theme == 'dark' ? 'white' : 'dark'"
color="primary"
@click="newTx.amount = unlocked_balance / 1e9"
>
{{ $t("buttons.all") }}
</q-btn>
</LokiField>
</OxenField>
</div>
<!-- Priority -->
<div class="col-6 priority">
<LokiField :label="$t('fieldLabels.priority')">
<OxenField :label="$t('fieldLabels.priority')">
<q-select
v-model="newTx.priority"
emit-value
map-options
:dark="theme == 'dark'"
:options="priorityOptions"
borderless
dense
/>
</LokiField>
</OxenField>
</div>
</div>
<!-- Address -->
<div class="col q-mt-sm">
<LokiField
<OxenField
:label="$t('fieldLabels.address')"
:error="$v.newTx.address.$error"
>
<q-input
v-model.trim="newTx.address"
:dark="theme == 'dark'"
:placeholder="address_placeholder"
borderless
dense
@blur="$v.newTx.address.$touch"
/>
<q-btn
color="secondary"
:text-color="theme == 'dark' ? 'white' : 'dark'"
to="addressbook"
>
<q-btn color="primary" to="addressbook">
{{ $t("buttons.contacts") }}
</q-btn>
</LokiField>
</OxenField>
</div>
<!-- Notes -->
<div class="col q-mt-sm">
<LokiField :label="$t('fieldLabels.notes')" optional>
<OxenField :label="$t('fieldLabels.notes')" optional>
<q-input
v-model="newTx.note"
class="full-width text-area-loki"
class="full-width text-area-oxen"
type="textarea"
:dark="theme == 'dark'"
:placeholder="$t('placeholders.transactionNotes')"
borderless
dense
/>
</LokiField>
</OxenField>
</div>
<q-checkbox
v-model="newTx.address_book.save"
:label="$t('strings.saveToAddressBook')"
:dark="theme == 'dark'"
color="dark"
/>
<div v-if="newTx.address_book.save">
<LokiField :label="$t('fieldLabels.name')" optional>
<OxenField :label="$t('fieldLabels.name')" optional>
<q-input
v-model="newTx.address_book.name"
:dark="theme == 'dark'"
:placeholder="$t('placeholders.addressBookName')"
borderless
dense
/>
</LokiField>
<LokiField class="q-mt-sm" :label="$t('fieldLabels.notes')" optional>
</OxenField>
<OxenField class="q-mt-sm" :label="$t('fieldLabels.notes')" optional>
<q-input
v-model="newTx.address_book.description"
type="textarea"
class="full-width text-area-loki"
class="full-width text-area-oxen"
rows="2"
:dark="theme == 'dark'"
:placeholder="$t('placeholders.additionalNotes')"
borderless
dense
/>
</LokiField>
</OxenField>
</div>
<!-- div required so button below checkbox -->
<!-- div required so the button falls below the checkbox -->
<div>
<q-btn
class="send-btn"
@ -139,7 +126,7 @@
:on-confirm-transaction="onConfirmTransaction"
:on-cancel-transaction="onCancelTransaction"
/>
<q-inner-loading :showing="tx_status.sending" :dark="theme == 'dark'">
<q-inner-loading :showing="tx_status.sending">
<q-spinner color="primary" size="30" />
</q-inner-loading>
</template>
@ -150,7 +137,7 @@
import { mapState } from "vuex";
import { required, decimal } from "vuelidate/lib/validators";
import { address, greater_than_zero } from "src/validators/common";
import LokiField from "components/loki_field";
import OxenField from "components/oxen_field";
import WalletPassword from "src/mixins/wallet_password";
import ConfirmDialogMixin from "src/mixins/confirm_dialog_mixin";
import ConfirmTransactionDialog from "components/confirm_tx_dialog";
@ -161,7 +148,7 @@ const DO_NOTHING = 10;
export default {
components: {
LokiField,
OxenField,
ConfirmTransactionDialog
},
mixins: [WalletPassword, ConfirmDialogMixin],
@ -383,9 +370,7 @@ export default {
ok: {
label: this.$t("dialog.transfer.ok"),
color: "primary"
},
dark: this.theme == "dark",
color: this.theme == "dark" ? "white" : "dark"
}
});
passwordDialog
.onOk(password => {

View File

@ -4,7 +4,7 @@
<q-btn-toggle
v-model="screen"
toggle-color="primary"
color="secondary"
color="accent"
:options="[
{
label: $t('titles.serviceNode.myStakes'),

View File

@ -5,27 +5,25 @@
{{ $t("titles.transactions") }}
</div>
<LokiField class="col-5 q-px-sm" :label="$t('fieldLabels.filter')">
<OxenField class="col-5 q-px-sm" :label="$t('fieldLabels.filter')">
<q-input
v-model="tx_filter"
:dark="theme == 'dark'"
:placeholder="$t('placeholders.filterTx')"
borderless
dense
/>
</LokiField>
</OxenField>
<LokiField class="col-2" :label="$t('fieldLabels.filterTransactionType')">
<OxenField class="col-2" :label="$t('fieldLabels.filterTransactionType')">
<q-select
v-model="tx_type"
:dark="theme == 'dark'"
:options="tx_type_options"
borderless
dense
emit-value
map-options
/>
</LokiField>
</OxenField>
</div>
<TxList :type="tx_type" :filter="tx_filter" />
</q-page>
@ -34,11 +32,11 @@
<script>
import { mapState } from "vuex";
import TxList from "components/tx_list";
import LokiField from "components/loki_field";
import OxenField from "components/oxen_field";
export default {
components: {
TxList,
LokiField
OxenField
},
data() {
return {

View File

@ -1945,11 +1945,11 @@ return{_strlen:lb,_ge_mul8:Va,_keccak:db,_ge_scalarmult:Ta,_ge_fromfe_frombytes_
var lokiConfig = {
var oxenConfig = {
coinUnitPlaces: 12,
coinSymbol: 'LOKI',
coinName: 'Loki',
coinUriPrefix: 'loki:',
coinSymbol: 'OXEN',
coinName: 'Oxen',
coinUriPrefix: 'oxen:',
addressPrefix: 114,
};
@ -2386,7 +2386,7 @@ var cnUtilGen = function(initConfig) {
return this;
};
var cnUtil = cnUtilGen(lokiConfig);
var cnUtil = cnUtilGen(oxenConfig);
/*
mnemonic.js : Converts between 4-byte aligned strings and a human-readable
sequence of words. Uses 1626 common words taken from wikipedia article: