Reset flows cache when logged out (#844)
This commit is contained in:
commit
a9f3588651
6 changed files with 106 additions and 28 deletions
16
src/frontend/src/components/skeletonCardComponent/index.tsx
Normal file
16
src/frontend/src/components/skeletonCardComponent/index.tsx
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
import { Skeleton } from "../ui/skeleton";
|
||||||
|
|
||||||
|
export const SkeletonCardComponent = (): JSX.Element => {
|
||||||
|
return (
|
||||||
|
<div className="skeleton-card">
|
||||||
|
<div className="skeleton-card-wrapper">
|
||||||
|
<Skeleton className="h-8 w-8 rounded-full" />
|
||||||
|
<Skeleton className="h-4 w-[120px]" />
|
||||||
|
</div>
|
||||||
|
<div className="skeleton-card-text">
|
||||||
|
<Skeleton className="h-3 w-[250px]" />
|
||||||
|
<Skeleton className="h-3 w-[200px]" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
15
src/frontend/src/components/ui/skeleton.tsx
Normal file
15
src/frontend/src/components/ui/skeleton.tsx
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
import { cn } from "../../utils/utils"
|
||||||
|
|
||||||
|
function Skeleton({
|
||||||
|
className,
|
||||||
|
...props
|
||||||
|
}: React.HTMLAttributes<HTMLDivElement>) {
|
||||||
|
return (
|
||||||
|
<div
|
||||||
|
className={cn("animate-pulse rounded-md bg-border", className)}
|
||||||
|
{...props}
|
||||||
|
/>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export { Skeleton }
|
||||||
|
|
@ -39,6 +39,7 @@ const TabsContextInitialValue: TabsContextType = {
|
||||||
save: () => {},
|
save: () => {},
|
||||||
tabId: "",
|
tabId: "",
|
||||||
setTabId: (index: string) => {},
|
setTabId: (index: string) => {},
|
||||||
|
isLoading: true,
|
||||||
flows: [],
|
flows: [],
|
||||||
removeFlow: (id: string) => {},
|
removeFlow: (id: string) => {},
|
||||||
addFlow: async (flowData?: any) => "",
|
addFlow: async (flowData?: any) => "",
|
||||||
|
|
@ -72,10 +73,12 @@ export const TabsContext = createContext<TabsContextType>(
|
||||||
export function TabsProvider({ children }: { children: ReactNode }) {
|
export function TabsProvider({ children }: { children: ReactNode }) {
|
||||||
const { setErrorData, setNoticeData, setSuccessData } =
|
const { setErrorData, setNoticeData, setSuccessData } =
|
||||||
useContext(alertContext);
|
useContext(alertContext);
|
||||||
const { getAuthentication } = useContext(AuthContext);
|
const { getAuthentication, isAuthenticated } = useContext(AuthContext);
|
||||||
|
|
||||||
const [tabId, setTabId] = useState("");
|
const [tabId, setTabId] = useState("");
|
||||||
|
|
||||||
|
const [isLoading, setIsLoading] = useState(true);
|
||||||
|
|
||||||
const [flows, setFlows] = useState<Array<FlowType>>([]);
|
const [flows, setFlows] = useState<Array<FlowType>>([]);
|
||||||
const [id, setId] = useState(uid());
|
const [id, setId] = useState(uid());
|
||||||
const { templates, reactFlowInstance } = useContext(typesContext);
|
const { templates, reactFlowInstance } = useContext(typesContext);
|
||||||
|
|
@ -86,6 +89,12 @@ export function TabsProvider({ children }: { children: ReactNode }) {
|
||||||
const [tabsState, setTabsState] = useState<TabsState>({});
|
const [tabsState, setTabsState] = useState<TabsState>({});
|
||||||
const [getTweak, setTweak] = useState<tweakType>([]);
|
const [getTweak, setTweak] = useState<tweakType>([]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (!isAuthenticated) {
|
||||||
|
hardReset();
|
||||||
|
}
|
||||||
|
}, [isAuthenticated]);
|
||||||
|
|
||||||
const newNodeId = useRef(uid());
|
const newNodeId = useRef(uid());
|
||||||
function incrementNodeId() {
|
function incrementNodeId() {
|
||||||
newNodeId.current = uid();
|
newNodeId.current = uid();
|
||||||
|
|
@ -116,11 +125,13 @@ export function TabsProvider({ children }: { children: ReactNode }) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function refreshFlows() {
|
function refreshFlows() {
|
||||||
|
setIsLoading(true);
|
||||||
getTabsDataFromDB().then((DbData) => {
|
getTabsDataFromDB().then((DbData) => {
|
||||||
if (DbData && Object.keys(templates).length > 0) {
|
if (DbData && Object.keys(templates).length > 0) {
|
||||||
try {
|
try {
|
||||||
processDBData(DbData);
|
processDBData(DbData);
|
||||||
updateStateWithDbData(DbData);
|
updateStateWithDbData(DbData);
|
||||||
|
setIsLoading(false);
|
||||||
} catch (e) {}
|
} catch (e) {}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
@ -229,6 +240,7 @@ export function TabsProvider({ children }: { children: ReactNode }) {
|
||||||
setTabId("");
|
setTabId("");
|
||||||
|
|
||||||
setFlows([]);
|
setFlows([]);
|
||||||
|
setIsLoading(true);
|
||||||
setId(uid());
|
setId(uid());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -641,6 +653,7 @@ export function TabsProvider({ children }: { children: ReactNode }) {
|
||||||
paste,
|
paste,
|
||||||
getTweak,
|
getTweak,
|
||||||
setTweak,
|
setTweak,
|
||||||
|
isLoading,
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{children}
|
{children}
|
||||||
|
|
|
||||||
|
|
@ -3,12 +3,20 @@ import { Link, useNavigate } from "react-router-dom";
|
||||||
import { CardComponent } from "../../components/cardComponent";
|
import { CardComponent } from "../../components/cardComponent";
|
||||||
import IconComponent from "../../components/genericIconComponent";
|
import IconComponent from "../../components/genericIconComponent";
|
||||||
import Header from "../../components/headerComponent";
|
import Header from "../../components/headerComponent";
|
||||||
|
import { SkeletonCardComponent } from "../../components/skeletonCardComponent";
|
||||||
import { Button } from "../../components/ui/button";
|
import { Button } from "../../components/ui/button";
|
||||||
import { USER_PROJECTS_HEADER } from "../../constants/constants";
|
import { USER_PROJECTS_HEADER } from "../../constants/constants";
|
||||||
import { TabsContext } from "../../contexts/tabsContext";
|
import { TabsContext } from "../../contexts/tabsContext";
|
||||||
export default function HomePage(): JSX.Element {
|
export default function HomePage(): JSX.Element {
|
||||||
const { flows, setTabId, downloadFlows, uploadFlows, addFlow, removeFlow } =
|
const {
|
||||||
useContext(TabsContext);
|
flows,
|
||||||
|
setTabId,
|
||||||
|
downloadFlows,
|
||||||
|
uploadFlows,
|
||||||
|
addFlow,
|
||||||
|
removeFlow,
|
||||||
|
isLoading,
|
||||||
|
} = useContext(TabsContext);
|
||||||
|
|
||||||
// Set a null id
|
// Set a null id
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
|
@ -16,6 +24,10 @@ export default function HomePage(): JSX.Element {
|
||||||
}, []);
|
}, []);
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
console.log(isLoading);
|
||||||
|
}, [isLoading]);
|
||||||
|
|
||||||
// Personal flows display
|
// Personal flows display
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
|
|
@ -62,31 +74,40 @@ export default function HomePage(): JSX.Element {
|
||||||
Manage your personal projects. Download or upload your collection.
|
Manage your personal projects. Download or upload your collection.
|
||||||
</span>
|
</span>
|
||||||
<div className="main-page-flows-display">
|
<div className="main-page-flows-display">
|
||||||
{flows.map((flow, idx) => (
|
{isLoading && flows.length == 0 ? (
|
||||||
<CardComponent
|
<>
|
||||||
key={idx}
|
<SkeletonCardComponent />
|
||||||
flow={flow}
|
<SkeletonCardComponent />
|
||||||
id={flow.id}
|
<SkeletonCardComponent />
|
||||||
button={
|
<SkeletonCardComponent />
|
||||||
<Link to={"/flow/" + flow.id}>
|
</>
|
||||||
<Button
|
) : (
|
||||||
variant="outline"
|
flows.map((flow, idx) => (
|
||||||
size="sm"
|
<CardComponent
|
||||||
className="whitespace-nowrap "
|
key={idx}
|
||||||
>
|
flow={flow}
|
||||||
<IconComponent
|
id={flow.id}
|
||||||
name="ExternalLink"
|
button={
|
||||||
className="main-page-nav-button"
|
<Link to={"/flow/" + flow.id}>
|
||||||
/>
|
<Button
|
||||||
Edit Flow
|
variant="outline"
|
||||||
</Button>
|
size="sm"
|
||||||
</Link>
|
className="whitespace-nowrap "
|
||||||
}
|
>
|
||||||
onDelete={() => {
|
<IconComponent
|
||||||
removeFlow(flow.id);
|
name="ExternalLink"
|
||||||
}}
|
className="main-page-nav-button"
|
||||||
/>
|
/>
|
||||||
))}
|
Edit Flow
|
||||||
|
</Button>
|
||||||
|
</Link>
|
||||||
|
}
|
||||||
|
onDelete={() => {
|
||||||
|
removeFlow(flow.id);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
))
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</>
|
</>
|
||||||
|
|
|
||||||
|
|
@ -126,6 +126,18 @@
|
||||||
@apply form-input block w-full truncate rounded-md border-border bg-background px-3 text-left shadow-sm placeholder:text-muted-foreground focus:border-ring focus:placeholder-transparent focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50 sm:text-sm;
|
@apply form-input block w-full truncate rounded-md border-border bg-background px-3 text-left shadow-sm placeholder:text-muted-foreground focus:border-ring focus:placeholder-transparent focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50 sm:text-sm;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.skeleton-card {
|
||||||
|
@apply bg-background h-48 p-4 border rounded-lg flex flex-col gap-6;
|
||||||
|
}
|
||||||
|
|
||||||
|
.skeleton-card-wrapper {
|
||||||
|
@apply flex items-center space-x-4;
|
||||||
|
}
|
||||||
|
|
||||||
|
.skeleton-card-text {
|
||||||
|
@apply flex flex-col gap-3;
|
||||||
|
}
|
||||||
|
|
||||||
/* The same as primary-input but no-truncate */
|
/* The same as primary-input but no-truncate */
|
||||||
.textarea-primary {
|
.textarea-primary {
|
||||||
@apply form-input block w-full rounded-md border-border bg-background px-3 text-left shadow-sm placeholder:text-muted-foreground focus:border-ring focus:placeholder-transparent focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50 sm:text-sm;
|
@apply form-input block w-full rounded-md border-border bg-background px-3 text-left shadow-sm placeholder:text-muted-foreground focus:border-ring focus:placeholder-transparent focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50 sm:text-sm;
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@ export type TabsContextType = {
|
||||||
saveFlow: (flow: FlowType) => Promise<void>;
|
saveFlow: (flow: FlowType) => Promise<void>;
|
||||||
save: () => void;
|
save: () => void;
|
||||||
tabId: string;
|
tabId: string;
|
||||||
|
isLoading: boolean;
|
||||||
setTabId: (index: string) => void;
|
setTabId: (index: string) => void;
|
||||||
flows: Array<FlowType>;
|
flows: Array<FlowType>;
|
||||||
removeFlow: (id: string) => void;
|
removeFlow: (id: string) => void;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue