You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Application-Web/src/service/LocalStorageTacticService.ts

112 lines
3.3 KiB

import {
MutableTacticService,
ServiceError,
TacticContext,
} from "./MutableTacticService.ts"
import { StepContent, StepInfoNode } from "../model/tactic/Tactic.ts"
import {
addStepNode,
getAvailableId,
removeStepNode,
} from "../domains/StepsDomain.ts"
const GUEST_MODE_STEP_CONTENT_STORAGE_KEY = "guest_mode_step"
const GUEST_MODE_STEP_ROOT_NODE_INFO_STORAGE_KEY = "guest_mode_step_tree"
const GUEST_MODE_TITLE_STORAGE_KEY = "guest_mode_title"
export class LocalStorageTacticService implements MutableTacticService {
private constructor() {}
canBeEdited(): Promise<boolean> {
return Promise.resolve(true)
}
static init(): LocalStorageTacticService {
const root = localStorage.getItem(
GUEST_MODE_STEP_ROOT_NODE_INFO_STORAGE_KEY,
)
if (root === null) {
localStorage.setItem(
GUEST_MODE_STEP_ROOT_NODE_INFO_STORAGE_KEY,
JSON.stringify(<StepInfoNode>{ id: 1, children: [] }),
)
localStorage.setItem(
GUEST_MODE_STEP_CONTENT_STORAGE_KEY + 1,
JSON.stringify(<StepContent>{components: []})
)
}
return new LocalStorageTacticService()
}
async getContext(): Promise<TacticContext | ServiceError> {
const stepsTree: StepInfoNode = JSON.parse(
localStorage.getItem(GUEST_MODE_STEP_ROOT_NODE_INFO_STORAGE_KEY)!,
)
const name =
localStorage.getItem(GUEST_MODE_TITLE_STORAGE_KEY) ??
"Nouvelle Tactique"
return {
stepsTree,
name,
courtType: "PLAIN",
}
}
async addStep(
parent: StepInfoNode,
content: StepContent,
): Promise<StepInfoNode | ServiceError> {
const root: StepInfoNode = JSON.parse(
localStorage.getItem(GUEST_MODE_STEP_ROOT_NODE_INFO_STORAGE_KEY)!,
)
const nodeId = getAvailableId(root)
const node = { id: nodeId, children: [] }
const resultTree = addStepNode(root, parent, node)
localStorage.setItem(
GUEST_MODE_STEP_ROOT_NODE_INFO_STORAGE_KEY,
JSON.stringify(resultTree),
)
localStorage.setItem(
GUEST_MODE_STEP_CONTENT_STORAGE_KEY + node.id,
JSON.stringify(content),
)
return node
}
async getContent(step: number): Promise<StepContent | ServiceError> {
const content = localStorage.getItem(
GUEST_MODE_STEP_CONTENT_STORAGE_KEY + step,
)
return content ? JSON.parse(content) : null
}
async removeStep(id: number): Promise<void | ServiceError> {
const root: StepInfoNode = JSON.parse(
localStorage.getItem(GUEST_MODE_STEP_ROOT_NODE_INFO_STORAGE_KEY)!,
)
localStorage.setItem(
GUEST_MODE_STEP_ROOT_NODE_INFO_STORAGE_KEY,
JSON.stringify(removeStepNode(root, id)),
)
}
async saveContent(
step: number,
content: StepContent,
): Promise<void | ServiceError> {
localStorage.setItem(
GUEST_MODE_STEP_CONTENT_STORAGE_KEY + step,
JSON.stringify(content),
)
}
async setName(name: string): Promise<void | ServiceError> {
localStorage.setItem(GUEST_MODE_TITLE_STORAGE_KEY, name)
}
}