Woongjae Lee
NHN Dooray - Frontend Team
2woongjae@gmail.com
const ref = database.ref();
ref.child('general').push().set({
이메일: '메일 주소',
닉네임: '누구',
내용: '어쩌구',
시간: '언제'
});
<section class="section" id="write-section">
<div class="container">
<div class="field">
<div class="control">
<textarea class="textarea" placeholder="Explain how we can help you"></textarea>
</div>
</div>
<div class="field">
<div class="control">
<button class="button is-primary" id="btn-send-message">Send message</button>
</div>
</div>
</div>
</section>
const btnSendMessage = document.querySelector('#btn-send-message') as HTMLButtonElement;
btnSendMessage.addEventListener('click', () => {
console.log('#btn-send-message click');
ipcRenderer.send('send-message');
});
ipcMain.on('send-message', async event => {
if (auth.currentUser) {
const ref = database.ref();
ref.child('general').push().set({
email: '이메일 주소',
name: '이름',
message: '메세지',
time: '시간'
});
}
});
export interface LoginObjectType {
email: string;
password: string;
}
export interface MessageObjectType {
id: string;
email: string;
name: string;
message: string;
time: string;
}
ref.child('general').on('value', snapshot => {
if (snapshot) {
const data = snapshot.val();
const messageObjects: MessageObjectType[] = Object.keys(data).map(id => {
const messageObject: MessageObjectType = {
id,
email: data[id].email,
name: data[id].name,
message: data[id].message,
time: data[id].time
};
return messageObject;
});
event.sender.send('general-message', messageObjects);
}
});
ipcRenderer.on('general-message', (event, arg: MessageObjectType[]) => {
console.log('receive : general-message');
const messagesHTML = arg.map(messageObject => {
return `
<div class="box">
<article class="media">
<div class="media-content">
<div class="content">
<p>
<strong>${messageObject.name}</strong> <small>${messageObject.email}</small> <small>${messageObject.time}</small>
<br>
${messageObject.message}
</p>
</div>
</div>
</article>
</div>
`;
}).join('');
const messageContainer = document.querySelector('#message-container') as HTMLDivElement;
messageContainer.innerHTML = messagesHTML;
});
btnSendMessage.addEventListener('click', () => {
console.log('#btn-send-message click');
const messageDom = document.querySelector('#message') as HTMLTextAreaElement;
const message = messageDom.value;
if (message === '') {
return;
}
ipcRenderer.send('send-message', message);
});
ipcMain.on('send-message', async (event, message: string) => {
if (auth.currentUser) {
const ref = database.ref();
ref.child('general').push().set({
email: auth.currentUser.email,
name: '2woongjae',
message: message,
time: new Date().toISOString()
});
}
});
btnSendMessage.addEventListener('click', () => {
console.log('#btn-send-message click');
const messageDom = document.querySelector('#message') as HTMLTextAreaElement;
const message = messageDom.value;
if (message === '') {
return;
}
ipcRenderer.send('send-message', message);
messageDom.value = '';
});
const win = new BrowserWindow({
width: 500,
minWidth: 500,
maxWidth: 500,
height: 700,
minHeight: 700,
maxHeight: 700,
maximizable: false
});
#btn-toggle {
display: none;
}
<section class="hero is-primary is-medium" id="nav-section">
<div class="hero-head">
<header class="nav">
<div class="container">
<div class="nav-left">
<a class="nav-item is-active">
Electron with TypeScript Hands-On Labs
</a>
</div>
<span class="nav-toggle" id="btn-toggle" data-target="nav-menu">
<span></span>
<span></span>
<span></span>
</span>
<div class="nav-right nav-menu" id="nav-menu">
<a class="nav-item is-active">
#general
</a>
<span class="nav-item" id="btn-logout">
<a class="button is-primary is-inverted">
<span class="icon">
<i class="fa fa-sign-out"></i>
</span>
<span>Logout</span>
</a>
</span>
</div>
</div>
</header>
</div>
</section>
const btnToggle = document.querySelector('#btn-toggle') as HTMLSpanElement;
const navMenu = document.querySelector(`#nav-menu`) as HTMLDivElement;
btnToggle.addEventListener('click', () => {
btnToggle.classList.toggle('is-active');
navMenu.classList.toggle('is-active');
});
ipcRenderer.on('login-success', (event, arg) => {
console.log('receive : login-success');
loginSection.style.display = 'none';
chatSection.style.display = 'block';
writeSection.style.display = 'block';
btnToggle.style.display = 'block';
});
ipcRenderer.on('logout-success', (event, arg) => {
console.log('receive : logout-success');
loginSection.style.display = 'block';
chatSection.style.display = 'none';
writeSection.style.display = 'none';
btnToggle.style.display = 'none';
btnToggle.classList.toggle('is-active');
navMenu.classList.toggle('is-active');
});
import {ipcRenderer, remote} from 'electron';
const {dialog} = remote;
const btnLogin = document.querySelector('#btn-login') as HTMLButtonElement;
const btnLogout = document.querySelector('#btn-logout') as HTMLButtonElement;
btnLogin.addEventListener('click', () => {
console.log('#btn-login click');
if (input_email.value.length < 4 || !validateEmail(input_email.value)) {
const win = remote.getCurrentWindow();
dialog.showMessageBox(win, {
message: 'Login Failed',
detail: '메일 주소가 유효하지 않습니다.'
}, () => {
input_email.focus();
});
return;
}
if (input_password.value.length < 4) {
const win = remote.getCurrentWindow();
dialog.showMessageBox(win, {
message: 'Login Failed',
detail: '패스워드가 유효하지 않습니다.'
}, () => {
input_password.focus();
});
return;
}
const loginObj: LoginObjectType = {
email: input_email.value,
password: input_password.value
};
ipcRenderer.send('request-login', loginObj);
});
try {
user = await auth.signInWithEmailAndPassword(arg.email, arg.password);
} catch (error) {
if (isFirebaseError(error)) {
console.log(error);
event.sender.send('login-error', error.code);
return;
} else {
throw error;
}
}
ipcRenderer.on('login-error', (event, code: string) => {
console.log('receive : login-error');
console.error(code);
if (code === 'auth/user-not-found') {
const win = remote.getCurrentWindow();
dialog.showMessageBox(win, {
message: 'Login Failed',
detail: '등록되지 않은 이메일 주소입니다.'
}, () => {
input_email.focus();
});
return;
} else if (code === 'auth/wrong-password') {
const win = remote.getCurrentWindow();
dialog.showMessageBox(win, {
message: 'Login Failed',
detail: '잘못된 비밀번호 입니다.'
}, () => {
input_password.focus();
});
return;
}
});
messageDom.addEventListener('keypress', e => {
if (e.shiftKey && e.keyCode === 13) {
e.preventDefault();
const message = messageDom.value;
if (message === '') {
return;
}
ipcRenderer.send('send-message', message);
messageDom.value = '';
}
});
By Woongjae Lee
타입스크립트 한국 유저 그룹 일렉트론 워크샵 201709