Added dynamic title and favicon
This commit is contained in:
parent
4729a6d623
commit
e05f7468d0
4 changed files with 38 additions and 1 deletions
|
|
@ -16,6 +16,8 @@ import AppsManager from "../../features/apps/appsManager.js";
|
||||||
import { ClickAction } from "../actions/actions/ClickAction.jsx";
|
import { ClickAction } from "../actions/actions/ClickAction.jsx";
|
||||||
import { Actions } from "../actions/Actions.jsx";
|
import { Actions } from "../actions/Actions.jsx";
|
||||||
import { useScreenDimensions } from "../../hooks/utils/screen.js";
|
import { useScreenDimensions } from "../../hooks/utils/screen.js";
|
||||||
|
import { NAME } from "../../config/branding.config.js";
|
||||||
|
import { setViewportIcon, setViewportTitle } from "../../features/utils/browser.utils.js";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @typedef {object} windowProps
|
* @typedef {object} windowProps
|
||||||
|
|
@ -83,6 +85,13 @@ export const WindowView = memo(({ id, app, size, position, onInteract, options,
|
||||||
}
|
}
|
||||||
}, [position, size, screenHeight, screenWidth]);
|
}, [position, size, screenHeight, screenWidth]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (active) {
|
||||||
|
setViewportTitle(`${title} | ${NAME}`);
|
||||||
|
setViewportIcon(iconUrl);
|
||||||
|
}
|
||||||
|
}, [active, iconUrl, title]);
|
||||||
|
|
||||||
const close = (event) => {
|
const close = (event) => {
|
||||||
event?.preventDefault();
|
event?.preventDefault();
|
||||||
windowsManager.close(id);
|
windowsManager.close(id);
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,8 @@ import { memo, useEffect, useState } from "react";
|
||||||
import { WindowView } from "./WindowView.jsx";
|
import { WindowView } from "./WindowView.jsx";
|
||||||
import { useSettingsManager } from "../../hooks/settings/settingsManagerContext.js";
|
import { useSettingsManager } from "../../hooks/settings/settingsManagerContext.js";
|
||||||
import { SettingsManager } from "../../features/settings/settingsManager.js";
|
import { SettingsManager } from "../../features/settings/settingsManager.js";
|
||||||
|
import { NAME, TAG_LINE } from "../../config/branding.config.js";
|
||||||
|
import { setViewportIcon, setViewportTitle } from "../../features/utils/browser.utils.js";
|
||||||
|
|
||||||
export const WindowsView = memo(() => {
|
export const WindowsView = memo(() => {
|
||||||
const settingsManager = useSettingsManager();
|
const settingsManager = useSettingsManager();
|
||||||
|
|
@ -16,6 +18,11 @@ export const WindowsView = memo(() => {
|
||||||
setSortedWindows([...windows].sort((windowA, windowB) =>
|
setSortedWindows([...windows].sort((windowA, windowB) =>
|
||||||
windowA.lastInteraction - windowB.lastInteraction
|
windowA.lastInteraction - windowB.lastInteraction
|
||||||
));
|
));
|
||||||
|
|
||||||
|
if (windows.length === 0) {
|
||||||
|
setViewportTitle(`${NAME} | ${TAG_LINE}`);
|
||||||
|
setViewportIcon(`${process.env.PUBLIC_URL}/favicon.ico`);
|
||||||
|
}
|
||||||
}, [windows]);
|
}, [windows]);
|
||||||
|
|
||||||
// Launch startup apps
|
// Launch startup apps
|
||||||
|
|
@ -34,7 +41,7 @@ export const WindowsView = memo(() => {
|
||||||
<WindowView
|
<WindowView
|
||||||
key={id}
|
key={id}
|
||||||
onInteract={() => { windowsManager.focus(id); }}
|
onInteract={() => { windowsManager.focus(id); }}
|
||||||
active={index === 0}
|
active={index === sortedWindows.length - 1}
|
||||||
id={id}
|
id={id}
|
||||||
app={app}
|
app={app}
|
||||||
size={size}
|
size={size}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
import { ANSI } from "./apps/terminal.config.js";
|
import { ANSI } from "./apps/terminal.config.js";
|
||||||
|
|
||||||
export const NAME = "Prozilla OS";
|
export const NAME = "Prozilla OS";
|
||||||
|
export const TAG_LINE = "Web-based Operating System";
|
||||||
|
|
||||||
export const ASCII_LOGO = `
|
export const ASCII_LOGO = `
|
||||||
:.
|
:.
|
||||||
|
|
|
||||||
|
|
@ -31,4 +31,24 @@ export function isValidUrl(string) {
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {string} title
|
||||||
|
*/
|
||||||
|
export function setViewportTitle(title) {
|
||||||
|
document.title = title;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {string} url
|
||||||
|
*/
|
||||||
|
export function setViewportIcon(url) {
|
||||||
|
let link = document.querySelector("link[rel~='icon']");
|
||||||
|
if (!link) {
|
||||||
|
link = document.createElement("link");
|
||||||
|
link.rel = "icon";
|
||||||
|
document.head.appendChild(link);
|
||||||
|
}
|
||||||
|
link.href = url;
|
||||||
}
|
}
|
||||||
Loading…
Reference in a new issue