From ab347790a8fb92c5e1fe87ff3b8d00989fd0386d Mon Sep 17 00:00:00 2001 From: Louis Chemineau Date: Thu, 19 Jan 2023 17:18:11 +0100 Subject: [PATCH] Use new Mastodon like API Revert "Revert "Merge pull request #1581 from nextcloud/artonge/feat/use_new_api"" This reverts commit c4eef0b2d476ffcf10cfc3a44ea426d3ec7587b4. Signed-off-by: Louis Chemineau Adapt views to new timeline api Signed-off-by: Louis Chemineau Add types Signed-off-by: Louis Chemineau Fix type errors Signed-off-by: Louis Chemineau Adapte front-end to mastodon data format + Add typing + Modernize code Signed-off-by: Louis Chemineau Use new API for media attachments + Split Composer.vue into tinier composent + Use blurhash value of attachments Signed-off-by: Louis Chemineau Fix media attachment rendering in post component Signed-off-by: Louis Chemineau Use square container to display statuses attachments Signed-off-by: Louis Chemineau Add typing to timeline.js And fix type errors Signed-off-by: Louis Chemineau Forward format to getStreamSelectSql for direct timeline Signed-off-by: Louis Chemineau Fix liked timeline Signed-off-by: Louis Chemineau Use new API for local and federated timelines Signed-off-by: Louis Chemineau Fix profile and avatar for local users Signed-off-by: Louis Chemineau Update babel config Signed-off-by: Louis Chemineau Improve typing in account.js Signed-off-by: Louis Chemineau Handle new notification format Signed-off-by: Louis Chemineau Fix follow button Signed-off-by: Louis Chemineau Fix condition of delete button for statuses Signed-off-by: Louis Chemineau Add relationship fetching Signed-off-by: Louis Chemineau Improve attachments viewer Signed-off-by: Louis Chemineau Correctly use twemoji Signed-off-by: Louis Chemineau Clean up composer Signed-off-by: Louis Chemineau Insert emoji on the last line instead of creating a new one Signed-off-by: Louis Chemineau Overall improvements in composer Signed-off-by: Louis Chemineau Clean up PreviewGridItem Signed-off-by: Louis Chemineau Fix fetching relationships Signed-off-by: Louis Chemineau Fix followers and following list Signed-off-by: Louis Chemineau Fix direct link to followers and following lists Signed-off-by: Louis Chemineau Fix notifications endpoint Signed-off-by: Louis Chemineau Handle different types of notifications Signed-off-by: Louis Chemineau Add formatted date as title for statuses Signed-off-by: Louis Chemineau Fix entryContent computed property Signed-off-by: Louis Chemineau Handle reblog Signed-off-by: Louis Chemineau Fix favourite type Signed-off-by: Louis Chemineau Load context of status for single post Signed-off-by: Louis Chemineau Use new format to set the uid in single post Signed-off-by: Louis Chemineau Fix display name property Signed-off-by: Louis Chemineau Hack to handle context of single post Signed-off-by: Louis Chemineau Use item id to fetch context Signed-off-by: Louis Chemineau Remove unsused variable Signed-off-by: Louis Chemineau --- .babelrc.js | 15 +- css/style.scss | 24 - lib/Controller/ApiController.php | 4 +- lib/Controller/LocalController.php | 7 +- lib/Db/StreamRequest.php | 4 +- lib/Model/ActivityPub/Stream.php | 2 +- package-lock.json | 306 ++++++++++--- package.json | 5 +- src/App.vue | 11 +- src/components/ActorAvatar.vue | 24 +- src/components/Composer/Composer.vue | 423 ++++++------------ src/components/Composer/PreviewGrid.vue | 16 +- src/components/Composer/PreviewGridItem.vue | 68 +-- .../Composer/SubmitStatusButton.vue | 137 ++++++ src/components/Composer/VisibilitySelect.vue | 121 +++++ src/components/Emoji.vue | 8 +- src/components/EmptyContent.vue | 46 +- src/components/FollowButton.vue | 17 +- src/components/MediaAttachment.vue | 77 ++++ src/components/MessageContent.js | 36 +- src/components/PostAttachment.vue | 134 +++--- src/components/ProfileInfo.vue | 42 +- src/components/Search.vue | 4 + src/components/TimelineAvatar.vue | 20 +- src/components/TimelineEntry.vue | 132 +++--- src/components/TimelineList.vue | 50 ++- src/components/TimelinePost.vue | 125 ++++-- src/components/UserEntry.vue | 42 +- src/logger.js | 28 -- src/main.js | 4 +- src/mixins/accountMixins.js | 15 +- src/mixins/currentUserMixin.js | 7 +- src/mixins/follow.js | 71 --- src/mixins/popoverMenu.js | 2 +- src/mixins/serverData.js | 5 +- src/ostatus.js | 2 +- src/router.js | 16 +- src/store/account.js | 232 ++++++---- src/store/timeline.js | 279 +++++++++--- src/types/ActivityPub.js | 75 ++++ src/types/Mastodon.js | 188 ++++++++ src/views/Dashboard.vue | 4 + src/views/Profile.vue | 14 +- src/views/ProfileFollowers.vue | 2 + src/views/Timeline.vue | 2 - src/views/TimelineSinglePost.vue | 6 +- webpack.common.js | 9 +- 47 files changed, 1816 insertions(+), 1045 deletions(-) delete mode 100644 css/style.scss create mode 100644 src/components/Composer/SubmitStatusButton.vue create mode 100644 src/components/Composer/VisibilitySelect.vue create mode 100644 src/components/MediaAttachment.vue delete mode 100644 src/logger.js delete mode 100644 src/mixins/follow.js create mode 100644 src/types/ActivityPub.js create mode 100644 src/types/Mastodon.js diff --git a/.babelrc.js b/.babelrc.js index 475cfbd7..8be4fc38 100644 --- a/.babelrc.js +++ b/.babelrc.js @@ -1,14 +1,3 @@ -module.exports = { - plugins: ['@babel/plugin-syntax-dynamic-import'], - presets: [ - [ - '@babel/preset-env', - { - targets: { - browsers: ['last 2 versions', 'ie >= 11'] - } - } - ] - ] -} +const babelConfig = require('@nextcloud/babel-config') +module.exports = babelConfig diff --git a/css/style.scss b/css/style.scss deleted file mode 100644 index 917fd531..00000000 --- a/css/style.scss +++ /dev/null @@ -1,24 +0,0 @@ -@include icon-black-white('reply', 'social', 1); -@include icon-black-white('emoji', 'social', 1); -@include icon-black-white('boost', 'social', 1); -@include icon-black-white('upload', 'actions', 1, true); -@include icon-black-white('notifications', 'social', 1); - -.icon-boosted { - @include icon-color('boost', 'social', '#0082c9', 1); -} -.icon-upload { - @include icon-color('upload', 'actions', $color-black, 1, true); -} - -img.emoji { - margin: 3px; - width: 16px; - vertical-align: text-bottom; -} - - -// quick fix - TODO - remove this and fix the left panel -ul.app-navigation__list { - display: none !important; -} diff --git a/lib/Controller/ApiController.php b/lib/Controller/ApiController.php index 9789f095..8a124e9f 100644 --- a/lib/Controller/ApiController.php +++ b/lib/Controller/ApiController.php @@ -554,7 +554,7 @@ class ApiController extends Controller { int $limit = 20, int $max_id = 0, int $min_id = 0, - int $since = 0 + int $since_id = 0 ): DataResponse { try { $this->initViewer(true); @@ -568,7 +568,7 @@ class ApiController extends Controller { ->setLimit($limit) ->setMaxId($max_id) ->setMinId($min_id) - ->setSince($since); + ->setSince($since_id); $posts = $this->streamService->getTimeline($options); diff --git a/lib/Controller/LocalController.php b/lib/Controller/LocalController.php index b75e237f..d0581885 100644 --- a/lib/Controller/LocalController.php +++ b/lib/Controller/LocalController.php @@ -37,6 +37,7 @@ use Exception; use OCA\Social\AppInfo\Application; use OCA\Social\Exceptions\AccountDoesNotExistException; use OCA\Social\Exceptions\InvalidResourceException; +use OCA\Social\Model\ActivityPub\ACore; use OCA\Social\Model\ActivityPub\Actor\Person; use OCA\Social\Model\ActivityPub\Object\Note; use OCA\Social\Model\ActivityPub\Stream; @@ -537,8 +538,9 @@ class LocalController extends Controller { $actor = $this->cacheActorService->getFromLocalAccount($username); $actor->setCompleteDetails(true); + $actor->setExportFormat(ACore::FORMAT_LOCAL); - return $this->success(['account' => $actor]); + return new DataResponse($actor, Http::STATUS_OK); } catch (Exception $e) { return $this->fail($e); } @@ -588,8 +590,9 @@ class LocalController extends Controller { $this->initViewer(); $actor = $this->cacheActorService->getFromAccount($account); + $actor->setExportFormat(ACore::FORMAT_LOCAL); - return $this->success(['account' => $actor]); + return new DataResponse($actor, Http::STATUS_OK); } catch (Exception $e) { return $this->fail($e); } diff --git a/lib/Db/StreamRequest.php b/lib/Db/StreamRequest.php index f3c79918..da9922f3 100644 --- a/lib/Db/StreamRequest.php +++ b/lib/Db/StreamRequest.php @@ -451,7 +451,7 @@ class StreamRequest extends StreamRequestBuilder { * @return Stream[] */ private function getTimelineDirect(ProbeOptions $options): array { - $qb = $this->getStreamSelectSql(); + $qb = $this->getStreamSelectSql($options->getFormat()); $qb->filterType(SocialAppNotification::TYPE); $qb->paginate($options); @@ -476,7 +476,7 @@ class StreamRequest extends StreamRequestBuilder { * @return Stream[] */ private function getTimelineAccount(ProbeOptions $options): array { - $qb = $this->getStreamSelectSql(); + $qb = $this->getStreamSelectSql($options->getFormat()); $qb->filterType(SocialAppNotification::TYPE); $qb->paginate($options); diff --git a/lib/Model/ActivityPub/Stream.php b/lib/Model/ActivityPub/Stream.php index df0b1741..233a9819 100644 --- a/lib/Model/ActivityPub/Stream.php +++ b/lib/Model/ActivityPub/Stream.php @@ -592,7 +592,7 @@ class Stream extends ACore implements IQueryRow, JsonSerializable { public function exportAsNotification(): array { switch ($this->getSubType()) { case Like::TYPE: - $type = 'favourites'; + $type = 'favourite'; break; case Announce::TYPE: $type = 'mention'; diff --git a/package-lock.json b/package-lock.json index c6a239ed..9906e477 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,6 +19,8 @@ "@nextcloud/router": "^2.0.1", "@nextcloud/vue": "^7.4.0", "@nextcloud/vue-richtext": "^2.0.4", + "blurhash": "^2.0.5", + "debounce": "^1.2.1", "he": "^1.2.0", "linkify-plugin-mention": "^4.1.0", "linkify-string": "^4.1.0", @@ -30,8 +32,8 @@ "v-tooltip": "^4.0.0-beta.0", "vue": "^2.7.10", "vue-click-outside": "^1.0.7", - "vue-contenteditable-directive": "^1.2.0", "vue-infinite-loading": "^2.4.4", + "vue-masonry-css": "^1.0.3", "vue-material-design-icons": "^5.0.0", "vue-router": "^3.6.5", "vue-tribute": "^1.0.7", @@ -47,6 +49,7 @@ "@nextcloud/eslint-config": "^8.2.0", "@nextcloud/stylelint-config": "^2.3.0", "@nextcloud/webpack-vue-config": "^5.4.0", + "copy-webpack-plugin": "^11.0.0", "cypress": "^11.2.0", "jest": "^29.3.1", "jest-serializer-vue": "^3.1.0", @@ -3513,7 +3516,6 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, - "peer": true, "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -3527,7 +3529,6 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, - "peer": true, "engines": { "node": ">= 8" } @@ -3537,7 +3538,6 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, - "peer": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -3796,8 +3796,7 @@ "version": "7.0.11", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/@types/json5": { "version": "0.0.29", @@ -4798,7 +4797,6 @@ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, - "peer": true, "dependencies": { "ajv": "^8.0.0" }, @@ -4816,7 +4814,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -4832,8 +4829,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "peer": true + "dev": true }, "node_modules/ajv-keywords": { "version": "3.5.2", @@ -5585,6 +5581,11 @@ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", "dev": true }, + "node_modules/blurhash": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/blurhash/-/blurhash-2.0.5.tgz", + "integrity": "sha512-cRygWd7kGBQO3VEhPiTgq4Wc43ctsM+o46urrmPOiuAe+07fzlSB9OJVdpgDL0jPqXUVQ9ht7aq7kxOeJHRK+w==" + }, "node_modules/bn.js": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", @@ -6779,6 +6780,126 @@ "dev": true, "peer": true }, + "node_modules/copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "dev": true, + "dependencies": { + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/copy-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/globby": { + "version": "13.1.3", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz", + "integrity": "sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==", + "dev": true, + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/copy-webpack-plugin/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/copy-webpack-plugin/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/core-js": { "version": "3.25.5", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.25.5.tgz", @@ -7558,7 +7679,6 @@ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, - "peer": true, "dependencies": { "path-type": "^4.0.0" }, @@ -9189,15 +9309,13 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "peer": true + "dev": true }, "node_modules/fast-glob": { "version": "3.2.11", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", "dev": true, - "peer": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -9258,7 +9376,6 @@ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", "dev": true, - "peer": true, "dependencies": { "reusify": "^1.0.4" } @@ -10219,7 +10336,6 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true, - "peer": true, "engines": { "node": ">= 4" } @@ -13565,7 +13681,6 @@ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, - "peer": true, "engines": { "node": ">= 8" } @@ -14425,7 +14540,6 @@ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, - "peer": true, "engines": { "node": ">=8" } @@ -14899,8 +15013,7 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "peer": true + ] }, "node_modules/quick-lru": { "version": "4.0.1", @@ -15298,7 +15411,6 @@ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true, - "peer": true, "engines": { "node": ">=0.10.0" } @@ -15405,7 +15517,6 @@ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, - "peer": true, "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -15461,7 +15572,6 @@ "url": "https://feross.org/support" } ], - "peer": true, "dependencies": { "queue-microtask": "^1.2.2" } @@ -15633,7 +15743,6 @@ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "dev": true, - "peer": true, "dependencies": { "randombytes": "^2.1.0" } @@ -17410,7 +17519,6 @@ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", "dev": true, - "peer": true, "dependencies": { "punycode": "^2.1.0" } @@ -17582,11 +17690,6 @@ "tinycolor2": "^1.1.2" } }, - "node_modules/vue-contenteditable-directive": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vue-contenteditable-directive/-/vue-contenteditable-directive-1.2.0.tgz", - "integrity": "sha512-9RuW1cboQBOUhURXiQpBD8XldyK2BYWhkWTnRw4Qmv8ZeQy+tGnnPs4XfemoPNf4KQW31Mx6UqEszlZYgoPeYw==" - }, "node_modules/vue-eslint-parser": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.1.0.tgz", @@ -17748,6 +17851,11 @@ } } }, + "node_modules/vue-masonry-css": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/vue-masonry-css/-/vue-masonry-css-1.0.3.tgz", + "integrity": "sha512-viecHQiHVLez7HlYUQsv1wJb2MT/RDSzkDp6m3In41vPrk6OsBmT2qRE8LZqYIA4daIwrnx/Xm8h4fjOpuE3hw==" + }, "node_modules/vue-material-design-icons": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/vue-material-design-icons/-/vue-material-design-icons-5.1.2.tgz", @@ -21213,7 +21321,6 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, - "peer": true, "requires": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -21223,15 +21330,13 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "peer": true + "dev": true }, "@nodelib/fs.walk": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, - "peer": true, "requires": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -21479,8 +21584,7 @@ "version": "7.0.11", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true, - "peer": true + "dev": true }, "@types/json5": { "version": "0.0.29", @@ -22279,7 +22383,6 @@ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, - "peer": true, "requires": { "ajv": "^8.0.0" }, @@ -22289,7 +22392,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, - "peer": true, "requires": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -22301,8 +22403,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "peer": true + "dev": true } } }, @@ -22878,6 +22979,11 @@ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", "dev": true }, + "blurhash": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/blurhash/-/blurhash-2.0.5.tgz", + "integrity": "sha512-cRygWd7kGBQO3VEhPiTgq4Wc43ctsM+o46urrmPOiuAe+07fzlSB9OJVdpgDL0jPqXUVQ9ht7aq7kxOeJHRK+w==" + }, "bn.js": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", @@ -23839,6 +23945,89 @@ "dev": true, "peer": true }, + "copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "dev": true, + "requires": { + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "globby": { + "version": "13.1.3", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz", + "integrity": "sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==", + "dev": true, + "requires": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + }, + "slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true + } + } + }, "core-js": { "version": "3.25.5", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.25.5.tgz", @@ -24440,7 +24629,6 @@ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, - "peer": true, "requires": { "path-type": "^4.0.0" } @@ -25677,15 +25865,13 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "peer": true + "dev": true }, "fast-glob": { "version": "3.2.11", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", "dev": true, - "peer": true, "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -25733,7 +25919,6 @@ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", "dev": true, - "peer": true, "requires": { "reusify": "^1.0.4" } @@ -26452,8 +26637,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true, - "peer": true + "dev": true }, "immutable": { "version": "4.1.0", @@ -28954,8 +29138,7 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "peer": true + "dev": true }, "methods": { "version": "1.1.2", @@ -29617,8 +29800,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "peer": true + "dev": true }, "pbkdf2": { "version": "3.1.2", @@ -29964,8 +30146,7 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "peer": true + "dev": true }, "quick-lru": { "version": "4.0.1", @@ -30288,8 +30469,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "peer": true + "dev": true }, "requireindex": { "version": "1.2.0", @@ -30367,8 +30547,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "peer": true + "dev": true }, "rfdc": { "version": "1.3.0", @@ -30400,7 +30579,6 @@ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, - "peer": true, "requires": { "queue-microtask": "^1.2.2" } @@ -30526,7 +30704,6 @@ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "dev": true, - "peer": true, "requires": { "randombytes": "^2.1.0" } @@ -31912,7 +32089,6 @@ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", "dev": true, - "peer": true, "requires": { "punycode": "^2.1.0" } @@ -32067,11 +32243,6 @@ "tinycolor2": "^1.1.2" } }, - "vue-contenteditable-directive": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vue-contenteditable-directive/-/vue-contenteditable-directive-1.2.0.tgz", - "integrity": "sha512-9RuW1cboQBOUhURXiQpBD8XldyK2BYWhkWTnRw4Qmv8ZeQy+tGnnPs4XfemoPNf4KQW31Mx6UqEszlZYgoPeYw==" - }, "vue-eslint-parser": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.1.0.tgz", @@ -32186,6 +32357,11 @@ "vue-style-loader": "^4.1.0" } }, + "vue-masonry-css": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/vue-masonry-css/-/vue-masonry-css-1.0.3.tgz", + "integrity": "sha512-viecHQiHVLez7HlYUQsv1wJb2MT/RDSzkDp6m3In41vPrk6OsBmT2qRE8LZqYIA4daIwrnx/Xm8h4fjOpuE3hw==" + }, "vue-material-design-icons": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/vue-material-design-icons/-/vue-material-design-icons-5.1.2.tgz", diff --git a/package.json b/package.json index 40106084..fdca76c0 100644 --- a/package.json +++ b/package.json @@ -42,6 +42,8 @@ "@nextcloud/router": "^2.0.1", "@nextcloud/vue": "^7.4.0", "@nextcloud/vue-richtext": "^2.0.4", + "blurhash": "^2.0.5", + "debounce": "^1.2.1", "he": "^1.2.0", "linkify-plugin-mention": "^4.1.0", "linkify-string": "^4.1.0", @@ -53,8 +55,8 @@ "v-tooltip": "^4.0.0-beta.0", "vue": "^2.7.10", "vue-click-outside": "^1.0.7", - "vue-contenteditable-directive": "^1.2.0", "vue-infinite-loading": "^2.4.4", + "vue-masonry-css": "^1.0.3", "vue-material-design-icons": "^5.0.0", "vue-router": "^3.6.5", "vue-tribute": "^1.0.7", @@ -80,6 +82,7 @@ "@nextcloud/eslint-config": "^8.2.0", "@nextcloud/stylelint-config": "^2.3.0", "@nextcloud/webpack-vue-config": "^5.4.0", + "copy-webpack-plugin": "^11.0.0", "cypress": "^11.2.0", "jest": "^29.3.1", "jest-serializer-vue": "^3.1.0", diff --git a/src/App.vue b/src/App.vue index d1f70e76..45fdd29d 100644 --- a/src/App.vue +++ b/src/App.vue @@ -106,9 +106,11 @@ export default { } }, computed: { + /** @return {import('vue').PropType} */ timeline() { return this.$store.getters.getTimeline }, + /** @return {{items: {id: string, icon: object, title: string, to: { name: string } }, loading: boolean}} */ menu() { const defaultCategories = [ { @@ -152,7 +154,7 @@ export default { title: t('social', 'Liked'), to: { name: 'timeline', - params: { type: 'liked' }, + params: { type: 'favourites' }, }, }, { @@ -263,3 +265,10 @@ export default { } + diff --git a/src/components/ActorAvatar.vue b/src/components/ActorAvatar.vue index 50f026a8..890399c4 100644 --- a/src/components/ActorAvatar.vue +++ b/src/components/ActorAvatar.vue @@ -21,10 +21,10 @@ -->