adding some overlay stuff but still need better ux

This commit is contained in:
talksik
2022-05-01 16:04:58 -05:00
parent 78e247732c
commit 38061e3545
10 changed files with 120 additions and 39 deletions
@@ -84,7 +84,7 @@ export default function NirvanaHeader() {
> >
<Logo type="small" /> <Logo type="small" />
<div className="mx-auto flex flex-row items-center space-x-2"> <div className="mx-auto flex flex-row items-center space-x-2 ml-2">
<FaSearch className="text-xs text-gray-300" /> <FaSearch className="text-xs text-gray-300" />
<input <input
placeholder="Type / to search" placeholder="Type / to search"
@@ -0,0 +1,22 @@
import { Avatar } from "antd";
export default function LineIcon({ sourceImages }: { sourceImages: string[] }) {
return (
<Avatar.Group
maxCount={2}
maxPopoverTrigger="click"
size="default"
maxStyle={{
color: "#f56a00",
backgroundColor: "#fde3cf",
cursor: "pointer",
borderRadius: "0",
}}
className="shadow-lg"
>
{sourceImages?.map((avatarSrc) => (
<Avatar src={avatarSrc} shape="square" size={"default"} />
))}
</Avatar.Group>
);
}
@@ -3,6 +3,7 @@ import { useCallback, useMemo } from "react";
import { Avatar } from "antd"; import { Avatar } from "antd";
import { FiSun } from "react-icons/fi"; import { FiSun } from "react-icons/fi";
import { ILineDetails } from "../../../pages/router/index"; import { ILineDetails } from "../../../pages/router/index";
import LineIcon from "../lineIcon";
export default function LineRow({ export default function LineRow({
lineDetails, lineDetails,
@@ -87,22 +88,9 @@ export default function LineRow({
{renderActivityIcon} {renderActivityIcon}
<span className="flex flex-row gap-2 items-center justify-start text-slate-800"> <span className="flex flex-row gap-2 items-center justify-start text-slate-800">
<Avatar.Group {lineDetails.profilePictures && (
maxCount={2} <LineIcon sourceImages={lineDetails.profilePictures} />
maxPopoverTrigger="click" )}
size="default"
maxStyle={{
color: "#f56a00",
backgroundColor: "#fde3cf",
cursor: "pointer",
borderRadius: "0",
}}
className="shadow-lg"
>
{lineDetails.profilePictures.map((avatarSrc) => (
<Avatar src={avatarSrc} shape="square" size={"default"} />
))}
</Avatar.Group>
<h2 <h2
className={`text-inherit text-md truncate ${ className={`text-inherit text-md truncate ${
+4 -7
View File
@@ -6,6 +6,7 @@ enum Channels {
ACTIVATE_LOG_IN = "ACTIVATE_LOG_IN", ACTIVATE_LOG_IN = "ACTIVATE_LOG_IN",
GOOGLE_AUTH_TOKENS = "GOOGLE_AUTH_TOKENS", GOOGLE_AUTH_TOKENS = "GOOGLE_AUTH_TOKENS",
RESIZE_WINDOW = "RESIZE_WINDOW", RESIZE_WINDOW = "RESIZE_WINDOW",
ON_WINDOW_BLUR = "ON_WINDOW_BLUR",
} }
export enum STORE_ITEMS { export enum STORE_ITEMS {
@@ -22,17 +23,13 @@ export const DimensionPresets = {
height: 675, height: 675,
width: 400, width: 400,
}, },
terminalDetailOrOverlay: { terminalAndDetails: {
height: 675,
width: 800,
},
terminalDetailOverlay: {
height: 675, height: 675,
width: 800, width: 800,
}, },
// todo: typically just send whatever dimensions are needed // todo: typically just send whatever dimensions are needed
overlayMode: { overlayOnlyMode: {
height: -1, height: 800,
width: 300, width: 300,
}, },
}; };
+29 -2
View File
@@ -5,6 +5,7 @@ import {
dialog, dialog,
globalShortcut, globalShortcut,
ipcMain, ipcMain,
screen,
} from "electron"; } from "electron";
import Channels, { Dimensions } from "./electron/constants"; import Channels, { Dimensions } from "./electron/constants";
@@ -37,11 +38,11 @@ const createWindow = (): void => {
preload: MAIN_WINDOW_PRELOAD_WEBPACK_ENTRY, preload: MAIN_WINDOW_PRELOAD_WEBPACK_ENTRY,
sandbox: true, sandbox: true,
}, },
alwaysOnTop: true,
icon: "./assets/1024x1024.icns", icon: "./assets/1024x1024.icns",
frame: false, frame: false,
roundedCorners: false, roundedCorners: false,
transparent: true,
}); });
// and load the index.html of the app. // and load the index.html of the app.
@@ -77,13 +78,39 @@ app
ipcMain.on(Channels.RESIZE_WINDOW, (event, arg) => { ipcMain.on(Channels.RESIZE_WINDOW, (event, arg) => {
const { width, height } = arg; const { width, height } = arg;
browserWindow.setSize(width, height, false); if (
width === DimensionPresets.overlayOnlyMode.width &&
height === DimensionPresets.overlayOnlyMode.height
) {
browserWindow.setAlwaysOnTop(true, "floating");
// move window/overlay to top right
let display = screen.getPrimaryDisplay();
browserWindow.setPosition(display.bounds.width, display.bounds.height);
} else browserWindow.setAlwaysOnTop(false);
browserWindow.setSize(width, height, true);
}); });
}) })
.then(() => { .then(() => {
// globalShortcut.register("`", () => { // globalShortcut.register("`", () => {
// console.log("Electron loves global shortcuts!"); // console.log("Electron loves global shortcuts!");
// }); // });
// on blur, show overlay, and tell app to trigger overlay mode
browserWindow.on("blur", () => {
// browserWindow.setAlwaysOnTop(true, "floating");
// let frontend handshake and then send remote control to change size
// const overlayDimensions = DimensionPresets.overlayMode;
// browserWindow.setSize(
// overlayDimensions.width,
// overlayDimensions.height,
// true
// );
browserWindow.webContents.send(Channels.ON_WINDOW_BLUR);
});
}); });
// Quit when all windows are closed, except on macOS. There, it's common // Quit when all windows are closed, except on macOS. There, it's common
@@ -1,4 +1,5 @@
import { ILineDetails } from "../router"; import { ILineDetails } from "../router";
import LineIcon from "../../components/lines/lineIcon/index";
export default function LineDetailsTerminal({ export default function LineDetailsTerminal({
selectedLine, selectedLine,
@@ -6,8 +7,28 @@ export default function LineDetailsTerminal({
selectedLine: ILineDetails; selectedLine: ILineDetails;
}) { }) {
return ( return (
<div className="flex flex-col flex-1"> <div
this is the line details for {selectedLine.name} id={`${selectedLine.lineId}-lineDetailsTerminal`}
className="flex flex-col flex-1 bg-gray-100 h-full"
>
{/* line overview header */}
<div className="flex flex-row p-3 items-center gap-1">
<LineIcon sourceImages={selectedLine.profilePictures} />
<span className="flex flex-col items-start gap-1">
<h2
className={`text-inherit text-md truncate ${
selectedLine.hasNewActivity ? "font-semibold" : ""
}`}
>
{selectedLine.name}
</h2>
<span className="text-xs text-gray-300">
{`${selectedLine.numberMembers} members`}
</span>
</span>
</div>
</div> </div>
); );
} }
+5 -1
View File
@@ -66,7 +66,11 @@ function NirvanaApp() {
<ProtectedRoute> <ProtectedRoute>
<NirvanaRouter /> <NirvanaRouter />
</ProtectedRoute> </ProtectedRoute>
<ReactQueryDevtools initialIsOpen={true} position={"bottom-left"} />
<ReactQueryDevtools
initialIsOpen={false}
position={"bottom-left"}
/>
</RecoilRoot> </RecoilRoot>
</ThemeProvider> </ThemeProvider>
<Toaster /> <Toaster />
+3 -1
View File
@@ -1,3 +1,5 @@
export default function Overlay() { export default function Overlay() {
return <div className="flex flex-col flex-1">this is the overlay</div>; return (
<div className="flex flex-col bg-transparent">this is the overlay</div>
);
} }
+27 -9
View File
@@ -1,4 +1,7 @@
import { DimensionPresets, Dimensions } from "../../electron/constants"; import Channels, {
DimensionPresets,
Dimensions,
} from "../../electron/constants";
import React, { useState } from "react"; import React, { useState } from "react";
import { useCallback, useEffect, useMemo } from "react"; import { useCallback, useEffect, useMemo } from "react";
@@ -224,12 +227,23 @@ const testLines: ILineDetails[] = [
), ),
]; ];
type DesktopMode = "overlay" | "terminal" | "terminalAndDetails";
export default function NirvanaRouter() { export default function NirvanaRouter() {
const [selectedLineId, setSelectedLineId] = useState<string>(null); const [selectedLineId, setSelectedLineId] = useState<string>(null);
const [desktopMode, setDesktopMode] = useState<Dimensions>( const [desktopMode, setDesktopMode] = useState<Dimensions>(
DimensionPresets.terminal DimensionPresets.terminal
); );
useEffect(() => {
window.electronAPI.on(Channels.ON_WINDOW_BLUR, () => {
console.log(
"window blurring now, should be always on top and then ill tell main process to change dimensions"
);
setDesktopMode(DimensionPresets.overlayOnlyMode);
});
}, []);
useEffect(() => { useEffect(() => {
window.electronAPI.window.resizeWindow(desktopMode); window.electronAPI.window.resizeWindow(desktopMode);
}, [desktopMode]); }, [desktopMode]);
@@ -237,12 +251,12 @@ export default function NirvanaRouter() {
useEffect(() => { useEffect(() => {
if (selectedLineId) { if (selectedLineId) {
setSelectedLineId(selectedLineId); setSelectedLineId(selectedLineId);
setDesktopMode(DimensionPresets.terminalDetailOverlay); setDesktopMode(DimensionPresets.terminalAndDetails);
} else { } else {
setSelectedLineId(null); setSelectedLineId(null);
setDesktopMode(DimensionPresets.terminal); setDesktopMode(DimensionPresets.terminal);
} }
}, [selectedLineId, desktopMode, setDesktopMode]); }, [selectedLineId, setDesktopMode]);
/** show user line details */ /** show user line details */
const handleSelectLine = useCallback( const handleSelectLine = useCallback(
@@ -262,14 +276,18 @@ export default function NirvanaRouter() {
<NirvanaHeader /> <NirvanaHeader />
<div className="flex flex-row"> <div className="flex flex-row">
<NirvanaTerminal {(desktopMode === DimensionPresets.terminal ||
handleSelectLine={handleSelectLine} desktopMode === DimensionPresets.terminalAndDetails) && (
allLines={testLines} <NirvanaTerminal
/> handleSelectLine={handleSelectLine}
allLines={testLines}
/>
)}
{selectedLine && <LineDetailsTerminal selectedLine={selectedLine} />} {desktopMode === DimensionPresets.terminalAndDetails &&
selectedLine && <LineDetailsTerminal selectedLine={selectedLine} />}
{/* <Overlay /> */} <Overlay />
</div> </div>
</div> </div>
); );
@@ -12,6 +12,8 @@ export default function NirvanaTerminal({
handleSelectLine: (lineId: string) => void; handleSelectLine: (lineId: string) => void;
allLines: ILineDetails[]; allLines: ILineDetails[];
}) { }) {
// todo: sort/order based on activity and activity date and currently broadcasting/live
const toggleTunedLines = useMemo( const toggleTunedLines = useMemo(
() => allLines.filter((line) => line.isUserToggleTunedIn), () => allLines.filter((line) => line.isUserToggleTunedIn),
[] []