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