From a095a30500f0b61583cbaa14970d81b881dd45b7 Mon Sep 17 00:00:00 2001 From: Lim Chee Aun Date: Thu, 12 Oct 2023 12:48:09 +0800 Subject: [PATCH] Breaking news: upgrade to masto v6 Expecting bugs! Also include some fixes for states init. --- package-lock.json | 399 ++++------------------ package.json | 2 +- src/app.jsx | 21 +- src/components/account-info.jsx | 91 ++--- src/components/account-sheet.jsx | 4 +- src/components/background-service.jsx | 44 +-- src/components/compose.jsx | 33 +- src/components/drafts.jsx | 6 +- src/components/follow-request-buttons.jsx | 8 +- src/components/list-add-edit.jsx | 4 +- src/components/notification-service.jsx | 2 +- src/components/shortcuts-settings.jsx | 4 +- src/components/status.jsx | 80 +++-- src/components/translation-block.jsx | 2 +- src/pages/account-statuses.jsx | 27 +- src/pages/accounts.jsx | 6 +- src/pages/following.jsx | 71 ++-- src/pages/hashtag.jsx | 20 +- src/pages/list.jsx | 18 +- src/pages/public.jsx | 6 +- src/pages/search.jsx | 2 +- src/pages/status.jsx | 26 +- src/pages/trending.jsx | 8 +- src/utils/api.js | 91 +++-- src/utils/push-notifications.js | 8 +- src/utils/states.js | 4 +- 26 files changed, 379 insertions(+), 608 deletions(-) diff --git a/package-lock.json b/package-lock.json index bbdb594..c9fe1de 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,7 @@ "idb-keyval": "~6.2.1", "just-debounce-it": "~3.2.0", "lz-string": "~1.5.0", - "masto": "~5.11.4", + "masto": "~6.3.1", "mem": "~9.0.2", "p-retry": "~6.1.0", "p-throttle": "~5.1.0", @@ -3133,18 +3133,6 @@ "node": ">=8" } }, - "node_modules/@mastojs/ponyfills": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@mastojs/ponyfills/-/ponyfills-1.0.4.tgz", - "integrity": "sha512-1NaIGmcU7OmyNzx0fk+cYeGTkdXlOJOSdetaC4pStVWsrhht2cdlYSAfe5NDW3FcUmcEm2vVceB9lcClN1RCxw==", - "dependencies": { - "@types/node": "^18.11.17", - "@types/node-fetch": "^2.6.2", - "abort-controller": "^3.0.0", - "form-data": "^4.0.0", - "node-fetch": "^2.6.7" - } - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -3373,29 +3361,8 @@ "node_modules/@types/node": { "version": "18.11.17", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.17.tgz", - "integrity": "sha512-HJSUJmni4BeDHhfzn6nF0sVmd1SMezP7/4F0Lq+aXzmp2xm9O7WXrUtHW/CHlYVtZUbByEvWidHqRtcJXGF2Ng==" - }, - "node_modules/@types/node-fetch": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz", - "integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==", - "dependencies": { - "@types/node": "*", - "form-data": "^3.0.0" - } - }, - "node_modules/@types/node-fetch/node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } + "integrity": "sha512-HJSUJmni4BeDHhfzn6nF0sVmd1SMezP7/4F0Lq+aXzmp2xm9O7WXrUtHW/CHlYVtZUbByEvWidHqRtcJXGF2Ng==", + "dev": true }, "node_modules/@types/resolve": { "version": "1.17.1", @@ -3510,17 +3477,6 @@ "optional": true, "peer": true }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, "node_modules/acorn": { "version": "8.8.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", @@ -3597,11 +3553,6 @@ "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", "dev": true }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, "node_modules/at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", @@ -3790,6 +3741,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, "dependencies": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" @@ -3893,17 +3845,6 @@ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -4128,14 +4069,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/dot-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", @@ -4320,18 +4253,10 @@ "node": ">=0.10.0" } }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/eventemitter3": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.0.tgz", - "integrity": "sha512-riuVbElZZNXLeLEoprfNYoDSwTBRR44X3mnhdI1YcnENpWTCsTTVZ2zFuqQcpoyqPQIUXdiPEU0ECAq0KQRaHg==" + "node_modules/events-to-async": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/events-to-async/-/events-to-async-2.0.0.tgz", + "integrity": "sha512-NiZEr4g51nI4/lz/6NdwMqK/TLIctlnp9TQ3wCJjlRp47VgrthUZE4nrk2UhfZ8VzoQ/Xyth+G6MKioLCt0FVA==" }, "node_modules/fast-blurhash": { "version": "1.1.2", @@ -4425,19 +4350,6 @@ "is-callable": "^1.1.3" } }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/fraction.js": { "version": "4.3.6", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.6.tgz", @@ -4489,7 +4401,8 @@ "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true }, "node_modules/function.prototype.name": { "version": "1.1.5", @@ -4531,6 +4444,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -4641,6 +4555,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, "dependencies": { "function-bind": "^1.1.1" }, @@ -4682,6 +4597,7 @@ "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==", + "dev": true, "engines": { "node": ">= 0.4" }, @@ -4693,6 +4609,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, "engines": { "node": ">= 0.4" }, @@ -5307,17 +5224,6 @@ "tslib": "^2.0.3" } }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/lz-string": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", @@ -5347,33 +5253,17 @@ } }, "node_modules/masto": { - "version": "5.11.4", - "resolved": "https://registry.npmjs.org/masto/-/masto-5.11.4.tgz", - "integrity": "sha512-sLF3SJTNZDAP57Y+8vAdd1KQTuWWxmGUrBF1R2GLPL6zij/1wXxV05+h8GZhnfg+696arkt+w6ZlKvEEfH1yvg==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/masto/-/masto-6.3.1.tgz", + "integrity": "sha512-Os3MlbGFNL6KHxlKldYY+d/1exO6oBjtF4vx8d6cmXRmeeeW3mKQeunTZz+yY5qWksPg2eVdk+FOhaEnOeclVw==", "dependencies": { - "@mastojs/ponyfills": "^1.0.4", "change-case": "^4.1.2", - "eventemitter3": "^5.0.0", + "events-to-async": "^2.0.0", "isomorphic-ws": "^5.0.0", - "qs": "^6.11.0", - "semver": "^7.3.7", + "ts-custom-error": "^3.3.1", "ws": "^8.13.0" } }, - "node_modules/masto/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/mem": { "version": "9.0.2", "resolved": "https://registry.npmjs.org/mem/-/mem-9.0.2.tgz", @@ -5421,6 +5311,7 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -5429,6 +5320,7 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, "dependencies": { "mime-db": "1.52.0" }, @@ -5492,44 +5384,6 @@ "tslib": "^2.0.3" } }, - "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-fetch/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/node-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/node-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/node-releases": { "version": "2.0.13", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", @@ -5557,6 +5411,7 @@ "version": "1.12.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -6461,20 +6316,6 @@ "node": ">=6" } }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -6860,6 +6701,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, "dependencies": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", @@ -7137,6 +6979,14 @@ "punycode": "^2.1.0" } }, + "node_modules/ts-custom-error": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/ts-custom-error/-/ts-custom-error-3.3.1.tgz", + "integrity": "sha512-5OX1tzOjxWEgsr/YEUWSuPrQ00deKLh6D7OTWcvNHm12/7QPyRh8SYpyWvA4IZv8H/+GQWQEh/kwo95Q9OVW1A==", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/tslib": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", @@ -7991,11 +7841,6 @@ "optional": true } } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } }, "dependencies": { @@ -9806,18 +9651,6 @@ "resolved": "https://registry.npmjs.org/@lukeed/csprng/-/csprng-1.0.1.tgz", "integrity": "sha512-uSvJdwQU5nK+Vdf6zxcWAY2A8r7uqe+gePwLWzJ+fsQehq18pc0I2hJKwypZ2aLM90+Er9u1xn4iLJPZ+xlL4g==" }, - "@mastojs/ponyfills": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@mastojs/ponyfills/-/ponyfills-1.0.4.tgz", - "integrity": "sha512-1NaIGmcU7OmyNzx0fk+cYeGTkdXlOJOSdetaC4pStVWsrhht2cdlYSAfe5NDW3FcUmcEm2vVceB9lcClN1RCxw==", - "requires": { - "@types/node": "^18.11.17", - "@types/node-fetch": "^2.6.2", - "abort-controller": "^3.0.0", - "form-data": "^4.0.0", - "node-fetch": "^2.6.7" - } - }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -9998,28 +9831,8 @@ "@types/node": { "version": "18.11.17", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.17.tgz", - "integrity": "sha512-HJSUJmni4BeDHhfzn6nF0sVmd1SMezP7/4F0Lq+aXzmp2xm9O7WXrUtHW/CHlYVtZUbByEvWidHqRtcJXGF2Ng==" - }, - "@types/node-fetch": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz", - "integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==", - "requires": { - "@types/node": "*", - "form-data": "^3.0.0" - }, - "dependencies": { - "form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - } - } + "integrity": "sha512-HJSUJmni4BeDHhfzn6nF0sVmd1SMezP7/4F0Lq+aXzmp2xm9O7WXrUtHW/CHlYVtZUbByEvWidHqRtcJXGF2Ng==", + "dev": true }, "@types/resolve": { "version": "1.17.1", @@ -10128,14 +9941,6 @@ "optional": true, "peer": true }, - "abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "requires": { - "event-target-shim": "^5.0.0" - } - }, "acorn": { "version": "8.8.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", @@ -10190,11 +9995,6 @@ "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", "dev": true }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, "at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", @@ -10311,6 +10111,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, "requires": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" @@ -10391,14 +10192,6 @@ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -10531,11 +10324,6 @@ "object-keys": "^1.1.1" } }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" - }, "dot-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", @@ -10683,15 +10471,10 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, - "event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" - }, - "eventemitter3": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.0.tgz", - "integrity": "sha512-riuVbElZZNXLeLEoprfNYoDSwTBRR44X3mnhdI1YcnENpWTCsTTVZ2zFuqQcpoyqPQIUXdiPEU0ECAq0KQRaHg==" + "events-to-async": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/events-to-async/-/events-to-async-2.0.0.tgz", + "integrity": "sha512-NiZEr4g51nI4/lz/6NdwMqK/TLIctlnp9TQ3wCJjlRp47VgrthUZE4nrk2UhfZ8VzoQ/Xyth+G6MKioLCt0FVA==" }, "fast-blurhash": { "version": "1.1.2", @@ -10778,16 +10561,6 @@ "is-callable": "^1.1.3" } }, - "form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, "fraction.js": { "version": "4.3.6", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.6.tgz", @@ -10822,7 +10595,8 @@ "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true }, "function.prototype.name": { "version": "1.1.5", @@ -10852,6 +10626,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -10932,6 +10707,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, "requires": { "function-bind": "^1.1.1" } @@ -10960,12 +10736,14 @@ "has-proto": { "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==" + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true }, "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true }, "has-tostringtag": { "version": "1.0.0", @@ -11409,14 +11187,6 @@ "tslib": "^2.0.3" } }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, "lz-string": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", @@ -11440,27 +11210,15 @@ } }, "masto": { - "version": "5.11.4", - "resolved": "https://registry.npmjs.org/masto/-/masto-5.11.4.tgz", - "integrity": "sha512-sLF3SJTNZDAP57Y+8vAdd1KQTuWWxmGUrBF1R2GLPL6zij/1wXxV05+h8GZhnfg+696arkt+w6ZlKvEEfH1yvg==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/masto/-/masto-6.3.1.tgz", + "integrity": "sha512-Os3MlbGFNL6KHxlKldYY+d/1exO6oBjtF4vx8d6cmXRmeeeW3mKQeunTZz+yY5qWksPg2eVdk+FOhaEnOeclVw==", "requires": { - "@mastojs/ponyfills": "^1.0.4", "change-case": "^4.1.2", - "eventemitter3": "^5.0.0", + "events-to-async": "^2.0.0", "isomorphic-ws": "^5.0.0", - "qs": "^6.11.0", - "semver": "^7.3.7", + "ts-custom-error": "^3.3.1", "ws": "^8.13.0" - }, - "dependencies": { - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "requires": { - "lru-cache": "^6.0.0" - } - } } }, "mem": { @@ -11497,12 +11255,14 @@ "mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true }, "mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, "requires": { "mime-db": "1.52.0" } @@ -11542,35 +11302,6 @@ "tslib": "^2.0.3" } }, - "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "requires": { - "whatwg-url": "^5.0.0" - }, - "dependencies": { - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - } - } - }, "node-releases": { "version": "2.0.13", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", @@ -11591,7 +11322,8 @@ "object-inspect": { "version": "1.12.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true }, "object-keys": { "version": "1.1.1", @@ -12059,14 +11791,6 @@ "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "dev": true }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "requires": { - "side-channel": "^1.0.4" - } - }, "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -12322,6 +12046,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, "requires": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", @@ -12527,6 +12252,11 @@ "punycode": "^2.1.0" } }, + "ts-custom-error": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/ts-custom-error/-/ts-custom-error-3.3.1.tgz", + "integrity": "sha512-5OX1tzOjxWEgsr/YEUWSuPrQ00deKLh6D7OTWcvNHm12/7QPyRh8SYpyWvA4IZv8H/+GQWQEh/kwo95Q9OVW1A==" + }, "tslib": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", @@ -13153,11 +12883,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", "requires": {} - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } } diff --git a/package.json b/package.json index 971f628..1bc07d4 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "idb-keyval": "~6.2.1", "just-debounce-it": "~3.2.0", "lz-string": "~1.5.0", - "masto": "~5.11.4", + "masto": "~6.3.1", "mem": "~9.0.2", "p-retry": "~6.1.0", "p-throttle": "~5.1.0", diff --git a/src/app.jsx b/src/app.jsx index ea7c1cc..8c087ce 100644 --- a/src/app.jsx +++ b/src/app.jsx @@ -114,13 +114,13 @@ function App() { code, }); - const masto = initClient({ instance: instanceURL, accessToken }); + const client = initClient({ instance: instanceURL, accessToken }); await Promise.allSettled([ - initInstance(masto, instanceURL), - initAccount(masto, instanceURL, accessToken, vapidKey), + initInstance(client, instanceURL), + initAccount(client, instanceURL, accessToken, vapidKey), ]); initStates(); - initPreferences(masto); + initPreferences(client); setIsLoggedIn(true); setUIState('default'); @@ -130,14 +130,15 @@ function App() { const account = getCurrentAccount(); if (account) { store.session.set('currentAccount', account.info.id); - const { masto, instance } = api({ account }); - console.log('masto', masto); + const { client } = api({ account }); + const { instance } = client; + // console.log('masto', masto); initStates(); - initPreferences(masto); + initPreferences(client); setUIState('loading'); (async () => { try { - await initInstance(masto, instance); + await initInstance(client, instance); } catch (e) { } finally { setIsLoggedIn(true); @@ -253,9 +254,9 @@ function App() { )} - + {isLoggedIn && } - + {uiState !== 'loading' && } ); diff --git a/src/components/account-info.jsx b/src/components/account-info.jsx index bbe4e74..a49259d 100644 --- a/src/components/account-info.jsx +++ b/src/components/account-info.jsx @@ -149,7 +149,7 @@ function AccountInfo({ const familiarFollowersCache = useRef([]); async function fetchFollowers(firstLoad) { if (firstLoad || !followersIterator.current) { - followersIterator.current = masto.v1.accounts.listFollowers(id, { + followersIterator.current = masto.v1.accounts.$select(id).followers.list({ limit: LIMIT, }); } @@ -162,9 +162,9 @@ function AccountInfo({ // On first load, fetch familiar followers, merge to top of results' `value` // Remove dups on every fetch if (firstLoad) { - const familiarFollowers = await masto.v1.accounts.fetchFamiliarFollowers( - id, - ); + const familiarFollowers = await masto.v1.accounts + .familiarFollowers(id) + .fetch(); familiarFollowersCache.current = familiarFollowers[0].accounts; newValue = [ ...familiarFollowersCache.current, @@ -193,7 +193,7 @@ function AccountInfo({ const followingIterator = useRef(); async function fetchFollowing(firstLoad) { if (firstLoad || !followingIterator.current) { - followingIterator.current = masto.v1.accounts.listFollowing(id, { + followingIterator.current = masto.v1.accounts.$select(id).following.list({ limit: LIMIT, }); } @@ -214,9 +214,12 @@ function AccountInfo({ (async () => { try { const fetchFamiliarFollowers = - currentMasto.v1.accounts.fetchFamiliarFollowers(currentID); + currentMasto.v1.accounts.familiarFollowers.fetch({ + id: [currentID], + }); const fetchStatuses = currentMasto.v1.accounts - .listStatuses(currentID, { + .$select(currentID) + .statuses.list({ limit: 20, }) .next(); @@ -712,7 +715,7 @@ function RelatedActions({ // Grab this account from my logged-in instance const acctHasInstance = info.acct.includes('@'); try { - const results = await currentMasto.v2.search({ + const results = await currentMasto.v2.search.fetch({ q: acctHasInstance ? info.acct : `${info.username}@${instance}`, type: 'accounts', limit: 1, @@ -742,9 +745,11 @@ function RelatedActions({ setRelationshipUIState('loading'); - const fetchRelationships = currentMasto.v1.accounts.fetchRelationships([ - currentID, - ]); + const fetchRelationships = currentMasto.v1.accounts.relationships.fetch( + { + id: [currentID], + }, + ); try { const relationships = await fetchRelationships; @@ -913,10 +918,9 @@ function RelatedActions({ setRelationshipUIState('loading'); (async () => { try { - const newRelationship = - await currentMasto.v1.accounts.unmute( - currentInfo?.id || id, - ); + const newRelationship = await currentMasto.v1.accounts + .$select(currentInfo?.id || id) + .unmute(); console.log('unmuting', newRelationship); setRelationship(newRelationship); setRelationshipUIState('default'); @@ -962,12 +966,11 @@ function RelatedActions({ (async () => { try { const newRelationship = - await currentMasto.v1.accounts.mute( - currentInfo?.id || id, - { + await currentMasto.v1.accounts + .$select(currentInfo?.id || id) + .mute({ duration, - }, - ); + }); console.log('muting', newRelationship); setRelationship(newRelationship); setRelationshipUIState('default'); @@ -1008,19 +1011,17 @@ function RelatedActions({ (async () => { try { if (blocking) { - const newRelationship = - await currentMasto.v1.accounts.unblock( - currentInfo?.id || id, - ); + const newRelationship = await currentMasto.v1.accounts + .$select(currentInfo?.id || id) + .unblock(); console.log('unblocking', newRelationship); setRelationship(newRelationship); setRelationshipUIState('default'); showToast(`Unblocked @${username}`); } else { - const newRelationship = - await currentMasto.v1.accounts.block( - currentInfo?.id || id, - ); + const newRelationship = await currentMasto.v1.accounts + .$select(currentInfo?.id || id) + .block(); console.log('blocking', newRelationship); setRelationship(newRelationship); setRelationshipUIState('default'); @@ -1089,14 +1090,14 @@ function RelatedActions({ // ); // if (yes) { - newRelationship = await currentMasto.v1.accounts.unfollow( - accountID.current, - ); + newRelationship = await currentMasto.v1.accounts + .$select(accountID.current) + .unfollow(); // } } else { - newRelationship = await currentMasto.v1.accounts.follow( - accountID.current, - ); + newRelationship = await currentMasto.v1.accounts + .$select(accountID.current) + .follow(); } if (newRelationship) setRelationship(newRelationship); @@ -1241,9 +1242,9 @@ function AddRemoveListsSheet({ accountID, onClose }) { (async () => { try { const lists = await masto.v1.lists.list(); - const listsContainingAccount = await masto.v1.accounts.listLists( - accountID, - ); + const listsContainingAccount = await masto.v1.accounts + .$select(accountID) + .lists.list(); console.log({ lists, listsContainingAccount }); setLists(lists); setListsContainingAccount(listsContainingAccount); @@ -1285,13 +1286,17 @@ function AddRemoveListsSheet({ accountID, onClose }) { (async () => { try { if (inList) { - await masto.v1.lists.removeAccount(list.id, { - accountIds: [accountID], - }); + await masto.v1.lists + .$select(list.id) + .accounts.remove({ + accountIds: [accountID], + }); } else { - await masto.v1.lists.addAccount(list.id, { - accountIds: [accountID], - }); + await masto.v1.lists + .$select(list.id) + .accounts.create({ + accountIds: [accountID], + }); } // setUIState('default'); reload(); diff --git a/src/components/account-sheet.jsx b/src/components/account-sheet.jsx index 9093dc9..6a0d74f 100644 --- a/src/components/account-sheet.jsx +++ b/src/components/account-sheet.jsx @@ -46,7 +46,7 @@ function AccountSheet({ account, instance: propInstance, onClose }) { }); return info; } catch (e) { - const result = await masto.v2.search({ + const result = await masto.v2.search.fetch({ q: account, type: 'accounts', limit: 1, @@ -57,7 +57,7 @@ function AccountSheet({ account, instance: propInstance, onClose }) { } else if (/https?:\/\/[^/]+\/@/.test(account)) { const accountURL = new URL(account); const acct = accountURL.pathname.replace(/^\//, ''); - const result = await masto.v2.search({ + const result = await masto.v2.search.fetch({ q: acct, type: 'accounts', limit: 1, diff --git a/src/components/background-service.jsx b/src/components/background-service.jsx index 52a514a..8061b97 100644 --- a/src/components/background-service.jsx +++ b/src/components/background-service.jsx @@ -11,10 +11,10 @@ export default memo(function BackgroundService({ isLoggedIn }) { // - WebSocket to receive notifications when page is visible const [visible, setVisible] = useState(true); usePageVisibility(setVisible); - const notificationStream = useRef(); useEffect(() => { + let sub; if (isLoggedIn && visible) { - const { masto, instance } = api(); + const { masto, streaming, instance } = api(); (async () => { // 1. Get the latest notification if (states.notificationsLast) { @@ -42,34 +42,26 @@ export default memo(function BackgroundService({ isLoggedIn }) { } // 2. Start streaming - notificationStream.current = await masto.ws.stream( - '/api/v1/streaming', - { - stream: 'user:notification', - }, - ); - console.log('🎏 Streaming notification', notificationStream.current); - - notificationStream.current.on('notification', (notification) => { - console.log('🔔🔔 Notification', notification); - if (notification.status) { - saveStatus(notification.status, instance, { - skipThreading: true, - }); + if (streaming) { + sub = streaming.user.notification.subscribe(); + console.log('🎏 Streaming notification', sub); + for await (const entry of sub) { + if (!sub) break; + console.log('🔔🔔 Notification entry', entry); + if (entry.event === 'notification') { + console.log('🔔🔔 Notification', entry); + saveStatus(entry.payload, instance, { + skipThreading: true, + }); + } + states.notificationsShowNew = true; } - states.notificationsShowNew = true; - }); - - notificationStream.current.ws.onclose = () => { - console.log('🔔🔔 Notification stream closed'); - }; + } })(); } return () => { - if (notificationStream.current) { - notificationStream.current.ws.close(); - notificationStream.current = null; - } + sub?.unsubscribe?.(); + sub = null; }; }, [visible, isLoggedIn]); diff --git a/src/components/compose.jsx b/src/components/compose.jsx index 2ab29f3..570f139 100644 --- a/src/components/compose.jsx +++ b/src/components/compose.jsx @@ -197,9 +197,9 @@ function Compose({ setUIState('loading'); (async () => { try { - const statusSource = await masto.v1.statuses.fetchSource( - editStatus.id, - ); + const statusSource = await masto.v1.statuses + .$select(editStatus.id) + .source.fetch(); console.log({ statusSource }); const { text, spoilerText } = statusSource; textareaRef.current.value = text; @@ -749,14 +749,12 @@ function Compose({ file, description, }); - return masto.v2.mediaAttachments - .create(params) - .then((res) => { - if (res.id) { - attachment.id = res.id; - } - return res; - }); + return masto.v2.media.create(params).then((res) => { + if (res.id) { + attachment.id = res.id; + } + return res; + }); } }); const results = await Promise.allSettled(mediaPromises); @@ -784,6 +782,8 @@ function Compose({ /* NOTE: Using snakecase here because masto.js's `isObject` returns false for `params`, ONLY happens when opening in pop-out window. This is maybe due to `window.masto` variable being passed from the parent window. The check that failed is `x.constructor === Object`, so maybe the `Object` in new window is different than parent window's? Code: https://github.com/neet/masto.js/blob/dd0d649067b6a2b6e60fbb0a96597c373a255b00/src/serializers/is-object.ts#L2 + + // TODO: Note above is no longer true in Masto.js v6. Revisit this. */ let params = { status, @@ -818,10 +818,9 @@ function Compose({ let newStatus; if (editStatus) { - newStatus = await masto.v1.statuses.update( - editStatus.id, - params, - ); + newStatus = await masto.v1.statuses + .$select(editStatus.id) + .update(params); saveStatus(newStatus, instance, { skipThreading: true, }); @@ -935,13 +934,13 @@ function Compose({ performSearch={(params) => { const { type, q, limit } = params; if (type === 'accounts') { - return masto.v1.accounts.search({ + return masto.v1.accounts.search.list({ q, limit, resolve: false, }); } - return masto.v2.search(params); + return masto.v2.search.fetch(params); }} /> {mediaAttachments?.length > 0 && ( diff --git a/src/components/drafts.jsx b/src/components/drafts.jsx index be783f1..bf2d8c2 100644 --- a/src/components/drafts.jsx +++ b/src/components/drafts.jsx @@ -128,9 +128,9 @@ function Drafts({ onClose }) { if (replyTo) { setUIState('loading'); try { - replyToStatus = await masto.v1.statuses.fetch( - replyTo.id, - ); + replyToStatus = await masto.v1.statuses + .$select(replyTo.id) + .fetch(); } catch (e) { console.error(e); alert('Error fetching reply-to status!'); diff --git a/src/components/follow-request-buttons.jsx b/src/components/follow-request-buttons.jsx index d0fa606..1206800 100644 --- a/src/components/follow-request-buttons.jsx +++ b/src/components/follow-request-buttons.jsx @@ -23,7 +23,9 @@ function FollowRequestButtons({ accountID, onChange }) { setRequestState('accept'); (async () => { try { - const rel = await masto.v1.followRequests.authorize(accountID); + const rel = await masto.v1.followRequests + .$select(accountID) + .authorize(); if (!rel?.followedBy) { throw new Error('Follow request not accepted'); } @@ -47,7 +49,9 @@ function FollowRequestButtons({ accountID, onChange }) { setRequestState('reject'); (async () => { try { - const rel = await masto.v1.followRequests.reject(accountID); + const rel = await masto.v1.followRequests + .$select(accountID) + .reject(); if (rel?.followedBy) { throw new Error('Follow request not rejected'); } diff --git a/src/components/list-add-edit.jsx b/src/components/list-add-edit.jsx index d5a7633..3bf6ff0 100644 --- a/src/components/list-add-edit.jsx +++ b/src/components/list-add-edit.jsx @@ -56,7 +56,7 @@ function ListAddEdit({ list, onClose }) { let listResult; if (editMode) { - listResult = await masto.v1.lists.update(list.id, { + listResult = await masto.v1.lists.$select(list.id).update({ title, replies_policy: repliesPolicy, exclusive, @@ -141,7 +141,7 @@ function ListAddEdit({ list, onClose }) { (async () => { try { - await masto.v1.lists.remove(list.id); + await masto.v1.lists.$select(list.id).remove(); setUIState('default'); onClose?.({ state: 'deleted', diff --git a/src/components/notification-service.jsx b/src/components/notification-service.jsx index c0ff73d..29ec2a2 100644 --- a/src/components/notification-service.jsx +++ b/src/components/notification-service.jsx @@ -38,7 +38,7 @@ export default memo(function NotificationService() { ? getAccountByAccessToken(accessToken) : getCurrentAccount(); (async () => { - const notification = await masto.v1.notifications.fetch(id); + const notification = await masto.v1.notifications.$select(id).fetch(); if (notification && account) { console.log('🛎️ Notification', { id, notification, account }); const accountInstance = account.instanceURL; diff --git a/src/components/shortcuts-settings.jsx b/src/components/shortcuts-settings.jsx index 55c8b39..cb6105a 100644 --- a/src/components/shortcuts-settings.jsx +++ b/src/components/shortcuts-settings.jsx @@ -135,7 +135,7 @@ export const SHORTCUTS_META = { id: 'list', title: mem( async ({ id }) => { - const list = await api().masto.v1.lists.fetch(id); + const list = await api().masto.v1.lists.$select(id).fetch(); return list.title; }, { @@ -169,7 +169,7 @@ export const SHORTCUTS_META = { id: 'account-statuses', title: mem( async ({ id }) => { - const account = await api().masto.v1.accounts.fetch(id); + const account = await api().masto.v1.accounts.$select(id).fetch(); return account.username || account.acct || account.displayName; }, { diff --git a/src/components/status.jsx b/src/components/status.jsx index 8477ef2..12625b2 100644 --- a/src/components/status.jsx +++ b/src/components/status.jsx @@ -68,7 +68,7 @@ const throttle = pThrottle({ function fetchAccount(id, masto) { try { - return masto.v1.accounts.fetch(id); + return masto.v1.accounts.$select(id).fetch(); } catch (e) { return Promise.reject(e); } @@ -390,11 +390,11 @@ function Status({ reblogsCount: reblogsCount + (reblogged ? -1 : 1), }; if (reblogged) { - const newStatus = await masto.v1.statuses.unreblog(id); + const newStatus = await masto.v1.statuses.$select(id).unreblog(); saveStatus(newStatus, instance); return true; } else { - const newStatus = await masto.v1.statuses.reblog(id); + const newStatus = await masto.v1.statuses.$select(id).reblog(); saveStatus(newStatus, instance); return true; } @@ -418,11 +418,11 @@ function Status({ reblogsCount: reblogsCount + (reblogged ? -1 : 1), }; if (reblogged) { - const newStatus = await masto.v1.statuses.unreblog(id); + const newStatus = await masto.v1.statuses.$select(id).unreblog(); saveStatus(newStatus, instance); return true; } else { - const newStatus = await masto.v1.statuses.reblog(id); + const newStatus = await masto.v1.statuses.$select(id).reblog(); saveStatus(newStatus, instance); return true; } @@ -446,10 +446,10 @@ function Status({ favouritesCount: favouritesCount + (favourited ? -1 : 1), }; if (favourited) { - const newStatus = await masto.v1.statuses.unfavourite(id); + const newStatus = await masto.v1.statuses.$select(id).unfavourite(); saveStatus(newStatus, instance); } else { - const newStatus = await masto.v1.statuses.favourite(id); + const newStatus = await masto.v1.statuses.$select(id).favourite(); saveStatus(newStatus, instance); } } catch (e) { @@ -470,10 +470,10 @@ function Status({ bookmarked: !bookmarked, }; if (bookmarked) { - const newStatus = await masto.v1.statuses.unbookmark(id); + const newStatus = await masto.v1.statuses.$select(id).unbookmark(); saveStatus(newStatus, instance); } else { - const newStatus = await masto.v1.statuses.bookmark(id); + const newStatus = await masto.v1.statuses.$select(id).bookmark(); saveStatus(newStatus, instance); } } catch (e) { @@ -708,9 +708,9 @@ function Status({ { try { - const newStatus = await masto.v1.statuses[ - muted ? 'unmute' : 'mute' - ](id); + const newStatus = await masto.v1.statuses + .$select(id) + [muted ? 'unmute' : 'mute'](); saveStatus(newStatus, instance); showToast(muted ? 'Conversation unmuted' : 'Conversation muted'); } catch (e) { @@ -763,7 +763,7 @@ function Status({ // if (yes) { (async () => { try { - await masto.v1.statuses.remove(id); + await masto.v1.statuses.$select(id).remove(); const cachedStatus = getStatus(id, instance); cachedStatus._deleted = true; showToast('Deleted'); @@ -1212,7 +1212,8 @@ function Status({ }} refresh={() => { return masto.v1.polls - .fetch(poll.id) + .$select(poll.id) + .fetch() .then((pollResponse) => { states.statuses[sKey].poll = pollResponse; }) @@ -1220,7 +1221,8 @@ function Status({ }} votePoll={(choices) => { return masto.v1.polls - .vote(poll.id, { + .$select(poll.id) + .votes.create({ choices, }) .then((pollResponse) => { @@ -1498,7 +1500,7 @@ function Status({ statusID={showEdited} instance={instance} fetchStatusHistory={() => { - return masto.v1.statuses.listHistory(showEdited); + return masto.v1.statuses.$select(showEdited).history.list(); }} onClose={() => { setShowEdited(false); @@ -1585,7 +1587,7 @@ function Card({ card, instance }) { // NOTE: This is for quote post // (async () => { // const { masto } = api({ instance }); - // const status = await masto.v1.statuses.fetch(id); + // const status = await masto.v1.statuses.$select(id).fetch(); // saveStatus(status, instance); // setCardStatusID(id); // })(); @@ -1805,15 +1807,16 @@ function ReactionsModal({ statusID, instance, onClose }) { (async () => { try { if (firstLoad) { - reblogIterator.current = masto.v1.statuses.listRebloggedBy(statusID, { - limit: REACTIONS_LIMIT, - }); - favouriteIterator.current = masto.v1.statuses.listFavouritedBy( - statusID, - { + reblogIterator.current = masto.v1.statuses + .$select(statusID) + .rebloggedBy.list({ limit: REACTIONS_LIMIT, - }, - ); + }); + favouriteIterator.current = masto.v1.statuses + .$select(statusID) + .favouritedBy.list({ + limit: REACTIONS_LIMIT, + }); } const [{ value: reblogResults }, { value: favouriteResults }] = await Promise.allSettled([ @@ -2043,21 +2046,24 @@ function _unfurlMastodonLink(instance, url) { if (statusMatch) { const id = statusMatch[3]; const { masto } = api({ instance: domain }); - remoteInstanceFetch = masto.v1.statuses.fetch(id).then((status) => { - if (status?.id) { - return { - status, - instance: domain, - }; - } else { - throw new Error('No results'); - } - }); + remoteInstanceFetch = masto.v1.statuses + .$select(id) + .fetch() + .then((status) => { + if (status?.id) { + return { + status, + instance: domain, + }; + } else { + throw new Error('No results'); + } + }); } const { masto } = api({ instance }); - const mastoSearchFetch = masto.v2 - .search({ + const mastoSearchFetch = masto.v2.search + .fetch({ q: url, type: 'statuses', resolve: true, diff --git a/src/components/translation-block.jsx b/src/components/translation-block.jsx index 1d71f96..234cd27 100644 --- a/src/components/translation-block.jsx +++ b/src/components/translation-block.jsx @@ -55,7 +55,7 @@ function lingvaTranslate(text, source, target) { ); }, }); - // return masto.v1.statuses.translate(id, { + // return masto.v1.statuses.$select(id).translate({ // lang: DEFAULT_LANG, // }); } diff --git a/src/pages/account-statuses.jsx b/src/pages/account-statuses.jsx index b821294..0126a39 100644 --- a/src/pages/account-statuses.jsx +++ b/src/pages/account-statuses.jsx @@ -31,7 +31,8 @@ function AccountStatuses() { const results = []; if (firstLoad) { const { value: pinnedStatuses } = await masto.v1.accounts - .listStatuses(id, { + .$select(id) + .statuses.list({ pinned: true, }) .next(); @@ -53,13 +54,15 @@ function AccountStatuses() { } } if (firstLoad || !accountStatusesIterator.current) { - accountStatusesIterator.current = masto.v1.accounts.listStatuses(id, { - limit: LIMIT, - exclude_replies: excludeReplies, - exclude_reblogs: excludeBoosts, - only_media: media, - tagged, - }); + accountStatusesIterator.current = masto.v1.accounts + .$select(id) + .statuses.list({ + limit: LIMIT, + exclude_replies: excludeReplies, + exclude_reblogs: excludeBoosts, + only_media: media, + tagged, + }); } const { value, done } = await accountStatusesIterator.current.next(); if (value?.length) { @@ -86,14 +89,16 @@ function AccountStatuses() { useEffect(() => { (async () => { try { - const acc = await masto.v1.accounts.fetch(id); + const acc = await masto.v1.accounts.$select(id).fetch(); console.log(acc); setAccount(acc); } catch (e) { console.error(e); } try { - const featuredTags = await masto.v1.accounts.listFeaturedTags(id); + const featuredTags = await masto.v1.accounts + .$select(id) + .featuredTags.list(id); console.log({ featuredTags }); setFeaturedTags(featuredTags); } catch (e) { @@ -113,7 +118,7 @@ function AccountStatuses() { masto.v1.accounts.fetch(id)} + fetchAccount={() => masto.v1.accounts.$select(id).fetch()} authenticated={authenticated} standalone /> diff --git a/src/pages/accounts.jsx b/src/pages/accounts.jsx index 47d90b0..d43a33f 100644 --- a/src/pages/accounts.jsx +++ b/src/pages/accounts.jsx @@ -52,9 +52,9 @@ function Accounts({ onClose }) { onDblClick={async () => { if (isCurrent) { try { - const info = await masto.v1.accounts.fetch( - account.info.id, - ); + const info = await masto.v1.accounts + .$select(account.info.id) + .fetch(); console.log('fetched account info', info); account.info = info; store.local.setJSON('accounts', accounts); diff --git a/src/pages/following.jsx b/src/pages/following.jsx index 627a74e..3d081f3 100644 --- a/src/pages/following.jsx +++ b/src/pages/following.jsx @@ -13,7 +13,7 @@ const LIMIT = 20; function Following({ title, path, id, ...props }) { useTitle(title || 'Following', path || '/following'); - const { masto, instance } = api(); + const { masto, streaming, instance } = api(); const snapStates = useSnapshot(states); const homeIterator = useRef(); const latestItem = useRef(); @@ -22,7 +22,7 @@ function Following({ title, path, id, ...props }) { async function fetchHome(firstLoad) { if (firstLoad || !homeIterator.current) { - homeIterator.current = masto.v1.timelines.listHome({ limit: LIMIT }); + homeIterator.current = masto.v1.timelines.home.list({ limit: LIMIT }); } const results = await homeIterator.current.next(); let { value } = results; @@ -53,8 +53,8 @@ function Following({ title, path, id, ...props }) { async function checkForUpdates() { try { - const results = await masto.v1.timelines - .listHome({ + const results = await masto.v1.timelines.home + .list({ limit: 5, since_id: latestItem.current, }) @@ -75,52 +75,33 @@ function Following({ title, path, id, ...props }) { } } - const ws = useRef(); - const streamUser = async () => { - console.log('🎏 Start streaming user', ws.current); - if ( - ws.current && - (ws.current.readyState === WebSocket.CONNECTING || - ws.current.readyState === WebSocket.OPEN) - ) { - console.log('🎏 Streaming user already open'); - return; - } - const stream = await masto.v1.stream.streamUser(); - ws.current = stream.ws; - ws.current.__id = Math.random(); - console.log('🎏 Streaming user', ws.current); - - stream.on('status.update', (status) => { - console.log(`🔄 Status ${status.id} updated`); - saveStatus(status, instance); - }); - - stream.on('delete', (statusID) => { - console.log(`❌ Status ${statusID} deleted`); - // delete states.statuses[statusID]; - const s = getStatus(statusID, instance); - if (s) s._deleted = true; - }); - - stream.ws.onclose = () => { - console.log('🎏 Streaming user closed'); - }; - - return stream; - }; useEffect(() => { - let stream; + let sub; (async () => { - stream = await streamUser(); + if (streaming) { + sub = streaming.user.subscribe(); + console.log('🎏 Streaming user', sub); + for await (const entry of sub) { + if (!sub) break; + if (entry.event === 'status.update') { + const status = entry.payload; + console.log(`🔄 Status ${status.id} updated`); + saveStatus(status, instance); + } else if (entry.event === 'delete') { + const statusID = entry.payload; + console.log(`❌ Status ${statusID} deleted`); + // delete states.statuses[statusID]; + const s = getStatus(statusID, instance); + if (s) s._deleted = true; + } + } + } })(); return () => { - if (stream) { - stream.ws.close(); - ws.current = null; - } + sub?.unsubscribe?.(); + sub = null; }; - }, []); + }, [streaming]); return ( { (async () => { try { - const info = await masto.v1.tags.fetch(hashtag); + const info = await masto.v1.tags.$select(hashtag).fetch(); console.log(info); setInfo(info); } catch (e) { @@ -163,7 +165,8 @@ function Hashtags({ columnMode, ...props }) { // return; // } masto.v1.tags - .unfollow(hashtag) + .$select(hashtag) + .unfollow() .then(() => { setInfo({ ...info, following: false }); showToast(`Unfollowed #${hashtag}`); @@ -177,7 +180,8 @@ function Hashtags({ columnMode, ...props }) { }); } else { masto.v1.tags - .follow(hashtag) + .$select(hashtag) + .follow() .then(() => { setInfo({ ...info, following: true }); showToast(`Followed #${hashtag}`); diff --git a/src/pages/list.jsx b/src/pages/list.jsx index dcfa71e..d6f9a93 100644 --- a/src/pages/list.jsx +++ b/src/pages/list.jsx @@ -32,7 +32,7 @@ function List(props) { const listIterator = useRef(); async function fetchList(firstLoad) { if (firstLoad || !listIterator.current) { - listIterator.current = masto.v1.timelines.listList(id, { + listIterator.current = masto.v1.timelines.list.$select(id).list({ limit: LIMIT, }); } @@ -56,7 +56,7 @@ function List(props) { async function checkForUpdates() { try { - const results = await masto.v1.timelines.listList(id, { + const results = await masto.v1.timelines.list.$select(id).list({ limit: 1, since_id: latestItem.current, }); @@ -77,7 +77,7 @@ function List(props) { useEffect(() => { (async () => { try { - const list = await masto.v1.lists.fetch(id); + const list = await masto.v1.lists.$select(id).fetch(); setList(list); // setTitle(list.title); } catch (e) { @@ -200,9 +200,11 @@ function ListManageMembers({ listID, onClose }) { (async () => { try { if (firstLoad || !membersIterator.current) { - membersIterator.current = masto.v1.lists.listAccounts(listID, { - limit: MEMBERS_LIMIT, - }); + membersIterator.current = masto.v1.lists + .$select(listID) + .accounts.list({ + limit: MEMBERS_LIMIT, + }); } const results = await membersIterator.current.next(); let { done, value } = results; @@ -274,7 +276,7 @@ function RemoveAddButton({ account, listID }) { setUIState('loading'); (async () => { try { - await masto.v1.lists.addAccount(listID, { + await masto.v1.lists.$select(listID).accounts.create({ accountIds: [account.id], }); setUIState('default'); @@ -290,7 +292,7 @@ function RemoveAddButton({ account, listID }) { (async () => { try { - await masto.v1.lists.removeAccount(listID, { + await masto.v1.lists.$select(listID).accounts.remove({ accountIds: [account.id], }); setUIState('default'); diff --git a/src/pages/public.jsx b/src/pages/public.jsx index b634f23..2fac5b3 100644 --- a/src/pages/public.jsx +++ b/src/pages/public.jsx @@ -29,7 +29,7 @@ function Public({ local, columnMode, ...props }) { const publicIterator = useRef(); async function fetchPublic(firstLoad) { if (firstLoad || !publicIterator.current) { - publicIterator.current = masto.v1.timelines.listPublic({ + publicIterator.current = masto.v1.timelines.public.list({ limit: LIMIT, local: isLocal, }); @@ -54,8 +54,8 @@ function Public({ local, columnMode, ...props }) { async function checkForUpdates() { try { - const results = await masto.v1.timelines - .listPublic({ + const results = await masto.v1.timelines.public + .list({ limit: 1, local: isLocal, since_id: latestItem.current, diff --git a/src/pages/search.jsx b/src/pages/search.jsx index 4e6a0be..1301611 100644 --- a/src/pages/search.jsx +++ b/src/pages/search.jsx @@ -90,7 +90,7 @@ function Search(props) { if (authenticated) params.offset = offsetRef.current; } try { - const results = await masto.v2.search(params); + const results = await masto.v2.search.fetch(params); console.log(results); if (type) { if (firstLoad) { diff --git a/src/pages/status.jsx b/src/pages/status.jsx index c4165c7..75a80e2 100644 --- a/src/pages/status.jsx +++ b/src/pages/status.jsx @@ -100,7 +100,7 @@ function StatusPage(params) { if (!heroStatus && showMedia) { (async () => { try { - const status = await masto.v1.statuses.fetch(id); + const status = await masto.v1.statuses.$select(id).fetch(); saveStatus(status, instance); setHeroStatus(status); } catch (err) { @@ -235,12 +235,15 @@ function StatusThread({ id, closeLink = '/', instance: propInstance }) { (async () => { const heroFetch = () => - pRetry(() => masto.v1.statuses.fetch(id), { + pRetry(() => masto.v1.statuses.$select(id).fetch(), { retries: 4, }); - const contextFetch = pRetry(() => masto.v1.statuses.fetchContext(id), { - retries: 8, - }); + const contextFetch = pRetry( + () => masto.v1.statuses.$select(id).context.fetch(), + { + retries: 8, + }, + ); const hasStatus = !!snapStates.statuses[sKey]; let heroStatus = snapStates.statuses[sKey]; @@ -946,12 +949,13 @@ function StatusThread({ id, closeLink = '/', instance: propInstance }) { setUIState('loading'); (async () => { try { - const results = await currentMasto.v2.search({ - q: heroStatus.url, - type: 'statuses', - resolve: true, - limit: 1, - }); + const results = + await currentMasto.v2.search.fetch({ + q: heroStatus.url, + type: 'statuses', + resolve: true, + limit: 1, + }); if (results.statuses.length) { const status = results.statuses[0]; location.hash = currentInstance diff --git a/src/pages/trending.jsx b/src/pages/trending.jsx index 4b15742..d22d08c 100644 --- a/src/pages/trending.jsx +++ b/src/pages/trending.jsx @@ -30,13 +30,13 @@ function Trending({ columnMode, ...props }) { const trendIterator = useRef(); async function fetchTrend(firstLoad) { if (firstLoad || !trendIterator.current) { - trendIterator.current = masto.v1.trends.listStatuses({ + trendIterator.current = masto.v1.trends.statuses.list({ limit: LIMIT, }); // Get hashtags try { - const iterator = masto.v1.trends.listTags(); + const iterator = masto.v1.trends.tags.list(); const { value: tags } = await iterator.next(); console.log(tags); setHashtags(tags); @@ -64,8 +64,8 @@ function Trending({ columnMode, ...props }) { async function checkForUpdates() { try { - const results = await masto.v1.trends - .listStatuses({ + const results = await masto.v1.trends.statuses + .list({ limit: 1, // NOT SUPPORTED // since_id: latestItem.current, diff --git a/src/utils/api.js b/src/utils/api.js index 278ffcd..debc442 100644 --- a/src/utils/api.js +++ b/src/utils/api.js @@ -1,4 +1,4 @@ -import { createClient } from 'masto'; +import { createRestAPIClient, createStreamingAPIClient } from 'masto'; import store from './store'; import { @@ -37,14 +37,17 @@ export function initClient({ instance, accessToken }) { } const url = instance ? `https://${instance}` : `https://${DEFAULT_INSTANCE}`; - const client = createClient({ + const masto = createRestAPIClient({ url, accessToken, // Can be null - disableVersionCheck: true, // Allow non-Mastodon instances timeout: 30_000, // Unfortunatly this is global instead of per-request }); - client.__instance__ = instance; + const client = { + masto, + instance, + accessToken, + }; apis[instance] = client; if (!accountApis[instance]) accountApis[instance] = {}; if (accessToken) accountApis[instance][accessToken] = client; @@ -55,7 +58,8 @@ export function initClient({ instance, accessToken }) { // Get the instance information // The config is needed for composing export async function initInstance(client, instance) { - const masto = client; + console.log('INIT INSTANCE', client, instance); + const { masto, accessToken } = client; // Request v2, fallback to v1 if fail let info; try { @@ -63,7 +67,7 @@ export async function initInstance(client, instance) { } catch (e) {} if (!info) { try { - info = await masto.v1.instances.fetch(); + info = await masto.v1.instance.fetch(); } catch (e) {} } if (!info) return; @@ -91,17 +95,28 @@ export async function initInstance(client, instance) { store.local.setJSON('instances', instances); // This is a weird place to put this but here's updating the masto instance with the streaming API URL set in the configuration // Reason: Streaming WebSocket URL may change, unlike the standard API REST URLs - if (streamingApi || streaming) { + const supportsWebSocket = 'WebSocket' in window; + if (supportsWebSocket && (streamingApi || streaming)) { console.log('🎏 Streaming API URL:', streaming || streamingApi); - masto.config.props.streamingApiUrl = streaming || streamingApi; + // masto.config.props.streamingApiUrl = streaming || streamingApi; + // Legacy masto.ws + const streamClient = createStreamingAPIClient({ + streamingApiUrl: streaming || streamingApi, + accessToken, + implementation: WebSocket, + }); + client.streaming = streamClient; + // masto.ws = streamClient; + console.log('🎏 Streaming API client:', client); } } // Get the account information and store it export async function initAccount(client, instance, accessToken, vapidKey) { - const masto = client; + const { masto } = client; const mastoAccount = await masto.v1.accounts.verifyCredentials(); + console.log('CURRENTACCOUNT SET', mastoAccount.id); store.session.set('currentAccount', mastoAccount.id); saveAccount({ @@ -115,7 +130,7 @@ export async function initAccount(client, instance, accessToken, vapidKey) { // Get preferences export async function initPreferences(client) { try { - const masto = client; + const { masto } = client; const preferences = await masto.v1.preferences.fetch(); store.account.set('preferences', preferences); } catch (e) { @@ -134,10 +149,14 @@ export function api({ instance, accessToken, accountID, account } = {}) { // If instance and accessToken are provided, get the masto instance for that account if (instance && accessToken) { + const client = + accountApis[instance]?.[accessToken] || + initClient({ instance, accessToken }); + const { masto, streaming } = client; return { - masto: - accountApis[instance]?.[accessToken] || - initClient({ instance, accessToken }), + masto, + streaming, + client, authenticated: true, instance, }; @@ -149,8 +168,12 @@ export function api({ instance, accessToken, accountID, account } = {}) { for (const instance in accountApis) { if (accountApis[instance][accessToken]) { console.log('X 2', accountApis, instance, accessToken); + const client = accountApis[instance][accessToken]; + const { masto, streaming } = client; return { - masto: accountApis[instance][accessToken], + masto, + streaming, + client, authenticated: true, instance, }; @@ -160,8 +183,12 @@ export function api({ instance, accessToken, accountID, account } = {}) { if (account) { const accessToken = account.accessToken; const instance = account.instanceURL.toLowerCase().trim(); + const client = initClient({ instance, accessToken }); + const { masto, streaming } = client; return { - masto: initClient({ instance, accessToken }), + masto, + streaming, + client, authenticated: true, instance, }; @@ -178,10 +205,14 @@ export function api({ instance, accessToken, accountID, account } = {}) { if (account) { const accessToken = account.accessToken; const instance = account.instanceURL.toLowerCase().trim(); + const client = + accountApis[instance]?.[accessToken] || + initClient({ instance, accessToken }); + const { masto, streaming } = client; return { - masto: - accountApis[instance]?.[accessToken] || - initClient({ instance, accessToken }), + masto, + streaming, + client, authenticated: true, instance, }; @@ -192,10 +223,13 @@ export function api({ instance, accessToken, accountID, account } = {}) { // If only instance is provided, get the masto instance for that instance if (instance) { - const masto = apis[instance] || initClient({ instance }); + const client = apis[instance] || initClient({ instance }); + const { masto, streaming, accessToken } = client; return { masto, - authenticated: !!masto.config.props.accessToken, + streaming, + client, + authenticated: !!accessToken, instance, }; } @@ -203,9 +237,11 @@ export function api({ instance, accessToken, accountID, account } = {}) { // If no instance is provided, get the masto instance for the current account if (currentAccountApi) { return { - masto: currentAccountApi, + masto: currentAccountApi.masto, + streaming: currentAccountApi.streaming, + client: currentAccountApi, authenticated: true, - instance: currentAccountApi.__instance__, + instance: currentAccountApi.instance, }; } const currentAccount = getCurrentAccount(); @@ -215,15 +251,22 @@ export function api({ instance, accessToken, accountID, account } = {}) { accountApis[instance]?.[accessToken] || initClient({ instance, accessToken }); return { - masto: currentAccountApi, + masto: currentAccountApi.masto, + streaming: currentAccountApi.streaming, + client: currentAccountApi, authenticated: true, instance, }; } // If no instance is provided and no account is logged in, get the masto instance for DEFAULT_INSTANCE + const client = + apis[DEFAULT_INSTANCE] || initClient({ instance: DEFAULT_INSTANCE }); + const { masto, streaming } = client; return { - masto: apis[DEFAULT_INSTANCE] || initClient({ instance: DEFAULT_INSTANCE }), + masto, + streaming, + client, authenticated: false, instance: DEFAULT_INSTANCE, }; diff --git a/src/utils/push-notifications.js b/src/utils/push-notifications.js index 013dd5b..e186547 100644 --- a/src/utils/push-notifications.js +++ b/src/utils/push-notifications.js @@ -34,22 +34,22 @@ import { getCurrentAccount } from './store-utils'; function createBackendPushSubscription(subscription) { const { masto } = api(); - return masto.v1.webPushSubscriptions.create(subscription); + return masto.v1.push.subscription.create(subscription); } function fetchBackendPushSubscription() { const { masto } = api(); - return masto.v1.webPushSubscriptions.fetch(); + return masto.v1.push.subscription.fetch(); } function updateBackendPushSubscription(subscription) { const { masto } = api(); - return masto.v1.webPushSubscriptions.update(subscription); + return masto.v1.push.subscription.update(subscription); } function removeBackendPushSubscription() { const { masto } = api(); - return masto.v1.webPushSubscriptions.remove(); + return masto.v1.push.subscription.remove(); } // Front-end diff --git a/src/utils/states.js b/src/utils/states.js index b2424f0..3c61bfb 100644 --- a/src/utils/states.js +++ b/src/utils/states.js @@ -207,7 +207,7 @@ export function threadifyStatus(status, propInstance) { if (!prevStatus) { if (fetchIndex++ > 3) throw 'Too many fetches for thread'; // Some people revive old threads await new Promise((r) => setTimeout(r, 500 * fetchIndex)); // Be nice to rate limits - // prevStatus = await masto.v1.statuses.fetch(inReplyToId); + // prevStatus = await masto.v1.statuses.$.select(inReplyToId).fetch(); prevStatus = await fetchStatus(inReplyToId, masto); saveStatus(prevStatus, instance, { skipThreading: true }); } @@ -230,5 +230,5 @@ export function threadifyStatus(status, propInstance) { } const fetchStatus = mem((statusID, masto) => { - return masto.v1.statuses.fetch(statusID); + return masto.v1.statuses.$select(statusID).fetch(); });