npm package: @pragmr/baas-sdk
Description: React SDK
Author: Pragmr
Latest version: 1.2.2

# BaaS SDK

React SDK for pragmr_baas - Authentication and GraphQL client

## Installation

```bash
npm install @pragmr/baas-sdk
```

## Usage

### Create the unified client

```ts
import { UnifiedBaasClient } from './src/core/unified-client';

const client = new UnifiedBaasClient({
  baseUrl: 'http://127.0.0.1:8080',
  graphqlUrl: 'http://127.0.0.1:8080/graphql',
});

// After login, set the auth token
client.setToken('<JWT_TOKEN>');
```

---

## Ticket SDK (Core)

Basic ticket CRUD is already available:

```ts
// List project tickets
const tickets = await client.getProjectTickets(tenantProductID, projectID, {
  statusID,
  priorityID,
  assigneeID,
  trackerIDs: [trackerID],
  parentID,
  search: 'login bug',
});

// Get single ticket
const ticket = await client.getProjectTicket(ticketID);

// Create ticket
const created = await client.createProjectTicket({
  subject: 'My ticket',
  description: 'Details…',
  projectID,
  trackerID,
  tenantProductID,
});

// Update ticket (optionally with notes)
const updated = await client.updateProjectTicket({
  id: ticketID,
  subject: 'Updated subject',
  description: 'Updated description',
  notes: 'This note will be added to the ticket journal',
});

// Delete ticket
await client.deleteProjectTicket(ticketID, tenantProductID, projectID);
```

---

## Ticket Time Logs & Timers

### Get time logs for a ticket

```ts
const { timeLogs, totalDuration } = await client.getTicketTimeLogs(ticketID);

console.log('Total time spent:', totalDuration);
timeLogs.forEach((log) => {
  console.log(log.startTime, log.endTime, log.duration);
});
```

### Get active timers

```ts
// All active timers for the current user in the token
const timers = await client.getActiveTimers();

// Or explicitly for a user/tenantUser ID
const timersForUser = await client.getActiveTimers(userID);
```

### Start / Stop timer on a ticket

```ts
// Start timer
const startResult = await client.startTicketTimer(ticketID);
console.log('Started timer log:', startResult.timeLog);
console.log('Ticket after start:', startResult.ticket);

// Stop timer
const stopResult = await client.stopTicketTimer(ticketID);
console.log('Stopped timer log:', stopResult.timeLog);
console.log('Ticket after stop:', stopResult.ticket);
```

---

## Ticket Notes

### List notes

```ts
const notes = await client.getTicketNotes(ticketID);

notes.forEach((note) => {
  console.log(note.author, note.content, note.createdAt);
});
```

### Create a note

```ts
const note = await client.createTicketNote({
  ticketID,
  content: 'This is a new note added from the SDK',
});
```

### Update a note

```ts
const updatedNote = await client.updateTicketNote({
  id: noteID,
  content: 'Updated note content',
});
```

### Delete a note

```ts
await client.deleteTicketNote(noteID);
```

---

## Ticket Relations

### List relations for a ticket

```ts
const relations = await client.getTicketRelations(ticketID);

relations.forEach((rel) => {
  console.log(rel.relationType, rel.ticketID, rel.relatedID);
});
```

### Create a relation

```ts
const relation = await client.createTicketRelation({
  ticketID,              // current ticket ID
  relatedTicketNumber: 123, // human ticket number (not UUID)
  relationType: 'relates', // e.g. 'relates', 'blocks', etc.
  tenantProductID,
  tenantID,
  projectID,
});
```

### Delete a relation

```ts
await client.deleteTicketRelation(relationID);
```

---

## React Hook: `useTickets`

If you are using the React integration, the same functionality is exposed via the `useTickets` hook:

```ts
import { useTickets } from './src/modules/project-management/tickets';

function TicketExample({ ticketID, tenantProductID, projectID }: Props) {
  const {
    getProjectTickets,
    getProjectTicket,
    createProjectTicket,
    updateProjectTicket,
    deleteProjectTicket,
    getTicketTimeLogs,
    getActiveTimers,
    startTicketTimer,
    stopTicketTimer,
    getTicketNotes,
    createTicketNote,
    updateTicketNote,
    deleteTicketNote,
    getTicketRelations,
    createTicketRelation,
    deleteTicketRelation,
  } = useTickets();

  // You can call the same methods here inside effects, callbacks, etc.
}
```