Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
483906c
feat(auth): ask users with a paid pending account setup to finish it …
xabg2 Sep 29, 2026
93bb3c5
feat(checkout): support checkout without a Drive session
xabg2 Sep 29, 2026
3adfab5
feat(checkout): let new customers pay with only their email
xabg2 Sep 29, 2026
693faed
feat(checkout): add the check-your-email screen for passwordless buyers
xabg2 Sep 29, 2026
6e47d10
feat(account-setup): add the account setup service layer
xabg2 Sep 29, 2026
df90523
feat(account-setup): add the account setup screen from the email link
xabg2 Sep 29, 2026
4e8f032
Merge remote-tracking branch 'origin/feat/PB-6913-account-setup-view'…
xabg2 Sep 29, 2026
6e50c9f
Merge remote-tracking branch 'origin/feat/PB-6914-pending-account-set…
xabg2 Sep 29, 2026
3199a49
Merge branch 'master' into feat/PB-6912-checkout-without-session
xabg2 Sep 30, 2026
34cb447
Merge branch 'master' into feat/PB-6914-pending-account-setup-on-login
xabg2 Sep 30, 2026
55719db
Merge branch 'master' into feat/PB-6913-account-setup-service
xabg2 Sep 30, 2026
b30876a
Merge branch 'master' into feat/PB-6913-account-setup-service
xabg2 Oct 5, 2026
058e7df
refactor: rename component
xabg2 Oct 5, 2026
697dd7a
Merge branch 'master' of github.com:internxt/drive-web into feat/PB-6…
xabg2 Oct 6, 2026
9091d2b
Merge branch 'master' into feat/PB-6914-pending-account-setup-on-login
xabg2 Oct 6, 2026
63da712
fix: icon name and use arrow function instead
xabg2 Oct 6, 2026
7bc9e43
chore(deps): bump SDK version
xabg2 Oct 6, 2026
b0222bf
Merge branch 'master' of github.com:internxt/drive-web into feat/PB-6…
xabg2 Oct 6, 2026
ea032fa
chore: update SDK verison
xabg2 Oct 6, 2026
eac761d
feat: missing pt keys
xabg2 Oct 6, 2026
391c388
Merge pull request #2187 from internxt/feat/PB-6912-checkout-without-…
xabg2 Oct 6, 2026
ef641ac
Merge remote-tracking branch 'origin/featurew/sign-up-passwordless-fo…
xabg2 Oct 6, 2026
695b18b
Merge pull request #2188 from internxt/feat/PB-6912-pay-with-email-only
xabg2 Oct 6, 2026
0f7ac57
Merge remote-tracking branch 'origin/featurew/sign-up-passwordless-fo…
xabg2 Oct 6, 2026
c3ba893
Merge branch 'featurew/sign-up-passwordless-for-checkout' into feat/P…
xabg2 Oct 6, 2026
2eb6fc6
Merge pull request #2190 from internxt/feat/PB-6913-account-setup-ser…
xabg2 Oct 6, 2026
4a46046
Merge pull request #2191 from internxt/feat/PB-6913-account-setup-view
xabg2 Oct 6, 2026
9165bcb
Merge branch 'featurew/sign-up-passwordless-for-checkout' into feat/P…
xabg2 Oct 6, 2026
dc88df5
Merge pull request #2192 from internxt/feat/PB-6914-pending-account-s…
xabg2 Oct 6, 2026
23407ec
Merge remote-tracking branch 'origin/featurew/sign-up-passwordless-fo…
xabg2 Oct 6, 2026
cf1b44b
Merge pull request #2189 from internxt/feat/PB-6912-check-your-email-…
xabg2 Oct 6, 2026
48c50d5
fix: sonar issues
xabg2 Oct 6, 2026
4206e06
fix: remove useless flag
xabg2 Oct 6, 2026
2c29f9a
Merge branch 'master' into featurew/sign-up-passwordless-for-checkout
xabg2 Oct 7, 2026
92131c1
Merge branch 'master' into featurew/sign-up-passwordless-for-checkout
xabg2 Oct 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
"@iconscout/react-unicons": "^2.2.5",
"@internxt/css-config": "1.1.1",
"@internxt/lib": "=1.5.1",
"@internxt/sdk": "1.21.1",
"@internxt/sdk": "1.22.1",
"@internxt/ui": "=0.1.21",
"@marsidev/react-turnstile": "^1.6.1",
"@phosphor-icons/react": "^2.1.10",
Expand Down
2 changes: 2 additions & 0 deletions src/app/core/config/views.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import {
UniversalLinkOkView,
} from '../../../views/Login';
import SignUpView, { ShareGuestSignUpView, WorkspaceGuestSignUpView } from '../../../views/Signup';
import AccountSetupView from 'views/AccountSetup';
import DeactivationView from '../../core/views/DeactivationView/DeactivationView';
import DriveView from 'views/Drive';
import FavoritesView from 'views/Favorites';
Expand Down Expand Up @@ -46,6 +47,7 @@ const views: Array<{
{ id: AppView.Auth, component: AuthView },
{ id: AppView.ButtonAuth, component: ButtonAuth },
{ id: AppView.RecoverAccount, component: RecoverAccountView },
{ id: AppView.CompleteAccount, component: AccountSetupView },
{ id: AppView.Favorites, component: FavoritesView },
{ id: AppView.Recents, component: RecentsView },
{ id: AppView.Trash, component: TrashView },
Expand Down
1 change: 1 addition & 0 deletions src/app/core/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ export const HTTP_STATUS_CODES = {
PAYMENT_REQUIRED: 402,
FORBIDDEN: 403,
NOT_FOUND: 404,
CONFLICT: 409,
MAX_SPACE_USED: 420,
INTERNAL_SERVER_ERROR: 500,
};
Expand Down
5 changes: 5 additions & 0 deletions src/app/core/factory/sdk/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,11 @@ export class SdkFactory {
return Checkout.client(envService.getVariable('payments'), appDetails, apiSecurity);
}

public createCheckoutClientWithoutSession(): Checkout {
const appDetails = SdkFactory.getAppDetails();
return Checkout.client(envService.getVariable('payments'), appDetails, { token: '' });
}

public createBackupsClient(): Backups {
const apiUrl = this.getApiUrl();
const appDetails = SdkFactory.getAppDetails();
Expand Down
2 changes: 2 additions & 0 deletions src/app/core/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ export enum AppView {
Auth = 'auth',
ButtonAuth = 'buttonAuth',
RecoverAccount = 'recover-account',
CompleteAccount = 'complete-account',
Drive = 'drive',
Favorites = 'favorites',
Recents = 'recents',
Expand Down Expand Up @@ -157,6 +158,7 @@ export enum LocalStorageItem {
StpatricksTheme = 'stpatricks_theme_enabled',
AnniversaryTheme = 'anniversary_theme_enabled',
SubscriptionEndingModalClosed = 'subscription_ending_modal_closed',
CheckoutAccountSetupEmail = 'checkout_account_setup_email',
}

export enum LocalStorageProtectedItem {
Expand Down
45 changes: 45 additions & 0 deletions src/app/i18n/locales/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,13 @@
"valentines": "Valentinstag"
},
"auth": {
"accountSetupPending": {
"title": "Schließen Sie die Einrichtung Ihres Kontos ab",
"message": "Sie haben mit dieser E-Mail bereits einen Tarif gekauft. Verwenden Sie den Link, den wir Ihnen gesendet haben, um Ihr Passwort festzulegen.",
"resend": "E-Mail erneut senden",
"emailSent": "E-Mail gesendet. Sehen Sie in Ihrem Posteingang nach.",
"resendFailed": "Wir konnten die E-Mail nicht senden. Bitte versuchen Sie es erneut."
},
"emailFloatingLabel": "E-Mail-Adresse",
"email": "E-Mail",
"passwordFloatingLabel": "Passwort",
Expand Down Expand Up @@ -272,6 +279,20 @@
"countryRequired": "Wir konnten Ihr Land nicht ermitteln. Bitte versuchen Sie es später erneut.",
"missingPaymentDetails": "Fehlende Zahlungsdaten zur Bestätigung der Zahlung",
"paymentFailed": "Zahlung fehlgeschlagen"
},
"accountSetup": {
"passwordAfterPayment": "Du brauchst noch kein Passwort. Nach der Zahlung senden wir dir eine E-Mail, um die Einrichtung deines Kontos abzuschließen.",
"emailHasAccount": "Für diese E-Mail gibt es bereits ein Internxt-Konto. Melde dich an, um mit deinem Kauf fortzufahren.",
"pendingSetup": "Für {{email}} gibt es bereits einen bezahlten Tarif, der noch eingerichtet werden muss. Prüfe deine E-Mails, um die Einrichtung deines Kontos abzuschließen.",
"cryptoRequiresSignIn": "Melde dich an, um mit Kryptowährung zu bezahlen.",
"resendEmail": "E-Mail erneut senden",
"emailResent": "Wir haben dir die E-Mail erneut gesendet",
"resendEmailError": "Wir konnten die E-Mail nicht senden. Bitte versuche es später erneut.",
"checkEmail": {
"title": "Prüfe deine E-Mails",
"description": "Deine Zahlung war erfolgreich. Wir haben einen Link zum Abschließen der Kontoeinrichtung gesendet an:",
"spamHint": "Nicht gefunden? Sieh in deinem Spam-Ordner nach."
}
}
},
"urgentCheckout": {
Expand Down Expand Up @@ -1543,6 +1564,30 @@
}
}
},
"accountSetup": {
"form": {
"title": "Richte dein Konto ein",
"description": "Erstelle ein Passwort, um die Einrichtung deines Internxt-Kontos abzuschließen.",
"confirmPassword": "Passwort bestätigen",
"passwordsDoNotMatch": "Die Passwörter stimmen nicht überein",
"submit": "Konto erstellen",
"genericError": "Bei der Einrichtung deines Kontos ist ein Fehler aufgetreten. Bitte versuche es erneut."
},
"invalidLink": {
"title": "Dieser Link ist nicht mehr gültig",
"description": "Der Link ist abgelaufen oder wurde bereits verwendet. Gib deine E-Mail-Adresse ein und wir senden dir einen neuen.",
"emailLabel": "E-Mail",
"resendButton": "Neuen Link senden",
"resendError": "Die E-Mail konnte nicht gesendet werden. Bitte versuche es erneut.",
"emailSentTitle": "Prüfe deine E-Mails",
"emailSentDescription": "Wenn für {{email}} ein Konto auf die Einrichtung wartet, erhältst du in Kürze einen neuen Link."
},
"accountAlreadyExists": {
"title": "Dein Konto ist bereits eingerichtet",
"description": "Dieses Konto existiert bereits. Melde dich mit deiner E-Mail-Adresse und deinem Passwort an.",
"loginButton": "Zur Anmeldung"
}
},
"blockedAccount": {
"title": "Überprüfen Sie, dass Sie es sind",
"text1": "Es wurden zu viele fehlgeschlagene Anmeldeversuche unternommen.",
Expand Down
45 changes: 45 additions & 0 deletions src/app/i18n/locales/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,13 @@
"environment": "World Environment Day"
},
"auth": {
"accountSetupPending": {
"title": "Finish setting up your account",
"message": "You already bought a plan with this email. Use the link we sent you to create your password.",
"resend": "Resend the email",
"emailSent": "Email sent. Check your inbox.",
"resendFailed": "We couldn't send the email. Please try again."
},
"emailFloatingLabel": "Email address",
"email": "Email address",
"passwordFloatingLabel": "Password",
Expand Down Expand Up @@ -293,6 +300,20 @@
"countryRequired": "We couldn't determine your billing country. Please try again later.",
"missingPaymentDetails": "Missing payment details to confirm the payment",
"paymentFailed": "Payment failed"
},
"accountSetup": {
"passwordAfterPayment": "You don't need a password yet. After paying, we'll send you an email to finish setting up your account.",
"emailHasAccount": "This email already has an Internxt account. Log in to continue with your purchase.",
"pendingSetup": "{{email}} already has a paid plan waiting to be set up. Check your email to finish setting up your account.",
"cryptoRequiresSignIn": "Log in to pay with crypto.",
"resendEmail": "Resend email",
"emailResent": "We've sent you the email again",
"resendEmailError": "We couldn't send the email. Please try again later.",
"checkEmail": {
"title": "Check your email",
"description": "Your payment was successful. We've sent a link to finish setting up your account to:",
"spamHint": "Can't find it? Check your spam folder."
}
}
},
"urgentCheckout": {
Expand Down Expand Up @@ -1567,6 +1588,30 @@
}
}
},
"accountSetup": {
"form": {
"title": "Set up your account",
"description": "Create a password to finish setting up your Internxt account.",
"confirmPassword": "Confirm password",
"passwordsDoNotMatch": "Passwords don't match",
"submit": "Create account",
"genericError": "Something went wrong while setting up your account. Please try again."
},
"invalidLink": {
"title": "This link is no longer valid",
"description": "The link has expired or has already been used. Enter your email and we will send you a new one.",
"emailLabel": "Email",
"resendButton": "Send me a new link",
"resendError": "We couldn't send the email. Please try again.",
"emailSentTitle": "Check your email",
"emailSentDescription": "If {{email}} has an account waiting to be set up, you will receive a new link shortly."
},
"accountAlreadyExists": {
"title": "Your account is already set up",
"description": "This account already exists. Log in with your email and password to access it.",
"loginButton": "Go to log in"
}
},
"blockedAccount": {
"title": "Verify it’s you",
"text1": "Too many failed logins were attempted.",
Expand Down
45 changes: 45 additions & 0 deletions src/app/i18n/locales/es.json
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,13 @@
"environment": "Día Mundial del Medio Ambiente"
},
"auth": {
"accountSetupPending": {
"title": "Termina de configurar tu cuenta",
"message": "Ya has comprado un plan con este email. Usa el enlace que te enviamos para crear tu contraseña.",
"resend": "Reenviar el correo",
"emailSent": "Correo enviado. Revisa tu bandeja de entrada.",
"resendFailed": "No hemos podido enviar el correo. Inténtalo de nuevo."
},
"emailFloatingLabel": "Correo electrónico",
"email": "Correo electrónico",
"passwordFloatingLabel": "Contraseña",
Expand Down Expand Up @@ -272,6 +279,20 @@
"countryRequired": "No hemos podido determinar tu país de facturación. Inténtalo de nuevo más tarde.",
"missingPaymentDetails": "Faltan los datos de pago para confirmar el pago",
"paymentFailed": "Pago fallido"
},
"accountSetup": {
"passwordAfterPayment": "Todavía no necesitas una contraseña. Después del pago te enviaremos un correo para terminar de configurar tu cuenta.",
"emailHasAccount": "Este correo ya tiene una cuenta de Internxt. Inicia sesión para continuar con tu compra.",
"pendingSetup": "{{email}} ya tiene un plan pagado pendiente de configurar. Revisa tu correo para terminar de configurar tu cuenta.",
"cryptoRequiresSignIn": "Inicia sesión para pagar con criptomonedas.",
"resendEmail": "Reenviar correo",
"emailResent": "Te hemos vuelto a enviar el correo",
"resendEmailError": "No hemos podido enviar el correo. Inténtalo de nuevo más tarde.",
"checkEmail": {
"title": "Revisa tu correo",
"description": "El pago se ha completado. Hemos enviado un enlace para terminar de configurar tu cuenta a:",
"spamHint": "¿No lo encuentras? Revisa la carpeta de spam."
}
}
},
"urgentCheckout": {
Expand Down Expand Up @@ -1547,6 +1568,30 @@
}
}
},
"accountSetup": {
"form": {
"title": "Configura tu cuenta",
"description": "Crea una contraseña para terminar de configurar tu cuenta de Internxt.",
"confirmPassword": "Confirmar contraseña",
"passwordsDoNotMatch": "Las contraseñas no coinciden",
"submit": "Crear cuenta",
"genericError": "Algo ha ido mal al configurar tu cuenta. Inténtalo de nuevo."
},
"invalidLink": {
"title": "Este enlace ya no es válido",
"description": "El enlace ha caducado o ya se ha utilizado. Introduce tu email y te enviaremos uno nuevo.",
"emailLabel": "Email",
"resendButton": "Envíame un nuevo enlace",
"resendError": "No hemos podido enviar el email. Inténtalo de nuevo.",
"emailSentTitle": "Revisa tu email",
"emailSentDescription": "Si {{email}} tiene una cuenta pendiente de configurar, recibirás un nuevo enlace en breve."
},
"accountAlreadyExists": {
"title": "Tu cuenta ya está configurada",
"description": "Esta cuenta ya existe. Inicia sesión con tu email y contraseña para acceder.",
"loginButton": "Ir a iniciar sesión"
}
},
"blockedAccount": {
"title": "Verifica que eres tú",
"text1": "Se han detectado demasiados inicios de sesion fallidos.",
Expand Down
45 changes: 45 additions & 0 deletions src/app/i18n/locales/fr.json
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,13 @@
"environment": "Journée Mondiale de l'Environnement"
},
"auth": {
"accountSetupPending": {
"title": "Terminez la configuration de votre compte",
"message": "Vous avez déjà acheté un forfait avec cet e-mail. Utilisez le lien que nous vous avons envoyé pour créer votre mot de passe.",
"resend": "Renvoyer l'e-mail",
"emailSent": "E-mail envoyé. Consultez votre boîte de réception.",
"resendFailed": "Nous n'avons pas pu envoyer l'e-mail. Veuillez réessayer."
},
"emailFloatingLabel": "Adresse e-mail",
"email": "Email",
"passwordFloatingLabel": "Mot de passe",
Expand Down Expand Up @@ -272,6 +279,20 @@
"countryRequired": "Nous n'avons pas pu déterminer votre pays. Veuillez réessayer plus tard.",
"missingPaymentDetails": "Informations de paiement manquantes pour confirmer le paiement",
"paymentFailed": "Paiement échoué"
},
"accountSetup": {
"passwordAfterPayment": "Vous n'avez pas encore besoin de mot de passe. Après le paiement, nous vous enverrons un e-mail pour finaliser la configuration de votre compte.",
"emailHasAccount": "Cet e-mail a déjà un compte Internxt. Connectez-vous pour poursuivre votre achat.",
"pendingSetup": "{{email}} a déjà un forfait payé en attente de configuration. Consultez vos e-mails pour finaliser la configuration de votre compte.",
"cryptoRequiresSignIn": "Connectez-vous pour payer en cryptomonnaie.",
"resendEmail": "Renvoyer l'e-mail",
"emailResent": "Nous vous avons renvoyé l'e-mail",
"resendEmailError": "Nous n'avons pas pu envoyer l'e-mail. Veuillez réessayer plus tard.",
"checkEmail": {
"title": "Consultez vos e-mails",
"description": "Votre paiement a été effectué. Nous avons envoyé un lien pour finaliser la configuration de votre compte à :",
"spamHint": "Vous ne le trouvez pas ? Vérifiez votre dossier de spam."
}
}
},
"urgentCheckout": {
Expand Down Expand Up @@ -1547,6 +1568,30 @@
}
}
},
"accountSetup": {
"form": {
"title": "Configurez votre compte",
"description": "Créez un mot de passe pour terminer la configuration de votre compte Internxt.",
"confirmPassword": "Confirmer le mot de passe",
"passwordsDoNotMatch": "Les mots de passe ne correspondent pas",
"submit": "Créer un compte",
"genericError": "Une erreur s'est produite lors de la configuration de votre compte. Veuillez réessayer."
},
"invalidLink": {
"title": "Ce lien n'est plus valide",
"description": "Le lien a expiré ou a déjà été utilisé. Saisissez votre e-mail et nous vous en enverrons un nouveau.",
"emailLabel": "E-mail",
"resendButton": "M'envoyer un nouveau lien",
"resendError": "Nous n'avons pas pu envoyer l'e-mail. Veuillez réessayer.",
"emailSentTitle": "Vérifiez vos e-mails",
"emailSentDescription": "Si {{email}} a un compte en attente de configuration, vous recevrez bientôt un nouveau lien."
},
"accountAlreadyExists": {
"title": "Votre compte est déjà configuré",
"description": "Ce compte existe déjà. Connectez-vous avec votre e-mail et votre mot de passe pour y accéder.",
"loginButton": "Aller à la connexion"
}
},
"blockedAccount": {
"title": "Vérifier que c'est bien vous",
"text1": "Trop d'échecs de connexion ont été tentés",
Expand Down
45 changes: 45 additions & 0 deletions src/app/i18n/locales/it.json
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,13 @@
"environment": "Giornata Mondiale dell'Ambiente"
},
"auth": {
"accountSetupPending": {
"title": "Completa la configurazione del tuo account",
"message": "Hai già acquistato un piano con questa email. Usa il link che ti abbiamo inviato per creare la tua password.",
"resend": "Invia di nuovo l'email",
"emailSent": "Email inviata. Controlla la tua casella di posta.",
"resendFailed": "Non è stato possibile inviare l'email. Riprova."
},
"emailFloatingLabel": "Indirizzo email",
"email": "Email",
"passwordFloatingLabel": "Password",
Expand Down Expand Up @@ -293,6 +300,20 @@
"countryRequired": "Non siamo riusciti a determinare il tuo paese. Riprova più tardi.",
"missingPaymentDetails": "Dati di pagamento mancanti per confermare il pagamento",
"paymentFailed": "Pagamento non riuscito"
},
"accountSetup": {
"passwordAfterPayment": "Non ti serve ancora una password. Dopo il pagamento ti invieremo un'email per completare la configurazione del tuo account.",
"emailHasAccount": "Questa email ha già un account Internxt. Accedi per continuare con l'acquisto.",
"pendingSetup": "{{email}} ha già un piano pagato in attesa di configurazione. Controlla la tua email per completare la configurazione del tuo account.",
"cryptoRequiresSignIn": "Accedi per pagare con criptovalute.",
"resendEmail": "Invia di nuovo l'email",
"emailResent": "Ti abbiamo inviato di nuovo l'email",
"resendEmailError": "Non siamo riusciti a inviare l'email. Riprova più tardi.",
"checkEmail": {
"title": "Controlla la tua email",
"description": "Il pagamento è andato a buon fine. Abbiamo inviato un link per completare la configurazione del tuo account a:",
"spamHint": "Non la trovi? Controlla la cartella dello spam."
}
}
},
"urgentCheckout": {
Expand Down Expand Up @@ -1567,6 +1588,30 @@
}
}
},
"accountSetup": {
"form": {
"title": "Configura il tuo account",
"description": "Crea una password per completare la configurazione del tuo account Internxt.",
"confirmPassword": "Conferma password",
"passwordsDoNotMatch": "Le password non corrispondono",
"submit": "Crea account",
"genericError": "Si è verificato un errore durante la configurazione dell'account. Riprova."
},
"invalidLink": {
"title": "Questo link non è più valido",
"description": "Il link è scaduto o è già stato utilizzato. Inserisci la tua email e te ne invieremo uno nuovo.",
"emailLabel": "Email",
"resendButton": "Inviami un nuovo link",
"resendError": "Non è stato possibile inviare l'email. Riprova.",
"emailSentTitle": "Controlla la tua email",
"emailSentDescription": "Se {{email}} ha un account in attesa di configurazione, riceverai a breve un nuovo link."
},
"accountAlreadyExists": {
"title": "Il tuo account è già configurato",
"description": "Questo account esiste già. Accedi con la tua email e password.",
"loginButton": "Vai all'accesso"
}
},
"blockedAccount": {
"title": "Verifica di essere tu",
"text1": "Sono stati tentati troppi login non riusciti",
Expand Down
Loading
Loading