add back to edition button in visualizer if tactic is editable

pull/119/head
maxime 1 year ago
parent 15b47f354e
commit 3091e1a61a

@ -131,8 +131,6 @@ export function VisualizerFrame({
courtType,
}: VisualizerFrameProps) {
console.log(content, parentContent)
const courtRef = useRef<HTMLDivElement>(null)
const courtBounds = useCallback(

@ -292,7 +292,6 @@ function EditorPageWrapper({
stepsVersions.set(stepId, versions)
versions.insertAndCut(contentResult)
console.log(contentResult)
setStepContent(contentResult, false)
}

@ -1,5 +1,5 @@
import { ServiceError, TacticService } from "../service/MutableTacticService.ts"
import { useParams } from "react-router-dom"
import { useNavigate, useParams } from "react-router-dom"
import { useCallback, useEffect, useMemo, useReducer, useState } from "react"
import { VisualizerState, VisualizerStateActionKind, visualizerStateReducer } from "../visualizer/VisualizerState.ts"
import { getParent } from "../domains/StepsDomain.ts"
@ -20,26 +20,37 @@ export interface VisualizerPageProps {
export function VisualizerPage({ guestMode }: VisualizerPageProps) {
const { tacticId: idStr } = useParams()
const navigate = useNavigate()
const fetcher = useAppFetcher()
if (guestMode || !idStr) {
return (
<ServedVisualizerPage service={LocalStorageTacticService.init()} />
<ServedVisualizerPage service={LocalStorageTacticService.init()}
openEditor={() => navigate("/tactic/edit-guest")} />
)
}
return (
<ServedVisualizerPage service={new APITacticService(fetcher, parseInt(idStr))} />
<ServedVisualizerPage service={new APITacticService(fetcher, parseInt(idStr))}
openEditor={() => navigate(`/tactic/${idStr}/edit`)} />
)
}
interface VisualizerService {
selectStep(step: number): Promise<void | ServiceError>
openEditor(): Promise<void>
}
interface ServedVisualizerPageProps {
service: TacticService
openEditor: () => void
}
function ServedVisualizerPage({ service }: { service: TacticService }) {
function ServedVisualizerPage({ service, openEditor }: ServedVisualizerPageProps) {
const [panicMessage, setPanicMessage] = useState<string>()
const [state, dispatch] = useReducer(visualizerStateReducer, null)
const [canEdit, setCanEdit] = useState(false)
useEffect(() => {
async function init() {
@ -63,6 +74,8 @@ function ServedVisualizerPage({ service }: { service: TacticService }) {
return
}
setCanEdit(await service.canBeEdited())
dispatch({
type: VisualizerStateActionKind.INIT,
state: {
@ -98,10 +111,14 @@ function ServedVisualizerPage({ service }: { service: TacticService }) {
stepId: step,
})
},
async openEditor() {
openEditor()
},
}),
[service, state],
[openEditor, service, state],
)
if (panicMessage) {
return <p>{panicMessage}</p>
}
@ -110,17 +127,19 @@ function ServedVisualizerPage({ service }: { service: TacticService }) {
return <p>Retrieving tactic context. Please wait...</p>
}
return <VisualizerPageContent state={state} service={visualizerService} />
return <VisualizerPageContent state={state} service={visualizerService} showEditButton={canEdit} />
}
interface VisualizerPageContentProps {
state: VisualizerState
service: VisualizerService
showEditButton: boolean
}
function VisualizerPageContent({
state: { content, parentContent, stepId, stepsTree, courtType, tacticName },
service,
showEditButton,
}: VisualizerPageContentProps) {
const [isStepsTreeVisible, setStepsTreeVisible] = useState(false)
@ -152,13 +171,20 @@ function VisualizerPageContent({
return (
<div id="visualizer">
<div id="topbar-div">
<div id="header-page">
<p id="title">{tacticName}</p>
<div id="header-page-right">
<button
id={"show-steps-button"}
onClick={() => setStepsTreeVisible((b) => !b)}>
ETAPES
</button>
{showEditButton && <button
onClick={() => service.openEditor()}>
EDITER
</button>}
</div>
</div>
<div id="editor-div">

@ -15,6 +15,12 @@ export class APITacticService implements MutableTacticService {
this.fetcher = fetcher
}
async canBeEdited(): Promise<boolean> {
const response = await this.fetcher.fetchAPIGet(`tactics/${this.tacticId}/can-edit`)
const { canEdit } = await response.json()
return canEdit
}
async getContext(): Promise<TacticContext | ServiceError> {
const infoResponsePromise = this.fetcher.fetchAPIGet(
`tactics/${this.tacticId}`,

@ -17,6 +17,10 @@ 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,

@ -14,6 +14,7 @@ export enum ServiceError {
export interface TacticService {
getContext(): Promise<TacticContext | ServiceError>
getContent(step: number): Promise<StepContent | ServiceError>
canBeEdited(): Promise<boolean>
}
export interface MutableTacticService extends TacticService {

@ -39,6 +39,10 @@
justify-content: space-between;
align-items: center;
height: 25px;
z-index: 1;
align-content: space-between;
width: 100%;
}
.title-input {
@ -63,13 +67,6 @@
flex-direction: column;
}
#racks {
display: flex;
align-content: space-between;
justify-content: space-between;
width: 100%;
}
.curtain {
width: 100%;
}

@ -31,16 +31,16 @@
height: 100%;
}
#topbar-div {
position: relative;
#header-page {
width: 100%;
display: flex;
background-color: var(--main-color);
align-content: flex-end;
justify-content: flex-end;
align-content: flex-end;
}
#show-steps-button {
#header-page-right {
display: flex;
user-select: none;
align-self: flex-end;
height: 100%;

Loading…
Cancel
Save