Files
classroomio/src/lib/components/Apps/index.svelte
T

170 lines
4.6 KiB
Svelte
Raw Normal View History

2021-05-22 22:25:33 +03:00
<script>
import { onMount } from 'svelte';
import hotkeys from 'hotkeys-js';
import Forum from 'carbon-icons-svelte/lib/Forum.svelte';
import AlignBoxTopLeft from 'carbon-icons-svelte/lib/AlignBoxTopLeft.svelte';
import SendAlt from 'carbon-icons-svelte/lib/SendAlt.svelte';
import ChartPie from 'carbon-icons-svelte/lib/ChartPie.svelte';
import IconButton from '$lib/components/IconButton/index.svelte';
import Settings from 'carbon-icons-svelte/lib/Settings.svelte';
import { apps } from './store';
2021-05-29 20:47:46 +03:00
import QandA from './components/QandA/index.svelte';
import LiveChat from './components/LiveChat/index.svelte';
import Notes from './components/Notes/index.svelte';
import Poll from './components/Poll/index.svelte';
import APPS_CONSTANTS from './constants';
import { OverflowMenu, OverflowMenuItem } from 'carbon-components-svelte';
2021-05-29 20:47:46 +03:00
let selectedApp;
function handleClose() {
selectedApp = null;
}
function handleAppClick(appName) {
if (appName === selectedApp) {
handleClose();
} else {
selectedApp = appName;
}
}
2021-05-31 11:28:46 +03:00
onMount(() => {
hotkeys('A+1,A+2,A+3,A+4', function (event, handler) {
2021-05-31 11:28:46 +03:00
event.preventDefault();
switch (handler.key) {
case 'A+1':
2021-05-31 11:28:46 +03:00
handleAppClick(APPS_CONSTANTS.APPS.LIVE_CHAT);
break;
case 'A+2':
2021-05-31 11:28:46 +03:00
handleAppClick(APPS_CONSTANTS.APPS.QANDA);
break;
case 'A+3':
2021-05-31 11:28:46 +03:00
handleAppClick(APPS_CONSTANTS.APPS.NOTES);
break;
case 'A+4':
2021-05-31 11:28:46 +03:00
handleAppClick(APPS_CONSTANTS.APPS.POLL);
break;
}
});
});
2021-05-22 22:25:33 +03:00
</script>
<div class={`root ${$apps.open ? 'open dark:bg-slate-800' : 'close dark:bg-slate-800'}`}>
<div class={`apps`}>
<div class="lg:hidden">
<IconButton
buttonClassName="lg:hidden"
toolTipProps={{ title: 'Settings', hotkeys: ['A', '0'] }}
onClick={() => {
handleAppClick;
$apps.dropdown = !$apps.dropdown;
}}
>
<Settings size={24} class="carbon-icon dark:text-white lg:hidden" />
</IconButton>
</div>
2021-05-31 11:28:46 +03:00
<IconButton
toolTipProps={{ title: 'Live Chat', hotkeys: ['A', '1'] }}
2021-05-31 11:28:46 +03:00
value={APPS_CONSTANTS.APPS.LIVE_CHAT}
onClick={handleAppClick}
2021-06-26 21:32:42 +03:00
selected={APPS_CONSTANTS.APPS.LIVE_CHAT === selectedApp}
>
<SendAlt size={24} class="carbon-icon dark:text-white" />
2021-05-31 11:28:46 +03:00
</IconButton>
<IconButton
toolTipProps={{ title: 'QandA', hotkeys: ['A', '2'] }}
2021-05-31 11:28:46 +03:00
value={APPS_CONSTANTS.APPS.QANDA}
onClick={handleAppClick}
2021-06-26 21:32:42 +03:00
selected={APPS_CONSTANTS.APPS.QANDA === selectedApp}
>
<Forum size={24} class="carbon-icon dark:text-white" />
2021-05-31 11:28:46 +03:00
</IconButton>
<IconButton
toolTipProps={{ title: 'Notes', hotkeys: ['A', '3'] }}
2021-05-31 11:28:46 +03:00
value={APPS_CONSTANTS.APPS.NOTES}
onClick={handleAppClick}
2021-06-26 21:32:42 +03:00
selected={APPS_CONSTANTS.APPS.NOTES === selectedApp}
>
<AlignBoxTopLeft size={24} class="carbon-icon dark:text-white" />
2021-05-31 11:28:46 +03:00
</IconButton>
<IconButton
toolTipProps={{ title: 'Poll', hotkeys: ['A', '4'] }}
2021-05-31 11:28:46 +03:00
value={APPS_CONSTANTS.APPS.POLL}
onClick={handleAppClick}
2021-06-26 21:32:42 +03:00
selected={APPS_CONSTANTS.APPS.POLL === selectedApp}
>
<ChartPie size={24} class="carbon-icon dark:text-white" />
2021-05-31 11:28:46 +03:00
</IconButton>
</div>
{#if !!selectedApp}
<div class="app">
{#if selectedApp === APPS_CONSTANTS.APPS.QANDA}
<QandA {handleClose} />
{:else if selectedApp === APPS_CONSTANTS.APPS.LIVE_CHAT}
<LiveChat {handleClose} />
{:else if selectedApp === APPS_CONSTANTS.APPS.POLL}
<Poll {handleClose} />
{:else if selectedApp === APPS_CONSTANTS.APPS.NOTES}
<Notes {handleClose} />
{/if}
</div>
{/if}
</div>
2021-06-26 21:32:42 +03:00
<style lang="scss">
.root {
height: calc(100vh - 48px);
2021-06-26 21:32:42 +03:00
position: sticky;
top: 0;
border-left: 1px solid var(--border-color);
display: flex;
flex-direction: row;
z-index: 1;
& .apps {
padding-top: 20px;
display: flex;
flex-direction: column;
align-items: center;
width: 60px;
border-right: 1px solid var(--border-color);
height: 100%;
}
& .app {
2021-07-05 10:52:20 +00:00
width: 400px;
2021-06-26 21:32:42 +03:00
transition: all 1s ease-out;
position: relative;
2021-07-05 10:52:20 +00:00
overflow: auto;
2021-06-26 21:32:42 +03:00
}
}
@media screen and (max-width: 1024px) {
.root {
position: absolute;
height: calc(100vh - 109px);
top: 109px;
right: 0;
z-index: 999;
}
.open {
position: absolute;
transform: translateX(0);
transition: all 0.2s ease-in-out;
}
.close {
position: absolute;
transform: translateX(100%);
display: none;
transition: all 0.2s ease-in-out;
}
}
2021-06-26 21:32:42 +03:00
</style>