Skip to main content

Documentation Index

Fetch the complete documentation index at: https://usegately.com/docs/llms.txt

Use this file to discover all available pages before exploring further.

Basic Login

const { user, session } = await gately.login(email, password)

Parameters

ParameterTypeRequiredDescription
emailstringYesUser’s email address
passwordstringYesUser’s password

Response

interface AuthResponse {
  user: User
  session: Session
}

interface User {
  id: string
  email: string
  full_name: string | null
  avatar_url: string | null
  plan_id: string
  status: string
  metadata: Record<string, any>
  created_at: string
}

interface Session {
  access_token: string
  refresh_token: string
  expires_at: number
  user: User
}

Example

import { GatelyClient } from '@gately/sdk'

const gately = new GatelyClient('YOUR_PROJECT_ID')

async function handleLogin(email, password) {
  try {
    const { user, session } = await gately.login(email, password)
    
    console.log('Logged in as:', user.email)
    console.log('Session expires:', new Date(session.expires_at))
    
    // Redirect to dashboard
    window.location.href = '/dashboard'
  } catch (error) {
    console.error('Login failed:', error.message)
    // Handle error (show message to user)
  }
}

React Hook

import { useGately } from '@gately/sdk'

function LoginForm() {
  const { login } = useGately()
  const [email, setEmail] = useState('')
  const [password, setPassword] = useState('')
  const [error, setError] = useState('')

  const handleSubmit = async (e) => {
    e.preventDefault()
    try {
      await login(email, password)
      // Redirect handled automatically or manually
    } catch (err) {
      setError(err.message)
    }
  }

  return (
    <form onSubmit={handleSubmit}>
      {error && <p className="error">{error}</p>}
      <input 
        type="email" 
        value={email} 
        onChange={(e) => setEmail(e.target.value)} 
        placeholder="Email"
      />
      <input 
        type="password" 
        value={password} 
        onChange={(e) => setPassword(e.target.value)} 
        placeholder="Password"
      />
      <button type="submit">Log In</button>
    </form>
  )
}

Error Handling

Common errors:
ErrorDescription
Invalid email formatEmail doesn’t match expected format
Password is requiredPassword field is empty
Invalid credentialsEmail or password is incorrect
Account not foundNo account with this email
Account disabledAccount has been deactivated
try {
  await gately.login(email, password)
} catch (error) {
  switch (error.code) {
    case 'INVALID_CREDENTIALS':
      showError('Invalid email or password')
      break
    case 'ACCOUNT_DISABLED':
      showError('Your account has been disabled')
      break
    default:
      showError('Login failed. Please try again.')
  }
}

Session Management

After login, the session is automatically:
  • Stored in localStorage
  • Set as cookies for cross-origin requests
  • Refreshed before expiry (if autoRefresh is enabled)
// Check if logged in
if (gately.isAuthenticated()) {
  const user = gately.getUser()
  const session = gately.getSession()
}

// Listen for auth changes
gately.onAuthStateChange((user, session) => {
  if (user) {
    console.log('User logged in:', user.email)
  } else {
    console.log('User logged out')
  }
})

Redirect After Login

Configure automatic redirects:
// In project settings or via SDK
await gately.login(email, password)
// SDK checks redirect rules and redirects automatically
Or handle manually:
const { user } = await gately.login(email, password)

// Redirect based on plan
if (user.plan_id === 'pro') {
  window.location.href = '/pro-dashboard'
} else {
  window.location.href = '/dashboard'
}