Merge branch 'spencer/page-reload' into 'master'

Fix 404 on page reload.

See merge request grassrootseconomics/cic-staff-client!19
This commit is contained in:
Blair Vanderlugt 2021-05-13 15:11:19 +00:00
commit 68e520d516
16 changed files with 109 additions and 144 deletions

View File

@ -10,7 +10,9 @@ Run `npm install -g @angular/cli` to install the angular CLI.
## Development server ## Development server
Run `npm run start:dev` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. Run `ng serve` for a local server, `npm run start:dev` for a dev server and `npm run start:prod` for a prod server..
Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files.
## Code scaffolding ## Code scaffolding
@ -22,14 +24,21 @@ Run `ng generate module module-name --route module-name --module app.module` to
## Build ## Build
set you environment variables - set these via environment variables as found in set-env.ts Run `ng build` to build the project using local configurations.
// TODO create a .env file so people don't have to set these one-by-one The build artifacts will be stored in the `dist/` directory.
Run `npm run build:dev` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `build:prod` script for a production build. Use the `npm run build:dev` script for a development build and the `npm run build:prod` script for a production build.
## PWA
The app supports Progressive Web App capabilities.
Run `npm run start:pwa` to run the project in PWA mode.
PWA mode works using production configurations.
## Running unit tests ## Running unit tests
Run `npm run test:dev` to execute the unit tests via [Karma](https://karma-runner.github.io). Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io).
## Running end-to-end tests ## Running end-to-end tests
@ -37,11 +46,19 @@ Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protrac
## Environment variables ## Environment variables
Environment variables are contained in the `.env` file. See `.env.example` for a template. Default environment variables are located in the `src/environments/` directory.
Custom environment variables are contained in the `.env` file. See `.env.example` for a template.
Default environment variables are set in the `set-env.ts` file. Custom environment variables are set via the `set-env.ts` file.
Once loaded they will be populated in the directory `src/environments/`. Once loaded they will be populated in the directory `src/environments/`.
It contains environment variables for development on `environment.ts` and production on `environment.prod.ts`. It contains environment variables for development on `environment.dev.ts` and production on `environment.prod.ts`.
## Code formatting
The system has automated code formatting using [Prettier](https://prettier.io/) and [TsLint](https://palantir.github.io/tslint/).
To view the styling rules set, check out `.prettierrc` and `tslint.json`.
Run `npm run format:lint` To perform formatting and linting of the codebase.
## Further help ## Further help

View File

@ -9,13 +9,14 @@
"build:dev": "ng build -c dev", "build:dev": "ng build -c dev",
"build:prod": "ng build --prod", "build:prod": "ng build --prod",
"start:pwa": "npm run build:prod && http-server -p 4200 dist/cic-staff-client", "start:pwa": "npm run build:prod && http-server -p 4200 dist/cic-staff-client",
"test:dev": "ng test", "test": "ng test",
"format:check": "prettier --config ./.prettierrc --list-different \"src/{app,environments,assets}/**/*.{ts,js,json,css,scss}\"", "format:check": "prettier --config ./.prettierrc --list-different \"src/{app,environments,assets}/**/*.{ts,js,json,css,scss}\"",
"format:refactor": "prettier --config ./.prettierrc --write \"src/{app,environments,assets}/**/*.{ts,js,json,css,scss}\"", "format:refactor": "prettier --config ./.prettierrc --write \"src/{app,environments,assets}/**/*.{ts,js,json,css,scss}\"",
"format:fix": "pretty-quick --staged", "format:fix": "pretty-quick --staged",
"format:lint": "npm run format:refactor && npm run lint",
"lint": "ng lint", "lint": "ng lint",
"e2e": "ng e2e", "e2e": "ng e2e",
"precommit": "format:fix && lint", "precommit": "npm run format:fix && npm run lint",
"postinstall": "node patch-webpack.js", "postinstall": "node patch-webpack.js",
"prepare": "husky install" "prepare": "husky install"
}, },

View File

@ -6,7 +6,7 @@ require('dotenv').config();
const environment = argv.environment; const environment = argv.environment;
const isProduction = environment === 'prod'; const isProduction = environment === 'prod';
const targetPath = isProduction ? `./src/environments/environment.prod.ts` : `./src/environments/environment.ts`; const targetPath = isProduction ? `./src/environments/environment.prod.ts` : `./src/environments/environment.dev.ts`;
const environmentVars = `import {NgxLoggerLevel} from 'ngx-logger'; const environmentVars = `import {NgxLoggerLevel} from 'ngx-logger';
@ -15,13 +15,13 @@ export const environment = {
bloxbergChainId: ${process.env.CIC_CHAIN_ID || 8996}, bloxbergChainId: ${process.env.CIC_CHAIN_ID || 8996},
logLevel: ${process.env.LOG_LEVEL || 'NgxLoggerLevel.ERROR'}, logLevel: ${process.env.LOG_LEVEL || 'NgxLoggerLevel.ERROR'},
serverLogLevel: ${process.env.SERVER_LOG_LEVEL || 'NgxLoggerLevel.OFF'}, serverLogLevel: ${process.env.SERVER_LOG_LEVEL || 'NgxLoggerLevel.OFF'},
loggingUrl: '${process.env.CIC_LOGGING_URL || 'http://localhost:8000'}', loggingUrl: '${process.env.CIC_LOGGING_URL || ''}',
cicMetaUrl: '${process.env.CIC_META_URL || 'https://meta.dev.grassrootseconomics.net'}', cicMetaUrl: '${process.env.CIC_META_URL || 'https://meta.dev.grassrootseconomics.net'}',
publicKeysUrl: '${process.env.CIC_KEYS_URL || 'http://localhost:8000/keys.asc'}', publicKeysUrl: '${process.env.CIC_KEYS_URL || 'https://dev.grassrootseconomics.net/.well-known/publickeys'}',
cicCacheUrl: '${process.env.CIC_CACHE_URL || 'https://cache.dev.grassrootseconomics.net'}', cicCacheUrl: '${process.env.CIC_CACHE_URL || 'https://cache.dev.grassrootseconomics.net'}',
web3Provider: '${process.env.CIC_WEB3_PROVIDER || 'ws://localhost:63546'}', web3Provider: '${process.env.CIC_WEB3_PROVIDER || 'wss://bloxberg-ws.dev.grassrootseconomics.net'}',
cicUssdUrl: '${process.env.CIC_USSD_URL || 'https://ussd.dev.grassrootseconomics.net'}', cicUssdUrl: '${process.env.CIC_USSD_URL || 'https://ussd.dev.grassrootseconomics.net'}',
registryAddress: '${process.env.CIC_REGISTRY_ADDRESS || '0x6Ca3cB14aA6F761712E1C18646AfBA4d5Ae249E8'}', registryAddress: '${process.env.CIC_REGISTRY_ADDRESS || '0xea6225212005e86a4490018ded4bf37f3e772161'}',
trustedDeclaratorAddress: '${process.env.CIC_TRUSTED_ADDRESS || '0xEb3907eCad74a0013c259D5874AE7f22DcBcC95C'}' trustedDeclaratorAddress: '${process.env.CIC_TRUSTED_ADDRESS || '0xEb3907eCad74a0013c259D5874AE7f22DcBcC95C'}'
}; };
`; `;

View File

@ -1,7 +1,7 @@
import { environment } from '@src/environments/environment'; import { environment } from '@src/environments/environment';
import Web3 from 'web3'; import Web3 from 'web3';
const abi: Array<any> = require('@src/assets/js/block-sync/data/AccountRegistry.json'); const abi: Array<any> = require('@src/assets/js/block-sync/data/AccountsIndex.json');
const web3: Web3 = new Web3(environment.web3Provider); const web3: Web3 = new Web3(environment.web3Provider);
export class AccountIndex { export class AccountIndex {
@ -20,11 +20,11 @@ export class AccountIndex {
} }
public async totalAccounts(): Promise<number> { public async totalAccounts(): Promise<number> {
return await this.contract.methods.count().call(); return await this.contract.methods.entryCount().call();
} }
public async haveAccount(address: string): Promise<boolean> { public async haveAccount(address: string): Promise<boolean> {
return (await this.contract.methods.accountIndex(address).call()) !== 0; return (await this.contract.methods.have(address).call()) !== 0;
} }
public async last(numberOfAccounts: number): Promise<Array<string>> { public async last(numberOfAccounts: number): Promise<Array<string>> {
@ -35,7 +35,7 @@ export class AccountIndex {
} }
const accounts: Array<string> = []; const accounts: Array<string> = [];
for (let i = count - 1; i > lowest; i--) { for (let i = count - 1; i > lowest; i--) {
const account: string = await this.contract.methods.accounts(i).call(); const account: string = await this.contract.methods.entry(i).call();
accounts.push(account); accounts.push(account);
} }
return accounts; return accounts;

View File

@ -1,7 +1,7 @@
import Web3 from 'web3'; import Web3 from 'web3';
import { environment } from '@src/environments/environment'; import { environment } from '@src/environments/environment';
const abi: Array<any> = require('@src/assets/js/block-sync/data/TokenUniqueSymbolIndex.json'); const abi: Array<any> = require('@src/assets/js/block-sync/data/AccountsIndex.json');
const web3: Web3 = new Web3(environment.web3Provider); const web3: Web3 = new Web3(environment.web3Provider);
export class TokenRegistry { export class TokenRegistry {

View File

@ -13,7 +13,7 @@ export class RegistryService {
registry: CICRegistry = new CICRegistry( registry: CICRegistry = new CICRegistry(
this.web3, this.web3,
environment.registryAddress, environment.registryAddress,
'CICRegistry', 'Registry',
this.fileGetter, this.fileGetter,
['../../assets/js/block-sync/data'] ['../../assets/js/block-sync/data']
); );

View File

@ -16,6 +16,7 @@ const routes: Routes = [
imports: [ imports: [
RouterModule.forRoot(routes, { RouterModule.forRoot(routes, {
preloadingStrategy: PreloadAllModules, preloadingStrategy: PreloadAllModules,
useHash: true,
}), }),
], ],
exports: [RouterModule], exports: [RouterModule],

View File

@ -8,20 +8,6 @@
"name": "AccountAdded", "name": "AccountAdded",
"type": "event" "type": "event"
}, },
{
"inputs": [{ "internalType": "uint256", "name": "_idx", "type": "uint256" }],
"name": "accounts",
"outputs": [{ "internalType": "address", "name": "", "type": "address" }],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [{ "internalType": "address", "name": "_account", "type": "address" }],
"name": "accountsIndex",
"outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
"stateMutability": "view",
"type": "function"
},
{ {
"inputs": [{ "internalType": "address", "name": "_account", "type": "address" }], "inputs": [{ "internalType": "address", "name": "_account", "type": "address" }],
"name": "add", "name": "add",
@ -30,24 +16,17 @@
"type": "function" "type": "function"
}, },
{ {
"inputs": [{ "internalType": "address", "name": "_writer", "type": "address" }], "inputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
"name": "addWriter", "name": "entry",
"outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], "outputs": [{ "internalType": "address", "name": "", "type": "address" }],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "count",
"outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
"stateMutability": "view", "stateMutability": "view",
"type": "function" "type": "function"
}, },
{ {
"inputs": [{ "internalType": "address", "name": "_writer", "type": "address" }], "inputs": [],
"name": "deleteWriter", "name": "entryCount",
"outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
"stateMutability": "nonpayable", "stateMutability": "view",
"type": "function" "type": "function"
}, },
{ {

View File

@ -1,18 +1,28 @@
[ [
{ {
"anonymous": false,
"inputs": [ "inputs": [
{ "internalType": "address", "name": "_address", "type": "address" }, { "indexed": false, "internalType": "address", "name": "_declarator", "type": "address" },
{ "indexed": false, "internalType": "address", "name": "_subject", "type": "address" },
{ "indexed": false, "internalType": "bytes32", "name": "_proof", "type": "bytes32" }
],
"name": "DeclarationAdded",
"type": "event"
},
{
"inputs": [
{ "internalType": "address", "name": "_subject", "type": "address" },
{ "internalType": "bytes32", "name": "_proof", "type": "bytes32" } { "internalType": "bytes32", "name": "_proof", "type": "bytes32" }
], ],
"name": "addDeclaration", "name": "addDeclaration",
"outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
"stateMutability": "nonpayable", "stateMutability": "nonpayable",
"type": "function" "type": "function"
}, },
{ {
"inputs": [ "inputs": [
{ "internalType": "address", "name": "_subjectAddress", "type": "address" }, { "internalType": "address", "name": "_declarator", "type": "address" },
{ "internalType": "address", "name": "_objectAddress", "type": "address" } { "internalType": "address", "name": "_subject", "type": "address" }
], ],
"name": "declaration", "name": "declaration",
"outputs": [{ "internalType": "bytes32[]", "name": "", "type": "bytes32[]" }], "outputs": [{ "internalType": "bytes32[]", "name": "", "type": "bytes32[]" }],
@ -21,7 +31,7 @@
}, },
{ {
"inputs": [ "inputs": [
{ "internalType": "address", "name": "_subjectAddress", "type": "address" }, { "internalType": "address", "name": "_declarator", "type": "address" },
{ "internalType": "uint256", "name": "_idx", "type": "uint256" } { "internalType": "uint256", "name": "_idx", "type": "uint256" }
], ],
"name": "declarationAddressAt", "name": "declarationAddressAt",
@ -30,7 +40,7 @@
"type": "function" "type": "function"
}, },
{ {
"inputs": [{ "internalType": "address", "name": "_subjectAddress", "type": "address" }], "inputs": [{ "internalType": "address", "name": "_declarator", "type": "address" }],
"name": "declarationCount", "name": "declarationCount",
"outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
"stateMutability": "view", "stateMutability": "view",
@ -38,7 +48,7 @@
}, },
{ {
"inputs": [ "inputs": [
{ "internalType": "address", "name": "_targetAddress", "type": "address" }, { "internalType": "address", "name": "_subject", "type": "address" },
{ "internalType": "uint256", "name": "_idx", "type": "uint256" } { "internalType": "uint256", "name": "_idx", "type": "uint256" }
], ],
"name": "declaratorAddressAt", "name": "declaratorAddressAt",
@ -47,7 +57,7 @@
"type": "function" "type": "function"
}, },
{ {
"inputs": [{ "internalType": "address", "name": "_objectAddress", "type": "address" }], "inputs": [{ "internalType": "address", "name": "_subject", "type": "address" }],
"name": "declaratorCount", "name": "declaratorCount",
"outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
"stateMutability": "view", "stateMutability": "view",

View File

@ -19,6 +19,17 @@
"name": "Transfer", "name": "Transfer",
"type": "event" "type": "event"
}, },
{
"anonymous": false,
"inputs": [
{ "indexed": true, "internalType": "address", "name": "_from", "type": "address" },
{ "indexed": true, "internalType": "address", "name": "_to", "type": "address" },
{ "indexed": true, "internalType": "address", "name": "_spender", "type": "address" },
{ "indexed": false, "internalType": "uint256", "name": "_value", "type": "uint256" }
],
"name": "TransferFrom",
"type": "event"
},
{ {
"inputs": [ "inputs": [
{ "internalType": "address", "name": "_owner", "type": "address" }, { "internalType": "address", "name": "_owner", "type": "address" },
@ -39,17 +50,10 @@
"stateMutability": "nonpayable", "stateMutability": "nonpayable",
"type": "function" "type": "function"
}, },
{
"inputs": [{ "internalType": "address", "name": "", "type": "address" }],
"name": "balanceOf",
"outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
"stateMutability": "view",
"type": "function"
},
{ {
"inputs": [], "inputs": [],
"name": "decimals", "name": "decimals",
"outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }], "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
"stateMutability": "view", "stateMutability": "view",
"type": "function" "type": "function"
}, },

View File

@ -5,52 +5,5 @@
"outputs": [{ "internalType": "address", "name": "", "type": "address" }], "outputs": [{ "internalType": "address", "name": "", "type": "address" }],
"stateMutability": "view", "stateMutability": "view",
"type": "function" "type": "function"
},
{
"inputs": [{ "internalType": "bytes32", "name": "_identifier", "type": "bytes32" }],
"name": "chainOf",
"outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [{ "internalType": "bytes32", "name": "_chain", "type": "bytes32" }],
"name": "configSumOf",
"outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "identifiers",
"outputs": [{ "internalType": "bytes32[]", "name": "", "type": "bytes32[]" }],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "owner",
"outputs": [{ "internalType": "address", "name": "", "type": "address" }],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "seal",
"outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{ "internalType": "bytes32", "name": "_identifier", "type": "bytes32" },
{ "internalType": "address", "name": "_address", "type": "address" },
{ "internalType": "bytes32", "name": "_chainDescriptor", "type": "bytes32" },
{ "internalType": "bytes32", "name": "_chainConfig", "type": "bytes32" }
],
"name": "set",
"outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
"stateMutability": "nonpayable",
"type": "function"
} }
] ]

View File

@ -11,6 +11,6 @@ export const environment = {
cicCacheUrl: 'https://cache.dev.grassrootseconomics.net', cicCacheUrl: 'https://cache.dev.grassrootseconomics.net',
web3Provider: 'wss://bloxberg-ws.dev.grassrootseconomics.net', web3Provider: 'wss://bloxberg-ws.dev.grassrootseconomics.net',
cicUssdUrl: 'https://ussd.dev.grassrootseconomics.net', cicUssdUrl: 'https://ussd.dev.grassrootseconomics.net',
registryAddress: '0xAf1B487491073C2d49136Db3FD87E293302CF839', registryAddress: '0xea6225212005e86a4490018ded4bf37f3e772161',
trustedDeclaratorAddress: '0xEb3907eCad74a0013c259D5874AE7f22DcBcC95C', trustedDeclaratorAddress: '0xEb3907eCad74a0013c259D5874AE7f22DcBcC95C',
}; };

View File

@ -9,7 +9,7 @@ export const environment = {
cicMetaUrl: 'https://meta.dev.grassrootseconomics.net', cicMetaUrl: 'https://meta.dev.grassrootseconomics.net',
publicKeysUrl: 'https://dev.grassrootseconomics.net/.well-known/publickeys/', publicKeysUrl: 'https://dev.grassrootseconomics.net/.well-known/publickeys/',
cicCacheUrl: 'https://cache.dev.grassrootseconomics.net', cicCacheUrl: 'https://cache.dev.grassrootseconomics.net',
web3Provider: 'ws://localhost:63546', web3Provider: 'wss://bloxberg-ws.dev.grassrootseconomics.net',
cicUssdUrl: 'https://ussd.dev.grassrootseconomics.net', cicUssdUrl: 'https://ussd.dev.grassrootseconomics.net',
registryAddress: '0xea6225212005e86a4490018ded4bf37f3e772161', registryAddress: '0xea6225212005e86a4490018ded4bf37f3e772161',
trustedDeclaratorAddress: '0xEb3907eCad74a0013c259D5874AE7f22DcBcC95C', trustedDeclaratorAddress: '0xEb3907eCad74a0013c259D5874AE7f22DcBcC95C',

View File

@ -8,34 +8,34 @@
<meta content="A fully featured admin client for managing users and transactions in the CIC network." name="description"/> <meta content="A fully featured admin client for managing users and transactions in the CIC network." name="description"/>
<meta content="Spencer Ofwiti" name="author"/> <meta content="Spencer Ofwiti" name="author"/>
<link rel="icon" type="image/x-icon" href="assets/icons/manifest-icon-512.png"> <link rel="icon" type="image/x-icon" href="assets/icons/manifest-icon-512.png">
<link rel="apple-touch-icon" href="src/assets/icons/apple-icon-180.png"> <link rel="apple-touch-icon" href="assets/icons/apple-icon-180.png">
<meta name="apple-mobile-web-app-capable" content="yes"> <meta name="apple-mobile-web-app-capable" content="yes">
<link rel="apple-touch-startup-image" href="src/assets/icons/apple-splash-2048-2732.jpg" media="(device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"> <link rel="apple-touch-startup-image" href="assets/icons/apple-splash-2048-2732.jpg" media="(device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)">
<link rel="apple-touch-startup-image" href="src/assets/icons/apple-splash-2732-2048.jpg" media="(device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)"> <link rel="apple-touch-startup-image" href="assets/icons/apple-splash-2732-2048.jpg" media="(device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)">
<link rel="apple-touch-startup-image" href="src/assets/icons/apple-splash-1668-2388.jpg" media="(device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"> <link rel="apple-touch-startup-image" href="assets/icons/apple-splash-1668-2388.jpg" media="(device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)">
<link rel="apple-touch-startup-image" href="src/assets/icons/apple-splash-2388-1668.jpg" media="(device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)"> <link rel="apple-touch-startup-image" href="assets/icons/apple-splash-2388-1668.jpg" media="(device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)">
<link rel="apple-touch-startup-image" href="src/assets/icons/apple-splash-1536-2048.jpg" media="(device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"> <link rel="apple-touch-startup-image" href="assets/icons/apple-splash-1536-2048.jpg" media="(device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)">
<link rel="apple-touch-startup-image" href="src/assets/icons/apple-splash-2048-1536.jpg" media="(device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)"> <link rel="apple-touch-startup-image" href="assets/icons/apple-splash-2048-1536.jpg" media="(device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)">
<link rel="apple-touch-startup-image" href="src/assets/icons/apple-splash-1668-2224.jpg" media="(device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"> <link rel="apple-touch-startup-image" href="assets/icons/apple-splash-1668-2224.jpg" media="(device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)">
<link rel="apple-touch-startup-image" href="src/assets/icons/apple-splash-2224-1668.jpg" media="(device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)"> <link rel="apple-touch-startup-image" href="assets/icons/apple-splash-2224-1668.jpg" media="(device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)">
<link rel="apple-touch-startup-image" href="src/assets/icons/apple-splash-1620-2160.jpg" media="(device-width: 810px) and (device-height: 1080px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"> <link rel="apple-touch-startup-image" href="assets/icons/apple-splash-1620-2160.jpg" media="(device-width: 810px) and (device-height: 1080px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)">
<link rel="apple-touch-startup-image" href="src/assets/icons/apple-splash-2160-1620.jpg" media="(device-width: 810px) and (device-height: 1080px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)"> <link rel="apple-touch-startup-image" href="assets/icons/apple-splash-2160-1620.jpg" media="(device-width: 810px) and (device-height: 1080px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)">
<link rel="apple-touch-startup-image" href="src/assets/icons/apple-splash-1284-2778.jpg" media="(device-width: 428px) and (device-height: 926px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)"> <link rel="apple-touch-startup-image" href="assets/icons/apple-splash-1284-2778.jpg" media="(device-width: 428px) and (device-height: 926px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)">
<link rel="apple-touch-startup-image" href="src/assets/icons/apple-splash-2778-1284.jpg" media="(device-width: 428px) and (device-height: 926px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)"> <link rel="apple-touch-startup-image" href="assets/icons/apple-splash-2778-1284.jpg" media="(device-width: 428px) and (device-height: 926px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)">
<link rel="apple-touch-startup-image" href="src/assets/icons/apple-splash-1170-2532.jpg" media="(device-width: 390px) and (device-height: 844px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)"> <link rel="apple-touch-startup-image" href="assets/icons/apple-splash-1170-2532.jpg" media="(device-width: 390px) and (device-height: 844px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)">
<link rel="apple-touch-startup-image" href="src/assets/icons/apple-splash-2532-1170.jpg" media="(device-width: 390px) and (device-height: 844px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)"> <link rel="apple-touch-startup-image" href="assets/icons/apple-splash-2532-1170.jpg" media="(device-width: 390px) and (device-height: 844px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)">
<link rel="apple-touch-startup-image" href="src/assets/icons/apple-splash-1125-2436.jpg" media="(device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)"> <link rel="apple-touch-startup-image" href="assets/icons/apple-splash-1125-2436.jpg" media="(device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)">
<link rel="apple-touch-startup-image" href="src/assets/icons/apple-splash-2436-1125.jpg" media="(device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)"> <link rel="apple-touch-startup-image" href="assets/icons/apple-splash-2436-1125.jpg" media="(device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)">
<link rel="apple-touch-startup-image" href="src/assets/icons/apple-splash-1242-2688.jpg" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)"> <link rel="apple-touch-startup-image" href="assets/icons/apple-splash-1242-2688.jpg" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)">
<link rel="apple-touch-startup-image" href="src/assets/icons/apple-splash-2688-1242.jpg" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)"> <link rel="apple-touch-startup-image" href="assets/icons/apple-splash-2688-1242.jpg" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)">
<link rel="apple-touch-startup-image" href="src/assets/icons/apple-splash-828-1792.jpg" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"> <link rel="apple-touch-startup-image" href="assets/icons/apple-splash-828-1792.jpg" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)">
<link rel="apple-touch-startup-image" href="src/assets/icons/apple-splash-1792-828.jpg" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)"> <link rel="apple-touch-startup-image" href="assets/icons/apple-splash-1792-828.jpg" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)">
<link rel="apple-touch-startup-image" href="src/assets/icons/apple-splash-1242-2208.jpg" media="(device-width: 414px) and (device-height: 736px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)"> <link rel="apple-touch-startup-image" href="assets/icons/apple-splash-1242-2208.jpg" media="(device-width: 414px) and (device-height: 736px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)">
<link rel="apple-touch-startup-image" href="src/assets/icons/apple-splash-2208-1242.jpg" media="(device-width: 414px) and (device-height: 736px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)"> <link rel="apple-touch-startup-image" href="assets/icons/apple-splash-2208-1242.jpg" media="(device-width: 414px) and (device-height: 736px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)">
<link rel="apple-touch-startup-image" href="src/assets/icons/apple-splash-750-1334.jpg" media="(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"> <link rel="apple-touch-startup-image" href="assets/icons/apple-splash-750-1334.jpg" media="(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)">
<link rel="apple-touch-startup-image" href="src/assets/icons/apple-splash-1334-750.jpg" media="(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)"> <link rel="apple-touch-startup-image" href="assets/icons/apple-splash-1334-750.jpg" media="(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)">
<link rel="apple-touch-startup-image" href="src/assets/icons/apple-splash-640-1136.jpg" media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"> <link rel="apple-touch-startup-image" href="assets/icons/apple-splash-640-1136.jpg" media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)">
<link rel="apple-touch-startup-image" href="src/assets/icons/apple-splash-1136-640.jpg" media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)"> <link rel="apple-touch-startup-image" href="assets/icons/apple-splash-1136-640.jpg" media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/css/bootstrap.min.css" integrity="sha384-TX8t27EcRE3e/ihU7zmQxVncDAy5uIKz4rEkgIXeMed4M0jlfIDPvg6uqKI2xXr2" crossorigin="anonymous"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/css/bootstrap.min.css" integrity="sha384-TX8t27EcRE3e/ihU7zmQxVncDAy5uIKz4rEkgIXeMed4M0jlfIDPvg6uqKI2xXr2" crossorigin="anonymous">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" integrity="sha384-wvfXpqpZZVQGK6TAh5PVlGOfQNHSoD2xbE+QkPxCAFlNEevoEH3Sl0sibVcOQVnN" crossorigin="anonymous"> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" integrity="sha384-wvfXpqpZZVQGK6TAh5PVlGOfQNHSoD2xbE+QkPxCAFlNEevoEH3Sl0sibVcOQVnN" crossorigin="anonymous">
<link href="https://fonts.googleapis.com/css?family=Roboto:300,400,500&amp;display=swap" rel="stylesheet"> <link href="https://fonts.googleapis.com/css?family=Roboto:300,400,500&amp;display=swap" rel="stylesheet">

View File

@ -19,13 +19,13 @@
], ],
"icons": [ "icons": [
{ {
"src": "src/assets/icons/manifest-icon-192.png", "src": "assets/icons/manifest-icon-192.png",
"sizes": "192x192", "sizes": "192x192",
"type": "image/png", "type": "image/png",
"purpose": "maskable any" "purpose": "maskable any"
}, },
{ {
"src": "src/assets/icons/manifest-icon-512.png", "src": "assets/icons/manifest-icon-512.png",
"sizes": "512x512", "sizes": "512x512",
"type": "image/png", "type": "image/png",
"purpose": "maskable any" "purpose": "maskable any"