forked from trent_larson/crowd-funder-for-time-pwa
Compare commits
18 Commits
gifted-cam
...
035f2a5b04
| Author | SHA1 | Date | |
|---|---|---|---|
| 035f2a5b04 | |||
| 09dccc34d6 | |||
| ca240ab795 | |||
| 01b5ca6ec8 | |||
| 6f49260c1e | |||
| 38f44771e9 | |||
| 7ce00b86e8 | |||
| 5e771e4a24 | |||
| 4dd2c044d5 | |||
| 3bfd54362e | |||
|
|
b6e344a15e | ||
|
|
3d1c46aef8 | ||
| ce05f7d003 | |||
| 313cd79e60 | |||
| 121991b53a | |||
| a230506d96 | |||
| c49c55d394 | |||
|
|
a5c3600673 |
@@ -1,4 +1,4 @@
|
|||||||
# Only the variables that start with VUE_APP_ are seen in the application process.env in Vue.
|
# Only the variables that start with VITE_ are seen in the application process.env in Vue.
|
||||||
VUE_APP_BVC_MEETUPS_PROJECT_CLAIM_ID=https://endorser.ch/entity/01GXYPFF7FA03NXKPYY142PY4H
|
VITE_BVC_MEETUPS_PROJECT_CLAIM_ID=https://endorser.ch/entity/01GXYPFF7FA03NXKPYY142PY4H
|
||||||
VUE_APP_DEFAULT_ENDORSER_API_SERVER=https://api.endorser.ch
|
VITE_DEFAULT_ENDORSER_API_SERVER=https://api.endorser.ch
|
||||||
VUE_APP_DEFAULT_IMAGE_API_SERVER=https://image-api.timesafari.app
|
VITE_DEFAULT_IMAGE_API_SERVER=https://image-api.timesafari.app
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ module.exports = {
|
|||||||
root: true,
|
root: true,
|
||||||
env: {
|
env: {
|
||||||
node: true,
|
node: true,
|
||||||
|
es2022: true,
|
||||||
},
|
},
|
||||||
extends: [
|
extends: [
|
||||||
"plugin:vue/vue3-essential",
|
"plugin:vue/vue3-essential",
|
||||||
@@ -9,9 +10,9 @@ module.exports = {
|
|||||||
"@vue/typescript/recommended",
|
"@vue/typescript/recommended",
|
||||||
"plugin:prettier/recommended",
|
"plugin:prettier/recommended",
|
||||||
],
|
],
|
||||||
parserOptions: {
|
// parserOptions: {
|
||||||
ecmaVersion: 2020,
|
// ecmaVersion: 2020,
|
||||||
},
|
// },
|
||||||
rules: {
|
rules: {
|
||||||
"no-console": process.env.NODE_ENV === "production" ? "warn" : "off",
|
"no-console": process.env.NODE_ENV === "production" ? "warn" : "off",
|
||||||
"no-debugger": process.env.NODE_ENV === "production" ? "warn" : "off",
|
"no-debugger": process.env.NODE_ENV === "production" ? "warn" : "off",
|
||||||
|
|||||||
@@ -10,14 +10,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
- Nothing
|
- Nothing
|
||||||
|
|
||||||
|
|
||||||
## [0.3.2] - 2024.03.17
|
## [0.3.4] - 2024.03.21
|
||||||
### Added
|
### Added
|
||||||
- Photo on gift record
|
- Photo on gift records
|
||||||
### Fixed
|
### Fixed
|
||||||
- Environment variable for BVC meetings project
|
- Environment variable for BVC meetings project
|
||||||
|
- Environment variables and build enhancements for test vs prod
|
||||||
### Changed in DB or environment
|
### Changed in DB or environment
|
||||||
- New environment variable for image API server
|
- New environment variable for image API server
|
||||||
- Test that a new browser session will get the right default API.
|
- Test that a new browser session will get the right default APIs.
|
||||||
- Test that a new browser session will send the right BVC meetings project.
|
- Test that a new browser session will send the right BVC meetings project.
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -18,6 +18,11 @@ npm install
|
|||||||
|
|
||||||
### Compiles and hot-reloads for development
|
### Compiles and hot-reloads for development
|
||||||
```
|
```
|
||||||
|
npm run dev
|
||||||
|
```
|
||||||
|
|
||||||
|
### Builds the production app
|
||||||
|
```
|
||||||
npm run serve
|
npm run serve
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -42,7 +47,7 @@ npm run lint
|
|||||||
```
|
```
|
||||||
# (See .env.development for more details.)
|
# (See .env.development for more details.)
|
||||||
# The test BVC_MEETUPS_PROJECT_CLAIM_ID does not resolve as a URL because it's only in the test DB and the prod redirect won't redirect there.
|
# The test BVC_MEETUPS_PROJECT_CLAIM_ID does not resolve as a URL because it's only in the test DB and the prod redirect won't redirect there.
|
||||||
APP_TITLE="TimeSafari_Test" VUE_APP_BVC_MEETUPS_PROJECT_CLAIM_ID=https://endorser.ch/entity/01HNTZYJJXTGT0EZS3VEJGX7AK VUE_APP_DEFAULT_ENDORSER_API_SERVER=https://test-api.endorser.ch VUE_APP_DEFAULT_IMAGE_API_SERVER=https://test-image-api.timesafari.app npm run build
|
TIME_SAFARI_APP_TITLE="TimeSafari_Test" VITE_BVC_MEETUPS_PROJECT_CLAIM_ID=https://endorser.ch/entity/01HNTZYJJXTGT0EZS3VEJGX7AK VITE_DEFAULT_ENDORSER_API_SERVER=https://test-api.endorser.ch VITE_DEFAULT_IMAGE_API_SERVER=https://test-image-api.timesafari.app npm run build
|
||||||
```
|
```
|
||||||
|
|
||||||
* Production
|
* Production
|
||||||
@@ -51,7 +56,7 @@ APP_TITLE="TimeSafari_Test" VUE_APP_BVC_MEETUPS_PROJECT_CLAIM_ID=https://endorse
|
|||||||
npm run build
|
npm run build
|
||||||
```
|
```
|
||||||
|
|
||||||
* Get on the server and back up the DB and the time-safari folder.
|
* Get on the server and back up 3 DBs and the time-safari folder.
|
||||||
|
|
||||||
* `rsync -azvu -e "ssh -i ~/.ssh/..." dist ubuntutest@test.timesafari.app:time-safari`
|
* `rsync -azvu -e "ssh -i ~/.ssh/..." dist ubuntutest@test.timesafari.app:time-safari`
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +0,0 @@
|
|||||||
module.exports = {
|
|
||||||
presets: ["@vue/cli-plugin-babel/preset"],
|
|
||||||
};
|
|
||||||
17
index.html
Normal file
17
index.html
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||||
|
<link rel="icon" href="/favicon.ico">
|
||||||
|
<title>TimeSafari</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<noscript>
|
||||||
|
<strong>We're sorry but TimeSafari doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
|
||||||
|
</noscript>
|
||||||
|
<div id="app"></div>
|
||||||
|
<script type="module" src="/src/main.ts"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
15681
package-lock.json
generated
15681
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
104
package.json
104
package.json
@@ -1,95 +1,89 @@
|
|||||||
{
|
{
|
||||||
"name": "TimeSafari",
|
"name": "TimeSafari",
|
||||||
"version": "0.3.2",
|
"version": "0.3.4",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"serve": "vue-cli-service serve",
|
"dev": "vite",
|
||||||
"build": "vue-cli-service build",
|
"serve": "vite preview",
|
||||||
"lint": "vue-cli-service lint"
|
"build": "vite build",
|
||||||
|
"lint": "eslint --ext .js,.ts,.vue --ignore-path .gitignore --fix src"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@dicebear/collection": "^5.3.5",
|
"@dicebear/collection": "^5.4.1",
|
||||||
"@dicebear/core": "^5.3.5",
|
"@dicebear/core": "^5.4.1",
|
||||||
"@ethersproject/hdnode": "^5.7.0",
|
"@ethersproject/hdnode": "^5.7.0",
|
||||||
"@fortawesome/fontawesome-svg-core": "^6.4.2",
|
"@fortawesome/fontawesome-svg-core": "^6.5.1",
|
||||||
"@fortawesome/free-solid-svg-icons": "^6.4.2",
|
"@fortawesome/free-solid-svg-icons": "^6.5.1",
|
||||||
"@fortawesome/vue-fontawesome": "^3.0.3",
|
"@fortawesome/vue-fontawesome": "^3.0.6",
|
||||||
"@pvermeer/dexie-encrypted-addon": "^3.0.0",
|
"@pvermeer/dexie-encrypted-addon": "^3.0.0",
|
||||||
"@tweenjs/tween.js": "^21.0.0",
|
"@tweenjs/tween.js": "^21.1.1",
|
||||||
"@types/js-yaml": "^4.0.9",
|
"@types/js-yaml": "^4.0.9",
|
||||||
"@types/luxon": "^3.4.2",
|
"@types/luxon": "^3.4.2",
|
||||||
"@veramo/core": "^5.4.1",
|
"@veramo/core": "^5.6.0",
|
||||||
"@veramo/credential-w3c": "^5.4.1",
|
"@veramo/credential-w3c": "^5.6.0",
|
||||||
"@veramo/data-store": "^5.4.1",
|
"@veramo/data-store": "^5.6.0",
|
||||||
"@veramo/did-manager": "^5.4.1",
|
"@veramo/did-manager": "^5.6.0",
|
||||||
"@veramo/did-provider-ethr": "^5.4.1",
|
"@veramo/did-provider-ethr": "^5.6.0",
|
||||||
"@veramo/did-resolver": "^5.4.1",
|
"@veramo/did-resolver": "^5.6.0",
|
||||||
"@veramo/key-manager": "^5.4.1",
|
"@veramo/key-manager": "^5.6.0",
|
||||||
"@vueuse/core": "^10.4.1",
|
"@vueuse/core": "^10.9.0",
|
||||||
"@zxing/text-encoding": "^0.9.0",
|
"@zxing/text-encoding": "^0.9.0",
|
||||||
"axios": "^1.5.0",
|
"axios": "^1.6.8",
|
||||||
"buffer": "^6.0.3",
|
|
||||||
"class-transformer": "^0.5.1",
|
"class-transformer": "^0.5.1",
|
||||||
"core-js": "^3.32.1",
|
"dexie": "^3.2.7",
|
||||||
"dexie": "^3.2.4",
|
"dexie-export-import": "^4.1.1",
|
||||||
"dexie-export-import": "^4.0.7",
|
"did-jwt": "^7.4.7",
|
||||||
"did-jwt": "^7.2.7",
|
"ethereum-cryptography": "^2.1.3",
|
||||||
"ethereum-cryptography": "^2.1.2",
|
|
||||||
"ethereumjs-util": "^7.1.5",
|
"ethereumjs-util": "^7.1.5",
|
||||||
"ethr-did-resolver": "^8.1.2",
|
"ethr-did-resolver": "^8.1.2",
|
||||||
"git-describe": "^4.1.1",
|
"git-describe": "^4.1.1",
|
||||||
"jdenticon": "^3.2.0",
|
"jdenticon": "^3.2.0",
|
||||||
"js-generate-password": "^0.1.9",
|
"js-generate-password": "^0.1.9",
|
||||||
"js-yaml": "^4.1.0",
|
"js-yaml": "^4.1.0",
|
||||||
"localstorage-slim": "^2.5.0",
|
"localstorage-slim": "^2.7.0",
|
||||||
"luxon": "^3.4.4",
|
"luxon": "^3.4.4",
|
||||||
"merkletreejs": "^0.3.11",
|
"merkletreejs": "^0.3.11",
|
||||||
"moment": "^2.29.4",
|
"moment": "^2.30.1",
|
||||||
"notiwind": "^2.0.2",
|
"notiwind": "^2.0.2",
|
||||||
"papaparse": "^5.4.1",
|
"papaparse": "^5.4.1",
|
||||||
"pina": "^0.20.2204228",
|
"pina": "^0.20.2204228",
|
||||||
"pinia-plugin-persistedstate": "^3.2.0",
|
"pinia-plugin-persistedstate": "^3.2.1",
|
||||||
"qr-code-generator-vue3": "^1.4.21",
|
"qr-code-generator-vue3": "^1.4.21",
|
||||||
"ramda": "^0.29.0",
|
"ramda": "^0.29.1",
|
||||||
"readable-stream": "^4.4.2",
|
"readable-stream": "^4.5.2",
|
||||||
"reflect-metadata": "^0.1.13",
|
"reflect-metadata": "^0.1.14",
|
||||||
"register-service-worker": "^1.7.2",
|
"register-service-worker": "^1.7.2",
|
||||||
"simple-vue-camera": "^1.1.3",
|
"simple-vue-camera": "^1.1.3",
|
||||||
"three": "^0.156.1",
|
"three": "^0.156.1",
|
||||||
"ua-parser-js": "^1.0.37",
|
"ua-parser-js": "^1.0.37",
|
||||||
"util": "^0.12.5",
|
"util": "^0.12.5",
|
||||||
"vue": "^3.3.4",
|
"vue": "^3.4.21",
|
||||||
"vue-axios": "^3.5.2",
|
"vue-axios": "^3.5.2",
|
||||||
"vue-facing-decorator": "^3.0.2",
|
"vue-facing-decorator": "^3.0.4",
|
||||||
"vue-qrcode-reader": "^5.4.1",
|
"vue-qrcode-reader": "^5.5.3",
|
||||||
"vue-router": "^4.2.4",
|
"vue-router": "^4.3.0",
|
||||||
"web-did-resolver": "^2.0.27"
|
"web-did-resolver": "^2.0.27"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/leaflet": "^1.9.4",
|
"@types/leaflet": "^1.9.8",
|
||||||
"@types/ramda": "^0.29.3",
|
"@types/ramda": "^0.29.11",
|
||||||
"@types/three": "^0.155.1",
|
"@types/three": "^0.155.1",
|
||||||
"@types/ua-parser-js": "^0.7.39",
|
"@types/ua-parser-js": "^0.7.39",
|
||||||
"@typescript-eslint/eslint-plugin": "^6.6.0",
|
"@typescript-eslint/eslint-plugin": "^6.21.0",
|
||||||
"@typescript-eslint/parser": "^6.6.0",
|
"@typescript-eslint/parser": "^6.21.0",
|
||||||
|
"@vitejs/plugin-vue": "^5.0.4",
|
||||||
"@vue-leaflet/vue-leaflet": "^0.10.1",
|
"@vue-leaflet/vue-leaflet": "^0.10.1",
|
||||||
"@vue/cli-plugin-babel": "~5.0.8",
|
|
||||||
"@vue/cli-plugin-eslint": "~5.0.8",
|
|
||||||
"@vue/cli-plugin-pwa": "~5.0.8",
|
|
||||||
"@vue/cli-plugin-router": "~5.0.8",
|
|
||||||
"@vue/cli-plugin-typescript": "~5.0.8",
|
|
||||||
"@vue/cli-plugin-vuex": "~5.0.8",
|
|
||||||
"@vue/cli-service": "~5.0.8",
|
|
||||||
"@vue/eslint-config-typescript": "^11.0.3",
|
"@vue/eslint-config-typescript": "^11.0.3",
|
||||||
"autoprefixer": "^10.4.15",
|
"autoprefixer": "^10.4.19",
|
||||||
"eslint": "^8.53.0",
|
"eslint": "^8.57.0",
|
||||||
"eslint-config-prettier": "^9.0.0",
|
"eslint-config-prettier": "^9.1.0",
|
||||||
"eslint-plugin-prettier": "^5.0.0",
|
"eslint-plugin-prettier": "^5.1.3",
|
||||||
"eslint-plugin-vue": "^9.17.0",
|
"eslint-plugin-vue": "^9.23.0",
|
||||||
"leaflet": "^1.9.4",
|
"leaflet": "^1.9.4",
|
||||||
"postcss": "^8.4.29",
|
"postcss": "^8.4.38",
|
||||||
"prettier": "^3.1.0",
|
"prettier": "^3.2.5",
|
||||||
"tailwindcss": "^3.3.3",
|
"tailwindcss": "^3.4.1",
|
||||||
"typescript": "~5.2.2"
|
"typescript": "~5.2.2",
|
||||||
|
"vite": "^5.2.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,15 +1,24 @@
|
|||||||
|
|
||||||
tasks :
|
tasks :
|
||||||
|
|
||||||
|
- bug - landscape doesn't show full camera
|
||||||
|
- bug - got blank screen and errors on iPhone with no bottom tabs
|
||||||
|
- add to readme - check version, close tabs & restart phone if necessary
|
||||||
- bug maybe - a new give remembers the previous project
|
- bug maybe - a new give remembers the previous project
|
||||||
- alert & stop if give amount < 0
|
- alert & stop if give amount < 0
|
||||||
|
- add warning that all data (except ID) is public
|
||||||
- onboarding video
|
- onboarding video
|
||||||
|
- .2 when adding a claim on home screen, push that claim to the top of the list
|
||||||
|
|
||||||
|
- 24 allow a person record with interests, including location; purpose? contact methods? enhance other connections the same? (suggestion from Philippines) assignee-group:ui
|
||||||
|
|
||||||
- .1 on feed, don't show "to someone anonymous" if it's to a project
|
- .1 on feed, don't show "to someone anonymous" if it's to a project
|
||||||
- .1 on ideas, put an "x" to close it
|
- .1 on ideas, put an "x" to close it assignee-group:ui
|
||||||
|
- 16 save data backups in Google
|
||||||
|
- 16 generate and use passkeys for identities
|
||||||
|
|
||||||
- .2 fix give dialog from "more contacts" off home page to allow giving to this user
|
- .2 fix give dialog from "more contacts" off home page to allow giving to this user
|
||||||
- .2 fix bottom of project selection map, where the icons are hidden but a tap goes to the icon's page
|
- .2 fix bottom of project selection map, where the icons are hidden but a tap goes to the icon's page assignee-group:ui
|
||||||
- .5 stop from seeing an error on the first page when browser doesn't support service workers (which I've seen on iPhone; visible in Firefox private window)
|
- .5 stop from seeing an error on the first page when browser doesn't support service workers (which I've seen on iPhone; visible in Firefox private window)
|
||||||
- .2 don't show a warning on a totally new project when the authorized agent is set
|
- .2 don't show a warning on a totally new project when the authorized agent is set
|
||||||
- .2 anchor hash into BTC
|
- .2 anchor hash into BTC
|
||||||
@@ -27,9 +36,9 @@ tasks :
|
|||||||
|
|
||||||
- 24 compelling UI for statistics (eg. World?)
|
- 24 compelling UI for statistics (eg. World?)
|
||||||
|
|
||||||
- 01 in the feed, group by project or contact or topic or time/$ (via BC)
|
- 01 in the feed, group by project or contact or topic or time/$ (via BC); new projects, offers, search area, etc assignee-group:ui
|
||||||
- 01 separate not-on-platform vs totally anonymous; terminology "unidentified"?
|
- 01 separate not-on-platform vs totally anonymous; terminology "unidentified"?
|
||||||
- .2 add links between projects
|
- .2 add links between projects assignee-group:ui
|
||||||
- 24 make the contact browsing on the front page something that invites more action
|
- 24 make the contact browsing on the front page something that invites more action
|
||||||
|
|
||||||
- .5 change server plan & project endpoints to use jwtId as identifier rather than rowid
|
- .5 change server plan & project endpoints to use jwtId as identifier rather than rowid
|
||||||
@@ -55,7 +64,7 @@ tasks :
|
|||||||
- .1 hide project-create button on project page if not registered
|
- .1 hide project-create button on project page if not registered
|
||||||
- .1 hide offer & give buttons on project list page if not registered
|
- .1 hide offer & give buttons on project list page if not registered
|
||||||
- .1 add cursor-pointer on the icons for giving on the project page, and on the list of projects on the discover page
|
- .1 add cursor-pointer on the icons for giving on the project page, and on the list of projects on the discover page
|
||||||
- .2 record when InfiniteScroll hits the end of the list and don't trigger any more loads
|
- .2 record when InfiniteScroll hits the end of the list and don't trigger any more loads (feed, project list, give & offer lists)
|
||||||
|
|
||||||
- bug - turning notifications on from the help screen did not stay, though account screen toggle did stay (From Jason on iPhone.)
|
- bug - turning notifications on from the help screen did not stay, though account screen toggle did stay (From Jason on iPhone.)
|
||||||
- refactor - supply the projectId to the OfferDialog just like we do with the GiftedDialog offerId (in the "open" method, maybe as well as an attribute)
|
- refactor - supply the projectId to the OfferDialog just like we do with the GiftedDialog offerId (in the "open" method, maybe as well as an attribute)
|
||||||
@@ -68,11 +77,9 @@ tasks :
|
|||||||
- 01 show my VCs - most interesting, or via search
|
- 01 show my VCs - most interesting, or via search
|
||||||
- 04 allow user to download & prove chains of VCs, mine + ones I can see about me from others
|
- 04 allow user to download & prove chains of VCs, mine + ones I can see about me from others
|
||||||
|
|
||||||
- show feed of offers, new projects, etc -- maybe limited to my search area
|
|
||||||
|
|
||||||
- revenue to support server operation
|
- revenue to support server operation
|
||||||
|
|
||||||
- copy button for seed
|
- .1 copy button for seed
|
||||||
- .5 If notifications are not enabled, add message to front page with link/button to enable
|
- .5 If notifications are not enabled, add message to front page with link/button to enable
|
||||||
- make server endpoint for full English description of limits
|
- make server endpoint for full English description of limits
|
||||||
- create a help-desk document & add screenshots
|
- create a help-desk document & add screenshots
|
||||||
@@ -119,6 +126,7 @@ tasks :
|
|||||||
- .5 show seed phrase in a QR code for transfer to another device
|
- .5 show seed phrase in a QR code for transfer to another device
|
||||||
- .5 on DiscoverView, switch to a filter UI (eg. just from friend
|
- .5 on DiscoverView, switch to a filter UI (eg. just from friend
|
||||||
- .5 don't show "Offer" on project screen if they aren't registered
|
- .5 don't show "Offer" on project screen if they aren't registered
|
||||||
|
- 01 especially for iOS, check for new version & update, eg. https://stackoverflow.com/questions/52221805/any-way-yet-to-auto-update-or-just-clear-the-cache-on-a-pwa-on-ios
|
||||||
|
|
||||||
- 24 Move to Vite
|
- 24 Move to Vite
|
||||||
- 32 accept images for projects
|
- 32 accept images for projects
|
||||||
|
|||||||
@@ -1,17 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html lang="">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
|
||||||
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
|
||||||
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
|
|
||||||
<title><%= htmlWebpackPlugin.options.title %></title>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<noscript>
|
|
||||||
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
|
|
||||||
</noscript>
|
|
||||||
<div id="app"></div>
|
|
||||||
<!-- built files will be auto injected -->
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,9 +1,8 @@
|
|||||||
|
@import url('https://fonts.googleapis.com/css2?family=Work+Sans:ital,wght@0,300;0,400;0,500;0,600;0,700;1,300;1,400;1,500;1,600;1,700&display=swap');
|
||||||
@tailwind base;
|
@tailwind base;
|
||||||
@tailwind components;
|
@tailwind components;
|
||||||
@tailwind utilities;
|
@tailwind utilities;
|
||||||
|
|
||||||
@import url('https://fonts.googleapis.com/css2?family=Work+Sans:ital,wght@0,300;0,400;0,500;0,600;0,700;1,300;1,400;1,500;1,600;1,700&display=swap');
|
|
||||||
|
|
||||||
@layer base {
|
@layer base {
|
||||||
html {
|
html {
|
||||||
font-family: 'Work Sans', ui-sans-serif, system-ui, sans-serif !important;
|
font-family: 'Work Sans', ui-sans-serif, system-ui, sans-serif !important;
|
||||||
|
|||||||
@@ -61,13 +61,13 @@
|
|||||||
Sign & Send to publish to the world
|
Sign & Send to publish to the world
|
||||||
</p>
|
</p>
|
||||||
<button
|
<button
|
||||||
class="block w-full text-center text-lg font-bold uppercase bg-blue-600 text-white px-2 py-3 rounded-md mb-2"
|
class="block w-full text-center text-lg font-bold uppercase bg-gradient-to-b from-blue-400 to-blue-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-2 py-3 rounded-md mb-2"
|
||||||
@click="confirm"
|
@click="confirm"
|
||||||
>
|
>
|
||||||
Sign & Send
|
Sign & Send
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
class="block w-full text-center text-md uppercase bg-slate-500 text-white px-1.5 py-2 rounded-md"
|
class="block w-full text-center text-md uppercase bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-1.5 py-2 rounded-md"
|
||||||
@click="cancel"
|
@click="cancel"
|
||||||
>
|
>
|
||||||
Cancel
|
Cancel
|
||||||
|
|||||||
@@ -1,18 +1,15 @@
|
|||||||
<template>
|
<template>
|
||||||
<div v-if="visible" class="dialog-overlay z-[60]">
|
<div v-if="visible" class="dialog-overlay z-[60]">
|
||||||
<!-- Breadcrumb -->
|
|
||||||
<div class="dialog relative">
|
<div class="dialog relative">
|
||||||
<!-- Back -->
|
|
||||||
<div class="text-lg text-center font-light relative z-50">
|
<div class="text-lg text-center font-light relative z-50">
|
||||||
<!-- Heading -->
|
<div
|
||||||
<h1
|
|
||||||
id="ViewHeading"
|
id="ViewHeading"
|
||||||
class="text-center font-bold absolute top-0 left-0 right-0 px-4 py-2 bg-black/50 text-white leading-none"
|
class="text-center font-bold absolute top-0 left-0 right-0 px-4 py-2 bg-black/50 text-white leading-none"
|
||||||
>
|
>
|
||||||
<span v-if="uploading"> Uploading... </span>
|
<span v-if="uploading"> Uploading... </span>
|
||||||
<span v-else-if="blob"> Look Good? </span>
|
<span v-else-if="blob"> Look Good? </span>
|
||||||
<span v-else> Say "Cheese"! </span>
|
<span v-else> Say "Cheese"! </span>
|
||||||
</h1>
|
</div>
|
||||||
|
|
||||||
<div
|
<div
|
||||||
class="text-lg text-center p-2 leading-none absolute right-0 top-0 text-white"
|
class="text-lg text-center p-2 leading-none absolute right-0 top-0 text-white"
|
||||||
@@ -31,18 +28,20 @@
|
|||||||
>
|
>
|
||||||
<button
|
<button
|
||||||
@click="uploadImage"
|
@click="uploadImage"
|
||||||
class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-full"
|
class="bg-gradient-to-b from-blue-400 to-blue-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white font-bold py-2 px-4 rounded-md"
|
||||||
>
|
>
|
||||||
<span>Upload</span>
|
<span>Upload</span>
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
@click="retryImage"
|
@click="retryImage"
|
||||||
class="bg-slate-500 hover:bg-slate-700 text-white font-bold py-2 px-4 rounded-full"
|
class="bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white font-bold py-2 px-4 rounded-md"
|
||||||
>
|
>
|
||||||
<span>Retry</span>
|
<span>Retry</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<img :src="URL.createObjectURL(blob)" class="mt-2 w-full" />
|
<div class="flex justify-center">
|
||||||
|
<img :src="URL.createObjectURL(blob)" class="mt-2 rounded" />
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-else>
|
<div v-else>
|
||||||
<!--
|
<!--
|
||||||
@@ -53,7 +52,6 @@
|
|||||||
<div
|
<div
|
||||||
class="absolute portrait:bottom-0 portrait:left-0 portrait:right-0 landscape:right-0 landscape:top-0 landscape:bottom-0 flex landscape:flex-row justify-center items-center portrait:pb-2 landscape:pr-4"
|
class="absolute portrait:bottom-0 portrait:left-0 portrait:right-0 landscape:right-0 landscape:top-0 landscape:bottom-0 flex landscape:flex-row justify-center items-center portrait:pb-2 landscape:pr-4"
|
||||||
>
|
>
|
||||||
<!-- Button -->
|
|
||||||
<button
|
<button
|
||||||
@click="takeImage"
|
@click="takeImage"
|
||||||
class="bg-blue-500 hover:bg-blue-700 text-white font-bold p-3 rounded-full text-2xl leading-none"
|
class="bg-blue-500 hover:bg-blue-700 text-white font-bold p-3 rounded-full text-2xl leading-none"
|
||||||
@@ -85,6 +83,9 @@ export default class GiftedPhotoDialog extends Vue {
|
|||||||
activeDid = "";
|
activeDid = "";
|
||||||
blob: Blob | null = null;
|
blob: Blob | null = null;
|
||||||
setImage: (arg: string) => void = () => {};
|
setImage: (arg: string) => void = () => {};
|
||||||
|
imageHeight?: number = window.innerHeight / 2;
|
||||||
|
imageWidth?: number = window.innerWidth / 2;
|
||||||
|
imageWarning = ".";
|
||||||
uploading = false;
|
uploading = false;
|
||||||
visible = false;
|
visible = false;
|
||||||
|
|
||||||
@@ -112,17 +113,64 @@ export default class GiftedPhotoDialog extends Vue {
|
|||||||
|
|
||||||
open(setImageFn: (arg: string) => void) {
|
open(setImageFn: (arg: string) => void) {
|
||||||
this.visible = true;
|
this.visible = true;
|
||||||
|
const bottomNav = document.querySelector("#QuickNav") as HTMLElement;
|
||||||
|
if (bottomNav) {
|
||||||
|
bottomNav.style.display = "none";
|
||||||
|
}
|
||||||
this.setImage = setImageFn;
|
this.setImage = setImageFn;
|
||||||
}
|
}
|
||||||
|
|
||||||
close() {
|
close() {
|
||||||
this.visible = false;
|
this.visible = false;
|
||||||
|
const bottomNav = document.querySelector("#QuickNav") as HTMLElement;
|
||||||
|
if (bottomNav) {
|
||||||
|
bottomNav.style.display = "";
|
||||||
|
}
|
||||||
this.blob = null;
|
this.blob = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
async takeImage(/* payload: MouseEvent */) {
|
async takeImage(/* payload: MouseEvent */) {
|
||||||
const cameraComponent = this.$refs.camera as InstanceType<typeof Camera>;
|
const cameraComponent = this.$refs.camera as InstanceType<typeof Camera>;
|
||||||
this.blob = await cameraComponent?.snapshot(); // png is default; if that changes, change extension in formData.append
|
|
||||||
|
/**
|
||||||
|
* This logic to set the image height & width correctly.
|
||||||
|
* Without it, the portrait orientation ends up with an image that is stretched horizontally.
|
||||||
|
* Note that it's the same with raw browser Javascript; see the "drawImage" example below.
|
||||||
|
* Now that I've done it, I can't explain why it works.
|
||||||
|
*/
|
||||||
|
let imageHeight = cameraComponent?.resolution?.height;
|
||||||
|
let imageWidth = cameraComponent?.resolution?.width;
|
||||||
|
const initialImageRatio = imageWidth / imageHeight;
|
||||||
|
const windowRatio = window.innerWidth / window.innerHeight;
|
||||||
|
if (initialImageRatio > 1 && windowRatio < 1) {
|
||||||
|
// the image is wider than it is tall, and the window is taller than it is wide
|
||||||
|
// For some reason, mobile in portrait orientation renders a horizontally-stretched image.
|
||||||
|
// We're gonna force it opposite.
|
||||||
|
imageHeight = cameraComponent?.resolution?.width;
|
||||||
|
imageWidth = cameraComponent?.resolution?.height;
|
||||||
|
} else if (initialImageRatio < 1 && windowRatio > 1) {
|
||||||
|
// the image is taller than it is wide, and the window is wider than it is tall
|
||||||
|
// Haven't seen this happen, but we'll do it just in case.
|
||||||
|
imageHeight = cameraComponent?.resolution?.width;
|
||||||
|
imageWidth = cameraComponent?.resolution?.height;
|
||||||
|
}
|
||||||
|
const newImageRatio = imageWidth / imageHeight;
|
||||||
|
if (newImageRatio < windowRatio) {
|
||||||
|
// the image is a taller ratio than the window, so fit the height first
|
||||||
|
imageHeight = window.innerHeight / 2;
|
||||||
|
imageWidth = imageHeight * newImageRatio;
|
||||||
|
} else {
|
||||||
|
// the image is a wider ratio than the window, so fit the width first
|
||||||
|
imageWidth = window.innerWidth / 2;
|
||||||
|
imageHeight = imageWidth / newImageRatio;
|
||||||
|
}
|
||||||
|
|
||||||
|
// The resolution is only necessary because of that mobile portrait-orientation case.
|
||||||
|
// The mobile emulation in a browser shows something stretched vertically, but real devices work fine.
|
||||||
|
this.blob = await cameraComponent?.snapshot({
|
||||||
|
height: imageHeight,
|
||||||
|
width: imageWidth,
|
||||||
|
}); // png is default; if that changes, change extension in formData.append
|
||||||
if (!this.blob) {
|
if (!this.blob) {
|
||||||
this.$notify(
|
this.$notify(
|
||||||
{
|
{
|
||||||
@@ -141,6 +189,54 @@ export default class GiftedPhotoDialog extends Vue {
|
|||||||
this.blob = null;
|
this.blob = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/****
|
||||||
|
|
||||||
|
Here's an approach to photo capture without a library. It has similar quirks.
|
||||||
|
Now that we've fixed styling for simple-vue-camera, it's not critical to refactor. Maybe someday.
|
||||||
|
|
||||||
|
<button id="start-camera" @click="cameraClicked">Start Camera</button>
|
||||||
|
<video id="video" width="320" height="240" autoplay></video>
|
||||||
|
<button id="snap-photo" @click="photoSnapped">Snap Photo</button>
|
||||||
|
<canvas id="canvas" width="320" height="240"></canvas>
|
||||||
|
|
||||||
|
async cameraClicked() {
|
||||||
|
console.log("camera_button clicked");
|
||||||
|
const video = document.querySelector("#video");
|
||||||
|
const stream = await navigator.mediaDevices.getUserMedia({
|
||||||
|
video: true,
|
||||||
|
audio: false,
|
||||||
|
});
|
||||||
|
if (video instanceof HTMLVideoElement) {
|
||||||
|
video.srcObject = stream;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
photoSnapped() {
|
||||||
|
console.log("snap_photo clicked");
|
||||||
|
const video = document.querySelector("#video");
|
||||||
|
const canvas = document.querySelector("#canvas");
|
||||||
|
if (
|
||||||
|
canvas instanceof HTMLCanvasElement &&
|
||||||
|
video instanceof HTMLVideoElement
|
||||||
|
) {
|
||||||
|
canvas
|
||||||
|
?.getContext("2d")
|
||||||
|
?.drawImage(video, 0, 0, canvas.width, canvas.height);
|
||||||
|
// ... or set the blob:
|
||||||
|
// canvas?.toBlob(
|
||||||
|
// (blob) => {
|
||||||
|
// this.blob = blob;
|
||||||
|
// },
|
||||||
|
// "image/jpeg",
|
||||||
|
// 1,
|
||||||
|
// );
|
||||||
|
|
||||||
|
// data url of the image
|
||||||
|
const image_data_url = canvas?.toDataURL("image/jpeg");
|
||||||
|
console.log(image_data_url);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
****/
|
||||||
|
|
||||||
async uploadImage() {
|
async uploadImage() {
|
||||||
this.uploading = true;
|
this.uploading = true;
|
||||||
const identifier = await getIdentity(this.activeDid);
|
const identifier = await getIdentity(this.activeDid);
|
||||||
|
|||||||
@@ -33,7 +33,7 @@
|
|||||||
<span class="flex justify-between">
|
<span class="flex justify-between">
|
||||||
<span />
|
<span />
|
||||||
<button
|
<button
|
||||||
class="text-center bg-slate-500 text-white px-1.5 py-2 rounded-md mt-4"
|
class="text-center bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-1.5 py-2 rounded-md mt-4"
|
||||||
@click="nextIdeaPastContacts()"
|
@click="nextIdeaPastContacts()"
|
||||||
>
|
>
|
||||||
Skip Contacts <fa icon="forward" />
|
Skip Contacts <fa icon="forward" />
|
||||||
@@ -52,7 +52,7 @@
|
|||||||
</span>
|
</span>
|
||||||
</span>
|
</span>
|
||||||
<button
|
<button
|
||||||
class="block w-full text-center text-md uppercase bg-slate-500 text-white px-1.5 py-2 rounded-md mt-4"
|
class="block w-full text-center text-md uppercase bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-1.5 py-2 rounded-md mt-4"
|
||||||
@click="cancel"
|
@click="cancel"
|
||||||
>
|
>
|
||||||
That's it!
|
That's it!
|
||||||
|
|||||||
@@ -51,13 +51,13 @@
|
|||||||
Sign & Send to publish to the world
|
Sign & Send to publish to the world
|
||||||
</p>
|
</p>
|
||||||
<button
|
<button
|
||||||
class="block w-full text-center text-lg font-bold uppercase bg-blue-600 text-white px-2 py-3 rounded-md mb-2"
|
class="block w-full text-center text-lg font-bold uppercase bg-gradient-to-b from-blue-400 to-blue-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-2 py-3 rounded-md mb-2"
|
||||||
@click="confirm"
|
@click="confirm"
|
||||||
>
|
>
|
||||||
Sign & Send
|
Sign & Send
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
class="block w-full text-center text-md uppercase bg-slate-500 text-white px-1.5 py-2 rounded-md"
|
class="block w-full text-center text-md uppercase bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-1.5 py-2 rounded-md"
|
||||||
@click="cancel"
|
@click="cancel"
|
||||||
>
|
>
|
||||||
Cancel
|
Cancel
|
||||||
|
|||||||
@@ -20,11 +20,11 @@ export enum AppString {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export const DEFAULT_ENDORSER_API_SERVER =
|
export const DEFAULT_ENDORSER_API_SERVER =
|
||||||
process.env.VUE_APP_DEFAULT_ENDORSER_API_SERVER ||
|
import.meta.env.VITE_DEFAULT_ENDORSER_API_SERVER ||
|
||||||
AppString.TEST_ENDORSER_API_SERVER;
|
AppString.TEST_ENDORSER_API_SERVER;
|
||||||
|
|
||||||
export const DEFAULT_IMAGE_API_SERVER =
|
export const DEFAULT_IMAGE_API_SERVER =
|
||||||
process.env.VUE_APP_DEFAULT_IMAGE_API_SERVER ||
|
import.meta.env.VITE_DEFAULT_IMAGE_API_SERVER ||
|
||||||
AppString.TEST_IMAGE_API_SERVER;
|
AppString.TEST_IMAGE_API_SERVER;
|
||||||
|
|
||||||
export const DEFAULT_PUSH_SERVER =
|
export const DEFAULT_PUSH_SERVER =
|
||||||
|
|||||||
@@ -113,7 +113,7 @@ export const sign = async (privateKeyHex: string) => {
|
|||||||
* The SimpleSigner returns a configured function for signing data.
|
* The SimpleSigner returns a configured function for signing data.
|
||||||
*
|
*
|
||||||
* @example
|
* @example
|
||||||
* const signer = SimpleSigner(process.env.PRIVATE_KEY)
|
* const signer = SimpleSigner(import.meta.env.PRIVATE_KEY)
|
||||||
* signer(data, (err, signature) => {
|
* signer(data, (err, signature) => {
|
||||||
* ...
|
* ...
|
||||||
* })
|
* })
|
||||||
|
|||||||
@@ -794,7 +794,7 @@ export const claimSpecialDescription = (
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const BVC_MEETUPS_PROJECT_CLAIM_ID =
|
export const BVC_MEETUPS_PROJECT_CLAIM_ID =
|
||||||
process.env.VUE_APP_BVC_MEETUPS_PROJECT_CLAIM_ID ||
|
import.meta.env.VITE_BVC_MEETUPS_PROJECT_CLAIM_ID ||
|
||||||
"https://endorser.ch/entity/01HNTZYJJXTGT0EZS3VEJGX7AK"; // this won't resolve as a URL on production; it's a URN only found in the test system
|
"https://endorser.ch/entity/01HNTZYJJXTGT0EZS3VEJGX7AK"; // this won't resolve as a URL on production; it's a URN only found in the test system
|
||||||
|
|
||||||
export const bvcMeetingJoinClaim = (did: string, startTime: string) => {
|
export const bvcMeetingJoinClaim = (did: string, startTime: string) => {
|
||||||
|
|||||||
@@ -12,9 +12,6 @@ import { deriveAddress, generateSeed, newIdentifier } from "@/libs/crypto";
|
|||||||
import { GenericServerRecord, containsHiddenDid } from "@/libs/endorserServer";
|
import { GenericServerRecord, containsHiddenDid } from "@/libs/endorserServer";
|
||||||
import * as serverUtil from "@/libs/endorserServer";
|
import * as serverUtil from "@/libs/endorserServer";
|
||||||
|
|
||||||
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
||||||
const Buffer = require("buffer/").Buffer;
|
|
||||||
|
|
||||||
// If you edit this, check that the numbers still line up on the side in the alert (on mobile, too),
|
// If you edit this, check that the numbers still line up on the side in the alert (on mobile, too),
|
||||||
// and make sure they can take all actions while the notification shows.
|
// and make sure they can take all actions while the notification shows.
|
||||||
export const ONBOARD_MESSAGE =
|
export const ONBOARD_MESSAGE =
|
||||||
@@ -238,6 +235,19 @@ export const generateSaveAndActivateIdentity = async (): Promise<string> => {
|
|||||||
return newId.did;
|
return newId.did;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
function getBase64(subscription: PushSubscription, key: PushEncryptionKeyName) {
|
||||||
|
const buffer = subscription.getKey(key);
|
||||||
|
if (!buffer) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
const value = Buffer.from(buffer);
|
||||||
|
return value
|
||||||
|
.toString("base64")
|
||||||
|
.replace(/\+/g, "-")
|
||||||
|
.replace(/\//g, "_")
|
||||||
|
.replace(/=+$/, "");
|
||||||
|
}
|
||||||
|
|
||||||
export const sendTestThroughPushServer = async (
|
export const sendTestThroughPushServer = async (
|
||||||
subscription: PushSubscription,
|
subscription: PushSubscription,
|
||||||
skipFilter: boolean,
|
skipFilter: boolean,
|
||||||
@@ -254,18 +264,8 @@ export const sendTestThroughPushServer = async (
|
|||||||
// Use something other than "Daily Update" https://gitea.anomalistdesign.com/trent_larson/py-push-server/src/commit/3c0e196c11bc98060ec5934e99e7dbd591b5da4d/app.py#L213
|
// Use something other than "Daily Update" https://gitea.anomalistdesign.com/trent_larson/py-push-server/src/commit/3c0e196c11bc98060ec5934e99e7dbd591b5da4d/app.py#L213
|
||||||
const DIRECT_PUSH_TITLE = "DIRECT_NOTIFICATION";
|
const DIRECT_PUSH_TITLE = "DIRECT_NOTIFICATION";
|
||||||
|
|
||||||
const auth = Buffer.from(subscription.getKey("auth"));
|
const authB64 = getBase64(subscription, "auth");
|
||||||
const authB64 = auth
|
const p256dhB64 = getBase64(subscription, "p256dh");
|
||||||
.toString("base64")
|
|
||||||
.replace(/\+/g, "-")
|
|
||||||
.replace(/\//g, "_")
|
|
||||||
.replace(/=+$/, "");
|
|
||||||
const p256dh = Buffer.from(subscription.getKey("p256dh"));
|
|
||||||
const p256dhB64 = p256dh
|
|
||||||
.toString("base64")
|
|
||||||
.replace(/\+/g, "-")
|
|
||||||
.replace(/\//g, "_")
|
|
||||||
.replace(/=+$/, "");
|
|
||||||
const newPayload = {
|
const newPayload = {
|
||||||
endpoint: subscription.endpoint,
|
endpoint: subscription.endpoint,
|
||||||
keys: {
|
keys: {
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
import { register } from "register-service-worker";
|
import { register } from "register-service-worker";
|
||||||
|
|
||||||
if (process.env.NODE_ENV === "production") {
|
if (import.meta.env.NODE_ENV === "production") {
|
||||||
register("/sw_scripts-combined.js", {
|
register("/sw_scripts-combined.js", {
|
||||||
ready() {
|
ready() {
|
||||||
console.log(
|
console.log(
|
||||||
|
|||||||
@@ -31,221 +31,154 @@ const routes: Array<RouteRecordRaw> = [
|
|||||||
{
|
{
|
||||||
path: "/account",
|
path: "/account",
|
||||||
name: "account",
|
name: "account",
|
||||||
component: () =>
|
component: () => import("../views/AccountViewView.vue"),
|
||||||
import(/* webpackChunkName: "account" */ "../views/AccountViewView.vue"),
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/claim/:id?",
|
path: "/claim/:id?",
|
||||||
name: "claim",
|
name: "claim",
|
||||||
component: () =>
|
component: () => import("../views/ClaimView.vue"),
|
||||||
import(/* webpackChunkName: "claim" */ "../views/ClaimView.vue"),
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/confirm-contact",
|
path: "/confirm-contact",
|
||||||
name: "confirm-contact",
|
name: "confirm-contact",
|
||||||
component: () =>
|
component: () => import("../views/ConfirmContactView.vue"),
|
||||||
import(
|
|
||||||
/* webpackChunkName: "confirm-contact" */ "../views/ConfirmContactView.vue"
|
|
||||||
),
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/contact-amounts",
|
path: "/contact-amounts",
|
||||||
name: "contact-amounts",
|
name: "contact-amounts",
|
||||||
component: () =>
|
component: () => import("../views/ContactAmountsView.vue"),
|
||||||
import(
|
|
||||||
/* webpackChunkName: "contact-amounts" */ "../views/ContactAmountsView.vue"
|
|
||||||
),
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/contact-gives",
|
path: "/contact-gives",
|
||||||
name: "contact-gives",
|
name: "contact-gives",
|
||||||
component: () =>
|
component: () => import("../views/ContactGiftingView.vue"),
|
||||||
import(
|
|
||||||
/* webpackChunkName: "contact-gives" */ "../views/ContactGiftingView.vue"
|
|
||||||
),
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/contact-qr",
|
path: "/contact-qr",
|
||||||
name: "contact-qr",
|
name: "contact-qr",
|
||||||
component: () =>
|
component: () => import("../views/ContactQRScanShowView.vue"),
|
||||||
import(
|
|
||||||
/* webpackChunkName: "contact-qr" */ "../views/ContactQRScanShowView.vue"
|
|
||||||
),
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/contacts",
|
path: "/contacts",
|
||||||
name: "contacts",
|
name: "contacts",
|
||||||
component: () =>
|
component: () => import("../views/ContactsView.vue"),
|
||||||
import(/* webpackChunkName: "contacts" */ "../views/ContactsView.vue"),
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/discover",
|
path: "/discover",
|
||||||
name: "discover",
|
name: "discover",
|
||||||
component: () =>
|
component: () => import("../views/DiscoverView.vue"),
|
||||||
import(/* webpackChunkName: "discover" */ "../views/DiscoverView.vue"),
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/gifted-details",
|
path: "/gifted-details",
|
||||||
name: "gifted-details",
|
name: "gifted-details",
|
||||||
component: () =>
|
component: () => import("../views/GiftedDetails.vue"),
|
||||||
import(
|
|
||||||
/* webpackChunkName: "gifted-details" */ "../views/GiftedDetails.vue"
|
|
||||||
),
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/help",
|
path: "/help",
|
||||||
name: "help",
|
name: "help",
|
||||||
component: () =>
|
component: () => import("../views/HelpView.vue"),
|
||||||
import(/* webpackChunkName: "help" */ "../views/HelpView.vue"),
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/",
|
path: "/",
|
||||||
name: "home",
|
name: "home",
|
||||||
component: () =>
|
component: () => import("../views/HomeView.vue"),
|
||||||
import(/* webpackChunkName: "home" */ "../views/HomeView.vue"),
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/help-notifications",
|
path: "/help-notifications",
|
||||||
name: "help-notifications",
|
name: "help-notifications",
|
||||||
component: () =>
|
component: () => import("../views/HelpNotificationsView.vue"),
|
||||||
import(
|
|
||||||
/* webpackChunkName: "help-notifications" */ "../views/HelpNotificationsView.vue"
|
|
||||||
),
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/identity-switcher",
|
path: "/identity-switcher",
|
||||||
name: "identity-switcher",
|
name: "identity-switcher",
|
||||||
component: () =>
|
component: () => import("../views/IdentitySwitcherView.vue"),
|
||||||
import(
|
|
||||||
/* webpackChunkName: "identity-switcher" */ "../views/IdentitySwitcherView.vue"
|
|
||||||
),
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/import-account",
|
path: "/import-account",
|
||||||
name: "import-account",
|
name: "import-account",
|
||||||
component: () =>
|
component: () => import("../views/ImportAccountView.vue"),
|
||||||
import(
|
|
||||||
/* webpackChunkName: "import-account" */ "../views/ImportAccountView.vue"
|
|
||||||
),
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/import-derive",
|
path: "/import-derive",
|
||||||
name: "import-derive",
|
name: "import-derive",
|
||||||
component: () =>
|
component: () => import("../views/ImportDerivedAccountView.vue"),
|
||||||
import(
|
|
||||||
/* webpackChunkName: "import-derive" */ "../views/ImportDerivedAccountView.vue"
|
|
||||||
),
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/new-edit-account",
|
path: "/new-edit-account",
|
||||||
name: "new-edit-account",
|
name: "new-edit-account",
|
||||||
component: () =>
|
component: () => import("../views/NewEditAccountView.vue"),
|
||||||
import(
|
|
||||||
/* webpackChunkName: "new-edit-account" */ "../views/NewEditAccountView.vue"
|
|
||||||
),
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/new-edit-project",
|
path: "/new-edit-project",
|
||||||
name: "new-edit-project",
|
name: "new-edit-project",
|
||||||
component: () =>
|
component: () => import("../views/NewEditProjectView.vue"),
|
||||||
import(
|
|
||||||
/* webpackChunkName: "new-edit-project" */ "../views/NewEditProjectView.vue"
|
|
||||||
),
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/new-identifier",
|
path: "/new-identifier",
|
||||||
name: "new-identifier",
|
name: "new-identifier",
|
||||||
component: () =>
|
component: () => import("../views/NewIdentifierView.vue"),
|
||||||
import(
|
|
||||||
/* webpackChunkName: "new-identifier" */ "../views/NewIdentifierView.vue"
|
|
||||||
),
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/project/:id?",
|
path: "/project/:id?",
|
||||||
name: "project",
|
name: "project",
|
||||||
component: () =>
|
component: () => import("../views/ProjectViewView.vue"),
|
||||||
import(/* webpackChunkName: "project" */ "../views/ProjectViewView.vue"),
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/projects",
|
path: "/projects",
|
||||||
name: "projects",
|
name: "projects",
|
||||||
component: () =>
|
component: () => import("../views/ProjectsView.vue"),
|
||||||
import(/* webpackChunkName: "projects" */ "../views/ProjectsView.vue"),
|
|
||||||
beforeEnter: enterOrStart,
|
beforeEnter: enterOrStart,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/quick-action-bvc",
|
path: "/quick-action-bvc",
|
||||||
name: "quick-action-bvc",
|
name: "quick-action-bvc",
|
||||||
component: () =>
|
component: () => import("../views/QuickActionBvcView.vue"),
|
||||||
import(
|
|
||||||
/* webpackChunkName: "quick-action-bvc" */ "../views/QuickActionBvcView.vue"
|
|
||||||
),
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/quick-action-bvc-begin",
|
path: "/quick-action-bvc-begin",
|
||||||
name: "quick-action-bvc-begin",
|
name: "quick-action-bvc-begin",
|
||||||
component: () =>
|
component: () => import("../views/QuickActionBvcBeginView.vue"),
|
||||||
import(
|
|
||||||
/* webpackChunkName: "quick-action-bvc-begin" */ "../views/QuickActionBvcBeginView.vue"
|
|
||||||
),
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/quick-action-bvc-end",
|
path: "/quick-action-bvc-end",
|
||||||
name: "quick-action-bvc-end",
|
name: "quick-action-bvc-end",
|
||||||
component: () =>
|
component: () => import("../views/QuickActionBvcEndView.vue"),
|
||||||
import(
|
|
||||||
/* webpackChunkName: "quick-action-bvc-end" */ "../views/QuickActionBvcEndView.vue"
|
|
||||||
),
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/scan-contact",
|
path: "/scan-contact",
|
||||||
name: "scan-contact",
|
name: "scan-contact",
|
||||||
component: () =>
|
component: () => import("../views/ContactScanView.vue"),
|
||||||
import(
|
|
||||||
/* webpackChunkName: "scan-contact" */ "../views/ContactScanView.vue"
|
|
||||||
),
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/search-area",
|
path: "/search-area",
|
||||||
name: "search-area",
|
name: "search-area",
|
||||||
component: () =>
|
component: () => import("../views/SearchAreaView.vue"),
|
||||||
import(
|
|
||||||
/* webpackChunkName: "search-area" */ "../views/SearchAreaView.vue"
|
|
||||||
),
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/seed-backup",
|
path: "/seed-backup",
|
||||||
name: "seed-backup",
|
name: "seed-backup",
|
||||||
component: () =>
|
component: () => import("../views/SeedBackupView.vue"),
|
||||||
import(
|
|
||||||
/* webpackChunkName: "seed-backup" */ "../views/SeedBackupView.vue"
|
|
||||||
),
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/start",
|
path: "/start",
|
||||||
name: "start",
|
name: "start",
|
||||||
component: () =>
|
component: () => import("../views/StartView.vue"),
|
||||||
import(/* webpackChunkName: "start" */ "../views/StartView.vue"),
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/statistics",
|
path: "/statistics",
|
||||||
name: "statistics",
|
name: "statistics",
|
||||||
component: () =>
|
component: () => import("../views/StatisticsView.vue"),
|
||||||
import(
|
|
||||||
/* webpackChunkName: "statistics" */ "../views/StatisticsView.vue"
|
|
||||||
),
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/test",
|
path: "/test",
|
||||||
name: "test",
|
name: "test",
|
||||||
component: () =>
|
component: () => import("../views/TestView.vue"),
|
||||||
import(/* webpackChunkName: "test" */ "../views/TestView.vue"),
|
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
/** @type {*} */
|
/** @type {*} */
|
||||||
const router = createRouter({
|
const router = createRouter({
|
||||||
history: createWebHistory(process.env.BASE_URL),
|
history: createWebHistory(import.meta.env.BASE_URL),
|
||||||
routes,
|
routes,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -37,7 +37,7 @@
|
|||||||
<span>
|
<span>
|
||||||
<router-link
|
<router-link
|
||||||
:to="{ name: 'help' }"
|
:to="{ name: 'help' }"
|
||||||
class="text-xs uppercase bg-blue-500 text-white px-1.5 py-1 rounded-md ml-1"
|
class="text-xs uppercase bg-gradient-to-b from-blue-400 to-blue-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-1.5 py-1 rounded-md ml-1"
|
||||||
>
|
>
|
||||||
Help
|
Help
|
||||||
</router-link>
|
</router-link>
|
||||||
@@ -55,7 +55,7 @@
|
|||||||
</p>
|
</p>
|
||||||
<router-link
|
<router-link
|
||||||
:to="{ name: 'start' }"
|
:to="{ name: 'start' }"
|
||||||
class="inline-block text-md uppercase bg-amber-600 text-white px-4 py-2 rounded-md"
|
class="inline-block text-md uppercase bg-gradient-to-b from-amber-400 to-amber-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-4 py-2 rounded-md"
|
||||||
>
|
>
|
||||||
Create An Identifier
|
Create An Identifier
|
||||||
</router-link>
|
</router-link>
|
||||||
@@ -105,7 +105,7 @@
|
|||||||
</p>
|
</p>
|
||||||
<router-link
|
<router-link
|
||||||
:to="{ name: 'contact-qr' }"
|
:to="{ name: 'contact-qr' }"
|
||||||
class="inline-block text-md uppercase bg-amber-600 text-white px-4 py-2 rounded-md"
|
class="inline-block text-md uppercase bg-gradient-to-b from-amber-400 to-amber-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-4 py-2 rounded-md"
|
||||||
>
|
>
|
||||||
Share Your Info
|
Share Your Info
|
||||||
</router-link>
|
</router-link>
|
||||||
@@ -192,7 +192,7 @@
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<button
|
<button
|
||||||
class="block float-right w-fit text-center text-md uppercase bg-slate-500 text-white px-1.5 py-2 rounded-md mt-2"
|
class="block float-right w-fit text-center text-md uppercase bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-4 py-2 rounded-md mt-2"
|
||||||
@click="checkLimits()"
|
@click="checkLimits()"
|
||||||
>
|
>
|
||||||
Recheck Limits
|
Recheck Limits
|
||||||
@@ -204,14 +204,14 @@
|
|||||||
<router-link
|
<router-link
|
||||||
:to="{ name: 'seed-backup' }"
|
:to="{ name: 'seed-backup' }"
|
||||||
v-if="activeDid"
|
v-if="activeDid"
|
||||||
class="block w-full text-center text-md uppercase bg-slate-500 text-white px-1.5 py-2 rounded-md mb-2 mt-2"
|
class="block w-full text-center text-md uppercase bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-1.5 py-2 rounded-md mb-2 mt-2"
|
||||||
>
|
>
|
||||||
Backup Identifier Seed
|
Backup Identifier Seed
|
||||||
</router-link>
|
</router-link>
|
||||||
|
|
||||||
<button
|
<button
|
||||||
v-bind:class="computedStartDownloadLinkClassNames()"
|
v-bind:class="computedStartDownloadLinkClassNames()"
|
||||||
class="block w-full text-center text-md uppercase bg-slate-500 text-white px-1.5 py-2 rounded-md mb-6"
|
class="block w-full text-center text-md uppercase bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-1.5 py-2 rounded-md mb-6"
|
||||||
@click="exportDatabase()"
|
@click="exportDatabase()"
|
||||||
>
|
>
|
||||||
Download Settings & Contacts
|
Download Settings & Contacts
|
||||||
@@ -221,7 +221,7 @@
|
|||||||
<a
|
<a
|
||||||
ref="downloadLink"
|
ref="downloadLink"
|
||||||
v-bind:class="computedDownloadLinkClassNames()"
|
v-bind:class="computedDownloadLinkClassNames()"
|
||||||
class="block w-full text-center text-md uppercase bg-green-600 text-white px-1.5 py-2 rounded-md"
|
class="block w-full text-center text-md uppercase bg-gradient-to-b from-green-500 to-green-800 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-1.5 py-2 rounded-md"
|
||||||
>
|
>
|
||||||
If no download happened yet, click again here to download now.
|
If no download happened yet, click again here to download now.
|
||||||
</a>
|
</a>
|
||||||
@@ -302,7 +302,7 @@
|
|||||||
<router-link
|
<router-link
|
||||||
id="switch-identity-link"
|
id="switch-identity-link"
|
||||||
:to="{ name: 'identity-switcher' }"
|
:to="{ name: 'identity-switcher' }"
|
||||||
class="block w-fit text-center text-md uppercase bg-slate-500 text-white px-1.5 py-2 rounded-md mb-2"
|
class="block w-fit text-center text-md uppercase bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-4 py-2 rounded-md mb-2"
|
||||||
>
|
>
|
||||||
Switch Identifier
|
Switch Identifier
|
||||||
</router-link>
|
</router-link>
|
||||||
@@ -450,9 +450,15 @@
|
|||||||
{{ DEFAULT_PUSH_SERVER }}
|
{{ DEFAULT_PUSH_SERVER }}
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
|
<div class="mt-2">
|
||||||
|
<span class="text-slate-500 text-sm font-bold">Image Server URL</span>
|
||||||
|
|
||||||
|
<span class="text-sm">{{ DEFAULT_IMAGE_API_SERVER }}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
<label
|
<label
|
||||||
for="toggleShowShortcutBvc"
|
for="toggleShowShortcutBvc"
|
||||||
class="flex items-center justify-between cursor-pointer my-4"
|
class="flex items-center justify-between cursor-pointer mt-4"
|
||||||
@click="toggleShowShortcutBvc"
|
@click="toggleShowShortcutBvc"
|
||||||
>
|
>
|
||||||
<!-- label -->
|
<!-- label -->
|
||||||
@@ -482,7 +488,7 @@
|
|||||||
<input type="file" @change="uploadFile" class="ml-2" />
|
<input type="file" @change="uploadFile" class="ml-2" />
|
||||||
<div v-if="showContactImport()">
|
<div v-if="showContactImport()">
|
||||||
<button
|
<button
|
||||||
class="block text-center text-md uppercase bg-blue-500 text-white px-1.5 py-2 rounded-md mb-6"
|
class="block text-center text-md uppercase bg-gradient-to-b from-blue-400 to-blue-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-1.5 py-2 rounded-md mb-6"
|
||||||
@click="submitFile()"
|
@click="submitFile()"
|
||||||
>
|
>
|
||||||
Import Settings & Contacts
|
Import Settings & Contacts
|
||||||
@@ -497,7 +503,7 @@
|
|||||||
<button>
|
<button>
|
||||||
<router-link
|
<router-link
|
||||||
:to="{ name: 'statistics' }"
|
:to="{ name: 'statistics' }"
|
||||||
class="block w-fit text-center text-md uppercase bg-slate-500 text-white px-1.5 py-2 rounded-md mb-2"
|
class="block w-fit text-center text-md uppercase bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-1.5 py-2 rounded-md mb-2"
|
||||||
>
|
>
|
||||||
See Global Animated History of Giving
|
See Global Animated History of Giving
|
||||||
</router-link>
|
</router-link>
|
||||||
@@ -510,7 +516,6 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { AxiosError, AxiosRequestConfig } from "axios";
|
import { AxiosError, AxiosRequestConfig } from "axios";
|
||||||
import Dexie from "dexie";
|
import Dexie from "dexie";
|
||||||
import "dexie-export-import";
|
|
||||||
import { ImportProgress } from "dexie-export-import/dist/import";
|
import { ImportProgress } from "dexie-export-import/dist/import";
|
||||||
import { ref } from "vue";
|
import { ref } from "vue";
|
||||||
import { Component, Vue } from "vue-facing-decorator";
|
import { Component, Vue } from "vue-facing-decorator";
|
||||||
@@ -533,9 +538,7 @@ import {
|
|||||||
EndorserRateLimits,
|
EndorserRateLimits,
|
||||||
ImageRateLimits,
|
ImageRateLimits,
|
||||||
} from "@/libs/endorserServer";
|
} from "@/libs/endorserServer";
|
||||||
|
import { Buffer } from "buffer/";
|
||||||
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
||||||
const Buffer = require("buffer/").Buffer;
|
|
||||||
|
|
||||||
interface IAccount {
|
interface IAccount {
|
||||||
did: string;
|
did: string;
|
||||||
@@ -546,12 +549,15 @@ interface IAccount {
|
|||||||
|
|
||||||
const inputFileNameRef = ref<Blob>();
|
const inputFileNameRef = ref<Blob>();
|
||||||
|
|
||||||
@Component({ components: { QuickNav, TopMessage } })
|
@Component({
|
||||||
|
components: { QuickNav, TopMessage },
|
||||||
|
})
|
||||||
export default class AccountViewView extends Vue {
|
export default class AccountViewView extends Vue {
|
||||||
$notify!: (notification: NotificationIface, timeout?: number) => void;
|
$notify!: (notification: NotificationIface, timeout?: number) => void;
|
||||||
|
|
||||||
AppConstants = AppString;
|
AppConstants = AppString;
|
||||||
DEFAULT_PUSH_SERVER = DEFAULT_PUSH_SERVER;
|
DEFAULT_PUSH_SERVER = DEFAULT_PUSH_SERVER;
|
||||||
|
DEFAULT_IMAGE_API_SERVER = DEFAULT_IMAGE_API_SERVER;
|
||||||
|
|
||||||
activeDid = "";
|
activeDid = "";
|
||||||
apiServer = "";
|
apiServer = "";
|
||||||
|
|||||||
@@ -123,7 +123,7 @@
|
|||||||
|
|
||||||
<div class="columns-3">
|
<div class="columns-3">
|
||||||
<button
|
<button
|
||||||
class="col-span-1 bg-blue-600 text-white px-4 py-2 rounded-md"
|
class="col-span-1 bg-gradient-to-b from-blue-400 to-blue-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-4 py-2 rounded-md"
|
||||||
v-if="
|
v-if="
|
||||||
libsUtil.isGiveRecordTheUserCanConfirm(
|
libsUtil.isGiveRecordTheUserCanConfirm(
|
||||||
veriClaim,
|
veriClaim,
|
||||||
@@ -140,7 +140,7 @@
|
|||||||
<button
|
<button
|
||||||
v-if="libsUtil.canFulfillOffer(veriClaim)"
|
v-if="libsUtil.canFulfillOffer(veriClaim)"
|
||||||
@click="openFulfillGiftDialog()"
|
@click="openFulfillGiftDialog()"
|
||||||
class="col-span-1 block w-fit text-center text-md bg-blue-600 text-white px-1.5 py-2 rounded-md"
|
class="col-span-1 block w-fit text-center text-md bg-gradient-to-b from-blue-400 to-blue-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-1.5 py-2 rounded-md"
|
||||||
>
|
>
|
||||||
Affirm Delivery
|
Affirm Delivery
|
||||||
<fa icon="hand-holding-heart" class="ml-2 text-white cursor-pointer" />
|
<fa icon="hand-holding-heart" class="ml-2 text-white cursor-pointer" />
|
||||||
@@ -377,7 +377,7 @@
|
|||||||
</p>
|
</p>
|
||||||
<button
|
<button
|
||||||
v-else
|
v-else
|
||||||
class="block w-full text-center text-md uppercase bg-blue-600 text-white px-1.5 py-2 rounded-md mb-2"
|
class="block w-full text-center text-md uppercase bg-gradient-to-b from-blue-400 to-blue-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-1.5 py-2 rounded-md mb-2"
|
||||||
@click="showFullClaim(veriClaim.id as string)"
|
@click="showFullClaim(veriClaim.id as string)"
|
||||||
>
|
>
|
||||||
Load Full Claim Details
|
Load Full Claim Details
|
||||||
@@ -390,7 +390,7 @@
|
|||||||
<a
|
<a
|
||||||
:href="apiServer + '/api/claim/' + veriClaim.id"
|
:href="apiServer + '/api/claim/' + veriClaim.id"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
class="block w-full text-center text-md uppercase bg-blue-600 text-white px-1.5 py-2 rounded-md mb-2"
|
class="block w-full text-center text-md uppercase bg-gradient-to-b from-blue-400 to-blue-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-1.5 py-2 rounded-md mb-2"
|
||||||
>
|
>
|
||||||
View on the Public Server
|
View on the Public Server
|
||||||
</a>
|
</a>
|
||||||
|
|||||||
@@ -32,12 +32,12 @@
|
|||||||
<div class="mt-8">
|
<div class="mt-8">
|
||||||
<input
|
<input
|
||||||
type="submit"
|
type="submit"
|
||||||
class="block w-full text-center text-lg font-bold uppercase bg-blue-600 text-white px-2 py-3 rounded-md mb-2"
|
class="block w-full text-center text-lg font-bold uppercase bg-gradient-to-b from-blue-400 to-blue-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-2 py-3 rounded-md mb-2"
|
||||||
value="Add Contact"
|
value="Add Contact"
|
||||||
/>
|
/>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
class="block w-full text-center text-md uppercase bg-slate-500 text-white px-1.5 py-2 rounded-md"
|
class="block w-full text-center text-md uppercase bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-1.5 py-2 rounded-md"
|
||||||
>
|
>
|
||||||
Cancel
|
Cancel
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@@ -32,7 +32,7 @@
|
|||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
@click="openDialog()"
|
@click="openDialog()"
|
||||||
class="block w-full text-center text-sm uppercase bg-blue-600 text-white px-3 py-1.5 rounded-md"
|
class="block w-full text-center text-sm uppercase bg-gradient-to-b from-blue-400 to-blue-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-3 py-1.5 rounded-md"
|
||||||
>
|
>
|
||||||
<fa icon="gift" class="fa-fw"></fa>
|
<fa icon="gift" class="fa-fw"></fa>
|
||||||
</button>
|
</button>
|
||||||
@@ -57,7 +57,7 @@
|
|||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
@click="openDialog(contact)"
|
@click="openDialog(contact)"
|
||||||
class="block w-full text-center text-sm uppercase bg-blue-600 text-white px-3 py-1.5 rounded-md"
|
class="block w-full text-center text-sm uppercase bg-gradient-to-b from-blue-400 to-blue-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-3 py-1.5 rounded-md"
|
||||||
>
|
>
|
||||||
<fa icon="gift" class="fa-fw"></fa>
|
<fa icon="gift" class="fa-fw"></fa>
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@@ -26,7 +26,7 @@
|
|||||||
You aren't sharing your name, so quickly
|
You aren't sharing your name, so quickly
|
||||||
<router-link
|
<router-link
|
||||||
:to="{ name: 'new-edit-account' }"
|
:to="{ name: 'new-edit-account' }"
|
||||||
class="bg-blue-500 text-white px-1.5 py-1 rounded-md"
|
class="bg-gradient-to-b from-blue-400 to-blue-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-1.5 py-1 rounded-md"
|
||||||
>
|
>
|
||||||
click here to set it for them.
|
click here to set it for them.
|
||||||
</router-link>
|
</router-link>
|
||||||
@@ -88,9 +88,7 @@ import {
|
|||||||
CONTACT_URL_PREFIX,
|
CONTACT_URL_PREFIX,
|
||||||
ENDORSER_JWT_URL_LOCATION,
|
ENDORSER_JWT_URL_LOCATION,
|
||||||
} from "@/libs/endorserServer";
|
} from "@/libs/endorserServer";
|
||||||
|
import { Buffer } from "buffer/";
|
||||||
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
||||||
const Buffer = require("buffer/").Buffer;
|
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
components: {
|
components: {
|
||||||
|
|||||||
@@ -67,12 +67,12 @@
|
|||||||
<div class="mt-8">
|
<div class="mt-8">
|
||||||
<input
|
<input
|
||||||
type="submit"
|
type="submit"
|
||||||
class="block w-full text-center text-lg font-bold uppercase bg-blue-600 text-white px-2 py-3 rounded-md mb-2"
|
class="block w-full text-center text-lg font-bold uppercase bg-gradient-to-b from-blue-400 to-blue-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-2 py-3 rounded-md mb-2"
|
||||||
value="Look Up Contact"
|
value="Look Up Contact"
|
||||||
/>
|
/>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
class="block w-full text-center text-md uppercase bg-slate-500 text-white px-1.5 py-2 rounded-md"
|
class="block w-full text-center text-md uppercase bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-1.5 py-2 rounded-md"
|
||||||
>
|
>
|
||||||
Cancel
|
Cancel
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
<span>
|
<span>
|
||||||
<a
|
<a
|
||||||
@click="showHintsForOnboarding()"
|
@click="showHintsForOnboarding()"
|
||||||
class="text-xs uppercase bg-blue-500 text-white px-1.5 py-1 rounded-md ml-1"
|
class="text-xs uppercase bg-gradient-to-b from-blue-400 to-blue-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-1.5 py-1 rounded-md ml-1"
|
||||||
>
|
>
|
||||||
Onboarding Guide
|
Onboarding Guide
|
||||||
</a>
|
</a>
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
<div class="mt-4 mb-4 flex items-stretch">
|
<div class="mt-4 mb-4 flex items-stretch">
|
||||||
<router-link
|
<router-link
|
||||||
:to="{ name: 'contact-qr' }"
|
:to="{ name: 'contact-qr' }"
|
||||||
class="flex items-center bg-slate-500 text-white px-1.5 py-1 mr-1 rounded-md"
|
class="flex items-center bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-1.5 py-1 mr-1 rounded-md"
|
||||||
>
|
>
|
||||||
<fa icon="qrcode" class="fa-fw text-2xl" />
|
<fa icon="qrcode" class="fa-fw text-2xl" />
|
||||||
</router-link>
|
</router-link>
|
||||||
@@ -75,7 +75,7 @@
|
|||||||
<br />
|
<br />
|
||||||
(Only most recent hours included. To see more, click
|
(Only most recent hours included. To see more, click
|
||||||
<span
|
<span
|
||||||
class="text-sm uppercase bg-slate-500 text-white px-1 py-1 rounded-md"
|
class="text-sm uppercase bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-1 py-1 rounded-md"
|
||||||
>
|
>
|
||||||
<fa icon="file-lines" class="fa-fw" />
|
<fa icon="file-lines" class="fa-fw" />
|
||||||
</span>
|
</span>
|
||||||
@@ -100,7 +100,7 @@
|
|||||||
></EntityIcon>
|
></EntityIcon>
|
||||||
{{ contact.name || AppString.NO_CONTACT_NAME }}
|
{{ contact.name || AppString.NO_CONTACT_NAME }}
|
||||||
<button
|
<button
|
||||||
class="text-sm uppercase bg-slate-500 text-white px-1 rounded-md"
|
class="text-sm uppercase bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-1 rounded-md"
|
||||||
@click="
|
@click="
|
||||||
contactEdit = contact;
|
contactEdit = contact;
|
||||||
contactNewName = contact.name;
|
contactNewName = contact.name;
|
||||||
@@ -137,7 +137,7 @@
|
|||||||
<div v-if="activeDid">
|
<div v-if="activeDid">
|
||||||
<button
|
<button
|
||||||
v-if="contact.seesMe"
|
v-if="contact.seesMe"
|
||||||
class="text-sm uppercase bg-slate-500 text-white mx-0.5 my-0.5 px-2 py-1.5 rounded-md"
|
class="text-sm uppercase bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white mx-0.5 my-0.5 px-2 py-1.5 rounded-md"
|
||||||
@click="setVisibility(contact, false, true)"
|
@click="setVisibility(contact, false, true)"
|
||||||
title="They can see you"
|
title="They can see you"
|
||||||
>
|
>
|
||||||
@@ -145,14 +145,14 @@
|
|||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
v-else
|
v-else
|
||||||
class="text-sm uppercase bg-slate-500 text-white mx-0.5 my-0.5 px-2 py-1.5 rounded-md"
|
class="text-sm uppercase bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white mx-0.5 my-0.5 px-2 py-1.5 rounded-md"
|
||||||
@click="setVisibility(contact, true, true)"
|
@click="setVisibility(contact, true, true)"
|
||||||
title="They cannot see you"
|
title="They cannot see you"
|
||||||
>
|
>
|
||||||
<fa icon="eye-slash" class="fa-fw" />
|
<fa icon="eye-slash" class="fa-fw" />
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
class="text-sm uppercase bg-slate-500 text-white mx-0.5 my-0.5 px-2 py-1.5 rounded-md"
|
class="text-sm uppercase bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white mx-0.5 my-0.5 px-2 py-1.5 rounded-md"
|
||||||
@click="checkVisibility(contact)"
|
@click="checkVisibility(contact)"
|
||||||
title="Check Visibility"
|
title="Check Visibility"
|
||||||
v-if="activeDid"
|
v-if="activeDid"
|
||||||
@@ -161,7 +161,7 @@
|
|||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
@click="register(contact)"
|
@click="register(contact)"
|
||||||
class="text-sm uppercase bg-slate-500 text-white ml-6 px-2 py-1.5 rounded-md"
|
class="text-sm uppercase bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white ml-6 px-2 py-1.5 rounded-md"
|
||||||
v-if="activeDid"
|
v-if="activeDid"
|
||||||
title="Registration"
|
title="Registration"
|
||||||
>
|
>
|
||||||
@@ -176,7 +176,7 @@
|
|||||||
|
|
||||||
<button
|
<button
|
||||||
@click="deleteContact(contact)"
|
@click="deleteContact(contact)"
|
||||||
class="text-sm uppercase bg-red-600 text-white ml-24 px-2 py-1.5 rounded-md"
|
class="text-sm uppercase bg-gradient-to-b from-rose-500 to-rose-800 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white ml-24 px-2 py-1.5 rounded-md"
|
||||||
title="Delete"
|
title="Delete"
|
||||||
>
|
>
|
||||||
<fa icon="trash-can" class="fa-fw" />
|
<fa icon="trash-can" class="fa-fw" />
|
||||||
@@ -187,7 +187,7 @@
|
|||||||
class="ml-auto flex gap-1.5"
|
class="ml-auto flex gap-1.5"
|
||||||
>
|
>
|
||||||
<button
|
<button
|
||||||
class="text-sm bg-blue-600 text-white px-2 py-1.5 rounded-l-md"
|
class="text-sm bg-gradient-to-b from-blue-400 to-blue-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-2 py-1.5 rounded-l-md"
|
||||||
@click="onClickAddGive(activeDid, contact.did)"
|
@click="onClickAddGive(activeDid, contact.did)"
|
||||||
:title="givenByMeDescriptions[contact.did] || ''"
|
:title="givenByMeDescriptions[contact.did] || ''"
|
||||||
>
|
>
|
||||||
@@ -229,7 +229,7 @@
|
|||||||
name: 'contact-amounts',
|
name: 'contact-amounts',
|
||||||
query: { contactDid: contact.did },
|
query: { contactDid: contact.did },
|
||||||
}"
|
}"
|
||||||
class="text-sm uppercase bg-slate-500 text-white px-2 py-1.5 rounded-md"
|
class="text-sm uppercase bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-2 py-1.5 rounded-md"
|
||||||
title="See more given activity"
|
title="See more given activity"
|
||||||
>
|
>
|
||||||
<fa icon="file-lines" class="fa-fw" />
|
<fa icon="file-lines" class="fa-fw" />
|
||||||
@@ -313,8 +313,8 @@ import QuickNav from "@/components/QuickNav.vue";
|
|||||||
import EntityIcon from "@/components/EntityIcon.vue";
|
import EntityIcon from "@/components/EntityIcon.vue";
|
||||||
import { Account } from "@/db/tables/accounts";
|
import { Account } from "@/db/tables/accounts";
|
||||||
|
|
||||||
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
import { Buffer } from "buffer/";
|
||||||
const Buffer = require("buffer/").Buffer;
|
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
components: { QuickNav, EntityIcon },
|
components: { QuickNav, EntityIcon },
|
||||||
|
|||||||
@@ -65,7 +65,7 @@
|
|||||||
<span v-else>
|
<span v-else>
|
||||||
<fa
|
<fa
|
||||||
icon="camera"
|
icon="camera"
|
||||||
class="bg-blue-500 text-white px-2 py-2 rounded-md"
|
class="bg-gradient-to-b from-blue-400 to-blue-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-2 py-2 rounded-md"
|
||||||
@click="openPhotoDialog"
|
@click="openPhotoDialog"
|
||||||
/>
|
/>
|
||||||
</span>
|
</span>
|
||||||
@@ -94,13 +94,13 @@
|
|||||||
Sign & Send to publish to the world
|
Sign & Send to publish to the world
|
||||||
</p>
|
</p>
|
||||||
<button
|
<button
|
||||||
class="block w-full text-center text-lg font-bold uppercase bg-blue-600 text-white px-2 py-3 rounded-md mb-2"
|
class="block w-full text-center text-lg font-bold uppercase bg-gradient-to-b from-blue-400 to-blue-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-2 py-3 rounded-md mb-2"
|
||||||
@click="confirm"
|
@click="confirm"
|
||||||
>
|
>
|
||||||
Sign & Send
|
Sign & Send
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
class="block w-full text-center text-md uppercase bg-slate-500 text-white px-1.5 py-2 rounded-md"
|
class="block w-full text-center text-md uppercase bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-1.5 py-2 rounded-md"
|
||||||
@click="cancel"
|
@click="cancel"
|
||||||
>
|
>
|
||||||
Cancel
|
Cancel
|
||||||
|
|||||||
@@ -31,7 +31,7 @@
|
|||||||
If this works then you're all set.
|
If this works then you're all set.
|
||||||
<button
|
<button
|
||||||
@click="sendTestWebPushMessage(true)"
|
@click="sendTestWebPushMessage(true)"
|
||||||
class="block w-full text-center text-md bg-slate-500 text-white px-1.5 py-2 rounded-md mb-2"
|
class="block w-full text-center text-md bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-1.5 py-2 rounded-md mb-2"
|
||||||
>
|
>
|
||||||
Send Yourself a Test Web Push Message (Through Push Server but
|
Send Yourself a Test Web Push Message (Through Push Server but
|
||||||
Skipping Client Filter)
|
Skipping Client Filter)
|
||||||
@@ -233,7 +233,7 @@
|
|||||||
<h2 class="text-xl font-semibold mt-4">Tests</h2>
|
<h2 class="text-xl font-semibold mt-4">Tests</h2>
|
||||||
<button
|
<button
|
||||||
@click="showTestNotification()"
|
@click="showTestNotification()"
|
||||||
class="block w-full text-center text-md bg-slate-500 text-white px-1.5 py-2 rounded-md mt-4 mb-2"
|
class="block w-full text-center text-md bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-1.5 py-2 rounded-md mt-4 mb-2"
|
||||||
>
|
>
|
||||||
Send Test Notification Directly to Device (Not Through Push Server)
|
Send Test Notification Directly to Device (Not Through Push Server)
|
||||||
</button>
|
</button>
|
||||||
@@ -246,7 +246,7 @@
|
|||||||
|
|
||||||
<button
|
<button
|
||||||
@click="alertWebPushSubscription()"
|
@click="alertWebPushSubscription()"
|
||||||
class="block w-full text-center text-md bg-slate-500 text-white px-1.5 py-2 rounded-md mt-4 mb-2"
|
class="block w-full text-center text-md bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-1.5 py-2 rounded-md mt-4 mb-2"
|
||||||
>
|
>
|
||||||
Show Web Push Subscription Info
|
Show Web Push Subscription Info
|
||||||
</button>
|
</button>
|
||||||
@@ -259,7 +259,7 @@
|
|||||||
|
|
||||||
<button
|
<button
|
||||||
@click="sendTestWebPushMessage(true)"
|
@click="sendTestWebPushMessage(true)"
|
||||||
class="block w-full text-center text-md bg-slate-500 text-white px-1.5 py-2 rounded-md mt-4 mb-2"
|
class="block w-full text-center text-md bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-1.5 py-2 rounded-md mt-4 mb-2"
|
||||||
>
|
>
|
||||||
Send Yourself a Test Web Push Message (Through Push Server but Skipping
|
Send Yourself a Test Web Push Message (Through Push Server but Skipping
|
||||||
Client Filter)
|
Client Filter)
|
||||||
@@ -272,7 +272,7 @@
|
|||||||
|
|
||||||
<button
|
<button
|
||||||
@click="sendTestWebPushMessage()"
|
@click="sendTestWebPushMessage()"
|
||||||
class="block w-full text-center text-md bg-slate-500 text-white px-1.5 py-2 rounded-md mt-4 mb-2"
|
class="block w-full text-center text-md bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-1.5 py-2 rounded-md mt-4 mb-2"
|
||||||
>
|
>
|
||||||
Send Yourself a Test Web Push Message (Through Push Server and Client
|
Send Yourself a Test Web Push Message (Through Push Server and Client
|
||||||
Filter)
|
Filter)
|
||||||
|
|||||||
@@ -310,8 +310,9 @@
|
|||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<p>
|
<p>
|
||||||
If you still have problems, you can clear the cache and even uninstall
|
If you still have problems, you can clear the cache (see "erase my data" above)
|
||||||
and reinstall the app, but be sure to have your backups ready or be
|
and even uninstall and reinstall the app
|
||||||
|
-- just be sure to have your backups ready or be
|
||||||
prepared to restart with a new identity and recreate your network.
|
prepared to restart with a new identity and recreate your network.
|
||||||
Nobody else has access to your identity or contact information because
|
Nobody else has access to your identity or contact information because
|
||||||
this app is designed to give you full control over your data.
|
this app is designed to give you full control over your data.
|
||||||
@@ -384,7 +385,7 @@ export default class Help extends Vue {
|
|||||||
$notify!: (notification: NotificationIface, timeout?: number) => void;
|
$notify!: (notification: NotificationIface, timeout?: number) => void;
|
||||||
|
|
||||||
package = Package;
|
package = Package;
|
||||||
commitHash = process.env.VUE_APP_GIT_HASH;
|
commitHash = import.meta.env.VITE_GIT_HASH;
|
||||||
|
|
||||||
showOnboardInfo() {
|
showOnboardInfo() {
|
||||||
this.$notify(
|
this.$notify(
|
||||||
|
|||||||
@@ -62,7 +62,7 @@
|
|||||||
<div v-if="showShortcutBvc" class="mb-4">
|
<div v-if="showShortcutBvc" class="mb-4">
|
||||||
<router-link
|
<router-link
|
||||||
:to="{ name: 'quick-action-bvc' }"
|
:to="{ name: 'quick-action-bvc' }"
|
||||||
class="block text-center text-md font-bold uppercase bg-blue-500 text-white mt-2 px-2 py-3 rounded-md"
|
class="block text-center text-md font-bold uppercase bg-gradient-to-b from-blue-400 to-blue-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white mt-2 px-2 py-3 rounded-md"
|
||||||
>
|
>
|
||||||
Bountiful Voluntaryist Community Actions</router-link
|
Bountiful Voluntaryist Community Actions</router-link
|
||||||
>
|
>
|
||||||
@@ -85,7 +85,7 @@
|
|||||||
</p>
|
</p>
|
||||||
<router-link
|
<router-link
|
||||||
:to="{ name: 'start' }"
|
:to="{ name: 'start' }"
|
||||||
class="block text-center text-md font-bold uppercase bg-blue-500 text-white mt-2 px-2 py-3 rounded-md"
|
class="block text-center text-md font-bold uppercase bg-gradient-to-b from-blue-400 to-blue-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white mt-2 px-2 py-3 rounded-md"
|
||||||
>
|
>
|
||||||
Create An Identifier</router-link
|
Create An Identifier</router-link
|
||||||
>
|
>
|
||||||
@@ -99,7 +99,7 @@
|
|||||||
giving.
|
giving.
|
||||||
<router-link
|
<router-link
|
||||||
:to="{ name: 'contact-qr' }"
|
:to="{ name: 'contact-qr' }"
|
||||||
class="block text-center text-md font-bold uppercase bg-blue-500 text-white mt-2 px-2 py-3 rounded-md"
|
class="block text-center text-md font-bold uppercase bg-gradient-to-b from-blue-400 to-blue-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white mt-2 px-2 py-3 rounded-md"
|
||||||
>
|
>
|
||||||
Show Them Your Identifier Info</router-link
|
Show Them Your Identifier Info</router-link
|
||||||
>
|
>
|
||||||
@@ -152,13 +152,13 @@
|
|||||||
<router-link
|
<router-link
|
||||||
v-if="allContacts.length >= 7"
|
v-if="allContacts.length >= 7"
|
||||||
:to="{ name: 'contact-gives' }"
|
:to="{ name: 'contact-gives' }"
|
||||||
class="block text-center text-md font-bold uppercase bg-slate-500 text-white px-2 py-3 rounded-md"
|
class="block text-center text-md font-bold uppercase bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-2 py-3 rounded-md"
|
||||||
>
|
>
|
||||||
Choose From All Contacts
|
Choose From All Contacts
|
||||||
</router-link>
|
</router-link>
|
||||||
<button
|
<button
|
||||||
@click="openGiftedPrompts()"
|
@click="openGiftedPrompts()"
|
||||||
class="block text-center text-md font-bold bg-slate-500 text-white px-2 py-3 rounded-md"
|
class="block text-center text-md font-bold bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-2 py-3 rounded-md"
|
||||||
>
|
>
|
||||||
Ideas...
|
Ideas...
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@@ -65,13 +65,13 @@
|
|||||||
<router-link
|
<router-link
|
||||||
id="start-link"
|
id="start-link"
|
||||||
:to="{ name: 'start' }"
|
:to="{ name: 'start' }"
|
||||||
class="block text-center text-lg font-bold uppercase bg-blue-600 text-white px-2 py-3 rounded-md mb-2"
|
class="block text-center text-lg font-bold uppercase bg-gradient-to-b from-blue-400 to-blue-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-2 py-3 rounded-md mb-2"
|
||||||
>
|
>
|
||||||
Add Another Identity…
|
Add Another Identity…
|
||||||
</router-link>
|
</router-link>
|
||||||
<a
|
<a
|
||||||
href="#"
|
href="#"
|
||||||
class="block w-full text-center text-md uppercase bg-slate-500 text-white px-1.5 py-2 rounded-md mb-8"
|
class="block w-full text-center text-md uppercase bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-1.5 py-2 rounded-md mb-8"
|
||||||
@click="switchAccount('0')"
|
@click="switchAccount('0')"
|
||||||
>
|
>
|
||||||
No Identity
|
No Identity
|
||||||
|
|||||||
@@ -58,14 +58,14 @@
|
|||||||
<div class="mt-8">
|
<div class="mt-8">
|
||||||
<button
|
<button
|
||||||
@click="fromMnemonic()"
|
@click="fromMnemonic()"
|
||||||
class="block w-full text-center text-lg font-bold uppercase bg-blue-600 text-white px-2 py-3 rounded-md mb-2"
|
class="block w-full text-center text-lg font-bold uppercase bg-gradient-to-b from-blue-400 to-blue-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-2 py-3 rounded-md mb-2"
|
||||||
>
|
>
|
||||||
Import
|
Import
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
@click="onCancelClick()"
|
@click="onCancelClick()"
|
||||||
type="button"
|
type="button"
|
||||||
class="block w-full text-center text-md uppercase bg-slate-500 text-white px-1.5 py-2 rounded-md"
|
class="block w-full text-center text-md uppercase bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-1.5 py-2 rounded-md"
|
||||||
>
|
>
|
||||||
Cancel
|
Cancel
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@@ -51,14 +51,14 @@
|
|||||||
<div class="mt-8">
|
<div class="mt-8">
|
||||||
<button
|
<button
|
||||||
@click="incrementDerivation()"
|
@click="incrementDerivation()"
|
||||||
class="block w-full text-center text-lg font-bold uppercase bg-blue-600 text-white px-2 py-3 rounded-md mb-2"
|
class="block w-full text-center text-lg font-bold uppercase bg-gradient-to-b from-blue-400 to-blue-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-2 py-3 rounded-md mb-2"
|
||||||
>
|
>
|
||||||
Increment and Import
|
Increment and Import
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
@click="onCancelClick()"
|
@click="onCancelClick()"
|
||||||
type="button"
|
type="button"
|
||||||
class="block w-full text-center text-md uppercase bg-slate-500 text-white px-1.5 py-2 rounded-md"
|
class="block w-full text-center text-md uppercase bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-1.5 py-2 rounded-md"
|
||||||
>
|
>
|
||||||
Cancel
|
Cancel
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
<div class="mt-8">
|
<div class="mt-8">
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
class="block w-full text-center text-lg font-bold uppercase bg-blue-600 text-white px-2 py-3 rounded-md mb-2"
|
class="block w-full text-center text-lg font-bold uppercase bg-gradient-to-b from-blue-400 to-blue-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-2 py-3 rounded-md mb-2"
|
||||||
@click="onClickSaveChanges()"
|
@click="onClickSaveChanges()"
|
||||||
>
|
>
|
||||||
Save Changes
|
Save Changes
|
||||||
@@ -32,7 +32,7 @@
|
|||||||
<!-- SHOW ME instead while processing saving changes -->
|
<!-- SHOW ME instead while processing saving changes -->
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
class="block w-full text-center text-md uppercase bg-slate-500 text-white px-1.5 py-2 rounded-md"
|
class="block w-full text-center text-md uppercase bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-1.5 py-2 rounded-md"
|
||||||
@click="onClickCancel()"
|
@click="onClickCancel()"
|
||||||
>
|
>
|
||||||
Cancel
|
Cancel
|
||||||
|
|||||||
@@ -106,7 +106,7 @@
|
|||||||
<div class="mt-8">
|
<div class="mt-8">
|
||||||
<button
|
<button
|
||||||
:disabled="isHiddenSave"
|
:disabled="isHiddenSave"
|
||||||
class="block w-full text-center text-lg font-bold uppercase bg-blue-600 text-white px-2 py-3 rounded-md mb-2"
|
class="block w-full text-center text-lg font-bold uppercase bg-gradient-to-b from-blue-400 to-blue-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-2 py-3 rounded-md mb-2"
|
||||||
@click="onSaveProjectClick()"
|
@click="onSaveProjectClick()"
|
||||||
>
|
>
|
||||||
<!-- SHOW if in idle state -->
|
<!-- SHOW if in idle state -->
|
||||||
@@ -121,7 +121,7 @@
|
|||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
class="block w-full text-center text-md uppercase bg-slate-500 text-white px-1.5 py-2 rounded-md"
|
class="block w-full text-center text-md uppercase bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-1.5 py-2 rounded-md"
|
||||||
@click="onCancelClick()"
|
@click="onCancelClick()"
|
||||||
>
|
>
|
||||||
Cancel
|
Cancel
|
||||||
|
|||||||
@@ -105,7 +105,7 @@
|
|||||||
<button
|
<button
|
||||||
v-if="activeDid === issuer || activeDid === agentDid"
|
v-if="activeDid === issuer || activeDid === agentDid"
|
||||||
type="button"
|
type="button"
|
||||||
class="block w-full text-center text-md uppercase bg-slate-500 text-white px-1.5 py-2 rounded-md"
|
class="block w-full text-center text-md uppercase bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-1.5 py-2 rounded-md"
|
||||||
@click="onEditClick()"
|
@click="onEditClick()"
|
||||||
>
|
>
|
||||||
Edit
|
Edit
|
||||||
@@ -116,7 +116,7 @@
|
|||||||
<div class="text-center">
|
<div class="text-center">
|
||||||
<button
|
<button
|
||||||
@click="openOfferDialog()"
|
@click="openOfferDialog()"
|
||||||
class="block w-full text-lg font-bold uppercase bg-blue-600 text-white px-2 py-3 rounded-md"
|
class="block w-full text-lg font-bold uppercase bg-gradient-to-b from-blue-400 to-blue-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-2 py-3 rounded-md"
|
||||||
>
|
>
|
||||||
Offer (maybe with conditions)...
|
Offer (maybe with conditions)...
|
||||||
</button>
|
</button>
|
||||||
@@ -176,7 +176,7 @@
|
|||||||
<a
|
<a
|
||||||
v-if="allContacts.length >= 7"
|
v-if="allContacts.length >= 7"
|
||||||
@click="onClickAllContactsGifting()"
|
@click="onClickAllContactsGifting()"
|
||||||
class="block text-center text-md font-bold uppercase bg-slate-500 text-white px-2 py-3 rounded-md"
|
class="block text-center text-md font-bold uppercase bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-2 py-3 rounded-md"
|
||||||
>
|
>
|
||||||
Show More Contacts…
|
Show More Contacts…
|
||||||
</a>
|
</a>
|
||||||
|
|||||||
@@ -49,14 +49,14 @@
|
|||||||
>
|
>
|
||||||
<button
|
<button
|
||||||
@click="record()"
|
@click="record()"
|
||||||
class="block text-center text-md font-bold bg-blue-500 text-white px-2 py-3 rounded-md w-56"
|
class="block text-center text-md font-bold bg-gradient-to-b from-blue-400 to-blue-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-2 py-3 rounded-md w-56"
|
||||||
>
|
>
|
||||||
Sign & Send
|
Sign & Send
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div v-else class="flex justify-center mt-4">
|
<div v-else class="flex justify-center mt-4">
|
||||||
<button
|
<button
|
||||||
class="block text-center text-md font-bold bg-slate-500 text-white px-2 py-3 rounded-md w-56"
|
class="block text-center text-md font-bold bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-2 py-3 rounded-md w-56"
|
||||||
>
|
>
|
||||||
Select Your Actions
|
Select Your Actions
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@@ -109,14 +109,14 @@
|
|||||||
>
|
>
|
||||||
<button
|
<button
|
||||||
@click="record()"
|
@click="record()"
|
||||||
class="block text-center text-md font-bold bg-blue-500 text-white px-2 py-3 rounded-md w-56"
|
class="block text-center text-md font-bold bg-gradient-to-b from-blue-400 to-blue-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-2 py-3 rounded-md w-56"
|
||||||
>
|
>
|
||||||
Sign & Send
|
Sign & Send
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div v-else class="flex justify-center mt-4">
|
<div v-else class="flex justify-center mt-4">
|
||||||
<button
|
<button
|
||||||
class="block text-center text-md font-bold bg-slate-500 text-white px-2 py-3 rounded-md w-56"
|
class="block text-center text-md font-bold bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-2 py-3 rounded-md w-56"
|
||||||
>
|
>
|
||||||
Choose What To Confirm
|
Choose What To Confirm
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@@ -22,13 +22,13 @@
|
|||||||
<div>
|
<div>
|
||||||
<router-link
|
<router-link
|
||||||
:to="{ name: 'quick-action-bvc-begin' }"
|
:to="{ name: 'quick-action-bvc-begin' }"
|
||||||
class="block text-center text-md font-bold uppercase bg-blue-500 text-white mt-2 px-2 py-3 rounded-md"
|
class="block text-center text-md font-bold uppercase bg-gradient-to-b from-blue-400 to-blue-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white mt-2 px-2 py-3 rounded-md"
|
||||||
>
|
>
|
||||||
Beginning of Meeting
|
Beginning of Meeting
|
||||||
</router-link>
|
</router-link>
|
||||||
<router-link
|
<router-link
|
||||||
:to="{ name: 'quick-action-bvc-end' }"
|
:to="{ name: 'quick-action-bvc-end' }"
|
||||||
class="block text-center text-md font-bold uppercase bg-blue-500 text-white mt-2 px-2 py-3 rounded-md"
|
class="block text-center text-md font-bold uppercase bg-gradient-to-b from-blue-400 to-blue-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white mt-2 px-2 py-3 rounded-md"
|
||||||
>
|
>
|
||||||
End of Meeting
|
End of Meeting
|
||||||
</router-link>
|
</router-link>
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
<span>
|
<span>
|
||||||
<router-link
|
<router-link
|
||||||
:to="{ name: 'help' }"
|
:to="{ name: 'help' }"
|
||||||
class="text-xs uppercase bg-blue-500 text-white px-1.5 py-1 rounded-md ml-1"
|
class="text-xs uppercase bg-gradient-to-b from-blue-400 to-blue-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-1.5 py-1 rounded-md ml-1"
|
||||||
>
|
>
|
||||||
Help
|
Help
|
||||||
</router-link>
|
</router-link>
|
||||||
@@ -48,7 +48,7 @@
|
|||||||
|
|
||||||
<div class="bg-slate-100 rounded-md overflow-hidden p-4 mb-4">
|
<div class="bg-slate-100 rounded-md overflow-hidden p-4 mb-4">
|
||||||
<button
|
<button
|
||||||
class="block w-full text-center text-md uppercase bg-slate-500 text-white px-1.5 py-2 rounded-md"
|
class="block w-full text-center text-md uppercase bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-1.5 py-2 rounded-md"
|
||||||
@click="showSeedPhrase"
|
@click="showSeedPhrase"
|
||||||
>
|
>
|
||||||
Reveal my Seed Phrase
|
Reveal my Seed Phrase
|
||||||
|
|||||||
@@ -36,20 +36,20 @@
|
|||||||
</p>
|
</p>
|
||||||
<a
|
<a
|
||||||
@click="onClickYes()"
|
@click="onClickYes()"
|
||||||
class="block w-full text-center text-lg uppercase bg-blue-600 text-white px-2 py-3 rounded-md"
|
class="block w-full text-center text-lg uppercase bg-gradient-to-b from-blue-400 to-blue-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-2 py-3 rounded-md"
|
||||||
>
|
>
|
||||||
Yes, generate one
|
Yes, generate one
|
||||||
</a>
|
</a>
|
||||||
<a
|
<a
|
||||||
@click="onClickNo()"
|
@click="onClickNo()"
|
||||||
class="block w-full text-center text-md uppercase bg-slate-500 text-white px-1.5 py-2 rounded-md mt-2"
|
class="block w-full text-center text-md uppercase bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-1.5 py-2 rounded-md mt-2"
|
||||||
>
|
>
|
||||||
No, I have a seed
|
No, I have a seed
|
||||||
</a>
|
</a>
|
||||||
<a
|
<a
|
||||||
v-if="numAccounts > 0"
|
v-if="numAccounts > 0"
|
||||||
@click="onClickDerive()"
|
@click="onClickDerive()"
|
||||||
class="block w-full text-center text-md uppercase bg-slate-500 text-white px-1.5 py-2 rounded-md mt-2"
|
class="block w-full text-center text-md uppercase bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-1.5 py-2 rounded-md mt-2"
|
||||||
>
|
>
|
||||||
Derive new address from existing seed
|
Derive new address from existing seed
|
||||||
</a>
|
</a>
|
||||||
|
|||||||
@@ -1,38 +1,26 @@
|
|||||||
{
|
{
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"allowJs": true,
|
"target": "ES2020", // Latest ECMAScript features that are widely supported by modern browsers
|
||||||
"resolveJsonModule": true,
|
"module": "ESNext", // Use ES modules
|
||||||
"target": "esnext",
|
"strict": true, // Enable all strict type checking options
|
||||||
"module": "esnext",
|
"jsx": "preserve", // Preserves JSX to be transformed by Babel or another transpiler
|
||||||
"strict": true,
|
"moduleResolution": "node", // Use Node.js style module resolution
|
||||||
"strictPropertyInitialization": false,
|
|
||||||
"jsx": "preserve",
|
|
||||||
"moduleResolution": "node",
|
|
||||||
"experimentalDecorators": true,
|
"experimentalDecorators": true,
|
||||||
"skipLibCheck": true,
|
"esModuleInterop": true, // Enables compatibility with CommonJS modules for default imports
|
||||||
"esModuleInterop": true,
|
"allowSyntheticDefaultImports": true, // Allow default imports from modules with no default export
|
||||||
"allowSyntheticDefaultImports": true,
|
"forceConsistentCasingInFileNames": true, // Disallow inconsistently-cased references to the same file
|
||||||
"forceConsistentCasingInFileNames": true,
|
|
||||||
"useDefineForClassFields": true,
|
"useDefineForClassFields": true,
|
||||||
"sourceMap": true,
|
"sourceMap": true,
|
||||||
"baseUrl": "./src",
|
"baseUrl": "./src", // Base directory to resolve non-relative module names
|
||||||
"types": [
|
|
||||||
"webpack-env"
|
|
||||||
],
|
|
||||||
"paths": {
|
"paths": {
|
||||||
"@/components/*": ["components/*"],
|
"@/components/*": ["components/*"],
|
||||||
"@/views/*": ["views/*"],
|
"@/views/*": ["views/*"],
|
||||||
"@/db/*": ["db/*"],
|
"@/db/*": ["db/*"],
|
||||||
"@/libs/*": ["libs/*"],
|
"@/libs/*": ["libs/*"],
|
||||||
"@/constants/*": ["constants/*"],
|
"@/constants/*": ["constants/*"],
|
||||||
"@/store/*": ["store/*"],
|
"@/store/*": ["store/*"]
|
||||||
},
|
},
|
||||||
"lib": [
|
"lib": ["ES2020", "dom", "dom.iterable"], // Include typings for ES2020 and DOM APIs
|
||||||
"esnext",
|
|
||||||
"dom",
|
|
||||||
"dom.iterable",
|
|
||||||
"scripthost"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"include": [
|
"include": [
|
||||||
"src/**/*.ts",
|
"src/**/*.ts",
|
||||||
|
|||||||
18
vite.config.mjs
Normal file
18
vite.config.mjs
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
import { defineConfig } from "vite";
|
||||||
|
import vue from "@vitejs/plugin-vue";
|
||||||
|
import * as path from "path";
|
||||||
|
|
||||||
|
// https://vitejs.dev/config/
|
||||||
|
export default defineConfig({
|
||||||
|
server: {
|
||||||
|
port: 8080
|
||||||
|
},
|
||||||
|
plugins: [ vue() ],
|
||||||
|
resolve: {
|
||||||
|
alias: {
|
||||||
|
"@": path.resolve(__dirname, "./src"),
|
||||||
|
buffer: path.resolve(__dirname, 'node_modules', 'buffer'),
|
||||||
|
'dexie-export-import/dist/import': 'dexie-export-import/dist/import/index.js',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
@@ -2,9 +2,9 @@ const { defineConfig } = require("@vue/cli-service");
|
|||||||
const { gitDescribeSync } = require("git-describe");
|
const { gitDescribeSync } = require("git-describe");
|
||||||
const { exec } = require("child_process");
|
const { exec } = require("child_process");
|
||||||
|
|
||||||
process.env.VUE_APP_GIT_HASH = gitDescribeSync().hash;
|
import.meta.env.VITE_GIT_HASH = gitDescribeSync().hash;
|
||||||
const TIME_SAFARI_APP_TITLE =
|
const TIME_SAFARI_APP_TITLE =
|
||||||
process.env.TIME_SAFARI_APP_TITLE || require("./package.json").name;
|
import.meta.env.TIME_SAFARI_APP_TITLE || require("./package.json").name;
|
||||||
|
|
||||||
module.exports = defineConfig({
|
module.exports = defineConfig({
|
||||||
transpileDependencies: true,
|
transpileDependencies: true,
|
||||||
|
|||||||
Reference in New Issue
Block a user