add back to edition button in visualizer if tactic is editable
continuous-integration/drone/push Build is passing Details

maxime 1 year ago
parent bdac62205a
commit 4762326366

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

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

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

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

@ -17,6 +17,10 @@ const GUEST_MODE_TITLE_STORAGE_KEY = "guest_mode_title"
export class LocalStorageTacticService implements MutableTacticService { export class LocalStorageTacticService implements MutableTacticService {
private constructor() {} private constructor() {}
canBeEdited(): Promise<boolean> {
return Promise.resolve(true)
}
static init(): LocalStorageTacticService { static init(): LocalStorageTacticService {
const root = localStorage.getItem( const root = localStorage.getItem(
GUEST_MODE_STEP_ROOT_NODE_INFO_STORAGE_KEY, GUEST_MODE_STEP_ROOT_NODE_INFO_STORAGE_KEY,

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

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

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

Loading…
Cancel
Save