Skip to content
On this page

React Development ​

Below are examples how one can develop frontend LMS application using Reacy

Extending demo ​

This is a preferred way of developing your app, if you're new to Wellms.

  1. Clone repository git clone git@github.com:EscolaLMS/Front.git
  2. Copy .env.example to .env and set API_URL that point to REST API
  3. Install dependencies npm i or yarn or equivalent
  4. Start local instance npm run dev

Using only SDK and/or Components ​

  1. Create you react app
  2. Install @escolalms/ts-models @escolalms/components @escolalms/sdk
bash
npm i @escolalms/ts-models @escolalms/components @escolalms/sdk
  1. Wrap you Application in SDK and Theme Context
tsx
import React from "react";
import ReactDOM from "react-dom/client";
import { EscolaLMSContextProvider } from "@escolalms/sdk/lib/react/context";
import { GlobalThemeProvider } from "@escolalms/components/lib/theme/provider";
import App from "./App";
import WebFont from "webfontloader";

declare global {
  interface Window {
    REACT_APP_API_URL: string;
  }
}

const API_URL =
  window.REACT_APP_API_URL ||
  (process && process.env && process.env.REACT_APP_PUBLIC_API_URL);

ReactDOM.createRoot(document.getElementById("root") as Element).render(
  <React.StrictMode>
    {API_URL ? (
      <EscolaLMSContextProvider apiUrl={API_URL}>
        <GlobalThemeProvider>
          <App />
        </GlobalThemeProvider>
      </EscolaLMSContextProvider>
    ) : (
      <pre>
        error `process.env.REACT_APP_PUBLIC_API_URL || window.REACT_APP_API_URL`
        not set
      </pre>
    )}
  </React.StrictMode>
);

Then consume SDK in your application, see TypeDoc

example of how to use SDK

tsx
import { EscolaLMSContext } from "@escolalms/sdk/lib/react";
import { useContext } from "react";
import { Button, Spin } from "../../../";

const Authbtn = () => {
  const { login, user } = useContext(EscolaLMSContext);
  return (
    <Button
      mode="secondary"
      onClick={() => {
        login({ email: "student@escola-lms.com", password: "secret" });
      }}
    >
      {user.loading && <Spin />}
      authorize to see component
    </Button>
  );
};

export default Authbtn;

Provide a theme definitions or copy colors from one of the themes

Next.js ​

In order of SSR and using our sdk context you need to populate SDK context with default data like in the example below.

tsx
import type { NextPage } from "next";
import { EscolaLMSContextProvider } from "@escolalms/sdk/lib/react/context/index";
import { EscolaLMSContextReadConfig } from "@escolalms/sdk/lib/react/context/types";
import { getCourse } from "@escolalms/sdk/lib/services/courses";
import { interceptors } from "@escolalms/sdk/lib/services/request";
import * as API from "@escolalms/sdk/lib/types/api";

import { GetServerSideProps, GetServerSidePropsResult } from "next";

import { API_URL } from "src/const";
import CoursePage from "src/components/Pages/Course";

type ResultProps = {
  defaults: {} | API.DefaultResponse<API.Course>;
};

export const getServerSideProps: GetServerSideProps = async ({
  params,
}): Promise<GetServerSidePropsResult<ResultProps>> => {
  interceptors(API_URL);

  if (params && params.id) {
    try {
      const res: API.DefaultResponse<API.Course> = await getCourse(
        Number(params.id)
      );

      if (res.success) {
        return {
          props: {
            defaults: {
              course: {
                loading: false,
                value: res.data,
              },
            },
          },
        };
      }
      // Catch clause variable type annotation must be 'any' or 'unknown' if specified.
    } catch (error: any) {
      console.log(error);
      return {
        props: {
          defaults: {
            course: {
              loading: false,
              error: error.data.error,
            },
          },
        },
      };
    }
  }

  return {
    props: {
      defaults: {},
    },
  };
};

const Course: NextPage<{ defaults?: Partial<EscolaLMSContextReadConfig> }> = ({
  defaults,
}) => {
  return (
    <EscolaLMSContextProvider apiUrl={API_URL} defaults={defaults}>
      <CoursePage />
    </EscolaLMSContextProvider>
  );
};

export default Course;