mirror of
https://github.com/spacebarchat/client.git
synced 2024-11-25 11:42:30 +01:00
house keeping
This commit is contained in:
parent
fe6961acc2
commit
4b021ecafa
25
src/App.tsx
25
src/App.tsx
@ -11,7 +11,6 @@ import { arch, locale, platform, version } from "@tauri-apps/plugin-os";
|
||||
import { reaction } from "mobx";
|
||||
import ErrorBoundary from "./components/ErrorBoundary";
|
||||
import Loader from "./components/Loader";
|
||||
import OfflineBanner from "./components/banners/OfflineBanner";
|
||||
import { UnauthenticatedGuard } from "./components/guards/UnauthenticatedGuard";
|
||||
import { BannerContext } from "./contexts/BannerContext";
|
||||
import useLogger from "./hooks/useLogger";
|
||||
@ -22,6 +21,7 @@ import { useAppStore } from "./stores/AppStore";
|
||||
import { Globals } from "./utils/Globals";
|
||||
// @ts-expect-error no types
|
||||
import FPSStats from "react-fps-stats";
|
||||
import VeryImportantBanner from "./components/banners/VeryImportantBanner";
|
||||
import { isTauri } from "./utils/Utils";
|
||||
|
||||
function App() {
|
||||
@ -69,6 +69,13 @@ function App() {
|
||||
};
|
||||
};
|
||||
|
||||
const hasVeryImportantBannerShown = localStorage.getItem("very_important_banner_dismissed");
|
||||
if (!hasVeryImportantBannerShown) {
|
||||
bannerContext.setContent({
|
||||
element: <VeryImportantBanner />,
|
||||
});
|
||||
}
|
||||
|
||||
isTauri && loadAsyncGlobals();
|
||||
Globals.load();
|
||||
app.loadSettings();
|
||||
@ -79,14 +86,14 @@ function App() {
|
||||
return dispose;
|
||||
}, []);
|
||||
|
||||
React.useEffect(() => {
|
||||
if (!app.isNetworkConnected)
|
||||
bannerContext.setContent({
|
||||
forced: true,
|
||||
element: <OfflineBanner />,
|
||||
});
|
||||
else bannerContext.close();
|
||||
}, [app.isNetworkConnected, bannerContext]);
|
||||
// React.useEffect(() => {
|
||||
// if (!app.isNetworkConnected)
|
||||
// bannerContext.setContent({
|
||||
// forced: true,
|
||||
// element: <OfflineBanner />,
|
||||
// });
|
||||
// else bannerContext.close();
|
||||
// }, [app.isNetworkConnected, bannerContext]);
|
||||
|
||||
return (
|
||||
<ErrorBoundary section="app">
|
||||
|
@ -21,48 +21,48 @@ function Banner() {
|
||||
const logger = useLogger("Banner");
|
||||
const bannerContext = React.useContext(BannerContext);
|
||||
|
||||
if (!bannerContext.content) return null;
|
||||
|
||||
return (
|
||||
<AnimatePresence>
|
||||
{bannerContext.content && (
|
||||
<Container
|
||||
variants={{
|
||||
show: {
|
||||
// slide down
|
||||
y: 0,
|
||||
transition: {
|
||||
delayChildren: 0.3,
|
||||
staggerChildren: 0.2,
|
||||
},
|
||||
<Container
|
||||
variants={{
|
||||
show: {
|
||||
// slide down
|
||||
y: 0,
|
||||
transition: {
|
||||
delayChildren: 0.3,
|
||||
staggerChildren: 0.2,
|
||||
},
|
||||
hide: {
|
||||
// slide up
|
||||
y: "-100%",
|
||||
transition: {
|
||||
delayChildren: 0.3,
|
||||
staggerChildren: 0.2,
|
||||
},
|
||||
},
|
||||
hide: {
|
||||
// slide up
|
||||
y: "-100%",
|
||||
transition: {
|
||||
delayChildren: 0.3,
|
||||
staggerChildren: 0.2,
|
||||
},
|
||||
}}
|
||||
initial="hide"
|
||||
animate="show"
|
||||
exit="hide"
|
||||
onAnimationComplete={() => {
|
||||
logger.debug("animation complete");
|
||||
}}
|
||||
style={bannerContext.content.style}
|
||||
>
|
||||
{bannerContext.content.element}
|
||||
{!bannerContext.content.forced && (
|
||||
<CloseWrapper
|
||||
onClick={() => {
|
||||
bannerContext.close();
|
||||
}}
|
||||
>
|
||||
<Icon icon="mdiClose" color="var(--text)" size="24px" />
|
||||
</CloseWrapper>
|
||||
)}
|
||||
</Container>
|
||||
)}
|
||||
},
|
||||
}}
|
||||
initial="hide"
|
||||
animate="show"
|
||||
exit="hide"
|
||||
onAnimationComplete={() => {
|
||||
logger.debug("animation complete");
|
||||
}}
|
||||
style={bannerContext.content.style}
|
||||
>
|
||||
{bannerContext.content.element}
|
||||
{!bannerContext.content.forced && (
|
||||
<CloseWrapper
|
||||
onClick={() => {
|
||||
bannerContext.close();
|
||||
}}
|
||||
>
|
||||
<Icon icon="mdiClose" color="var(--text)" size="24px" />
|
||||
</CloseWrapper>
|
||||
)}
|
||||
</Container>
|
||||
</AnimatePresence>
|
||||
);
|
||||
}
|
||||
|
39
src/components/banners/VeryImportantBanner.tsx
Normal file
39
src/components/banners/VeryImportantBanner.tsx
Normal file
@ -0,0 +1,39 @@
|
||||
import styled from "styled-components";
|
||||
import { modalController } from "../../controllers/modals";
|
||||
import Button from "../Button";
|
||||
|
||||
const Wrapper = styled.div`
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
background-color: var(--primary);
|
||||
flex: 1;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
`;
|
||||
|
||||
const Text = styled.span`
|
||||
padding: 10px;
|
||||
`;
|
||||
|
||||
function VeryImportantBanner() {
|
||||
return (
|
||||
<Wrapper>
|
||||
<Text>We have a suprise for you!</Text>
|
||||
<Button
|
||||
onClick={() => {
|
||||
modalController.push({
|
||||
type: "very_important",
|
||||
});
|
||||
}}
|
||||
style={{
|
||||
backgroundColor: "var(--primary-light)",
|
||||
border: "1px solid var(--primary-dark)",
|
||||
}}
|
||||
>
|
||||
Show me
|
||||
</Button>
|
||||
</Wrapper>
|
||||
);
|
||||
}
|
||||
|
||||
export default VeryImportantBanner;
|
36
src/components/modals/VeryImportantModal.tsx
Normal file
36
src/components/modals/VeryImportantModal.tsx
Normal file
@ -0,0 +1,36 @@
|
||||
import { useContext } from "react";
|
||||
import styled from "styled-components";
|
||||
import { BannerContext } from "../../contexts/BannerContext";
|
||||
import { ModalProps } from "../../controllers/modals/types";
|
||||
import { Modal } from "./ModalComponents";
|
||||
|
||||
const Text = styled.span`
|
||||
padding: 10px;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
display: flex;
|
||||
flex: 1;
|
||||
`;
|
||||
|
||||
export function VeryImportantModal({ ...props }: ModalProps<"very_important">) {
|
||||
const bannerContext = useContext(BannerContext);
|
||||
return (
|
||||
<Modal
|
||||
{...props}
|
||||
actions={[
|
||||
{
|
||||
onClick: () => {
|
||||
localStorage.setItem("very_important_banner_dismissed", "true");
|
||||
bannerContext.close();
|
||||
return true;
|
||||
},
|
||||
confirmation: true,
|
||||
children: <span>I've been clowned</span>,
|
||||
palette: "primary",
|
||||
},
|
||||
]}
|
||||
>
|
||||
<Text>April fools! 🤡</Text>
|
||||
</Modal>
|
||||
);
|
||||
}
|
@ -15,6 +15,7 @@ import {
|
||||
LeaveServerModal,
|
||||
SettingsModal,
|
||||
} from "../../components/modals";
|
||||
import { VeryImportantModal } from "../../components/modals/VeryImportantModal";
|
||||
import { Modal } from "./types";
|
||||
|
||||
function randomUUID() {
|
||||
@ -187,4 +188,5 @@ export const modalController = new ModalControllerExtended({
|
||||
// modify_displayname: ModifyDisplayname,
|
||||
// changelog_usernames: ChangelogUsernames,
|
||||
settings: SettingsModal,
|
||||
very_important: VeryImportantModal,
|
||||
});
|
||||
|
@ -10,7 +10,7 @@ export type Modal = {
|
||||
key?: string;
|
||||
} & (
|
||||
| {
|
||||
type: "add_server" | "create_server" | "join_server" | "settings";
|
||||
type: "add_server" | "create_server" | "join_server" | "settings" | "very_important";
|
||||
}
|
||||
| {
|
||||
type: "error";
|
||||
|
Loading…
Reference in New Issue
Block a user