This repository has been archived on 2023-11-14. You can view files and clone it, but cannot push or open issues/pull-requests.
viscord/packages/renderer/src/pages/Channels.tsx

107 lines
2.6 KiB
TypeScript
Raw Normal View History

2022-07-22 17:09:28 -04:00
import { useCallback, useContext, useEffect, useRef, useState } from 'react';
2022-07-21 23:45:52 -04:00
import { registerRouter, router, send, unregisterRouter } from '../lib/api';
2022-07-22 17:09:28 -04:00
import { channelContext } from './App';
2022-07-21 23:45:52 -04:00
function useRouter(actions: Function | object, deps: any[]) {
const _router = typeof actions === 'object' ? router(actions) : actions;
useEffect(() => {
registerRouter(_router);
return () => {
unregisterRouter(_router);
};
}, deps);
return {
send: send,
};
}
interface IChannel {
uid: string;
name: string;
}
2022-07-22 01:45:11 -04:00
function Hashmark() {
return <span style={{
fontWeight: 'bold',
marginRight: '8px',
marginLeft: '8px',
}}>#</span>;
}
2022-07-21 23:45:52 -04:00
export default function Channels() {
const [channels, setChannels] = useState<IChannel[]>([]);
2022-07-22 17:09:28 -04:00
const {channel, setChannel} = useContext(channelContext);
2022-07-21 23:45:52 -04:00
const { send } = useRouter({
2022-07-22 01:45:11 -04:00
'channels:list'(data: IChannel[]) {
2022-07-21 23:45:52 -04:00
// console.log(data)
setChannels(data);
},
2022-07-22 01:45:11 -04:00
'channel:add'(channel: IChannel) {
setChannels([...channels, channel]);
},
2022-07-21 23:45:52 -04:00
}, [channels]);
useEffect(() => {
if(channels.length === 0) {
send('channels:list');
}
}, [channels]);
2022-07-22 17:09:28 -04:00
useEffect(() => {
if(channels.length === 0) return;
if(channel !== null) return;
setChannel(channels[0].uid);
}, [channel, channels]);
2022-07-22 01:45:11 -04:00
const textbox = useRef<HTMLInputElement>(null);
const add = useCallback(() => {
if(textbox.current === null) return;
const name = textbox.current.value;
textbox.current.value = '';
send('channel:add', { name });
}, []);
2022-07-21 23:45:52 -04:00
return (
<>
2022-07-22 01:45:11 -04:00
<br></br>
2022-07-22 17:09:28 -04:00
{channels.map(c => (
<div key={c.uid} style={{
2022-07-22 01:45:11 -04:00
margin: '8px 0px',
2022-07-22 17:09:28 -04:00
color: channel === c.uid ? 'cyan' : 'inherit',
cursor: 'pointer',
}} onClick={() => {
setChannel(c.uid);
2022-07-22 01:45:11 -04:00
}}>
2022-07-22 17:43:59 -04:00
<Hashmark></Hashmark>{c.name}
2022-07-22 01:45:11 -04:00
<a style={{ color: 'rgba(0, 100, 200, 1)', marginLeft: '8px', fontSize: '10px' }} href="#" onClick={() => {}}>Delete</a>
2022-07-21 23:45:52 -04:00
</div>
))}
2022-07-22 01:45:11 -04:00
<Hashmark></Hashmark><input
ref={textbox}
style={{
background: '#343746',
border: 'none',
padding: '8px',
borderRadius: '8px',
outline: 'none',
color: 'white',
fontSize: '16px',
width: '90px',
}}
/><button onClick={add} style={{
marginLeft: '8px',
background: '#bd93f9',
border: 'none',
color: 'white',
padding: '8px',
fontSize: '16px',
cursor: 'pointer',
borderRadius: '8px',
// lineHeight: '20px'
}}>ADD</button>
2022-07-21 23:45:52 -04:00
</>
);
}