From a4c0d88cf6d2137f61fc6005ad2c6339c7f3c9d8 Mon Sep 17 00:00:00 2001 From: lonkaars Date: Fri, 12 Mar 2021 16:10:01 +0100 Subject: toast context working --- components/toast.tsx | 77 ++++++++++++++++++++++++++++++++-------------------- pages/_app.tsx | 5 +++- pages/user.tsx | 25 +++++++++++++---- 3 files changed, 71 insertions(+), 36 deletions(-) diff --git a/components/toast.tsx b/components/toast.tsx index 03a6255..5bfc0ae 100644 --- a/components/toast.tsx +++ b/components/toast.tsx @@ -1,10 +1,11 @@ -import { CSSProperties, ReactNode, Component } from "react"; +import { CSSProperties, ReactNode, useState, createContext } from "react"; import CloseIcon from '@material-ui/icons/Close'; -export function ToastArea(props: { +function ToastArea(props: { style?: CSSProperties children?: ReactNode + rerender?: boolean; }) { return
{props.children}
} -export class Toast extends Component<{ +function Toast(props: { text?: string icon?: ReactNode children?: ReactNode type?: "normal"|"confirmation"|"error" style?: CSSProperties -}> { - state = { render: true } +}) { + var [visible, setVisibility] = useState(true); - close = () => this.setState({ render: false }) + setTimeout(() => setVisibility(false), 10e3); - render () { - if (!this.state.render) return null; - return
+ return visible &&
{ - this.props.children ? - this.props.children : + props.children ||
{this.props.icon}
+ }}>{props.icon}

{this.props.text}

+ fontSize: 20, + userSelect: "none" + }}>{props.text}
+ }} onClick={() => setVisibility(false)}>
} -
- } + +} + +export var ToastContext = createContext<{ toast?: (message: string, + type: "confirmation"|"normal"|"error", + icon?: ReactNode ) => void }>({}); +var toasts: Array = []; + +export function ToastContextWrapper(props: { children?: ReactNode }) { + var [dummyState, rerender] = useState(false); + + return { + toasts.push(); + rerender(!dummyState); + } }}> + { props.children } + + {toasts} + + } diff --git a/pages/_app.tsx b/pages/_app.tsx index 3c238b9..651d05d 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -1,5 +1,6 @@ import Head from 'next/head'; import { PreferencesContextWrapper } from '../components/preferencesContext'; +import { ToastContextWrapper } from '../components/toast'; import '../styles/global.css'; import '../styles/dark.css'; @@ -12,7 +13,9 @@ export default function VierOpEenRijWebsite({ Component, pageProps }) { - + + + } diff --git a/pages/user.tsx b/pages/user.tsx index 71177d3..c7a78e6 100644 --- a/pages/user.tsx +++ b/pages/user.tsx @@ -1,4 +1,4 @@ -import { ReactNode, Children, useState, useEffect } from 'react'; +import { ReactNode, Children, useState, useEffect, useContext } from 'react'; import Icon from '@mdi/react'; import axios from 'axios'; @@ -8,6 +8,7 @@ import { Vierkant, IconLabelButton } from '../components/ui'; import { AccountAvatar } from '../components/account'; import { userInfo, userGames } from '../api/api'; import RecentGames from '../components/recentGames'; +import { ToastContext } from '../components/toast'; import PersonAddOutlinedIcon from '@material-ui/icons/PersonAddOutlined'; import AssignmentIndOutlinedIcon from '@material-ui/icons/AssignmentIndOutlined'; @@ -72,15 +73,19 @@ export default function AccountPage() { var [user, setUser] = useState(); var [ownPage, setOwnPage] = useState(false); var [gameInfo, setGameInfo] = useState(); + var [loggedIn, setLoggedIn] = useState(false); var [editingStatus, setEditingStatus] = useState(false); + var { toast } = useContext(ToastContext); + useEffect(() => {(async() => { if (gotData) return; if (typeof window === "undefined") return; var id = new URLSearchParams(window.location.search).get("id"); var loggedIn = document.cookie.includes("token"); + setLoggedIn(loggedIn); if (id || loggedIn) { var self_id = ""; @@ -137,7 +142,7 @@ export default function AccountPage() {

{user?.status}

+ }} suppressContentEditableWarning={true}>{user?.status}

- { + { loggedIn &&
{ ownPage ?
} href="/settings" text="Instellingen"/> @@ -170,10 +175,18 @@ export default function AccountPage() { }
:
- } text="Blokkeren"/> - } text="Vriendschapsverzoek"/> + } text="Blokkeren" onclick={() => { + toast(`${user.username} geblokkeerd`, + "confirmation", + ) + }}/> + } text="Vriendschapsverzoek" onclick={() => { + toast("Vriendschapsverzoek gestuurd", + "confirmation", + ) + }}/>
- } + }
}
-- cgit v1.2.3