Compare commits
4 Commits
7f80f4790d
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 3d4858bcbb | |||
| b2feaac3e1 | |||
| db9132de4d | |||
| ae9bea6c7c |
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "anti-hvost",
|
"name": "anti-hvost",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "0.0.0",
|
"version": "0.0.1",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite",
|
"dev": "vite",
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import { AppProvider, useAppContext } from "./providers/AuthProvider";
|
|||||||
const HomePage: FunctionComponent = () => {
|
const HomePage: FunctionComponent = () => {
|
||||||
const { route } = useLocation();
|
const { route } = useLocation();
|
||||||
const { isLoggedIn } = useAppContext();
|
const { isLoggedIn } = useAppContext();
|
||||||
if (isLoggedIn) route("/profile/tasks", true);
|
if (isLoggedIn.value) route("/profile/tasks", true);
|
||||||
else route("/login", true);
|
else route("/login", true);
|
||||||
return <div>Redirecting...</div>;
|
return <div>Redirecting...</div>;
|
||||||
};
|
};
|
||||||
|
|||||||
12
src/constructors/Component.tsx
Normal file
12
src/constructors/Component.tsx
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
import { FunctionComponent } from "preact";
|
||||||
|
import { useEffect } from "preact/hooks";
|
||||||
|
|
||||||
|
export const withTitle = <P,>(title: string, WrappedComponent: FunctionComponent<P>): FunctionComponent<P> => {
|
||||||
|
const ComponentWithTitle: FunctionComponent<P> = (props) => {
|
||||||
|
useEffect(() => {
|
||||||
|
document.title = title;
|
||||||
|
}, []);
|
||||||
|
return <WrappedComponent {...props} />;
|
||||||
|
};
|
||||||
|
return ComponentWithTitle;
|
||||||
|
};
|
||||||
@@ -1,15 +1,12 @@
|
|||||||
import Button from "@/components/ui/Button";
|
import Button from "@/components/ui/Button";
|
||||||
|
import { withTitle } from "@/constructors/Component";
|
||||||
import { UrlsTitle } from "@/enums/urls";
|
import { UrlsTitle } from "@/enums/urls";
|
||||||
import { FunctionComponent } from "preact";
|
import { FunctionComponent } from "preact";
|
||||||
import { useLocation } from "preact-iso";
|
import { useLocation } from "preact-iso";
|
||||||
import { useEffect } from "preact/hooks";
|
|
||||||
import classes from "./404.module.scss";
|
import classes from "./404.module.scss";
|
||||||
|
|
||||||
const Page404: FunctionComponent = () => {
|
const Page404: FunctionComponent = () => {
|
||||||
const { route } = useLocation();
|
const { route } = useLocation();
|
||||||
useEffect(() => {
|
|
||||||
document.title = UrlsTitle.PAGE404;
|
|
||||||
}, []);
|
|
||||||
return (
|
return (
|
||||||
<div id={classes.container}>
|
<div id={classes.container}>
|
||||||
<div id={classes.main_container}>
|
<div id={classes.main_container}>
|
||||||
@@ -27,4 +24,4 @@ const Page404: FunctionComponent = () => {
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
export default Page404;
|
export default withTitle(UrlsTitle.PAGE404, Page404);
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
|
import { withTitle } from "@/constructors/Component";
|
||||||
import { UrlsTitle } from "@/enums/urls";
|
import { UrlsTitle } from "@/enums/urls";
|
||||||
import { cn } from "@/utils/class-merge";
|
import { cn } from "@/utils/class-merge";
|
||||||
import { FunctionComponent, h } from "preact";
|
import { FunctionComponent, h } from "preact";
|
||||||
import { useEffect, useState } from "preact/hooks";
|
import { useState } from "preact/hooks";
|
||||||
|
|
||||||
type MarkedDateType = "event" | "holiday" | "important" | string;
|
type MarkedDateType = "event" | "holiday" | "important" | string;
|
||||||
type MarkedDates = Record<string, MarkedDateType>;
|
type MarkedDates = Record<string, MarkedDateType>;
|
||||||
@@ -17,9 +18,6 @@ const BigCalendar: FunctionComponent<BigCalendarProps> = ({
|
|||||||
markedDates = {},
|
markedDates = {},
|
||||||
className = "",
|
className = "",
|
||||||
}: BigCalendarProps) => {
|
}: BigCalendarProps) => {
|
||||||
useEffect(() => {
|
|
||||||
document.title = UrlsTitle.CALENDAR;
|
|
||||||
}, []);
|
|
||||||
const [currentDate, setCurrentDate] = useState<Date>(new Date());
|
const [currentDate, setCurrentDate] = useState<Date>(new Date());
|
||||||
const [selectedDate, setSelectedDate] = useState<Date | null>(null);
|
const [selectedDate, setSelectedDate] = useState<Date | null>(null);
|
||||||
|
|
||||||
@@ -251,4 +249,4 @@ const BigCalendar: FunctionComponent<BigCalendarProps> = ({
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
export default BigCalendar;
|
export default withTitle(UrlsTitle.CALENDAR, BigCalendar);
|
||||||
|
|||||||
@@ -1,17 +1,14 @@
|
|||||||
import Button from "@/components/ui/Button";
|
import Button from "@/components/ui/Button";
|
||||||
import Input from "@/components/ui/Input";
|
import Input from "@/components/ui/Input";
|
||||||
|
import { withTitle } from "@/constructors/Component";
|
||||||
import { UrlsTitle } from "@/enums/urls";
|
import { UrlsTitle } from "@/enums/urls";
|
||||||
import { useAppContext } from "@/providers/AuthProvider";
|
import { useAppContext } from "@/providers/AuthProvider";
|
||||||
import { FunctionComponent } from "preact";
|
import { FunctionComponent } from "preact";
|
||||||
import { useLocation } from "preact-iso";
|
import { useLocation } from "preact-iso";
|
||||||
import { useEffect } from "preact/hooks";
|
|
||||||
import classes from "./login.module.scss";
|
import classes from "./login.module.scss";
|
||||||
const LoginPage: FunctionComponent = () => {
|
const LoginPage: FunctionComponent = () => {
|
||||||
const { isLoggedIn } = useAppContext();
|
const { isLoggedIn } = useAppContext();
|
||||||
const { route } = useLocation();
|
const { route } = useLocation();
|
||||||
useEffect(() => {
|
|
||||||
document.title = UrlsTitle.LOGIN;
|
|
||||||
}, []);
|
|
||||||
return (
|
return (
|
||||||
<div class={classes.login_container}>
|
<div class={classes.login_container}>
|
||||||
<div class={classes.login_card}>
|
<div class={classes.login_card}>
|
||||||
@@ -22,6 +19,7 @@ const LoginPage: FunctionComponent = () => {
|
|||||||
color="secondary"
|
color="secondary"
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
isLoggedIn.value = true;
|
isLoggedIn.value = true;
|
||||||
|
localStorage.setItem("loggedIn", "true");
|
||||||
route("/profile/tasks", true);
|
route("/profile/tasks", true);
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
@@ -32,4 +30,4 @@ const LoginPage: FunctionComponent = () => {
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
export default LoginPage;
|
export default withTitle(UrlsTitle.LOGIN, LoginPage);
|
||||||
|
|||||||
@@ -1,11 +1,14 @@
|
|||||||
import Menu from "@/components/menu";
|
import Menu from "@/components/menu";
|
||||||
|
import { useAppContext } from "@/providers/AuthProvider";
|
||||||
import { FunctionComponent } from "preact";
|
import { FunctionComponent } from "preact";
|
||||||
import { lazy, Route, Router, useLocation } from "preact-iso";
|
import { lazy, Route, Router, useLocation } from "preact-iso";
|
||||||
import ids from "./profile.module.scss";
|
import ids from "./profile.module.scss";
|
||||||
|
|
||||||
const ProfilePage: FunctionComponent = () => {
|
const ProfilePage: FunctionComponent = () => {
|
||||||
const { route } = useLocation();
|
const { route } = useLocation();
|
||||||
return (
|
const { isLoggedIn } = useAppContext();
|
||||||
|
if (!isLoggedIn.value) route("/login", true);
|
||||||
|
return isLoggedIn.value ? (
|
||||||
<div id={ids.main_container}>
|
<div id={ids.main_container}>
|
||||||
<div id={ids.router_container}>
|
<div id={ids.router_container}>
|
||||||
<Router>
|
<Router>
|
||||||
@@ -25,6 +28,8 @@ const ProfilePage: FunctionComponent = () => {
|
|||||||
<Menu />
|
<Menu />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
) : (
|
||||||
|
<p>Redirecting...</p>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,14 @@
|
|||||||
import Button from "@/components/ui/Button";
|
import Button from "@/components/ui/Button";
|
||||||
|
import { withTitle } from "@/constructors/Component";
|
||||||
import { UrlsTitle } from "@/enums/urls";
|
import { UrlsTitle } from "@/enums/urls";
|
||||||
import { useAppContext } from "@/providers/AuthProvider";
|
import { useAppContext } from "@/providers/AuthProvider";
|
||||||
import { FunctionComponent } from "preact";
|
import { FunctionComponent } from "preact";
|
||||||
import { useLocation } from "preact-iso";
|
import { useLocation } from "preact-iso";
|
||||||
import { useEffect } from "preact/hooks";
|
|
||||||
import classes from "./profile_settings.module.scss";
|
import classes from "./profile_settings.module.scss";
|
||||||
|
|
||||||
const ProfileSettings: FunctionComponent = () => {
|
const ProfileSettings: FunctionComponent = () => {
|
||||||
const { isLoggedIn } = useAppContext();
|
const { isLoggedIn } = useAppContext();
|
||||||
const { route } = useLocation();
|
const { route } = useLocation();
|
||||||
useEffect(() => {
|
|
||||||
document.title = UrlsTitle.PROFILE;
|
|
||||||
}, []);
|
|
||||||
return (
|
return (
|
||||||
<div class={classes.container}>
|
<div class={classes.container}>
|
||||||
<div id={classes.avatar}>Аватар</div>
|
<div id={classes.avatar}>Аватар</div>
|
||||||
@@ -29,6 +26,7 @@ const ProfileSettings: FunctionComponent = () => {
|
|||||||
color="secondary"
|
color="secondary"
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
isLoggedIn.value = false;
|
isLoggedIn.value = false;
|
||||||
|
localStorage.setItem("loggedIn", "false");
|
||||||
route("/login", true);
|
route("/login", true);
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
@@ -41,4 +39,4 @@ const ProfileSettings: FunctionComponent = () => {
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
export default ProfileSettings;
|
export default withTitle(UrlsTitle.PROFILE, ProfileSettings);
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
import Task from "@/components/task";
|
import Task from "@/components/task";
|
||||||
|
import { withTitle } from "@/constructors/Component";
|
||||||
import { UrlsTitle } from "@/enums/urls";
|
import { UrlsTitle } from "@/enums/urls";
|
||||||
import { FunctionComponent } from "preact";
|
import { FunctionComponent } from "preact";
|
||||||
import { useEffect, useMemo } from "preact/hooks";
|
import { useMemo } from "preact/hooks";
|
||||||
import classes from "./profile_tasks.module.scss";
|
import classes from "./profile_tasks.module.scss";
|
||||||
|
|
||||||
const example_tasks = ["Test 1", "Test 2", "Test 3", "Test 4", "Test 5", "Test 6", "Test 7", "Test 8"];
|
const example_tasks = ["Test 1", "Test 2", "Test 3", "Test 4", "Test 5", "Test 6", "Test 7", "Test 8"];
|
||||||
@@ -12,9 +13,6 @@ const ProfileTasks: FunctionComponent = () => {
|
|||||||
const formatter = new Intl.DateTimeFormat("ru-RU", { month: "long", day: "numeric" });
|
const formatter = new Intl.DateTimeFormat("ru-RU", { month: "long", day: "numeric" });
|
||||||
return formatter.format(date);
|
return formatter.format(date);
|
||||||
}, []);
|
}, []);
|
||||||
useEffect(() => {
|
|
||||||
document.title = UrlsTitle.TASKS;
|
|
||||||
}, []);
|
|
||||||
return (
|
return (
|
||||||
<div class={classes.container}>
|
<div class={classes.container}>
|
||||||
<div class={classes.header}>Сегодня: {getDate}</div>
|
<div class={classes.header}>Сегодня: {getDate}</div>
|
||||||
@@ -27,4 +25,4 @@ const ProfileTasks: FunctionComponent = () => {
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
export default ProfileTasks;
|
export default withTitle(UrlsTitle.TASKS, ProfileTasks);
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import { stringToBoolean } from "@/utils/converter";
|
||||||
import { signal, Signal } from "@preact/signals";
|
import { signal, Signal } from "@preact/signals";
|
||||||
import { createContext, JSX } from "preact";
|
import { createContext, JSX } from "preact";
|
||||||
import { useContext } from "preact/hooks";
|
import { useContext } from "preact/hooks";
|
||||||
@@ -5,14 +6,15 @@ import { useContext } from "preact/hooks";
|
|||||||
interface AppContextValue {
|
interface AppContextValue {
|
||||||
isLoggedIn: Signal<boolean>;
|
isLoggedIn: Signal<boolean>;
|
||||||
}
|
}
|
||||||
|
const ininitialValue = stringToBoolean(localStorage.getItem("loggedIn"));
|
||||||
|
|
||||||
const AppContext = createContext<AppContextValue>({
|
const AppContext = createContext<AppContextValue>({
|
||||||
isLoggedIn: signal(false),
|
isLoggedIn: signal(ininitialValue),
|
||||||
});
|
});
|
||||||
|
|
||||||
const AppProvider = ({ children }: { children: JSX.Element }) => {
|
const AppProvider = ({ children }: { children: JSX.Element }) => {
|
||||||
const value: AppContextValue = {
|
const value: AppContextValue = {
|
||||||
isLoggedIn: signal(false),
|
isLoggedIn: signal(ininitialValue),
|
||||||
};
|
};
|
||||||
|
|
||||||
return <AppContext.Provider value={value}>{children}</AppContext.Provider>;
|
return <AppContext.Provider value={value}>{children}</AppContext.Provider>;
|
||||||
|
|||||||
5
src/utils/converter.ts
Normal file
5
src/utils/converter.ts
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
export const stringToBoolean = (value: string | null): boolean => {
|
||||||
|
if (value === "true") return true;
|
||||||
|
if (value === "false") return false;
|
||||||
|
return false;
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user