Browse Source

fix(ui): resolve duplicate attributes and improve code style

- Remove duplicate class attributes in ProjectsView and ClaimView
- Fix attribute ordering for better readability
- Replace this references with direct variable names in templates
- Update icon-size prop to use kebab-case
- Remove unnecessary comments and improve formatting
- Fix import organization in ProjectsView

This commit resolves Vue template errors and improves code consistency.
db-backup-cross-platform
Matthew Raymer 1 week ago
parent
commit
da6a5ee83e
  1. 436
      package-lock.json
  2. 32
      src/components/InfiniteScroll.vue
  3. 1
      src/views/ClaimView.vue
  4. 16
      src/views/ContactsView.vue
  5. 258
      src/views/HomeView.vue
  6. 6
      src/views/ProjectViewView.vue
  7. 6
      src/views/ProjectsView.vue

436
package-lock.json

@ -2602,9 +2602,9 @@
} }
}, },
"node_modules/@capacitor/android": { "node_modules/@capacitor/android": {
"version": "6.2.0", "version": "6.2.1",
"resolved": "https://registry.npmjs.org/@capacitor/android/-/android-6.2.0.tgz", "resolved": "https://registry.npmjs.org/@capacitor/android/-/android-6.2.1.tgz",
"integrity": "sha512-3YIDPylV0Q2adEQ/H568p496QdYG0jK/XGMdx7OGSqdBZen92ciAsYdyhLtyl91UVsN1lBhDi5H6j3T2KS6aJg==", "integrity": "sha512-8gd4CIiQO5LAIlPIfd5mCuodBRxMMdZZEdj8qG8m+dQ1sQ2xyemVpzHmRK8qSCHorsBUCg3D62j2cp6bEBAkdw==",
"license": "MIT", "license": "MIT",
"peerDependencies": { "peerDependencies": {
"@capacitor/core": "^6.2.0" "@capacitor/core": "^6.2.0"
@ -2769,9 +2769,9 @@
} }
}, },
"node_modules/@capacitor/cli": { "node_modules/@capacitor/cli": {
"version": "6.2.0", "version": "6.2.1",
"resolved": "https://registry.npmjs.org/@capacitor/cli/-/cli-6.2.0.tgz", "resolved": "https://registry.npmjs.org/@capacitor/cli/-/cli-6.2.1.tgz",
"integrity": "sha512-EWcXG39mZh35zrHhOqzN1ILeSyMRyEqWVtQDXqMGjCXYRH6b6p5TvyvLDN8ZNy26tbhI3i79gfrgirt+mNwuuw==", "integrity": "sha512-JKl0FpFge8PgQNInw12kcKieQ4BmOyazQ4JGJOfEpVXlgrX1yPhSZTPjngupzTCiK3I7q7iGG5kjun0fDqgSCA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@ionic/cli-framework-output": "^2.2.5", "@ionic/cli-framework-output": "^2.2.5",
@ -2870,18 +2870,18 @@
} }
}, },
"node_modules/@capacitor/core": { "node_modules/@capacitor/core": {
"version": "6.2.0", "version": "6.2.1",
"resolved": "https://registry.npmjs.org/@capacitor/core/-/core-6.2.0.tgz", "resolved": "https://registry.npmjs.org/@capacitor/core/-/core-6.2.1.tgz",
"integrity": "sha512-B9IlJtDpUqhhYb+T8+cp2Db/3RETX36STgjeU2kQZBs/SLAcFiMama227o+msRjLeo3DO+7HJjWVA1+XlyyPEg==", "integrity": "sha512-urZwxa7hVE/BnA18oCFAdizXPse6fCKanQyEqpmz6cBJ2vObwMpyJDG5jBeoSsgocS9+Ax+9vb4ducWJn0y2qQ==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"tslib": "^2.1.0" "tslib": "^2.1.0"
} }
}, },
"node_modules/@capacitor/ios": { "node_modules/@capacitor/ios": {
"version": "6.2.0", "version": "6.2.1",
"resolved": "https://registry.npmjs.org/@capacitor/ios/-/ios-6.2.0.tgz", "resolved": "https://registry.npmjs.org/@capacitor/ios/-/ios-6.2.1.tgz",
"integrity": "sha512-gisvZBIrKT1siiumgpLPY63HmJe69Ed/dOmfQQ+U1MIJmOR5gWGWvfO7QSj/FMatVZS4Xt/8jCoUgzDD1U6kSw==", "integrity": "sha512-tbMlQdQjxe1wyaBvYVU1yTojKJjgluZQsJkALuJxv/6F8QTw5b6vd7X785O/O7cMpIAZfUWo/vtAHzFkRV+kXw==",
"license": "MIT", "license": "MIT",
"peerDependencies": { "peerDependencies": {
"@capacitor/core": "^6.2.0" "@capacitor/core": "^6.2.0"
@ -3826,9 +3826,9 @@
} }
}, },
"node_modules/@electron/asar": { "node_modules/@electron/asar": {
"version": "3.3.1", "version": "3.4.0",
"resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.3.1.tgz", "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.4.0.tgz",
"integrity": "sha512-WtpC/+34p0skWZiarRjLAyqaAX78DofhDxnREy/V5XHfu1XEXbFCSSMcDQ6hNCPJFaPy8/NnUgYuf9uiCkvKPg==", "integrity": "sha512-8ZAmXjsQ17wJxdv4755hZ1Xiw85dwETlWYQwl+imww18CaEK4bxPvAotJEfIZGbRMrNEJOTMyuVQD+yDY03N5Q==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
@ -5181,9 +5181,9 @@
} }
}, },
"node_modules/@expo/cli": { "node_modules/@expo/cli": {
"version": "0.22.22", "version": "0.22.23",
"resolved": "https://registry.npmjs.org/@expo/cli/-/cli-0.22.22.tgz", "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-0.22.23.tgz",
"integrity": "sha512-sOttVuk/8gdnsiSeDpnRNpLgBJHLbyQQC0QBGd2iHpr/x6xSYpgoRO6AqwAwGtQsk4ZEPZ83ulvccei1IIPdwg==", "integrity": "sha512-LXFKu2jnk9ClVD+kw0sJCQ89zei01wz2t4EJwc9P7EwYb8gabC8FtPyM/X7NIE5jtrnTLTUtjW5ovxQSBL7pJQ==",
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"peer": true, "peer": true,
@ -5201,12 +5201,12 @@
"@expo/osascript": "^2.1.6", "@expo/osascript": "^2.1.6",
"@expo/package-manager": "^1.7.2", "@expo/package-manager": "^1.7.2",
"@expo/plist": "^0.2.2", "@expo/plist": "^0.2.2",
"@expo/prebuild-config": "^8.0.29", "@expo/prebuild-config": "^8.0.30",
"@expo/rudder-sdk-node": "^1.1.1", "@expo/rudder-sdk-node": "^1.1.1",
"@expo/spawn-async": "^1.7.2", "@expo/spawn-async": "^1.7.2",
"@expo/ws-tunnel": "^1.0.1", "@expo/ws-tunnel": "^1.0.1",
"@expo/xcpretty": "^4.3.0", "@expo/xcpretty": "^4.3.0",
"@react-native/dev-middleware": "0.76.7", "@react-native/dev-middleware": "0.76.8",
"@urql/core": "^5.0.6", "@urql/core": "^5.0.6",
"@urql/exchange-retry": "^1.3.0", "@urql/exchange-retry": "^1.3.0",
"accepts": "^1.3.8", "accepts": "^1.3.8",
@ -6602,9 +6602,9 @@
} }
}, },
"node_modules/@expo/prebuild-config": { "node_modules/@expo/prebuild-config": {
"version": "8.0.29", "version": "8.0.30",
"resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-8.0.29.tgz", "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-8.0.30.tgz",
"integrity": "sha512-CoZBxUQLZpGwbnPREr2sFnObOn4j+Mp7AHxX6Rz5jhSSz2VifC1jMM4NFiXrZe6LZyjYNqBGRe3D8bAqdpVGkg==", "integrity": "sha512-xNHWGh0xLZjxBXwVbDW+TPeexuQ95FZX2ZRrzJkALxhQiwYQswQSFE7CVUFMC2USIKVklCcgfEvtqnguTBQVxQ==",
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"peer": true, "peer": true,
@ -6614,7 +6614,7 @@
"@expo/config-types": "^52.0.5", "@expo/config-types": "^52.0.5",
"@expo/image-utils": "^0.6.5", "@expo/image-utils": "^0.6.5",
"@expo/json-file": "^9.0.2", "@expo/json-file": "^9.0.2",
"@react-native/normalize-colors": "0.76.7", "@react-native/normalize-colors": "0.76.8",
"debug": "^4.3.1", "debug": "^4.3.1",
"fs-extra": "^9.0.0", "fs-extra": "^9.0.0",
"resolve-from": "^5.0.0", "resolve-from": "^5.0.0",
@ -7999,9 +7999,9 @@
} }
}, },
"node_modules/@react-native/assets-registry": { "node_modules/@react-native/assets-registry": {
"version": "0.78.1", "version": "0.78.2",
"resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.78.1.tgz", "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.78.2.tgz",
"integrity": "sha512-SegfYQFuut05EQIQIVB/6QMGaxJ29jEtPmzFWJdIp/yc2mmhIq7MfWRjwOe6qbONzIdp6Ca8p835hiGiAGyeKQ==", "integrity": "sha512-VHqQqjj1rnh2KQeS3yx4IfFSxIIIDi1jR4yUeC438Q6srwxDohR4W0UkXuSIz0imhlems5eS7yZTjdgSpWHRUQ==",
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"peer": true, "peer": true,
@ -8010,23 +8010,23 @@
} }
}, },
"node_modules/@react-native/babel-plugin-codegen": { "node_modules/@react-native/babel-plugin-codegen": {
"version": "0.76.7", "version": "0.76.8",
"resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.76.7.tgz", "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.76.8.tgz",
"integrity": "sha512-+8H4DXJREM4l/pwLF/wSVMRzVhzhGDix5jLezNrMD9J1U1AMfV2aSkWA1XuqR7pjPs/Vqf6TaPL7vJMZ4LU05Q==", "integrity": "sha512-84RUEhDZS+q7vPtxKi0iMZLd5/W0VN7NOyqX5f+burV3xMYpUhpF5TDJ2Ysol7dJrvEZHm6ISAriO85++V8YDw==",
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"peer": true, "peer": true,
"dependencies": { "dependencies": {
"@react-native/codegen": "0.76.7" "@react-native/codegen": "0.76.8"
}, },
"engines": { "engines": {
"node": ">=18" "node": ">=18"
} }
}, },
"node_modules/@react-native/babel-preset": { "node_modules/@react-native/babel-preset": {
"version": "0.76.7", "version": "0.76.8",
"resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.76.7.tgz", "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.76.8.tgz",
"integrity": "sha512-/c5DYZ6y8tyg+g8tgXKndDT7mWnGmkZ9F+T3qNDfoE3Qh7ucrNeC2XWvU9h5pk8eRtj9l4SzF4aO1phzwoibyg==", "integrity": "sha512-xrP+r3orRzzxtC2TrfGIP6IYi1f4AiWlnSiWf4zxEdMFzKrYdmxhD0FPtAZb77B0DqFIW5AcBFlm4grfL/VgfA==",
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"peer": true, "peer": true,
@ -8072,7 +8072,7 @@
"@babel/plugin-transform-typescript": "^7.25.2", "@babel/plugin-transform-typescript": "^7.25.2",
"@babel/plugin-transform-unicode-regex": "^7.24.7", "@babel/plugin-transform-unicode-regex": "^7.24.7",
"@babel/template": "^7.25.0", "@babel/template": "^7.25.0",
"@react-native/babel-plugin-codegen": "0.76.7", "@react-native/babel-plugin-codegen": "0.76.8",
"babel-plugin-syntax-hermes-parser": "^0.25.1", "babel-plugin-syntax-hermes-parser": "^0.25.1",
"babel-plugin-transform-flow-enums": "^0.0.2", "babel-plugin-transform-flow-enums": "^0.0.2",
"react-refresh": "^0.14.0" "react-refresh": "^0.14.0"
@ -8085,9 +8085,9 @@
} }
}, },
"node_modules/@react-native/codegen": { "node_modules/@react-native/codegen": {
"version": "0.76.7", "version": "0.76.8",
"resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.76.7.tgz", "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.76.8.tgz",
"integrity": "sha512-FAn585Ll65YvkSrKDyAcsdjHhhAGiMlSTUpHh0x7J5ntudUns+voYms0xMP+pEPt0XuLdjhD7zLIIlAWP407+g==", "integrity": "sha512-qvKhcYBkRHJFkeWrYm66kEomQOTVXWiHBkZ8VF9oC/71OJkLszpTpVOuPIyyib6fqhjy9l7mHYGYenSpfYI5Ww==",
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"peer": true, "peer": true,
@ -8109,21 +8109,21 @@
} }
}, },
"node_modules/@react-native/community-cli-plugin": { "node_modules/@react-native/community-cli-plugin": {
"version": "0.78.1", "version": "0.78.2",
"resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.78.1.tgz", "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.78.2.tgz",
"integrity": "sha512-S6vF4oWpFqThpt/dBLrqLQw5ED2M1kg5mVtiL6ZqpoYIg+/e0vg7LZ8EXNbcdMDH4obRnm2xbOd+qlC7mOzNBg==", "integrity": "sha512-xqEnpqxvBlm02mRY58L0NBjF25MTHmbaeA2qBx5VtheH/pXL6MHUbtwB1Q2dJrg9XcK0Np1i9h7N5h9gFwA2Mg==",
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"peer": true, "peer": true,
"dependencies": { "dependencies": {
"@react-native/dev-middleware": "0.78.1", "@react-native/dev-middleware": "0.78.2",
"@react-native/metro-babel-transformer": "0.78.1", "@react-native/metro-babel-transformer": "0.78.2",
"chalk": "^4.0.0", "chalk": "^4.0.0",
"debug": "^2.2.0", "debug": "^2.2.0",
"invariant": "^2.2.4", "invariant": "^2.2.4",
"metro": "^0.81.0", "metro": "^0.81.3",
"metro-config": "^0.81.0", "metro-config": "^0.81.3",
"metro-core": "^0.81.0", "metro-core": "^0.81.3",
"readline": "^1.3.0", "readline": "^1.3.0",
"semver": "^7.1.3" "semver": "^7.1.3"
}, },
@ -8140,9 +8140,9 @@
} }
}, },
"node_modules/@react-native/community-cli-plugin/node_modules/@react-native/debugger-frontend": { "node_modules/@react-native/community-cli-plugin/node_modules/@react-native/debugger-frontend": {
"version": "0.78.1", "version": "0.78.2",
"resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.78.1.tgz", "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.78.2.tgz",
"integrity": "sha512-xev/B++QLxSDpEBWsc74GyCuq9XOHYTBwcGSpsuhOJDUha6WZIbEEvZe3LpVW+OiFso4oGIdnVSQntwippZdWw==", "integrity": "sha512-qNJT679OU/cdAKmZxfBFjqTG+ZC5i/4sLyvbcQjFFypunGSOaWl3mMQFQQdCBIQN+DFDPVSUXTPZQK1uI2j/ow==",
"license": "BSD-3-Clause", "license": "BSD-3-Clause",
"optional": true, "optional": true,
"peer": true, "peer": true,
@ -8151,15 +8151,15 @@
} }
}, },
"node_modules/@react-native/community-cli-plugin/node_modules/@react-native/dev-middleware": { "node_modules/@react-native/community-cli-plugin/node_modules/@react-native/dev-middleware": {
"version": "0.78.1", "version": "0.78.2",
"resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.78.1.tgz", "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.78.2.tgz",
"integrity": "sha512-l8p7/dXa1vWPOdj0iuACkex8lgbLpYyPZ3QXGkocMcpl0bQ24K7hf3Bj02tfptP5PAm16b2RuEi04sjIGHUzzg==", "integrity": "sha512-/u0pGiWVgvx09cYNO4/Okj8v1ZNt4K941pQJPhdwg5AHYuggVHNJjROukXJzZiElYFcJhMfOuxwksiIyx/GAkA==",
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"peer": true, "peer": true,
"dependencies": { "dependencies": {
"@isaacs/ttlcache": "^1.4.1", "@isaacs/ttlcache": "^1.4.1",
"@react-native/debugger-frontend": "0.78.1", "@react-native/debugger-frontend": "0.78.2",
"chrome-launcher": "^0.15.2", "chrome-launcher": "^0.15.2",
"chromium-edge-launcher": "^0.2.0", "chromium-edge-launcher": "^0.2.0",
"connect": "^3.6.5", "connect": "^3.6.5",
@ -8224,9 +8224,9 @@
} }
}, },
"node_modules/@react-native/debugger-frontend": { "node_modules/@react-native/debugger-frontend": {
"version": "0.76.7", "version": "0.76.8",
"resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.76.7.tgz", "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.76.8.tgz",
"integrity": "sha512-89ZtZXt7ZxE94i7T94qzZMhp4Gfcpr/QVpGqEaejAxZD+gvDCH21cYSF+/Rz2ttBazm0rk5MZ0mFqb0Iqp1jmw==", "integrity": "sha512-kSukBw2C++5ENLUCAp/1uEeiFgiHi/MBa71Wgym3UD5qwu2vOSPOTSKRX7q2Jb676MUzTcrIaJBZ/r2qk25u7Q==",
"license": "BSD-3-Clause", "license": "BSD-3-Clause",
"optional": true, "optional": true,
"peer": true, "peer": true,
@ -8235,15 +8235,15 @@
} }
}, },
"node_modules/@react-native/dev-middleware": { "node_modules/@react-native/dev-middleware": {
"version": "0.76.7", "version": "0.76.8",
"resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.76.7.tgz", "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.76.8.tgz",
"integrity": "sha512-Jsw8g9DyLPnR9yHEGuT09yHZ7M88/GL9CtU9WmyChlBwdXSeE3AmRqLegsV3XcgULQ1fqdemokaOZ/MwLYkjdA==", "integrity": "sha512-KYx7hFME2uYQRCDCqb19ghw51TAdh48PZ5EMpoU2kPA1SKKO9c1bUbpsKRhVZ0bv1QqEX6fjox3c4/WYRozHQA==",
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"peer": true, "peer": true,
"dependencies": { "dependencies": {
"@isaacs/ttlcache": "^1.4.1", "@isaacs/ttlcache": "^1.4.1",
"@react-native/debugger-frontend": "0.76.7", "@react-native/debugger-frontend": "0.76.8",
"chrome-launcher": "^0.15.2", "chrome-launcher": "^0.15.2",
"chromium-edge-launcher": "^0.2.0", "chromium-edge-launcher": "^0.2.0",
"connect": "^3.6.5", "connect": "^3.6.5",
@ -8308,9 +8308,9 @@
} }
}, },
"node_modules/@react-native/gradle-plugin": { "node_modules/@react-native/gradle-plugin": {
"version": "0.78.1", "version": "0.78.2",
"resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.78.1.tgz", "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.78.2.tgz",
"integrity": "sha512-v8GJU+8DzQDWO3iuTFI1nbuQ/kzuqbXv07VVtSIMLbdofHzuuQT14DGBacBkrIDKBDTVaBGAc/baDNsyxCghng==", "integrity": "sha512-LHgmdrbyK9fcBDdxtn2GLOoDAE+aFHtDHgu6vUZ5CSCi9CMd5Krq8IWAmWjeq+BQr+D1rwSXDAHtOrfJ6qOolA==",
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"peer": true, "peer": true,
@ -8319,9 +8319,9 @@
} }
}, },
"node_modules/@react-native/js-polyfills": { "node_modules/@react-native/js-polyfills": {
"version": "0.78.1", "version": "0.78.2",
"resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.78.1.tgz", "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.78.2.tgz",
"integrity": "sha512-Ogcv4QOA1o3IyErrf/i4cDnP+nfNcIfGTgw6iNQyAPry1xjPOz4ziajskLpWG/3ADeneIZuyZppKB4A28rZSvg==", "integrity": "sha512-b7eCPAs3uogdDeTvOTrU6i8DTTsHyjyp48R5pVakJIREhEx+SkUnlVk11PYjbCKGYjYgN939Tb5b1QWNtdrPIQ==",
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"peer": true, "peer": true,
@ -8330,15 +8330,15 @@
} }
}, },
"node_modules/@react-native/metro-babel-transformer": { "node_modules/@react-native/metro-babel-transformer": {
"version": "0.78.1", "version": "0.78.2",
"resolved": "https://registry.npmjs.org/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.78.1.tgz", "resolved": "https://registry.npmjs.org/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.78.2.tgz",
"integrity": "sha512-jQWf69D+QTMvSZSWLR+cr3VUF16rGB6sbD+bItD8Czdfn3hajzfMoHJTkVFP7991cjK5sIVekNiQIObou8JSQw==", "integrity": "sha512-H4614LjcbrG+lUtg+ysMX5RnovY8AwrWj4rH8re6ErfhPFwLQXV0LIrl/fgFpq07Vjc5e3ZXzuKuMJF6l7eeTQ==",
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"peer": true, "peer": true,
"dependencies": { "dependencies": {
"@babel/core": "^7.25.2", "@babel/core": "^7.25.2",
"@react-native/babel-preset": "0.78.1", "@react-native/babel-preset": "0.78.2",
"hermes-parser": "0.25.1", "hermes-parser": "0.25.1",
"nullthrows": "^1.1.1" "nullthrows": "^1.1.1"
}, },
@ -8350,24 +8350,24 @@
} }
}, },
"node_modules/@react-native/metro-babel-transformer/node_modules/@react-native/babel-plugin-codegen": { "node_modules/@react-native/metro-babel-transformer/node_modules/@react-native/babel-plugin-codegen": {
"version": "0.78.1", "version": "0.78.2",
"resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.78.1.tgz", "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.78.2.tgz",
"integrity": "sha512-rD0tnct/yPEtoOc8eeFHIf8ZJJJEzLkmqLs8HZWSkt3w9VYWngqLXZxiDGqv0ngXjunAlC/Hpq+ULMVOvOnByw==", "integrity": "sha512-0MnQOhIaOdWbQ3Dx3dz0MBbG+1ggBiyUL+Y+xHAeSDSaiRATT8DIsrSloeJU0A+2p5TxF8ITJyJ6KEQkMyB/Zw==",
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"peer": true, "peer": true,
"dependencies": { "dependencies": {
"@babel/traverse": "^7.25.3", "@babel/traverse": "^7.25.3",
"@react-native/codegen": "0.78.1" "@react-native/codegen": "0.78.2"
}, },
"engines": { "engines": {
"node": ">=18" "node": ">=18"
} }
}, },
"node_modules/@react-native/metro-babel-transformer/node_modules/@react-native/babel-preset": { "node_modules/@react-native/metro-babel-transformer/node_modules/@react-native/babel-preset": {
"version": "0.78.1", "version": "0.78.2",
"resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.78.1.tgz", "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.78.2.tgz",
"integrity": "sha512-yTVcHmEdNQH4Ju7lhvbiQaGxBpMcalgkBy/IvHowXKk/ex3nY1PolF16/mBG1BrefcUA/rtJpqTtk2Ii+7T/Lw==", "integrity": "sha512-VGOLhztQY/0vktMXrBr01HUN/iBSdkKBRiiZYfrLqx9fB2ql55gZb/6X9lzItjVyYoOc2jyHXSX8yoSfDcWDZg==",
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"peer": true, "peer": true,
@ -8413,7 +8413,7 @@
"@babel/plugin-transform-typescript": "^7.25.2", "@babel/plugin-transform-typescript": "^7.25.2",
"@babel/plugin-transform-unicode-regex": "^7.24.7", "@babel/plugin-transform-unicode-regex": "^7.24.7",
"@babel/template": "^7.25.0", "@babel/template": "^7.25.0",
"@react-native/babel-plugin-codegen": "0.78.1", "@react-native/babel-plugin-codegen": "0.78.2",
"babel-plugin-syntax-hermes-parser": "0.25.1", "babel-plugin-syntax-hermes-parser": "0.25.1",
"babel-plugin-transform-flow-enums": "^0.0.2", "babel-plugin-transform-flow-enums": "^0.0.2",
"react-refresh": "^0.14.0" "react-refresh": "^0.14.0"
@ -8426,9 +8426,9 @@
} }
}, },
"node_modules/@react-native/metro-babel-transformer/node_modules/@react-native/codegen": { "node_modules/@react-native/metro-babel-transformer/node_modules/@react-native/codegen": {
"version": "0.78.1", "version": "0.78.2",
"resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.78.1.tgz", "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.78.2.tgz",
"integrity": "sha512-kGG5qAM9JdFtxzUwe7c6CyJbsU2PnaTrtCHA2dF8VEiNX1K3yd9yKPzfkxA7HPvmHoAn3ga1941O79BStWcM3A==", "integrity": "sha512-4r3/W1h22/GAmAMuMRMJWsw/9JGUEDAnSbYNya7zID1XSvizLoA5Yn8Qv+phrRwwsl0eZLxOqONh/nzXJcvpyg==",
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"peer": true, "peer": true,
@ -8571,17 +8571,17 @@
} }
}, },
"node_modules/@react-native/normalize-colors": { "node_modules/@react-native/normalize-colors": {
"version": "0.76.7", "version": "0.76.8",
"resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.76.7.tgz", "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.76.8.tgz",
"integrity": "sha512-ST1xxBuYVIXPdD81dR6+tzIgso7m3pa9+6rOBXTh5Xm7KEEFik7tnQX+GydXYMp3wr1gagJjragdXkPnxK6WNg==", "integrity": "sha512-FRjRvs7RgsXjkbGSOjYSxhX5V70c0IzA/jy3HXeYpATMwD9fOR1DbveLW497QGsVdCa0vThbJUtR8rIzAfpHQA==",
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"peer": true "peer": true
}, },
"node_modules/@react-native/virtualized-lists": { "node_modules/@react-native/virtualized-lists": {
"version": "0.78.1", "version": "0.78.2",
"resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.78.1.tgz", "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.78.2.tgz",
"integrity": "sha512-v0jqDNMFXpnRnSlkDVvwNxXgPhifzzTFlxTSnHj9erKJsKpE26gSU5qB4hmJkEsscLG/ygdJ1c88aqinSh/wRA==", "integrity": "sha512-y/wVRUz1ImR2hKKUXFroTdSBiL0Dd+oudzqcGKp/M8Ybrw9MQ0m2QCXxtyONtDn8qkEGceqllwTCKq5WQwJcew==",
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"peer": true, "peer": true,
@ -8688,9 +8688,9 @@
} }
}, },
"node_modules/@rollup/rollup-android-arm-eabi": { "node_modules/@rollup/rollup-android-arm-eabi": {
"version": "4.38.0", "version": "4.39.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.38.0.tgz", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.39.0.tgz",
"integrity": "sha512-ldomqc4/jDZu/xpYU+aRxo3V4mGCV9HeTgUBANI3oIQMOL+SsxB+S2lxMpkFp5UamSS3XuTMQVbsS24R4J4Qjg==", "integrity": "sha512-lGVys55Qb00Wvh8DMAocp5kIcaNzEFTmGhfFd88LfaogYTRKrdxgtlO5H6S49v2Nd8R2C6wLOal0qv6/kCkOwA==",
"cpu": [ "cpu": [
"arm" "arm"
], ],
@ -8702,9 +8702,9 @@
] ]
}, },
"node_modules/@rollup/rollup-android-arm64": { "node_modules/@rollup/rollup-android-arm64": {
"version": "4.38.0", "version": "4.39.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.38.0.tgz", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.39.0.tgz",
"integrity": "sha512-VUsgcy4GhhT7rokwzYQP+aV9XnSLkkhlEJ0St8pbasuWO/vwphhZQxYEKUP3ayeCYLhk6gEtacRpYP/cj3GjyQ==", "integrity": "sha512-It9+M1zE31KWfqh/0cJLrrsCPiF72PoJjIChLX+rEcujVRCb4NLQ5QzFkzIZW8Kn8FTbvGQBY5TkKBau3S8cCQ==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -8716,9 +8716,9 @@
] ]
}, },
"node_modules/@rollup/rollup-darwin-arm64": { "node_modules/@rollup/rollup-darwin-arm64": {
"version": "4.38.0", "version": "4.39.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.38.0.tgz", "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.39.0.tgz",
"integrity": "sha512-buA17AYXlW9Rn091sWMq1xGUvWQFOH4N1rqUxGJtEQzhChxWjldGCCup7r/wUnaI6Au8sKXpoh0xg58a7cgcpg==", "integrity": "sha512-lXQnhpFDOKDXiGxsU9/l8UEGGM65comrQuZ+lDcGUx+9YQ9dKpF3rSEGepyeR5AHZ0b5RgiligsBhWZfSSQh8Q==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -8730,9 +8730,9 @@
] ]
}, },
"node_modules/@rollup/rollup-darwin-x64": { "node_modules/@rollup/rollup-darwin-x64": {
"version": "4.38.0", "version": "4.39.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.38.0.tgz", "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.39.0.tgz",
"integrity": "sha512-Mgcmc78AjunP1SKXl624vVBOF2bzwNWFPMP4fpOu05vS0amnLcX8gHIge7q/lDAHy3T2HeR0TqrriZDQS2Woeg==", "integrity": "sha512-mKXpNZLvtEbgu6WCkNij7CGycdw9cJi2k9v0noMb++Vab12GZjFgUXD69ilAbBh034Zwn95c2PNSz9xM7KYEAQ==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -8744,9 +8744,9 @@
] ]
}, },
"node_modules/@rollup/rollup-freebsd-arm64": { "node_modules/@rollup/rollup-freebsd-arm64": {
"version": "4.38.0", "version": "4.39.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.38.0.tgz", "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.39.0.tgz",
"integrity": "sha512-zzJACgjLbQTsscxWqvrEQAEh28hqhebpRz5q/uUd1T7VTwUNZ4VIXQt5hE7ncs0GrF+s7d3S4on4TiXUY8KoQA==", "integrity": "sha512-jivRRlh2Lod/KvDZx2zUR+I4iBfHcu2V/BA2vasUtdtTN2Uk3jfcZczLa81ESHZHPHy4ih3T/W5rPFZ/hX7RtQ==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -8758,9 +8758,9 @@
] ]
}, },
"node_modules/@rollup/rollup-freebsd-x64": { "node_modules/@rollup/rollup-freebsd-x64": {
"version": "4.38.0", "version": "4.39.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.38.0.tgz", "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.39.0.tgz",
"integrity": "sha512-hCY/KAeYMCyDpEE4pTETam0XZS4/5GXzlLgpi5f0IaPExw9kuB+PDTOTLuPtM10TlRG0U9OSmXJ+Wq9J39LvAg==", "integrity": "sha512-8RXIWvYIRK9nO+bhVz8DwLBepcptw633gv/QT4015CpJ0Ht8punmoHU/DuEd3iw9Hr8UwUV+t+VNNuZIWYeY7Q==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -8772,9 +8772,9 @@
] ]
}, },
"node_modules/@rollup/rollup-linux-arm-gnueabihf": { "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
"version": "4.38.0", "version": "4.39.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.38.0.tgz", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.39.0.tgz",
"integrity": "sha512-mimPH43mHl4JdOTD7bUMFhBdrg6f9HzMTOEnzRmXbOZqjijCw8LA5z8uL6LCjxSa67H2xiLFvvO67PT05PRKGg==", "integrity": "sha512-mz5POx5Zu58f2xAG5RaRRhp3IZDK7zXGk5sdEDj4o96HeaXhlUwmLFzNlc4hCQi5sGdR12VDgEUqVSHer0lI9g==",
"cpu": [ "cpu": [
"arm" "arm"
], ],
@ -8786,9 +8786,9 @@
] ]
}, },
"node_modules/@rollup/rollup-linux-arm-musleabihf": { "node_modules/@rollup/rollup-linux-arm-musleabihf": {
"version": "4.38.0", "version": "4.39.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.38.0.tgz", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.39.0.tgz",
"integrity": "sha512-tPiJtiOoNuIH8XGG8sWoMMkAMm98PUwlriOFCCbZGc9WCax+GLeVRhmaxjJtz6WxrPKACgrwoZ5ia/uapq3ZVg==", "integrity": "sha512-+YDwhM6gUAyakl0CD+bMFpdmwIoRDzZYaTWV3SDRBGkMU/VpIBYXXEvkEcTagw/7VVkL2vA29zU4UVy1mP0/Yw==",
"cpu": [ "cpu": [
"arm" "arm"
], ],
@ -8800,9 +8800,9 @@
] ]
}, },
"node_modules/@rollup/rollup-linux-arm64-gnu": { "node_modules/@rollup/rollup-linux-arm64-gnu": {
"version": "4.38.0", "version": "4.39.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.38.0.tgz", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.39.0.tgz",
"integrity": "sha512-wZco59rIVuB0tjQS0CSHTTUcEde+pXQWugZVxWaQFdQQ1VYub/sTrNdY76D1MKdN2NB48JDuGABP6o6fqos8mA==", "integrity": "sha512-EKf7iF7aK36eEChvlgxGnk7pdJfzfQbNvGV/+l98iiMwU23MwvmV0Ty3pJ0p5WQfm3JRHOytSIqD9LB7Bq7xdQ==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -8814,9 +8814,9 @@
] ]
}, },
"node_modules/@rollup/rollup-linux-arm64-musl": { "node_modules/@rollup/rollup-linux-arm64-musl": {
"version": "4.38.0", "version": "4.39.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.38.0.tgz", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.39.0.tgz",
"integrity": "sha512-fQgqwKmW0REM4LomQ+87PP8w8xvU9LZfeLBKybeli+0yHT7VKILINzFEuggvnV9M3x1Ed4gUBmGUzCo/ikmFbQ==", "integrity": "sha512-vYanR6MtqC7Z2SNr8gzVnzUul09Wi1kZqJaek3KcIlI/wq5Xtq4ZPIZ0Mr/st/sv/NnaPwy/D4yXg5x0B3aUUA==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -8828,9 +8828,9 @@
] ]
}, },
"node_modules/@rollup/rollup-linux-loongarch64-gnu": { "node_modules/@rollup/rollup-linux-loongarch64-gnu": {
"version": "4.38.0", "version": "4.39.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.38.0.tgz", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.39.0.tgz",
"integrity": "sha512-hz5oqQLXTB3SbXpfkKHKXLdIp02/w3M+ajp8p4yWOWwQRtHWiEOCKtc9U+YXahrwdk+3qHdFMDWR5k+4dIlddg==", "integrity": "sha512-NMRUT40+h0FBa5fb+cpxtZoGAggRem16ocVKIv5gDB5uLDgBIwrIsXlGqYbLwW8YyO3WVTk1FkFDjMETYlDqiw==",
"cpu": [ "cpu": [
"loong64" "loong64"
], ],
@ -8842,9 +8842,9 @@
] ]
}, },
"node_modules/@rollup/rollup-linux-powerpc64le-gnu": { "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
"version": "4.38.0", "version": "4.39.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.38.0.tgz", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.39.0.tgz",
"integrity": "sha512-NXqygK/dTSibQ+0pzxsL3r4Xl8oPqVoWbZV9niqOnIHV/J92fe65pOir0xjkUZDRSPyFRvu+4YOpJF9BZHQImw==", "integrity": "sha512-0pCNnmxgduJ3YRt+D+kJ6Ai/r+TaePu9ZLENl+ZDV/CdVczXl95CbIiwwswu4L+K7uOIGf6tMo2vm8uadRaICQ==",
"cpu": [ "cpu": [
"ppc64" "ppc64"
], ],
@ -8856,9 +8856,9 @@
] ]
}, },
"node_modules/@rollup/rollup-linux-riscv64-gnu": { "node_modules/@rollup/rollup-linux-riscv64-gnu": {
"version": "4.38.0", "version": "4.39.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.38.0.tgz", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.39.0.tgz",
"integrity": "sha512-GEAIabR1uFyvf/jW/5jfu8gjM06/4kZ1W+j1nWTSSB3w6moZEBm7iBtzwQ3a1Pxos2F7Gz+58aVEnZHU295QTg==", "integrity": "sha512-t7j5Zhr7S4bBtksT73bO6c3Qa2AV/HqiGlj9+KB3gNF5upcVkx+HLgxTm8DK4OkzsOYqbdqbLKwvGMhylJCPhQ==",
"cpu": [ "cpu": [
"riscv64" "riscv64"
], ],
@ -8870,9 +8870,9 @@
] ]
}, },
"node_modules/@rollup/rollup-linux-riscv64-musl": { "node_modules/@rollup/rollup-linux-riscv64-musl": {
"version": "4.38.0", "version": "4.39.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.38.0.tgz", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.39.0.tgz",
"integrity": "sha512-9EYTX+Gus2EGPbfs+fh7l95wVADtSQyYw4DfSBcYdUEAmP2lqSZY0Y17yX/3m5VKGGJ4UmIH5LHLkMJft3bYoA==", "integrity": "sha512-m6cwI86IvQ7M93MQ2RF5SP8tUjD39Y7rjb1qjHgYh28uAPVU8+k/xYWvxRO3/tBN2pZkSMa5RjnPuUIbrwVxeA==",
"cpu": [ "cpu": [
"riscv64" "riscv64"
], ],
@ -8884,9 +8884,9 @@
] ]
}, },
"node_modules/@rollup/rollup-linux-s390x-gnu": { "node_modules/@rollup/rollup-linux-s390x-gnu": {
"version": "4.38.0", "version": "4.39.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.38.0.tgz", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.39.0.tgz",
"integrity": "sha512-Mpp6+Z5VhB9VDk7RwZXoG2qMdERm3Jw07RNlXHE0bOnEeX+l7Fy4bg+NxfyN15ruuY3/7Vrbpm75J9QHFqj5+Q==", "integrity": "sha512-iRDJd2ebMunnk2rsSBYlsptCyuINvxUfGwOUldjv5M4tpa93K8tFMeYGpNk2+Nxl+OBJnBzy2/JCscGeO507kA==",
"cpu": [ "cpu": [
"s390x" "s390x"
], ],
@ -8898,9 +8898,9 @@
] ]
}, },
"node_modules/@rollup/rollup-linux-x64-gnu": { "node_modules/@rollup/rollup-linux-x64-gnu": {
"version": "4.38.0", "version": "4.39.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.38.0.tgz", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.39.0.tgz",
"integrity": "sha512-vPvNgFlZRAgO7rwncMeE0+8c4Hmc+qixnp00/Uv3ht2x7KYrJ6ERVd3/R0nUtlE6/hu7/HiiNHJ/rP6knRFt1w==", "integrity": "sha512-t9jqYw27R6Lx0XKfEFe5vUeEJ5pF3SGIM6gTfONSMb7DuG6z6wfj2yjcoZxHg129veTqU7+wOhY6GX8wmf90dA==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -8912,9 +8912,9 @@
] ]
}, },
"node_modules/@rollup/rollup-linux-x64-musl": { "node_modules/@rollup/rollup-linux-x64-musl": {
"version": "4.38.0", "version": "4.39.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.38.0.tgz", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.39.0.tgz",
"integrity": "sha512-q5Zv+goWvQUGCaL7fU8NuTw8aydIL/C9abAVGCzRReuj5h30TPx4LumBtAidrVOtXnlB+RZkBtExMsfqkMfb8g==", "integrity": "sha512-ThFdkrFDP55AIsIZDKSBWEt/JcWlCzydbZHinZ0F/r1h83qbGeenCt/G/wG2O0reuENDD2tawfAj2s8VK7Bugg==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -8926,9 +8926,9 @@
] ]
}, },
"node_modules/@rollup/rollup-win32-arm64-msvc": { "node_modules/@rollup/rollup-win32-arm64-msvc": {
"version": "4.38.0", "version": "4.39.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.38.0.tgz", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.39.0.tgz",
"integrity": "sha512-u/Jbm1BU89Vftqyqbmxdq14nBaQjQX1HhmsdBWqSdGClNaKwhjsg5TpW+5Ibs1mb8Es9wJiMdl86BcmtUVXNZg==", "integrity": "sha512-jDrLm6yUtbOg2TYB3sBF3acUnAwsIksEYjLeHL+TJv9jg+TmTwdyjnDex27jqEMakNKf3RwwPahDIt7QXCSqRQ==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -8940,9 +8940,9 @@
] ]
}, },
"node_modules/@rollup/rollup-win32-ia32-msvc": { "node_modules/@rollup/rollup-win32-ia32-msvc": {
"version": "4.38.0", "version": "4.39.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.38.0.tgz", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.39.0.tgz",
"integrity": "sha512-mqu4PzTrlpNHHbu5qleGvXJoGgHpChBlrBx/mEhTPpnAL1ZAYFlvHD7rLK839LLKQzqEQMFJfGrrOHItN4ZQqA==", "integrity": "sha512-6w9uMuza+LbLCVoNKL5FSLE7yvYkq9laSd09bwS0tMjkwXrmib/4KmoJcrKhLWHvw19mwU+33ndC69T7weNNjQ==",
"cpu": [ "cpu": [
"ia32" "ia32"
], ],
@ -8954,9 +8954,9 @@
] ]
}, },
"node_modules/@rollup/rollup-win32-x64-msvc": { "node_modules/@rollup/rollup-win32-x64-msvc": {
"version": "4.38.0", "version": "4.39.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.38.0.tgz", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.39.0.tgz",
"integrity": "sha512-jjqy3uWlecfB98Psxb5cD6Fny9Fupv9LrDSPTQZUROqjvZmcCqNu4UMl7qqhlUUGpwiAkotj6GYu4SZdcr/nLw==", "integrity": "sha512-yAkUOkIKZlK5dl7u6dg897doBgLXmUHhIINM2c+sND3DZwnrdQkkSiDh7N75Ll4mM4dxSkYfXqU9fW3lLkMFug==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -9829,9 +9829,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/@types/emscripten": { "node_modules/@types/emscripten": {
"version": "1.40.0", "version": "1.40.1",
"resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.40.0.tgz", "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.40.1.tgz",
"integrity": "sha512-MD2JJ25S4tnjnhjWyalMS6K6p0h+zQV6+Ylm+aGbiS8tSn/aHLSGNzBgduj6FB4zH0ax2GRMGYi/8G1uOxhXWA==", "integrity": "sha512-sr53lnYkQNhjHNN0oJDdUm5564biioI5DuOpycufDVK7D3y+GR3oUswe2rlwY1nPNyusHbrJ9WoTyIHl4/Bpwg==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/@types/estree": { "node_modules/@types/estree": {
@ -9946,9 +9946,9 @@
} }
}, },
"node_modules/@types/luxon": { "node_modules/@types/luxon": {
"version": "3.4.2", "version": "3.6.0",
"resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.4.2.tgz", "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.6.0.tgz",
"integrity": "sha512-TifLZlFudklWlMBfhubvgqTXRzLDI5pCbGa4P8a3wPyUQSW+1xQ5eDsreP9DWHX3tjq1ke96uYG/nwundroWcA==", "integrity": "sha512-RtEj20xRyG7cRp142MkQpV3GRF8Wo2MtDkKLz65MQs7rM1Lh8bz+HtfPXCCJEYpnDFu6VwAq/Iv2Ikyp9Jw/hw==",
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
@ -9967,9 +9967,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "20.17.28", "version": "20.17.30",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.28.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.30.tgz",
"integrity": "sha512-DHlH/fNL6Mho38jTy7/JT7sn2wnXI+wULR6PV4gy4VHLVvnrV/d3pHAMQHhc4gjdLmK2ZiPoMxzp6B3yRajLSQ==", "integrity": "sha512-7zf4YyHA+jvBNfVrk2Gtvs6x7E8V+YDW05bNfG2XkWDJfYRXrTiP/DsB2zSYTaHX0bGIujTBQdMVAhb+j7mwpg==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"undici-types": "~6.19.2" "undici-types": "~6.19.2"
@ -12320,9 +12320,9 @@
} }
}, },
"node_modules/babel-preset-expo": { "node_modules/babel-preset-expo": {
"version": "12.0.9", "version": "12.0.10",
"resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-12.0.9.tgz", "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-12.0.10.tgz",
"integrity": "sha512-1c+ysrTavT49WgVAj0OX/TEzt1kU2mfPhDaDajstshNHXFKPenMPWSViA/DHrJKVIMwaqr+z3GbUOD9GtKgpdg==", "integrity": "sha512-6QE52Bxsp5XRE8t0taKRFTFsmTG0ThQE+PTgCgLY9s8v2Aeh8R+E+riXhSHX6hP+diDmBFBdvLCUTq7kroJb1Q==",
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"peer": true, "peer": true,
@ -12333,7 +12333,7 @@
"@babel/plugin-transform-parameters": "^7.22.15", "@babel/plugin-transform-parameters": "^7.22.15",
"@babel/preset-react": "^7.22.15", "@babel/preset-react": "^7.22.15",
"@babel/preset-typescript": "^7.23.0", "@babel/preset-typescript": "^7.23.0",
"@react-native/babel-preset": "0.76.7", "@react-native/babel-preset": "0.76.8",
"babel-plugin-react-native-web": "~0.19.13", "babel-plugin-react-native-web": "~0.19.13",
"react-refresh": "^0.14.2" "react-refresh": "^0.14.2"
}, },
@ -15601,9 +15601,9 @@
} }
}, },
"node_modules/electron-to-chromium": { "node_modules/electron-to-chromium": {
"version": "1.5.128", "version": "1.5.129",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.128.tgz", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.129.tgz",
"integrity": "sha512-bo1A4HH/NS522Ws0QNFIzyPcyUUNV/yyy70Ho1xqfGYzPUme2F/xr4tlEOuM6/A538U1vDA7a4XfCd1CKRegKQ==", "integrity": "sha512-JlXUemX4s0+9f8mLqib/bHH8gOHf5elKS6KeWG3sk3xozb/JTq/RLXIv8OKUWiK4Ah00Wm88EFj5PYkFr4RUPA==",
"devOptional": true, "devOptional": true,
"license": "ISC" "license": "ISC"
}, },
@ -16642,21 +16642,21 @@
} }
}, },
"node_modules/expo": { "node_modules/expo": {
"version": "52.0.41", "version": "52.0.42",
"resolved": "https://registry.npmjs.org/expo/-/expo-52.0.41.tgz", "resolved": "https://registry.npmjs.org/expo/-/expo-52.0.42.tgz",
"integrity": "sha512-qFdt1l2ltj5XWf1tnQ5UidWkaNQWf3CbhldjVb/ui/iGp1x038W7QUhT6BwaCOY6N9yuCZKnFS4Uk9Cxwfsc+w==", "integrity": "sha512-t+PRYIzzPFAlF99OVJOjZwM1glLhN85XGD6vmeg6uwpADDILl9yw4dfy0DXL4hot5GJkAGaZ+uOHUljV4kC2Bg==",
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"peer": true, "peer": true,
"dependencies": { "dependencies": {
"@babel/runtime": "^7.20.0", "@babel/runtime": "^7.20.0",
"@expo/cli": "0.22.22", "@expo/cli": "0.22.23",
"@expo/config": "~10.0.11", "@expo/config": "~10.0.11",
"@expo/config-plugins": "~9.0.17", "@expo/config-plugins": "~9.0.17",
"@expo/fingerprint": "0.11.11", "@expo/fingerprint": "0.11.11",
"@expo/metro-config": "0.19.12", "@expo/metro-config": "0.19.12",
"@expo/vector-icons": "^14.0.0", "@expo/vector-icons": "^14.0.0",
"babel-preset-expo": "~12.0.9", "babel-preset-expo": "~12.0.10",
"expo-asset": "~11.0.5", "expo-asset": "~11.0.5",
"expo-constants": "~17.0.8", "expo-constants": "~17.0.8",
"expo-file-system": "~18.0.12", "expo-file-system": "~18.0.12",
@ -20874,9 +20874,9 @@
"license": "ISC" "license": "ISC"
}, },
"node_modules/luxon": { "node_modules/luxon": {
"version": "3.6.0", "version": "3.6.1",
"resolved": "https://registry.npmjs.org/luxon/-/luxon-3.6.0.tgz", "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.6.1.tgz",
"integrity": "sha512-WE7p0p7W1xji9qxkLYsvcIxZyfP48GuFrWIBQZIsbjCyf65dG1rv4n83HcOyEyhvzxJCrUoObCRNFgRNIQ5KNA==", "integrity": "sha512-tJLxrKJhO2ukZ5z0gyjY1zPh3Rh88Ej9P7jNrZiHMUXHae1yvI2imgOZtL1TO8TW6biMMKfTtAOoEJANgtWBMQ==",
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">=12" "node": ">=12"
@ -23524,9 +23524,9 @@
} }
}, },
"node_modules/nostr-tools": { "node_modules/nostr-tools": {
"version": "2.11.0", "version": "2.11.1",
"resolved": "https://registry.npmjs.org/nostr-tools/-/nostr-tools-2.11.0.tgz", "resolved": "https://registry.npmjs.org/nostr-tools/-/nostr-tools-2.11.1.tgz",
"integrity": "sha512-kRtXI9j5f45NvIcdJacQ0UEAfEb7p/jhZqhAGLQWtUd5idZJPYdSyR8hdw+MmpGH4TCMH5plZrXzFltIIZrkEA==", "integrity": "sha512-+Oj5t+behIkU9kh3go5wg8Aa5oR7euBU9gOItUNapJe5Gaa+KPzMuTIN+rMRK3DaZ4Zt6RM4kR/ddwstzGKf7g==",
"license": "Unlicense", "license": "Unlicense",
"dependencies": { "dependencies": {
"@noble/ciphers": "^0.5.1", "@noble/ciphers": "^0.5.1",
@ -25409,21 +25409,21 @@
"peer": true "peer": true
}, },
"node_modules/react-native": { "node_modules/react-native": {
"version": "0.78.1", "version": "0.78.2",
"resolved": "https://registry.npmjs.org/react-native/-/react-native-0.78.1.tgz", "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.78.2.tgz",
"integrity": "sha512-3CK/xxX02GeeVFyrXbsHvREZFVaXwHW43Km/EdYITn5G32cccWTGaqY9QdPddEBLw5O3BPip3LHbR1SywE0cpA==", "integrity": "sha512-UilZ8sP9amHCz7TTMWMJ71JeYcMzEdgCJaqTfoB1hC/nYMXq6xqSFxKWCDhf7sR7nz3FKxS4t338t42AMDDkww==",
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"peer": true, "peer": true,
"dependencies": { "dependencies": {
"@jest/create-cache-key-function": "^29.6.3", "@jest/create-cache-key-function": "^29.6.3",
"@react-native/assets-registry": "0.78.1", "@react-native/assets-registry": "0.78.2",
"@react-native/codegen": "0.78.1", "@react-native/codegen": "0.78.2",
"@react-native/community-cli-plugin": "0.78.1", "@react-native/community-cli-plugin": "0.78.2",
"@react-native/gradle-plugin": "0.78.1", "@react-native/gradle-plugin": "0.78.2",
"@react-native/js-polyfills": "0.78.1", "@react-native/js-polyfills": "0.78.2",
"@react-native/normalize-colors": "0.78.1", "@react-native/normalize-colors": "0.78.2",
"@react-native/virtualized-lists": "0.78.1", "@react-native/virtualized-lists": "0.78.2",
"abort-controller": "^3.0.0", "abort-controller": "^3.0.0",
"anser": "^1.4.9", "anser": "^1.4.9",
"ansi-regex": "^5.0.0", "ansi-regex": "^5.0.0",
@ -25438,8 +25438,8 @@
"invariant": "^2.2.4", "invariant": "^2.2.4",
"jest-environment-node": "^29.6.3", "jest-environment-node": "^29.6.3",
"memoize-one": "^5.0.0", "memoize-one": "^5.0.0",
"metro-runtime": "^0.81.0", "metro-runtime": "^0.81.3",
"metro-source-map": "^0.81.0", "metro-source-map": "^0.81.3",
"nullthrows": "^1.1.1", "nullthrows": "^1.1.1",
"pretty-format": "^29.7.0", "pretty-format": "^29.7.0",
"promise": "^8.3.0", "promise": "^8.3.0",
@ -25483,9 +25483,9 @@
} }
}, },
"node_modules/react-native/node_modules/@react-native/codegen": { "node_modules/react-native/node_modules/@react-native/codegen": {
"version": "0.78.1", "version": "0.78.2",
"resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.78.1.tgz", "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.78.2.tgz",
"integrity": "sha512-kGG5qAM9JdFtxzUwe7c6CyJbsU2PnaTrtCHA2dF8VEiNX1K3yd9yKPzfkxA7HPvmHoAn3ga1941O79BStWcM3A==", "integrity": "sha512-4r3/W1h22/GAmAMuMRMJWsw/9JGUEDAnSbYNya7zID1XSvizLoA5Yn8Qv+phrRwwsl0eZLxOqONh/nzXJcvpyg==",
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"peer": true, "peer": true,
@ -25506,9 +25506,9 @@
} }
}, },
"node_modules/react-native/node_modules/@react-native/normalize-colors": { "node_modules/react-native/node_modules/@react-native/normalize-colors": {
"version": "0.78.1", "version": "0.78.2",
"resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.78.1.tgz", "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.78.2.tgz",
"integrity": "sha512-h4wARnY4iBFgigN1NjnaKFtcegWwQyE9+CEBVG4nHmwMtr8lZBmc7ZKIM6hUc6lxqY/ugHg48aSQSynss7mJUg==", "integrity": "sha512-CA/3ynRO6/g1LDbqU8ewrv0js/1lU4+j04L7qz6btXbLTDk1UkF+AfpGRJGbIVY9UmFBJ7l1AOmzwutrWb3Txw==",
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"peer": true "peer": true
@ -26733,9 +26733,9 @@
} }
}, },
"node_modules/rollup": { "node_modules/rollup": {
"version": "4.38.0", "version": "4.39.0",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.38.0.tgz", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.39.0.tgz",
"integrity": "sha512-5SsIRtJy9bf1ErAOiFMFzl64Ex9X5V7bnJ+WlFMb+zmP459OSWCEG7b0ERZ+PEU7xPt4OG3RHbrp1LJlXxYTrw==", "integrity": "sha512-thI8kNc02yNvnmJp8dr3fNWJ9tCONDhp6TV35X6HkKGGs9E6q7YWCHbe5vKiTa7TAiNcFEmXKj3X/pG2b3ci0g==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
@ -26749,26 +26749,26 @@
"npm": ">=8.0.0" "npm": ">=8.0.0"
}, },
"optionalDependencies": { "optionalDependencies": {
"@rollup/rollup-android-arm-eabi": "4.38.0", "@rollup/rollup-android-arm-eabi": "4.39.0",
"@rollup/rollup-android-arm64": "4.38.0", "@rollup/rollup-android-arm64": "4.39.0",
"@rollup/rollup-darwin-arm64": "4.38.0", "@rollup/rollup-darwin-arm64": "4.39.0",
"@rollup/rollup-darwin-x64": "4.38.0", "@rollup/rollup-darwin-x64": "4.39.0",
"@rollup/rollup-freebsd-arm64": "4.38.0", "@rollup/rollup-freebsd-arm64": "4.39.0",
"@rollup/rollup-freebsd-x64": "4.38.0", "@rollup/rollup-freebsd-x64": "4.39.0",
"@rollup/rollup-linux-arm-gnueabihf": "4.38.0", "@rollup/rollup-linux-arm-gnueabihf": "4.39.0",
"@rollup/rollup-linux-arm-musleabihf": "4.38.0", "@rollup/rollup-linux-arm-musleabihf": "4.39.0",
"@rollup/rollup-linux-arm64-gnu": "4.38.0", "@rollup/rollup-linux-arm64-gnu": "4.39.0",
"@rollup/rollup-linux-arm64-musl": "4.38.0", "@rollup/rollup-linux-arm64-musl": "4.39.0",
"@rollup/rollup-linux-loongarch64-gnu": "4.38.0", "@rollup/rollup-linux-loongarch64-gnu": "4.39.0",
"@rollup/rollup-linux-powerpc64le-gnu": "4.38.0", "@rollup/rollup-linux-powerpc64le-gnu": "4.39.0",
"@rollup/rollup-linux-riscv64-gnu": "4.38.0", "@rollup/rollup-linux-riscv64-gnu": "4.39.0",
"@rollup/rollup-linux-riscv64-musl": "4.38.0", "@rollup/rollup-linux-riscv64-musl": "4.39.0",
"@rollup/rollup-linux-s390x-gnu": "4.38.0", "@rollup/rollup-linux-s390x-gnu": "4.39.0",
"@rollup/rollup-linux-x64-gnu": "4.38.0", "@rollup/rollup-linux-x64-gnu": "4.39.0",
"@rollup/rollup-linux-x64-musl": "4.38.0", "@rollup/rollup-linux-x64-musl": "4.39.0",
"@rollup/rollup-win32-arm64-msvc": "4.38.0", "@rollup/rollup-win32-arm64-msvc": "4.39.0",
"@rollup/rollup-win32-ia32-msvc": "4.38.0", "@rollup/rollup-win32-ia32-msvc": "4.39.0",
"@rollup/rollup-win32-x64-msvc": "4.38.0", "@rollup/rollup-win32-x64-msvc": "4.39.0",
"fsevents": "~2.3.2" "fsevents": "~2.3.2"
} }
}, },
@ -30206,9 +30206,9 @@
} }
}, },
"node_modules/vite": { "node_modules/vite": {
"version": "5.4.15", "version": "5.4.16",
"resolved": "https://registry.npmjs.org/vite/-/vite-5.4.15.tgz", "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.16.tgz",
"integrity": "sha512-6ANcZRivqL/4WtwPGTKNaosuNJr5tWiftOC7liM7G9+rMb8+oeJeyzymDu4rTN93seySBmbjSfsS3Vzr19KNtA==", "integrity": "sha512-Y5gnfp4NemVfgOTDQAunSD4346fal44L9mszGGY/e+qxsRT5y1sMlS/8tiQ8AFAp+MFgYNSINdfEchJiPm41vQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {

32
src/components/InfiniteScroll.vue

@ -1,12 +1,8 @@
/** /** * @file InfiniteScroll.vue * @description A Vue component that implements
* @file InfiniteScroll.vue infinite scrolling functionality using the Intersection Observer API. * This
* @description A Vue component that implements infinite scrolling functionality using the Intersection Observer API. component emits a 'reached-bottom' event when the user scrolls near the bottom
* This component emits a 'reached-bottom' event when the user scrolls near the bottom of the content. of the content. * It includes debouncing to prevent multiple rapid triggers and
* It includes debouncing to prevent multiple rapid triggers and loading state management. loading state management. * * @author Matthew Raymer * @version 1.0.0 */
*
* @author Matthew Raymer
* @version 1.0.0
*/
<template> <template>
<div ref="scrollContainer"> <div ref="scrollContainer">
@ -20,21 +16,21 @@ import { Component, Emit, Prop, Vue } from "vue-facing-decorator";
/** /**
* InfiniteScroll Component * InfiniteScroll Component
* *
* This component implements infinite scrolling functionality by observing when a user * This component implements infinite scrolling functionality by observing when a user
* scrolls near the bottom of the content. It uses the Intersection Observer API for * scrolls near the bottom of the content. It uses the Intersection Observer API for
* efficient scroll detection and includes debouncing to prevent multiple rapid triggers. * efficient scroll detection and includes debouncing to prevent multiple rapid triggers.
* *
* Usage in template: * Usage in template:
* ```vue * ```vue
* <InfiniteScroll @reached-bottom="loadMore"> * <InfiniteScroll @reached-bottom="loadMore">
* <div>Content goes here</div> * <div>Content goes here</div>
* </InfiniteScroll> * </InfiniteScroll>
* ``` * ```
* *
* Props: * Props:
* - distance: number (default: 200) - Distance in pixels from the bottom at which to trigger the event * - distance: number (default: 200) - Distance in pixels from the bottom at which to trigger the event
* *
* Events: * Events:
* - reached-bottom: Emitted when the user scrolls near the bottom of the content * - reached-bottom: Emitted when the user scrolls near the bottom of the content
*/ */
@ -59,7 +55,7 @@ export default class InfiniteScroll extends Vue {
/** /**
* Vue lifecycle hook that runs after component updates. * Vue lifecycle hook that runs after component updates.
* Initializes the Intersection Observer if not already set up. * Initializes the Intersection Observer if not already set up.
* *
* @internal * @internal
* Used internally by Vue's lifecycle system * Used internally by Vue's lifecycle system
*/ */
@ -81,7 +77,7 @@ export default class InfiniteScroll extends Vue {
/** /**
* Vue lifecycle hook that runs before component unmounting. * Vue lifecycle hook that runs before component unmounting.
* Cleans up the Intersection Observer and any pending timeouts. * Cleans up the Intersection Observer and any pending timeouts.
* *
* @internal * @internal
* Used internally by Vue's lifecycle system * Used internally by Vue's lifecycle system
*/ */
@ -97,10 +93,10 @@ export default class InfiniteScroll extends Vue {
/** /**
* Handles intersection observer callbacks when the sentinel element becomes visible. * Handles intersection observer callbacks when the sentinel element becomes visible.
* Implements debouncing to prevent multiple rapid triggers and manages loading state. * Implements debouncing to prevent multiple rapid triggers and manages loading state.
* *
* @param entries - Array of IntersectionObserverEntry objects * @param entries - Array of IntersectionObserverEntry objects
* @returns false (required by @Emit decorator) * @returns false (required by @Emit decorator)
* *
* @internal * @internal
* Used internally by the Intersection Observer * Used internally by the Intersection Observer
* @emits reached-bottom - Emitted when the user scrolls near the bottom * @emits reached-bottom - Emitted when the user scrolls near the bottom
@ -113,7 +109,7 @@ export default class InfiniteScroll extends Vue {
if (this.debounceTimeout) { if (this.debounceTimeout) {
window.clearTimeout(this.debounceTimeout); window.clearTimeout(this.debounceTimeout);
} }
this.debounceTimeout = window.setTimeout(() => { this.debounceTimeout = window.setTimeout(() => {
this.isLoading = true; this.isLoading = true;
this.$emit("reached-bottom", true); this.$emit("reached-bottom", true);

1
src/views/ClaimView.vue

@ -222,7 +222,6 @@
<div v-if="libsUtil.isGiveAction(veriClaim)"> <div v-if="libsUtil.isGiveAction(veriClaim)">
<div class="flex columns-3"> <div class="flex columns-3">
<button <button
class="col-span-1 bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white mt-2 px-4 py-2 rounded-md"
v-if=" v-if="
libsUtil.isGiveRecordTheUserCanConfirm( libsUtil.isGiveRecordTheUserCanConfirm(
isRegistered, isRegistered,

16
src/views/ContactsView.vue

@ -199,7 +199,7 @@
<EntityIcon <EntityIcon
:contact="contact" :contact="contact"
:iconSize="48" :icon-size="48"
class="inline-block align-text-bottom border border-slate-300 rounded cursor-pointer overflow-hidden" class="inline-block align-text-bottom border border-slate-300 rounded cursor-pointer overflow-hidden"
@click="showLargeIdenticon = contact" @click="showLargeIdenticon = contact"
/> />
@ -237,17 +237,17 @@
> >
<button <button
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" 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="confirmShowGiftedDialog(contact.did, activeDid)"
:title="givenToMeDescriptions[contact.did] || ''" :title="givenToMeDescriptions[contact.did] || ''"
@click="confirmShowGiftedDialog(contact.did, activeDid)"
> >
From: From:
<br /> <br />
{{ {{
/* eslint-disable prettier/prettier */ /* eslint-disable prettier/prettier */
this.showGiveTotals showGiveTotals
? ((givenToMeConfirmed[contact.did] || 0) ? ((givenToMeConfirmed[contact.did] || 0)
+ (givenToMeUnconfirmed[contact.did] || 0)) + (givenToMeUnconfirmed[contact.did] || 0))
: this.showGiveConfirmed : showGiveConfirmed
? (givenToMeConfirmed[contact.did] || 0) ? (givenToMeConfirmed[contact.did] || 0)
: (givenToMeUnconfirmed[contact.did] || 0) : (givenToMeUnconfirmed[contact.did] || 0)
/* eslint-enable prettier/prettier */ /* eslint-enable prettier/prettier */
@ -256,17 +256,17 @@
<button <button
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 -ml-1.5 px-2 py-1.5 rounded-r-md border-l" 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 -ml-1.5 px-2 py-1.5 rounded-r-md border-l"
@click="confirmShowGiftedDialog(activeDid, contact.did)"
:title="givenByMeDescriptions[contact.did] || ''" :title="givenByMeDescriptions[contact.did] || ''"
@click="confirmShowGiftedDialog(activeDid, contact.did)"
> >
To: To:
<br /> <br />
{{ {{
/* eslint-disable prettier/prettier */ /* eslint-disable prettier/prettier */
this.showGiveTotals showGiveTotals
? ((givenByMeConfirmed[contact.did] || 0) ? ((givenByMeConfirmed[contact.did] || 0)
+ (givenByMeUnconfirmed[contact.did] || 0)) + (givenByMeUnconfirmed[contact.did] || 0))
: this.showGiveConfirmed : showGiveConfirmed
? (givenByMeConfirmed[contact.did] || 0) ? (givenByMeConfirmed[contact.did] || 0)
: (givenByMeUnconfirmed[contact.did] || 0) : (givenByMeUnconfirmed[contact.did] || 0)
/* eslint-enable prettier/prettier */ /* eslint-enable prettier/prettier */
@ -275,8 +275,8 @@
<button <button
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-md border border-blue-400" 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-md border border-blue-400"
@click="openOfferDialog(contact.did, contact.name)"
data-testId="offerButton" data-testId="offerButton"
@click="openOfferDialog(contact.did, contact.name)"
> >
Offer Offer
</button> </button>

258
src/views/HomeView.vue

@ -1,12 +1,8 @@
/** /** * @file HomeView.vue * @description Main view component for the
* @file HomeView.vue application's home page. Handles user identity, feed management, * and
* @description Main view component for the application's home page. Handles user identity, feed management, interaction with various dialogs and components. Implements infinite scrolling
* and interaction with various dialogs and components. Implements infinite scrolling for activity feed for activity feed * and manages user registration status. * * @author Matthew
* and manages user registration status. Raymer * @version 1.0.0 */
*
* @author Matthew Raymer
* @version 1.0.0
*/
<template> <template>
<QuickNav selected="Home" /> <QuickNav selected="Home" />
@ -356,21 +352,21 @@ import { GiveRecordWithContactInfo } from "types";
/** /**
* HomeView Component * HomeView Component
* *
* Main view component that handles: * Main view component that handles:
* 1. User identity and registration management * 1. User identity and registration management
* 2. Activity feed with infinite scrolling * 2. Activity feed with infinite scrolling
* 3. Contact management and display * 3. Contact management and display
* 4. Gift/claim creation and viewing * 4. Gift/claim creation and viewing
* 5. Feed filtering and settings * 5. Feed filtering and settings
* *
* Template Usage: * Template Usage:
* ```vue * ```vue
* <HomeView> * <HomeView>
* <!-- Content is managed internally --> * <!-- Content is managed internally -->
* </HomeView> * </HomeView>
* ``` * ```
* *
* Component Dependencies: * Component Dependencies:
* - QuickNav: Navigation component * - QuickNav: Navigation component
* - TopMessage: Message display component * - TopMessage: Message display component
@ -444,7 +440,7 @@ export default class HomeView extends Vue {
* 5. Load feed data * 5. Load feed data
* 6. Load new offers * 6. Load new offers
* 7. Check onboarding status * 7. Check onboarding status
* *
* @internal * @internal
* Called automatically by Vue lifecycle system * Called automatically by Vue lifecycle system
*/ */
@ -468,7 +464,7 @@ export default class HomeView extends Vue {
* - Creates new DID if none exists * - Creates new DID if none exists
* - Loads user settings and contacts * - Loads user settings and contacts
* - Checks registration status * - Checks registration status
* *
* @internal * @internal
* Called by mounted() * Called by mounted()
* @throws Logs error if DID retrieval fails * @throws Logs error if DID retrieval fails
@ -576,7 +572,7 @@ export default class HomeView extends Vue {
* - Feed filters and view settings * - Feed filters and view settings
* - Registration status * - Registration status
* - Notification acknowledgments * - Notification acknowledgments
* *
* @internal * @internal
* Called by mounted() and reloadFeedOnChange() * Called by mounted() and reloadFeedOnChange()
*/ */
@ -600,7 +596,7 @@ export default class HomeView extends Vue {
/** /**
* Loads user contacts from database * Loads user contacts from database
* Used for displaying contact info in feed and actions * Used for displaying contact info in feed and actions
* *
* @internal * @internal
* Called by mounted() and initializeIdentity() * Called by mounted() and initializeIdentity()
*/ */
@ -613,7 +609,7 @@ export default class HomeView extends Vue {
* - Checks if unregistered user can access API * - Checks if unregistered user can access API
* - Updates registration status if successful * - Updates registration status if successful
* - Preserves unregistered state on failure * - Preserves unregistered state on failure
* *
* @internal * @internal
* Called by mounted() and initializeIdentity() * Called by mounted() and initializeIdentity()
*/ */
@ -642,7 +638,7 @@ export default class HomeView extends Vue {
/** /**
* Initializes feed data * Initializes feed data
* Triggers updateAllFeed() to populate activity feed * Triggers updateAllFeed() to populate activity feed
* *
* @internal * @internal
* Called by mounted() * Called by mounted()
*/ */
@ -656,7 +652,7 @@ export default class HomeView extends Vue {
* - Number of new direct offers * - Number of new direct offers
* - Number of new project offers * - Number of new project offers
* - Rate limit status for both * - Rate limit status for both
* *
* @internal * @internal
* Called by mounted() and initializeIdentity() * Called by mounted() and initializeIdentity()
* @requires Active DID * @requires Active DID
@ -686,7 +682,7 @@ export default class HomeView extends Vue {
/** /**
* Checks if user needs onboarding * Checks if user needs onboarding
* Opens onboarding dialog if not completed * Opens onboarding dialog if not completed
* *
* @internal * @internal
* Called by mounted() * Called by mounted()
*/ */
@ -701,7 +697,7 @@ export default class HomeView extends Vue {
* Handles errors during initialization * Handles errors during initialization
* - Logs error to console and database * - Logs error to console and database
* - Displays user notification * - Displays user notification
* *
* @internal * @internal
* Called by mounted() and handleFeedError() * Called by mounted() and handleFeedError()
* @param err Error object with optional userMessage * @param err Error object with optional userMessage
@ -723,7 +719,7 @@ export default class HomeView extends Vue {
/** /**
* Checks if feed results are being filtered * Checks if feed results are being filtered
* *
* @public * @public
* Used in template for filter button display * Used in template for filter button display
* @returns true if visible or nearby filters are active * @returns true if visible or nearby filters are active
@ -734,7 +730,7 @@ export default class HomeView extends Vue {
/** /**
* Checks if browser notifications are supported * Checks if browser notifications are supported
* *
* @public * @public
* Used in template for notification feature detection * Used in template for notification feature detection
* @returns true if Notification API is available * @returns true if Notification API is available
@ -748,7 +744,7 @@ export default class HomeView extends Vue {
* - Updates filter states * - Updates filter states
* - Clears existing feed data * - Clears existing feed data
* - Triggers new feed load * - Triggers new feed load
* *
* @public * @public
* Called by FeedFilters component when filters change * Called by FeedFilters component when filters change
*/ */
@ -765,7 +761,7 @@ export default class HomeView extends Vue {
/** /**
* Loads more feed items for infinite scroll * Loads more feed items for infinite scroll
* *
* @public * @public
* Called by InfiniteScroll component when bottom is reached * Called by InfiniteScroll component when bottom is reached
* @param payload Boolean indicating if more items should be loaded * @param payload Boolean indicating if more items should be loaded
@ -781,18 +777,18 @@ export default class HomeView extends Vue {
/** /**
* Checks if coordinates fall within any search box * Checks if coordinates fall within any search box
* *
* @internal * @internal
* @callGraph * @callGraph
* Called by: shouldIncludeRecord() * Called by: shouldIncludeRecord()
* Calls: None * Calls: None
* *
* @chain * @chain
* shouldIncludeRecord() -> latLongInAnySearchBox() * shouldIncludeRecord() -> latLongInAnySearchBox()
* *
* @requires * @requires
* - this.searchBoxes * - this.searchBoxes
* *
* @param lat Latitude to check * @param lat Latitude to check
* @param long Longitude to check * @param long Longitude to check
* @returns true if coordinates are within any search box * @returns true if coordinates are within any search box
@ -812,10 +808,10 @@ export default class HomeView extends Vue {
/** /**
* Updates feed with latest activity * Updates feed with latest activity
* *
* @internal * @internal
* @callGraph * @callGraph
* Called by: * Called by:
* - loadMoreGives() * - loadMoreGives()
* - initializeIdentity() * - initializeIdentity()
* Calls: * Calls:
@ -823,16 +819,16 @@ export default class HomeView extends Vue {
* - processFeedResults() * - processFeedResults()
* - updateFeedLastViewedId() * - updateFeedLastViewedId()
* - handleFeedError() * - handleFeedError()
* *
* @chain * @chain
* loadMoreGives() -> updateAllFeed() * loadMoreGives() -> updateAllFeed()
* initializeIdentity() -> updateAllFeed() * initializeIdentity() -> updateAllFeed()
* *
* @requires * @requires
* - this.apiServer * - this.apiServer
* - this.activeDid * - this.activeDid
* - this.feedPreviousOldestId * - this.feedPreviousOldestId
* *
* @modifies * @modifies
* - this.isFeedLoading * - this.isFeedLoading
* - this.feedData (via processFeedResults) * - this.feedData (via processFeedResults)
@ -841,9 +837,12 @@ export default class HomeView extends Vue {
async updateAllFeed() { async updateAllFeed() {
this.isFeedLoading = true; this.isFeedLoading = true;
let endOfResults = true; let endOfResults = true;
try { try {
const results = await this.retrieveGives(this.apiServer, this.feedPreviousOldestId); const results = await this.retrieveGives(
this.apiServer,
this.feedPreviousOldestId,
);
if (results.data.length > 0) { if (results.data.length > 0) {
endOfResults = false; endOfResults = false;
await this.processFeedResults(results.data); await this.processFeedResults(results.data);
@ -856,29 +855,29 @@ export default class HomeView extends Vue {
if (this.feedData.length === 0 && !endOfResults) { if (this.feedData.length === 0 && !endOfResults) {
await this.updateAllFeed(); await this.updateAllFeed();
} }
this.isFeedLoading = false; this.isFeedLoading = false;
} }
/** /**
* Processes feed results and adds them to feedData * Processes feed results and adds them to feedData
* *
* @internal * @internal
* @callGraph * @callGraph
* Called by: updateAllFeed() * Called by: updateAllFeed()
* Calls: processRecord() * Calls: processRecord()
* *
* @chain * @chain
* updateAllFeed() -> processFeedResults() * updateAllFeed() -> processFeedResults()
* *
* @requires * @requires
* - this.feedData * - this.feedData
* - this.feedPreviousOldestId * - this.feedPreviousOldestId
* *
* @modifies * @modifies
* - this.feedData * - this.feedData
* - this.feedPreviousOldestId * - this.feedPreviousOldestId
* *
* @param records Array of feed records to process * @param records Array of feed records to process
*/ */
private async processFeedResults(records: GiveSummaryRecord[]) { private async processFeedResults(records: GiveSummaryRecord[]) {
@ -893,11 +892,11 @@ export default class HomeView extends Vue {
/** /**
* Processes a single record and returns it if it passes filters * Processes a single record and returns it if it passes filters
* *
* @internal * @internal
* @callGraph * @callGraph
* Called by: processFeedResults() * Called by: processFeedResults()
* Calls: * Calls:
* - extractClaim() * - extractClaim()
* - extractGiverDid() * - extractGiverDid()
* - extractRecipientDid() * - extractRecipientDid()
@ -906,24 +905,26 @@ export default class HomeView extends Vue {
* - extractProvider() * - extractProvider()
* - getProvidedByPlan() * - getProvidedByPlan()
* - createFeedRecord() * - createFeedRecord()
* *
* @chain * @chain
* updateAllFeed() -> processFeedResults() -> processRecord() * updateAllFeed() -> processFeedResults() -> processRecord()
* *
* @requires * @requires
* - this.isAnyFeedFilterOn * - this.isAnyFeedFilterOn
* - this.isFeedFilteredByVisible * - this.isFeedFilteredByVisible
* - this.isFeedFilteredByNearby * - this.isFeedFilteredByNearby
* - this.activeDid * - this.activeDid
* - this.allContacts * - this.allContacts
* *
* @modifies * @modifies
* - this.feedData (via createFeedRecord) * - this.feedData (via createFeedRecord)
* *
* @param record The record to process * @param record The record to process
* @returns Processed record with contact info if it passes filters, null otherwise * @returns Processed record with contact info if it passes filters, null otherwise
*/ */
private async processRecord(record: GiveSummaryRecord): Promise<GiveRecordWithContactInfo | null> { private async processRecord(
record: GiveSummaryRecord,
): Promise<GiveRecordWithContactInfo | null> {
const claim = this.extractClaim(record); const claim = this.extractClaim(record);
const giverDid = this.extractGiverDid(claim); const giverDid = this.extractGiverDid(claim);
const recipientDid = this.extractRecipientDid(claim); const recipientDid = this.extractRecipientDid(claim);
@ -936,23 +937,31 @@ export default class HomeView extends Vue {
const provider = this.extractProvider(claim); const provider = this.extractProvider(claim);
const providedByPlan = await this.getProvidedByPlan(provider); const providedByPlan = await this.getProvidedByPlan(provider);
return this.createFeedRecord(record, claim, giverDid, recipientDid, provider, fulfillsPlan, providedByPlan); return this.createFeedRecord(
record,
claim,
giverDid,
recipientDid,
provider,
fulfillsPlan,
providedByPlan,
);
} }
/** /**
* Extracts claim from record, handling both direct and wrapped claims * Extracts claim from record, handling both direct and wrapped claims
* *
* @internal * @internal
* @callGraph * @callGraph
* Called by: processRecord() * Called by: processRecord()
* Calls: None * Calls: None
* *
* @chain * @chain
* processRecord() -> extractClaim() * processRecord() -> extractClaim()
* *
* @requires * @requires
* - record.fullClaim * - record.fullClaim
* *
* @param record The record containing the claim * @param record The record containing the claim
* @returns The extracted claim object * @returns The extracted claim object
*/ */
@ -963,18 +972,18 @@ export default class HomeView extends Vue {
/** /**
* Extracts giver DID from claim * Extracts giver DID from claim
* *
* @internal * @internal
* @callGraph * @callGraph
* Called by: processRecord() * Called by: processRecord()
* Calls: None * Calls: None
* *
* @chain * @chain
* processRecord() -> extractGiverDid() * processRecord() -> extractGiverDid()
* *
* @requires * @requires
* - claim.agent * - claim.agent
* *
* @param claim The claim object containing giver information * @param claim The claim object containing giver information
* @returns The giver's DID * @returns The giver's DID
*/ */
@ -985,7 +994,7 @@ export default class HomeView extends Vue {
/** /**
* Extracts recipient DID from claim * Extracts recipient DID from claim
* *
* @internal * @internal
* Called by processRecord() * Called by processRecord()
*/ */
@ -996,20 +1005,20 @@ export default class HomeView extends Vue {
/** /**
* Gets fulfills plan from cache * Gets fulfills plan from cache
* *
* @internal * @internal
* @callGraph * @callGraph
* Called by: processRecord() * Called by: processRecord()
* Calls: getPlanFromCache() * Calls: getPlanFromCache()
* *
* @chain * @chain
* processRecord() -> getFulfillsPlan() * processRecord() -> getFulfillsPlan()
* *
* @requires * @requires
* - this.axios * - this.axios
* - this.apiServer * - this.apiServer
* - this.activeDid * - this.activeDid
* *
* @param record The record containing the plan handle ID * @param record The record containing the plan handle ID
* @returns The fulfills plan object * @returns The fulfills plan object
*/ */
@ -1024,28 +1033,31 @@ export default class HomeView extends Vue {
/** /**
* Checks if record should be included based on filters * Checks if record should be included based on filters
* *
* @internal * @internal
* @callGraph * @callGraph
* Called by: processRecord() * Called by: processRecord()
* Calls: * Calls:
* - containsNonHiddenDid() * - containsNonHiddenDid()
* - latLongInAnySearchBox() * - latLongInAnySearchBox()
* *
* @chain * @chain
* processRecord() -> shouldIncludeRecord() * processRecord() -> shouldIncludeRecord()
* *
* @requires * @requires
* - this.isAnyFeedFilterOn * - this.isAnyFeedFilterOn
* - this.isFeedFilteredByVisible * - this.isFeedFilteredByVisible
* - this.isFeedFilteredByNearby * - this.isFeedFilteredByNearby
* - this.searchBoxes * - this.searchBoxes
* *
* @param record The record to check * @param record The record to check
* @param fulfillsPlan The fulfills plan object * @param fulfillsPlan The fulfills plan object
* @returns true if record should be included based on filters * @returns true if record should be included based on filters
*/ */
private shouldIncludeRecord(record: GiveSummaryRecord, fulfillsPlan: any): boolean { private shouldIncludeRecord(
record: GiveSummaryRecord,
fulfillsPlan: any,
): boolean {
if (!this.isAnyFeedFilterOn) { if (!this.isAnyFeedFilterOn) {
return true; return true;
} }
@ -1055,9 +1067,17 @@ export default class HomeView extends Vue {
anyMatch = true; anyMatch = true;
} }
if (!anyMatch && this.isFeedFilteredByNearby && record.fulfillsPlanHandleId) { if (
!anyMatch &&
this.isFeedFilteredByNearby &&
record.fulfillsPlanHandleId
) {
if (fulfillsPlan?.locLat && fulfillsPlan?.locLon) { if (fulfillsPlan?.locLat && fulfillsPlan?.locLon) {
anyMatch = this.latLongInAnySearchBox(fulfillsPlan.locLat, fulfillsPlan.locLon) ?? false; anyMatch =
this.latLongInAnySearchBox(
fulfillsPlan.locLat,
fulfillsPlan.locLon,
) ?? false;
} }
} }
@ -1066,7 +1086,7 @@ export default class HomeView extends Vue {
/** /**
* Extracts provider from claim * Extracts provider from claim
* *
* @internal * @internal
* Called by processRecord() * Called by processRecord()
*/ */
@ -1076,7 +1096,7 @@ export default class HomeView extends Vue {
/** /**
* Gets provided by plan from cache * Gets provided by plan from cache
* *
* @internal * @internal
* Called by processRecord() * Called by processRecord()
*/ */
@ -1091,22 +1111,22 @@ export default class HomeView extends Vue {
/** /**
* Creates a feed record with contact info * Creates a feed record with contact info
* *
* @internal * @internal
* @callGraph * @callGraph
* Called by: processRecord() * Called by: processRecord()
* Calls: * Calls:
* - didInfoForContact() * - didInfoForContact()
* - contactForDid() * - contactForDid()
* *
* @chain * @chain
* processRecord() -> createFeedRecord() * processRecord() -> createFeedRecord()
* *
* @requires * @requires
* - this.activeDid * - this.activeDid
* - this.allContacts * - this.allContacts
* - this.allMyDids * - this.allMyDids
* *
* @param record The base record * @param record The base record
* @param claim The claim object * @param claim The claim object
* @param giverDid The giver's DID * @param giverDid The giver's DID
@ -1123,13 +1143,13 @@ export default class HomeView extends Vue {
recipientDid: string, recipientDid: string,
provider: any, provider: any,
fulfillsPlan: any, fulfillsPlan: any,
providedByPlan: any providedByPlan: any,
): GiveRecordWithContactInfo { ): GiveRecordWithContactInfo {
return { return {
...record, ...record,
jwtId: record.jwtId, jwtId: record.jwtId,
fullClaim: record.fullClaim, fullClaim: record.fullClaim,
description: record.description || '', description: record.description || "",
handleId: record.handleId, handleId: record.handleId,
issuerDid: record.issuerDid, issuerDid: record.issuerDid,
fulfillsPlanHandleId: record.fulfillsPlanHandleId, fulfillsPlanHandleId: record.fulfillsPlanHandleId,
@ -1160,7 +1180,7 @@ export default class HomeView extends Vue {
/** /**
* Updates the last viewed claim ID in settings * Updates the last viewed claim ID in settings
* *
* @internal * @internal
* Called by updateAllFeed() * Called by updateAllFeed()
*/ */
@ -1178,7 +1198,7 @@ export default class HomeView extends Vue {
/** /**
* Handles feed error and shows notification * Handles feed error and shows notification
* *
* @internal * @internal
* Called by updateAllFeed() * Called by updateAllFeed()
*/ */
@ -1197,7 +1217,7 @@ export default class HomeView extends Vue {
/** /**
* Retrieve claims in reverse chronological order * Retrieve claims in reverse chronological order
* *
* @internal * @internal
* Called by updateAllFeed() * Called by updateAllFeed()
* @param endorserApiServer API server URL * @param endorserApiServer API server URL
@ -1237,22 +1257,22 @@ export default class HomeView extends Vue {
/** /**
* Formats gift description with giver and recipient info * Formats gift description with giver and recipient info
* *
* @public * @public
* @callGraph * @callGraph
* Called by: Template * Called by: Template
* Calls: displayAmount() * Calls: displayAmount()
* *
* @chain * @chain
* Template -> giveDescription() -> displayAmount() -> currencyShortWordForCode() * Template -> giveDescription() -> displayAmount() -> currencyShortWordForCode()
* *
* @requires * @requires
* - giveRecord.fullClaim * - giveRecord.fullClaim
* - giveRecord.giver * - giveRecord.giver
* - giveRecord.receiver * - giveRecord.receiver
* - giveRecord.recipientProjectName * - giveRecord.recipientProjectName
* - giveRecord.providerPlanName * - giveRecord.providerPlanName
* *
* @param giveRecord Record containing gift information * @param giveRecord Record containing gift information
* @returns formatted description string * @returns formatted description string
*/ */
@ -1338,7 +1358,7 @@ export default class HomeView extends Vue {
/** /**
* Navigates to activity page * Navigates to activity page
* *
* @public * @public
* Called by template click handler * Called by template click handler
*/ */
@ -1348,7 +1368,7 @@ export default class HomeView extends Vue {
/** /**
* Navigates to claim details page * Navigates to claim details page
* *
* @public * @public
* Called by ActivityListItem component * Called by ActivityListItem component
* @param jwtId ID of the claim to view * @param jwtId ID of the claim to view
@ -1362,19 +1382,19 @@ export default class HomeView extends Vue {
/** /**
* Formats amount with currency code * Formats amount with currency code
* *
* @internal * @internal
* @callGraph * @callGraph
* Called by: giveDescription() * Called by: giveDescription()
* Calls: currencyShortWordForCode() * Calls: currencyShortWordForCode()
* *
* @chain * @chain
* giveDescription() -> displayAmount() -> currencyShortWordForCode() * giveDescription() -> displayAmount() -> currencyShortWordForCode()
* *
* @requires * @requires
* - code: string (currency code) * - code: string (currency code)
* - amt: number (amount to format) * - amt: number (amount to format)
* *
* @param code Currency code * @param code Currency code
* @param amt Amount to format * @param amt Amount to format
* @returns formatted amount string * @returns formatted amount string
@ -1385,19 +1405,19 @@ export default class HomeView extends Vue {
/** /**
* Gets currency word based on code and plurality * Gets currency word based on code and plurality
* *
* @internal * @internal
* @callGraph * @callGraph
* Called by: displayAmount() * Called by: displayAmount()
* Calls: None * Calls: None
* *
* @chain * @chain
* giveDescription() -> displayAmount() -> currencyShortWordForCode() * giveDescription() -> displayAmount() -> currencyShortWordForCode()
* *
* @requires * @requires
* - unitCode: string (currency code) * - unitCode: string (currency code)
* - single: boolean (whether to use singular form) * - single: boolean (whether to use singular form)
* *
* @param unitCode Currency code * @param unitCode Currency code
* @param single Whether to use singular form * @param single Whether to use singular form
* @returns formatted currency word * @returns formatted currency word
@ -1408,22 +1428,22 @@ export default class HomeView extends Vue {
/** /**
* Opens dialog for creating new gift/claim * Opens dialog for creating new gift/claim
* *
* @public * @public
* @callGraph * @callGraph
* Called by: * Called by:
* - Template * - Template
* - openGiftedPrompts() * - openGiftedPrompts()
* Calls: GiftedDialog.open() * Calls: GiftedDialog.open()
* *
* @chain * @chain
* Template -> openDialog() * Template -> openDialog()
* openGiftedPrompts() -> openDialog() * openGiftedPrompts() -> openDialog()
* *
* @requires * @requires
* - this.$refs.customDialog * - this.$refs.customDialog
* - this.activeDid * - this.activeDid
* *
* @param giver Optional contact info for giver * @param giver Optional contact info for giver
* @param description Optional gift description * @param description Optional gift description
*/ */
@ -1442,18 +1462,18 @@ export default class HomeView extends Vue {
/** /**
* Opens prompts for gift ideas * Opens prompts for gift ideas
* *
* @public * @public
* @callGraph * @callGraph
* Called by: Template * Called by: Template
* Calls: openDialog() * Calls: openDialog()
* *
* @chain * @chain
* Template -> openGiftedPrompts() -> openDialog() * Template -> openGiftedPrompts() -> openDialog()
* *
* @requires * @requires
* - this.$refs.giftedPrompts * - this.$refs.giftedPrompts
* *
* @param callback Function to handle selected gift info * @param callback Function to handle selected gift info
*/ */
openGiftedPrompts() { openGiftedPrompts() {
@ -1464,7 +1484,7 @@ export default class HomeView extends Vue {
/** /**
* Opens feed filter configuration * Opens feed filter configuration
* *
* @public * @public
* Called by template click handler * Called by template click handler
*/ */
@ -1474,7 +1494,7 @@ export default class HomeView extends Vue {
/** /**
* Shows toast notification to user * Shows toast notification to user
* *
* @internal * @internal
* Used for various user notifications * Used for various user notifications
* @param message Message to display * @param message Message to display
@ -1493,7 +1513,7 @@ export default class HomeView extends Vue {
/** /**
* Computes CSS classes for known person icons * Computes CSS classes for known person icons
* *
* @public * @public
* Used in template for icon styling * Used in template for icon styling
* @param known Whether the person is known * @param known Whether the person is known
@ -1505,17 +1525,17 @@ export default class HomeView extends Vue {
/** /**
* Shows name input dialog if needed * Shows name input dialog if needed
* *
* @public * @public
* @callGraph * @callGraph
* Called by: Template * Called by: Template
* Calls: * Calls:
* - UserNameDialog.open() * - UserNameDialog.open()
* - promptForShareMethod() * - promptForShareMethod()
* *
* @chain * @chain
* Template -> showNameThenIdDialog() -> promptForShareMethod() * Template -> showNameThenIdDialog() -> promptForShareMethod()
* *
* @requires * @requires
* - this.$refs.userNameDialog * - this.$refs.userNameDialog
* - this.givenName * - this.givenName
@ -1532,15 +1552,15 @@ export default class HomeView extends Vue {
/** /**
* Shows dialog for sharing method selection * Shows dialog for sharing method selection
* *
* @internal * @internal
* @callGraph * @callGraph
* Called by: showNameThenIdDialog() * Called by: showNameThenIdDialog()
* Calls: ChoiceButtonDialog.open() * Calls: ChoiceButtonDialog.open()
* *
* @chain * @chain
* Template -> showNameThenIdDialog() -> promptForShareMethod() * Template -> showNameThenIdDialog() -> promptForShareMethod()
* *
* @requires * @requires
* - this.$refs.choiceButtonDialog * - this.$refs.choiceButtonDialog
* - this.$router * - this.$router
@ -1566,7 +1586,7 @@ export default class HomeView extends Vue {
/** /**
* Caches image data for sharing * Caches image data for sharing
* *
* @public * @public
* Called by ActivityListItem component * Called by ActivityListItem component
* @param event Event object * @param event Event object
@ -1584,7 +1604,7 @@ export default class HomeView extends Vue {
/** /**
* Opens image viewer dialog * Opens image viewer dialog
* *
* @public * @public
* Called by ActivityListItem component * Called by ActivityListItem component
* @param imageUrl URL of image to display * @param imageUrl URL of image to display
@ -1597,7 +1617,7 @@ export default class HomeView extends Vue {
/** /**
* Handles claim confirmation * Handles claim confirmation
* *
* @public * @public
* Called by ActivityListItem component * Called by ActivityListItem component
* @param record Record to confirm * @param record Record to confirm

6
src/views/ProjectViewView.vue

@ -266,8 +266,8 @@
<div class="text-center"> <div class="text-center">
<button <button
data-testId="offerButton" data-testId="offerButton"
@click="openOfferDialog()"
class="block w-full 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 text-sm leading-tight rounded-md" class="block w-full 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 text-sm leading-tight rounded-md"
@click="openOfferDialog()"
> >
Offer to this (maybe with conditions)... Offer to this (maybe with conditions)...
</button> </button>
@ -353,8 +353,8 @@
<div v-if="activeDid && isRegistered"> <div v-if="activeDid && isRegistered">
<div class="text-center"> <div class="text-center">
<button <button
@click="openGiftDialogToProject()"
class="block w-full 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 text-sm leading-tight rounded-md" class="block w-full 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 text-sm leading-tight rounded-md"
@click="openGiftDialogToProject()"
> >
Given To This... Given To This...
</button> </button>
@ -511,8 +511,8 @@
<div v-if="activeDid && isRegistered"> <div v-if="activeDid && isRegistered">
<div class="text-center"> <div class="text-center">
<button <button
@click="openGiftDialogFromProject()"
class="block w-full 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 text-sm leading-tight rounded-md" class="block w-full 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 text-sm leading-tight rounded-md"
@click="openGiftDialogFromProject()"
> >
Given By This... Given By This...
</button> </button>

6
src/views/ProjectsView.vue

@ -239,9 +239,8 @@
class="border-b border-slate-300" class="border-b border-slate-300"
> >
<a <a
class="block py-4 flex gap-4"
@click="onClickLoadProject(project.handleId)"
class="block py-4 flex gap-4 cursor-pointer" class="block py-4 flex gap-4 cursor-pointer"
@click="onClickLoadProject(project.handleId)"
> >
<div class="flex-none"> <div class="flex-none">
<ProjectIcon <ProjectIcon
@ -284,9 +283,8 @@ import {
didInfo, didInfo,
getHeaders, getHeaders,
getPlanFromCache, getPlanFromCache,
OfferSummaryRecord,
PlanData,
} from "../libs/endorserServer"; } from "../libs/endorserServer";
import { OfferSummaryRecord, PlanData } from "../interfaces/records";
import * as libsUtil from "../libs/util"; import * as libsUtil from "../libs/util";
import { OnboardPage } from "../libs/util"; import { OnboardPage } from "../libs/util";
import { logger } from "../utils/logger"; import { logger } from "../utils/logger";

Loading…
Cancel
Save