Skip to main content

Reference

The enums below are exported from src/pages/PrivateKitPage/PrivateKitPage.tsx.

PRIVATE_KIT_MESSAGE_TYPES

enum PRIVATE_KIT_MESSAGE_TYPES {
// iframe → parent
INIT = 'PRIVATE_KIT_INIT',
USERNAME_UPDATED = 'PRIVATE_KIT_USERNAME_UPDATED',
USERNAME_VALIDATION_ERROR = 'PRIVATE_KIT_USERNAME_VALIDATION_ERROR',
EMAIL_UPDATED = 'PRIVATE_KIT_EMAIL_UPDATED',
EMAIL_VALIDATION_ERROR = 'PRIVATE_KIT_EMAIL_VALIDATION_ERROR',
EMAIL_CONFIRMED = 'PRIVATE_KIT_EMAIL_CONFIRMED',
EMAIL_CONFIRMATION_ERROR = 'PRIVATE_KIT_EMAIL_CONFIRMATION_ERROR',
EMAIL_CODE_RESENT = 'PRIVATE_KIT_EMAIL_CODE_RESENT',
PHONE_UPDATED = 'PRIVATE_KIT_PHONE_UPDATED',
PHONE_VALIDATION_ERROR = 'PRIVATE_KIT_PHONE_VALIDATION_ERROR',
PHONE_CONFIRMED = 'PRIVATE_KIT_PHONE_CONFIRMED',
PHONE_CONFIRMATION_ERROR = 'PRIVATE_KIT_PHONE_CONFIRMATION_ERROR',
PHONE_CODE_RESENT = 'PRIVATE_KIT_PHONE_CODE_RESENT',
PASSWORD_UPDATED = 'PRIVATE_KIT_PASSWORD_UPDATED',
PASSWORD_VALIDATION_ERROR = 'PRIVATE_KIT_PASSWORD_VALIDATION_ERROR',
AUTH_TOKEN_401 = 'PRIVATE_KIT_AUTH_TOKEN_401',

// parent → iframe
UPDATE_USERNAME = 'PRIVATE_KIT_UPDATE_USERNAME',
UPDATE_EMAIL = 'PRIVATE_KIT_UPDATE_EMAIL',
CONFIRM_EMAIL = 'PRIVATE_KIT_CONFIRM_EMAIL',
RESEND_EMAIL_CODE = 'PRIVATE_KIT_RESEND_EMAIL_CODE',
UPDATE_PHONE = 'PRIVATE_KIT_UPDATE_PHONE',
CONFIRM_PHONE = 'PRIVATE_KIT_CONFIRM_PHONE',
RESEND_PHONE_CODE = 'PRIVATE_KIT_RESEND_PHONE_CODE',
UPDATE_PASSWORD = 'PRIVATE_KIT_UPDATE_PASSWORD',
}

USERNAME_VALIDATION_REASON

enum USERNAME_VALIDATION_REASON {
REQUIRED = 'required',
INVALID = 'invalid',
EXIST = 'exist',
UNKNOWN = 'unknown',
}

enum EMAIL_VALIDATION_REASON {
REQUIRED = 'required',
INVALID = 'invalid',
EXIST = 'exist',
LIMIT_REACHED = 'limitReached',
UNKNOWN = 'unknown',
}

enum EMAIL_CONFIRMATION_REASON {
REQUIRED = 'required',
MAX = 'max',
INVALID = 'invalid',
INVALID_CODE = 'invalidCode',
UNKNOWN = 'unknown',
}

enum PHONE_VALIDATION_REASON {
REQUIRED = 'required',
INVALID = 'invalid',
EXIST = 'exist',
LIMIT_REACHED = 'limitReached',
UNKNOWN = 'unknown',
}

enum PHONE_CONFIRMATION_REASON {
REQUIRED = 'required',
MAX = 'max',
INVALID = 'invalid',
INVALID_CODE = 'invalidCode',
UNKNOWN = 'unknown',
}

enum PASSWORD_VALIDATION_REASON {
REQUIRED_CURRENT = 'requiredCurrent',
REQUIRED_NEW = 'requiredNew',
MIN = 'min',
UPPERCASE = 'uppercase',
SPECIAL = 'special',
NUMBER = 'number',
INVALID_CURRENT = 'invalidCurrent',
UNKNOWN = 'unknown',
}

Validation helpers

The same rules that power the standalone forms (src/helpers/validations.ts).

const userNameValidation = (username: string) => {
if (username.length < 5) return false;
if (!/^(?=.*[A-Za-z])[A-Za-z0-9]+$/.test(username)) return false;
return true;
};

A username must be at least 5 characters, alphanumeric only, and contain at least one letter.

const emailValidation = (email: string) =>
/^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$/.test(email);

An email must match the basic [email protected] pattern.

const phoneValidation = (phone: string) => {
try {
return phoneUtil.isValidNumber(phoneUtil.parseAndKeepRawInput(phone));
} catch {
return false;
}
};

A phone number is validated via google-libphonenumber. The host should send the number in international format (with + prefix), exactly as produced by the project's PhoneInput (i.e. ${phoneCode}${phone} concatenated).

Password strength rules (inline in PrivateKitPage):

const PASSWORD_MIN = 6;
const PASSWORD_UPPERCASE_REGEX = /[A-Z]/;
const PASSWORD_SPECIAL_REGEX = /[!@#$%^&*(),.?":{}|<>-]/;
const PASSWORD_NUMBER_REGEX = /[0-9]/;

A new password must be at least 6 characters and contain at least one uppercase letter, one digit and one special character. Rules are evaluated in order — only the first failing rule is reported back.

Verification codes are validated inline by PrivateKitPage:

const VERIFICATION_CODE_REGEX = /^\d+$/;
const VERIFICATION_CODE_MAX = 6;

A code must be ≤ 6 characters and consist of digits only.

Full TypeScript interfaces

interface InitMessage {
type: 'PRIVATE_KIT_INIT';
payload: { connectionId: string };
}

interface UpdateUsernameMessage {
type: 'PRIVATE_KIT_UPDATE_USERNAME';
payload: {
connectionId: string;
username: string;
authToken: string;
};
}

interface UsernameUpdatedMessage {
type: 'PRIVATE_KIT_USERNAME_UPDATED';
payload: {
connectionId: string;
username: string;
};
}

interface UsernameValidationErrorMessage {
type: 'PRIVATE_KIT_USERNAME_VALIDATION_ERROR';
payload: {
connectionId: string;
reason: USERNAME_VALIDATION_REASON;
message?: string;
};
}

interface UpdateEmailMessage {
type: 'PRIVATE_KIT_UPDATE_EMAIL';
payload: {
connectionId: string;
email: string;
authToken: string;
};
}

interface EmailUpdatedMessage {
type: 'PRIVATE_KIT_EMAIL_UPDATED';
payload: {
connectionId: string;
email: string;
};
}

interface EmailValidationErrorMessage {
type: 'PRIVATE_KIT_EMAIL_VALIDATION_ERROR';
payload: {
connectionId: string;
reason: EMAIL_VALIDATION_REASON;
message?: string;
};
}

interface ConfirmEmailMessage {
type: 'PRIVATE_KIT_CONFIRM_EMAIL';
payload: {
connectionId: string;
confirmationCode: string;
authToken: string;
};
}

interface EmailConfirmedMessage {
type: 'PRIVATE_KIT_EMAIL_CONFIRMED';
payload: {
connectionId: string;
email: string;
token: string;
refreshToken: string;
};
}

interface EmailConfirmationErrorMessage {
type: 'PRIVATE_KIT_EMAIL_CONFIRMATION_ERROR';
payload: {
connectionId: string;
reason: EMAIL_CONFIRMATION_REASON;
message?: string;
};
}

interface ResendEmailCodeMessage {
type: 'PRIVATE_KIT_RESEND_EMAIL_CODE';
payload: {
connectionId: string;
authToken: string;
};
}

interface EmailCodeResentMessage {
type: 'PRIVATE_KIT_EMAIL_CODE_RESENT';
payload: {
connectionId: string;
};
}

interface UpdatePhoneMessage {
type: 'PRIVATE_KIT_UPDATE_PHONE';
payload: {
connectionId: string;
phoneNumber: string;
authToken: string;
};
}

interface PhoneUpdatedMessage {
type: 'PRIVATE_KIT_PHONE_UPDATED';
payload: {
connectionId: string;
phoneNumber: string;
};
}

interface PhoneValidationErrorMessage {
type: 'PRIVATE_KIT_PHONE_VALIDATION_ERROR';
payload: {
connectionId: string;
reason: PHONE_VALIDATION_REASON;
message?: string;
};
}

interface ConfirmPhoneMessage {
type: 'PRIVATE_KIT_CONFIRM_PHONE';
payload: {
connectionId: string;
confirmationCode: string;
authToken: string;
};
}

interface PhoneConfirmedMessage {
type: 'PRIVATE_KIT_PHONE_CONFIRMED';
payload: {
connectionId: string;
phone: string;
token: string;
refreshToken: string;
};
}

interface PhoneConfirmationErrorMessage {
type: 'PRIVATE_KIT_PHONE_CONFIRMATION_ERROR';
payload: {
connectionId: string;
reason: PHONE_CONFIRMATION_REASON;
message?: string;
};
}

interface ResendPhoneCodeMessage {
type: 'PRIVATE_KIT_RESEND_PHONE_CODE';
payload: {
connectionId: string;
authToken: string;
};
}

interface PhoneCodeResentMessage {
type: 'PRIVATE_KIT_PHONE_CODE_RESENT';
payload: {
connectionId: string;
};
}

interface UpdatePasswordMessage {
type: 'PRIVATE_KIT_UPDATE_PASSWORD';
payload: {
connectionId: string;
currentPassword: string;
newPassword: string;
authToken: string;
};
}

interface PasswordUpdatedMessage {
type: 'PRIVATE_KIT_PASSWORD_UPDATED';
payload: {
connectionId: string;
};
}

interface PasswordValidationErrorMessage {
type: 'PRIVATE_KIT_PASSWORD_VALIDATION_ERROR';
payload: {
connectionId: string;
reason: PASSWORD_VALIDATION_REASON;
message?: string;
};
}

interface AuthToken401Message {
type: 'PRIVATE_KIT_AUTH_TOKEN_401';
payload: {
connectionId: string;
};
}

type PrivateKitMessage =
| InitMessage
| UpdateUsernameMessage
| UsernameUpdatedMessage
| UsernameValidationErrorMessage
| UpdateEmailMessage
| EmailUpdatedMessage
| EmailValidationErrorMessage
| ConfirmEmailMessage
| EmailConfirmedMessage
| EmailConfirmationErrorMessage
| ResendEmailCodeMessage
| EmailCodeResentMessage
| UpdatePhoneMessage
| PhoneUpdatedMessage
| PhoneValidationErrorMessage
| ConfirmPhoneMessage
| PhoneConfirmedMessage
| PhoneConfirmationErrorMessage
| ResendPhoneCodeMessage
| PhoneCodeResentMessage
| UpdatePasswordMessage
| PasswordUpdatedMessage
| PasswordValidationErrorMessage
| AuthToken401Message;

Backend endpoints used by the iframe

StepEndpointMethod
Resolve current user/private/api/v1/usersGET
Check whether username/email/phone is taken/private/api/v1/users/existsPOST
Persist new username/private/api/v1/users/{id}/setUsernamePOST
Persist new email (triggers verification)/private/api/v1/users/{id}/setEmailPOST
Persist new phone (triggers SMS)/private/api/v1/users/{id}/setPhonePOST
Confirm pending email or phone change/private/api/v1/verification/confirm/{id}POST
Re-send the email verification code/private/api/v1/verification/resendEmail/{id}POST
Re-send the phone verification code (SMS)/private/api/v1/verification/resendSms/{id}POST
Change password/private/api/v1/users/changePasswordPOST

All endpoints require Authorization: Bearer <authToken>. The iframe never persists the token — it only forwards what arrives in each action message.