feat(instance-sync): screenshots sync (#7218)

* pnpm prepr

* feat(instance-sync): screenshots sync

* fix: prepr + fmt

* fix: qa

* feat: screenshit editor

* feat: screenshot* editor qa

* fix: qa

* fix: lint

* fix: aecsocket rev

* qa: a11y tab navigation focus is cut off

* qa: Change “Edited” badge to be bg-highlight-green

* qa: friends list input style wrong

* qa: toolbar width + labels

* qa: multiselect changes

* qa: anim changes

* qa: card hover colors

* qa: copy feedback

* qa: hide date

* qa: instance icon in overflow/contextmenu

* qa: spacing

* qa: group empty state text

* qa: drag preview badge

* qa: group deletion skip warning if no screenshots

* qa: redesign editor

* qa: remove screenshot parent/edited badge stuff

* qa: control font size consistency

* qa: viewer copy control

* qa: editor fixes

* qa: redirect on disable screenshot sync

* qa: margin police

* fix: crop

* fix: qa

* feat: initial start on basic instance file syncing (#7220)

* qa: final

* qa: final 2

* fix: lint + prepr

* fix: copy

* fix: screenshot editing outside of app causing ghost files in db + sync fail rollback impl

* chore: split up

* fix: fmt

---------

Co-authored-by: tdgao <mr.trumgao@gmail.com>
This commit is contained in:
Calum H.
2026-08-27 16:49:46 +00:00
committed by GitHub
co-authored by tdgao
parent 2bd108c278
commit 7c67cca7a7
217 changed files with 17139 additions and 1887 deletions
@@ -0,0 +1,123 @@
-- Global switches and defaults for each sync feature.
CREATE TABLE sync_feature_settings (
feature TEXT PRIMARY KEY NOT NULL,
globally_enabled INTEGER NOT NULL CHECK (globally_enabled IN (0, 1)),
new_instance_default INTEGER NOT NULL CHECK (new_instance_default IN (0, 1))
);
INSERT INTO sync_feature_settings
(feature, globally_enabled, new_instance_default)
VALUES
('command_history', 1, 1),
('multiplayer_servers', 1, 1),
('creative_hotbars', 1, 1),
('screenshots', 1, 1);
-- Each instance's switches for the sync features.
CREATE TABLE instance_sync_preferences (
instance_id TEXT NOT NULL,
feature TEXT NOT NULL,
enabled INTEGER NOT NULL CHECK (enabled IN (0, 1)),
PRIMARY KEY (instance_id, feature),
FOREIGN KEY (instance_id) REFERENCES instances (id)
ON DELETE CASCADE,
FOREIGN KEY (feature) REFERENCES sync_feature_settings (feature)
ON DELETE CASCADE
);
CREATE INDEX instance_sync_preferences_feature_enabled ON instance_sync_preferences (
feature,
enabled
);
-- Existing instances pre-update will have screenshots on, everything else off.
INSERT INTO instance_sync_preferences (instance_id, feature, enabled)
SELECT instances.id, features.feature, features.enabled
FROM
instances
CROSS JOIN (
SELECT 'command_history' AS feature, 0 AS enabled
UNION ALL
SELECT 'multiplayer_servers', 0
UNION ALL
SELECT 'creative_hotbars', 0
UNION ALL
SELECT 'screenshots', 1
) AS features;
-- The file each instance should have, and whether writing it finished.
-- For hotbars, merge_base is the last file we generated.
CREATE TABLE instance_sync_checkpoints (
instance_id TEXT NOT NULL,
feature TEXT NOT NULL,
variant TEXT NOT NULL CHECK (variant IN ('default', 'legacy', 'components')),
expected_sha1 TEXT NOT NULL,
merge_base BLOB,
source_revision INTEGER NOT NULL CHECK (source_revision >= 0),
status TEXT NOT NULL CHECK (status IN ('pending', 'ready')),
link_mode TEXT CHECK (link_mode IS NULL OR link_mode IN ('copy', 'hard', 'symbolic')),
PRIMARY KEY (instance_id, feature, variant),
FOREIGN KEY (instance_id, feature) REFERENCES instance_sync_preferences (instance_id, feature)
ON DELETE CASCADE
);
-- The shared hotbars. No row means they have not been set up yet.
CREATE TABLE synced_hotbar_state (
singleton INTEGER PRIMARY KEY NOT NULL CHECK (singleton = 1),
schema_version INTEGER NOT NULL CHECK (schema_version >= 1),
revision INTEGER NOT NULL CHECK (revision >= 0),
nbt BLOB NOT NULL
);
-- The shared server-list revision after server sync has been set up.
-- This row still exists when the shared server list is empty.
CREATE TABLE synced_server_state (
singleton INTEGER PRIMARY KEY NOT NULL CHECK (singleton = 1),
revision INTEGER NOT NULL CHECK (revision >= 0)
);
-- The shared multiplayer server list.
CREATE TABLE synced_servers (
id TEXT PRIMARY KEY NOT NULL,
position INTEGER NOT NULL UNIQUE CHECK (position >= 0),
nbt BLOB NOT NULL
);
-- Servers that only belong to one instance.
-- excluded_synced_server_id is the shared server replaced by a local copy.
CREATE TABLE instance_servers (
instance_id TEXT NOT NULL,
id TEXT NOT NULL,
source TEXT NOT NULL CHECK (source IN ('modpack', 'local_desynced')),
excluded_synced_server_id TEXT,
nbt BLOB NOT NULL,
position INTEGER NOT NULL CHECK (position >= 0),
PRIMARY KEY (instance_id, id),
UNIQUE (instance_id, position),
FOREIGN KEY (instance_id) REFERENCES instances (id)
ON DELETE CASCADE,
FOREIGN KEY (excluded_synced_server_id) REFERENCES synced_servers (id)
ON DELETE SET NULL
);
-- The servers.dat we last wrote for each instance.
-- Used to work out what changed the next time we read it.
CREATE TABLE instance_server_projection_entries (
instance_id TEXT NOT NULL,
owner TEXT NOT NULL CHECK (owner IN ('synced', 'instance')),
server_id TEXT NOT NULL,
nbt BLOB NOT NULL,
position INTEGER NOT NULL CHECK (position >= 0),
PRIMARY KEY (instance_id, owner, server_id),
UNIQUE (instance_id, position),
FOREIGN KEY (instance_id) REFERENCES instances (id)
ON DELETE CASCADE
);
-- Tracks whether we have read the modpack's server list for this instance.
CREATE TABLE instance_server_pack_state (
instance_id TEXT PRIMARY KEY NOT NULL,
version_id TEXT,
FOREIGN KEY (instance_id) REFERENCES instances (id)
ON DELETE CASCADE
);