···
import {Migrator} from '@pds-moover/moover';
import SignThePapers from './SignThePapers.svelte';
+
let selectedPds = $derived(data.pdsOptions);
+
let cleanSelectedPds = $derived(selectedPds?.did.replace('did:web:', ''));
+
//Kept as a "global" state to handle logic of passing the full handle that is used to SignThePapers
+
let newHandle = $state('');
+
let selectedDomain = $state(data.intinalDomain);
+
let handlePlaceHolder = $derived(
+
selectedPds ? `username${selectedDomain === 'custom' ? '' : `${selectedPds?.availableUserDomains[0]}`} or mydomain.com` : 'username.newpds.com or mycooldomain.com')
+
if (!selectedPds) return;
+
if (selectedDomain == 'custom') return;
+
if (formData.newHandle.includes('.')) {
+
// When a period is typed, force custom domain selection
+
selectedDomain = 'custom';
+
// If user clears the dot and we have provider domains, fall back to first option
+
if ((selectedPds?.availableUserDomains?.length ?? 0) > 0 && selectedDomain === 'custom') {
+
selectedDomain = selectedPds!.availableUserDomains[0]!
···
+
// Acceptance of provider policies (when required by selected PDS)
···
let errorMessage: null | string = $state(null);
let statusMessage: null | string = $state(null);
+
// Links that may require acceptance prior to migration from the selected PDS
+
const privacyUrl = $derived(selectedPds?.links?.privacyPolicy);
+
const tosUrl = $derived(selectedPds?.links?.termsOfService);
+
const requiresAccept = $derived(!!(privacyUrl || tosUrl));
const updateStatusHandler = (status: string) => {
···
+
// If the selected PDS provides policy or privacy links, require explicit acceptance
+
if (requiresAccept && !formData.acceptPolicies) {
+
errorMessage = 'Please review and accept the providers policies';
+
newHandle = formData.newHandle;
+
//Not happy about this unwrap, but it should always have a value on a legit PDS that I know of
+
formData.newPds = `https://${cleanSelectedPds!}`;
+
// Combine username and selected domain for the new handle
+
if (selectedDomain !== 'custom') {
+
newHandle = formData.newHandle + selectedDomain;
if (showTwoFactorCodeInput) {
···
migrator.migratePrefs = formData.migratePrefs;
migrator.migratePlcRecord = formData.migratePlcRecord;
+
console.log(formData.newPds, newHandle);
updateStatusHandler('Starting migration...');
showStatusMessage = true;
···
···
<!-- Second section: New account details -->
+
<h2>{selectedPds ? `Setup for ${cleanSelectedPds}` : 'Setup for the new PDS'}</h2>
+
<div class="form-group">
+
<label for="new-pds">New PDS (URL):</label>
+
<input type="url" id="new-pds" name="newPds" placeholder="https://coolnewpds.com"
+
required bind:value={formData.newPds}>
<label for="new-email">New Email:</label>
+
<input type="email" id="new-email" name="newEmail"
+
placeholder="CanBeSameEmailAsTheOldPds@email.com"
required bind:value={formData.newEmail}>
<label for="new-handle">New Handle:</label>
+
<div class={selectedPds ? 'input-group' : ''}>
+
<input type="text" id="new-handle" name="newHandle"
+
placeholder="{handlePlaceHolder}"
+
bind:value={formData.newHandle}>
+
<select bind:value={selectedDomain} class="domain-select">
+
{#each selectedPds?.availableUserDomains as domain (domain)}
+
<option value={domain}>{domain}</option>
+
<option value="custom">I have my own domain setup</option>
+
{#if !selectedPds || selectedPds.inviteCodeRequired !== false}
+
<div class="form-group">
+
<label for="invite-code">Invite Code:</label>
+
<input type="text" id="invite-code" name="inviteCode"
+
placeholder="Invite code from your new PDS (Leave blank if you don't have one)"
+
bind:value={formData.inviteCode}>
<button type="button" onclick={() => showAdvance = !showAdvance} id="advance" name="advance">Advance
···
+
<div class="section" style="text-align: left">
+
<h3>Provider policies</h3>
+
To migrate to {cleanSelectedPds}, you must review and accept:
+
<li><a href={privacyUrl} target="_blank" rel="noopener noreferrer">Privacy
+
<li><a href={tosUrl} target="_blank" rel="noopener noreferrer">Terms of Service</a></li>
+
<div class="form-group">
+
<label for="accept-policies" class="moove-checkbox-label">
+
<input bind:checked={formData.acceptPolicies} type="checkbox" id="accept-policies"
+
name="acceptPolicies" required>
<p style="text-align: left">There are some risks that come with doing an account migration.
<a href="https://github.com/bluesky-social/pds/blob/main/ACCOUNT_MIGRATION.md#%EF%B8%8F-warning-%EF%B8%8F-%EF%B8%8F">here</a>)
···
+
<button disabled={disableSubmit}
+
type="submit">{selectedPds ? `MOOve to ${cleanSelectedPds}` : 'MOOve'}</button>
+
<SignThePapers migrator={migrator} newHandle={newHandle}/>