anything-llm/server/utils/files/logo.js
Sean Hatfield b557bb9ede
Logo customization for single-user & multi-user modes (#186)
* implemented logo customization for single-user mode

* removing unneeded comments

* added dark and light mode support for default logo

* implemented dark and light mode switching in frontend

* fixed dark and light mode switching for failed to load logo from backend

* removed unneeded comment

* custom logos for admin implemented

* refactor logo mgmt functions
abstract logo management utils into their own file for simplicity

* added settings tab for appearance on single-user mode

* unchecking files with unneeded changes

* fixed appearance settings tab to be hidden on multiuser mode

* allow readall for logo

---------

Co-authored-by: timothycarambat <rambat1010@gmail.com>
2023-08-14 15:22:55 -07:00

73 lines
2.1 KiB
JavaScript

const path = require("path");
const fs = require("fs");
const { getType } = require("mime");
const { v4 } = require("uuid");
const { SystemSettings } = require("../../models/systemSettings");
const LIGHT_LOGO_FILENAME = "anything-llm-light.png";
const DARK_LOGO_FILENAME = "anything-llm-dark.png";
function validFilename(newFilename = "") {
return ![DARK_LOGO_FILENAME, LIGHT_LOGO_FILENAME].includes(newFilename);
}
function getDefaultFilename(mode = "dark") {
return mode === "light" ? DARK_LOGO_FILENAME : LIGHT_LOGO_FILENAME;
}
async function determineLogoFilepath(defaultFilename = DARK_LOGO_FILENAME) {
const currentLogoFilename = await SystemSettings.currentLogoFilename();
const basePath = path.join(__dirname, "../../storage/assets");
const defaultFilepath = path.join(basePath, defaultFilename);
if (currentLogoFilename && validFilename(currentLogoFilename)) {
customLogoPath = path.join(basePath, currentLogoFilename);
return fs.existsSync(customLogoPath) ? customLogoPath : defaultFilepath;
}
return defaultFilepath;
}
function fetchLogo(logoPath) {
const mime = getType(logoPath);
const buffer = fs.readFileSync(logoPath);
return {
buffer,
size: buffer.length,
mime,
};
}
async function renameLogoFile(originalFilename = null) {
const extname = path.extname(originalFilename) || ".png";
const newFilename = `${v4()}${extname}`;
const originalFilepath = path.join(
__dirname,
`../../storage/assets/${originalFilename}`
);
const outputFilepath = path.join(
__dirname,
`../../storage/assets/${newFilename}`
);
fs.renameSync(originalFilepath, outputFilepath);
return newFilename;
}
async function removeCustomLogo(logoFilename = DARK_LOGO_FILENAME) {
if (!logoFilename || !validFilename(logoFilename)) return false;
const logoPath = path.join(__dirname, `../../storage/assets/${logoFilename}`);
if (fs.existsSync(logoPath)) fs.unlinkSync(logoPath);
return true;
}
module.exports = {
fetchLogo,
renameLogoFile,
removeCustomLogo,
validFilename,
getDefaultFilename,
determineLogoFilepath,
LIGHT_LOGO_FILENAME,
DARK_LOGO_FILENAME,
};