feat: support loading

This commit is contained in:
草鞋没号 2021-11-02 10:19:50 +08:00
parent ad9e8a4937
commit 62531ae987
5 changed files with 104 additions and 2 deletions

View File

@ -9,12 +9,16 @@ const WINDOWS: Record<string, BrowserWindow | null> = {
function mainWin() { function mainWin() {
WINDOWS.main = new BrowserWindow({ WINDOWS.main = new BrowserWindow({
title: 'Main window', title: 'Main window',
webPreferences: {
preload: join(__dirname, '../preload/index.main')
},
}) })
if (app.isPackaged) { if (app.isPackaged) {
WINDOWS.main.loadFile(join(__dirname, '../react-ts/index.html')) WINDOWS.main.loadFile(join(__dirname, '../react-ts/index.html'))
} else { } else {
WINDOWS.main.loadURL(`http://127.0.0.1:${process.env.PORT}`) WINDOWS.main.loadURL(`http://127.0.0.1:${process.env.PORT}`)
WINDOWS.main.maximize()
} }
} }

View File

@ -1 +1,25 @@
console.log('index.main.ts') import fs from 'fs'
import path from 'path'
import { contextBridge, ipcRenderer } from 'electron'
import { domReady } from './utils'
import { useLoading } from './loading'
const { appendLoading, removeLoading } = useLoading()
; (async () => {
await domReady()
appendLoading()
})();
// ---------------------------------------------------
contextBridge.exposeInMainWorld('bridge', {
__dirname,
__filename,
fs,
path,
ipcRenderer,
removeLoading,
})

56
preload/loading.ts Normal file
View File

@ -0,0 +1,56 @@
/**
* https://tobiasahlin.com/spinkit
* https://connoratherton.com/loaders
* https://projects.lukehaas.me/css-loaders
* https://matejkustec.github.io/SpinThatShit
*/
export function useLoading() {
const className = `loaders-css__square-spin`
const styleContent = `
@keyframes square-spin {
25% { transform: perspective(100px) rotateX(180deg) rotateY(0); }
50% { transform: perspective(100px) rotateX(180deg) rotateY(180deg); }
75% { transform: perspective(100px) rotateX(0) rotateY(180deg); }
100% { transform: perspective(100px) rotateX(0) rotateY(0); }
}
.${className} > div {
animation-fill-mode: both;
width: 50px;
height: 50px;
background: #fff;
animation: square-spin 3s 0s cubic-bezier(0.09, 0.57, 0.49, 0.9) infinite;
}
.app-loading-wrap {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
display: flex;
align-items: center;
justify-content: center;
background: #282c34;
z-index: 9;
}
`
const oStyle = document.createElement('style')
const oDiv = document.createElement('div')
oStyle.id = 'app-loading-style'
oStyle.innerHTML = styleContent
oDiv.className = 'app-loading-wrap'
oDiv.innerHTML = `<div class="${className}"><div></div></div>`
return {
appendLoading() {
document.head.appendChild(oStyle)
document.body.appendChild(oDiv)
},
removeLoading() {
document.head.removeChild(oStyle)
document.body.removeChild(oDiv)
},
}
}

15
preload/utils.ts Normal file
View File

@ -0,0 +1,15 @@
/** docoment ready */
export function domReady(condition: DocumentReadyState[] = ['complete', 'interactive']) {
return new Promise(resolve => {
if (condition.includes(document.readyState)) {
resolve(true)
} else {
document.addEventListener('readystatechange', () => {
if (condition.includes(document.readyState)) {
resolve(true)
}
})
}
})
}

View File

@ -7,5 +7,8 @@ ReactDOM.render(
<React.StrictMode> <React.StrictMode>
<App /> <App />
</React.StrictMode>, </React.StrictMode>,
document.getElementById('root') document.getElementById('root'),
() => {
window.bridge.removeLoading()
},
) )