npm package: @rorez/mobile-expo-sdk
Description: SDK for connecting Expo apps to the Next.js API server
Latest version: 1.0.1

# mobile-expo-sdk

SDK for connecting Expo/React Native apps to the Next.js API server.

## Installation

```bash
# Using npm
npm install mobile-expo-sdk

# Using bun
bun add mobile-expo-sdk

# Required peer dependency for React Native
npm install @react-native-async-storage/async-storage
```

## Quick Start

```typescript
import { createClient, AuthProvider } from 'mobile-expo-sdk';

// Create client instance
const client = createClient({
  baseUrl: 'http://localhost:3000', // Your Next.js server URL
});

// Wrap your app with AuthProvider
function App() {
  return (
    <AuthProvider client={client}>
      <YourApp />
    </AuthProvider>
  );
}
```

## Usage

### Authentication

```typescript
import { useAuth } from 'mobile-expo-sdk';

function LoginScreen() {
  const { login, register, logout, user, isAuthenticated, isLoading } = useAuth();

  const handleLogin = async () => {
    try {
      await login('user@example.com', 'password123');
    } catch (error) {
      console.error('Login failed:', error.message);
    }
  };

  const handleRegister = async () => {
    try {
      await register('user@example.com', 'password123', 'John Doe');
    } catch (error) {
      console.error('Registration failed:', error.message);
    }
  };

  if (isLoading) return <Text>Loading...</Text>;

  return isAuthenticated ? (
    <View>
      <Text>Welcome, {user.name}!</Text>
      <Button onPress={logout} title="Logout" />
    </View>
  ) : (
    <View>
      <Button onPress={handleLogin} title="Login" />
      <Button onPress={handleRegister} title="Register" />
    </View>
  );
}
```

### Posts

```typescript
import { usePosts } from 'mobile-expo-sdk';

function PostsScreen({ client }) {
  const { posts, isLoading, error, createPost, deletePost, refresh } = usePosts(client);

  const handleCreate = async () => {
    await createPost({ title: 'New Post', content: 'Hello World!' });
  };

  if (isLoading) return <Text>Loading...</Text>;
  if (error) return <Text>Error: {error}</Text>;

  return (
    <FlatList
      data={posts}
      renderItem={({ item }) => (
        <View>
          <Text>{item.title}</Text>
          <Button onPress={() => deletePost(item.id)} title="Delete" />
        </View>
      )}
    />
  );
}
```

### Direct API Client Usage

```typescript
import { createClient } from 'mobile-expo-sdk';

const client = createClient({ baseUrl: 'http://localhost:3000' });

// Auth
await client.register({ email: 'test@example.com', password: 'pass123', name: 'Test' });
await client.login({ email: 'test@example.com', password: 'pass123' });
const user = await client.getMe();
await client.logout();

// Posts
const posts = await client.getPosts();
const post = await client.createPost({ title: 'Hello', content: 'World' });
await client.updatePost(post.id, { title: 'Updated Title' });
await client.deletePost(post.id);
```

## API Reference

### `createClient(config)`
Creates a new API client instance.

### `AuthProvider`
React context provider for auth state.

### `useAuth()`
Hook for auth state and methods: `user`, `isAuthenticated`, `isLoading`, `login`, `register`, `logout`.

### `usePosts(client)`
Hook for fetching and managing posts.

### `usePost(client, id)`
Hook for fetching a single post.