GuidesComponentsAuth ComponentsRegistrationexamples

Pre-filled Data

Learn how to handle registration with pre-existing data and partial user information.

  • Stable unknown
  • Release candidate since 1.16.1-rc.3
  • Development since 1.16.1-dev.2111+9796905

Learn how to handle registration with pre-existing data and partial user information.

Basic Pre-filled Registration

Use default values to pre-populate form fields:

import React from "react";
import { View, Text } from "react-native";
import { Register } from "@ovok/native";

export const PreFilledRegistration = () => {
  const existingUserData = {
    name: "John",
    surname: "Doe",
    email: "john.doe@example.com",
  };

  return (
    <Register>
      <Register.Header>
        <Register.Header.Title>
          Complete Your Registration
        </Register.Header.Title>
        <Register.Header.Description>
          Just add a password to finish setting up your account
        </Register.Header.Description>
      </Register.Header>

      <Register.EmailForm
        defaultValues={existingUserData}
        tenantCode="your-tenant-code"
        onSuccess={(response) =>
          console.log("Registration completed:", response)
        }
        onError={(error) => console.error("Registration failed:", error)}
      >
        {/* Only password fields will be shown since other fields are pre-filled */}
        <Register.EmailForm.Inputs />
        <Register.EmailForm.RegisterButton />
      </Register.EmailForm>
    </Register>
  );
};

Social Login Flow

Handle registration after social authentication:

import React from "react";
import { Register } from "@ovok/native";

export const SocialRegistrationCompletion = () => {
  // Data received from social login (Google, Apple, etc.)
  const socialUserData = {
    name: "Jane",
    surname: "Smith",
    email: "jane.smith@gmail.com",
    // No password needed for social login
    password: "social_auth_token",
  };

  return (
    <Register>
      <Register.Header>
        <Register.Header.Title>Welcome, Jane!</Register.Header.Title>
        <Register.Header.Description>
          Your account has been created successfully
        </Register.Header.Description>
      </Register.Header>

      <Register.EmailForm
        defaultValues={socialUserData}
        tenantCode="your-tenant-code"
        onSuccess={(response) => {
          console.log("Social registration completed:", response);
          // Navigate to dashboard
        }}
        onError={(error) => console.error("Error:", error)}
      >
        {/* No input fields will be shown since all required data is provided */}
        <Register.EmailForm.Inputs />

        {/* Show completion message or additional setup options */}
        <View style={{ padding: 20, alignItems: "center" }}>
          <Text>Your account is ready to use!</Text>
        </View>

        <Register.EmailForm.RegisterButton />
      </Register.EmailForm>
    </Register>
  );
};

Partial Data Flow

Handle cases where only some information is available:

import React from "react";
import { Register } from "@ovok/native";

export const PartialDataRegistration = () => {
  // Email from invitation or previous step
  const partialData = {
    email: "invited.user@company.com",
  };

  return (
    <Register>
      <Register.Header>
        <Register.Header.Title>Complete Your Profile</Register.Header.Title>
        <Register.Header.Description>
          Please provide your details to finish registration
        </Register.Header.Description>
      </Register.Header>

      <Register.EmailForm
        defaultValues={partialData}
        tenantCode="your-tenant-code"
        onSuccess={(response) => console.log("Profile completed:", response)}
        onError={(error) => console.error("Error:", error)}
      >
        {/* Email field will be hidden, name/surname/password fields will show */}
        <Register.EmailForm.Inputs />
        <Register.EmailForm.RegisterButton />
      </Register.EmailForm>
    </Register>
  );
};

Dynamic Data Loading

Load user data asynchronously and pre-fill the form:

import React, { useState, useEffect } from "react";
import { Register } from "@ovok/native";
import { ActivityIndicator, View } from "react-native";

export const DynamicPreFilledRegistration = ({
  userId,
}: {
  userId: string;
}) => {
  const [userData, setUserData] = useState(null);
  const [loading, setLoading] = useState(true);

  useEffect(() => {
    const loadUserData = async () => {
      try {
        // Fetch user data from API
        const response = await fetch(`/api/users/${userId}/profile`);
        const data = await response.json();

        setUserData({
          name: data.firstName,
          surname: data.lastName,
          email: data.emailAddress,
        });
      } catch (error) {
        console.error("Failed to load user data:", error);
        setUserData({}); // Empty object to show all fields
      } finally {
        setLoading(false);
      }
    };

    loadUserData();
  }, [userId]);

  if (loading) {
    return (
      <View style={{ flex: 1, justifyContent: "center", alignItems: "center" }}>
        <ActivityIndicator size="large" />
      </View>
    );
  }

  return (
    <Register>
      <Register.Header>
        <Register.Header.Title>Update Your Information</Register.Header.Title>
        <Register.Header.Description>
          Please verify and complete your details
        </Register.Header.Description>
      </Register.Header>

      <Register.EmailForm
        defaultValues={userData}
        tenantCode="your-tenant-code"
        onSuccess={(response) => console.log("Updated successfully:", response)}
        onError={(error) => console.error("Update failed:", error)}
      >
        <Register.EmailForm.Inputs />
        <Register.EmailForm.RegisterButton />
      </Register.EmailForm>
    </Register>
  );
};

Password-only Registration

For cases where only password is needed:

import React from "react";
import { Register } from "@ovok/native";

export const PasswordOnlyRegistration = () => {
  const completeUserData = {
    name: "Michael",
    surname: "Johnson",
    email: "michael.johnson@company.com",
  };

  return (
    <Register>
      <Register.Header>
        <Register.Header.Title>Set Your Password</Register.Header.Title>
        <Register.Header.Description>
          Create a secure password for your account: {completeUserData.email}
        </Register.Header.Description>
      </Register.Header>

      <Register.EmailForm
        defaultValues={completeUserData}
        tenantCode="your-tenant-code"
        onSuccess={(response) => console.log("Password set:", response)}
        onError={(error) => console.error("Error:", error)}
      >
        {/* Only password and password confirmation fields will show */}
        <Register.EmailForm.Inputs />
        <Register.EmailForm.Spacing percentage={2} />
        <Register.EmailForm.RegisterButton />
      </Register.EmailForm>
    </Register>
  );
};

Editable Pre-filled Data

Allow users to edit pre-filled information:

import React, { useState } from "react";
import { Register } from "@ovok/native";
import { View, TouchableOpacity, Text } from "react-native";

export const EditablePreFilledRegistration = () => {
  const [allowEdit, setAllowEdit] = useState(false);

  const defaultData = {
    name: "Sarah",
    surname: "Wilson",
    email: "sarah.wilson@email.com",
  };

  // Don't pass defaultValues if editing is allowed
  const formDefaultValues = allowEdit ? {} : defaultData;

  return (
    <Register>
      <Register.Header>
        <Register.Header.Title>Confirm Your Details</Register.Header.Title>
        <Register.Header.Description>
          Review your information and set a password
        </Register.Header.Description>
      </Register.Header>

      {!allowEdit && (
        <View
          style={{ padding: 16, backgroundColor: "#F5F5F5", borderRadius: 8 }}
        >
          <Text style={{ fontSize: 16, marginBottom: 8 }}>
            Your Information:
          </Text>
          <Text>
            Name: {defaultData.name} {defaultData.surname}
          </Text>
          <Text>Email: {defaultData.email}</Text>

          <TouchableOpacity
            onPress={() => setAllowEdit(true)}
            style={{ marginTop: 12 }}
          >
            <Text style={{ color: "#007AFF", fontWeight: "600" }}>
              Edit Information
            </Text>
          </TouchableOpacity>
        </View>
      )}

      <Register.EmailForm
        defaultValues={formDefaultValues}
        tenantCode="your-tenant-code"
        onSuccess={(response) =>
          console.log("Registration completed:", response)
        }
        onError={(error) => console.error("Error:", error)}
      >
        <Register.EmailForm.Inputs />
        <Register.EmailForm.RegisterButton />
      </Register.EmailForm>
    </Register>
  );
};

Form State Management

Handle complex pre-filled data scenarios:

import React, { useMemo } from "react";
import { Register } from "@ovok/native";

interface UserProfile {
  firstName?: string;
  lastName?: string;
  emailAddress?: string;
  hasPassword?: boolean;
}

export const StateBasedRegistration = ({
  profile,
}: {
  profile: UserProfile;
}) => {
  const defaultValues = useMemo(() => {
    const values: any = {};

    if (profile.firstName) values.name = profile.firstName;
    if (profile.lastName) values.surname = profile.lastName;
    if (profile.emailAddress) values.email = profile.emailAddress;

    // If user already has a password, don't require password confirmation
    if (profile.hasPassword) {
      values.password = "existing_password";
      values.passwordConfirm = "existing_password";
    }

    return values;
  }, [profile]);

  const getHeaderContent = () => {
    const missingFields = [];
    if (!profile.firstName) missingFields.push("name");
    if (!profile.lastName) missingFields.push("surname");
    if (!profile.emailAddress) missingFields.push("email");
    if (!profile.hasPassword) missingFields.push("password");

    if (missingFields.length === 0) {
      return {
        title: "Welcome Back!",
        description: "Your account is ready to use.",
      };
    }

    return {
      title: "Complete Your Profile",
      description: `Please provide your ${missingFields.join(", ")} to continue.`,
    };
  };

  const headerContent = getHeaderContent();

  return (
    <Register>
      <Register.Header>
        <Register.Header.Title>{headerContent.title}</Register.Header.Title>
        <Register.Header.Description>
          {headerContent.description}
        </Register.Header.Description>
      </Register.Header>

      <Register.EmailForm
        defaultValues={defaultValues}
        tenantCode="your-tenant-code"
        onSuccess={(response) => console.log("Profile updated:", response)}
        onError={(error) => console.error("Error:", error)}
      >
        <Register.EmailForm.Inputs />
        <Register.EmailForm.RegisterButton />
      </Register.EmailForm>
    </Register>
  );
};

Features

  • Conditional Fields: Fields are automatically hidden when default values are provided
  • Flexible Data: Support for partial, complete, or dynamic data
  • Social Integration: Handle social login data seamlessly
  • State Management: Complex logic for different user states
  • Validation: Maintains validation rules even with pre-filled data
  • User Experience: Smooth flow for different registration scenarios

Field Visibility Rules

Default Value ProvidedField Visibility
nameName field hidden
surnameSurname field hidden
emailEmail field hidden
passwordPassword field hidden
passwordConfirm OR passwordPassword confirmation hidden

Best Practices

  1. Clear Communication: Tell users why fields are pre-filled
  2. Edit Options: Allow users to modify pre-filled data when appropriate
  3. Validation: Maintain proper validation even with default values
  4. Loading States: Show loading indicators when fetching data
  5. Error Handling: Handle cases where data loading fails
  6. Security: Don't pre-fill sensitive data inappropriately

Next Steps

Last updated on

On this page