Home / Function/ ProfileInformation() — supabase Function Reference

ProfileInformation() — supabase Function Reference

Architecture documentation for the ProfileInformation() function in ProfileInformation.tsx from the supabase codebase.

Entity Profile

Relationship Graph

Source Code

apps/studio/components/interfaces/Account/Preferences/ProfileInformation.tsx lines 44–216

export const ProfileInformation = () => {
  const { profile } = useProfile()

  const {
    data: identityData,
    isPending: isIdentitiesLoading,
    isSuccess: isIdentitiesSuccess,
  } = useProfileIdentitiesQuery()
  const identities = (identityData?.identities ?? []).filter((x) => x.identity_data?.email !== null)
  const dedupedIdentityEmails = Object.keys(groupBy(identities, 'identity_data.email'))

  const defaultValues = {
    first_name: profile?.first_name ?? '',
    last_name: profile?.last_name ?? '',
    username: profile?.username ?? '',
    primary_email: profile?.primary_email ?? '',
  }

  const form = useForm({
    resolver: zodResolver(FormSchema),
    defaultValues,
    values: defaultValues,
  })

  const { mutate: updateProfile, isPending: isUpdatingProfile } = useProfileUpdateMutation({
    onSuccess: (data) => {
      toast.success('Successfully saved profile')
      const { first_name, last_name, username, primary_email } = data
      form.reset({
        first_name: first_name ?? undefined,
        last_name: last_name ?? undefined,
        username,
        primary_email,
      })
    },
    onError: (error) => toast.error(`Failed to update profile: ${error.message}`),
  })

  const onSubmit: SubmitHandler<z.infer<typeof FormSchema>> = async (data) => {
    updateProfile({
      firstName: data.first_name || '',
      lastName: data.last_name || '',
      username: data.username || '',
      primaryEmail: data.primary_email || '',
    })
  }

  return (
    <PageSection>
      <PageSectionMeta>
        <PageSectionSummary>
          <PageSectionTitle>Profile information</PageSectionTitle>
        </PageSectionSummary>
      </PageSectionMeta>
      <PageSectionContent>
        <Form_Shadcn_ {...form}>
          <form id={formId} className="space-y-6 w-full" onSubmit={form.handleSubmit(onSubmit)}>
            <Card>
              <CardContent>
                <FormField_Shadcn_
                  control={form.control}
                  name="first_name"
                  render={({ field }) => (
                    <FormItemLayout label="First name" layout="flex-row-reverse">
                      <FormControl_Shadcn_ className="col-span-8">
                        <Input_Shadcn_ {...field} placeholder="First name" className="w-full" />
                      </FormControl_Shadcn_>
                    </FormItemLayout>
                  )}
                />
              </CardContent>
              <CardContent>
                <FormField_Shadcn_
                  control={form.control}
                  name="last_name"
                  render={({ field }) => (
                    <FormItemLayout label="Last name" layout="flex-row-reverse">
                      <FormControl_Shadcn_ className="col-span-8">
                        <Input_Shadcn_ {...field} placeholder="Last name" className="w-full" />
                      </FormControl_Shadcn_>
                    </FormItemLayout>
                  )}
                />
              </CardContent>
              <CardContent>
                <FormField_Shadcn_
                  control={form.control}
                  name="primary_email"
                  render={({ field }) => (
                    <FormItemLayout
                      label="Primary email"
                      description={
                        profile?.is_sso_user
                          ? 'Primary email is managed by your SSO provider and cannot be changed here.'
                          : 'Primary email is used for account notifications.'
                      }
                      layout="flex-row-reverse"
                    >
                      <FormControl_Shadcn_ className="col-span-8">
                        <div className="flex flex-col gap-1">
                          <Select_Shadcn_
                            value={field.value}
                            onValueChange={field.onChange}
                            disabled={profile?.is_sso_user}
                          >
                            <SelectTrigger_Shadcn_ className="col-span-8 w-full">
                              <SelectValue_Shadcn_ placeholder="Select primary email" />
                            </SelectTrigger_Shadcn_>
                            <SelectContent_Shadcn_ className="col-span-8">
                              {isIdentitiesSuccess &&
                                dedupedIdentityEmails.map((email) => (
                                  <SelectItem_Shadcn_ key={email} value={email}>
                                    {email}
                                  </SelectItem_Shadcn_>
                                ))}
                            </SelectContent_Shadcn_>
                          </Select_Shadcn_>
                        </div>
                      </FormControl_Shadcn_>
                    </FormItemLayout>
                  )}
                />
              </CardContent>
              <CardContent>
                <FormField_Shadcn_
                  control={form.control}
                  name="username"
                  render={({ field }) => (
                    <FormItemLayout
                      label="Username"
                      description={
                        profile?.is_sso_user
                          ? 'Username is managed by your SSO provider and cannot be changed here.'
                          : 'Username appears as a display name throughout the dashboard.'
                      }
                      layout="flex-row-reverse"
                    >
                      <FormControl_Shadcn_ className="col-span-8">
                        <div className="flex flex-col gap-1">
                          <Input_Shadcn_
                            {...field}
                            className="w-full"
                            placeholder="Username"
                            disabled={profile?.is_sso_user}
                          />
                        </div>
                      </FormControl_Shadcn_>
                    </FormItemLayout>
                  )}
                />
              </CardContent>
              <CardFooter className="justify-end space-x-2">
                {form.formState.isDirty && (
                  <Button type="default" onClick={() => form.reset()}>
                    Cancel
                  </Button>
                )}
                <Button
                  type="primary"
                  htmlType="submit"
                  loading={isUpdatingProfile || isIdentitiesLoading}
                  disabled={!form.formState.isDirty}
                >
                  Save
                </Button>
              </CardFooter>
            </Card>
          </form>
        </Form_Shadcn_>
      </PageSectionContent>
    </PageSection>
  )
}

Subdomains

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free