Skip to content

Commit

Permalink
Merge branch 'dap-4738' into dap-4739
Browse files Browse the repository at this point in the history
  • Loading branch information
alsakhaev committed Sep 6, 2024
2 parents 451586c + 710609b commit e787688
Show file tree
Hide file tree
Showing 8 changed files with 101 additions and 63 deletions.
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import { AppWithSettings, useMutableWeb, useMutationApp } from '@mweb/engine'
import { AppInstanceWithSettings, useMutableWeb, useMutationApp } from '@mweb/engine'
import { AppSwitcher, MiniOverlay } from '@mweb/shared-components'
import React from 'react'
import Background from '../../common/background'
import { NearNetworkId } from '../../common/networks'

function AppSwitcherContainer({ app }: { app: AppWithSettings }) {
const { enableApp, disableApp, isLoading } = useMutationApp(app.id)
function AppSwitcherContainer({ app }: { app: AppInstanceWithSettings }) {
const { enableApp, disableApp, isLoading } = useMutationApp(app.instanceId)
return (
<AppSwitcher app={app} enableApp={enableApp} disableApp={disableApp} isLoading={isLoading} />
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { MiniOverlay, AppSwitcher } from '@mweb/shared-components'

function AppSwitcherContainer({ app }) {
// ToDo: move to @mweb/engine
const { enableApp, disableApp, isLoading } = useMutationApp(app.id)
const { enableApp, disableApp, isLoading } = useMutationApp(app.instanceId)
return (
<AppSwitcher app={app} enableApp={enableApp} disableApp={disableApp} isLoading={isLoading} />
)
Expand Down
31 changes: 20 additions & 11 deletions libs/engine/src/app/components/context-manager.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import { Portal } from '../contexts/engine-context/engine-context'
import { Target } from '../services/target/target.entity'
import { filterAndDiscriminate } from '../common/filter-and-discriminate'
import { Document, DocumentId, DocumentMetadata } from '../services/document/document.entity'
import { ApplicationService } from '../services/application/application.service'

interface WidgetProps {
context: TransferableContext
Expand Down Expand Up @@ -172,12 +173,14 @@ const ContextHandler: FC<{ context: IContextNode; insPoints: InsertionPointWithE
(appInstanceId: string) =>
(ctx: TransferableContext, accountIds?: string[] | string, indexRules?: LinkIndexRules) => {
if (!selectedMutation) throw new Error('No selected mutation')
const appInstance = activeApps.find((app) => app.instanceId === appInstanceId)
const appInstance = selectedMutation.apps.find(
(app) => ApplicationService.constructAppInstanceId(app) === appInstanceId
)
if (!appInstance) throw new Error('The app is not active')

return engine.linkDbService.get(
selectedMutation.id,
appInstance.id,
appInstance.appId,
appInstance.documentId,
ctx,
accountIds,
Expand All @@ -197,26 +200,30 @@ const ContextHandler: FC<{ context: IContextNode; insPoints: InsertionPointWithE
indexRules: LinkIndexRules
) => {
if (!selectedMutation) throw new Error('No selected mutation')
const appInstance = activeApps.find((app) => app.instanceId === appInstanceId)
const appInstance = selectedMutation.apps.find(
(app) => ApplicationService.constructAppInstanceId(app) === appInstanceId
)
if (!appInstance) throw new Error('The app is not active')

return engine.linkDbService.set(
selectedMutation.id,
appInstance.id,
appInstance.appId,
appInstance.documentId,
ctx,
dataByAccount,
indexRules
)
}
),
[engine, selectedMutation, activeApps]
[engine, selectedMutation]
)

const handleGetDocumentCurry = useCallback(
memoize((appInstanceId: string) => async () => {
if (!selectedMutation) throw new Error('No selected mutation')
const appInstance = activeApps.find((app) => app.instanceId === appInstanceId)
const appInstance = selectedMutation.apps.find(
(app) => ApplicationService.constructAppInstanceId(app) === appInstanceId
)
if (!appInstance) throw new Error('The app is not active')

if (!appInstance.documentId) return null
Expand All @@ -225,7 +232,7 @@ const ContextHandler: FC<{ context: IContextNode; insPoints: InsertionPointWithE

return document
}),
[engine, selectedMutation, activeApps, refreshMutation]
[engine, selectedMutation, refreshMutation]
)

const handleCommitDocumentCurry = useCallback(
Expand All @@ -238,18 +245,20 @@ const ContextHandler: FC<{ context: IContextNode; insPoints: InsertionPointWithE
dataByAccount: LinkedDataByAccount
) => {
if (!selectedMutation) throw new Error('No selected mutation')
const appInstance = activeApps.find((app) => app.instanceId === appInstanceId)
const appInstance = selectedMutation.apps.find(
(app) => ApplicationService.constructAppInstanceId(app) === appInstanceId
)
if (!appInstance) throw new Error('The app is not active')

const document = {
id: appDocId,
metadata: appDocMeta,
openWith: [appInstance.id],
openWith: [appInstance.appId],
}

const { mutation } = await engine.documentService.createDocumentWithData(
selectedMutation.id,
appInstance.id,
appInstance.appId,
document,
ctx,
dataByAccount
Expand All @@ -261,7 +270,7 @@ const ContextHandler: FC<{ context: IContextNode; insPoints: InsertionPointWithE
await refreshMutation(mutation)
}
),
[engine, selectedMutation, activeApps, refreshMutation]
[engine, selectedMutation, refreshMutation]
)

// ToDo: check context.element
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { useContext, useState } from 'react'
import { MutableWebContext } from './mutable-web-context'

export function useMutationApp(appId: string) {
export function useMutationApp(appInstanceId: string) {
const { engine, setMutationApps, selectedMutation } = useContext(MutableWebContext)

const [isLoading, setIsLoading] = useState(false)
Expand All @@ -15,11 +15,16 @@ export function useMutationApp(appId: string) {
try {
setIsLoading(true)

await engine.applicationService.enableAppInMutation(selectedMutation.id, appId)
await engine.applicationService.enableAppInstanceInMutation(
selectedMutation.id,
appInstanceId
)

setMutationApps((apps) =>
apps.map((app) =>
app.id === appId ? { ...app, settings: { ...app.settings, isEnabled: true } } : app
app.instanceId === appInstanceId
? { ...app, settings: { ...app.settings, isEnabled: true } }
: app
)
)
} catch (err) {
Expand All @@ -41,11 +46,16 @@ export function useMutationApp(appId: string) {
try {
setIsLoading(true)

await engine.applicationService.disableAppInMutation(selectedMutation.id, appId)
await engine.applicationService.disableAppInstanceInMutation(
selectedMutation.id,
appInstanceId
)

setMutationApps((apps) =>
apps.map((app) =>
app.id === appId ? { ...app, settings: { ...app.settings, isEnabled: false } } : app
app.instanceId === appInstanceId
? { ...app, settings: { ...app.settings, isEnabled: false } }
: app
)
)
} catch (err) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { ParserConfigId } from '../parser-config/parser-config.entity'
import { Target } from '../target/target.entity'

export type AppId = string
export type AppInstanceId = string

export const AnyParserValue = 'any'

Expand Down Expand Up @@ -32,10 +33,12 @@ export type AppMetadata = {
}
}

export type AppInstanceSettings = {
isEnabled: boolean
}

export type AppWithSettings = AppMetadata & {
settings: {
isEnabled: boolean
}
settings: AppInstanceSettings
}

export type AppInstanceWithSettings = AppWithSettings & {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { LocalDbService } from '../local-db/local-db.service'
import { SocialDbService } from '../social-db/social-db.service'
import { AppId, AppMetadata } from './application.entity'
import { AppId, AppInstanceId, AppMetadata } from './application.entity'

// SocialDB
const ProjectIdKey = 'dapplets.near'
Expand Down Expand Up @@ -111,13 +111,17 @@ export class ApplicationRepository {
}
}

async getAppEnabledStatus(mutationId: string, appId: string): Promise<boolean> {
const key = LocalDbService.makeKey(STOPPED_APPS, mutationId, appId)
async getAppEnabledStatus(mutationId: string, appInstanceId: AppInstanceId): Promise<boolean> {
const key = LocalDbService.makeKey(STOPPED_APPS, mutationId, appInstanceId)
return (await this.localDb.getItem(key)) ?? true // app is active by default
}

async setAppEnabledStatus(mutationId: string, appId: string, isEnabled: boolean): Promise<void> {
const key = LocalDbService.makeKey(STOPPED_APPS, mutationId, appId)
async setAppEnabledStatus(
mutationId: string,
appInstanceId: AppInstanceId,
isEnabled: boolean
): Promise<void> {
const key = LocalDbService.makeKey(STOPPED_APPS, mutationId, appInstanceId)
return this.localDb.setItem(key, isEnabled)
}
}
76 changes: 42 additions & 34 deletions libs/engine/src/app/services/application/application.service.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,14 @@
import { IContextNode } from '@mweb/core'
import { Mutation, MutationId } from '../mutation/mutation.entity'
import { AppInMutation, Mutation, MutationId } from '../mutation/mutation.entity'
import { TargetService } from '../target/target.service'
import { AppId, AppInstanceWithSettings, AppMetadata, AppWithSettings } from './application.entity'
import {
AppId,
AppInstanceId,
AppInstanceSettings,
AppInstanceWithSettings,
AppMetadata,
AppWithSettings,
} from './application.entity'
import { ApplicationRepository } from './application.repository'

export class ApplicationService {
Expand All @@ -16,32 +23,12 @@ export class ApplicationService {
return this.applicationRepository.getApplication(appId)
}

public async getAppWithSettings(
mutationId: MutationId,
appId: AppId
): Promise<AppWithSettings | null> {
const app = await this.getApplication(appId)
if (!app) return null

return this.populateAppWithSettings(mutationId, app)
}

public async getAppsFromMutation(mutation: Mutation): Promise<AppInstanceWithSettings[]> {
return Promise.all(
mutation.apps.map((appInstance, index) =>
this.getAppWithSettings(mutation.id, appInstance.appId).then((app) => ({
...app,
instanceId: index.toString(), // index is used as instance id
documentId: appInstance.documentId,
}))
)
mutation.apps.map((appInstance) => this._getAppInstanceWithSettings(mutation.id, appInstance))
).then((apps) => apps.filter((app) => app !== null) as AppInstanceWithSettings[])
}

public async getAppEnabledStatus(mutationId: MutationId, appId: AppId): Promise<boolean> {
return this.applicationRepository.getAppEnabledStatus(mutationId, appId)
}

public filterSuitableApps(appsToCheck: AppMetadata[], context: IContextNode): AppMetadata[] {
const suitableApps: AppMetadata[] = []

Expand All @@ -58,23 +45,44 @@ export class ApplicationService {
return suitableApps
}

public async enableAppInMutation(mutationId: MutationId, appId: AppId) {
await this.applicationRepository.setAppEnabledStatus(mutationId, appId, true)
public async enableAppInstanceInMutation(mutationId: MutationId, appInstanceId: AppInstanceId) {
await this.applicationRepository.setAppEnabledStatus(mutationId, appInstanceId, true)
}

public async disableAppInstanceInMutation(mutationId: MutationId, appInstanceId: AppInstanceId) {
await this.applicationRepository.setAppEnabledStatus(mutationId, appInstanceId, false)
}

public async disableAppInMutation(mutationId: MutationId, appId: AppId) {
await this.applicationRepository.setAppEnabledStatus(mutationId, appId, false)
public static constructAppInstanceId({ appId, documentId }: AppInMutation): AppInstanceId {
// ToDo: instance id is a concatenation of app id and document id
return documentId ? `${appId}/${documentId}` : appId
}

private async _getAppInstanceWithSettings(mutationId: MutationId, appInstance: AppInMutation) {
const instanceId = ApplicationService.constructAppInstanceId(appInstance)

const [app, settings] = await Promise.all([
this.getApplication(appInstance.appId),
this._getAppInstanceSettings(mutationId, instanceId),
])

if (!app) return null

const appWithSettings: AppWithSettings = { ...app, settings }

return {
...appWithSettings,
instanceId,
documentId: appInstance.documentId,
}
}

public async populateAppWithSettings(
private async _getAppInstanceSettings(
mutationId: MutationId,
app: AppMetadata
): Promise<AppWithSettings> {
appInstanceId: AppInstanceId
): Promise<AppInstanceSettings> {
return {
...app,
settings: {
isEnabled: await this.applicationRepository.getAppEnabledStatus(mutationId, app.id),
},
isEnabled: await this.applicationRepository.getAppEnabledStatus(mutationId, appInstanceId),
}
}
}
6 changes: 5 additions & 1 deletion libs/engine/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
export * as customElements from './custom-elements'
export { Mutation, MutationWithSettings } from './app/services/mutation/mutation.entity'
export { AppMetadata, AppWithSettings } from './app/services/application/application.entity'
export {
AppMetadata,
AppWithSettings,
AppInstanceWithSettings,
} from './app/services/application/application.entity'
export { LocalStorage } from './app/services/local-db/local-storage'
export { IStorage } from './app/services/local-db/local-storage'
export { App } from './app/app'
Expand Down

0 comments on commit e787688

Please sign in to comment.