mirror of
https://github.com/Equicord/Equicord.git
synced 2025-06-19 11:27:02 -04:00
feat: Typesafe Settings Definitions (#403)
Co-authored-by: Ven <vendicated@riseup.net>
This commit is contained in:
parent
6c5fcc4119
commit
ea748dfb60
15 changed files with 288 additions and 180 deletions
|
@ -18,26 +18,19 @@
|
|||
|
||||
import "./shiki.css";
|
||||
|
||||
import { disableStyle, enableStyle } from "@api/Styles";
|
||||
import { enableStyle } from "@api/Styles";
|
||||
import { Devs } from "@utils/constants";
|
||||
import { parseUrl } from "@utils/misc";
|
||||
import { wordsFromPascal, wordsToTitle } from "@utils/text";
|
||||
import definePlugin, { OptionType } from "@utils/types";
|
||||
import definePlugin from "@utils/types";
|
||||
|
||||
import previewExampleText from "~fileContent/previewExample.tsx";
|
||||
|
||||
import { Settings } from "../../Vencord";
|
||||
import { shiki } from "./api/shiki";
|
||||
import { themes } from "./api/themes";
|
||||
import { createHighlighter } from "./components/Highlighter";
|
||||
import deviconStyle from "./devicon.css?managed";
|
||||
import { DeviconSetting, HljsSetting, ShikiSettings } from "./types";
|
||||
import { settings } from "./settings";
|
||||
import { DeviconSetting } from "./types";
|
||||
import { clearStyles } from "./utils/createStyle";
|
||||
|
||||
const themeNames = Object.keys(themes);
|
||||
|
||||
const getSettings = () => Settings.plugins.ShikiCodeblocks as ShikiSettings;
|
||||
|
||||
export default definePlugin({
|
||||
name: "ShikiCodeblocks",
|
||||
description: "Brings vscode-style codeblocks into Discord, powered by Shiki",
|
||||
|
@ -52,10 +45,10 @@ export default definePlugin({
|
|||
},
|
||||
],
|
||||
start: async () => {
|
||||
if (getSettings().useDevIcon !== DeviconSetting.Disabled)
|
||||
if (settings.store.useDevIcon !== DeviconSetting.Disabled)
|
||||
enableStyle(deviconStyle);
|
||||
|
||||
await shiki.init(getSettings().customTheme || getSettings().theme);
|
||||
await shiki.init(settings.store.customTheme || settings.store.theme);
|
||||
},
|
||||
stop: () => {
|
||||
shiki.destroy();
|
||||
|
@ -67,90 +60,7 @@ export default definePlugin({
|
|||
isPreview: true,
|
||||
tempSettings,
|
||||
}),
|
||||
options: {
|
||||
theme: {
|
||||
type: OptionType.SELECT,
|
||||
description: "Default themes",
|
||||
options: themeNames.map(themeName => ({
|
||||
label: wordsToTitle(wordsFromPascal(themeName)),
|
||||
value: themes[themeName],
|
||||
default: themes[themeName] === themes.DarkPlus,
|
||||
})),
|
||||
disabled: () => !!getSettings().customTheme,
|
||||
onChange: shiki.setTheme,
|
||||
},
|
||||
customTheme: {
|
||||
type: OptionType.STRING,
|
||||
description: "A link to a custom vscode theme",
|
||||
placeholder: themes.MaterialCandy,
|
||||
isValid: value => {
|
||||
if (!value) return true;
|
||||
const url = parseUrl(value);
|
||||
if (!url) return "Must be a valid URL";
|
||||
|
||||
if (!url.pathname.endsWith(".json")) return "Must be a json file";
|
||||
|
||||
return true;
|
||||
},
|
||||
onChange: value => shiki.setTheme(value || getSettings().theme),
|
||||
},
|
||||
tryHljs: {
|
||||
type: OptionType.SELECT,
|
||||
description: "Use the more lightweight default Discord highlighter and theme.",
|
||||
options: [
|
||||
{
|
||||
label: "Never",
|
||||
value: HljsSetting.Never,
|
||||
},
|
||||
{
|
||||
label: "Prefer Shiki instead of Highlight.js",
|
||||
value: HljsSetting.Secondary,
|
||||
default: true,
|
||||
},
|
||||
{
|
||||
label: "Prefer Highlight.js instead of Shiki",
|
||||
value: HljsSetting.Primary,
|
||||
},
|
||||
{
|
||||
label: "Always",
|
||||
value: HljsSetting.Always,
|
||||
},
|
||||
],
|
||||
},
|
||||
useDevIcon: {
|
||||
type: OptionType.SELECT,
|
||||
description: "How to show language icons on codeblocks",
|
||||
options: [
|
||||
{
|
||||
label: "Disabled",
|
||||
value: DeviconSetting.Disabled,
|
||||
},
|
||||
{
|
||||
label: "Colorless",
|
||||
value: DeviconSetting.Greyscale,
|
||||
default: true,
|
||||
},
|
||||
{
|
||||
label: "Colored",
|
||||
value: DeviconSetting.Color,
|
||||
},
|
||||
],
|
||||
onChange: (newValue: DeviconSetting) => {
|
||||
if (newValue === DeviconSetting.Disabled) disableStyle(deviconStyle);
|
||||
else enableStyle(deviconStyle);
|
||||
},
|
||||
},
|
||||
bgOpacity: {
|
||||
type: OptionType.SLIDER,
|
||||
description: "Background opacity",
|
||||
markers: [0, 20, 40, 60, 80, 100],
|
||||
default: 100,
|
||||
componentProps: {
|
||||
stickToMarkers: false,
|
||||
onValueRender: null, // Defaults to percentage
|
||||
},
|
||||
},
|
||||
},
|
||||
settings,
|
||||
|
||||
// exports
|
||||
shiki,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue