Files
nirvana-v3/packages/legacy/router/index.tsx
2022-05-12 15:24:36 -05:00

144 lines
4.4 KiB
TypeScript

import {
$desktopMode,
$maxNumberActiveStreams,
$numberActiveLines,
$selectedLineId,
} from '../../controller/recoil';
import Channels, {
DEFAULT_APP_PRESET,
Dimensions,
} from '../../electron/constants';
import { useCallback, useEffect, useState } from 'react';
import { useRecoilState, useRecoilValue } from 'recoil';
import FullMottoLogo from '../../../../components/logo/fullMotto';
import { LineDataProvider } from '../../controller/lineDataProvider';
import { LogoType } from '@nirvana/components/logo/full';
import NirvanaHeader from '../../components/header/index';
import NirvanaTerminal from '../terminal.tsx';
export default function NirvanaRouter() {
const [selectedLineId, setSelectedLineId] = useRecoilState($selectedLineId);
const [desktopMode, setDesktopMode] = useRecoilState($desktopMode);
const numberOfOverlayColumns = useRecoilValue($numberActiveLines);
const numberOfOverlayRows = useRecoilValue($maxNumberActiveStreams);
// handle all window resizing logic
useEffect(() => {
// add dimensions if it's not overlay only mode
let finalDimensions: Dimensions = { height: 0, width: 0 };
let finalPosition: 'center' | 'topRight';
const setAlwaysOnTop = desktopMode === 'overlayOnly';
// go hunting for which dimensions to have
if (desktopMode === 'terminal' || desktopMode == 'flowState') {
finalDimensions = DEFAULT_APP_PRESET;
}
if (desktopMode === 'overlayOnly') {
finalDimensions = {
height: 68 + numberOfOverlayRows * 200,
width: 360 + 360 * numberOfOverlayColumns,
};
}
console.log(
'setting new dimensions',
desktopMode,
numberOfOverlayColumns,
numberOfOverlayRows,
finalDimensions,
setAlwaysOnTop
);
// send the final dimensions to main process
window.electronAPI.window.resizeWindow({
setAlwaysOnTop,
dimensions: {
height: finalDimensions.height,
width: finalDimensions.width,
},
setPosition: finalPosition,
addDimensions: false,
});
}, [desktopMode, numberOfOverlayColumns, numberOfOverlayRows]);
// on window blur, put app in overlay only mode
// get rid of selected line from terminal if we had any...
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'
);
// TODO: testing mode... uncomment both instructions below
// setDesktopMode("overlayOnly");
// todo: make sure that if I am toggle broadcasted into a line, then don't deselect selected line
// the overlay should be showing selected line if I am broadcasting toggled into it as well as of course all other toggle tuned ones
// setSelectedLineId(null);
});
}, [setDesktopMode, setSelectedLineId]);
return (
<div className='flex flex-col flex-1'>
<NirvanaHeader onHeaderFocus={() => setDesktopMode('terminal')} />
{desktopMode === 'flowState' && <FlowState />}
{/* remount nirvana terminal */}
{(desktopMode === 'terminal' || desktopMode === 'overlayOnly') && (
<LineDataProvider>
<NirvanaTerminal overlayOnly={desktopMode === 'overlayOnly'} />
</LineDataProvider>
)}
</div>
);
}
type Quote = {
content: string;
author: string;
length: number;
dateAdded: Date;
_id: string;
tags: string[];
};
function FlowState() {
const [quote, setQuote] = useState<Quote>(null);
useEffect(() => {
fetch('https://api.quotable.io/random')
.then((res) => res.json())
.then((data: Quote) => {
console.warn(data);
setQuote(data);
})
.catch((error) => {
// do nothing, don't bother user, just don't show the quote
console.warn(error);
});
}, []);
return (
<div className='flex flex-col flex-1 justify-center items-center relative'>
{/* <img src="https://source.unsplash.com/random/?nature" /> */}
<FullMottoLogo
type={LogoType.small}
className={'absolute bottom-2 mx-auto'}
/>
{quote && (
<span className='flex flex-col justify-center items-center max-w-screen-sm'>
<span className='text-xl text-gray-800 font-semibold text-center'>
"{quote.content}"
</span>
<span className='tex-md italic text-gray-400'>{quote.author}</span>
</span>
)}
</div>
);
}