React и Preact

React и Preact

@orria/tapok/react и @orria/tapok/preact реэкспортируют Tapok и createTapokConnect. SDK не добавляет собственные hooks или UI-компоненты: состояние хранится средствами приложения.

Hosted

import { useState } from 'react'
import { Tapok } from '@orria/tapok/react'
// Для Preact: useState из preact/hooks и @orria/tapok/preact

const tapok = new Tapok()

function LoginButton() {
  const [pending, setPending] = useState(false)

  async function login() {
    setPending(true)
    try {
      const result = await tapok.login()
      // Псевдокод: backend проверяет Hosted token и ставит HttpOnly cookie.
      await api.createSession({ token: result.token })
    } finally {
      setPending(false)
    }
  }

  return <button onClick={login} disabled={pending}>Войти через Tapok</button>
}

login() вызывается непосредственно из onClick, иначе браузер может заблокировать popup.

Connect

import { useEffect } from 'react'
import { createTapokConnect } from '@orria/tapok/react'

const connect = createTapokConnect({
  clientId: 'tapok_…',
  redirectUri: 'https://app.example/auth/callback',
  scopes: ['session', 'profile:display_name'],
})

function ConnectLoginButton() {
  return <button onClick={() => connect.startSignIn()}>Войти</button>
}

function ConnectCallbackPage() {
  useEffect(() => {
    const callback = connect.finishSignIn()
    if (callback) api.exchangeConnectCode(callback) // собственный backend
  }, [])

  return <p>Завершаем вход…</p>
}

Для Preact меняются только импорты React/Preact; API Tapok остаётся тем же.