ipcMain.removeAllListeners(this.channel);
}
- private _onPost = (_e: IpcMainEvent, payload?: string | null): void => {
+ private _onPost = (_e: IpcMainEvent, payload: InputParam): void => {
console.log(`[IPC] Post: ${this.channel}`);
-
- const params = payload ? JSON.parse(payload) : null;
- this._listenerCallback(params);
+ this._listenerCallback(payload);
}
}
import { sendMessage } from '@/session';
import { collect } from "@/audio";
import { updateAppState } from "@/account";
+import { onNavBar } from "@/window";
const CLIENT_MESSAGE_CHANNEL = "post-session-send"
const GET_AUDIO_CHANNEL = "post-audio-collect";
const APP_MOUNT_CHANNEL = "post-app-mount";
+const NAV_BAR_CHANNEL = "post-nav-bar";
+const WINDOW_BLUR_CHANNEL = "post-window-focus";
export const messageListener = new IpcListener<Message>({
channel: CLIENT_MESSAGE_CHANNEL,
channel: APP_MOUNT_CHANNEL,
listenerCallback: updateAppState
});
+
+export const navBarListener = new IpcListener({
+ channel: NAV_BAR_CHANNEL,
+ listenerCallback: onNavBar
+});
+
+
+const onWindowFocus: IpcListenerCallback<{ isFocused: boolean }> = (payload) => {
+ if (payload.isFocused) {
+ console.log('window is focused')
+ } else {
+ console.log('window is blurred')
+ }
+}
+
+export const windowFocusListener = new IpcListener({
+ channel: WINDOW_BLUR_CHANNEL,
+ listenerCallback: onWindowFocus
+});
<script lang="ts">
-import { defineComponent, onMounted } from "vue";
+import { defineComponent, onMounted, onUnmounted } from "vue";
import { IpcRendererEvent } from "electron";
import Splash from "@/render/components/splash.vue";
setup() {
- onMounted(() => postAppMount());
+ const onFocus = () => {
+ console.log('window is focused');
+ }
+
+ const onBlur = () => {
+ console.log('window is blurred');
+ }
+
+ onMounted(() => {
+ // subscribe to visibility change events
+ window.addEventListener('blur', onBlur);
+ window.addEventListener('focus', onFocus);
+
+ postAppMount()
+ });
+
+ onUnmounted(() => {
+ window.removeEventListener("blur", onBlur);
+ window.removeEventListener("focus", onFocus);
+ });
return {
authComplete,
// import { postNavBarExit, postNavBarMin } from "@/render/ipc";
import { defineComponent } from "vue";
+ import { postNavBar } from "@/render/ipc";
export default defineComponent({
name: "Header",
setup() {
- const postNavBarExit = () => {};
- const postNavBarMin = () => {};
- return {
- postNavBarExit,
- postNavBarMin
- }
+ const postNavBarExit = () => postNavBar('close');
+ const postNavBarMin = () => postNavBar('min');
+ return {
+ postNavBarExit,
+ postNavBarMin
+ }
}
});
export default function useIpcRenderer () {
- const invoke = async (endpoint: string, payload: any) => {
+ const invoke = async <T>(endpoint: string, payload: T) => {
try {
- const res = await window.ipcRenderer.invoke(endpoint, payload);
+ const res = await window.ipcRenderer.invoke(endpoint, payload? JSON.stringify(payload) : null);
return res;
} catch (e) {
throw e;
}
}
- const post = (endpoint: string, payload: any) => {
+ const post = <T>(endpoint: string, payload: T) => {
window.ipcRenderer.send(endpoint, payload);
};
export const invokeLogin = async (
payload: LoginPayload
): Promise<Profile | Error> => (
- await invoke('invoke-account-login', JSON.stringify(payload))
+ await invoke('invoke-account-login', payload)
);
export const invokeLogout = async (): Promise<void> => (
*
*/
-export const invokeSession = async (cid: string): Promise<Profile | Error> => (
- await invoke("messenger-init", cid)
-);
-
export const postMessage = (payload: Message): void => (
post('post-session-send', payload)
);
post('post-app-mount', null)
);
+/**
+ *
+ * Nav bar endpoints
+ *
+ */
+
+export const postNavBar = (payload: string): void => (
+ post('post-nav-bar', payload)
+);
+
+/**
+ *
+ * Window focus endpoint
+ *
+ */
+
+export const postWindowBlur = (payload: { isFocused: boolean; }): void => (
+ post('post-window-focus', payload)
+);
/**
*
const onMessageCallback = (payload: string) => {
const message = JSON.parse(payload);
- console.log(typeof message);
/* if the platform fails to authenticate, we must back down */
if (message === "CLOSE_AUTH_FAIL") {
}
interface IpcListenerCallback<T> {
- (payload: T | null): void;
+ (payload: T): void;
}
interface IIpcHandler<I, O> {
}
// Called when a NavBar button is pressed.
-const onNavBar = (_event: any, action: string): void => {
+export const onNavBar: IpcListenerCallback<string> = (payload): void => {
if (win) {
- if (action === "close") {
- win.close()
+ if (payload === "close") {
+ win.close();
} else {
- win.minimize()
+ win.minimize();
}
}
}
// Util function to render message on ipc-renderer event.
-const postToWindow = <T>(event: IpcRendererEvent<T>): void => {
+const postToWindow = <T>(e: IpcRendererEvent<T>): void => {
if (win) {
- win.webContents.send(event.channel, event.payload);
+ win.webContents.send(e.channel, e.payload);
}
}
// Must tell initApp that window exists.
backgroundMitt.emit('window-active', true);
- // Handle win nav-bar event.
- ipcMain.removeAllListeners("nav-bar") // avoid setting duplicate handlers
- ipcMain.on("nav-bar", onNavBar);
-
// Gateway for messages to the frontend.
backgroundMitt.removeAllListeners("ipc-renderer")
backgroundMitt.on("ipc-renderer", postToWindow);