# one-profile-core

Core package for one profile application

## Installation

yarn

```shell
yarn add @one-profile/core
```

npm

```shell
npm install @one-profile/core
```

## APIs

### oneProfileSetup

`oneProfileSetup` is the bootstrap API that will help you to expose your application/parcel to OneProfile ecosystem

```typescript jsx
import React from "react";
import Root from "./root.component";
import { oneProfileSetup } from "@one-profile/core";

const profileSetup = oneProfileSetup(Root);
export const { bootstrap, mount, unmount, config } = profileSetup;
```

#### arguments

`rootComponent: React.FunctionComponent<any>`

React root functional component that is mounted into OneProfile

`config: OneProfileSetupConfig` (optional)

- `activationFn: Promise<boolean>` A function that decides whether to activate the current application. Expected to return a promise of boolean to be used in one profile initialisation.
  Function accepts `accessToken` and current user's oauth `claim` details

```typescript
import {UserClaims} from "@okta/okta-auth-js";
import {User} from "@one-profile/core";

function activateProfile(accessToken, currentUser: User & UserClaims) {
  return new Promise<boolean>((resolve) =>
    makeSomeExternalCall(accessToken, currentUser).then((result) => {
      if (result == "success" && currentUser.homeOffice.countryIsoCode == "IND") {
        resolve(true);
      } else {
        resolve(false);
      }
    })
  );
}

//...
//...
//some business logic in between
//...
//...
const profileSetup = oneProfileSetup(Root, {
  activationFn: activateProfile,
});
```

## External APIs

### users.getMe

`users.getMe` is the users API that will expose current logged-in user

```typescript jsx
import React from "react";
import { oneProfileSetup, users } from "@one-profile/core";

function someFunctionRequireCurrentUser(){
  // get access token either using context or props from root component
  users.getMe(accessToken).then((user:User) => { 
    // user data
  });
}
```

#### arguments

`accessToken` (required)

accessToken used to authorise the getUser API request

#### response

`User`

```typescript
{
  name: string;
  email: string;
  grade: {
    name: string;
  }
  role: {
    name: string;
  }
  department: {
    id: string;
    name: string;
  }
  homeOffice: {
    name: string;
    countryIsoCode: string;
    country: string;
    locationCode: string;
  }
  workingOffice: {
    name: string;
    countryIsoCode: string;
    country: string;
    locationCode: string;
  };
}
```

`error data` (refer [ResponseError](#error-handling))

```typescript
{
  message: string;
}
```

### Error Handling

#### responseError

Response Error is thrown which can be caught in the API's promise catch mechanism

Usage:

```typescript
import { ResponseError } from "@one-profile/core";

api.then(console.log).catch((error: ResponseError) => {
  if (error.status == 404) {
    //404 or 500
    console.log(error.data);
  }
});
```


### Jest Setup

Make sure you include the following line in jest setup. Make sure you install `regenerator-runtime` package 

```typescript
import 'regenerator-runtime/runtime';
```
