Compare commits
1 Commits
feat/githu
...
fix/171-cr
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6614f18ba5 |
@@ -1,4 +1,4 @@
|
|||||||
import { createContext, useContext, useState } from "react";
|
import { createContext, useCallback, useContext, useState } from "react";
|
||||||
|
|
||||||
interface ModalState {
|
interface ModalState {
|
||||||
contentType: string;
|
contentType: string;
|
||||||
@@ -42,57 +42,59 @@ export const ModalProvider: React.FC<Props> = ({ children }) => {
|
|||||||
const entityId = currentModal?.entityId || "";
|
const entityId = currentModal?.entityId || "";
|
||||||
const entityLabel = currentModal?.entityLabel || "";
|
const entityLabel = currentModal?.entityLabel || "";
|
||||||
|
|
||||||
const openModal = (
|
const openModal = useCallback(
|
||||||
contentType: string,
|
(contentType: string, entityId?: string, entityLabel?: string) => {
|
||||||
entityId?: string,
|
const newModal: ModalState = { contentType, entityId, entityLabel };
|
||||||
entityLabel?: string,
|
setModalStack((prev) => [...prev, newModal]);
|
||||||
) => {
|
},
|
||||||
const newModal: ModalState = { contentType, entityId, entityLabel };
|
[],
|
||||||
setModalStack((prev) => [...prev, newModal]);
|
);
|
||||||
};
|
|
||||||
|
|
||||||
const closeModal = () => {
|
const closeModal = useCallback(() => {
|
||||||
setModalStack((prev) => {
|
setModalStack((prev) => {
|
||||||
if (prev.length <= 1) {
|
if (prev.length <= 1) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
return prev.slice(0, -1);
|
return prev.slice(0, -1);
|
||||||
});
|
});
|
||||||
};
|
}, []);
|
||||||
|
|
||||||
const closeModals = (count: number) => {
|
const closeModals = useCallback((count: number) => {
|
||||||
setModalStack(prev => {
|
setModalStack((prev) => {
|
||||||
const newLength = Math.max(0, prev.length - count);
|
const newLength = Math.max(0, prev.length - count);
|
||||||
return prev.slice(0, newLength);
|
return prev.slice(0, newLength);
|
||||||
});
|
});
|
||||||
};
|
}, []);
|
||||||
|
|
||||||
const clearAllModals = () => {
|
const clearAllModals = useCallback(() => {
|
||||||
setModalStack([]);
|
setModalStack([]);
|
||||||
};
|
}, []);
|
||||||
|
|
||||||
const setModalState = (modalType: string, state: any) => {
|
const setModalState = useCallback((modalType: string, state: any) => {
|
||||||
setModalStates((prev) => ({
|
setModalStates((prev) => ({
|
||||||
...prev,
|
...prev,
|
||||||
[modalType]: state,
|
[modalType]: state,
|
||||||
}));
|
}));
|
||||||
};
|
}, []);
|
||||||
|
|
||||||
const getModalState = (modalType: string) => {
|
const getModalState = useCallback(
|
||||||
return modalStates[modalType];
|
(modalType: string) => {
|
||||||
};
|
return modalStates[modalType];
|
||||||
|
},
|
||||||
|
[modalStates],
|
||||||
|
);
|
||||||
|
|
||||||
const clearModalState = (modalType: string) => {
|
const clearModalState = useCallback((modalType: string) => {
|
||||||
setModalStates((prev) => {
|
setModalStates((prev) => {
|
||||||
const newStates = { ...prev };
|
const newStates = { ...prev };
|
||||||
delete newStates[modalType];
|
delete newStates[modalType];
|
||||||
return newStates;
|
return newStates;
|
||||||
});
|
});
|
||||||
};
|
}, []);
|
||||||
|
|
||||||
const clearAllModalStates = () => {
|
const clearAllModalStates = useCallback(() => {
|
||||||
setModalStates({});
|
setModalStates({});
|
||||||
};
|
}, []);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ModalContext.Provider
|
<ModalContext.Provider
|
||||||
|
|||||||
@@ -47,12 +47,16 @@ export const WorkspaceProvider: React.FC<{ children: ReactNode }> = ({
|
|||||||
const [hasLoaded, setHasLoaded] = useState(false);
|
const [hasLoaded, setHasLoaded] = useState(false);
|
||||||
|
|
||||||
const { data, isLoading } = api.workspace.all.useQuery();
|
const { data, isLoading } = api.workspace.all.useQuery();
|
||||||
|
const utils = api.useUtils();
|
||||||
|
|
||||||
const switchWorkspace = (_workspace: Workspace) => {
|
const switchWorkspace = (_workspace: Workspace) => {
|
||||||
localStorage.setItem("workspacePublicId", _workspace.publicId);
|
localStorage.setItem("workspacePublicId", _workspace.publicId);
|
||||||
|
|
||||||
setWorkspace(_workspace);
|
setWorkspace(_workspace);
|
||||||
|
|
||||||
|
// Refetch workspace data to ensure availableWorkspaces is up to date
|
||||||
|
void utils.workspace.all.refetch();
|
||||||
|
|
||||||
router.push(`/boards`);
|
router.push(`/boards`);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -66,21 +70,15 @@ export const WorkspaceProvider: React.FC<{ children: ReactNode }> = ({
|
|||||||
localStorage.getItem("workspacePublicId");
|
localStorage.getItem("workspacePublicId");
|
||||||
|
|
||||||
if (data.length) {
|
if (data.length) {
|
||||||
const workspaces = data
|
const workspaces = data.map(({ workspace, role }) => ({
|
||||||
.map(({ workspace, role }) => {
|
role,
|
||||||
if (!workspace) return;
|
publicId: workspace.publicId,
|
||||||
|
name: workspace.name,
|
||||||
return {
|
slug: workspace.slug,
|
||||||
role,
|
description: workspace.description,
|
||||||
publicId: workspace.publicId,
|
plan: workspace.plan,
|
||||||
name: workspace.name,
|
hasLoaded: true,
|
||||||
slug: workspace.slug,
|
})) as Workspace[];
|
||||||
description: workspace.description,
|
|
||||||
plan: workspace.plan,
|
|
||||||
hasLoaded: true,
|
|
||||||
};
|
|
||||||
})
|
|
||||||
.filter((workspace) => workspace !== null) as Workspace[];
|
|
||||||
|
|
||||||
if (workspaces.length) setAvailableWorkspaces(workspaces);
|
if (workspaces.length) setAvailableWorkspaces(workspaces);
|
||||||
}
|
}
|
||||||
@@ -116,7 +114,7 @@ export const WorkspaceProvider: React.FC<{ children: ReactNode }> = ({
|
|||||||
role: primaryWorkspaceRole,
|
role: primaryWorkspaceRole,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}, [data]);
|
}, [data, isLoading]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<WorkspaceContext.Provider
|
<WorkspaceContext.Provider
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import { t } from "@lingui/core/macro";
|
import { t } from "@lingui/core/macro";
|
||||||
|
import { useEffect } from "react";
|
||||||
import { HiArrowDownTray, HiOutlinePlusSmall } from "react-icons/hi2";
|
import { HiArrowDownTray, HiOutlinePlusSmall } from "react-icons/hi2";
|
||||||
|
|
||||||
import Button from "~/components/Button";
|
import Button from "~/components/Button";
|
||||||
@@ -16,7 +17,11 @@ export default function BoardsPage() {
|
|||||||
const { openModal, modalContentType, isOpen } = useModal();
|
const { openModal, modalContentType, isOpen } = useModal();
|
||||||
const { availableWorkspaces, workspace, hasLoaded } = useWorkspace();
|
const { availableWorkspaces, workspace, hasLoaded } = useWorkspace();
|
||||||
|
|
||||||
if (hasLoaded && availableWorkspaces.length === 0) openModal("NEW_WORKSPACE");
|
useEffect(() => {
|
||||||
|
if (hasLoaded && availableWorkspaces.length === 0) {
|
||||||
|
openModal("NEW_WORKSPACE");
|
||||||
|
}
|
||||||
|
}, [hasLoaded, availableWorkspaces.length, openModal]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
|
|||||||
Reference in New Issue
Block a user