diff --git a/CHANGELOG.md b/CHANGELOG.md index d3d2b26..581683a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,8 +8,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Added +- Web push notifications -## [0.1.3] - 2023.11 +## [0.1.3] - 2023.11.08 - 910f57ec7d2e50803ae3d04f4b927e0f5219fbde ### Added - Contact name editing ### Changed diff --git a/README.md b/README.md index 5bc6b63..b207b08 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,11 @@ Under the "Your Identity" screen, click "Advanced", click "Switch Identity / No ### Web-push -For your own web-push tests, change the 'vapid' URL in App.vue, and install apps on the same domain. +For your own web-push tests, change the push server URL in Advanced settings on the account page, and install Time Safari & push server on the same domain. + +### Icons + +To add an icon, add to main.ts and reference with `fa` element and `icon` attribute with the hyphenated name. ### Manual walk-through @@ -90,7 +94,7 @@ For your own web-push tests, change the 'vapid' URL in App.vue, and install apps - Create a new identity as prompted. Go to "Your Identity" screen and copy the ID to the clipboard. - Go back to /start and import test User `did:ethr:0x000Ee5654b9742f6Fe18ea970e32b97ee2247B51` with this this seed phrase: - `seminar accuse mystery assist delay law thing deal image undo guard initial shallow wrestle list fragile borrow velvet tomorrow awake explain test offer control` + `rigid shrug mobile smart veteran half all pond toilet brave review universe ship congress found yard skate elite apology jar uniform subway slender luggage` (Other test users are found [here](https://github.com/trentlarson/endorser-ch/blob/master/test/util.js).) - Go to "Your Contacts" screen and add the ID you copied to the clipboard, and hit "+" to add them. @@ -99,10 +103,10 @@ For your own web-push tests, change the 'vapid' URL in App.vue, and install apps ### Clear/Reset data & restart -* Data: Clear the browser cache for localhost. -* Notifications: - * Under browser settings, look for "notification" and remove this server. - * Under about:debugging, find the service worker and Unregister. +* Clear cache for site. (In Chrome, go to `chrome://settings/cookies` and "all site data and permissions"; in Firefox, go to `about:preferences` and search for cache.) +* Unregister service worker (in Chrome, go to `chrome://serviceworker-internals/`; in Firefox, go to `about:serviceworkers` or `about:debugging`). +* Clear notification permission (in Chrome, go to `chrome://settings/content/notifications`; in Firefox, go to `about:preferences` and search). +* Clear Cache Storage (in Chrome, in dev tools under Application; in Firefox, in dev tools under Storage). diff --git a/package-lock.json b/package-lock.json index 75f460e..7a97890 100644 --- a/package-lock.json +++ b/package-lock.json @@ -49,6 +49,7 @@ "reflect-metadata": "^0.1.13", "register-service-worker": "^1.7.2", "three": "^0.156.1", + "util": "^0.12.5", "vue": "^3.3.4", "vue-axios": "^3.5.2", "vue-facing-decorator": "^3.0.2", @@ -72,13 +73,13 @@ "@vue/cli-service": "~5.0.8", "@vue/eslint-config-typescript": "^11.0.3", "autoprefixer": "^10.4.15", - "eslint": "^8.48.0", + "eslint": "^8.53.0", "eslint-config-prettier": "^9.0.0", "eslint-plugin-prettier": "^5.0.0", "eslint-plugin-vue": "^9.17.0", "leaflet": "^1.9.4", "postcss": "^8.4.29", - "prettier": "^3.0.3", + "prettier": "^3.1.0", "tailwindcss": "^3.3.3", "typescript": "~5.2.2" } @@ -2821,9 +2822,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", - "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -2871,9 +2872,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.51.0.tgz", - "integrity": "sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.55.0.tgz", + "integrity": "sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -5498,12 +5499,12 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.11", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", - "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", + "@humanwhocodes/object-schema": "^2.0.1", "debug": "^4.1.1", "minimatch": "^3.0.5" }, @@ -5525,9 +5526,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", "dev": true }, "node_modules/@jest/create-cache-key-function": { @@ -8819,11 +8820,11 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.8.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.6.tgz", - "integrity": "sha512-eWO4K2Ji70QzKUqRy6oyJWUeB7+g2cRagT3T/nxYibYcT4y2BDL8lqolRXjTHmkZCdJfIPaY73KbJAZmcryxTQ==", + "version": "20.10.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.4.tgz", + "integrity": "sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==", "dependencies": { - "undici-types": "~5.25.1" + "undici-types": "~5.26.4" } }, "node_modules/@types/normalize-package-data": { @@ -9206,6 +9207,12 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, "node_modules/@unimodules/core": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/@unimodules/core/-/core-7.1.2.tgz", @@ -11245,7 +11252,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -12063,7 +12069,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "devOptional": true, "dependencies": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" @@ -14220,18 +14225,19 @@ } }, "node_modules/eslint": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.51.0.tgz", - "integrity": "sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.55.0.tgz", + "integrity": "sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.51.0", - "@humanwhocodes/config-array": "^0.11.11", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.55.0", + "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -15891,7 +15897,6 @@ "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, "dependencies": { "is-callable": "^1.1.3" } @@ -16151,7 +16156,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "devOptional": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -16204,7 +16208,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", - "devOptional": true, "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -16355,7 +16358,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -16426,7 +16428,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", - "devOptional": true, "engines": { "node": ">= 0.4.0" } @@ -16465,7 +16466,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "devOptional": true, "engines": { "node": ">= 0.4" }, @@ -16477,7 +16477,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "devOptional": true, "engines": { "node": ">= 0.4" }, @@ -16489,7 +16488,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, "dependencies": { "has-symbols": "^1.0.2" }, @@ -17081,6 +17079,21 @@ "node": ">= 0.10" } }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-array-buffer": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", @@ -17152,7 +17165,6 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -17257,6 +17269,20 @@ "node": ">=4" } }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -17530,7 +17556,6 @@ "version": "1.1.12", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", - "dev": true, "dependencies": { "which-typed-array": "^1.1.11" }, @@ -23137,9 +23162,9 @@ } }, "node_modules/prettier": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", - "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.0.tgz", + "integrity": "sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" @@ -26870,9 +26895,9 @@ } }, "node_modules/undici-types": { - "version": "5.25.3", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz", - "integrity": "sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==" + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", @@ -27055,6 +27080,18 @@ "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==" }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -27966,7 +28003,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", - "dev": true, "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", diff --git a/package.json b/package.json index 0abdcc4..fa0bcb5 100644 --- a/package.json +++ b/package.json @@ -49,6 +49,7 @@ "reflect-metadata": "^0.1.13", "register-service-worker": "^1.7.2", "three": "^0.156.1", + "util": "^0.12.5", "vue": "^3.3.4", "vue-axios": "^3.5.2", "vue-facing-decorator": "^3.0.2", diff --git a/project.task.yaml b/project.task.yaml index 9b56584..43569bb 100644 --- a/project.task.yaml +++ b/project.task.yaml @@ -1,51 +1,60 @@ tasks: -- remove hard-coded anomalistlabs.com - -- don't show "Give" & "Offer" on project screen if they don't have an identifier -- allow some gives even if they aren't registered - -- in endorser-push-server - mount folder for persistent sqlite DB outside of container -- extract private_key_hex in webpush.py - 40 notifications : - push, where we trigger a ServiceWorker(?) in the app to reach out and check for new data assignee:matthew + - extract private_key_hex in py-push-server webpush.py + - lock down regenerate_vapid endpoint (so only we admins can do it on demand) + - remove sleep in py-push-server app.py + - revisit "maybe" and "never" buttons on accont screen + - see if we can detect OS-level notifications if turned off + - write troubleshooting docs for notifications -- .2 change the "claims" verbiage in feeds (eg. safari-notifications.js) -- .5 allow to manage their notifications even without an identity -- 01 Ensure each action sent to the server has a confirmation - eg registration (ie a toast something that dismisses after 5-10s) - .3 fix the Project-location-selection map display to not show on top of bottom icons (and any other UI tweaks on the map flow) assignee-group:ui - .5 Add infinite scroll to gifts on the home page -- .5 bug - search for "Safari" does not find the project, but if already on the "Anywhere" tab it shows all -- .2 figure out why endorser-mobile search doesn't find recently created PlanAction -- .1 when creating a plan, select location and then make sure you can deselect on Android -- .5 fix where user 0 sees no txns from user 1 on contacts page but sees them on list page -- .1 remove the logic to exclude beforeId in list of plans after server has commit 26b25af605e715600d4f12b6416ed9fd7142d164 assignee:trent -- .2 in SeedBackupView, don't load the mnemonic and keep it in memory; only load it when they click "show" -- fix cert generation (since it didn't happen automatically for Nov 30) -- Discuss whether the remaining tasks are worthwhile before MVP release. +- .5 If notifications are not enabled, add message to front page with link/button to enable + +- show VC details... somehow: + - 01 show my VCs - most interesting, or via search + - 01 allow download of each VC (& confirmations, to show that they actually own their data) + - 04 allow user to download VCs, mine + ones I can see about me from others + - add VC confirmation? + +- Release Minimum Viable Product : + - generate new webpush.db entry, webpush.py private_key_hex & subscription_info & vapid_claims email + - .5 deploy endorser.ch server above Dec 1 (to get plan searches by names as well as descriptions) + - 08 thorough testing for errors & edge cases + - 01 ensure ability to recover server remotely, and add redundant access + - Turn off stats-world or ensure it's usable (eg. cannot zoom out too far and lose world, cannot screenshot). + - Add disclaimers. + - Switch default server to the public server. + - Deploy to a server. + - Ensure public server has limits that work for group adoption. + - Test PWA features on Android and iOS. + - Other features - donation vs give, show offers, show give & outstanding totals, show network view, restrict registration, connect to contacts + blocks: ref:https://raw.githubusercontent.com/trentlarson/lives-of-gifts/master/project.yaml#kickstarter%20for%20time +- make identicons for contacts into more-memorable faces (and maybe change project identicons, too) +- allow some gives even if they aren't registered +- .5 Add start date to project +- .3 check that Android shows "back" buttons on screens without bottom tray - .1 Make give description text box into something that expands as they type? -- 04 allow user to download claims, mine + ones I can see about me from others - .5 customize favicon assignee-group:ui - .2 Show a warning if both giver and recipient are the same (but still allow?) - 01 Would it look better to shrink the buttons on many pages so they don't expand to the width of the screen? assignee-group:ui - .5 Display a more appealing confirmation on the map when erasing the marker -- .5 make a VC details page, or link to endorser.ch -- .1 Add units or different icon to the coins (to distinguish $, BTC, hours, etc) - .5 include the hash of the latest commit on help page next to version (maybe Trent's git-hash branch) - .5 remove references to localStorage for projectId (now that it's pulling from the path) - bug (that is hard to reproduce) - on the second 'give' recorded on prod it showed me as the agent -- make identicons for contacts into more-memorable faces (and maybe change project identicons, too) -- allow download of each VC (to show that they can actually own their data) - +- switch some checks for activeDid to check for isRegistered +- .2 in SeedBackupView, don't load the mnemonic and keep it in memory; only load it when they click "show" +- .5 fix cert generation on server (since it didn't happen automatically for Nov 30) - contacts v+ : - 01 Import all the non-sensitive data (ie. contacts & settings). - .2 show error to user when adding a duplicate contact - 01 parse input more robustly (with CSV lib and not commas) - - stats v1 : - 01 show numeric stats - 04 show different graphic for projects vs people (gnome?) on world @@ -54,21 +63,9 @@ tasks: - maybe - allow type annotations in World.js & landmarks.js (since we get this error - "Types are not supported by current JavaScript version") - 08 convert to cleaner implementation (maybe Drie -- https://github.com/janvorisek/drie) -- Release Minimum Viable Product : - - generate new webpush.db entries, data/webpush.db private_key_hex & subscription_info & vapid_claims email - - .5 deploy endorser.ch server above Dec 1 (to get plan searches by names as well as descriptions) - - 08 thorough testing for errors & edge cases - - 01 ensure ability to recover server remotely, and add redundant access - - Turn off stats-world or ensure it's usable (eg. cannot zoom out too far and lose world, cannot screenshot). - - Add disclaimers. - - Switch default server to the public server. - - Deploy to a server. - - Ensure public server has limits that work for group adoption. - - Test PWA features on Android and iOS. - blocks: ref:https://raw.githubusercontent.com/trentlarson/lives-of-gifts/master/project.yaml#kickstarter%20for%20time - - .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 don't show "Offer" on project screen if they aren't registered - 24 Move to Vite - 32 accept images for projects diff --git a/src/App.vue b/src/App.vue index 038ae3f..585cdcc 100644 --- a/src/App.vue +++ b/src/App.vue @@ -261,7 +261,7 @@ diff --git a/src/views/ClaimView.vue b/src/views/ClaimView.vue new file mode 100644 index 0000000..34b4310 --- /dev/null +++ b/src/views/ClaimView.vue @@ -0,0 +1,472 @@ + + + diff --git a/src/views/ContactQRScanShowView.vue b/src/views/ContactQRScanShowView.vue index 7b42337..15870ea 100644 --- a/src/views/ContactQRScanShowView.vue +++ b/src/views/ContactQRScanShowView.vue @@ -20,7 +20,7 @@ -
+
+
+ +
+ +
+

+ +

+
+ + +

+ Notification Help +

+
+ +
+

Here are things to try to get notifications working.

+ +

Test

+

Somehow call the service-worker self.showNotification

+ +

Check OS-level permissions

+

+ Walk-throughs & screenshots, maybe for all combinations of OS & + browsers. +

+ +

Check browser-level permissions

+

Walk-throughs & screenshots for browser settings

+ +

Explain full reset to start again

+

+ Walk-throughs for clearing everything & subscribing anew to get a + message +

+ +

Auto-detection

+

Show results of auto-detection whether they're turned on

+
+
+ + diff --git a/src/views/HelpView.vue b/src/views/HelpView.vue index 37cae27..f16d1f5 100644 --- a/src/views/HelpView.vue +++ b/src/views/HelpView.vue @@ -181,6 +181,21 @@ different page.

+

+ How do I access even more functionality? +

+

+ There is an "Advanced" section at the bottom of the Account + page. +

+

+ There is a even more functionality in a mobile app (and more + documentation) at + + EndorserSearch.com + +

+

What is your privacy policy?

See diff --git a/src/views/HomeView.vue b/src/views/HomeView.vue index af00edc..a5189a4 100644 --- a/src/views/HomeView.vue +++ b/src/views/HomeView.vue @@ -104,12 +104,14 @@ class="border-b border-dashed border-slate-400 text-orange-400 pb-2 mb-2 font-bold uppercase text-sm" v-if="record.jwtId == feedLastViewedId" > - You've seen all the following before + You've seen all the following

- {{ this.giveDescription(record) }} + + +
@@ -171,13 +173,7 @@ export default class HomeView extends Vue { .equals(activeDid) .first()) as Account; const identity = JSON.parse(account?.identity || "null"); - - if (!identity) { - throw new Error( - "Attempted to load Give records with no identity available.", - ); - } - return identity; + return identity; // may be null } public async getHeaders(identity: IIdentifier) { @@ -347,6 +343,13 @@ export default class HomeView extends Vue { return giverInfo + " gave" + gaveRecipientInfo + ": " + gaveAmount; } + onClickLoadClaim(jwtId: string) { + const route = { + path: "/claim/" + encodeURIComponent(jwtId), + }; + this.$router.push(route); + } + displayAmount(code: string, amt: number) { return "" + amt + " " + this.currencyShortWordForCode(code, amt === 1); } diff --git a/src/views/NewEditProjectView.vue b/src/views/NewEditProjectView.vue index e02427a..eaff9b0 100644 --- a/src/views/NewEditProjectView.vue +++ b/src/views/NewEditProjectView.vue @@ -11,7 +11,7 @@ class="text-lg text-center px-2 py-1 absolute -left-2 -top-1" > - [New/Edit] Plan + Edit Idea
@@ -24,22 +24,28 @@
- {{ description.length }}/500 max. characters + {{ fullClaim.description.length }}/5000 max. characters
+ +
@@ -136,13 +142,17 @@ export default class NewEditProjectView extends Vue { activeDid = ""; apiServer = ""; - description = ""; errorMessage = ""; + fullClaim: PlanVerifiableCredential = { + "@context": "https://schema.org", + "@type": "PlanAction", + name: "", + description: "", + }; // this default is only to avoid errors before plan is loaded includeLocation = false; latitude = 0; longitude = 0; numAccounts = 0; - projectName = ""; zoom = 2; async beforeCreate() { @@ -214,9 +224,12 @@ export default class NewEditProjectView extends Vue { try { const resp = await this.axios.get(url, { headers }); if (resp.status === 200) { - const claim = resp.data.claim; - this.projectName = claim.name; - this.description = claim.description; + this.fullClaim = resp.data.claim; + if (this.fullClaim?.location) { + this.includeLocation = true; + this.latitude = this.fullClaim.location.geo.latitude; + this.longitude = this.fullClaim.location.geo.longitude; + } } } catch (error) { console.error("Got error retrieving that project", error); @@ -225,13 +238,7 @@ export default class NewEditProjectView extends Vue { private async SaveProject(identity: IIdentifier) { // Make a claim - const vcClaim: PlanVerifiableCredential = { - "@context": "https://schema.org", - "@type": "PlanAction", - name: this.projectName, - description: this.description, - identifier: this.projectId || undefined, - }; + const vcClaim: PlanVerifiableCredential = this.fullClaim; if (this.projectId) { vcClaim.identifier = this.projectId; } @@ -293,6 +300,20 @@ export default class NewEditProjectView extends Vue { 2000, this, ); + } else { + console.log( + "Got unexpected 'data' inside response from server", + resp, + ); + this.$notify( + { + group: "alert", + type: "danger", + title: "Error Saving Idea", + text: "Server did not save the idea. Try again.", + }, + -1, + ); } } catch (error) { let userMessage = "There was an error saving the project."; @@ -300,8 +321,8 @@ export default class NewEditProjectView extends Vue { error?: { message?: string }; }>; if (serverError) { + console.log("Got error from server", serverError); if (Object.prototype.hasOwnProperty.call(serverError, "message")) { - console.log(serverError); userMessage = serverError.response?.data?.error?.message || ""; // This is info for the user. this.$notify( { diff --git a/src/views/ProjectViewView.vue b/src/views/ProjectViewView.vue index 0bd1471..07cdef1 100644 --- a/src/views/ProjectViewView.vue +++ b/src/views/ProjectViewView.vue @@ -1,5 +1,5 @@