feat: instance sharing thru shared-instances service (#6569)

* feat: implement instance share page + search_users backend call

* feat: invite players modal

* feat: use tanstack queries for friends sync across app pages

* feat: base shared instances implementation

* fix: admon style

* feat: impl instance admonitions like server panel

* fix: impl get + del usage

* feat: support modpack links

* feat: invite notif accepting

* fix: lint + fmt

* feat: impl install to play

* feat: impl usage of UpdateToPlayModal

* feat: warnings on deleting/disabling shared-instance version content

* fix: send instance name

* feat: align with backend

* feat: shared instances qa

* feat: wrong account protection

* feat: qa

* fix: smartly apply updates

* fix: install bug

* fix: 401/404 differentiation

* fix: fmt+prepr

* feat: qa

* feat: qa

* fix: signing out messes up revoke/deleted checks

* feat: qa

* fix: fmt + lint

* feat: lock content if part of shared instance

* fix: lint

* [do not merge] feat: rough invite links impl temp (#6666)

* fix: wrong cmd

* feat: invite page

* fix: server-manager DTO mismatch

* fix: drop anonymous invite link acceptance

* refactor: structured shared-instance unavailable errors

* refactor: centralise error presentations

* refactor: dedupe shared instance diff detection

* fix: logging in reqwests

* refactor: move app.vue shared instances into handler

* refactor: break up Share.vue

* refactor: split up shared instances state outside of instance index

* refactor: dedicated shared instances install/update modals + split up page

* refactor: centralized managed content

* refactor: split up install shared to own runner + shared.rs split up

* refactor: dedupe sql for instance metadata enrichmnt

* refactor: friends composable + dedupe friends logic across usages

* chore: reduced unused code

* fix: align with backend

* fix: lint

* fix: file sha changes

* fix: invite links not working due to icon signed

* feat: qa

* feat: reporting frontend dummy

* fix: try use header

* remove: file hash field

* fix: pin box

* feat: malware warning for shared instances

* fix: cache rule

* feat: config files syncing

* feat: disable config sharing

* fix: header

* fix: use mark ready

* fix: dont cause push update for configs

* fix: lint

* feat: sharing page in settings

* feat: move config + change flow

* fix: qa

* fix: lint prepr

* feat: proxy file upload thru shared instances backend

* fix: use collapisible

* fix: push config

* fix: config

* feat: swap out sign in modal for new one

* fix: report flow

* fix: exclude configs.zip from external warnings

* fix: nuxi init

* fix: config bundle downloading

* fix: error notif

* fix: polling

* fix: qa

* fix: lint + prepr

* feat: shared instances moderation frontend + hook up report flow

* fix: report copy

* fix: lint

* fix: lint

* fix: modrinth ids being undefined

* feat: instance quarantining

* fix: prepr + fmt

* fix: quarantined -> locked terminology

* fix: missing endpoint impls + fmt

* fix: missing api in build.rs

* fix: share tab jittery

* fix: fmt

*PT bug

* fix: invites count as users even if pending

* fix: prepr

* fix: invite page owner in users list

* fix: lint

* fix: qa

* fix: lint

* fix: members stale not clearing

* fix: invite use joined_at field

* fix: lint

* fix: qa

---------

Co-authored-by: sychic <47618543+Sychic@users.noreply.github.com>
This commit is contained in:
Calum H.
2026-07-24 13:06:38 +00:00
committed by GitHub
co-authored by sychic
parent 2e0d797bb0
commit e58af98f21
269 changed files with 18202 additions and 2579 deletions
+117 -9
View File
@@ -377,6 +377,9 @@
"content.confirm-deletion.header": {
"defaultMessage": "Delete {itemType}"
},
"content.confirm-disable.header": {
"defaultMessage": "Disable {itemType}"
},
"content.confirm-modpack-update.admonition-body": {
"defaultMessage": "{action, select, downgrade {Downgrading} other {Updating}} may cause compatibility issues. Mods or content you added on top of the modpack will be kept, but may not be compatible with the new version."
},
@@ -446,12 +449,18 @@
"content.diff-modal.added-count": {
"defaultMessage": "{count} added"
},
"content.diff-modal.config-files-updated": {
"defaultMessage": "Changed config files"
},
"content.diff-modal.diff-type.added": {
"defaultMessage": "Added (dependency)"
},
"content.diff-modal.diff-type.removed": {
"defaultMessage": "Disabled"
},
"content.diff-modal.diff-type.removed-disabled": {
"defaultMessage": "Removed (disabled)"
},
"content.diff-modal.diff-type.updated": {
"defaultMessage": "Updated"
},
@@ -467,12 +476,36 @@
"content.diff-modal.external-diff-type.updated": {
"defaultMessage": "Updated"
},
"content.diff-modal.file-count": {
"defaultMessage": "{count, plural, one {# file} other {# files}}"
},
"content.diff-modal.game-version-updated": {
"defaultMessage": "Game version"
},
"content.diff-modal.install-anyway": {
"defaultMessage": "Install anyway"
},
"content.diff-modal.loader-updated": {
"defaultMessage": "Loader"
},
"content.diff-modal.modpack-linked": {
"defaultMessage": "Linked modpack"
},
"content.diff-modal.modpack-unlinked": {
"defaultMessage": "Unlinked modpack"
},
"content.diff-modal.modpack-updated": {
"defaultMessage": "Updated modpack"
},
"content.diff-modal.no-content-changes": {
"defaultMessage": "No content changes"
},
"content.diff-modal.removed-count": {
"defaultMessage": "{count} removed"
},
"content.diff-modal.removed-disabled-count": {
"defaultMessage": "{count} removed (disabled)"
},
"content.diff-modal.reviewed-files": {
"defaultMessage": "A file is only reviewed if its published to Modrinth, regardless of its file format (including .mrpack)."
},
@@ -533,15 +566,6 @@
"content.inline-backup.world-label": {
"defaultMessage": "world"
},
"content.modpack-card.content-hint-description": {
"defaultMessage": "Your modpack's content can now be found here!"
},
"content.modpack-card.content-hint-title": {
"defaultMessage": "Modpack content moved"
},
"content.modpack-card.dismiss-hint": {
"defaultMessage": "Don't show again"
},
"content.page-layout.additional-content": {
"defaultMessage": "Additional content"
},
@@ -2054,6 +2078,12 @@
"instances.modpack-content-modal.empty-title": {
"defaultMessage": "No content found"
},
"instances.modpack-content-modal.external-content": {
"defaultMessage": "External"
},
"instances.modpack-content-modal.external-content-description": {
"defaultMessage": "This file is not published on Modrinth."
},
"instances.modpack-content-modal.header": {
"defaultMessage": "Modpack content"
},
@@ -2063,6 +2093,9 @@
"instances.modpack-content-modal.no-results": {
"defaultMessage": "No projects match your search."
},
"instances.modpack-content-modal.open-in-slicer": {
"defaultMessage": "Open in Slicer"
},
"instances.modpack-content-modal.search-placeholder": {
"defaultMessage": "Search {count, number} {count, plural, one {project} other {projects}}"
},
@@ -5069,6 +5102,81 @@
"settings.sessions.title": {
"defaultMessage": "Sessions"
},
"sharing.invite-players-modal.add": {
"defaultMessage": "Add"
},
"sharing.invite-players-modal.added": {
"defaultMessage": "Added"
},
"sharing.invite-players-modal.already-invited": {
"defaultMessage": "This user has already been invited."
},
"sharing.invite-players-modal.avatar-alt": {
"defaultMessage": "{username}'s avatar"
},
"sharing.invite-players-modal.cancel": {
"defaultMessage": "Cancel"
},
"sharing.invite-players-modal.cancel-button": {
"defaultMessage": "Cancel"
},
"sharing.invite-players-modal.edit-invite-link": {
"defaultMessage": "Edit invite link."
},
"sharing.invite-players-modal.edit-invite-link-title": {
"defaultMessage": "Edit invite link"
},
"sharing.invite-players-modal.expiry-label": {
"defaultMessage": "Expiry date"
},
"sharing.invite-players-modal.friends-heading": {
"defaultMessage": "Your friends - {count}"
},
"sharing.invite-players-modal.invite": {
"defaultMessage": "Invite"
},
"sharing.invite-players-modal.invite-expiry-description": {
"defaultMessage": "Your invite link expires in {duration}."
},
"sharing.invite-players-modal.invite-link-heading": {
"defaultMessage": "Or use an invite link"
},
"sharing.invite-players-modal.link-copied-text": {
"defaultMessage": "The invite link has been copied to your clipboard."
},
"sharing.invite-players-modal.link-copied-title": {
"defaultMessage": "Link copied"
},
"sharing.invite-players-modal.link-copy-failed-title": {
"defaultMessage": "Failed to copy link"
},
"sharing.invite-players-modal.max-uses-label": {
"defaultMessage": "Maximum uses"
},
"sharing.invite-players-modal.no-friends": {
"defaultMessage": "No friends found."
},
"sharing.invite-players-modal.no-search-results": {
"defaultMessage": "No matching users found."
},
"sharing.invite-players-modal.requested": {
"defaultMessage": "Request sent"
},
"sharing.invite-players-modal.requested-tooltip": {
"defaultMessage": "{username} needs to accept your friend request first"
},
"sharing.invite-players-modal.save-button": {
"defaultMessage": "Save"
},
"sharing.invite-players-modal.search-placeholder": {
"defaultMessage": "Enter Modrinth username"
},
"sharing.invite-players-modal.searching": {
"defaultMessage": "Searching..."
},
"sharing.invite-players-modal.update-invite-link-failed-title": {
"defaultMessage": "Failed to update invite link"
},
"tag.category.128x": {
"defaultMessage": "128x"
},