diff --git a/.env b/.env index 82459073..58c47991 100644 --- a/.env +++ b/.env @@ -29,5 +29,4 @@ SUPPORT_URL_VERIFIED_CERTIFICATE=null TWITTER_HASHTAG=null TWITTER_URL=null USER_INFO_COOKIE_NAME=null -NEXBLOCK_INSTANCE_DATA_API_PATH=null -NEXBLOCK_LEARNER_DATA_API_PATH=null +NEXBLOCK_API_PATH=null diff --git a/src/index.jsx b/src/index.jsx index 2ccb189c..468f2def 100755 --- a/src/index.jsx +++ b/src/index.jsx @@ -96,8 +96,7 @@ initialize({ SUPPORT_URL_VERIFIED_CERTIFICATE: process.env.SUPPORT_URL_VERIFIED_CERTIFICATE || null, TWITTER_HASHTAG: process.env.TWITTER_HASHTAG || null, TWITTER_URL: process.env.TWITTER_URL || null, - NEXBLOCK_INSTANCE_DATA_API_PATH: process.env.NEXBLOCK_INSTANCE_DATA_API_PATH || null, - NEXBLOCK_LEARNER_DATA_API_PATH: process.env.NEXBLOCK_LEARNER_DATA_API_PATH || null, + NEXBLOCK_API_PATH: process.env.NEXBLOCK_API_PATH || null, }, 'LearnerAppConfig'); }, }, diff --git a/src/nexblocks/NexBlockContainer.jsx b/src/nex-runtime/NexContainer.jsx similarity index 100% rename from src/nexblocks/NexBlockContainer.jsx rename to src/nex-runtime/NexContainer.jsx diff --git a/src/nex-runtime/NexLmsApiProvider.js b/src/nex-runtime/NexLmsApiProvider.js new file mode 100644 index 00000000..8da58c44 --- /dev/null +++ b/src/nex-runtime/NexLmsApiProvider.js @@ -0,0 +1,31 @@ +import { getConfig } from '@edx/frontend-platform'; +import { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth'; +import { NexApiProvider } from '../NexBases'; + +export default class NexLmsApiProvider extends NexApiProvider { + + constructor(instanceKey, learningContextKey) { + super(instanceKey, learningContextKey); + this.client = getAuthenticatedHttpClient(); + const apiRoot = getConfig().NEXBLOCK_API_PATH; + this.instanceRoot = `${this.apiPath}/instances/${this.instanceKey}`; + this.contextRoot = `${this.instanceRoot}/contexts/${this.learningContextKey}`; + } + + async fetchInstanceData(key) { + const theKey = key ?? ''; + const url = `${this.instanceRoot}/data/${theKey}`; + return this.client.get(url); + } + + async fetchLearnerData(key) { + const url = `${this.contextRoot}/data/${key}`; + return this.client.get(url); + } + + async emitLearnerEvent(key) { + const url = `${this.contextRoot}/events`; + return this.client.post(url); + } + +} diff --git a/src/nex/NexBases.js b/src/nex/NexBases.js new file mode 100644 index 00000000..832668d9 --- /dev/null +++ b/src/nex/NexBases.js @@ -0,0 +1,61 @@ + + +function renderFallbackAuthoringUiTo(nexBlock, element) { + throw new Error("renderFallbackAuthoringUiTo not yet implemented."); +} + +export class NexBlock { + + renderLearnerUiTo(element) { + throw new Error("NexBlock.renderLearnerUiTo must be implemented."); + } + + renderInstructorUiTo(element) { + return this.renderLearnerUiTo(element); + } + + renderAuthorUiTo(element) { + renderFallbackAuthoringUi(this, element); + } + + getCoreClass() { + if(this.constructor.Core ) { return this.constructor.Core; } else { + throw new Error("NexBlock.Core must be defined"); + } + } +} + + +export class NexCore { + + constructor(nexApiProvider) { + this._nexApiProvider = nexApiProvider + } + + async query(requestData) { + throw new Error("NexCore.query must be implemented."); + } +} + + +export class NexApiProvider { + + constructor(instanceKey, learningContextKey) { + this.instanceKey = instanceKey; + this.learningContextKey = learningContextKey; + } + + async fetchInstanceData(key) { + throw new Error("NexApiProvider.fetchInstanceData must be implemented."); + } + + async fetchLearnerData(key) { + throw new Error("NexApiProvider.fetchLearnerData must be implemented."); + } + + async emitLearnerEvent(learner, event) { + throw new Error("NexApiProvider.emitLearnerEvent must be implemented."); + } + +} + diff --git a/src/nex/NexBasesForReact.js b/src/nex/NexBasesForReact.js new file mode 100644 index 00000000..a945060c --- /dev/null +++ b/src/nex/NexBasesForReact.js @@ -0,0 +1,40 @@ + +import React from 'react'; +import { NexBlock } from './NexBases'; + +export function NexBlockComponent({learnerComponent, instructorComponent, authorComponent}) { + + constructor(props) { + super(core, instanceSchema); + this.learnerComponent = learnerComponentClass({}); + this.instructorComponent = instructorComponentClass({}); + this.authorComponent = authorComponentClass({}); + } + + asVanillaNexBlock() { + + } + + +} + +export class ReactNexBlock { + + + renderLearnerUiTo(element) { + React.render(this.learnerComponent, element); + } + + renderInstructorUiTo(element) { + React.render(this.instructorComponent || this.learnerComponent, element); + } + + renderAuthorUiTo(element) { + if (this.authorComponent) { + React.render(this.authorComponent, element); + } else { + return super.renderAuthorUiTo(element); + } + } + +} \ No newline at end of file diff --git a/src/nexblocks/NexBlockApiProvider.js b/src/nexblocks/NexBlockApiProvider.js deleted file mode 100644 index ce398aa3..00000000 --- a/src/nexblocks/NexBlockApiProvider.js +++ /dev/null @@ -1,16 +0,0 @@ -import { getConfig } from '@edx/frontend-platform'; -import { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth'; - -export default class NexBlockApiProvider { - - constructor(learningContextId, instanceId) { - - } - - async getInstanceData() { - const httpClient = getAuthenticatedHttpClient(); - const baseUrl = getConfig().NEXBLOCK_INSTANCE_DATA_API_URL; - return httpClient.get(`${baseUrl}/`); - } - -}