Client side atproto account migrator in your web browser, along with services for backups and adversarial migrations. pdsmoover.com
pds atproto migrations moo cow

some small qol

authored by baileytownsend.dev and committed by tangled.org 7254b408 515c34ff

+336 -269
+1 -1
.oxlintrc.json
··· 1 1 { 2 2 "$schema": "https://unpkg.com/oxlint/configuration_schema.json", 3 - "plugins": ["unicorn", "typescript", "oxc", "vue", "vitest"], 3 + "plugins": ["unicorn", "typescript", "oxc"], 4 4 "jsPlugins": ["@e18e/eslint-plugin", "eslint-plugin-regexp"], 5 5 "categories": { 6 6 "correctness": "error",
+65 -45
packages/moover/lib/pdsmoover.js
··· 32 32 this.migratePrefs = true 33 33 /** @type {boolean} */ 34 34 this.migratePlcRecord = true 35 + /** 36 + * How many blobs have been uploaded to the new PDS in the current step 37 + @type {number} */ 38 + this.uploadedBlobsCount = 0 39 + } 40 + 41 + /** 42 + * Uploads blobs to the new PDS 43 + * @param {AtpAgent} oldAgent 44 + * @param {AtpAgent} newAgent 45 + * @param {string} usersDid 46 + * @param {[string]} cids 47 + * @param {number} totalBlobs 48 + * @param {function|null} statusUpdateHandler 49 + */ 50 + async uploadBlobs(oldAgent, newAgent, usersDid, cids, totalBlobs, statusUpdateHandler) { 51 + console.log('uploading blobs', cids) 52 + for (const cid of cids) { 53 + try { 54 + const blobRes = await oldAgent.com.atproto.sync.getBlob({ 55 + did: usersDid, 56 + cid, 57 + }) 58 + await newAgent.com.atproto.repo.uploadBlob(blobRes.data, { 59 + encoding: blobRes.headers['content-type'], 60 + }) 61 + this.uploadedBlobsCount++ 62 + if (this.uploadedBlobsCount % 10 === 0) { 63 + safeStatusUpdate( 64 + statusUpdateHandler, 65 + `Migrating blobs: ${this.uploadedBlobsCount}/${totalBlobs}`, 66 + ) 67 + } 68 + } catch (error) { 69 + console.error(error) 70 + } 71 + } 35 72 } 36 73 37 74 /** ··· 61 98 twoFactorCode = null, 62 99 verificationCode = null, 63 100 ) { 64 - //Leaving this logic that either sets the agent to bsky.social, or the PDS since it's what I found worked best for migrations. 65 - // handleAndPDSResolver should be able to handle it, but there have been edge cases and this was what worked best 66 101 oldHandle = cleanHandle(oldHandle) 67 102 let oldAgent 68 103 let usersDid ··· 143 178 } catch (error) { 144 179 // Ideally should catch if the repo already exists, and if so silently log it and move along to the next step 145 180 if (error?.error === 'AlreadyExists') { 181 + // Sets the migrate blobs flag to false so it moves on to just migrate missing blobs in the event of a retry 182 + this.migrateBlobs = false 146 183 console.log('Repo already exists, logging in') 147 184 } else { 148 185 // Catches any other error and stops the migration process ··· 186 223 limit: 100, 187 224 }) 188 225 189 - for (const cid of listedBlobs.data.cids) { 190 - try { 191 - const blobRes = await oldAgent.com.atproto.sync.getBlob({ 192 - did: usersDid, 193 - cid, 194 - }) 195 - await newAgent.com.atproto.repo.uploadBlob(blobRes.data, { 196 - encoding: blobRes.headers['content-type'], 197 - }) 198 - uploadedBlobs++ 199 - if (uploadedBlobs % 10 === 0) { 200 - safeStatusUpdate( 201 - statusUpdateHandler, 202 - `Migrating blobs: ${uploadedBlobs}/${newAccountStatus.data.expectedBlobs}`, 203 - ) 204 - } 205 - } catch (error) { 206 - console.error(error) 207 - } 208 - } 226 + await this.uploadBlobs( 227 + oldAgent, 228 + newAgent, 229 + usersDid, 230 + listedBlobs.data.cids, 231 + newAccountStatus.data.expectedBlobs, 232 + statusUpdateHandler, 233 + ) 209 234 blobCursor = listedBlobs.data.cursor 210 235 } while (blobCursor) 236 + // Resets since this is a shared state with missing blobs job 237 + this.uploadedBlobsCount = 0 211 238 } 212 239 213 240 if (this.migrateMissingBlobs) { ··· 233 260 limit: 100, 234 261 }) 235 262 236 - for (const recordBlob of missingBlobs.data.blobs) { 237 - try { 238 - const blobRes = await oldAgent.com.atproto.sync.getBlob({ 239 - did: usersDid, 240 - cid: recordBlob.cid, 241 - }) 242 - await newAgent.com.atproto.repo.uploadBlob(blobRes.data, { 243 - encoding: blobRes.headers['content-type'], 244 - }) 245 - if (missingUploadedBlobs % 10 === 0) { 246 - safeStatusUpdate( 247 - statusUpdateHandler, 248 - `Migrating blobs: ${missingUploadedBlobs}/${totalMissingBlobs}`, 249 - ) 250 - } 251 - missingUploadedBlobs++ 252 - } catch (error) { 253 - //TODO silently logging prob should list them so user can manually download 254 - console.error(error) 255 - this.missingBlobs.push(recordBlob.cid) 256 - } 257 - } 263 + let missingCids = missingBlobs.data.blobs.map(blob => blob.cid) 264 + await this.uploadBlobs( 265 + oldAgent, 266 + newAgent, 267 + usersDid, 268 + missingCids, 269 + totalMissingBlobs, 270 + statusUpdateHandler, 271 + ) 272 + 258 273 missingBlobCursor = missingBlobs.data.cursor 259 274 } while (missingBlobCursor) 275 + // Resets since this is a shared state with the migrate blobs job 276 + this.uploadedBlobsCount = 0 260 277 } 261 278 } 262 279 if (this.migratePrefs) { ··· 269 286 270 287 if (this.migratePlcRecord) { 271 288 await oldAgent.com.atproto.identity.requestPlcOperationSignature() 272 - safeStatusUpdate(statusUpdateHandler, 'Please check your email for a PLC token') 289 + safeStatusUpdate( 290 + statusUpdateHandler, 291 + 'Please check your email attached to your previous account for a PLC token', 292 + ) 273 293 } 274 294 } 275 295
+2 -2
packages/moover/package.json
··· 34 34 "scripts": { 35 35 "dev": "vite", 36 36 "build": "vite build", 37 + "build:watch": "vite build --watch", 37 38 "gen:types": "tsc -p .", 38 - "preview": "vite preview", 39 - "generate:lexicons": "lex build --lexicons lexicons --out lib/lexicons --clear" 39 + "preview": "vite preview" 40 40 }, 41 41 "devDependencies": { 42 42 "eslint": "^9.34.0",
+2 -1
web-ui/package.json
··· 17 17 "@atcute/client": "^4.0.5", 18 18 "@atcute/lexicons": "^1.2.2", 19 19 "@pds-moover/lexicons": "^1.0.1", 20 - "@pds-moover/moover": "^1.0.6" 20 + "@pds-moover/moover": "link:../packages/moover" 21 21 }, 22 22 "devDependencies": { 23 23 "@eslint/compat": "^1.4.0", ··· 30 30 "eslint": "^9.36.0", 31 31 "eslint-plugin-svelte": "^3.12.4", 32 32 "globals": "^16.4.0", 33 + "oxlint": "^1.48.0", 33 34 "svelte": "^5.39.5", 34 35 "svelte-check": "^4.3.2", 35 36 "typescript": "^5.9.2",
+208 -189
web-ui/pnpm-lock.yaml
··· 21 21 specifier: ^1.0.1 22 22 version: 1.0.1 23 23 '@pds-moover/moover': 24 - specifier: ^1.0.6 25 - version: 1.0.6(@atcute/identity@1.1.1)(vite@7.1.12(@types/node@22.19.0)) 24 + specifier: link:../packages/moover 25 + version: link:../packages/moover 26 26 devDependencies: 27 27 '@eslint/compat': 28 28 specifier: ^1.4.0 ··· 54 54 globals: 55 55 specifier: ^16.4.0 56 56 version: 16.5.0 57 + oxlint: 58 + specifier: ^1.48.0 59 + version: 1.48.0 57 60 svelte: 58 61 specifier: ^5.39.5 59 62 version: 5.43.2 ··· 79 82 '@atcute/atproto@3.1.9': 80 83 resolution: {integrity: sha512-DyWwHCTdR4hY2BPNbLXgVmm7lI+fceOwWbE4LXbGvbvVtSn+ejSVFaAv01Ra3kWDha0whsOmbJL8JP0QPpf1+w==} 81 84 82 - '@atcute/cbor@2.3.2': 83 - resolution: {integrity: sha512-xP2SORSau/VVI00x2V4BjwIkHr6EQ7l/MXEOPaa4LGYtePFc4gnD4L1yN10dT5NEuUnvGEuCh6arLB7gz1smVQ==} 84 - 85 - '@atcute/cid@2.4.1': 86 - resolution: {integrity: sha512-bwhna69RCv7yetXudtj+2qrMPYvhhIQqvJz6YUpUS98v7OdF3X2dnye9Nig2NDrklZcuyOsu7sQo7GOykJXRLQ==} 87 - 88 85 '@atcute/client@4.0.5': 89 86 resolution: {integrity: sha512-R8Qen8goGmEkynYGg2m6XFlVmz0GTDvQ+9w+4QqOob+XMk8/WDpF4aImev7WKEde/rV2gjcqW7zM8E6W9NShDA==} 90 87 91 - '@atcute/crypto@2.3.0': 92 - resolution: {integrity: sha512-w5pkJKCjbNMQu+F4JRHbR3ROQyhi1wbn+GSC6WDQamcYHkZmEZk1/eoI354bIQOOfkEM6aFLv718iskrkon4GQ==} 93 - 94 - '@atcute/did-plc@0.1.7': 95 - resolution: {integrity: sha512-a7yOQNqViae3rB5/xa3U0EPJbFD9l8zOHXx6XASZ5F8+Vy2uTgXK3omurpNZ5UxRpy1ni1AMhSohXr61cqWbkg==} 96 - 97 - '@atcute/identity-resolver@1.2.2': 98 - resolution: {integrity: sha512-eUh/UH4bFvuXS0X7epYCeJC/kj4rbBXfSRumLEH4smMVwNOgTo7cL/0Srty+P/qVPoZEyXdfEbS0PHJyzoXmHw==} 99 - peerDependencies: 100 - '@atcute/identity': ^1.0.0 101 - 102 88 '@atcute/identity@1.1.1': 103 89 resolution: {integrity: sha512-zax42n693VEhnC+5tndvO2KLDTMkHOz8UExwmklvJv7R9VujfEwiSWhcv6Jgwb3ellaG8wjiQ1lMOIjLLvwh0Q==} 104 90 105 91 '@atcute/lexicons@1.2.2': 106 92 resolution: {integrity: sha512-bgEhJq5Z70/0TbK5sx+tAkrR8FsCODNiL2gUEvS5PuJfPxmFmRYNWaMGehxSPaXWpU2+Oa9ckceHiYbrItDTkA==} 107 - 108 - '@atcute/lexicons@1.2.9': 109 - resolution: {integrity: sha512-/RRHm2Cw9o8Mcsrq0eo8fjS9okKYLGfuFwrQ0YoP/6sdSDsXshaTLJsvLlcUcaDaSJ1YFOuHIo3zr2Om2F/16g==} 110 - 111 - '@atcute/multibase@1.1.8': 112 - resolution: {integrity: sha512-pJgtImMZKCjqwRbu+2GzB+4xQjKBXDwdZOzeqe0u97zYKRGftpGYGvYv3+pMe2xXe+msDyu7Nv8iJp+U14otTA==} 113 - 114 - '@atcute/uint8array@1.1.1': 115 - resolution: {integrity: sha512-3LsC8XB8TKe9q/5hOA5sFuzGaIFdJZJNewC5OKa3o/eU6+K7JR6see9Zy2JbQERNVnRl11EzbNov1efgLMAs4g==} 116 - 117 - '@atcute/util-fetch@1.0.5': 118 - resolution: {integrity: sha512-qjHj01BGxjSjIFdPiAjSARnodJIIyKxnCMMEcXMESo9TAyND6XZQqrie5fia+LlYWVXdpsTds8uFQwc9jdKTig==} 119 - 120 - '@atcute/util-text@1.1.1': 121 - resolution: {integrity: sha512-JH0SxzUQJAmbOBTYyhxQbkkI6M33YpjlVLEcbP5GYt43xgFArzV0FJVmEpvIj0kjsmphHB45b6IitdvxPdec9w==} 122 - 123 - '@atproto/api@0.16.11': 124 - resolution: {integrity: sha512-1dhfQNHiclb102RW+Ea8Nft5olfqU0Ev/vlQaSX6mWNo1aP5zT+sPODJ8+BTUOYk3vcuvL7QMkqA/rLYy2PMyw==} 125 93 126 94 '@atproto/common-web@0.4.3': 127 95 resolution: {integrity: sha512-nRDINmSe4VycJzPo6fP/hEltBcULFxt9Kw7fQk6405FyAWZiTluYHlXOnU7GkQfeUK44OENG1qFTBcmCJ7e8pg==} ··· 374 342 '@jridgewell/trace-mapping@0.3.31': 375 343 resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} 376 344 377 - '@noble/secp256k1@3.0.0': 378 - resolution: {integrity: sha512-NJBaR352KyIvj3t6sgT/+7xrNyF9Xk9QlLSIqUGVUYlsnDTAUqY8LOmwpcgEx4AMJXRITQ5XEVHD+mMaPfr3mg==} 379 - 380 345 '@nodelib/fs.scandir@2.1.5': 381 346 resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 382 347 engines: {node: '>= 8'} ··· 389 354 resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 390 355 engines: {node: '>= 8'} 391 356 357 + '@oxlint/binding-android-arm-eabi@1.48.0': 358 + resolution: {integrity: sha512-1Pz/stJvveO9ZO7ll4ZoEY3f6j2FiUgBLBcCRCiW6ylId9L9UKs+gn3X28m3eTnoiFCkhKwmJJ+VO6vwsu7Qtg==} 359 + engines: {node: ^20.19.0 || >=22.12.0} 360 + cpu: [arm] 361 + os: [android] 362 + 363 + '@oxlint/binding-android-arm64@1.48.0': 364 + resolution: {integrity: sha512-Zc42RWGE8huo6Ht0lXKjd0NH2lWNmimQHUmD0JFcvShLOuwN+RSEE/kRakc2/0LIgOUuU/R7PaDMCOdQlPgNUQ==} 365 + engines: {node: ^20.19.0 || >=22.12.0} 366 + cpu: [arm64] 367 + os: [android] 368 + 369 + '@oxlint/binding-darwin-arm64@1.48.0': 370 + resolution: {integrity: sha512-jgZs563/4vaG5jH2RSt2TSh8A2jwsFdmhLXrElMdm3Mmto0HPf85FgInLSNi9HcwzQFvkYV8JofcoUg2GH1HTA==} 371 + engines: {node: ^20.19.0 || >=22.12.0} 372 + cpu: [arm64] 373 + os: [darwin] 374 + 375 + '@oxlint/binding-darwin-x64@1.48.0': 376 + resolution: {integrity: sha512-kvo87BujEUjCJREuWDC4aPh1WoXCRFFWE4C7uF6wuoMw2f6N2hypA/cHHcYn9DdL8R2RrgUZPefC8JExyeIMKA==} 377 + engines: {node: ^20.19.0 || >=22.12.0} 378 + cpu: [x64] 379 + os: [darwin] 380 + 381 + '@oxlint/binding-freebsd-x64@1.48.0': 382 + resolution: {integrity: sha512-eyzzPaHQKn0RIM+ueDfgfJF2RU//Wp4oaKs2JVoVYcM5HjbCL36+O0S3wO5Xe1NWpcZIG3cEHc/SuOCDRqZDSg==} 383 + engines: {node: ^20.19.0 || >=22.12.0} 384 + cpu: [x64] 385 + os: [freebsd] 386 + 387 + '@oxlint/binding-linux-arm-gnueabihf@1.48.0': 388 + resolution: {integrity: sha512-p3kSloztK7GRO7FyO3u38UCjZxQTl92VaLDsMQAq0eGoiNmeeEF1KPeE4+Fr+LSkQhF8WvJKSuls6TwOlurdPA==} 389 + engines: {node: ^20.19.0 || >=22.12.0} 390 + cpu: [arm] 391 + os: [linux] 392 + 393 + '@oxlint/binding-linux-arm-musleabihf@1.48.0': 394 + resolution: {integrity: sha512-uWM+wiTqLW/V0ZmY/eyTWs8ykhIkzU+K2tz/8m35YepYEzohiUGRbnkpAFXj2ioXpQL+GUe5vmM3SLH6ozlfFw==} 395 + engines: {node: ^20.19.0 || >=22.12.0} 396 + cpu: [arm] 397 + os: [linux] 398 + 399 + '@oxlint/binding-linux-arm64-gnu@1.48.0': 400 + resolution: {integrity: sha512-OhQNPjs/OICaYqxYJjKKMaIY7p3nJ9IirXcFoHKD+CQE1BZFCeUUAknMzUeLclDCfudH9Vb/UgjFm8+ZM5puAg==} 401 + engines: {node: ^20.19.0 || >=22.12.0} 402 + cpu: [arm64] 403 + os: [linux] 404 + 405 + '@oxlint/binding-linux-arm64-musl@1.48.0': 406 + resolution: {integrity: sha512-adu5txuwGvQ4C4fjYHJD+vnY+OCwCixBzn7J3KF3iWlVHBBImcosSv+Ye+fbMMJui4HGjifNXzonjKm9pXmOiw==} 407 + engines: {node: ^20.19.0 || >=22.12.0} 408 + cpu: [arm64] 409 + os: [linux] 410 + 411 + '@oxlint/binding-linux-ppc64-gnu@1.48.0': 412 + resolution: {integrity: sha512-inlQQRUnHCny/7b7wA6NjEoJSSZPNea4qnDhWyeqBYWx8ukf2kzNDSiamfhOw6bfAYPm/PVlkVRYaNXQbkLeTQ==} 413 + engines: {node: ^20.19.0 || >=22.12.0} 414 + cpu: [ppc64] 415 + os: [linux] 416 + 417 + '@oxlint/binding-linux-riscv64-gnu@1.48.0': 418 + resolution: {integrity: sha512-YiJx6sW6bYebQDZRVWLKm/Drswx/hcjIgbLIhULSn0rRcBKc7d9V6mkqPjKDbhcxJgQD5Zi0yVccJiOdF40AWA==} 419 + engines: {node: ^20.19.0 || >=22.12.0} 420 + cpu: [riscv64] 421 + os: [linux] 422 + 423 + '@oxlint/binding-linux-riscv64-musl@1.48.0': 424 + resolution: {integrity: sha512-zwSqxMgmb2ITamNfDv9Q9EKBc/4ZhCBP9gkg2hhcgR6sEVGPUDl1AKPC89CBKMxkmPUi3685C38EvqtZn5OtHw==} 425 + engines: {node: ^20.19.0 || >=22.12.0} 426 + cpu: [riscv64] 427 + os: [linux] 428 + 429 + '@oxlint/binding-linux-s390x-gnu@1.48.0': 430 + resolution: {integrity: sha512-c/+2oUWAOsQB5JTem0rW8ODlZllF6pAtGSGXoLSvPTonKI1vAwaKhD9Qw1X36jRbcI3Etkpu/9z/RRjMba8vFQ==} 431 + engines: {node: ^20.19.0 || >=22.12.0} 432 + cpu: [s390x] 433 + os: [linux] 434 + 435 + '@oxlint/binding-linux-x64-gnu@1.48.0': 436 + resolution: {integrity: sha512-PhauDqeFW5DGed6QxCY5lXZYKSlcBdCXJnH03ZNU6QmDZ0BFM/zSy1oPT2MNb1Afx1G6yOOVk8ErjWsQ7c59ng==} 437 + engines: {node: ^20.19.0 || >=22.12.0} 438 + cpu: [x64] 439 + os: [linux] 440 + 441 + '@oxlint/binding-linux-x64-musl@1.48.0': 442 + resolution: {integrity: sha512-6d7LIFFZGiavbHndhf1cK9kG9qmy2Dmr37sV9Ep7j3H+ciFdKSuOzdLh85mEUYMih+b+esMDlF5DU0WQRZPQjw==} 443 + engines: {node: ^20.19.0 || >=22.12.0} 444 + cpu: [x64] 445 + os: [linux] 446 + 447 + '@oxlint/binding-openharmony-arm64@1.48.0': 448 + resolution: {integrity: sha512-r+0KK9lK6vFp3tXAgDMOW32o12dxvKS3B9La1uYMGdWAMoSeu2RzG34KmzSpXu6MyLDl4aSVyZLFM8KGdEjwaw==} 449 + engines: {node: ^20.19.0 || >=22.12.0} 450 + cpu: [arm64] 451 + os: [openharmony] 452 + 453 + '@oxlint/binding-win32-arm64-msvc@1.48.0': 454 + resolution: {integrity: sha512-Nkw/MocyT3HSp0OJsKPXrcbxZqSPMTYnLLfsqsoiFKoL1ppVNL65MFa7vuTxJehPlBkjy+95gUgacZtuNMECrg==} 455 + engines: {node: ^20.19.0 || >=22.12.0} 456 + cpu: [arm64] 457 + os: [win32] 458 + 459 + '@oxlint/binding-win32-ia32-msvc@1.48.0': 460 + resolution: {integrity: sha512-reO1SpefvRmeZSP+WeyWkQd1ArxxDD1MyKgMUKuB8lNuUoxk9QEohYtKnsfsxJuFwMT0JTr7p9wZjouA85GzGQ==} 461 + engines: {node: ^20.19.0 || >=22.12.0} 462 + cpu: [ia32] 463 + os: [win32] 464 + 465 + '@oxlint/binding-win32-x64-msvc@1.48.0': 466 + resolution: {integrity: sha512-T6zwhfcsrorqAybkOglZdPkTLlEwipbtdO1qjE+flbawvwOMsISoyiuaa7vM7zEyfq1hmDvMq1ndvkYFioranA==} 467 + engines: {node: ^20.19.0 || >=22.12.0} 468 + cpu: [x64] 469 + os: [win32] 470 + 392 471 '@pds-moover/lexicons@1.0.1': 393 472 resolution: {integrity: sha512-fv5b/DtHM7FEo/JklyF9gdK0ainlb6mWjWrBe6cmSAeg9G/4O2jBlQUOqfOAICY9gOcrCpkOrk9PHgGw//JQ2A==} 394 - 395 - '@pds-moover/moover@1.0.6': 396 - resolution: {integrity: sha512-Zy+wcrZwoyne7NhuG+5MDFoJ+lpteCpfS6w2pmma9F2IKrVTj2G3Pca7ZVDaibGmCMTJMo21XYaPg+9nLXFD4Q==} 397 473 398 474 '@polka/url@1.0.0-next.29': 399 475 resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} ··· 547 623 '@standard-schema/spec@1.0.0': 548 624 resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} 549 625 550 - '@standard-schema/spec@1.1.0': 551 - resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} 552 - 553 626 '@sveltejs/acorn-typescript@1.0.6': 554 627 resolution: {integrity: sha512-4awhxtMh4cx9blePWl10HRHj8Iivtqj+2QdDCSMDzxG+XKa9+VCNupQuCuvzEhYPzZSrX+0gC+0lHA/0fFKKQQ==} 555 628 peerDependencies: ··· 667 740 resolution: {integrity: sha512-uk574k8IU0rOF/AjniX8qbLSGURJVUCeM5e4MIMKBFFi8weeiLrG1fyQejyLXQpRZbU/1BuQasleV/RfHC3hHg==} 668 741 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 669 742 670 - '@vue/reactivity@3.1.5': 671 - resolution: {integrity: sha512-1tdfLmNjWG6t/CsPldh+foumYFo3cpyCHgBYQ34ylaMsJ+SNHQ1kApMIa8jN+i593zQuaw3AdWH0nJTARzCFhg==} 672 - 673 - '@vue/shared@3.1.5': 674 - resolution: {integrity: sha512-oJ4F3TnvpXaQwZJNF3ZK+kLPHKarDmJjJ6jyzVNDKH9md1dptjC7lWR//jrGuLdek/U6iltWxqAnYOu8gCiOvA==} 675 - 676 743 acorn-jsx@5.3.2: 677 744 resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 678 745 peerDependencies: ··· 686 753 ajv@6.12.6: 687 754 resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 688 755 689 - alpinejs@3.15.8: 690 - resolution: {integrity: sha512-zxIfCRTBGvF1CCLIOMQOxAyBuqibxSEwS6Jm1a3HGA9rgrJVcjEWlwLcQTVGAWGS8YhAsTRLVrtQ5a5QT9bSSQ==} 691 - 692 756 ansi-styles@4.3.0: 693 757 resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 694 758 engines: {node: '>=8'} ··· 700 764 resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} 701 765 engines: {node: '>= 0.4'} 702 766 703 - await-lock@2.2.2: 704 - resolution: {integrity: sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==} 705 - 706 767 axobject-query@4.1.0: 707 768 resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} 708 769 engines: {node: '>= 0.4'} ··· 1062 1123 resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} 1063 1124 engines: {node: '>= 0.8.0'} 1064 1125 1126 + oxlint@1.48.0: 1127 + resolution: {integrity: sha512-m5vyVBgPtPhVCJc3xI//8je9lRc8bYuYB4R/1PH3VPGOjA4vjVhkHtyJukdEjYEjwrw4Qf1eIf+pP9xvfhfMow==} 1128 + engines: {node: ^20.19.0 || >=22.12.0} 1129 + hasBin: true 1130 + peerDependencies: 1131 + oxlint-tsgolint: '>=0.12.2' 1132 + peerDependenciesMeta: 1133 + oxlint-tsgolint: 1134 + optional: true 1135 + 1065 1136 p-limit@3.1.0: 1066 1137 resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 1067 1138 engines: {node: '>=10'} ··· 1229 1300 resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} 1230 1301 engines: {node: '>=12.0.0'} 1231 1302 1232 - tlds@1.261.0: 1233 - resolution: {integrity: sha512-QXqwfEl9ddlGBaRFXIvNKK6OhipSiLXuRuLJX5DErz0o0Q0rYxulWLdFryTkV5PkdZct5iMInwYEGe/eR++1AA==} 1234 - hasBin: true 1235 - 1236 1303 to-regex-range@5.0.1: 1237 1304 resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1238 1305 engines: {node: '>=8.0'} ··· 1269 1336 undici-types@6.21.0: 1270 1337 resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} 1271 1338 1272 - unicode-segmenter@0.14.5: 1273 - resolution: {integrity: sha512-jHGmj2LUuqDcX3hqY12Ql+uhUTn8huuxNZGq7GvtF6bSybzH3aFgedYu/KTzQStEgt1Ra2F3HxadNXsNjb3m3g==} 1274 - 1275 1339 uri-js@4.4.1: 1276 1340 resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1277 1341 1278 1342 util-deprecate@1.0.2: 1279 1343 resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 1280 1344 1281 - vite-plugin-full-reload@1.2.0: 1282 - resolution: {integrity: sha512-kz18NW79x0IHbxRSHm0jttP4zoO9P9gXh+n6UTwlNKnviTTEpOlum6oS9SmecrTtSr+muHEn5TUuC75UovQzcA==} 1283 - 1284 - vite-rs-plugin@1.0.1: 1285 - resolution: {integrity: sha512-YhgflKQIRzuS5x66J3yICoVLH25D2fNU+jThK8tpYl/jGrXeIKT4w5VH1lkLPRC0SjK2ZCm9S6K9Z2ZFVDHjPQ==} 1286 - hasBin: true 1287 - peerDependencies: 1288 - vite: ^5.0.0 1289 - 1290 1345 vite@7.1.12: 1291 1346 resolution: {integrity: sha512-ZWyE8YXEXqJrrSLvYgrRP7p62OziLW7xI5HYGWFzOvupfAlrLvURSzv/FyGyy0eidogEM3ujU+kUG1zuHgb6Ug==} 1292 1347 engines: {node: ^20.19.0 || >=22.12.0} ··· 1364 1419 dependencies: 1365 1420 '@atcute/lexicons': 1.2.2 1366 1421 1367 - '@atcute/cbor@2.3.2': 1368 - dependencies: 1369 - '@atcute/cid': 2.4.1 1370 - '@atcute/multibase': 1.1.8 1371 - '@atcute/uint8array': 1.1.1 1372 - 1373 - '@atcute/cid@2.4.1': 1374 - dependencies: 1375 - '@atcute/multibase': 1.1.8 1376 - '@atcute/uint8array': 1.1.1 1377 - 1378 1422 '@atcute/client@4.0.5': 1379 1423 dependencies: 1380 1424 '@atcute/identity': 1.1.1 1381 1425 '@atcute/lexicons': 1.2.2 1382 1426 1383 - '@atcute/crypto@2.3.0': 1384 - dependencies: 1385 - '@atcute/multibase': 1.1.8 1386 - '@atcute/uint8array': 1.1.1 1387 - '@noble/secp256k1': 3.0.0 1388 - 1389 - '@atcute/did-plc@0.1.7': 1390 - dependencies: 1391 - '@atcute/cbor': 2.3.2 1392 - '@atcute/cid': 2.4.1 1393 - '@atcute/crypto': 2.3.0 1394 - '@atcute/identity': 1.1.1 1395 - '@atcute/lexicons': 1.2.2 1396 - '@atcute/multibase': 1.1.8 1397 - '@atcute/uint8array': 1.1.1 1398 - '@badrap/valita': 0.4.6 1399 - 1400 - '@atcute/identity-resolver@1.2.2(@atcute/identity@1.1.1)': 1401 - dependencies: 1402 - '@atcute/identity': 1.1.1 1403 - '@atcute/lexicons': 1.2.9 1404 - '@atcute/util-fetch': 1.0.5 1405 - '@badrap/valita': 0.4.6 1406 - 1407 1427 '@atcute/identity@1.1.1': 1408 1428 dependencies: 1409 1429 '@atcute/lexicons': 1.2.2 ··· 1413 1433 dependencies: 1414 1434 '@standard-schema/spec': 1.0.0 1415 1435 esm-env: 1.2.2 1416 - 1417 - '@atcute/lexicons@1.2.9': 1418 - dependencies: 1419 - '@atcute/uint8array': 1.1.1 1420 - '@atcute/util-text': 1.1.1 1421 - '@standard-schema/spec': 1.1.0 1422 - esm-env: 1.2.2 1423 - 1424 - '@atcute/multibase@1.1.8': 1425 - dependencies: 1426 - '@atcute/uint8array': 1.1.1 1427 - 1428 - '@atcute/uint8array@1.1.1': {} 1429 - 1430 - '@atcute/util-fetch@1.0.5': 1431 - dependencies: 1432 - '@badrap/valita': 0.4.6 1433 - 1434 - '@atcute/util-text@1.1.1': 1435 - dependencies: 1436 - unicode-segmenter: 0.14.5 1437 - 1438 - '@atproto/api@0.16.11': 1439 - dependencies: 1440 - '@atproto/common-web': 0.4.3 1441 - '@atproto/lexicon': 0.5.1 1442 - '@atproto/syntax': 0.4.1 1443 - '@atproto/xrpc': 0.7.5 1444 - await-lock: 2.2.2 1445 - multiformats: 9.9.0 1446 - tlds: 1.261.0 1447 - zod: 3.25.76 1448 1436 1449 1437 '@atproto/common-web@0.4.3': 1450 1438 dependencies: ··· 1630 1618 '@jridgewell/resolve-uri': 3.1.2 1631 1619 '@jridgewell/sourcemap-codec': 1.5.5 1632 1620 1633 - '@noble/secp256k1@3.0.0': {} 1634 - 1635 1621 '@nodelib/fs.scandir@2.1.5': 1636 1622 dependencies: 1637 1623 '@nodelib/fs.stat': 2.0.5 ··· 1644 1630 '@nodelib/fs.scandir': 2.1.5 1645 1631 fastq: 1.19.1 1646 1632 1633 + '@oxlint/binding-android-arm-eabi@1.48.0': 1634 + optional: true 1635 + 1636 + '@oxlint/binding-android-arm64@1.48.0': 1637 + optional: true 1638 + 1639 + '@oxlint/binding-darwin-arm64@1.48.0': 1640 + optional: true 1641 + 1642 + '@oxlint/binding-darwin-x64@1.48.0': 1643 + optional: true 1644 + 1645 + '@oxlint/binding-freebsd-x64@1.48.0': 1646 + optional: true 1647 + 1648 + '@oxlint/binding-linux-arm-gnueabihf@1.48.0': 1649 + optional: true 1650 + 1651 + '@oxlint/binding-linux-arm-musleabihf@1.48.0': 1652 + optional: true 1653 + 1654 + '@oxlint/binding-linux-arm64-gnu@1.48.0': 1655 + optional: true 1656 + 1657 + '@oxlint/binding-linux-arm64-musl@1.48.0': 1658 + optional: true 1659 + 1660 + '@oxlint/binding-linux-ppc64-gnu@1.48.0': 1661 + optional: true 1662 + 1663 + '@oxlint/binding-linux-riscv64-gnu@1.48.0': 1664 + optional: true 1665 + 1666 + '@oxlint/binding-linux-riscv64-musl@1.48.0': 1667 + optional: true 1668 + 1669 + '@oxlint/binding-linux-s390x-gnu@1.48.0': 1670 + optional: true 1671 + 1672 + '@oxlint/binding-linux-x64-gnu@1.48.0': 1673 + optional: true 1674 + 1675 + '@oxlint/binding-linux-x64-musl@1.48.0': 1676 + optional: true 1677 + 1678 + '@oxlint/binding-openharmony-arm64@1.48.0': 1679 + optional: true 1680 + 1681 + '@oxlint/binding-win32-arm64-msvc@1.48.0': 1682 + optional: true 1683 + 1684 + '@oxlint/binding-win32-ia32-msvc@1.48.0': 1685 + optional: true 1686 + 1687 + '@oxlint/binding-win32-x64-msvc@1.48.0': 1688 + optional: true 1689 + 1647 1690 '@pds-moover/lexicons@1.0.1': 1648 1691 dependencies: 1649 1692 '@atproto/lexicon': 0.5.1 1650 1693 '@atproto/xrpc': 0.7.5 1651 - 1652 - '@pds-moover/moover@1.0.6(@atcute/identity@1.1.1)(vite@7.1.12(@types/node@22.19.0))': 1653 - dependencies: 1654 - '@atcute/cbor': 2.3.2 1655 - '@atcute/client': 4.0.5 1656 - '@atcute/crypto': 2.3.0 1657 - '@atcute/did-plc': 0.1.7 1658 - '@atcute/identity-resolver': 1.2.2(@atcute/identity@1.1.1) 1659 - '@atcute/lexicons': 1.2.2 1660 - '@atcute/multibase': 1.1.8 1661 - '@atproto/api': 0.16.11 1662 - '@pds-moover/lexicons': 1.0.1 1663 - alpinejs: 3.15.8 1664 - vite-plugin-full-reload: 1.2.0 1665 - vite-rs-plugin: 1.0.1(vite@7.1.12(@types/node@22.19.0)) 1666 - transitivePeerDependencies: 1667 - - '@atcute/identity' 1668 - - vite 1669 1694 1670 1695 '@polka/url@1.0.0-next.29': {} 1671 1696 ··· 1773 1798 1774 1799 '@standard-schema/spec@1.0.0': {} 1775 1800 1776 - '@standard-schema/spec@1.1.0': {} 1777 - 1778 1801 '@sveltejs/acorn-typescript@1.0.6(acorn@8.15.0)': 1779 1802 dependencies: 1780 1803 acorn: 8.15.0 ··· 1936 1959 '@typescript-eslint/types': 8.46.3 1937 1960 eslint-visitor-keys: 4.2.1 1938 1961 1939 - '@vue/reactivity@3.1.5': 1940 - dependencies: 1941 - '@vue/shared': 3.1.5 1942 - 1943 - '@vue/shared@3.1.5': {} 1944 - 1945 1962 acorn-jsx@5.3.2(acorn@8.15.0): 1946 1963 dependencies: 1947 1964 acorn: 8.15.0 ··· 1955 1972 json-schema-traverse: 0.4.1 1956 1973 uri-js: 4.4.1 1957 1974 1958 - alpinejs@3.15.8: 1959 - dependencies: 1960 - '@vue/reactivity': 3.1.5 1961 - 1962 1975 ansi-styles@4.3.0: 1963 1976 dependencies: 1964 1977 color-convert: 2.0.1 ··· 1966 1979 argparse@2.0.1: {} 1967 1980 1968 1981 aria-query@5.3.2: {} 1969 - 1970 - await-lock@2.2.2: {} 1971 1982 1972 1983 axobject-query@4.1.0: {} 1973 1984 ··· 2329 2340 type-check: 0.4.0 2330 2341 word-wrap: 1.2.5 2331 2342 2343 + oxlint@1.48.0: 2344 + optionalDependencies: 2345 + '@oxlint/binding-android-arm-eabi': 1.48.0 2346 + '@oxlint/binding-android-arm64': 1.48.0 2347 + '@oxlint/binding-darwin-arm64': 1.48.0 2348 + '@oxlint/binding-darwin-x64': 1.48.0 2349 + '@oxlint/binding-freebsd-x64': 1.48.0 2350 + '@oxlint/binding-linux-arm-gnueabihf': 1.48.0 2351 + '@oxlint/binding-linux-arm-musleabihf': 1.48.0 2352 + '@oxlint/binding-linux-arm64-gnu': 1.48.0 2353 + '@oxlint/binding-linux-arm64-musl': 1.48.0 2354 + '@oxlint/binding-linux-ppc64-gnu': 1.48.0 2355 + '@oxlint/binding-linux-riscv64-gnu': 1.48.0 2356 + '@oxlint/binding-linux-riscv64-musl': 1.48.0 2357 + '@oxlint/binding-linux-s390x-gnu': 1.48.0 2358 + '@oxlint/binding-linux-x64-gnu': 1.48.0 2359 + '@oxlint/binding-linux-x64-musl': 1.48.0 2360 + '@oxlint/binding-openharmony-arm64': 1.48.0 2361 + '@oxlint/binding-win32-arm64-msvc': 1.48.0 2362 + '@oxlint/binding-win32-ia32-msvc': 1.48.0 2363 + '@oxlint/binding-win32-x64-msvc': 1.48.0 2364 + 2332 2365 p-limit@3.1.0: 2333 2366 dependencies: 2334 2367 yocto-queue: 0.1.0 ··· 2504 2537 fdir: 6.5.0(picomatch@4.0.3) 2505 2538 picomatch: 4.0.3 2506 2539 2507 - tlds@1.261.0: {} 2508 - 2509 2540 to-regex-range@5.0.1: 2510 2541 dependencies: 2511 2542 is-number: 7.0.0 ··· 2539 2570 2540 2571 undici-types@6.21.0: {} 2541 2572 2542 - unicode-segmenter@0.14.5: {} 2543 - 2544 2573 uri-js@4.4.1: 2545 2574 dependencies: 2546 2575 punycode: 2.3.1 2547 2576 2548 2577 util-deprecate@1.0.2: {} 2549 - 2550 - vite-plugin-full-reload@1.2.0: 2551 - dependencies: 2552 - picocolors: 1.1.1 2553 - picomatch: 2.3.1 2554 - 2555 - vite-rs-plugin@1.0.1(vite@7.1.12(@types/node@22.19.0)): 2556 - dependencies: 2557 - vite: 7.1.12(@types/node@22.19.0) 2558 - vite-plugin-full-reload: 1.2.0 2559 2578 2560 2579 vite@7.1.12(@types/node@22.19.0): 2561 2580 dependencies:
+15 -6
web-ui/src/lib/assets/style.css
··· 138 138 justify-content: center; 139 139 } 140 140 141 - 142 141 .section { 143 142 margin-top: 30px; 144 143 } ··· 179 178 } 180 179 181 180 .form-checkbox { 182 - 183 181 font-size: 2rem; 184 182 font-weight: bold; 185 183 line-height: 1.1; ··· 244 242 text-decoration: none; 245 243 padding: 6px 10px; 246 244 border-radius: 8px; 247 - transition: background-color 0.2s ease, color 0.2s ease; 245 + transition: 246 + background-color 0.2s ease, 247 + color 0.2s ease; 248 248 } 249 249 250 250 .nav-links a:hover, ··· 326 326 flex-direction: column; 327 327 gap: 4px; 328 328 padding: 10px 16px 12px 16px; 329 - background: rgba(36, 36, 36, 0.95); /* solid enough to not bleed into title */ 329 + background: rgba( 330 + 36, 331 + 36, 332 + 36, 333 + 0.95 334 + ); /* solid enough to not bleed into title */ 330 335 backdrop-filter: saturate(180%) blur(10px); 331 336 border-bottom: 1px solid rgba(255, 255, 255, 0.08); 332 337 z-index: 1001; /* above page content */ ··· 426 431 } 427 432 } 428 433 429 - 430 434 /* Stats grid and cards for the index page */ 431 435 .stats-grid { 432 436 display: grid; ··· 462 466 font-size: 0.85rem; 463 467 opacity: 0.7; 464 468 margin-top: 6px; 465 - } 469 + } 470 + 471 + .warning { 472 + /*text-decoration: underline;*/ 473 + font-weight: bold; 474 + }
+33 -18
web-ui/src/routes/moover/[[pds]]/+page.svelte
··· 4 4 import {resolve} from '$app/paths'; 5 5 import {Migrator} from '@pds-moover/moover'; 6 6 import SignThePapers from './SignThePapers.svelte'; 7 - import Captcha from './Captcha.svelte'; 7 + import Captcha from '$lib/components/Captcha.svelte'; 8 + 8 9 9 10 let {data} = $props(); 10 11 ··· 66 67 let askForPlcToken = $state(false); 67 68 let disableSubmit = $state(false); 68 69 let showCaptcha = $state(false); 70 + let migrationInProgress = $state(false); 69 71 70 72 let errorMessage: null | string = $state(null); 71 73 let statusMessage: null | string = $state(null); ··· 134 136 135 137 async function performMigration() { 136 138 try { 137 - 139 + migrationInProgress = true; 138 140 if (showTwoFactorCodeInput) { 139 141 if (showTwoFactorCodeInput === null) { 140 142 errorMessage = 'Please enter the 2FA that was sent to your email.' ··· 151 153 migrator.migratePrefs = formData.migratePrefs; 152 154 migrator.migratePlcRecord = formData.migratePlcRecord; 153 155 154 - console.log(formData.newPds, newHandle); 155 156 156 157 updateStatusHandler('Starting migration...'); 157 158 showStatusMessage = true; ··· 183 184 } 184 185 //@ts-expect-error: JS being js. doesn't like not having the type' 185 186 errorMessage = error.message; 187 + // migrationInProgress = false; 186 188 } 187 189 } 190 + 188 191 </script> 189 192 190 193 <svelte:head> ··· 194 197 </svelte:head> 195 198 196 199 <div class="container"> 197 - <MooHeader title="PDS MOOver"/> 198 - {#if !askForPlcToken} 200 + <MooHeader title="PDS MOOver"/> 201 + {#if !migrationInProgress} 199 202 <a href={resolve('/info')}>Idk if I trust a cow to move my atproto account to a new PDS</a> 200 203 <br/> 201 204 <a href="https://blacksky.community/profile/did:plc:g7j6qok5us4hjqlwjxwrrkjm/post/3lw3hcuojck2u">Video guide for 202 205 joining blacksky.app</a> 203 206 {#if showCaptcha} 204 207 <Captcha 205 - pdsUrl={formData.newPds} 208 + pdsUrl={`https://${cleanSelectedPds}`} 206 209 handle={newHandle} 207 210 onSuccess={handleCaptchaSuccess} 208 211 onError={handleCaptchaError} ··· 388 391 <span>I understand</span> 389 392 </label> 390 393 </div> 394 + <div> 395 + <button disabled={disableSubmit} 396 + type="submit">{selectedPds ? `MOOve to ${cleanSelectedPds}` : 'MOOve'}</button> 397 + </div> 398 + 399 + </form> 400 + {/if} 401 + {:else} 402 + {#if !askForPlcToken} 403 + <div id="messageBoxes"> 404 + <div class="warning">***Please make sure to stay on this page during the MOOve for the 405 + best result.*** 406 + </div> 407 + 391 408 {#if errorMessage !== null} 392 409 <div class="error-message">{errorMessage}</div> 410 + 411 + <div id="status-message" class="status-message">A error has occurred. Please take a screenshot of this screen for support. You can also retry by refreshing the page, it will not harm your account.</div> 412 + 393 413 {/if} 394 414 395 415 {#if showStatusMessage} 396 - <div id="warning">*Please make sure to stay on this page during the MOOve for the 397 - best result 398 - </div> 399 416 <div id="status-message" class="status-message">{statusMessage}</div> 400 417 {/if} 418 + </div> 419 + {/if} 420 + {/if} 401 421 402 422 403 - <div> 404 - <button disabled={disableSubmit} 405 - type="submit">{selectedPds ? `MOOve to ${cleanSelectedPds}` : 'MOOve'}</button> 406 - </div> 407 - 408 - </form> 409 - {/if} 410 - {:else} 423 + {#if askForPlcToken} 411 424 <SignThePapers migrator={migrator} newHandle={newHandle}/> 412 425 {/if} 413 - </div> 426 + 427 + 428 + </div>
+3 -1
web-ui/src/routes/moover/[[pds]]/Captcha.svelte web-ui/src/lib/components/Captcha.svelte
··· 1 1 <script lang="ts"> 2 2 import {onMount} from 'svelte'; 3 + import { browser } from '$app/environment'; 3 4 4 5 interface CaptchaProps { 5 6 pdsUrl: string; ··· 21 22 let isLoading = $state(true); 22 23 23 24 25 + 24 26 const gateUrl = $derived( 25 - `${pdsUrl}/gate/signup?state=${encodeURIComponent(captcha_state)}&handle=${encodeURIComponent(handle)}&redirect_url=${encodeURIComponent(window.location.origin)}`, 27 + `${pdsUrl}/gate/signup?state=${encodeURIComponent(captcha_state)}&handle=${encodeURIComponent(handle)}&redirect_url=${encodeURIComponent(browser ? window.location.origin : 'https://pdsmoover.com')}`, 26 28 ); 27 29 28 30 // Monitor iframe for URL changes
+7 -6
web-ui/src/routes/moover/[[pds]]/SignThePapers.svelte
··· 80 80 <form onsubmit="{signPlcOperation}"> 81 81 {#if !done} 82 82 <div> 83 - <h2>Please enter your PLC Token you received in an email</h2> 83 + <h2>Please check your email attached to your previous account for a PLC token to enter below</h2> 84 84 <div class="form-group"> 85 85 <label for="plc-token">PLC Token:</label> 86 86 <input type="text" id="plc-token" name="plc-token" bind:value={plcToken} required> 87 87 </div> 88 - <p style="text-align: left">You can now select to add a new Rotation Key during migration and sign up 89 - for PDS MOOver's free backup service. With a Rotation Key and backups if your new PDS ever goes down 90 - you can recover your account and it's data.</p> 88 + <p style="text-align: left"> 89 + Please check the boxes below if you would like to add a Rotation Key to your account and to sign up for PDS MOOver's free backup service. 90 + With a Rotation Key and backups if your new PDS ever goes down 91 + you can recover your account and it's data. This is not required but highly recommended.</p> 91 92 <div class="form-group"> 92 93 <label for="rotation-key" class="moove-checkbox-label"> 93 94 <input bind:checked={createANewRotationKey} type="checkbox" id="rotation-key" ··· 165 166 166 167 {#if done} 167 168 <div class="status-message">Congratulations! You have MOOved to a new PDS! Remember to use 168 - your new PDS URL under "Hosting provider" when logging in on Bluesky. Can find more detail information 169 + your new PDS URL under "Hosting provider" when logging in on Bluesky. If you cannot login or see "Your account is deactivated" please follow the directions here 169 170 <a href={resolve('/info#cant-login')}>here.</a></div> 170 171 {:else } 171 172 <div> ··· 175 176 176 177 177 178 </form> 178 - </div> 179 + </div>